From: martyntaylor <[email protected]>
---
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 | [email protected] |
- 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
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel