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