diff --git a/app/models/mixins/async_delete_mixin.rb b/app/models/mixins/async_delete_mixin.rb index 5932aa0d33fa..aaf66315100a 100644 --- a/app/models/mixins/async_delete_mixin.rb +++ b/app/models/mixins/async_delete_mixin.rb @@ -1,13 +1,14 @@ module AsyncDeleteMixin extend ActiveSupport::Concern included do - def self._queue_task(task, ids) + def self._queue_task(task, ids, deliver_on = nil) ids.each do |id| MiqQueue.put( :class_name => name, :instance_id => id, :msg_timeout => 3600, - :method_name => task.to_s + :method_name => task.to_s, + :deliver_on => deliver_on, ) end end diff --git a/app/models/provider.rb b/app/models/provider.rb index 0715e4470181..6a449bd7278d 100644 --- a/app/models/provider.rb +++ b/app/models/provider.rb @@ -63,4 +63,22 @@ def refresh_ems(opts = {}) end managers.flat_map { |manager| EmsRefresh.queue_refresh(manager, nil, opts) } end + + def self.destroy_queue(ids) + find(Array.wrap(ids)).each(&:destroy_queue) + end + + def destroy_queue + if managers.empty? + return destroy + end + + if managers.where(:enabled => true).any? + _log.info("Queuing destroy of managers of provider: #{self.class.name} with id: #{id}") + managers.flat_map(&:destroy_queue) + end + + _log.info("Queuing destroy of provider: #{self.class.name} with id: #{id}") + self.class._queue_task(:destroy_queue, id.to_miq_a, 15.seconds.from_now) + end end diff --git a/spec/models/provider_spec.rb b/spec/models/provider_spec.rb index c73c708d4416..28d467c95796 100644 --- a/spec/models/provider_spec.rb +++ b/spec/models/provider_spec.rb @@ -1,5 +1,5 @@ describe Provider do - let(:provider) { described_class.new } + let(:provider) { FactoryGirl.create(:provider) } describe "#verify_ssl" do context "when non set" do @@ -61,4 +61,32 @@ expect(tenant.providers).to include(provider) end end + + context "#destroy_queue" do + before do + allow(Time).to receive(:now).and_return(Time.zone.now) + end + it "destroy when has no managers" do + expect(provider).to receive(:destroy) + provider.destroy_queue + end + + it "to destroy_queue its managers first" do + manager = FactoryGirl.create(:ext_management_system, :enabled => true) + provider.managers = [manager] + expect(manager).to receive(:destroy_queue) + expect(provider).not_to receive(:destroy) + expect(described_class).to receive(:_queue_task).with(:destroy_queue, provider.id.to_miq_a, 15.seconds.from_now) + provider.destroy_queue + end + + it "doesn't destroy_queue its managers when they are disabled" do + manager = FactoryGirl.create(:ext_management_system, :enabled => false) + provider.managers = [manager] + expect(manager).not_to receive(:destroy_queue) + expect(provider).not_to receive(:destroy) + expect(described_class).to receive(:_queue_task).with(:destroy_queue, provider.id.to_miq_a, 15.seconds.from_now) + provider.destroy_queue + end + end end