[PATCH conductor 1/3] Refactored catalog_entry model into catalog_entry and deployable models.

Scott Seago sseago at redhat.com
Thu Dec 8 05:08:37 UTC 2011


This allows deployables to be used in more than one catalog. For the moment, the UI is still unchanged -- catalog entry and deployable are constrained in a one-to-one relationship via the catalog_entry UI. This patch includes model and migration classes.
---
 src/app/models/catalog.rb                          |    1 +
 src/app/models/catalog_entry.rb                    |   69 +---------------
 src/app/models/{catalog_entry.rb => deployable.rb} |   23 ++----
 src/app/models/permission.rb                       |    2 +-
 src/app/models/pool.rb                             |   12 ++--
 src/db/migrate/20111122103000_add_deployables.rb   |   68 ++++++++++++++++
 .../migrate/20111122203000_add_deployable_roles.rb |   84 ++++++++++++++++++++
 src/db/seeds.rb                                    |   20 +++---
 8 files changed, 181 insertions(+), 98 deletions(-)
 copy src/app/models/{catalog_entry.rb => deployable.rb} (85%)
 create mode 100644 src/db/migrate/20111122103000_add_deployables.rb
 create mode 100644 src/db/migrate/20111122203000_add_deployable_roles.rb

diff --git a/src/app/models/catalog.rb b/src/app/models/catalog.rb
index 34024fa..1177b92 100644
--- a/src/app/models/catalog.rb
+++ b/src/app/models/catalog.rb
@@ -32,6 +32,7 @@ class Catalog < ActiveRecord::Base
 
   belongs_to :pool
   has_many :catalog_entries, :dependent => :destroy
+  has_many :deployables, :through => :catalog_entries
   has_many :permissions, :as => :permission_object, :dependent => :destroy,
            :include => [:role],
            :order => "permissions.id ASC"
diff --git a/src/app/models/catalog_entry.rb b/src/app/models/catalog_entry.rb
index fff71a7..5190030 100644
--- a/src/app/models/catalog_entry.rb
+++ b/src/app/models/catalog_entry.rb
@@ -29,72 +29,13 @@
 #
 
 class CatalogEntry < ActiveRecord::Base
-  include PermissionedObject
 
-  validates_presence_of :name
-  validates_uniqueness_of :name, :scope => :catalog_id
-  validates_length_of :name, :maximum => 1024
-  validates_presence_of :xml
-  validates_presence_of :catalog
-  validate :valid_deployable_xml?
-
-  has_many :permissions, :as => :permission_object, :dependent => :destroy,
-           :include => [:role],
-           :order => "permissions.id ASC"
-  belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"
   belongs_to :catalog
-  after_create "assign_owner_roles(owner)"
-
-  def valid_deployable_xml?
-    deployable_xml = DeployableXML.new(xml)
-    unless deployable_xml.validate!
-      errors.add(:xml, I18n.t('catalog_entries.flash.warning.not_valid'))
-    end
-  end
-
-  # Fetch the deployable contained at :url
-  def fetch_deployable
-    begin
-      DeployableXML.new(xml)
-    rescue
-      return nil
-    end
-  end
+  belongs_to :deployable
 
-  # Round up Catalog Entries, fetch their Deployables, and extract image UUIDs.
-  def fetch_images
-    images = []
-    unless fetch_image_uuids.nil?
-      fetch_image_uuids.each do |uuid|
-        images << Aeolus::Image::Warehouse::Image.find(uuid)
-      end
-      return images.compact.uniq
-    end
-  end
-
-  def fetch_image_uuids
-    deployable = fetch_deployable
-    deployable.image_uuids unless deployable.nil?
-  end
-
-  def hw_profile_for_image(image_id)
-    fetch_deployable.assemblies.each do |as|
-      if as.image_id == image_id
-       return HardwareProfile.find_by_name(as.hwp)
-      end
-    end
-  end
-
-  #method used with uploading deployable xml in catalog_entries#new
-  def xml=(data)
-    #for new
-    if data.instance_variables.include?("@original_filename") && data.instance_variables.include?("@tempfile")
-      write_attribute :xml_filename, data.original_filename
-      write_attribute :xml, data.tempfile.read
-    #for update or new from_url
-    else
-      write_attribute :xml, data
-    end
-  end
+  validates_presence_of :catalog
+  validates_presence_of :deployable
 
