On 08/17/2011 11:09 AM, Jiri Tomasek wrote:
---
src/app/controllers/deployments_controller.rb | 53 +++++++++++++----
src/app/controllers/pools_controller.rb | 7 ++-
src/app/views/deployments/_filter_view.haml | 19 ------
src/app/views/deployments/_list.haml | 77 ++++++++++---------------
src/config/locales/en.yml | 1 +
src/config/routes.rb | 1 +
src/features/deployment.feature | 11 ++++
7 files changed, 89 insertions(+), 80 deletions(-)
delete mode 100644 src/app/views/deployments/_filter_view.haml
diff --git a/src/app/controllers/deployments_controller.rb
b/src/app/controllers/deployments_controller.rb
index 12a492b..d7b4254 100644
--- a/src/app/controllers/deployments_controller.rb
+++ b/src/app/controllers/deployments_controller.rb
@@ -165,9 +165,31 @@ class DeploymentsController< ApplicationController
end
def destroy
+ deployment = Deployment.find(params[:id])
+ if check_privilege(Privilege::MODIFY, deployment)
+ begin
+ deployment.stop_instances_and_destroy!
+ flash[:success] = t('deployments.deleted', :list => deployment.name,
:count => 1)
+ rescue
+ flash[:error] = t('deployments.not_deleted', :list =>
deployment.name, :count => 1)
+ end
+ else
+ flash[:error] = t('deployments.not_deleted', :list => deployment.name,
:count => 1)
+ end
+ respond_to do |format|
+ format.js do
+ load_deployments
+ render :partial => 'list'
+ end
+ format.html { redirect_to pools_url(:view => 'filter', :details_tab
=> 'deployments') }
+ format.json { render :json => {:success => destroyed, :errors =>
failed} }
+ end
+ end
+
+ def multi_destroy
destroyed = []
failed = []
- Deployment.find(ids_list).each do |deployment|
+ Deployment.find(params[:deployments_selected] || []).each do |deployment|
if check_privilege(Privilege::MODIFY, deployment)
begin
deployment.stop_instances_and_destroy!
@@ -179,14 +201,16 @@ class DeploymentsController< ApplicationController
failed<< deployment.name
end
end
- flash[:success] = t('deployments.deleted', :list => destroyed, :count
=> destroyed.size) if destroyed.present?
+ # If nothing is selected, display an error message:
+ flash[:error] = t('deployments.none_selected') if failed.blank?&&
destroyed.blank?
+ flash[:success] = t('deployments.deleted', :list =>
destroyed.join(', '), :count => destroyed.size) if destroyed.present?
flash[:error] = t('deployments.not_deleted', :list => failed, :count
=> failed.size) if failed.present?
respond_to do |format|
format.js do
load_deployments
render :partial => 'list'
end
- format.html { redirect_to pools_url }
+ format.html { redirect_to params[:backlink] || pools_url(:view =>
'filter', :details_tab => 'deployments') }
format.json { render :json => {:success => destroyed, :errors =>
failed} }
end
end
@@ -194,7 +218,7 @@ class DeploymentsController< ApplicationController
def multi_stop
notices = ""
errors = ""
- Deployment.find(params[:deployments_selected]).each do |deployment|
+ Deployment.find(params[:deployments_selected] || []).each do |deployment|
deployment.instances.each do |instance|
begin
require_privilege(Privilege::USE,instance)
@@ -215,6 +239,8 @@ class DeploymentsController< ApplicationController
end
end
end
+ # If nothing is selected, display an error message:
+ errors = t('deployments.none_selected') if errors.blank?&&
notices.blank?
flash[:notice] = notices unless notices.blank?
flash[:error] = errors unless errors.blank?
respond_to do |format|
@@ -222,7 +248,7 @@ class DeploymentsController< ApplicationController
load_deployments
render :partial => 'list'
end
- format.html { redirect_to pools_path(:details_tab => 'deployments',
:filter_view => filter_view?) }
+ format.html { redirect_to params[:backlink] || pools_path(:view =>
'filter', :details_tab => 'deployments') }
format.json { render :json => {:success => notices, :errors =>
errors} }
end
end
@@ -240,13 +266,16 @@ class DeploymentsController< ApplicationController
@deployments = Deployment.paginate(:page => params[:page] || 1,
:order => (params[:order_field] || 'name') +' '+
(params[:order_dir] || 'asc')
)
- @header = [
- { :name => "", :sort_attr => :name },
- { :name => "Deployment name", :sort_attr => :name },
- { :name => "Deployable", :sortable => false },
- { :name => "Owner", :sort_attr => "owner.login"},
- { :name => "Running Since", :sort_attr => :running_since },
- { :name => "Pool", :sort_attr => "pool.name" }
+ @deployments_header = [
+ { :name => '', :sortable => false },
+ { :name => '', :sortable => false },
+ { :name => t("deployments.deployment_name"), :sortable => false
},
+ { :name => t("pools.index.deployed_on"), :sortable => false },
+ { :name => t("deployables.index.base_deployable"), :sortable =>
false },
+ { :name => t("instances.instances"), :sortable => false },
+ { :name => t("pools.index.pool"), :sortable => false },
+ { :name => t("pools.index.owner"), :sortable => false },
+ { :name => t("providers.provider"), :sortable => false }
]
@pools = Pool.list_for_user(current_user, Privilege::CREATE, :target_type =>
Deployment)
@deployments = Deployment.all(:include => :owner,
diff --git a/src/app/controllers/pools_controller.rb
b/src/app/controllers/pools_controller.rb
index 09a7a84..48f7ec6 100644
--- a/src/app/controllers/pools_controller.rb
+++ b/src/app/controllers/pools_controller.rb
@@ -62,9 +62,9 @@ class PoolsController< ApplicationController
save_breadcrumb(pool_path(@pool, :viewstate => viewstate_id), @pool.name)
require_privilege(Privilege::VIEW, @pool)
@statistics = @pool.statistics
- @view = filter_view? ? 'deployments/filter_view' :
'deployments/pretty_view' unless params[:details_tab]
+ @view = filter_view? ? 'deployments/list' :
'deployments/pretty_view' unless params[:details_tab]
if params[:details_tab] == 'deployments'
- @view = filter_view? ? 'deployments/filter_view' :
'deployments/pretty_view'
+ @view = filter_view? ? 'deployments/list' :
'deployments/pretty_view'
elsif params[:details_tab] == 'history'
@view = filter_view? ? 'history_filter' : 'history_pretty'
end
@@ -234,8 +234,11 @@ class PoolsController< ApplicationController
{ :name => '', :sortable => false },
{ :name => '', :sortable => false },
{ :name => t("deployments.deployment_name"), :sortable => false
},
+ { :name => t("pools.index.deployed_on"), :sortable => false },
{ :name => t("deployables.index.base_deployable"), :sortable =>
false },
{ :name => t("instances.instances"), :sortable => false },
+ { :name => t("pools.index.pool"), :sortable => false },
+ { :name => t("pools.index.owner"), :sortable => false },
{ :name => t("providers.provider"), :sortable => false }
]
end
diff --git a/src/app/views/deployments/_filter_view.haml
b/src/app/views/deployments/_filter_view.haml
deleted file mode 100644
index fc231c9..0000000
--- a/src/app/views/deployments/_filter_view.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-= filter_table(@deployments_header, @deployments) do |deployment|
- %tr
- %td
- %input{:name => "deployment_selected[]", :type =>
"checkbox", :value => deployment.id, :id =>
"deployment_checkbox_#{deployment.id}" }
- %td
- -#there will be icons (belongs to mockups)
- %td
- = link_to(deployment.name, deployment)
- %td
- = deployment.deployable_xml.name
- %td
- = deployment.instances.count
- %td
- = link_to(deployment.provider.provider_type.name, deployment.provider) if
deployment.provider
-
-:javascript
- Conductor.setupPrettyFilterURL(
- '#{url_for(:action => :show, :details_tab =>
'deployments', :view => 'filter' )}',
- '#{url_for(:action => :show, :details_tab =>
'deployments', :view => 'pretty' )}');
\ No newline at end of file
diff --git a/src/app/views/deployments/_list.haml b/src/app/views/deployments/_list.haml
index 375f0ac..0b4dba6 100644
--- a/src/app/views/deployments/_list.haml
+++ b/src/app/views/deployments/_list.haml
@@ -1,51 +1,34 @@
- if request.xhr?
= render :partial => '/layouts/notification'
-= form_tag(multi_stop_deployments_path, :method => :post, :class =>
'filterable-data') do
- %ul.obj_actions
- %li= submit_tag "Stop Selected Deployments", :id =>
'stop_button', :class => 'button'
+- content_for :form_header do
+ %li= restful_submit_tag 'Stop Selected', 'stop',
multi_stop_deployments_path, 'POST', :class => 'button', :id =>
"stop_button"
+ %li= restful_submit_tag 'Delete Selected', 'destroy',
multi_destroy_deployments_path, 'DELETE', :class => 'button danger',
:id => "delete_button"
+ = hidden_field_tag 'backlink', request.url
- %div.controls
- %ul.filter-controls
- %li= render :partial => 'layouts/select_all_none'
-
- %li
- %label{:for => "deployments_running"} Viewing
- = select_tag("deployments_running", "<option>Deployments
running</option>",:disabled => true)
- %li.object-count
- %strong= @deployments.count.to_s
- results
-
- %table#deployments_table.checkbox_table
- %thead
- %tr
- %th.ignore
- %th
- = t("pools.index.deployment_name")
- %th
- = t("pools.index.deployed_on")
- %th
- = t("instances.instances")
- %th
- = t("pools.index.pool")
- %th
- = t("pools.index.pool_family")
- %th
- = t("pools.index.owner")
- - @deployments.each do |deployment|
- %tr
- %td
- - selected = params[:select] == 'all'
- = check_box_tag "deployments_selected[]", deployment.id, selected,
:id => "deployment_checkbox_#{deployment.id}"
- %td
- = link_to deployment.name, deployment_path(deployment)
- %td
- = deployment.created_at
- %td
- = deployment.instances.count
- %td
- = link_to deployment.pool.name, pool_path(deployment.pool)
- %td
- = deployment.pool.pool_family.name
- %td
- = owner_name(deployment)
+= filter_table(@deployments_header, @deployments) do |deployment|
+ %tr{ :class => cycle('nostripe', 'stripe') }
+ %td
+ - selected = params[:select] == 'all'
+ = check_box_tag "deployments_selected[]", deployment.id, selected, :id
=> "deployment_checkbox_#{deployment.id}"
+ %td
+ -#there will be icons (belongs to mockups)
+ %td
+ = link_to(deployment.name, deployment)
+ %td
+ = deployment.created_at
+ %td
+ = deployment.deployable_xml.name
+ %td
+ = deployment.instances.count
+ %td
+ = link_to deployment.pool.name, pool_path(deployment.pool)
+ %td
+ = owner_name(deployment)
+ %td
+ = link_to(deployment.provider.provider_type.name, deployment.provider) if
deployment.provider
+:javascript
+ Conductor.setupPrettyFilterURL(
+ '#{url_for(:action => :show, :details_tab => 'deployments',
:view => 'filter' )}',
+ '#{url_for(:action => :show, :details_tab => 'deployments',
:view => 'pretty' )}'
+ );
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index 8e9b61e..26e6887 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -95,6 +95,7 @@ en:
not_deleted:
one: "The deployment %{list} could not be deleted."
other: "The deployments %{list} could not be deleted."
+ none_selected: "You must select one or more deployments."
instances:
instances: Instances
updated:
diff --git a/src/config/routes.rb b/src/config/routes.rb
index 1d6857e..78a082d 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -83,6 +83,7 @@ Conductor::Application.routes.draw do
resources :deployments do
collection do
get 'multi_stop'
+ delete :multi_destroy
get 'launch_new'
get 'check_name'
end
diff --git a/src/features/deployment.feature b/src/features/deployment.feature
index abfdd31..1f12394 100644
--- a/src/features/deployment.feature
+++ b/src/features/deployment.feature
@@ -184,6 +184,17 @@ Feature: Manage Deployments
And I press "delete_button"
Then I should see "The deployment testdeployment was scheduled for
deletion"
+ Scenario: Delete multiple deployments
+ Given a deployment "mydeployment1" exists
+ And a deployment "mydeployment2" exists
+ And I am on the pools page
+ When I follow link with ID "filter_view"
+ And I follow "Deployments"
+ And I check "mydeployment1" deployment
+ And I check "mydeployment2" deployment
+ And I press "delete_button"
+ Then I should see "The deployments mydeployment1, mydeployment2 were scheduled
for deletion"
+
Scenario: Delete a deployment with running instances
Given a deployment "mockdeployment" exists
And the deployment "mockdeployment" has an instance named
"myinstance"
Looking good, but there are two tests that fail for me. Could you please
fix them before pushing?
Failing Scenarios:
cucumber features/deployment.feature:180 # Scenario: Delete a deployment
cucumber features/deployment.feature:198 # Scenario: Delete a deployment
with running instances