ACK

On 11/29/2010 02:46 PM, [email protected] wrote:
> From: Ladislav Martincik<[email protected]>
>
> ---
>   src/app/controllers/cloud_accounts_controller.rb   |   98 
> ++++++++++---------
>   src/app/controllers/providers_controller.rb        |    9 --
>   src/app/models/cloud_account.rb                    |   60 ++++++++----
>   src/app/models/quota.rb                            |   10 ++-
>   src/app/views/cloud_accounts/_form.haml            |   89 ++++++++++--------
>   src/app/views/cloud_accounts/edit.haml             |   23 ++++-
>   src/app/views/cloud_accounts/index.haml            |   25 +++++
>   src/app/views/cloud_accounts/new.haml              |   25 ++++--
>   src/app/views/layouts/_notification.rhtml          |    3 +
>   src/config/locales/en.yml                          |   11 ++-
>   src/config/navigation.rb                           |    4 +-
>   src/config/routes.rb                               |    5 +-
>   src/features/provider.feature                      |    4 +-
>   src/features/step_definitions/web_steps.rb         |    6 +
>   .../controllers/cloud_accounts_controller_spec.rb  |   40 +++++++--
>   src/spec/controllers/provider_controller_spec.rb   |   12 ---
>   src/spec/models/cloud_account_spec.rb              |   15 ++-
>   17 files changed, 281 insertions(+), 158 deletions(-)
>   create mode 100644 src/app/views/cloud_accounts/index.haml
>
> diff --git a/src/app/controllers/cloud_accounts_controller.rb 
> b/src/app/controllers/cloud_accounts_controller.rb
> index e1c9b23..38af463 100644
> --- a/src/app/controllers/cloud_accounts_controller.rb
> +++ b/src/app/controllers/cloud_accounts_controller.rb
> @@ -21,55 +21,60 @@
>
>   class CloudAccountsController<  ApplicationController
>     before_filter :require_user
> +  before_filter :load_providers
> +
> +  helper :providers
> +
> +  def index
> +    @provider = Provider.find(params[:provider_id])
> +    require_privilege(Privilege::ACCOUNT_VIEW, @provider)
> +  end
>
>     def new
>       @provider = Provider.find(params[:provider_id])
>       @cloud_account = CloudAccount.new
> +    @quota = Quota.new
>       require_privilege(Privilege::ACCOUNT_MODIFY, @provider)
>     end
>
>     def create
> -    @provider = Provider.find(params[:cloud_account][:provider_id])
> +    @provider = Provider.find(params[:provider_id])
>       require_privilege(Privilege::ACCOUNT_MODIFY,@provider)
> -    if params[:cloud_account]&&  
> !params[:cloud_account][:x509_cert_priv_file].blank?
> -      params[:cloud_account][:x509_cert_priv] = 
> params[:cloud_account][:x509_cert_priv_file].read
> -    end
> -    params[:cloud_account].delete :x509_cert_priv_file
> -    if params[:cloud_account]&&  
> !params[:cloud_account][:x509_cert_pub_file].blank?
> -      params[:cloud_account][:x509_cert_pub] = 
> params[:cloud_account][:x509_cert_pub_file].read
> -    end
> -    params[:cloud_account].delete :x509_cert_pub_file
>       @cloud_account = CloudAccount.new(params[:cloud_account])
> +    @cloud_account.provider = @provider
> +    @cloud_account.quota = @quota = Quota.new
>
>       if params[:test_account]
>         test_account(@cloud_account)
> -      redirect_to :controller =>  "providers", :action =>  "accounts", :id 
> =>  @provider, :cloud_account =>  params[:cloud_account]
> -    elsif @cloud_account.valid?
> -      quota = Quota.new
> -      quota.maximum_running_instances = 
> quota_from_string(params[:quota][:maximum_running_instances])
> -      quota.save!
> -      @cloud_account.quota_id = quota.id
> -      @cloud_account.zones<<  Zone.default
> -      @cloud_account.save!
> -      if request.post?&&  @cloud_account.save&&  
> @cloud_account.populate_realms
> -        flash[:notice] = "Provider account added."
> -      end
> -      redirect_to :controller =>  "providers", :action =>  "accounts", :id 
> =>  @provider
> -      kick_condor
> -    else
> +      render :action =>  'new' and return
> +    end
> +
> +    limit = params[:quota][:maximum_running_instances] if params[:quota]
> +    @cloud_account.quota.set_maximum_running_instances(limit)
> +
> +    if @cloud_account.invalid?
>         if not @cloud_account.valid_credentials?
> -        flash[:notice] = "The entered credential information is incorrect"
> +        flash.now[:error] = "The entered credential information is incorrect"
>         elsif @cloud_account.errors.on(:username)
> -        flash[:notice] = "The access key 
> '#{params[:cloud_account][:username]}' has already been taken."
> +        flash.now[:error] = "The access key 
> '#{params[:cloud_account][:username]}' has already been taken."
>         else
> -        flash[:notice] = "You must fill in all the required fields"
> +        flash.now[:error] = "You must fill in all the required fields"
>         end
> -      redirect_to :controller =>  "providers", :action =>  "accounts", :id 
> =>  @provider, :cloud_account =>  params[:cloud_account]
> +      render :action =>  'new' and return
>       end
> +
> +    @cloud_account.zones<<  Zone.default
> +    @cloud_account.save!
> +    if @cloud_account.populate_realms
> +      flash[:notice] = "Provider account added."
> +    end
> +    redirect_to provider_accounts_path(@provider)
> +    kick_condor
>     end
>
>     def edit
>       @cloud_account = CloudAccount.find(params[:id])
> +    @quota = @cloud_account.quota
>       @provider = @cloud_account.provider
>       require_privilege(Privilege::ACCOUNT_MODIFY,@provider)
>     end
> @@ -119,11 +124,16 @@ class CloudAccountsController<  ApplicationController
>     end
>
>     def update
> -    @cloud_account = CloudAccount.find(params[:cloud_account][:id])
> -    require_privilege(Privilege::ACCOUNT_MODIFY,@cloud_account.provider)
> +    @cloud_account = CloudAccount.find(params[:id])
> +    @provider = @cloud_account.provider
> +    require_privilege(Privilege::ACCOUNT_MODIFY, @provider)
> +    @quota = @cloud_account.quota
> +
> +    limit = params[:quota][:maximum_running_instances] if params[:quota]
> +    @cloud_account.quota.set_maximum_running_instances(limit)
>       if @cloud_account.update_attributes(params[:cloud_account])
>         flash[:notice] = "Cloud Account updated!"
> -      redirect_to :controller =>  'providers', :action =>  'accounts', :id 
> =>  @cloud_account.provider.id
> +      redirect_to provider_accounts_path(@provider)
>       else
>         render :action =>  :edit
>       end
> @@ -138,34 +148,30 @@ class CloudAccountsController<  ApplicationController
>     end
>
>     def destroy
> -    acct = CloudAccount.find(params[:id])
> -    provider = acct.provider
> -    require_privilege(Privilege::ACCOUNT_MODIFY,provider)
> -    if acct.destroyable?
> -      CloudAccount.destroy(params[:id])
> +    account = CloudAccount.find(params[:id])
> +    provider = account.provider
> +    require_privilege(Privilege::ACCOUNT_MODIFY, provider)
> +    if account.destroy
>         flash[:notice] = "Cloud Account destroyed"
>       else
> -      flash[:notice] = "Cloud Account could not be destroyed"
> +      flash[:error] = "Cloud Account could not be destroyed"
>       end
> -    redirect_to :controller =>  'providers', :action =>  'accounts', :id =>  
> provider.id
> +    redirect_to provider_accounts_path(provider)
>     end
>
>     def test_account(account)
>       if account.valid_credentials?
> -      flash[:notice] = "Test Connection Success: Valid Account Details"
> +      flash.now[:notice] = "Test Connection Success: Valid Account Details"
>       else
> -      flash[:notice] = "Test Connection Failed: Invalid Account Details"
> +      flash.now[:error] = "Test Connection Failed: Invalid Account Details"
>       end
>     rescue
> -    flash[:notice] = "Test Connection Failed: Could not connect to provider"
> +    flash.now[:error] = "Test Connection Failed: Could not connect to 
> provider"
>     end
> +
>     private
>
> -  def quota_from_string(quota_raw)
> -    if quota_raw.nil? or quota_raw.empty? or quota_raw.downcase == 
> 'unlimited'
> -      return nil
> -    else
> -      return Integer(quota_raw)
> -    end
> +  def load_providers
> +    @providers = Provider.list_for_user(@current_user, 
> Privilege::PROVIDER_VIEW)
>     end
>   end
> diff --git a/src/app/controllers/providers_controller.rb 
> b/src/app/controllers/providers_controller.rb
> index 580552e..0754d65 100644
> --- a/src/app/controllers/providers_controller.rb
> +++ b/src/app/controllers/providers_controller.rb
> @@ -120,15 +120,6 @@ class ProvidersController<  ApplicationController
>       require_privilege(Privilege::PROVIDER_VIEW, @provider)
>     end
>
> -  def accounts
> -    @provider = Provider.find(:first, :conditions =>  {:id =>  params[:id]})
> -    require_privilege(Privilege::ACCOUNT_VIEW, @provider)
> -    if params[:cloud_account]
> -      @cloud_account = CloudAccount.new(params[:cloud_account])
> -      @quota = Quota.new(params[:quota])
> -    end
> -  end
> -
>     def realms
>       @provider = Provider.find(params[:id])
>       @realm_names = @provider.realms.collect { |r| r.name }
> diff --git a/src/app/models/cloud_account.rb b/src/app/models/cloud_account.rb
> index 5673e9a..a7de905 100644
> --- a/src/app/models/cloud_account.rb
> +++ b/src/app/models/cloud_account.rb
> @@ -23,34 +23,62 @@ require 'nokogiri'
>
>   class CloudAccount<  ActiveRecord::Base
>     include PermissionedObject
> +
> +  # Relations
>     belongs_to :provider
> -  belongs_to :quota
> +  belongs_to :quota, :autosave =>  true
>     has_many :instances
>     has_and_belongs_to_many :zones
> +  has_many :permissions, :as =>  :permission_object, :dependent =>  :destroy,
> +           :include =>  [:role],
> +           :order =>  "permissions.id ASC"
>
> -  # what form does the account quota take?
> +  has_one :instance_key, :dependent =>  :destroy
>
> -  validates_presence_of :provider_id
> +  # Helpers
> +  attr_accessor :x509_cert_priv_file, :x509_cert_pub_file
>
> +  # Validations
> +  validates_presence_of :provider_id
>     validates_presence_of :label
>     validates_presence_of :username
>     validates_uniqueness_of :username, :scope =>  :provider_id
>     validates_presence_of :password
>     validates_presence_of :account_number
> -  validates_presence_of :x509_cert_pub
> -  validates_presence_of :x509_cert_priv
> +  validate :validate_presence_of_x509_certs
> +  validate :validate_credentials
> +
> +  # We're using this instead of<tt>validates_presence_of</tt>  helper because
> +  # we want to show errors on different attributes ending with '_file'.
> +  def validate_presence_of_x509_certs
> +    errors.add(:x509_cert_pub_file, "can't be blank") if x509_cert_pub.blank?
> +    errors.add(:x509_cert_priv_file, "can't be blank") if 
> x509_cert_priv.blank?
> +  end
>
> -  has_many :permissions, :as =>  :permission_object, :dependent =>  :destroy,
> -           :include =>  [:role],
> -           :order =>  "permissions.id ASC"
> +  def validate_credentials
> +    unless valid_credentials?
> +      errors.add(:base, "Login Credentials are Invalid for this Provider")
> +    end
> +  end
>
> -  has_one :instance_key, :dependent =>  :destroy
> +  # Hooks
>     after_create :generate_cloud_account_key
> -
> -  before_destroy {|entry| entry.destroyable? }
> +  before_destroy :destroyable?
> +  before_validation :read_x509_files
>
>     def destroyable?
> -    self.instances.empty?
> +    instances.empty?
> +  end
> +
> +  def read_x509_files
> +    if x509_cert_pub_file.respond_to?(:read)
> +      x509_cert_pub_file.rewind # Sometimes the file has to rewind, becuase 
> something already read from it.
> +      self.x509_cert_pub = x509_cert_pub_file.read
> +    end
> +    if x509_cert_priv_file.respond_to?(:read)
> +      x509_cert_priv_file.rewind
> +      self.x509_cert_priv = x509_cert_priv_file.read
> +    end
>     end
>
>     def connect
> @@ -76,7 +104,7 @@ class CloudAccount<  ActiveRecord::Base
>     end
>
>     def name
> -    label.nil? || label == "" ? username : label
> +    label.blank? ? username : label
>     end
>
>     # FIXME: for already-mapped accounts, update rather than add new
> @@ -142,11 +170,6 @@ EOT
>       return xml.to_s
>     end
>
> -  protected
> -  def validate
> -    errors.add_to_base("Login Credentials are Invalid for this Provider") 
> unless valid_credentials?
> -  end
> -
>     private
>     def generate_cloud_account_key
>       client = connect
> @@ -156,5 +179,4 @@ EOT
>       end
>     end
>
> -
>   end
> diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb
> index 7081869..9f79e04 100644
> --- a/src/app/models/quota.rb
> +++ b/src/app/models/quota.rb
> @@ -49,6 +49,15 @@ class Quota<  ActiveRecord::Base
>
>     RESOURCE_NAMES = [ RESOURCE_RUNNING_INSTANCES, RESOURCE_TOTAL_INSTANCES ]
>
> +  def set_maximum_running_instances(value)
> +    if value.blank? || value == 'unlimited'
> +      self.maximum_running_instances = Quota::NO_LIMIT
> +    else
> +      self.maximum_running_instances = value
> +    end
> +  end
> +
> +
>     def self.can_create_instance?(instance, cloud_account)
>       [instance.owner, instance.pool, cloud_account].each do |parent|
>         if parent
> @@ -112,5 +121,4 @@ class Quota<  ActiveRecord::Base
>       end
>       return false
>     end
> -
>   end
> diff --git a/src/app/views/cloud_accounts/_form.haml 
> b/src/app/views/cloud_accounts/_form.haml
> index 32c12a4..2d35d47 100644
> --- a/src/app/views/cloud_accounts/_form.haml
> +++ b/src/app/views/cloud_accounts/_form.haml
> @@ -1,37 +1,52 @@
> -%fieldset
> -  %legend Account
> -  = hidden_field :cloud_account,  :id
> -  = hidden_field :cloud_account, :provider_id, :value =>  @provider.id
> -  %ul
> -    %li
> -      %label
> -        Label
> -        %span user-visible name for the account
> -      = text_field :cloud_account, :label
> -    - if @cloud_account.id.nil?
> -      %li
> -        %label
> -          UserName
> -          %span UserName for the provider account you wish to add.
> -        = text_field :cloud_account, :username
> -    %li
> -      %label
> -        Password
> -        %span Password for the provider account you wish to add.
> -      = password_field :cloud_account, :password
> -    %li
> -      %label
> -        Account number
> -        %span EC2 account number.
> -      = text_field :cloud_account, :account_number
> -    %li
> -      %label
> -        Account certificate
> -        %span EC2 x509 private key
> -      = text_area :cloud_account, :x509_cert_priv
> -    %li
> -      %label
> -        Account certificate
> -        %span EC2 x509 private key
> -      = text_area :cloud_account, :x509_cert_pub
> -= submit_tag "Save", :class =>  "submit"
> += error_messages_for 'cloud_account'
> +%fieldset.clearfix.nomargin
> +  %label.grid_4.la.alpha
> +    = t('.account_name')
> +    %span.required *
> +  %label.grid_3.la
> +    = t('.user_name')
> +    %span.required *
> +  %label.grid_3.la
> +    = t('.password')
> +    %span.required *
> +  %label.grid_3.la.omega
> +    = t('.quota_instances')
> +    %span.required *
> +%fieldset.nomargin.clearfix
> +  = f.text_field :label, :title =>  t('.account_name'), :class =>  "grid_4 
> alpha"
> +  = f.text_field :username, :title =>  t('.user_name'), :class =>  "grid_3"
> +  = f.password_field :password, :title =>  t('.password'), :class =>  
> "grid_3"
> +  = text_field "quota", :maximum_running_instances, :title =>  
> t('.quota_instances'), :value =>  @quota.maximum_running_instances || 
> "unlimited", :id =>  "quota_instances", :class =>  "grid_3 omega"
> +%fieldset.nomargin.clearfix
> +  .grid_3.prefix_10.alpha.omega
> +    (
> +    %button.linkbutton.nospace{ :type =>  'button', :onclick =>  
> "set_unlimited_quota(\"quota_instances\");" }<>
> +      = t('.unlimited_quota')
> +    )
> +%fieldset.clearfix.nomargin
> +  %label.grid_4.la.alpha
> +    = t('.account_number')
> +    %span.required *
> +  %label.grid_3.la
> +    = t('.account_private_cert')
> +    %span.required *
> +  %label.grid_3.la
> +    = t('.account_public_cert')
> +    %span.required *
> +  .grid_3.omega
> +%fieldset.clearfix.nomargin
> +  = f.text_field :account_number, :title =>  t('.account_number'), :class => 
>  "grid_4 alpha"
> +  .grid_3
> +    = f.file_field :x509_cert_priv_file, :title =>  
> t('.account_private_cert')
> +  .grid_3
> +    = f.file_field :x509_cert_pub_file, :title =>  t('.account_public_cert')
> +  .grid_3.omega
> +    (
> +    %button.linkbutton.nospace{ :type =>  'submit', :value =>  
> t('.test_account'), :name =>  'test_account', :id =>  'test_account' }<>
> +      = t('.test_account')
> +    )
> +
> +:javascript
> +  function set_unlimited_quota(elem_id) {
> +    $("#" + elem_id)[0].value = "unlimited";
> +  }
> diff --git a/src/app/views/cloud_accounts/edit.haml 
> b/src/app/views/cloud_accounts/edit.haml
> index 9e16553..c97faac 100644
> --- a/src/app/views/cloud_accounts/edit.haml
> +++ b/src/app/views/cloud_accounts/edit.haml
> @@ -1,6 +1,17 @@
> -.dcloud_form
> -  = error_messages_for 'cloud_account'
> -  %h2 Edit Cloud Account
> -  %br/
> -  - form_for @cloud_account, :url =>  { :action =>  'update' } do |form|
> -    = render :partial =>  'form'
> += render :partial =>  'providers/providers'
> +#details.grid_13
> +  %nav.subsubnav
> +    = render_navigation(:level =>  4)
> +
> +  %h2
> +    = t('.edit_provider_account')
> +  - form_for @cloud_account, :url =>  provider_account_path(@provider, 
> @cloud_account), :html =>  { :method =>  :put, :multipart =>  true } do |f|
> +    = render :partial =>  'form', :locals =>  { :f =>  f }
> +    %fieldset.clearfix
> +      .grid_13.alpha.omega
> +        = submit_tag t(:edit), :class =>  "ra nomargin dialogbutton"
> +    %section
> +      %p.requirement
> +        %span.required *
> +        \-
> +        = t('.required_field')
> diff --git a/src/app/views/cloud_accounts/index.haml 
> b/src/app/views/cloud_accounts/index.haml
> new file mode 100644
> index 0000000..ab2d475
> --- /dev/null
> +++ b/src/app/views/cloud_accounts/index.haml
> @@ -0,0 +1,25 @@
> += render :partial =>  'providers/providers'
> +#details.grid_13
> +  %nav.subsubnav
> +    = render_navigation(:level =>  4)
> +  %h2
> +    = t('.provider_accounts')
> +  - unless @provider.cloud_accounts.empty?
> +    %table
> +      %thead
> +        %tr
> +          %th{:scope =>  "col"} Label
> +          %th{:scope =>  "col"} Username
> +          %th{:scope =>  "col"} Account Number
> +          %th{:scope =>  "col", :colspan =>  "2"} Actions
> +      %tbody
> +        - @provider.cloud_accounts.each do |cloud_account|
> +          %tr
> +            %td= cloud_account.label
> +            %td= cloud_account.username
> +            %td= cloud_account.account_number
> +            %td= link_to 'Edit', edit_provider_account_path(@provider, 
> cloud_account)
> +            %td= link_to 'Delete', destroy_providers_account_path(@provider, 
> cloud_account), :confirm =>  'Are you sure?'
> +
> +  - if @provider.cloud_accounts.empty?
> +    = link_to 'Add', new_provider_account_path(@provider.id), :class =>  
> 'button'
> diff --git a/src/app/views/cloud_accounts/new.haml 
> b/src/app/views/cloud_accounts/new.haml
> index 446fd36..96d08df 100644
> --- a/src/app/views/cloud_accounts/new.haml
> +++ b/src/app/views/cloud_accounts/new.haml
> @@ -1,8 +1,17 @@
> -.dcloud_form
> -  = error_messages_for 'account'
> -  %h2 Add a new Account from this Provider
> -  %br/
> -  - form_for @cloud_account, :url =>  { :action =>  "create" } do |f|
> -    = f.error_messages
> -    = render :partial =>  "form", :object =>  f
> -    = link_to "Cancel", root_path, :class =>  'actionlink'
> += render :partial =>  'providers/providers'
> +#details.grid_13
> +  %nav.subsubnav
> +    = render_navigation(:level =>  4)
> +
> +  %h2
> +    = t('.new_provider_account')
> +  - form_for @cloud_account, :url =>  provider_accounts_path(@provider), 
> :html =>  { :multipart =>  true } do |f|
> +    = render :partial =>  'form', :locals =>  { :f =>  f }
> +    %fieldset.clearfix
> +      .grid_13.alpha.omega
> +        = submit_tag t(:add), :class =>  "ra nomargin dialogbutton"
> +    %section
> +      %p.requirement
> +        %span.required *
> +        \-
> +        = t('.required_field')
> diff --git a/src/app/views/layouts/_notification.rhtml 
> b/src/app/views/layouts/_notification.rhtml
> index fdbf642..6c204fd 100644
> --- a/src/app/views/layouts/_notification.rhtml
> +++ b/src/app/views/layouts/_notification.rhtml
> @@ -22,6 +22,9 @@
>         </div>
>       <% end %>
>     <% end %>
> +<% if flash[:error]&&  flash[:error].kind_of?(String) %>
> +<div class="error"><ul><li><%= flash[:error] %></li></ul></div>
> +<% end %>
>     <% if flash[:warning] %>
>       <div class="warning"><ul><li><%= flash[:warning] %></li></ul></div>
>     <% end %>
> diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
> index 6539cbd..1be36b6 100644
> --- a/src/config/locales/en.yml
> +++ b/src/config/locales/en.yml
> @@ -97,16 +97,23 @@ en:
>         test_connection: Test Connection
>         required_field: Required field.
>         caution_image: Caution
> -    accounts:
> +  cloud_accounts:
> +    index:
>         provider_accounts: Provider Accounts
> +    new:
>         new_provider_account: New Account
> +      required_field: Required field.
> +    edit:
> +      edit_provider_account: Edit Cloud Account
> +      required_field: Required field.
> +    form:
> +      provider_accounts: Provider Accounts
>         account_name: Account Name
>         user_name: EC2 Access Key
>         password: Secret Access Key
>         quota_instances: Quota Instances
>         test_account: Test Account
>         unlimited_quota: Unlimited Quota
> -      required_field: Required field.
>         account_number: AWS Account ID
>         account_private_cert: EC2 x509 private key
>         account_public_cert: EC2 x509 public key
> diff --git a/src/config/navigation.rb b/src/config/navigation.rb
> index 3b63df1..95d5e05 100644
> --- a/src/config/navigation.rb
> +++ b/src/config/navigation.rb
> @@ -8,8 +8,8 @@ SimpleNavigation::Configuration.run do |navigation|
>       first_level.item :administration, t(:administration), '#', :class =>  
> 'administration' do |second_level|
>         second_level.item :system_settings, t(:system_settings), :controller 
> =>  'settings' do |third_level|
>           third_level.item :manage_providers, t(:manage_providers), 
> providers_path do |fourth_level|
> -          fourth_level.item :provider_summary, t(:provider_summary), { 
> :controller =>  'providers', :action =>  'show', :id =>  (@provider.id if 
> @provider) }, :highlights_on =>  /\/providers\/[0-9]+/
> -          fourth_level.item :provider_accounts, t(:provider_accounts), { 
> :controller =>  'providers', :action =>  'accounts', :id =>  (@provider.id if 
> @provider) }, :highlights_on =>  /\/providers\/accounts/
> +          fourth_level.item :provider_summary, t(:provider_summary), { 
> :controller =>  'providers', :action =>  'show', :id =>  (@provider.id if 
> @provider) }, :highlights_on =>  /\/providers\/\d+(\/edit)?$/
> +          fourth_level.item :provider_accounts, t(:provider_accounts), { 
> :controller =>  'cloud_accounts', :action =>  'index', :provider_id =>  
> (@provider.id if @provider) }, :highlights_on =>  
> /\/providers\/\d+\/accounts(\/(\d+|new))?/
>             fourth_level.item :scheduling_policies, t(:scheduling_policies), 
> '#'
>             fourth_level.item :services_provided, t(:services_provided), '#'
>             fourth_level.item :map_profiles, t(:map_profiles), '#'
> diff --git a/src/config/routes.rb b/src/config/routes.rb
> index f59a2aa..931c97f 100644
> --- a/src/config/routes.rb
> +++ b/src/config/routes.rb
> @@ -52,7 +52,10 @@ ActionController::Routing::Routes.draw do |map|
>
>     # Temporarily disable this route, provider stuff is not restful yet.
>     # Will be re-enabled in upcoming patch
> -  map.resources :providers
> +  map.resources :providers do |provider|
> +    provider.resources :accounts, :controller =>  'cloud_accounts'
> +  end
> +  map.destroy_providers_account 
> '/providers/:provider_id/accounts/:id/destroy', :controller =>  
> 'cloud_accounts', :action =>  'destroy', :conditions =>  { :method =>  :get }
>
>     # Allow downloading Web Service WSDL as a file with an extension
>     # instead of a file named 'wsdl'
> diff --git a/src/features/provider.feature b/src/features/provider.feature
> index 12047bb..8cf2ccd 100644
> --- a/src/features/provider.feature
> +++ b/src/features/provider.feature
> @@ -65,6 +65,7 @@ Feature: Manage Providers
>       When I go to the providers page
>       And I follow "provider1"
>       And I follow "Provider Accounts"
> +    And I follow "Add" within "#details"
>       And I fill in "cloud_account[label]" with "MockAccount"
>       And I fill in "cloud_account[username]" with "mockuser"
>       And I fill in "cloud_account[password]" with "mockpassword"
> @@ -80,6 +81,7 @@ Feature: Manage Providers
>       When I go to the providers page
>       And I follow "provider1"
>       And I follow "Provider Accounts"
> +    And I follow "Add" within "#details"
>       And I fill in "cloud_account[label]" with "IncorrectAccount"
>       And I fill in "cloud_account[username]" with "incorrect_user"
>       And I fill in "cloud_account[password]" with "incorrect_password"
> @@ -102,4 +104,4 @@ Feature: Manage Providers
>       And there should not be any replicated images
>       And there should not be any hardware profiles
>       And there should not be a cloud account
> -    And there should not be a realm
> \ No newline at end of file
> +    And there should not be a realm
> diff --git a/src/features/step_definitions/web_steps.rb 
> b/src/features/step_definitions/web_steps.rb
> index f270900..e6d6808 100644
> --- a/src/features/step_definitions/web_steps.rb
> +++ b/src/features/step_definitions/web_steps.rb
> @@ -24,6 +24,12 @@ When /^(?:|I )press "([^"]*)"$/ do |button|
>     click_button(button)
>   end
>
> +When /^I press "([^\"]*)" within "([^\"]*)"$/ do |button,scope_selector|
> +  within(scope_selector) do
> +    click_button(button)
> +  end
> +end
> +
>   When /^(?:|I )follow "([^"]*)"$/ do |link|
>     click_link(link)
>   end
> diff --git a/src/spec/controllers/cloud_accounts_controller_spec.rb 
> b/src/spec/controllers/cloud_accounts_controller_spec.rb
> index f3b866a..d61ad34 100644
> --- a/src/spec/controllers/cloud_accounts_controller_spec.rb
> +++ b/src/spec/controllers/cloud_accounts_controller_spec.rb
> @@ -14,6 +14,29 @@ describe CloudAccountsController do
>       activate_authlogic
>     end
>
> +  it "shows provider accounts as list" do
> +    UserSession.create(@admin)
> +    get :index, :provider_id =>  @provider.id
> +    response.should be_success
> +    response.should render_template("index")
> +  end
> +
> +  it "allows test account validity on create when passing test_account 
> param" do
> +    UserSession.create(@admin)
> +    post :create, :provider_id =>  @provider.id, :cloud_account =>  {}, 
> :test_account =>  true
> +    response.should be_success
> +    response.should render_template("new")
> +    response.flash[:error].should == "Test Connection Failed: Invalid 
> Account Details"
> +  end
> +
> +  it "doesn't allow to save provider's account if not valid credentials" do
> +    UserSession.create(@admin)
> +    post :create, :provider_id =>  @provider.id, :cloud_account =>  {}
> +    response.should be_success
> +    response.should render_template("new")
> +    response.flash[:error].should == "The entered credential information is 
> incorrect"
> +  end
> +
>     it "should permit users with account modify permission to access edit 
> cloud account interface" do
>       UserSession.create(@admin)
>       get :edit, :id =>  @cloud_account.id
> @@ -21,25 +44,26 @@ describe CloudAccountsController do
>       response.should render_template("edit")
>     end
>
> -  it "should allow users with account modify permission to update a cloud 
> account" do
> +  it "should allow users with account modify password to update a cloud 
> account" do
>       UserSession.create(@admin)
>
>       @cloud_account.password = "foobar"
> -    @cloud_account.stub!(:valid_credentials).and_return(true)
> -    @cloud_account.save
> +    @cloud_account.stub!(:valid_credentials?).and_return(true)
> +    @cloud_account.quota = Quota.new
> +    @cloud_account.save.should be_true
>
> -    post :update, :cloud_account =>  { :id =>  @cloud_account.id, :password 
> =>  'mockpassword' }
> -    response.should 
> redirect_to("http://test.host/providers/accounts/#[email protected]}";)
> +    post :update, :id =>  @cloud_account.id, :cloud_account =>  { :password 
> =>  'mockpassword' }
> +    response.should redirect_to provider_accounts_path(@provider)
>       CloudAccount.find(@cloud_account.id).password.should == "mockpassword"
>     end
>
>     it "should allow users with account modify permission to delete a cloud 
> account" do
>       UserSession.create(@admin)
>       lambda do
> -      post :destroy, :id =>  @cloud_account.id
> +      get :destroy, :id =>  @cloud_account.id
>       end.should change(CloudAccount, :count).by(-1)
> -    response.should 
> redirect_to("http://test.host/providers/accounts/#[email protected]}";)
> -    CloudAccount.find(:first, :conditions =>  ['id = ?', 
> @cloud_account.id]).should be_nil
> +    response.should redirect_to provider_accounts_path(@provider)
> +    CloudAccount.find_by_id(@cloud_account.id).should be_nil
>     end
>
>     it "should deny access to users without account modify permission" do
> diff --git a/src/spec/controllers/provider_controller_spec.rb 
> b/src/spec/controllers/provider_controller_spec.rb
> index a1a317a..49a45a8 100644
> --- a/src/spec/controllers/provider_controller_spec.rb
> +++ b/src/spec/controllers/provider_controller_spec.rb
> @@ -10,18 +10,6 @@ describe ProvidersController do
>       activate_authlogic
>     end
>
> -  it "should provide ui to view accounts" do
> -     UserSession.create(@admin)
> -     get :accounts, :id =>  @provider.id
> -     response.should be_success
> -     response.should render_template("accounts")
> -  end
> -
> -  it "should fail to grant access to account UIs for unauthenticated user" do
> -     get :accounts
> -     response.should_not be_success
> -  end
> -
>     it "should provide ui to view hardware profiles" do
>        UserSession.create(@admin)
>        provider = @admin_permission.permission_object
> diff --git a/src/spec/models/cloud_account_spec.rb 
> b/src/spec/models/cloud_account_spec.rb
> index 4466977..fb04e40 100644
> --- a/src/spec/models/cloud_account_spec.rb
> +++ b/src/spec/models/cloud_account_spec.rb
> @@ -8,15 +8,13 @@ describe CloudAccount do
>
>     it "should not be destroyable if it has instances" do
>       @cloud_account.instances<<  Instance.new
> -    @cloud_account.destroyable?.should_not be_true
> -    @cloud_account.destroy
> -    CloudAccount.find(@cloud_account.id).should_not be_nil
> -
> +    @cloud_account.destroyable?.should be_false
> +    @cloud_account.destroy.should be_false
>
>       @cloud_account.instances.clear
>       @cloud_account.destroyable?.should be_true
> -    @cloud_account.destroy
> -    CloudAccount.find(:first, :conditions =>  ['id = ?', 
> @cloud_account.id]).should be_nil
> +    @cloud_account.destroy.equal?(@cloud_account).should be_true
> +    @cloud_account.should be_frozen
>     end
>
>     it "should check the validitiy of the cloud account login credentials" do
> @@ -51,6 +49,11 @@ describe CloudAccount do
>       cloud_account.instance_key.id == "1_user"
>     end
>
> +  it "when calling connect and it fails with exception it will return nil" do
> +    DeltaCloud.should_receive(:new).and_raise(Exception.new)
> +
> +    @cloud_account.connect.should be_nil
> +  end
>
>     it "should generate credentials xml" do
>       expected_xml =<<EOT

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

Reply via email to