From: martyntaylor <[email protected]>

---
 src/app/controllers/pool_controller.rb |    2 +-
 src/app/models/hardware_profile.rb     |    2 +-
 src/app/models/pool.rb                 |  127 ++++++++++++++++++++------------
 src/app/views/pool/accounts.html.erb   |    2 +-
 src/config/routes.rb                   |    3 +-
 5 files changed, 84 insertions(+), 52 deletions(-)

diff --git a/src/app/controllers/pool_controller.rb 
b/src/app/controllers/pool_controller.rb
index cf751e0..17691bb 100644
--- a/src/app/controllers/pool_controller.rb
+++ b/src/app/controllers/pool_controller.rb
@@ -90,7 +90,7 @@ class PoolController < ApplicationController
   end
 
   def accounts_for_pool
-    @pool =  Pool.find(params[:pool_id])
+    @pool =  Pool.find(params[:id])
     require_privilege(Privilege::ACCOUNT_VIEW,@pool)
     @cloud_accounts = []
     all_accounts = CloudAccount.list_for_user(@current_user, 
Privilege::ACCOUNT_ADD)
diff --git a/src/app/models/hardware_profile.rb 
b/src/app/models/hardware_profile.rb
index 8330388..5125694 100644
--- a/src/app/models/hardware_profile.rb
+++ b/src/app/models/hardware_profile.rb
@@ -42,7 +42,7 @@ class HardwareProfile < ActiveRecord::Base
   validates_uniqueness_of :external_key, :scope => [:provider_id, :pool_id]
 
   validates_presence_of :name
-  validates_uniqueness_of :name
+  #validates_uniqueness_of :name
 
   validates_presence_of :storage
   validates_numericality_of :storage, :greater_than => 0
diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
index c97e03f..f3cb10c 100644
--- a/src/app/models/pool.rb
+++ b/src/app/models/pool.rb
@@ -56,65 +56,96 @@ class Pool < ActiveRecord::Base
   # FIXME: for already-mapped accounts, update rather than add new
   def populate_realms_and_images(accounts=cloud_accounts)
     accounts.each do |cloud_account|
+      
       client = cloud_account.connect
+      
       realms = client.realms
+      hardware_profiles = client.flavors
+      
       if client.driver_name == "ec2"
         images = client.images(:owner_id=>:self)
       else
         images = client.images
       end
+      
+      
       # FIXME: this should probably be in the same transaction as pool.save
       self.transaction do
-        realms.each do |realm|
-          #ignore if it exists
-          #FIXME: we need to handle keeping in sync forupdates as well as
-          # account permissions
-          unless Realm.find_by_external_key_and_provider_id(realm.id,
-                                                            
cloud_account.provider.id)
-            ar_realm = Realm.new(:external_key => realm.id,
-                                 :name => realm.name ? realm.name : realm.id,
-                                 :provider_id => cloud_account.provider.id)
-            ar_realm.save!
-          end
-        end
-        images.each do |image|
-          #ignore if it exists
-          #FIXME: we need to handle keeping in sync for updates as well as
-          # account permissions
-          ar_image = Image.find_by_external_key_and_provider_id(image.id,
-                                                     cloud_account.provider.id)
-          unless ar_image
-            ar_image = Image.new(:external_key => image.id,
-                                 :name => image.name ? image.name :
-                                          (image.description ? 
image.description :
-                                                               image.id),
-                                 :architecture => image.architecture,
-                                 :provider_id => cloud_account.provider.id)
-            ar_image.save!
-          end
-          front_end_image = Image.new(:external_key =>
-                                         
cloud_account.account_prefix_for_realm +
-                                         
Realm::AGGREGATOR_REALM_ACCOUNT_DELIMITER +
-                                         ar_image.external_key,
-                                  :name => ar_image.name,
-                                  :architecture => ar_image.architecture,
-                                  :pool_id => id)
-          front_end_image.save!
-        end
-        cloud_account.provider.hardware_profiles.each do |hardware_profile|
-          front_hardware_profile = HardwareProfile.new(:external_key =>
-                                         
cloud_account.account_prefix_for_realm +
-                                                       
hardware_profile.external_key,
-                               :name => hardware_profile.name,
-                               :memory => hardware_profile.memory,
-                               :storage => hardware_profile.storage,
-                               :architecture => hardware_profile.architecture,
-                               :pool_id => id)
-          front_hardware_profile.save!
-        end
+        populate_realms(cloud_account, realms)
+        populate_images(cloud_account, images)
+        populate_hardware_profiles(cloud_account, hardware_profiles)
+      end
+    end
+    
+  end
+  
+  private
+  def populate_realms(cloud_account, realms)
+    provider = Provider.find(cloud_account.provider_id)
+    
+    realms.each do |realm|
+      #ignore if it exists
+      #FIXME: we need to handle keeping in sync for updates as well as
+      # account permissions
+      #unless Realm.find_by_external_key_and_provider_id(realm.id, 
cloud_account.provider.id)
+      matching_realms = Realm.find(:all, :conditions => {:provider_id =>  
provider.id, :external_key => realm.id})
+      if matching_realms.length == 0       
+        ar_realm = Realm.new(:external_key => realm.id,
+                             :name => realm.name ? realm.name : realm.id,
+                             :provider_id => cloud_account.provider.id)
+        ar_realm.save!
+      end
+    end
+  end
+  
+  def populate_hardware_profiles(cloud_account, hardware_profiles)
+    
+    hardware_profiles.each do |hardware_profile|
+      external_key = cloud_account.account_prefix_for_realm + 
hardware_profile.id
+      profiles = HardwareProfile.find(:all, :conditions => {:pool_id => id, 
:external_key => external_key})
+    
+      if profiles.length == 0
+        front_hardware_profile = HardwareProfile.new(   :external_key => 
external_key,
+                                                        :name => 
hardware_profile.id,
+                                                        :memory => 
hardware_profile.memory,
+                                                        :storage => 
hardware_profile.storage,
+                                                        :architecture => 
hardware_profile.architecture,
+                                                        :pool_id => id)
+        front_hardware_profile.save!
       end
     end
   end
 
