On 12/22/2010 07:15 PM, tsedovic(a)redhat.com wrote:
From: Tomas Sedovic<tsedovic(a)redhat.com>
---
.../admin/provider_accounts_controller.rb | 126 ++++++++++++++++++++
src/app/controllers/cloud_accounts_controller.rb | 4 +-
.../admin/provider_accounts/_credentials.haml | 3 +
src/app/views/admin/provider_accounts/_form.haml | 52 ++++++++
.../views/admin/provider_accounts/_history.haml | 3 +
src/app/views/admin/provider_accounts/_list.haml | 18 +++
.../admin/provider_accounts/_permissions.haml | 3 +
.../views/admin/provider_accounts/_properties.haml | 5 +
src/app/views/admin/provider_accounts/edit.haml | 13 ++
src/app/views/admin/provider_accounts/index.haml | 3 +-
src/app/views/admin/provider_accounts/new.haml | 16 +++
src/app/views/admin/provider_accounts/show.haml | 5 +
src/config/routes.rb | 3 +-
13 files changed, 250 insertions(+), 4 deletions(-)
create mode 100644 src/app/views/admin/provider_accounts/_credentials.haml
create mode 100644 src/app/views/admin/provider_accounts/_form.haml
create mode 100644 src/app/views/admin/provider_accounts/_history.haml
create mode 100644 src/app/views/admin/provider_accounts/_list.haml
create mode 100644 src/app/views/admin/provider_accounts/_permissions.haml
create mode 100644 src/app/views/admin/provider_accounts/_properties.haml
create mode 100644 src/app/views/admin/provider_accounts/edit.haml
create mode 100644 src/app/views/admin/provider_accounts/new.haml
create mode 100644 src/app/views/admin/provider_accounts/show.haml
diff --git a/src/app/controllers/admin/provider_accounts_controller.rb
b/src/app/controllers/admin/provider_accounts_controller.rb
index dda74ae..25ed002 100644
--- a/src/app/controllers/admin/provider_accounts_controller.rb
+++ b/src/app/controllers/admin/provider_accounts_controller.rb
@@ -1,6 +1,132 @@
class Admin::ProviderAccountsController< ApplicationController
before_filter :require_user
+ before_filter :load_accounts, :only => [:index, :show]
def index
end
+
+ def show
+ @tab_captions = ['Properties', 'Credentials', 'History',
'Permissions']
+ @account = CloudAccount.find(params[:id])
+ @details_tab = params[:details_tab].blank? ? 'properties' :
params[:details_tab]
+
+ if params.delete :test_account
+ test_account(@account)
+ render :action => 'show' and return
+ end
+
+ respond_to do |format|
+ format.js do
+ if @url_params.delete :details_pane
+ render :partial => 'layouts/details_pane' and return
+ end
+ render :partial => @details_tab and return
+ end
+ format.html { render :action => 'show'}
+ end
+ end
+
+ def new
+ @cloud_account = CloudAccount.new
+ @quota = Quota.new
+ @providers = Provider.all
+ end
+
+ def create
+ @provider = Provider.find(params[:provider_id])
+ require_privilege(Privilege::ACCOUNT_MODIFY, @provider)
+
+ @providers = Provider.all
+ @cloud_account = CloudAccount.new(params[:cloud_account])
+ @cloud_account.provider = @provider
+ @cloud_account.quota = @quota = Quota.new
+
+ if params.delete :test_account
+ test_account(@cloud_account)
+ 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.now[:error] = "The entered credential information is incorrect"
+ elsif @cloud_account.errors.on(:username)
+ flash.now[:error] = "The access key
'#{params[:cloud_account][:username]}' has already been taken."
+ else
+ flash.now[:error] = "You must fill in all the required fields"
+ end
+ 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 admin_provider_account_path(@cloud_account)
+ 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
+
+ def update
+ @cloud_account = CloudAccount.find(params[:id])
+ @provider = @cloud_account.provider
+ require_privilege(Privilege::ACCOUNT_MODIFY, @provider)
+ @quota = @cloud_account.quota
+
+ if params.delete :test_account
+ test_account(@cloud_account)
+ render :action => 'new' and return
this line ^^ should be render
:action => 'edit', now you will get an error
+ end
+
+ 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 admin_provider_account_path(@cloud_account)
+ else
+ render :action => :edit
+ end
+ end
+
+ def multi_destroy
+ if (not params[:accounts_selected]) or (params[:accounts_selected].length == 0)
+ flash[:notice] = "You must select some accounts first."
+ else
+ CloudAccount.destroy(params[:accounts_selected])
+ end
+ redirect_to admin_provider_accounts_url
+ end
+
+ protected
+
+ def test_account(account)
+ if account.valid_credentials?
+ flash.now[:notice] = "Test Connection Success: Valid Account Details"
+ else
+ flash.now[:error] = "Test Connection Failed: Invalid Account Details"
+ end
+ rescue
+ flash.now[:error] = "Test Connection Failed: Could not connect to
provider"
+ end
+
+ def load_accounts
+ @header = [
+ { :name => "Name", :sort_attr => :name },
+ { :name => "Username", :sort_attr => :username},
+ ]
+ @accounts = CloudAccount.paginate(:all,
+ :page => params[:page] || 1,
+ :order => (params[:order_field] || 'label') +' '+
(params[:order_dir] || 'asc')
+ )
+ @url_params = params
+ end
end
diff --git a/src/app/controllers/cloud_accounts_controller.rb
b/src/app/controllers/cloud_accounts_controller.rb
index ae0a224..d21d532 100644
--- a/src/app/controllers/cloud_accounts_controller.rb
+++ b/src/app/controllers/cloud_accounts_controller.rb
@@ -48,9 +48,9 @@ class CloudAccountsController< ApplicationController
@cloud_account.provider = @provider
@cloud_account.quota = @quota = Quota.new
- if params[:test_account]
+ if params.delete :test_account
test_account(@cloud_account)
- render :action => 'new' and return
+ redirect_to admin_provider_account_path(@cloud_account) and return
end
limit = params[:quota][:maximum_running_instances] if params[:quota]
diff --git a/src/app/views/admin/provider_accounts/_credentials.haml
b/src/app/views/admin/provider_accounts/_credentials.haml
new file mode 100644
index 0000000..9d31c8d
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_credentials.haml
@@ -0,0 +1,3 @@
+%h3
+ Credentials for
+ = @account.name
diff --git a/src/app/views/admin/provider_accounts/_form.haml
b/src/app/views/admin/provider_accounts/_form.haml
new file mode 100644
index 0000000..853d348
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_form.haml
@@ -0,0 +1,52 @@
+= error_messages_for 'cloud_account'
+%fieldset.clearfix.nomargin
+ %label.grid_4.la.alpha
+ = t('cloud_accounts.form.account_name')
+ %span.required *
+ %label.grid_3.la
+ = t('cloud_accounts.form.user_name')
+ %span.required *
+ %label.grid_3.la
+ = t('cloud_accounts.form.password')
+ %span.required *
+ %label.grid_3.la.omega
+ = t('cloud_accounts.form.quota_instances')
+ %span.required *
+%fieldset.nomargin.clearfix
+ = f.text_field :label, :title => t('cloud_accounts.form.account_name'),
:class => "grid_4 alpha"
+ = f.text_field :username, :title => t('cloud_accounts.form.user_name'),
:class => "grid_3"
+ = f.password_field :password, :title => t('cloud_accounts.form.password'),
:class => "grid_3"
+ = text_field "quota", :maximum_running_instances, :title =>
t('cloud_accounts.form.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('cloud_accounts.form.unlimited_quota')
+ )
+%fieldset.clearfix.nomargin
+ %label.grid_4.la.alpha
+ = t('cloud_accounts.form.account_number')
+ %span.required *
+ %label.grid_3.la
+ = t('cloud_accounts.form.account_private_cert')
+ %span.required *
+ %label.grid_3.la
+ = t('cloud_accounts.form.account_public_cert')
+ %span.required *
+ .grid_3.omega
+%fieldset.clearfix.nomargin
+ = f.text_field :account_number, :title =>
t('cloud_accounts.form.account_number'), :class => "grid_4 alpha"
+ .grid_3
+ = f.file_field :x509_cert_priv_file, :title =>
t('cloud_accounts.form.account_private_cert')
+ .grid_3
+ = f.file_field :x509_cert_pub_file, :title =>
t('cloud_accounts.form.account_public_cert')
+ .grid_3.omega
+ (
+ %button.linkbutton.nospace{ :type => 'submit', :value =>
t('cloud_accounts.form.test_account'), :name => 'test_account', :id
=> 'test_account' }<>
+ = t('cloud_accounts.form.test_account')
+ )
+
+:javascript
+ function set_unlimited_quota(elem_id) {
+ $("#" + elem_id)[0].value = "unlimited";
+ }
diff --git a/src/app/views/admin/provider_accounts/_history.haml
b/src/app/views/admin/provider_accounts/_history.haml
new file mode 100644
index 0000000..429320a
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_history.haml
@@ -0,0 +1,3 @@
+%h3
+ History for
+ = @account.name
diff --git a/src/app/views/admin/provider_accounts/_list.haml
b/src/app/views/admin/provider_accounts/_list.haml
new file mode 100644
index 0000000..17c982f
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_list.haml
@@ -0,0 +1,18 @@
+- form_tag do
+ = link_to "New Account", new_admin_provider_account_path, :class =>
'button'
+ = restful_submit_tag "Delete", "delete",
multi_destroy_admin_provider_accounts_path, 'DELETE'
+ %p
+ Select:
+ = link_to "All", @url_params.merge(:select => 'all')
+ %span> ,
+ = link_to "None", @url_params.merge(:select => 'none')
+ %table
+ = sortable_table_header @header
+ - @accounts.each do |account|
+ %tr
+ %td
+ - selected = @url_params[:select] == 'all'
+ %input{:name => 'accounts_selected[]', :type =>
'checkbox', :value => account.id, :id =>
"account_checkbox_#{account.id}", :checked => selected }
+ = link_to account.name, admin_provider_account_path(account)
+ %td
+ =account.username
diff --git a/src/app/views/admin/provider_accounts/_permissions.haml
b/src/app/views/admin/provider_accounts/_permissions.haml
new file mode 100644
index 0000000..92ad7a5
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_permissions.haml
@@ -0,0 +1,3 @@
+%h3
+ Permissions for
+ = @account.name
diff --git a/src/app/views/admin/provider_accounts/_properties.haml
b/src/app/views/admin/provider_accounts/_properties.haml
new file mode 100644
index 0000000..6371968
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/_properties.haml
@@ -0,0 +1,5 @@
+%h3
+ Properties for
+ = @account.name
+= link_to "Edit", edit_admin_provider_account_path(@account), { :class =>
'button' }
+= link_to "Test", admin_provider_account_path(@account, {:test_account =>
true}), { :class => 'button' }
diff --git a/src/app/views/admin/provider_accounts/edit.haml
b/src/app/views/admin/provider_accounts/edit.haml
new file mode 100644
index 0000000..9a55d84
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/edit.haml
@@ -0,0 +1,13 @@
+#details.grid_13
+ %h2
+ = t('cloud_accounts.edit.edit_provider_account')
+ - form_for @cloud_account, :url => admin_provider_account_path, :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('cloud_accounts.edit.required_field')
diff --git a/src/app/views/admin/provider_accounts/index.haml
b/src/app/views/admin/provider_accounts/index.haml
index 72c0ee2..62ccbc6 100644
--- a/src/app/views/admin/provider_accounts/index.haml
+++ b/src/app/views/admin/provider_accounts/index.haml
@@ -1 +1,2 @@
-admin/provider_accounts/index.haml
+- content_for :list do
+ = render :partial => 'list'
diff --git a/src/app/views/admin/provider_accounts/new.haml
b/src/app/views/admin/provider_accounts/new.haml
new file mode 100644
index 0000000..e567bce
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/new.haml
@@ -0,0 +1,16 @@
+#details.grid_13
+ %h2
+ = t('cloud_accounts.new.new_provider_account')
+ - form_for @cloud_account, :url => admin_provider_accounts_path, :html => {
:multipart => true } do |f|
+ %label{ :for => :provider_id }
+ Provider
+ = select_tag :provider_id, options_for_select((a)providers.map{ |p| [p.name, p.id] })
+ = 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('cloud_accounts.new.required_field')
diff --git a/src/app/views/admin/provider_accounts/show.haml
b/src/app/views/admin/provider_accounts/show.haml
new file mode 100644
index 0000000..05eeedd
--- /dev/null
+++ b/src/app/views/admin/provider_accounts/show.haml
@@ -0,0 +1,5 @@
+- content_for :list do
+ = render :partial => 'list'
+
+- content_for :details do
+ = render :partial => 'layouts/details_pane'
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 99af504..3344058 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -44,8 +44,9 @@ ActionController::Routing::Routes.draw do |map|
map.connect '/set_layout', :controller => 'application', :action
=> 'set_layout'
map.namespace 'admin' do |r|
- r.resources :hardware_profiles, :pool_families, :providers, :provider_accounts,
:realms, :roles, :settings
+ r.resources :hardware_profiles, :pool_families, :providers, :realms, :roles,
:settings
r.resources :users, :collection => { :multi_destroy => :delete }
+ r.resources :provider_accounts, :collection => { :multi_destroy => :delete
}
end
map.resources :pools
It's working fine, but i've found little bug (in
controller, action
update, comment is inline). After remove this, you can feel free to push
it.
ACK.
--
Jozef Zigmund
Associate Software Engineer, Deltacloud