From: Tomas Sedovic <[email protected]>

Adding a new cloud account imports all the backend realms from the given
provider. Additionaly, we add frontend realms that map to the backend.

Only one frontend realm is created for every actual realm that the cloud
provider serves, but each cloud account imports its own set of backend realms.
---
 src/app/models/cloud_account.rb                |   16 ++++++++++++++++
 src/app/models/realm.rb                        |   13 ++++++++++++-
 src/db/migrate/20090804141600_create_realms.rb |    8 +++++++-
 3 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb
index e5978a1..8ea22e1 100644
--- a/src/app/models/cloud_account.rb
+++ b/src/app/models/cloud_account.rb
@@ -97,6 +97,22 @@ class CloudAccount < ActiveRecord::Base
                                :name => realm.name ? realm.name : realm.id,
                                :provider_id => provider.id)
           ar_realm.save!
+
+          frontend_realm = Realm.new(:external_key => ar_realm.external_key,
+                                     :name => ar_realm.name,
+                                     :provider_id => nil)
+
+          available_realms = Realm.frontend.find(:all, :conditions => {
+            :external_key => frontend_realm.external_key })
+
+          if available_realms.empty?
+            frontend_realm.backend_realms << ar_realm
+            frontend_realm.save!
+          else
+            available_realms.each do |r|
+              r.backend_realms << ar_realm
+            end
+          end
         end
       end
       images.each do |image|
diff --git a/src/app/models/realm.rb b/src/app/models/realm.rb
index 07bb306..bfc9144 100644
--- a/src/app/models/realm.rb
+++ b/src/app/models/realm.rb
@@ -22,8 +22,19 @@
 class Realm < ActiveRecord::Base
   has_many :instances
   belongs_to :provider
+  named_scope :frontend, :conditions => { :provider_id => nil }
 
-  validates_presence_of :provider_id
+  has_and_belongs_to_many :frontend_realms,
+                          :class_name => "Realm",
+                          :join_table => "realm_map",
+                          :foreign_key => "backend_realm_id",
+                          :association_foreign_key => "frontend_realm_id"
+
+  has_and_belongs_to_many :backend_realms,
+                          :class_name => "Realm",
+                          :join_table => "realm_map",
+                          :foreign_key => "frontend_realm_id",
+                          :association_foreign_key => "backend_realm_id"
 
   validates_presence_of :external_key
   validates_uniqueness_of :external_key, :scope => :provider_id
diff --git a/src/db/migrate/20090804141600_create_realms.rb 
b/src/db/migrate/20090804141600_create_realms.rb
index 3d557d8..054721f 100644
--- a/src/db/migrate/20090804141600_create_realms.rb
+++ b/src/db/migrate/20090804141600_create_realms.rb
@@ -24,13 +24,19 @@ class CreateRealms < ActiveRecord::Migration
     create_table :realms do |t|
       t.string  :external_key, :null => false
       t.string  :name, :null => false, :limit => 1024
-      t.integer :provider_id, :null => false
+      t.integer :provider_id
       t.integer :lock_version, :default => 0
       t.timestamps
     end
+
+    create_table "realm_map", :force => true, :id => false do |t|
+      t.column "frontend_realm_id", :integer
+      t.column "backend_realm_id", :integer
+    end
   end
 
   def self.down
+    drop_table :realm_map
     drop_table :realms
   end
 end
-- 
1.7.2.2

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to