[email protected] wrote:
> 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"
>   
I think we can get rid of all three of the above. self-service login 
will be on a different page from this one (this page will appear as the 
"treatments" page), and the default pool/role will ultimately be set by 
adding a default user group, and this pool/role will be granted to the 
user group.
> +  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)
> +
>   
Again I think we can dump pool/role/logins here. Jay is this consistent 
with your understanding of presenting this on the "treatment" page that 
only allows quota setting here?
> +    @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])
>   
We should track this as a plain value representing the value of the 
default quota, not an AR quota object
> +        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
>   
We need a new quota object for each user, since the quota object also 
tracks usage. We should only be pulling the #instances number from the 
metadata bits rather than a quota object.
> +      @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
> +
>   
You should pull the pool by name here -- don't assume that there's only 
one pool define here.
> +    default_quota = Quota.new
> +    default_quota.save!
> +
>   
We don't need the default quota, since we just want to store an integer 
for the default (and we can leave this as 'nil'/unset for now since nil 
== unlimited)
> +    default_role = Role.find_by_name("Instance Creator and User")
> +    settings = {"allow_self_service_logins" => "true",
> +                "self_service_default_quota" => default_quota,
>   
We can leave out default quota setting here
> +                "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
>   

_______________________________________________
deltacloud-devel mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to