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

Reply via email to