+  # This probably goes away once we separate catalog entry creation from deployables
+  accepts_nested_attributes_for :deployable
 end
diff --git a/src/app/models/catalog_entry.rb b/src/app/models/deployable.rb
similarity index 85%
copy from src/app/models/catalog_entry.rb
copy to src/app/models/deployable.rb
index fff71a7..449903c 100644
--- a/src/app/models/catalog_entry.rb
+++ b/src/app/models/deployable.rb
@@ -16,33 +16,23 @@
 # MA  02110-1301, USA.  A copy of the GNU General Public License is
 # also available at http://www.gnu.org/copyleft/gpl.html.
 
-# == Schema Information
-#
-# Table name: catalog_entries
-#
-#  id          :integer         not null, primary key
-#  name        :string(1024)    not null
-#  description :text            not null
-#  url         :string(255)
-#  owner_id    :integer
-#  catalog_id  :integer         not null
-#
-
-class CatalogEntry < ActiveRecord::Base
+class Deployable < ActiveRecord::Base
   include PermissionedObject
 
   validates_presence_of :name
-  validates_uniqueness_of :name, :scope => :catalog_id
+  validates_uniqueness_of :name
   validates_length_of :name, :maximum => 1024
+
   validates_presence_of :xml
-  validates_presence_of :catalog
   validate :valid_deployable_xml?
 
   has_many :permissions, :as => :permission_object, :dependent => :destroy,
            :include => [:role],
            :order => "permissions.id ASC"
+  has_many :catalog_entries
+  has_many :catalogs, :through => :catalog_entries
+
   belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"
-  belongs_to :catalog
   after_create "assign_owner_roles(owner)"
 
   def valid_deployable_xml?
@@ -96,5 +86,4 @@ class CatalogEntry < ActiveRecord::Base
       write_attribute :xml, data
     end
   end
-
 end
diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb
index 863d781..516b39d 100644
--- a/src/app/models/permission.rb
+++ b/src/app/models/permission.rb
@@ -52,7 +52,7 @@ class Permission < ActiveRecord::Base
                                       :foreign_key => "permission_object_id"
   belongs_to :deployment,             :class_name => "Deployment",
                                       :foreign_key => "permission_object_id"
-  belongs_to :catalog_entry,          :class_name => "CatalogEntry",
+  belongs_to :deployable,             :class_name => "Deployable",
                                       :foreign_key => "permission_object_id"
   belongs_to :catalog,                :class_name => "Catalog",
                                       :foreign_key => "permission_object_id"
diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
index 14e8a6d..cbf5f70 100644
--- a/src/app/models/pool.rb
+++ b/src/app/models/pool.rb
@@ -124,18 +124,18 @@ class Pool < ActiveRecord::Base
   end
 
   def provider_image_map
-    catalog_entries = catalogs.collect{|c| c.catalog_entries}.flatten
-    all_images = catalog_entries.collect{|ce| ce.fetch_images}.flatten.uniq.compact
+    deployables = catalogs.collect{|c| c.deployables}.flatten
+    all_images = deployables.collect{|d| d.fetch_images}.flatten.uniq.compact
     provider_images = Image.provider_images_for_image_list(all_images)
     return_obj = {}
     catalogs.each do |catalog|
       return_obj[catalog] = {}
-      catalog.catalog_entries.each do |catalog_entry|
-        images = catalog_entry.fetch_images
+      catalog.deployables.each do |deployable|
+        images = deployable.fetch_images
         unless images.nil?
