On 20/02/12 12:17 -0500, Matt Wagner wrote:
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
end endTaskomatic.destroy_instance(@task)
@@ -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!
rescue Exception => ex task.state = Task::STATE_FAILEDend task.state = Task::STATE_FINISHED
@@ -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
Ran through the deletion of running rhev deployments successfully.
ACK