[PATCH conductor] RM#3877 Implement deployment destroy and multidestroy actions in background

Tomáš Hrčka thrcka at redhat.com
Tue Oct 23 16:31:51 UTC 2012


---
 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"
-- 
1.7.1




More information about the aeolus-devel mailing list