-          return_obj[catalog][catalog_entry] = {}
+          return_obj[catalog][deployable] = {}
           images.each do |image|
-            return_obj[catalog][catalog_entry][image] = provider_images.nil? ? {} : provider_images[image.uuid]
+            return_obj[catalog][deployable][image] = provider_images.nil? ? {} : provider_images[image.uuid]
           end
         end
       end
diff --git a/src/db/migrate/20111122103000_add_deployables.rb b/src/db/migrate/20111122103000_add_deployables.rb
new file mode 100644
index 0000000..fc93a68
--- /dev/null
+++ b/src/db/migrate/20111122103000_add_deployables.rb
@@ -0,0 +1,68 @@
+#
+# Copyright (C) 2011 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
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class AddDeployables  < ActiveRecord::Migration
+  def self.up
+    create_table :deployables do |t|
+      t.string  :name, :null => false, :limit => 1024
+      t.text    :description, :null => false
+      t.text    :xml
+      t.string  :xml_filename
+      t.integer :owner_id
+    end
+    add_column :catalog_entries, :deployable_id, :integer
+
+    CatalogEntry.all.each do |entry|
+      deployable = Deployable.new(:name => entry.name,
+                         :description => entry.description,
+                         :xml => entry.xml,
+                         :xml_filename => entry.xml_filename,
+                         :owner_id => entry.owner_id)
+      deployable.save!
+      entry.deployable = deployable
+      entry.save!
+    end
+    remove_column :catalog_entries, :name
+    remove_column :catalog_entries, :description
+    remove_column :catalog_entries, :xml
+    remove_column :catalog_entries, :xml_filename
+    remove_column :catalog_entries, :owner_id
+  end
+
+  def self.down
+    add_column :catalog_entries, :name, :string
+    add_column :catalog_entries, :description, :text
+    add_column :catalog_entries, :xml, :text
+    add_column :catalog_entries, :xml_filename, :string
+    add_column :catalog_entries, :owner_id, :integer
+
+    Deployable.all.each do |deployable|
+      entry = deployable.catalog_entries.first
+      if entry
+        entry.name = deployable.name
+        entry.description = deployable.description
+        entry.xml = deployable.xml
+        entry.xml_filename = deployable.xml_filename
+        entry.owner_id = deployable.owner_id
+        entry.save!
+      end
+    end
+    drop_column :catalog_entries, :deployable_id
+    drop_table :deployables
+  end
+end
diff --git a/src/db/migrate/20111122203000_add_deployable_roles.rb b/src/db/migrate/20111122203000_add_deployable_roles.rb
new file mode 100644
index 0000000..7535d11
--- /dev/null
+++ b/src/db/migrate/20111122203000_add_deployable_roles.rb
@@ -0,0 +1,84 @@
+#
+# Copyright (C) 2011 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
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA  02110-1301, USA.  A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class AddDeployableRoles < ActiveRecord::Migration
+  VIEW = "view"
+  USE  = "use"
+  MOD  = "modify"
+  CRE  = "create"
+  VPRM = "view_perms"
+  GPRM = "set_perms"
+  NEW_ROLES = {
+   Deployable =>
+     {"Deployable User"          => [false, {Deployable     => [VIEW,USE]},
+                                     "CatalogEntry User"],
+      "Deployable Owner"         => [true,  {Deployable     => [VIEW,USE,MOD,VPRM,GPRM]},
+                                    "CatalogEntry Owner"]},
+   BasePermissionObject =>
+     {"Deployable Administrator" => [false, {Deployable => [VIEW,USE,MOD,CRE,VPRM,GPRM]},
+                                     "CatalogEntry Administrator"],
+      "Deployable Global User"   => [false, {Deployable=> [VIEW,USE]},
+                                     "CatalogEntry Global User"],
+      "Administrator"          => [false, {Provider     => [VIEW,    MOD,CRE,VPRM,GPRM],
+                                           ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           HardwareProfile => [VIEW,    MOD,CRE,VPRM,GPRM],
+                                           Realm        => [     USE,MOD,CRE,VPRM,GPRM],
+                                           User         => [VIEW,    MOD,CRE],
+                                           Pool         => [VIEW,    MOD,CRE,VPRM,GPRM],
+                                           Instance     => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           Deployment   => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           Quota        => [VIEW,    MOD],
+                                           PoolFamily   => [VIEW,    MOD,CRE,VPRM,GPRM],
+                                           Catalog      => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           Deployable => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           BasePermissionObject => [ MOD,    VPRM,GPRM]}]}}
+  def self.up
+    unless Role.all.size == 0
+      Role.transaction do
+        NEW_ROLES.each do |role_scope, scoped_hash|
+          scoped_hash.each do |role_name, role_def|
+            role = Role.find_or_initialize_by_name(role_def[2] ? role_def[2] : role_name)
+            role.update_attributes({:name => role_name, :scope => role_scope.name,
+                                     :assign_to_owner => role_def[0]})
+            role.privileges = {}
+            role.save!
+            role_def[1].each do |priv_type, priv_actions|
+              priv_actions.each do |action|
+                Privilege.create!(:role => role, :target_type => priv_type.name,
+                                  :action => action)
+              end
+            end
+          end
+        end
+
+        MetadataObject.remove("self_service_default_catalog_entry_obj")
+        MetadataObject.remove("self_service_default_catalog_entry_role")
+        MetadataObject.set("self_service_default_deployable_obj",
+                           BasePermissionObject.general_permission_scope)
+        MetadataObject.set("self_service_default_deployable_role",
+                           Role.find_by_name("Deployable Global User"))
+        MetadataObject.set("self_service_perms_list",
+                           "[self_service_default_pool,self_service_default_role], [self_service_default_deployable_obj,self_service_default_deployable_role], [self_service_default_pool_global_user_obj,self_service_default_pool_global_user_role], [self_service_default_catalog_global_user_obj,self_service_default_catalog_global_user_role],[self_service_default_hwp_global_user_obj,self_service_default_hwp_global_user_role] ")
+
+      end
+    end
+  end
+
+  def self.down
+  end
+end
diff --git a/src/db/seeds.rb b/src/db/seeds.rb
index 3dc48d2..ceb0402 100644
--- a/src/db/seeds.rb
+++ b/src/db/seeds.rb
@@ -62,9 +62,9 @@ roles =
    Catalog =>
      {"Catalog User"            => [false, {Catalog => [VIEW, USE]}],
       "Catalog Administrator"   => [true,  {Catalog => [VIEW,USE,MOD,VPRM,GPRM]}]},