-
+  def populate_images(cloud_account, images) 
+    provider = Provider.find(cloud_account.provider_id)
+    
+    images.each do |image|
+      
+      ar_images = Image.find(:all, :conditions => {:provider_id =>  
provider.id, :external_key => image.id})
+      if ar_images.length == 0
+        ar_image = Image.new(:external_key => image.id,
+                             :name => image.name ? image.name :
+                                      (image.description ? image.description :
+                                                           image.id),
+                             :architecture => image.architecture,
+                             :provider_id => cloud_account.provider.id)
+        ar_image.save!
+      end
+      
+      fr_images = Image.find(:all, :conditions => {:pool_id =>  id, 
:external_key => image.id})
+      if fr_images.length == 0
+        
+      
+        front_end_image = Image.new(:external_key =>
+                                     cloud_account.account_prefix_for_realm +
+                                     Realm::AGGREGATOR_REALM_ACCOUNT_DELIMITER 
+
+                                     ar_image.external_key,
+                                    :name => ar_image.name,
+                                    :architecture => ar_image.architecture,
+                                    :pool_id => id)
+        front_end_image.save!
+      end
+       
+     end
+  end
 end
diff --git a/src/app/views/pool/accounts.html.erb 
b/src/app/views/pool/accounts.html.erb
index 96c4e2d..d63fe13 100644
--- a/src/app/views/pool/accounts.html.erb
+++ b/src/app/views/pool/accounts.html.erb
@@ -26,5 +26,5 @@
     </tbody>
   </table>
 <% end %>
-<%= link_to "View/Add Existing Cloud Accounts", {:controller => "pool",:action 
=> "accounts_for_pool", :pool_id => @pool}, :class=>"actionlink" %>
+<%= link_to "View/Add Existing Cloud Accounts", {:controller => "pool",:action 
=> "accounts_for_pool", :id => @pool}, :class=>"actionlink" %>
 <%= link_to "Add a New Cloud Account", {:controller => 
"cloud_accounts",:action => "new_from_pool", :pool_id => @pool}, 
:class=>"actionlink" %><br/>
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 4a304ca..bc11307 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -34,8 +34,9 @@ ActionController::Routing::Routes.draw do |map|
 
 
   map.resources :pool
-
+  
   map.connect '', :controller => 'provider'
+  map.connect ':controller/:action:/:pool/:cloud_account', :controller => 
'pool', :action => 'add_account'
 
   map.login 'login', :controller => "user_sessions", :action => "new"
   map.logout 'logout', :controller => "user_sessions", :action => "destroy"
-- 
1.6.6.1

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

Reply via email to