So far there's no UI for zones, and zones aren't taken into account for condor matchmaking -- right now a default zone is created and all pools/accounts are added to this zone automatically.
Signed-off-by: Scott Seago <sse...@redhat.com> --- src/app/controllers/cloud_accounts_controller.rb | 1 + src/app/controllers/pool_controller.rb | 10 +++-- src/app/models/cloud_account.rb | 1 + .../models/metadata_object.rb} | 46 ++++++++++++++----- src/app/models/pool.rb | 2 + .../models/zone.rb} | 25 +++++------ src/app/services/registration_service.rb | 3 +- ...ate_pools.rb => 20090803000000_create_zones.rb} | 17 +++++--- src/db/migrate/20090803141507_create_pools.rb | 1 + ...b => 20100707000000_create_metadata_objects.rb} | 17 ++++--- src/features/support/hooks.rb | 3 + src/spec/factories/metadata_object.rb | 5 ++ src/spec/factories/pool.rb | 1 + src/spec/factories/zone.rb | 4 ++ src/spec/models/metadata_object_spec.rb | 34 ++++++++++++++ src/spec/models/zone_spec.rb | 34 ++++++++++++++ src/spec/spec_helper.rb | 1 + 17 files changed, 161 insertions(+), 44 deletions(-) copy src/{db/migrate/20090803141507_create_pools.rb => app/models/metadata_object.rb} (50%) copy src/{db/migrate/20090803141507_create_pools.rb => app/models/zone.rb} (71%) copy src/db/migrate/{20090803141507_create_pools.rb => 20090803000000_create_zones.rb} (72%) copy src/db/migrate/{20090803141507_create_pools.rb => 20100707000000_create_metadata_objects.rb} (74%) create mode 100644 src/features/support/hooks.rb create mode 100644 src/spec/factories/metadata_object.rb create mode 100644 src/spec/factories/zone.rb create mode 100644 src/spec/models/metadata_object_spec.rb create mode 100644 src/spec/models/zone_spec.rb diff --git a/src/app/controllers/cloud_accounts_controller.rb b/src/app/controllers/cloud_accounts_controller.rb index 9343f62..9c4f55b 100644 --- a/src/app/controllers/cloud_accounts_controller.rb +++ b/src/app/controllers/cloud_accounts_controller.rb @@ -37,6 +37,7 @@ class CloudAccountsController < ApplicationController quota.save! @cloud_account.quota_id = quota.id + @cloud_account.zones << Zone.default @cloud_account.save! if request.post? && @cloud_account.save && @cloud_account.populate_realms_and_images diff --git a/src/app/controllers/pool_controller.rb b/src/app/controllers/pool_controller.rb index 41c5369..94486da 100644 --- a/src/app/controllers/pool_controller.rb +++ b/src/app/controllers/pool_controller.rb @@ -83,10 +83,6 @@ class PoolController < ApplicationController #FIXME: This should probably be in a transaction @pool = Pool.new(params[:pool]) - perm = Permission.new(:user => @pool.owner, - :role => Role.find_by_name("Instance Creator and User"), - :permission_object => @pool) - perm.save! # FIXME: do we need any more handling around save failures? What if perm # creation fails? @@ -94,7 +90,13 @@ class PoolController < ApplicationController quota.save! @pool.quota_id = quota.id + + @pool.zone = Zone.default @pool.save! + perm = Permission.new(:user => @pool.owner, + :role => Role.find_by_name("Instance Creator and User"), + :permission_object => @pool) + perm.save! flash[:notice] = "Pool added." redirect_to :action => 'show', :id => @pool.id diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb index 69c8b87..2e35ed0 100644 --- a/src/app/models/cloud_account.rb +++ b/src/app/models/cloud_account.rb @@ -24,6 +24,7 @@ class CloudAccount < ActiveRecord::Base belongs_to :provider belongs_to :quota has_many :instances + has_and_belongs_to_many :zones # what form does the account quota take? diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/app/models/metadata_object.rb similarity index 50% copy from src/db/migrate/20090803141507_create_pools.rb copy to src/app/models/metadata_object.rb index f35021a..0db525e 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/app/models/metadata_object.rb @@ -1,5 +1,5 @@ # -# Copyright (C) 2009 Red Hat, Inc. +# Copyright (C) 2010 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,20 +19,42 @@ # Filters added to this controller apply to all controllers in the application. # Likewise, all the methods added will be available for all controllers. -class CreatePools < ActiveRecord::Migration - def self.up - create_table :pools do |t| - t.string :name, :null => false - t.string :exported_as - t.integer :owner_id, :null => false - t.integer :quota_id - t.integer :lock_version, :default => 0 - t.timestamps +class MetadataObject < ActiveRecord::Base + + validates_presence_of :key + validates_uniqueness_of :key + + validates_presence_of :value + + def self.lookup(key) + metadata_obj = self.find_by_key(key) + if metadata_obj.nil? + nil + elsif metadata_obj.object_type and !metadata_obj.object_type.empty? + metadata_obj.object_type.constantize.find(metadata_obj.value) + else + metadata_obj.value end + end + def self.set(key, value) + metadata_obj = self.find_by_key(key) + metadata_obj = self.new(:key => key) unless metadata_obj + + if value.is_a?(ActiveRecord::Base) + metadata_obj.object_type = value.class.to_s + metadata_obj.value = value.id + else + metadata_obj.value = value + metadata_obj.object_type = nil + end + metadata_obj.save! + metadata_obj end - def self.down - drop_table :pools + def self.remove(key) + metadata_obj = self.find_by_key(key) + metadata_obj.destroy if metadata_obj end + end diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb index a8657ee..d186b20 100644 --- a/src/app/models/pool.rb +++ b/src/app/models/pool.rb @@ -24,6 +24,7 @@ class Pool < ActiveRecord::Base has_many :instances, :dependent => :destroy belongs_to :owner, :class_name => "User", :foreign_key => "owner_id" belongs_to :quota + belongs_to :zone has_many :images, :dependent => :destroy has_many :hardware_profiles, :dependent => :destroy @@ -32,6 +33,7 @@ class Pool < ActiveRecord::Base validates_presence_of :owner_id validates_presence_of :name + validates_presence_of :zone validates_uniqueness_of :name, :scope => :owner_id validates_uniqueness_of :exported_as, :if => :exported_as diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/app/models/zone.rb similarity index 71% copy from src/db/migrate/20090803141507_create_pools.rb copy to src/app/models/zone.rb index f35021a..bc823a6 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/app/models/zone.rb @@ -1,5 +1,5 @@ # -# Copyright (C) 2009 Red Hat, Inc. +# Copyright (C) 2010 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,20 +19,19 @@ # Filters added to this controller apply to all controllers in the application. # Likewise, all the methods added will be available for all controllers. -class CreatePools < ActiveRecord::Migration - def self.up - create_table :pools do |t| - t.string :name, :null => false - t.string :exported_as - t.integer :owner_id, :null => false - t.integer :quota_id - t.integer :lock_version, :default => 0 - t.timestamps - end +class Zone < ActiveRecord::Base + DEFAULT_ZONE_KEY = "default_zone" + + has_many :pools, :dependent => :destroy + has_and_belongs_to_many :cloud_accounts + + validates_presence_of :name + def self.default + MetadataObject.lookup(DEFAULT_ZONE_KEY) end - def self.down - drop_table :pools + def set_as_default + MetadataObject.set(DEFAULT_ZONE_KEY, self) end end diff --git a/src/app/services/registration_service.rb b/src/app/services/registration_service.rb index 37444ad..a9fbfca 100644 --- a/src/app/services/registration_service.rb +++ b/src/app/services/registration_service.rb @@ -14,7 +14,8 @@ class RegistrationService begin User.transaction do @user.save! - @pool = Pool.create!({ :name => @user.login, :owner => @user}) + @pool = Pool.create!({ :name => @user.login, :owner => @user, + :zone => Zone.default}) @quota = Quota.new @quota.save! diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/db/migrate/20090803000000_create_zones.rb similarity index 72% copy from src/db/migrate/20090803141507_create_pools.rb copy to src/db/migrate/20090803000000_create_zones.rb index f35021a..a2ba86a 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/db/migrate/20090803000000_create_zones.rb @@ -19,20 +19,25 @@ # Filters added to this controller apply to all controllers in the application. # Likewise, all the methods added will be available for all controllers. -class CreatePools < ActiveRecord::Migration +class CreateZones < ActiveRecord::Migration def self.up - create_table :pools do |t| + create_table :zones do |t| t.string :name, :null => false - t.string :exported_as - t.integer :owner_id, :null => false - t.integer :quota_id + t.string :description t.integer :lock_version, :default => 0 t.timestamps end + create_table :cloud_accounts_zones, :id => false do |t| + t.integer :cloud_account_id, :null => false + t.integer :zone_id, :null => false + end + default_zone = Zone.new(:name => "default", :description => "default zone") + default_zone.save! end def self.down - drop_table :pools + drop_table :cloud_accounts_zones + drop_table :zones end end diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/db/migrate/20090803141507_create_pools.rb index f35021a..d60687d 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/db/migrate/20090803141507_create_pools.rb @@ -26,6 +26,7 @@ class CreatePools < ActiveRecord::Migration t.string :exported_as t.integer :owner_id, :null => false t.integer :quota_id + t.integer :zone_id, :null => false t.integer :lock_version, :default => 0 t.timestamps end diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/db/migrate/20100707000000_create_metadata_objects.rb similarity index 74% copy from src/db/migrate/20090803141507_create_pools.rb copy to src/db/migrate/20100707000000_create_metadata_objects.rb index f35021a..2f3eeb5 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/db/migrate/20100707000000_create_metadata_objects.rb @@ -1,5 +1,5 @@ # -# Copyright (C) 2009 Red Hat, Inc. +# Copyright (C) 2010 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,20 +19,21 @@ # Filters added to this controller apply to all controllers in the application. # Likewise, all the methods added will be available for all controllers. -class CreatePools < ActiveRecord::Migration +class CreateMetadataObjects < ActiveRecord::Migration def self.up - create_table :pools do |t| - t.string :name, :null => false - t.string :exported_as - t.integer :owner_id, :null => false - t.integer :quota_id + create_table :metadata_objects do |t| + t.string :key, :null => false + t.string :value, :null => false + t.string :object_type t.integer :lock_version, :default => 0 t.timestamps end + default_zone = Zone.first + MetadataObject.set("default_zone", default_zone) if default_zone end def self.down - drop_table :pools + drop_table :metadata_objects end end diff --git a/src/features/support/hooks.rb b/src/features/support/hooks.rb new file mode 100644 index 0000000..356cf0d --- /dev/null +++ b/src/features/support/hooks.rb @@ -0,0 +1,3 @@ +Before do + @default_zone_metadata = Factory.create(:default_zone_metadata) +end diff --git a/src/spec/factories/metadata_object.rb b/src/spec/factories/metadata_object.rb new file mode 100644 index 0000000..aab09af --- /dev/null +++ b/src/spec/factories/metadata_object.rb @@ -0,0 +1,5 @@ +Factory.define :default_zone_metadata, :class => MetadataObject do |o| + o.key 'default_zone' + o.value Factory.create(:zone).id + o.object_type 'Zone' +end diff --git a/src/spec/factories/pool.rb b/src/spec/factories/pool.rb index d85b6a7..12a4376 100644 --- a/src/spec/factories/pool.rb +++ b/src/spec/factories/pool.rb @@ -1,6 +1,7 @@ Factory.define :pool do |p| p.name 'mypool' p.association :owner, :factory => :pool_user + p.association :zone, :factory => :zone end Factory.define :tpool, :parent => :pool do |p| diff --git a/src/spec/factories/zone.rb b/src/spec/factories/zone.rb new file mode 100644 index 0000000..a2d6aac --- /dev/null +++ b/src/spec/factories/zone.rb @@ -0,0 +1,4 @@ +Factory.define :zone do |z| + z.name 'default' + z.description 'default zone' +end diff --git a/src/spec/models/metadata_object_spec.rb b/src/spec/models/metadata_object_spec.rb new file mode 100644 index 0000000..ed6edaf --- /dev/null +++ b/src/spec/models/metadata_object_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe MetadataObject do + + before(:each) do + @default_zone_metadata = Factory :default_zone_metadata + end + + it "lookup on nonexistent key should return nil" do + MetadataObject.lookup("can't find me").should be_nil + end + + it "should require a valid key" do + [nil, ""].each do |invalid_value| + @default_zone_metadata.key = invalid_value + @default_zone_metadata.should_not be_valid + end + end + + it "default zone should return valid zone" do + MetadataObject.lookup("default_zone").should be_a Zone + end + + it "setting string value should work" do + MetadataObject.set("test_string", "stringval") + MetadataObject.lookup("test_string").should == "stringval" + end + + it "setting activerecord object value should work" do + MetadataObject.set("test_obj", Factory(:pool)) + MetadataObject.lookup("test_obj").should be_a Pool + end + +end diff --git a/src/spec/models/zone_spec.rb b/src/spec/models/zone_spec.rb new file mode 100644 index 0000000..2ede895 --- /dev/null +++ b/src/spec/models/zone_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe Zone do + + before(:each) do + @pool = Factory :pool + @zone = @pool.zone + @cloud_account = Factory :mock_cloud_account + @cloud_account.zones << @zone + @cloud_account.save! + end + + it "should validate default zone" do + @zone.should be_valid + end + + it "should require a valid name" do + [nil, ""].each do |invalid_value| + @zone.name = invalid_value + @zone.should_not be_valid + end + end + + it "should have pool" do + @zone.pools.size.should == 1 + @zone.pools[0].id.should == @pool.id + end + + it "should have account" do + @zone.cloud_accounts.size.should == 1 + @zone.cloud_accounts[0].id.should == @cloud_account.id + end + +end diff --git a/src/spec/spec_helper.rb b/src/spec/spec_helper.rb index 5181389..9d492cf 100644 --- a/src/spec/spec_helper.rb +++ b/src/spec/spec_helper.rb @@ -54,6 +54,7 @@ Spec::Runner.configure do |config| # For more information take a look at Spec::Runner::Configuration and Spec::Runner config.before(:each, :type => :controller) do #activate_authlogic + @default_zone_metadata = Factory.create(:default_zone_metadata) end config.after(:each, :type => :controller) do #current_user_session.destroy -- 1.7.2.2 _______________________________________________ deltacloud-devel mailing list deltacloud-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/deltacloud-devel