-   CatalogEntry =>
-     {"CatalogEntry User"          => [false, {CatalogEntry     => [VIEW,USE]}],
-      "CatalogEntry Owner"         => [true,  {CatalogEntry     => [VIEW,USE,MOD,VPRM,GPRM]}]},
+   Deployable =>
+     {"Deployable User"          => [false, {Deployable     => [VIEW,USE]}],
+      "Deployable Owner"         => [true,  {Deployable     => [VIEW,USE,MOD,VPRM,GPRM]}]},
    BasePermissionObject =>
      {"Provider Creator"       => [false, {Provider     => [             CRE]}],
       "Provider Administrator" => [false, {Provider     => [VIEW,    MOD,CRE,VPRM,GPRM],
@@ -77,8 +77,8 @@ roles =
                                            Deployment   => [VIEW,USE,MOD,CRE,VPRM,GPRM],
                                            Quota        => [VIEW,    MOD],
                                            PoolFamily   => [VIEW,    MOD,CRE,VPRM,GPRM]}],
-      "CatalogEntry Administrator" => [false, {CatalogEntry => [VIEW,USE,MOD,CRE,VPRM,GPRM]}],
-      "CatalogEntry Global User"   => [false, {CatalogEntry=> [VIEW,USE]}],
+      "Deployable Administrator" => [false, {Deployable => [VIEW,USE,MOD,CRE,VPRM,GPRM]}],
+      "Deployable Global User"   => [false, {Deployable=> [VIEW,USE]}],
       "Catalog Global User"   => [false, {Catalog => [VIEW,USE]}],
       "HWP Global User"   => [false, {HardwareProfile => [VIEW,USE]}],
       "Pool Global User"                  => [false, {Pool         => [VIEW],
@@ -96,7 +96,7 @@ roles =
                                            Quota        => [VIEW,    MOD],
                                            PoolFamily   => [VIEW,    MOD,CRE,VPRM,GPRM],
                                            Catalog      => [VIEW,USE,MOD,CRE,VPRM,GPRM],
-                                           CatalogEntry => [VIEW,USE,MOD,CRE,VPRM,GPRM],
+                                           Deployable => [VIEW,USE,MOD,CRE,VPRM,GPRM],
                                            BasePermissionObject => [ MOD,    VPRM,GPRM]}]}}
 Role.transaction do
   roles.each do |role_scope, scoped_hash|
