[PATCH conductor] Fix Redmine #743
by Tomas Sedovic
From: Tomas Sedovic <tsedovic(a)redhat.com>
In the New Hardware Profile page, the pane with the matching profiles were not
being displayed correctly.
---
.../admin/hardware_profiles_controller.rb | 33 ++++++++++++++------
1 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/src/app/controllers/admin/hardware_profiles_controller.rb b/src/app/controllers/admin/hardware_profiles_controller.rb
index a236d59..783c0e8 100644
--- a/src/app/controllers/admin/hardware_profiles_controller.rb
+++ b/src/app/controllers/admin/hardware_profiles_controller.rb
@@ -8,17 +8,26 @@ class Admin::HardwareProfilesController < ApplicationController
def index
@params = params
- @search_term = params[:q]
- if @search_term.blank?
- load_hardware_profiles
- return
- end
+ respond_to do |format|
+ format.js do
+ build_hardware_profile(params[:hardware_profile])
+ matching_provider_hardware_profiles
+ render :partial => 'matching_provider_hardware_profiles' and return
+ end
+ format.html do
+ @search_term = params[:q]
+ if @search_term.blank?
+ load_hardware_profiles
+ return
+ end
- search = HardwareProfile.search do
- keywords(params[:q])
- with(:frontend, true)
+ search = HardwareProfile.search do
+ keywords(params[:q])
+ with(:frontend, true)
+ end
+ @hardware_profiles = search.results
+ end
end
- @hardware_profiles = search.results
end
def show
@@ -43,6 +52,10 @@ class Admin::HardwareProfilesController < ApplicationController
end
def new
+ respond_to do |format|
+ format.js { render :partial => 'matching_provider_hardware_profiles' }
+ format.html { render :action => 'new'}
+ end
end
def create
@@ -185,7 +198,7 @@ class Admin::HardwareProfilesController < ApplicationController
end
def create_hwpp(hwpp, params)
- hwpp.nil? ? hardwareProfileProperty = HardwareProfileProperty.new : hardwareProfileProperty = hwpp
+ hardwareProfileProperty = hwpp.nil? ? HardwareProfileProperty.new : hwpp
hardwareProfileProperty.name = params[:name]
hardwareProfileProperty.kind = "fixed"
--
1.7.4
12 years, 8 months
[PATCH configure] add conductor delay to ensure service is actually up
by Mo Morsi
this should be removed at some point and a verification
that the service is actually up added to the conductor init script
---
recipes/aeolus_recipe/manifests/conductor.pp | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/recipes/aeolus_recipe/manifests/conductor.pp b/recipes/aeolus_recipe/manifests/conductor.pp
index fe9d124..e7a20f5 100644
--- a/recipes/aeolus_recipe/manifests/conductor.pp
+++ b/recipes/aeolus_recipe/manifests/conductor.pp
@@ -51,6 +51,13 @@ class aeolus::conductor inherits aeolus {
Rails::Migrate::Db[migrate_aeolus_database],
Service['condor', 'httpd']] }
+ # XXX ugly hack but iwhd might take some time to come up
+ exec{"conductor_startup":
+ command => "/bin/sleep 2",
+ unless => '/usr/bin/curl http://localhost/conductor',
+ logoutput => true,
+ require => Service['aeolus-conductor']}
+
service{ 'aeolus-connector':
ensure => 'running',
enable => true,
@@ -269,7 +276,7 @@ define aeolus::conductor::login($user,$password){
-d commit=submit \
-c /tmp/aeolus-${user}.cookie",
onlyif => "/usr/bin/test ! -f /tmp/aeolus-${user}.cookie || \"\" == \"`curl -X GET http://localhost/conductor -b /tmp/aeolus-${user}.cookie -i --silent | grep 'HTTP/1.1 200'`\"",
- require => Service['aeolus-conductor']}
+ require => Exec['conductor_startup']}
}
define aeolus::conductor::logout($user){
--
1.7.2.3
12 years, 8 months
[PATCH] bug #669 / bz #682692 - restrict access to database.yml
by Mo Morsi
---
aeolus-conductor.spec.in | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/aeolus-conductor.spec.in b/aeolus-conductor.spec.in
index 73c46d0..7ff2724 100644
--- a/aeolus-conductor.spec.in
+++ b/aeolus-conductor.spec.in
@@ -209,7 +209,7 @@ fi
%attr(777, root, root) %{app_root}/config/image_descriptor_xmls
%attr(777, root, root) %{app_root}/public
%dir %{_sysconfdir}/%{name}
-%config(noreplace) %{_sysconfdir}/%{name}/database.yml
+%attr(600, aeolus, aeolus) %config(noreplace) %{_sysconfdir}/%{name}/database.yml
%config(noreplace) %{_sysconfdir}/%{name}/development.rb
%config(noreplace) %{_sysconfdir}/%{name}/production.rb
%config(noreplace) %{_sysconfdir}/%{name}/test.rb
--
1.7.2.3
12 years, 8 months
[PATCH configure] add libvirtd service dependency to imagefactory
by Mo Morsi
---
recipes/aeolus_recipe/manifests/image-factory.pp | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/recipes/aeolus_recipe/manifests/image-factory.pp b/recipes/aeolus_recipe/manifests/image-factory.pp
index cb05c59..499b6e4 100644
--- a/recipes/aeolus_recipe/manifests/image-factory.pp
+++ b/recipes/aeolus_recipe/manifests/image-factory.pp
@@ -28,9 +28,13 @@ class aeolus::image-factory inherits aeolus {
file { "/var/tmp/imagefactory-mock":
ensure => "directory",
mode => 755 }
+ service {'libvirtd':
+ ensure => 'running',
+ enable => true,
+ hasstatus => true }
$requires = [return_if($enable_packages, Package['imagefactory']),
File['/var/tmp/imagefactory-mock'],
- Service[qpidd],
+ Service[qpidd], Service[libvirtd],
Rails::Seed::Db[seed_aeolus_database]]
service { 'imagefactory':
ensure => 'running',
--
1.7.2.3
12 years, 8 months
[PATCH] Default PoolFamily can no longer be deleted
by Matt Wagner
---
.../controllers/admin/pool_families_controller.rb | 16 +++++++++++++++-
src/app/models/pool_family.rb | 8 ++++++++
src/config/locales/en.yml | 6 +++++-
src/config/navigation.rb | 2 +-
src/features/pool_family.feature | 8 ++++++++
5 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/src/app/controllers/admin/pool_families_controller.rb b/src/app/controllers/admin/pool_families_controller.rb
index 42bfb04..29cbf59 100644
--- a/src/app/controllers/admin/pool_families_controller.rb
+++ b/src/app/controllers/admin/pool_families_controller.rb
@@ -53,7 +53,21 @@ class Admin::PoolFamiliesController < ApplicationController
end
def multi_destroy
- PoolFamily.destroy(params[:pool_family_selected])
+ deleted = []
+ not_deleted = []
+ PoolFamily.find(params[:pool_family_selected]).each do |pool_family|
+ if pool_family.destroy
+ deleted << pool_family.name
+ else
+ not_deleted << pool_family.name
+ end
+ end
+ if deleted.size > 0
+ flash[:notice] = t 'pool_families.index.deleted', :list => deleted.join(', ')
+ end
+ if not_deleted.size > 0
+ flash[:error] = t 'pool_families.index.not_deleted', :list => not_deleted.join(', ')
+ end
redirect_to admin_pool_families_path
end
diff --git a/src/app/models/pool_family.rb b/src/app/models/pool_family.rb
index 8d5c951..8a05ba7 100644
--- a/src/app/models/pool_family.rb
+++ b/src/app/models/pool_family.rb
@@ -41,6 +41,9 @@ class PoolFamily < ActiveRecord::Base
validates_presence_of :name
validates_uniqueness_of :name
+
+ before_destroy :destroyable?
+
def self.default
MetadataObject.lookup(DEFAULT_POOL_FAMILY_KEY)
end
@@ -48,4 +51,9 @@ class PoolFamily < ActiveRecord::Base
def set_as_default
MetadataObject.set(DEFAULT_POOL_FAMILY_KEY, self)
end
+
+ def destroyable?
+ # A PoolFamily is destroyable unless it is the default PoolFamily
+ self != PoolFamily.default
+ end
end
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index 51555a4..7a448de 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -82,7 +82,11 @@ en:
provider_accounts_item: Provider Account
cloud_engine_hardware_profiles: Hardware Profiles
cloud_engine_realms: Realms
- pool_families: Pool Families
+ pool_families:
+ pool_families: Pool Families
+ index:
+ deleted: "Deleted the following Pool Families: %{list}."
+ not_deleted: "Could not delete the following Pool Families: %{list}."
setting: Settings
name: Name
admin:
diff --git a/src/config/navigation.rb b/src/config/navigation.rb
index 83f04dc..bcf3b3b 100644
--- a/src/config/navigation.rb
+++ b/src/config/navigation.rb
@@ -18,7 +18,7 @@ SimpleNavigation::Configuration.run do |navigation|
second_level.item :provider_accounts, t(:provider_accounts_item), admin_provider_accounts_path
second_level.item :hardware_profiles, t(:cloud_engine_hardware_profiles), admin_hardware_profiles_path
second_level.item :realms, t(:cloud_engine_realms), admin_realms_path
- second_level.item :pool_families, t(:pool_families), admin_pool_families_path
+ second_level.item :pool_families, t('pool_families.pool_families'), admin_pool_families_path
second_level.item :settings, t(:setting), admin_settings_path
end
first_level.item :dashboard, t(:dashboard), '#'
diff --git a/src/features/pool_family.feature b/src/features/pool_family.feature
index 441e927..2c0d753 100644
--- a/src/features/pool_family.feature
+++ b/src/features/pool_family.feature
@@ -44,3 +44,11 @@ Feature: Pool Families
And I check "poolfamily1" pool family
And I press "Delete"
Then there should not exist a pool family named "poolfamily1"
+
+ Scenario: Disallow deletion of default pool family
+ Given I am on the admin pool families page
+ Then I should see "default"
+ When I check "default" pool family
+ And I press "Delete"
+ Then I should see "Could not delete the following Pool Families: default."
+ And I should see "default"
\ No newline at end of file
--
1.7.4
12 years, 8 months
[PATCH conductor] Warehouse sync update (rev. 3)
by Jan Provazník
From: Jan Provaznik <jprovazn(a)redhat.com>
sync code moved to models. Image, ProviderImage, Icicle and Template now has
warehouse_sync method. When you call this method attributes are updated from
warehouse, note that save call is not part of this method - you need to save
explicitly (this is because of after_save hooks for image and provider_iamge
call warehouse_sync so there could be recursion)
---
src/app/models/icicle.rb | 15 +++
src/app/models/image.rb | 36 ++++++--
src/app/models/image_warehouse_object.rb | 49 ++++++++--
src/app/models/provider_image.rb | 31 +++++-
src/app/models/template.rb | 15 ++-
src/app/util/image_descriptor_xml.rb | 12 +--
src/lib/warehouse_client.rb | 4 +
src/warehouse_sync/warehouse_sync-server | 2 +-
src/warehouse_sync/warehouse_sync.rb | 149 +++++-------------------------
9 files changed, 148 insertions(+), 165 deletions(-)
diff --git a/src/app/models/icicle.rb b/src/app/models/icicle.rb
index 2bad5d9..a086285 100644
--- a/src/app/models/icicle.rb
+++ b/src/app/models/icicle.rb
@@ -12,7 +12,22 @@
#
class Icicle < ActiveRecord::Base
+ include ImageWarehouseObject
+
validates_presence_of :uuid
validates_uniqueness_of :uuid
belongs_to :provider_image
+
+ def self.create_or_update(uuid)
+ icicle = Icicle.find_by_uuid(uuid) || Icicle.new(:uuid => uuid)
+ icicle.warehouse_sync
+ icicle.log_changes
+ icicle.save! if icicle.changed?
+ icicle
+ end
+
+ def warehouse_sync
+ obj = warehouse.bucket('icicles').object(self.uuid)
+ self.xml = obj.body
+ end
end
diff --git a/src/app/models/image.rb b/src/app/models/image.rb
index 7a8aae4..f15f2da 100644
--- a/src/app/models/image.rb
+++ b/src/app/models/image.rb
@@ -79,15 +79,8 @@ class Image < ActiveRecord::Base
# TODO: for now when build is finished we call upload automatically for all providers
def after_update
if self.status_changed? and self.status == STATE_COMPLETED
- # TODO: use after_commit callback in rails 3 - it's better to have it outside
- # update transaction
- begin
- invoke_sync
- upload_to_all_providers_with_account
- rescue => e
- logger.error e.message
- logger.error e.backtrace.join("\n ")
- end
+ safe_warehouse_sync
+ upload_to_all_providers_with_account
end
end
@@ -176,6 +169,31 @@ class Image < ActiveRecord::Base
image
end
+ def warehouse_bucket
+ 'images'
+ end
+
+ def warehouse_sync
+ bucket = warehouse.bucket(warehouse_bucket)
+ raise WarehouseObjectNotFoundError unless bucket.include?(self.uuid)
+ obj = bucket.object(self.uuid)
+ attrs = obj.attrs([:uuid, :target, :template])
+ unless attrs[:target]
+ raise "target uuid is not set"
+ end
+ unless ptype = ProviderType.find_by_codename(attrs[:target])
+ raise "provider type #{attrs[:target]} not found"
+ end
+ unless attrs[:template]
+ raise "template uuid is not set"
+ end
+ unless tpl = Template.find_by_uuid(attrs[:template])
+ raise "Template with uuid #{attrs[:template]} not found"
+ end
+ self.provider_type_id = ptype.id
+ self.template_id = tpl.id
+ end
+
private
def upload_to_all_providers_with_account
diff --git a/src/app/models/image_warehouse_object.rb b/src/app/models/image_warehouse_object.rb
index 40a7c3b..43f3b76 100644
--- a/src/app/models/image_warehouse_object.rb
+++ b/src/app/models/image_warehouse_object.rb
@@ -19,6 +19,8 @@
require 'warehouse_client'
+class WarehouseObjectNotFoundError < Exception;end
+
module ImageWarehouseObject
WAREHOUSE_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/image_warehouse.yml")
@@ -40,32 +42,57 @@ module ImageWarehouseObject
# TODO: it would be nice not call upload, when save was invoked by warehouse
# sync script
def upload
- whouse = Warehouse::Client.new(WAREHOUSE_CONFIG['baseurl'])
# TODO: for now there is no way how it check if bucket exists in warehouse
# so we try to create bucket everytime, if bucket exists, warehouse returns
# 500 Internal server error
- whouse.create_bucket(warehouse_bucket) rescue true
+ warehouse.create_bucket(warehouse_bucket) rescue true
# TODO: we delete existing object if it exists
- whouse.bucket(warehouse_bucket).object(self.uuid).delete! rescue true
- whouse.bucket(warehouse_bucket).create_object(self.uuid, warehouse_body, warehouse_attrs)
+ warehouse.bucket(warehouse_bucket).object(self.uuid).delete! rescue true
+ warehouse.bucket(warehouse_bucket).create_object(self.uuid, warehouse_body, warehouse_attrs)
end
def delete_in_warehouse
- whouse = Warehouse::Client.new(WAREHOUSE_CONFIG['baseurl'])
begin
- whouse.bucket(warehouse_bucket).object(self.uuid).delete!
+ warehouse.bucket(warehouse_bucket).object(self.uuid).delete!
rescue
logger.error "failed to delete #{self.uuid} in warehouse: #{$!}"
end
end
+ def warehouse
+ @warehouse ||= Warehouse::Client.new(WAREHOUSE_CONFIG['baseurl'])
+ end
+
+ def warehouse_url
+ "#{WAREHOUSE_CONFIG['baseurl']}/#{warehouse_bucket}/#{self.uuid}"
+ end
+
+ def safe_warehouse_sync
+ warehouse_sync
+ log_changes
+ rescue RestClient::ResourceNotFound, WarehouseObjectNotFoundError
+ logger.error "Failed to fetch #{self.class.class_name} with uuid #{self.uuid} - not found in warehouse"
+ rescue => e
+ logger.error "Failed to sync #{self.class.class_name} with uuid #{self.uuid}: #{e.message}"
+ logger.error e.backtrace.join("\n ")
+ end
+
+ def log_changes
+ if self.new_record?
+ logger.info "#{self.class.class_name} #{self.uuid} is not in DB yet"
+ elsif self.changed?
+ logger.info "#{self.class.class_name} #{self.uuid} has been changed:"
+ self.changed.each do |attr|
+ logger.info "old #{attr}: #{self.send(attr + '_was')}"
+ logger.info "new #{attr}: #{self[attr]}"
+ end
+ else
+ logger.info "#{self.class.class_name} #{self.uuid} is without changes"
+ end
+ end
+
def generate_uuid
# TODO: generate real uuid here, e.g. with some ruby uuid generator
self.uuid ||= UUIDTools::UUID.timestamp_create.to_s
end
-
- def invoke_sync
- # TODO: invoke warehouse_sync here (after switching to eventmachine)
- # pass self.uuid to sync only changed object
- end
end
diff --git a/src/app/models/provider_image.rb b/src/app/models/provider_image.rb
index 67390dd..aee69a9 100644
--- a/src/app/models/provider_image.rb
+++ b/src/app/models/provider_image.rb
@@ -33,12 +33,31 @@ class ProviderImage < ActiveRecord::Base
def after_update
if self.status_changed? and self.status == STATE_COMPLETED
- begin
- invoke_sync
- rescue => e
- logger.error e.message
- logger.error e.backtrace.join("\n ")
- end
+ safe_warehouse_sync
end
end
+
+ def warehouse_bucket
+ 'provider_images'
+ end
+
+ def warehouse_sync
+ bucket = warehouse.bucket(warehouse_bucket)
+ raise WarehouseObjectNotFoundError unless bucket.include?(self.uuid)
+ obj = bucket.object(self.uuid)
+ attrs = obj.attrs([:uuid, :image, :icicle, :target_identifier])
+ unless attrs[:image]
+ raise "image uuid is not set"
+ end
+ unless img = Image.find_by_uuid(attrs[:image])
+ raise "image with uuid #{attrs[:image]} not found"
+ end
+ begin
+ self.icicle = Icicle.create_or_update(attrs[:icicle])
+ rescue
+ logger.error "Failed to fetch icicle '#{attrs[:icicle]}', setting icicle to nil: #{$!.message}"
+ end
+ self.image_id = img.id
+ self.provider_image_key = attrs[:target_identifier]
+ end
end
diff --git a/src/app/models/template.rb b/src/app/models/template.rb
index 3147e16..1b09dae 100644
--- a/src/app/models/template.rb
+++ b/src/app/models/template.rb
@@ -78,9 +78,11 @@ class Template < ActiveRecord::Base
def update_from_xml
self.name = xml.name
self.summary = xml.description
- self.platform = xml.platform
- self.platform_version = xml.platform_version
- self.architecture = xml.architecture
+ self.platform_hash = {
+ :platform => xml.platform,
+ :version => xml.platform_version,
+ :architecture => xml.architecture,
+ }
end
def providers
@@ -157,8 +159,9 @@ class Template < ActiveRecord::Base
'templates'
end
- def warehouse_url
- baseurl = YAML.load_file("#{RAILS_ROOT}/config/image_warehouse.yml")['baseurl'] + "/templates/"
- self.uuid ? baseurl + self.uuid : baseurl
+ def warehouse_sync
+ obj = warehouse.bucket(warehouse_bucket).object(self.uuid)
+ xml = obj.body
+ update_from_xml
end
end
diff --git a/src/app/util/image_descriptor_xml.rb b/src/app/util/image_descriptor_xml.rb
index 8476770..02634b2 100644
--- a/src/app/util/image_descriptor_xml.rb
+++ b/src/app/util/image_descriptor_xml.rb
@@ -52,8 +52,7 @@ class ImageDescriptorXML
end
def platform
- node = @root.at_xpath('/template/os')
- return node ? node['name'] : nil
+ return get_node_text('os/name')
end
def platform=(platform_hash)
@@ -80,17 +79,16 @@ class ImageDescriptorXML
end
def platform_version
- node = @root.at_xpath('/image/os/version')
- return node ? node.content : nil
+ return get_node_text('os/version')
end
def architecture
- node = @root.at_xpath('/template/os/arch')
- return node ? node.content : nil
+ return get_node_text('os/arch')
end
def architecture=(str)
- get_or_create_node('os')['architecture'] = str
+ node = get_or_create_node('arch', get_or_create_node('os'))
+ node.content = str
end
def services=(services)
diff --git a/src/lib/warehouse_client.rb b/src/lib/warehouse_client.rb
index 9431e47..12b8d9d 100644
--- a/src/lib/warehouse_client.rb
+++ b/src/lib/warehouse_client.rb
@@ -99,6 +99,10 @@ module Warehouse
def create_object(key, body, attrs)
BucketObject.create(@connection, key, self, body, attrs)
end
+
+ def include?(key)
+ object_names.include?(key)
+ end
end
class Connection
diff --git a/src/warehouse_sync/warehouse_sync-server b/src/warehouse_sync/warehouse_sync-server
index 7fc15f5..603a520 100755
--- a/src/warehouse_sync/warehouse_sync-server
+++ b/src/warehouse_sync/warehouse_sync-server
@@ -61,7 +61,7 @@ else
end
logger = Logger.new(LOG_FILE)
-logger.level = Logger::DEBUG
+logger.level = Logger::INFO
logger.datetime_format = "%Y-%m-%d %H:%M:%S"
logger.info "Warehouse_sync starting up"
diff --git a/src/warehouse_sync/warehouse_sync.rb b/src/warehouse_sync/warehouse_sync.rb
index f18c1e9..37f7bab 100644
--- a/src/warehouse_sync/warehouse_sync.rb
+++ b/src/warehouse_sync/warehouse_sync.rb
@@ -11,143 +11,42 @@ class WarehouseSync
@uri = opts[:uri]
@delay = opts[:delay] || 10*60
@logger = opts[:logger]
+ ActiveRecord::Base.logger = @logger
@whouse = Warehouse::Client.new(@uri)
end
def run
while true
begin
- @logger.debug "---------------------------------------"
- pull_templates
- pull_images
- pull_provider_images
+ @logger.info "***** Runnning warehouse sync"
+ # TODO: I disabled template sync - templates should never
+ # be changed by anything else than conductor
+ #(a)logger.info "*** syncing templates"
+ #Template.all.each do |i|
+ # i.safe_warehouse_sync
+ # i.save! if i.changed?
+ #end
+ @logger.info "*** syncing images"
+ Image.all.each do |i|
+ i.safe_warehouse_sync
+ if i.changed?
+ i.save! rescue @logger.error "failed to save image #{i.uuid}: #{$!.message}"
+ end
+ end
+ @logger.info "*** syncing provider images"
+ ProviderImage.all.each do |i|
+ i.safe_warehouse_sync
+ if i.changed?
+ i.save! rescue @logger.error "failed to save image #{i.uuid}: #{$!.message}"
+ end
+ end
rescue => e
@logger.error e.message
@logger.error "backtrace:\n" + e.backtrace.join("\n ")
ensure
- @logger.debug "sleep #{@delay}"
+ @logger.info "sleep #{@delay}"
sleep @delay
end
end
end
-
- def pull_templates
- @logger.debug "*** Getting templates"
- @whouse.bucket('templates').objects.each do |bucket_obj|
- safely_process(bucket_obj) do |obj|
- attrs = obj.attrs([:uuid])
- #tpl = Template.find_by_uuid(attrs[:uuid]) || Template.new(:uuid => attrs[:uuid])
- unless tpl = Template.find_by_uuid(attrs[:uuid])
- raise NotFoundError, "Template with uuid #{attrs[:uuid]} not found"
- end
- tpl.xml = obj.body
- tpl.update_from_xml
- update_changes(tpl)
- end
- end
- end
-
- def pull_images
- @logger.debug "*** Getting images"
- @whouse.bucket('images').objects.each do |bucket_obj|
- safely_process(bucket_obj) do |obj|
- attrs = obj.attrs([:uuid, :target, :template])
- #img = Image.find_by_uuid(attrs[:uuid]) || Image.new(:uuid => attrs[:uuid])
- unless img = Image.find_by_uuid(attrs[:uuid])
- raise NotFoundError, "image with uuid #{attrs[:uuid]} not found"
- end
- unless attrs[:target]
- raise "target uuid is not set"
- end
- unless ptype = ProviderType.find_by_codename(attrs[:target])
- raise "provider type #{attrs[:target]} not found"
- end
- unless attrs[:template]
- raise "template uuid is not set"
- end
- unless tpl = Template.find_by_uuid(attrs[:template])
- raise "Template with uuid #{attrs[:template]} not found"
- end
- img.provider_type_id = ptype.id
- img.template_id = tpl.id
- update_changes(img)
- end
- end
- end
-
- def pull_provider_images
- @logger.debug "*** Getting provider images"
- @whouse.bucket('provider_images').objects.each do |bucket_obj|
- safely_process(bucket_obj) do |obj|
- attrs = obj.attrs([:uuid, :image, :icicle, :target_identifier])
- # we don't allow create non-existing ProviderImage in conductor because
- # we don't know provider_id (provider attribute contains only url or
- # string which is not unique in conductor)
- unless pimg = ProviderImage.find_by_uuid(attrs[:uuid])
- raise NotFoundError, "provider image with uuid #{attrs[:uuid]} not found"
- end
- unless attrs[:image]
- raise "image uuid is not set"
- end
- unless img = Image.find_by_uuid(attrs[:image])
- raise "image with uuid #{attrs[:image]} not found"
- end
- unless attrs[:icicle]
- raise "icicle uuid is not set"
- end
- pimg.image_id = img.id
- pimg.icicle = pull_provider_image_icicle(attrs[:icicle])
- pimg.provider_image_key = attrs[:target_identifier]
- update_changes(pimg)
- end
- end
- end
-
- private
-
- def pull_provider_image_icicle(uuid)
- @logger.debug " getting provider image icicle with uuid #{uuid}"
- begin
- whouse_icicle = @whouse.bucket('icicles').object(uuid)
- icicle = Icicle.find_by_uuid(uuid) || Icicle.new(:uuid => uuid)
- icicle.xml = whouse_icicle.body
- icicle.uuid = uuid
- update_changes(icicle)
- icicle
- rescue
- @logger.debug " skipping image icicle with uuid #{uuid}: #{$!.message}"
- nil
- end
- end
-
- def safely_process(obj)
- begin
- yield obj
- rescue NotFoundError => e
- @logger.error "Skipping #{obj.key} - not found in DB"
- rescue => e
- @logger.error "Error while processing #{obj.key} (skipping): #{e.message}"
- @logger.error e.backtrace.join("\n ")
- end
- end
-
- def update_changes(obj)
- if obj.new_record?
- @logger.debug "#{obj.class.class_name} #{obj.uuid} is not in DB, saving"
- obj.save!
- elsif obj.changed?
- @logger.debug "#{obj.class.class_name} #{obj.uuid} has been changed:"
- log_changes(obj)
- obj.save!
- else
- @logger.debug "#{obj.class.class_name} #{obj.uuid} is without changes"
- end
- end
-
- def log_changes(obj)
- obj.changed.each do |attr|
- @logger.debug "old #{attr}: #{obj.send(attr + '_was')}"
- @logger.debug "new #{attr}: #{obj[attr]}"
- end
- end
end
--
1.7.4
12 years, 8 months
[PATCH] add top-level template permissions so end users can create templates and start instances.
by Scott Seago
Signed-off-by: Scott Seago <sseago(a)redhat.com>
---
.../controllers/resources/instances_controller.rb | 4 +-
src/app/models/permission.rb | 3 +-
src/app/services/registration_service.rb | 12 +++--
.../20110322120000_add_template_creator_role.rb | 47 ++++++++++++++++++++
src/db/seeds.rb | 10 +++-
src/lib/tasks/dc_tasks.rake | 13 ++++--
src/spec/services/registration_service_spec.rb | 6 ++-
7 files changed, 79 insertions(+), 16 deletions(-)
create mode 100644 src/db/migrate/20110322120000_add_template_creator_role.rb
diff --git a/src/app/controllers/resources/instances_controller.rb b/src/app/controllers/resources/instances_controller.rb
index 234fe6b..f857aa7 100644
--- a/src/app/controllers/resources/instances_controller.rb
+++ b/src/app/controllers/resources/instances_controller.rb
@@ -168,7 +168,7 @@ class Resources::InstancesController < ApplicationController
end
def init_new_instance_attrs
- @pools = Pool.list_for_user(@current_user, Privilege::MODIFY, :target_type => Instance)
+ @pools = Pool.list_for_user(@current_user, Privilege::CREATE, :target_type => Instance)
@realms = FrontendRealm.all
@hardware_profiles = HardwareProfile.all(
:include => :architecture,
@@ -189,7 +189,7 @@ class Resources::InstancesController < ApplicationController
{:name => 'CREATED BY', :sort_attr => 'users.last_name'},
]
- @pools = Pool.list_for_user(@current_user, Privilege::MODIFY, :target_type => Instance)
+ @pools = Pool.list_for_user(@current_user, Privilege::CREATE, :target_type => Instance)
end
def load_instances
diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb
index dc10166..34e37bd 100644
--- a/src/app/models/permission.rb
+++ b/src/app/models/permission.rb
@@ -40,7 +40,8 @@ class Permission < ActiveRecord::Base
validates_presence_of :user_id
validates_uniqueness_of :user_id, :scope => [:permission_object_id,
- :permission_object_type]
+ :permission_object_type,
+ :role_id]
belongs_to :permission_object, :polymorphic => true
# type-specific associations
diff --git a/src/app/services/registration_service.rb b/src/app/services/registration_service.rb
index 046fdcd..dfa5d88 100644
--- a/src/app/services/registration_service.rb
+++ b/src/app/services/registration_service.rb
@@ -21,11 +21,13 @@ class RegistrationService
end
@user.save!
-
- self_service_default_role = MetadataObject.lookup("self_service_default_role")
- self_service_default_pool = MetadataObject.lookup("self_service_default_pool")
- Permission.create!(:user => @user, :role => self_service_default_role,
- :permission_object => self_service_default_pool)
+ MetadataObject.lookup("self_service_perms_list").split.each do |x|
+ obj_key, role_key = x.split(",")
+ default_obj = MetadataObject.lookup(obj_key)
+ default_role = MetadataObject.lookup(role_key)
+ Permission.create!(:user => @user, :role => default_role,
+ :permission_object => default_obj)
+ end
return true
rescue ActiveRecord::RecordInvalid => e
Rails.logger.error e.message
diff --git a/src/db/migrate/20110322120000_add_template_creator_role.rb b/src/db/migrate/20110322120000_add_template_creator_role.rb
new file mode 100644
index 0000000..df13ac0
--- /dev/null
+++ b/src/db/migrate/20110322120000_add_template_creator_role.rb
@@ -0,0 +1,47 @@
+#
+# Copyright (C) 2011 Red Hat, Inc.
+# Written by Scott Seago <sseago(a)redhat.com>
+#
+# 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 AddTemplateCreatorRole < ActiveRecord::Migration
+
+
+ def self.up
+ unless Role.all.empty?
+ Role.transaction do
+ role_name = "Template Creator"
+ role = Role.find_or_initialize_by_name(role_name)
+ role.update_attributes({:name => role_name, :scope => BasePermissionObject.name,
+ :assign_to_owner => false})
+ role.save!
+ ["view","use","create"].each do |action|
+ Privilege.create!(:role => role, :target_type => Template.name,
+ :action => action)
+ end
+ end
+ settings = {"self_service_default_template_obj" => BasePermissionObject.general_permission_scope,
+ "self_service_default_template_role" => default_template_role,
+ "self_service_perms_list" => "self_service_default_pool,self_service_default_role self_service_default_template_obj,self_service_default_template_role"}
+ settings.each_pair do |key, value|
+ MetadataObject.set(key, value)
+ end
+ end
+ end
+
+ def self.down
+ end
+end
diff --git a/src/db/seeds.rb b/src/db/seeds.rb
index cf23e60..b29ef3d 100644
--- a/src/db/seeds.rb
+++ b/src/db/seeds.rb
@@ -57,6 +57,7 @@ roles =
Quota => [VIEW, MOD],
PoolFamily => [VIEW, MOD,CRE,VPRM,GPRM]}],
"Template Administrator" => [false, {Template => [VIEW,USE,MOD,CRE,VPRM,GPRM]}],
+ "Template Creator" => [false, {Template => [VIEW,USE, CRE]}],
"Administrator" => [false, {Provider => [VIEW, MOD,CRE,VPRM,GPRM],
ProviderAccount => [VIEW,USE,MOD,CRE,VPRM,GPRM],
HardwareProfile => [ MOD,CRE,VPRM,GPRM],
@@ -92,14 +93,19 @@ BasePermissionObject.create!(:name => "general_permission_scope")
# Set meta objects
MetadataObject.set("default_pool_family", PoolFamily.find_by_name('default'))
-default_pool = Pool.find_by_name("default_pool")
default_quota = Quota.create
+default_pool = Pool.find_by_name("default_pool")
default_role = Role.find_by_name("Pool User")
+default_template_role = Role.find_by_name("Template Creator")
+
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_role" => default_role,
+ "self_service_default_template_obj" => BasePermissionObject.general_permission_scope,
+ "self_service_default_template_role" => default_template_role,
+ "self_service_perms_list" => "self_service_default_pool,self_service_default_role self_service_default_template_obj,self_service_default_template_role"}
settings.each_pair do |key, value|
MetadataObject.set(key, value)
end
diff --git a/src/lib/tasks/dc_tasks.rake b/src/lib/tasks/dc_tasks.rake
index f7e853d..8255d32 100644
--- a/src/lib/tasks/dc_tasks.rake
+++ b/src/lib/tasks/dc_tasks.rake
@@ -46,10 +46,15 @@ namespace :dc do
puts "Permission already granted for user #{args.login}"
exit(1)
end
-
- user.permissions << Permission.new(:role => Role.find_by_name('Administrator'),
- :permission_object => BasePermissionObject.general_permission_scope)
- puts "Granting administrator privileges for #{args.login}..."
+ permission = Permission.new(:role => Role.find_by_name('Administrator'),
+ :permission_object => BasePermissionObject.general_permission_scope,
+ :user => user)
+ if permission.save
+ puts "Granting administrator privileges for #{args.login}..."
+ else
+ puts "Granting administrator privileges for #{args.login} failed #{permission.errors.to_xml}"
+ exit(1)
+ end
end
diff --git a/src/spec/services/registration_service_spec.rb b/src/spec/services/registration_service_spec.rb
index 810fe6e..ea38412 100644
--- a/src/spec/services/registration_service_spec.rb
+++ b/src/spec/services/registration_service_spec.rb
@@ -17,7 +17,7 @@ describe RegistrationService do
end
end
- it "should register a user with default pool/quota/role when default settings set" do
+ it "should register a user with default pool/quota/role/template perms when default settings set" do
@user = Factory :user
@pool = MetadataObject.lookup("self_service_default_pool")
@role = MetadataObject.lookup("self_service_default_role")
@@ -33,6 +33,8 @@ describe RegistrationService do
@user.quota.maximum_running_instances.should == @quota.maximum_running_instances
@user.quota.maximum_total_instances.should == @quota.maximum_total_instances
+ BasePermissionObject.general_permission_scope.has_privilege(@user,Privilege::CREATE, Template).should == true
+ BasePermissionObject.general_permission_scope.has_privilege(@user,Privilege::USE, Template).should == true
end
end
@@ -51,7 +53,7 @@ describe RegistrationService do
lambda do
lambda do
registration_process.save.should be_true
- end.should change(Permission, :count).by(1)
+ end.should change(Permission, :count).by(2)
end.should change(User, :count).by(1)
end.should change(Quota, :count).by(1)
--
1.7.4
12 years, 8 months
aeolus-conductor seed data (rev 2)
by Mo Morsi
Adds bits providing further post-installation
configuration data for the various aeolus components.
Right now adds code creating providers and hardware
profiles after a successful aeolus install. Additional
bits will be added to create provider accounts, templates,
images, and even instances post-install.
Sysadmins using the aeolus puppet recipe directly can
also now define custom providers and hardware profiles
to be automatically created post-installation.
12 years, 8 months
#690 Credentials model for provider account (rev.3)
by jzigmund@redhat.com
This patchset contains subtasks:
#691 - Build credential model to support any provider,
#693 - Update the generate_credentials method,
#692 - Surface new creds model in 'add account form
12 years, 8 months