From: martyntaylor <mtay...@redhat.com> --- src/app/controllers/dashboard_controller.rb | 15 ++++-- src/app/controllers/settings_controller.rb | 55 +++++++++++++++++++- src/app/controllers/users_controller.rb | 4 -- src/app/services/registration_service.rb | 23 ++++---- src/db/migrate/20090803141507_create_pools.rb | 5 ++ .../20100707000000_create_metadata_objects.rb | 14 +++++ src/features/authentication.feature | 19 ------- src/features/support/hooks.rb | 18 ++++++- src/spec/controllers/users_controller_spec.rb | 25 ++++++--- src/spec/factories/metadata_object.rb | 14 ++++-- src/spec/models/registration_service_spec.rb | 22 ++++++++ 11 files changed, 161 insertions(+), 53 deletions(-)
diff --git a/src/app/controllers/dashboard_controller.rb b/src/app/controllers/dashboard_controller.rb index 5a83efb..c5a842a 100644 --- a/src/app/controllers/dashboard_controller.rb +++ b/src/app/controllers/dashboard_controller.rb @@ -67,11 +67,16 @@ class DashboardController < ApplicationController # FIXME filter to just those that the user has access to @cloud_accounts = CloudAccount.find(:all) - # FIXME remove general role based permission check, replace w/ - # more granular / per-permission-object permission checks on the - # dashboard in the future (here and in dashboard views) - @is_admin = @current_user.permissions.collect { |p| p.role }. - find { |r| r.name == "Administrator" } + + # Now need to check any permissions are set since default permission and pool + # may not be set for the admin user + if @current_user.permissions + # FIXME remove general role based permission check, replace w/ + # more granular / per-permission-object permission checks on the + # dashboard in the future (here and in dashboard views) + @is_admin = @current_user.permissions.collect { |p| p.role }. + find { |r| r.name == "Administrator" } + end @hide_getting_started = true #...@hide_getting_started = cookies["#...@current_user.login}_hide_getting_started"] diff --git a/src/app/controllers/settings_controller.rb b/src/app/controllers/settings_controller.rb index 32ef39f..21499e4 100644 --- a/src/app/controllers/settings_controller.rb +++ b/src/app/controllers/settings_controller.rb @@ -22,13 +22,66 @@ class SettingsController < ApplicationController before_filter :require_user + # Settings MetaData Keys + ALLOW_SELF_SERVICE_LOGINS = "allow_self_service_logins" + SELF_SERVICE_DEFAULT_POOL = "self_service_default_pool" + SELF_SERVICE_DEFAULT_ROLE = "self_service_default_role" + SELF_SERVICE_DEFAULT_QUOTA = "self_service_default_quota" + + KEYS = [ALLOW_SELF_SERVICE_LOGINS, SELF_SERVICE_DEFAULT_POOL, SELF_SERVICE_DEFAULT_ROLE, SELF_SERVICE_DEFAULT_QUOTA] + def index + @is_admin = is_admin? @providers = Provider.list_for_user(@current_user, Privilege::PROVIDER_VIEW) end def self_service + if !is_admin? + raise PermissionError.new('You have insufficient privileges to perform action.') + return + end + + @pools = Pool.list_for_user(@current_user, Privilege::POOL_MODIFY) + @self_service_default_pool = MetadataObject.lookup(SELF_SERVICE_DEFAULT_POOL) + @self_service_default_pool_id = @self_service_default_pool == nil ? nil : @self_service_default_pool.id.to_i + + @roles = Role.all + @self_service_default_role = MetadataObject.lookup(SELF_SERVICE_DEFAULT_ROLE) + @self_service_default_role_id = @self_service_default_role == nil ? nil : @self_service_default_role.id.to_i + + @allow_self_service_logins = MetadataObject.lookup(ALLOW_SELF_SERVICE_LOGINS) == "true" ? true : false @providers = Provider.list_for_user(@current_user, Privilege::PROVIDER_VIEW) - @pools = Pool.list_for_user(@current_user, Privilege::POOL_VIEW) + + @self_service_default_quota = MetadataObject.lookup(SELF_SERVICE_DEFAULT_QUOTA) end + def update + KEYS.each do |key| + if params[key] + if key == SELF_SERVICE_DEFAULT_QUOTA + self_service_default_quota = MetadataObject.lookup(key) + self_service_default_quota.update_attributes(params[key]) + elsif key == SELF_SERVICE_DEFAULT_POOL + if Pool.exists?(params[key]) + MetadataObject.set(key, Pool.find(params[key])) + end + elsif key == SELF_SERVICE_DEFAULT_ROLE + if Role.exists?(params[key]) + MetadataObject.set(key, Role.find(params[key])) + end + else + MetadataObject.set(key, params[key]) + end + end + end + + flash[:notice] = "Settings Updated!" + redirect_to :action => 'self_service' + end + + private + def is_admin? + is_admin = @current_user.permissions.collect { |p| p.role }.find { |r| r.name == "Administrator" } + return is_admin == nil ? false : true + end end diff --git a/src/app/controllers/users_controller.rb b/src/app/controllers/users_controller.rb index 8488509..f61c6d2 100644 --- a/src/app/controllers/users_controller.rb +++ b/src/app/controllers/users_controller.rb @@ -31,10 +31,6 @@ class UsersController < ApplicationController require_privilege(Privilege::USER_MODIFY) unless current_user.nil? @user = User.new(params[:user]) - #TODO Set Quota Values to SelfService Settings Default Quota - @user_quota = Quota.new - @user.quota_id = @user_quota.id - @registration = RegistrationService.new(@user) if @registration.save flash[:notice] = "User registered!" diff --git a/src/app/services/registration_service.rb b/src/app/services/registration_service.rb index 140b92e..0baca83 100644 --- a/src/app/services/registration_service.rb +++ b/src/app/services/registration_service.rb @@ -14,21 +14,22 @@ class RegistrationService begin User.transaction do @user.save! - @pool = Pool.create!({ :name => @user.login, :zone => Zone.default}) - @quota = Quota.new - @quota.save! + allow_self_service_logins = MetadataObject.lookup("allow_self_service_logins") + self_service_default_pool = MetadataObject.lookup("self_service_default_pool") + self_service_default_role = MetadataObject.lookup("self_service_default_role") + self_service_default_quota = MetadataObject.lookup("self_service_default_quota") - @pool.quota_id = @quota.id - @pool.save! + @user_quota = Quota.new(:maximum_running_instances => self_service_default_quota.maximum_running_instances, + :maximum_total_instances => self_service_default_quota.maximum_total_instances) + @user_quota.save! + @user.quota = @user_quota + @user.save! - raise "Role 'Instance Creator and User' doesn't exist" unless - role = Role.find_by_name("Instance Creator and User") + Permission.create!({:user => @user, :role => self_service_default_role, :permission_object => self_service_default_pool}) - Permission.create!({:user => @user, - :role => role, - :permission_object => @pool}) - end + return true + end rescue Rails.logger.error $!.message Rails.logger.error $!.backtrace.join("\n ") diff --git a/src/db/migrate/20090803141507_create_pools.rb b/src/db/migrate/20090803141507_create_pools.rb index e0c1dc7..58e3c3d 100644 --- a/src/db/migrate/20090803141507_create_pools.rb +++ b/src/db/migrate/20090803141507_create_pools.rb @@ -30,6 +30,11 @@ class CreatePools < ActiveRecord::Migration t.timestamps end + quota = Quota.new + quota.save! + + default_pool = Pool.new(:name => "default_pool", :quota => quota, :zone => Zone.first) + default_pool.save! end def self.down diff --git a/src/db/migrate/20100707000000_create_metadata_objects.rb b/src/db/migrate/20100707000000_create_metadata_objects.rb index 2f3eeb5..5f00306 100644 --- a/src/db/migrate/20100707000000_create_metadata_objects.rb +++ b/src/db/migrate/20100707000000_create_metadata_objects.rb @@ -31,6 +31,20 @@ class CreateMetadataObjects < ActiveRecord::Migration default_zone = Zone.first MetadataObject.set("default_zone", default_zone) if default_zone + + default_pool = Pool.first + + default_quota = Quota.new + default_quota.save! + + default_role = Role.find_by_name("Instance Creator and User") + settings = {"allow_self_service_logins" => "true", + "self_service_default_quota" => default_quota, + "self_service_default_pool" => default_pool, + "self_service_default_role" => default_role} + settings.each_pair do |key, value| + MetadataObject.set(key, value) + end end def self.down diff --git a/src/features/authentication.feature b/src/features/authentication.feature index e160dfb..8525311 100644 --- a/src/features/authentication.feature +++ b/src/features/authentication.feature @@ -19,25 +19,6 @@ Feature: User authentication And I press "Create Account" Then I should be on testuser's user page And I should see "User registered!" - And I should have one private pool named "testuser" - - @register - Scenario: Register as new user fails even if user is valid - Given I am on the homepage - And there are not any roles - When I follow "Create one now" - Then I should be on the new account page - And I should see "New Account" - When I fill in the following: - | Choose a username | testuser | - | Choose a password | secret | - | Confirm password | secret | - | First name | Joe | - | Last name | Tester | - | Email | testu...@example.com | - And I press "Create Account" - Then I should see "New Account" - And I should see "user registration failed" Scenario: Log in as registered user Given I am a registered user diff --git a/src/features/support/hooks.rb b/src/features/support/hooks.rb index 356cf0d..49842fc 100644 --- a/src/features/support/hooks.rb +++ b/src/features/support/hooks.rb @@ -1,3 +1,19 @@ Before do @default_zone_metadata = Factory.create(:default_zone_metadata) -end + @allow_self_service_logins = Factory(:metadata_object, :key => "allow_self_service_logins", :value => "true") + + @default_quota = Factory(:unlimited_quota) + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_quota", + :value => @default_quota, + :object_type => "Quota") + + @default_pool = Factory(:pool, :name => "default_pool") + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_pool", + :value => @default_pool, + :object_type => "Pool") + + @default_role = Role.find(:first, :conditions => ['name = ?', 'Instance Creator and User']) + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_role", + :value => @default_role, + :object_type => "Role") +end \ No newline at end of file diff --git a/src/spec/controllers/users_controller_spec.rb b/src/spec/controllers/users_controller_spec.rb index 5add3c7..debc675 100644 --- a/src/spec/controllers/users_controller_spec.rb +++ b/src/spec/controllers/users_controller_spec.rb @@ -7,6 +7,23 @@ describe UsersController do @admin_permission = Factory :admin_permission @admin = @admin_permission.user activate_authlogic + + @allow_self_service_logins = Factory(:metadata_object, :key => "allow_self_service_logins", :value => "true") + + @default_quota = Factory(:unlimited_quota) + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_quota", + :value => @default_quota, + :object_type => "Quota") + + @default_pool = Factory(:pool, :name => "default_pool") + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_pool", + :value => @default_pool, + :object_type => "Pool") + + @default_role = Role.find(:first, :conditions => ['name = ?', 'Instance Creator and User']) + @self_service_default_quota = Factory(:metadata_object, :key => "self_service_default_role", + :value => @default_role, + :object_type => "Role") end it "should call new method" do @@ -29,14 +46,6 @@ describe UsersController do :password => "testpass", :password_confirmation => "testpass" } }.should change{ User.count } - p = Pool.find_by_name("tuser2") - p.should_not be_nil - - p.name.should == "tuser2" - p.permissions.size.should == 1 - p.permissions.any? { - |perm| perm.role.name.eql?('Instance Creator and User') - }.should be_true user = User.find(:first, :conditions => ['login = ?', "tuser2"]) response.should redirect_to(user_url(user)) end diff --git a/src/spec/factories/metadata_object.rb b/src/spec/factories/metadata_object.rb index 04e8404..5dcf989 100644 --- a/src/spec/factories/metadata_object.rb +++ b/src/spec/factories/metadata_object.rb @@ -1,5 +1,11 @@ -Factory.define :default_zone_metadata, :class => MetadataObject do |o| - o.key 'default_zone' - o.value {Factory.create(:zone).id} - o.object_type 'Zone' +Factory.define :metadata_object do |o| + o.key 'key' + o.value 'value' + o.object_type nil end + +Factory.define :default_zone_metadata, :parent => :metadata_object do |o| + o.key 'default_zone' + o.value Factory.create(:zone).id + o.object_type 'Zone' +end \ No newline at end of file diff --git a/src/spec/models/registration_service_spec.rb b/src/spec/models/registration_service_spec.rb index 40f16f2..2a97d11 100644 --- a/src/spec/models/registration_service_spec.rb +++ b/src/spec/models/registration_service_spec.rb @@ -39,4 +39,26 @@ describe RegistrationService do end end end + + it "should register a user with default pool/quota/role when default settings set" do + @user = Factory :user + @pool = Factory(:pool, :name => "default_pool") + @role = Role.find_by_name("Instance Creator and User") + @quota = Factory :quota + + MetadataObject.set("allow_self_service_logins", "true") + MetadataObject.set("self_service_default_pool", @pool) + MetadataObject.set("self_service_default_role", @role) + MetadataObject.set("self_service_default_quota", @quota) + + @registration_service = RegistrationService.new(@user) + @registration_service.save + + @pools = Pool.list_for_user(@user, Privilege::INSTANCE_VIEW) + @pools.size.should == 1 + @pools[0].name.should == "default_pool" + + @user.quota.maximum_running_instances.should == @quota.maximum_running_instances + @user.quota.maximum_total_instances.should == @quota.maximum_total_instances + end end -- 1.7.2.2 _______________________________________________ deltacloud-devel mailing list deltacloud-devel@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/deltacloud-devel