@@ -122,7 +122,7 @@ default_quota = Quota.create
 
 default_pool = Pool.find_by_name("Default")
 default_role = Role.find_by_name("Pool User")
-default_catalog_entry_role = Role.find_by_name("CatalogEntry Global User")
+default_deployable_role = Role.find_by_name("Deployable Global User")
 default_pool_global_user_role = Role.find_by_name("Pool Global User")
 default_catalog_global_user_role = Role.find_by_name("Catalog Global User")
 default_hwp_global_user_role = Role.find_by_name("HWP Global User")
@@ -131,8 +131,8 @@ settings = {"allow_self_service_logins" => "true",
   "self_service_default_quota" => default_quota,
   "self_service_default_pool" => default_pool,
   "self_service_default_role" => default_role,
-  "self_service_default_catalog_entry_obj" => BasePermissionObject.general_permission_scope,
-  "self_service_default_catalog_entry_role" => default_catalog_entry_role,
+  "self_service_default_deployable_obj" => BasePermissionObject.general_permission_scope,
+  "self_service_default_deployable_role" => default_deployable_role,
   "self_service_default_pool_global_user_obj" => BasePermissionObject.general_permission_scope,
   "self_service_default_pool_global_user_role" => default_pool_global_user_role,
   "self_service_default_catalog_global_user_obj" => BasePermissionObject.general_permission_scope,
@@ -141,7 +141,7 @@ settings = {"allow_self_service_logins" => "true",
   "self_service_default_hwp_global_user_role" => default_hwp_global_user_role,
   # perm list in the format:
   #   "[resource1_key, resource1_role], [resource2_key, resource2_role], ..."
-  "self_service_perms_list" => "[self_service_default_pool,self_service_default_role], [self_service_default_catalog_entry_obj,self_service_default_catalog_entry_role], [self_service_default_pool_global_user_obj,self_service_default_pool_global_user_role], [self_service_default_catalog_global_user_obj,self_service_default_catalog_global_user_role],[self_service_default_hwp_global_user_obj,self_service_default_hwp_global_user_role] "}
+  "self_service_perms_list" => "[self_service_default_pool,self_service_default_role], [self_service_default_deployable_obj,self_service_default_deployable_role], [self_service_default_pool_global_user_obj,self_service_default_pool_global_user_role], [self_service_default_catalog_global_user_obj,self_service_default_catalog_global_user_role],[self_service_default_hwp_global_user_obj,self_service_default_hwp_global_user_role] "}
 settings.each_pair do |key, value|
   MetadataObject.set(key, value)
 end
-- 
1.7.6.4




More information about the aeolus-devel mailing list