Thank you Tom! Fantastic catch. The code needs more love than I suspected. ;) 
Great QA.

-- Ladislav

On Nov 26, 2010, at 5:39 PM, Tomas Sedovic wrote:

> I'm really sorry, I noticed that the previously set Quota value isn't 
> displayed in the edit Provider Account page. I should have noticed it sooner 
> when I reviewed the previous version of this patch.
> 
> Here's how to repro it:
> 1. on the Provider Accounts page fill in the data
> 2. set Quota to 10
> 3. Click Add
> 4. Click Edit
> 
> Expected:
> The Quota field will contain the value 10.
> 
> Actual:
> The Quota field contains the string "unlimited".
> 
> 
> 
> 
> ----- [email protected] wrote:
> 
>> From: Ladislav Martincik <[email protected]>
>> 
>> ---
>> src/app/controllers/cloud_accounts_controller.rb   |   88
>> +++++++++++---------
>> src/app/controllers/providers_controller.rb        |    9 --
>> src/app/models/cloud_account.rb                    |   58
>> +++++++++----
>> 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  |   37 +++++++--
>> src/spec/controllers/provider_controller_spec.rb   |   12 ---
>> src/spec/models/cloud_account_spec.rb              |   15 ++--
>> 16 files changed, 265 insertions(+), 149 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..6a2a072 100644
>> --- a/src/app/controllers/cloud_accounts_controller.rb
>> +++ b/src/app/controllers/cloud_accounts_controller.rb
>> @@ -21,6 +21,14 @@
>> 
>> 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])
>> @@ -29,43 +37,38 @@ class CloudAccountsController <
>> ApplicationController
>>   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
>> 
>>     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
>> +
>> +    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
>> +
>> +    quota = Quota.new
>> +    quota.maximum_running_instances =
>> quota_from_string(params[:quota][:maximum_running_instances])
>> +    quota.save!
>> +    @cloud_account.quota = quota
>> +    @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
>> @@ -119,11 +122,12 @@ 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)
>>     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,27 +142,27 @@ 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)
>> @@ -168,4 +172,8 @@ class CloudAccountsController <
>> ApplicationController
>>       return Integer(quota_raw)
>>     end
>>   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..e3ef0db 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
>>   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/views/cloud_accounts/_form.haml
>> b/src/app/views/cloud_accounts/_form.haml
>> index 32c12a4..192ce05 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 =>  "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..072126e 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
>> @@ -25,21 +48,21 @@ describe CloudAccountsController 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.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
>> -- 
>> 1.7.3.1
>> 
>> _______________________________________________
>> deltacloud-devel mailing list
>> [email protected]
>> https://fedorahosted.org/mailman/listinfo/deltacloud-devel

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

Reply via email to