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 | 37 ++++++++------
src/app/views/settings/index.haml | 9 +++-
src/app/views/settings/self_service.haml | 31 +++++++++++-
.../20100707000000_create_metadata_objects.rb | 10 ++++
src/features/authentication.feature | 19 -------
.../self_service_policy_management.feature | 33 ++++++++++++
.../self_service_policy_management_steps.rb | 19 +++++++
src/features/support/hooks.rb | 7 ++-
src/features/support/paths.rb | 3 +
src/spec/controllers/users_controller_spec.rb | 8 ---
src/spec/factories/metadata_object.rb | 14 ++++--
src/spec/factories/quota.rb | 5 ++
src/spec/models/registration_service_spec.rb | 34 ++++++++++++
16 files changed, 242 insertions(+), 61 deletions(-)
create mode 100644 src/features/self_service_policy_management.feature
create mode 100644
src/features/step_definitions/self_service_policy_management_steps.rb
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 a9fbfca..edc0687 100644
--- a/src/app/services/registration_service.rb
+++ b/src/app/services/registration_service.rb
@@ -14,31 +14,36 @@ class RegistrationService
begin
User.transaction do
@user.save!
- @pool = Pool.create!({ :name => @user.login, :owner => @user,
- :zone => Zone.default})
- @quota = Quota.new
- @quota.save!
-
- @pool.quota_id = @quota.id
- @pool.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 => role,
- :permission_object => @pool})
+ 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")
+
+ if allow_self_service_logins == "true"
+ if self_service_default_role
+ if self_service_default_pool
+ @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!
+ Permission.create!({:user => @user, :role =>
self_service_default_role, :permission_object => self_service_default_pool})
+ end
+ end
+ end
+ return true
end
rescue
Rails.logger.error $!.message
Rails.logger.error $!.backtrace.join("\n ")
@error = $!.message
- false
+ return false
end
end
def valid?
@user.valid?
end
-end
+end
\ No newline at end of file
diff --git a/src/app/views/settings/index.haml
b/src/app/views/settings/index.haml
index fc7e3b2..6c376f5 100644
--- a/src/app/views/settings/index.haml
+++ b/src/app/views/settings/index.haml
@@ -1,2 +1,7 @@
-%h1 Settings
-Insert Page 3100 Implementation Here.
+%h1
+ Settings
+
+%h2
+ -if @is_admin
+ %a{:href => url_for(:controller => "settings", :action => "self_service")}
+ self service settings
diff --git a/src/app/views/settings/self_service.haml
b/src/app/views/settings/self_service.haml
index 0185073..3c5565a 100644
--- a/src/app/views/settings/self_service.haml
+++ b/src/app/views/settings/self_service.haml
@@ -1 +1,30 @@
-Insert Page 3170 Implementation Here.
+%h1
+ self service settings page
+
+- form_tag :action => 'update' do |form|
+ %fieldset
+ %legend Self Service Settings
+ %label Allow self service logins
+ = check_box_tag 'allow_self_service_logins', 'true',
@allow_self_service_logins, :disabled => true
+ %br
+ %br
+ %legend Default Self Service Pool
+ %br
+ = select_tag "self_service_default_pool",
options_from_collection_for_select(@pools, "id", "name",
@self_service_default_pool_id), :size => 4
+ %br
+ %br
+ %legend Default Self Service Role
+ %br
+ = select_tag "self_service_default_role",
options_from_collection_for_select(@roles, "id", "name",
@self_service_default_role_id), :size => 4
+ %br
+ %br
+ %legend Default Quota
+ %br
+ %label
+ Maximum Total Instances
+ = text_field :self_service_default_quota, :maximum_total_instances
+ %br
+ %label
+ Maximum Running Instances
+ = text_field :self_service_default_quota, :maximum_running_instances
+ = submit_tag "Save", :class => "submit"
\ No newline at end of file
diff --git a/src/db/migrate/20100707000000_create_metadata_objects.rb
b/src/db/migrate/20100707000000_create_metadata_objects.rb
index 2f3eeb5..4fe848a 100644
--- a/src/db/migrate/20100707000000_create_metadata_objects.rb
+++ b/src/db/migrate/20100707000000_create_metadata_objects.rb
@@ -31,6 +31,16 @@ class CreateMetadataObjects < ActiveRecord::Migration
default_zone = Zone.first
MetadataObject.set("default_zone", default_zone) if default_zone
+
+ #create default settings
+ self_service_default_quota = Quota.new
+ self_service_default_quota.save!
+
+ settings = {"allow_self_service_logins" => "true",
+ "self_service_default_quota" => self_service_default_quota}
+ 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 2527c64..b7e9656 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/self_service_policy_management.feature
b/src/features/self_service_policy_management.feature
new file mode 100644
index 0000000..d7c160d
--- /dev/null
+++ b/src/features/self_service_policy_management.feature
@@ -0,0 +1,33 @@
+Feature: Cloud Engine Self Service Policy Management
+ In order to manage policy settings for self service
+ As an Admin
+ I must use the policy engine to configure the application
+
+ Background:
+ Given I am an authorised user
+ And I am logged in
+ And I am on the system settings pages
+
+ Scenario: Set up Cloud Engine Policy for self-service
+ When I follow "self service settings"
+ Then I should see "Allow self service logins"
+
+ Scenario: Designate default pool for self-service users
+ Given I own a pool named "default_pool"
+ When I follow "self service settings"
+ And I select "default_pool" from "self_service_default_pool"
+ And I press "Save"
+ Then the self service default pool should be set to "default_pool"
+
+ Scenario: Create default pool permissions for self-service users
+ When I follow "self service settings"
+ And I select "Provider Creator" from "self_service_default_role"
+ And I press "Save"
+ Then the self service default role should be set to "Provider Creator"
+
+ Scenario: Set a default User Quota
+ When I follow "self service settings"
+ And I fill in "self_service_default_quota_maximum_total_instances" with "5"
+ And I fill in "self_service_default_quota_maximum_running_instances" with
"5"
+ And I press "Save"
+ Then the default instance quota should be 5
\ No newline at end of file
diff --git
a/src/features/step_definitions/self_service_policy_management_steps.rb
b/src/features/step_definitions/self_service_policy_management_steps.rb
new file mode 100644
index 0000000..e4217c2
--- /dev/null
+++ b/src/features/step_definitions/self_service_policy_management_steps.rb
@@ -0,0 +1,19 @@
+Given /^I am an admin$/ do
+ @admin_permission = Factory :admin_permission
+ @user = @admin_permission.user
+end
+
+Then /^the self service default pool should be set to "([^"]*)"$/ do |name|
+ @default_pool = MetadataObject.lookup("self_service_default_pool")
+ @default_pool.name.should == name
+end
+
+Then /^the self service default role should be set to "([^"]*)"$/ do |name|
+ @default_role = MetadataObject.lookup("self_service_default_role")
+ @default_role.name.should == name
+end
+
+Then /^the default instance quota should be (\d+)$/ do |instances|
+ @default_quota = MetadataObject.lookup("self_service_default_quota")
+ @default_quota.maximum_running_instances.should == instances.to_i
+end
\ No newline at end of file
diff --git a/src/features/support/hooks.rb b/src/features/support/hooks.rb
index 356cf0d..12e7d2e 100644
--- a/src/features/support/hooks.rb
+++ b/src/features/support/hooks.rb
@@ -1,3 +1,8 @@
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")
+end
\ No newline at end of file
diff --git a/src/features/support/paths.rb b/src/features/support/paths.rb
index 537dd31..858aa09 100644
--- a/src/features/support/paths.rb
+++ b/src/features/support/paths.rb
@@ -65,6 +65,9 @@ module NavigationHelpers
when /the new permission page/
url_for :action => 'new', :controller => 'permissions', :only_path =>
true
+ when /the system settings page/
+ url_for :action => 'index', :controller => 'settings', :only_path => true
+
# Add more mappings here.
# Here is an example that pulls values out of the Regexp:
#
diff --git a/src/spec/controllers/users_controller_spec.rb
b/src/spec/controllers/users_controller_spec.rb
index 29c2f41..0702d86 100644
--- a/src/spec/controllers/users_controller_spec.rb
+++ b/src/spec/controllers/users_controller_spec.rb
@@ -29,14 +29,6 @@ describe UsersController do
:password => "testpass",
:password_confirmation => "testpass" }
}.should change{ User.count }
- p = Pool.find_by_name("tuser2")
- p.should_not be_nil
- assigns[:user].login.should == p.owner.login
- 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/factories/quota.rb b/src/spec/factories/quota.rb
index 92c832f..e1e9840 100644
--- a/src/spec/factories/quota.rb
+++ b/src/spec/factories/quota.rb
@@ -6,4 +6,9 @@ end
Factory.define :full_quota, :parent => :quota do |f|
f.running_instances 10
f.total_instances 15
+end
+
+Factory.define :unlimited_quota, :parent => :quota do |f|
+ f.running_instances nil
+ f.total_instances nil
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..f1ab308 100644
--- a/src/spec/models/registration_service_spec.rb
+++ b/src/spec/models/registration_service_spec.rb
@@ -39,4 +39,38 @@ 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", :owner => @user)
+ @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_MODIFY)
+ @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
+
+ it "should register a user with no default pool/quota/role with no default
settings set" do
+ @user = Factory(:user, :quota => nil)
+
+ @registration_service = RegistrationService.new(@user)
+ @registration_service.save
+
+ @perms = Permission.find(:all, :conditions => {:user_id=> @user.id})
+ @perms.size.should == 0
+
+ @user.quota.should == nil
+ end
end
--
1.7.2.2
_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel