From: Ladislav Martincik <lmart...@redhat.com>

---
 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/#...@provider.id}";)
+    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/#...@provider.id}";)
-    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
deltacloud-devel@lists.fedorahosted.org
https://fedorahosted.org/mailman/listinfo/deltacloud-devel

Reply via email to