[PATCH conductor] BZ 791195 - Clean up destroy_on_provider code

Matt Wagner matt.wagner at redhat.com
Mon Feb 20 17:17:53 UTC 2012


This cleans up some crazy code that obsessively retries to destroy
instances on the provider after they are removed in Conductor.

Resolves https://bugzilla.redhat.com/show_bug.cgi?id=791195
---
 src/app/models/instance.rb |   23 ++++++++---------------
 src/app/util/taskomatic.rb |   28 ++++++----------------------
 2 files changed, 14 insertions(+), 37 deletions(-)

diff --git a/src/app/models/instance.rb b/src/app/models/instance.rb
index a7a82b5..03da558 100644
--- a/src/app/models/instance.rb
+++ b/src/app/models/instance.rb
@@ -457,21 +457,10 @@ class Instance < ActiveRecord::Base
   ]
 
   def destroy_on_provider
-    if provider_account and !['ec2', 'mock'].include?(provider_account.provider.provider_type.deltacloud_driver) and
-      ![STATE_CREATE_FAILED, STATE_VANISHED].include?(state)
-      retries = 0
-      begin
-        retries += 1
-        @task = self.queue_action(self.owner, 'destroy')
-        unless @task
-          raise I18n.t"instance.errors.cannot_destroy"
-        end
-        Taskomatic.destroy_instance(@task)
-      rescue Exception => e
-        if self.tasks.last.action != 'destroy' and retries < 500
-          retry
-        end
-      end
+    if provider_account and destroy_supported?(provider_account) and ![STATE_CREATE_FAILED, STATE_VANISHED].include?(state)
+      @task = self.queue_action(self.owner, 'destroy')
+      raise I18n.t("instance.errors.cannot_destroy") unless @task
+      Taskomatic.destroy_instance(@task)
     end
   end
 
@@ -485,6 +474,10 @@ class Instance < ActiveRecord::Base
     end
   end
 
+  def destroy_supported?(account)
+    !['ec2', 'mock'].include?(account.provider.provider_type.deltacloud_driver)
+  end
+
   def key_name
     "#{self.name}_#{Time.now.to_i}_key_#{self.object_id}".gsub(/[^a-zA-Z0-9\.\-]/, '_')
   end
diff --git a/src/app/util/taskomatic.rb b/src/app/util/taskomatic.rb
index 8bdbc66..5ddb782 100644
--- a/src/app/util/taskomatic.rb
+++ b/src/app/util/taskomatic.rb
@@ -63,8 +63,11 @@ module Taskomatic
 
       Rails.logger.info("Task instance '#{action}' complete, now in state #{dcloud_instance.state}.")
 
-      task.instance.state = dcloud_to_instance_state(dcloud_instance.state)
-      task.instance.save!
+      # Don't update the instance if we're in the process of destroying it:
+      unless action == :destroy!
+        task.instance.state = dcloud_to_instance_state(dcloud_instance.state)
+        task.instance.save!
+      end
       task.state = Task::STATE_FINISHED
     rescue Exception => ex
       task.state = Task::STATE_FAILED
@@ -87,26 +90,7 @@ module Taskomatic
   end
 
   def self.destroy_instance(task)
-    task.time_started = Time.now
-
-    begin
-      client = task.instance.provider_account.connect
-      dcloud_instance = client.instance(task.instance.external_key)
-
-      task.state = Task::STATE_PENDING
-      task.save!
-
-      dcloud_instance.destroy!
-
-      Rails.logger.info("Task Destroy completed.")
-
-      task.state = Task::STATE_FINISHED
-    rescue Exception => ex
-      task.state = Task::STATE_FAILED
-      task.message = ex.message
-    ensure
-      task.save!
-    end
+    do_action(task, :destroy!)
   end
 
   def self.dcloud_to_instance_state(state_str)
-- 
1.7.6.5




More information about the aeolus-devel mailing list