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

Reply via email to