From: Jiri Tomasek <jtomasek(a)redhat.com>
---
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 | 75 ++++++++++---------------
src/config/locales/en.yml | 1 +
src/config/routes.rb | 2 +-
src/features/deployment.feature | 11 ++++
7 files changed, 88 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 ee3039e..16c9c32 100644
--- a/src/app/controllers/deployments_controller.rb
+++ b/src/app/controllers/deployments_controller.rb
@@ -163,9 +163,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!
@@ -177,14 +199,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
@@ -192,7 +216,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)
@@ -213,6 +237,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|
@@ -220,7 +246,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
@@ -239,13 +265,16 @@ class DeploymentsController < ApplicationController
: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 745eb5b..cead1f9 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 d8a049e..093c15e 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({}, :class => 'filterable-data') do
- %ul.obj_actions
- %li= restful_submit_tag "Stop Selected Deployments",
"multi_stop", multi_stop_deployments_path, 'POST', :id =>
'stop_button', :class => 'button'
+- form_header = capture_haml do
+ = restful_submit_tag 'Stop Selected', 'stop',
multi_stop_deployments_path, 'POST', :class => 'button', :id =>
"stop_button"
+ = 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'
+= filter_table(@deployments_header, @deployments, :form_header => form_header) 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
- %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)
+: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 7f83338..8970949 100644
--- a/src/config/routes.rb
+++ b/src/config/routes.rb
@@ -33,7 +33,7 @@ ActionController::Routing::Routes.draw do |map|
# -- just remember to delete public/index.html.
map.resources :pools, :collection => { :multi_destroy => :delete }
- map.resources :deployments, :collection => { :multi_stop => :get, :launch_new
=> :get, :check_name => :get }
+ map.resources :deployments, :collection => { :multi_stop => :get, :multi_destroy
=> :delete, :launch_new => :get, :check_name => :get }
map.resources :instances, :collection => {:start => :get, :multi_stop => :get,
:remove_failed => :get, :can_start => :get, :can_create => :get }, :member =>
{:key => :get}
map.can_start_instance
'/instances/:instance_id/can_start/:provider_account_id', :controller =>
'instances', :action => 'can_start', :conditions => { :method =>
:get }
diff --git a/src/features/deployment.feature b/src/features/deployment.feature
index 8840126..086b42c 100644
--- a/src/features/deployment.feature
+++ b/src/features/deployment.feature
@@ -183,6 +183,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"
--
1.7.4.4