On Tue, 2012-10-23 at 18:31 +0200, Tomáš Hrčka wrote:
---
src/app/controllers/deployments_controller.rb | 28 ++++++++++++++----------
src/app/jobs/deployment_destroy.rb | 15 +++++++++++++
src/app/models/deployment.rb | 5 ----
src/config/locales/en.yml | 1 +
4 files changed, 32 insertions(+), 17 deletions(-)
create mode 100644 src/app/jobs/deployment_destroy.rb
diff --git a/src/app/controllers/deployments_controller.rb
b/src/app/controllers/deployments_controller.rb
index 3327bb5..3abfd86 100644
--- a/src/app/controllers/deployments_controller.rb
+++ b/src/app/controllers/deployments_controller.rb
@@ -278,13 +278,16 @@ class DeploymentsController < ApplicationController
errors = []
begin
require_privilege(Privilege::MODIFY, deployment)
- deployment.stop_instances_and_destroy!
- rescue Aeolus::Conductor::Base::NotStoppableDeployment
- cant_stop = true
- errors = deployment.not_stoppable_or_destroyable_instances.map {|i|
- t('deployments.errors.instance_state',
- :name => i.name,
- :state => i.state)}
+ if deployment.not_stoppable_or_destroyable_instances.empty?
+ Delayed::Job.enqueue DeploymentDestroy.new(deployment)
+ else
+ cant_stop = true
+ errors = deployment.not_stoppable_or_destroyable_instances.map {|i|
+ t('deployments.errors.instance_state',
+ :name => i.name,
+ :state => i.state)}
+
+ end
rescue
errors = t('deployments.flash.error.not_deleted',
:name => deployment.name,
@@ -322,15 +325,16 @@ class DeploymentsController < ApplicationController
ids = Array(params[:deployments_selected])
Deployment.find(ids).each do |deployment|
- begin
- require_privilege(Privilege::MODIFY, deployment)
- deployment.stop_instances_and_destroy!
+ require_privilege(Privilege::MODIFY, deployment)
+ if deployment.not_stoppable_or_destroyable_instances.empty?
+ Delayed::Job.enqueue DeploymentDestroy.new(deployment)
destroyed << deployment.name
- rescue
+ else
errors << t('deployments.flash.error.not_deleted',
:name => deployment.name,
- :error => $!.message)
+ :error => t("deployments.errors.all_stopped"))
end
+
end
respond_to do |format|
format.html do
diff --git a/src/app/jobs/deployment_destroy.rb b/src/app/jobs/deployment_destroy.rb
new file mode 100644
index 0000000..931844e
--- /dev/null
+++ b/src/app/jobs/deployment_destroy.rb
@@ -0,0 +1,15 @@
+class DeploymentDestroy < Struct.new(:deployment)
+
+ def perform
+ deployment.stop_instances_and_destroy!
+ end
+
+
+ def error(job,exception)
+ deployment.events << Event.create(
+ :source => deployment,
+ :event_time => DateTime.now,
+ :status_code => 'destroy_failed',
+ :summary =>
I18n.t("deployments.events.destroy_failed", :deployment => deployment.name,
:exception => exception.message))
+ end
+end
\ No newline at end of file
diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
index a6426ab..19241c6 100644
--- a/src/app/models/deployment.rb
+++ b/src/app/models/deployment.rb
@@ -176,11 +176,6 @@ class Deployment < ActiveRecord::Base
end
def stop_instances_and_destroy!
- unless not_stoppable_or_destroyable_instances.empty?
- raise Aeolus::Conductor::Base::NotStoppableDeployment,
- I18n.t("deployments.errors.all_stopped")
- end
-
if destroyable?
destroy
else
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index 79698b1..2201c4d 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -421,6 +421,7 @@ en:
events:
launch_attempt: "Attempting to launch this deployment on provider account
%{account}"
state_changed: "State changed to %{state}"
+ destroy_failed: "Destroy of %{deployment} failed with exception:
%{exception}"
preset_filters:
all_deployments: All Deployments
other_than_stopped: "Non-stopped Deployments"
ACK, it works fine.