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

Reply via email to