From 3569ecf1e38569a85a509957ef6ba736a16ad2a5 Mon Sep 17 00:00:00 2001 From: Lucy Fu Date: Thu, 17 Nov 2016 15:36:09 -0500 Subject: [PATCH] Move snapshot code to Vm in service model. The snapshot code in automate was moved from VmOrTemplate to VMware specific class by PR https://github.com/ManageIQ/manageiq/pull/3707 when VMware was the only class that supports snapshot. But snapshot support has been added to RHEVM and Openstack as of version Euwe. The snapshot code in automate should be available at Vm level. https://bugzilla.redhat.com/show_bug.cgi?id=1395175 --- ...ageiq-providers-vmware-infra_manager-vm.rb | 21 ------------ .../service_models/miq_ae_service_vm.rb | 24 ++++++++++++++ ...-providers-vmware-infra_manager-vm_spec.rb | 26 ++------------- .../service_methods/miq_ae_service_vm_spec.rb | 32 +++++++++++++++++++ 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb b/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb index a4c3a332134..d1144b2c978 100644 --- a/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb +++ b/lib/miq_automation_engine/service_models/miq_ae_service_manageiq-providers-vmware-infra_manager-vm.rb @@ -11,26 +11,5 @@ def set_memory(size_mb, options = {}) def add_disk(disk_name, disk_size_mb, options = {}) sync_or_async_ems_operation(options[:sync], "add_disk", [disk_name, disk_size_mb]) end - - def create_snapshot(name, desc = nil, memory = false) - snapshot_operation(:create_snapshot, :name => name, :description => desc, :memory => !!memory) - end - - def remove_all_snapshots - snapshot_operation(:remove_all_snapshots) - end - - def remove_snapshot(snapshot_id) - snapshot_operation(:remove_snapshot, :snap_selected => snapshot_id) - end - - def revert_to_snapshot(snapshot_id) - snapshot_operation(:revert_to_snapshot, :snap_selected => snapshot_id) - end - - def snapshot_operation(task, options = {}) - options.merge!(:ids => [id], :task => task.to_s) - Vm.process_tasks(options) - end end end diff --git a/lib/miq_automation_engine/service_models/miq_ae_service_vm.rb b/lib/miq_automation_engine/service_models/miq_ae_service_vm.rb index cfb190876f9..cf64da0fc6b 100644 --- a/lib/miq_automation_engine/service_models/miq_ae_service_vm.rb +++ b/lib/miq_automation_engine/service_models/miq_ae_service_vm.rb @@ -8,5 +8,29 @@ def add_to_service(service) def remove_from_service ar_method { wrap_results(@object.direct_service.try(:remove_resource, @object)) } end + + def create_snapshot(name, desc = nil, memory = false) + snapshot_operation(:create_snapshot, :name => name, :description => desc, :memory => !!memory) + end + + def remove_all_snapshots + snapshot_operation(:remove_all_snapshots) + end + + def remove_snapshot(snapshot_id) + snapshot_operation(:remove_snapshot, :snap_selected => snapshot_id) + end + + def revert_to_snapshot(snapshot_id) + snapshot_operation(:revert_to_snapshot, :snap_selected => snapshot_id) + end + + def snapshot_operation(task, options = {}) + raise "#{task} operation not supported for #{self.class.name}" unless object_send(:supports_snapshots?) + + options[:ids] = [id] + options[:task] = task.to_s + Vm.process_tasks(options) + end end end diff --git a/spec/lib/miq_automation_engine/service_methods/miq_ae_service_manageiq-providers-vmware-infra_manager-vm_spec.rb b/spec/lib/miq_automation_engine/service_methods/miq_ae_service_manageiq-providers-vmware-infra_manager-vm_spec.rb index 92f2c591a55..6f6079be311 100644 --- a/spec/lib/miq_automation_engine/service_methods/miq_ae_service_manageiq-providers-vmware-infra_manager-vm_spec.rb +++ b/spec/lib/miq_automation_engine/service_methods/miq_ae_service_manageiq-providers-vmware-infra_manager-vm_spec.rb @@ -1,5 +1,5 @@ -module MiqAeServiceVmVmwareSpec - describe MiqAeMethodService::MiqAeServiceUser do +module MiqAeServiceManageIQ_Providers_Vmware_InfraManager_VmSpec + describe MiqAeMethodService::MiqAeServiceManageIQ_Providers_Vmware_InfraManager_Vm do let(:vm) { FactoryGirl.create(:vm_vmware) } let(:service_vm) { MiqAeMethodService::MiqAeServiceManageIQ_Providers_Vmware_InfraManager_Vm.find(vm.id) } @@ -60,27 +60,5 @@ module MiqAeServiceVmVmwareSpec :args => []) ) end - - it "#create_snapshot without memory" do - service_vm.create_snapshot('snap', 'crackle & pop') - - expect(MiqQueue.first.args.first).to have_attributes( - :task => 'create_snapshot', - :memory => false, - :name => 'snap', - :description => 'crackle & pop' - ) - end - - it "#create_snapshot with memory" do - service_vm.create_snapshot('snap', 'crackle & pop', true) - - expect(MiqQueue.first.args.first).to have_attributes( - :task => 'create_snapshot', - :memory => true, - :name => 'snap', - :description => 'crackle & pop' - ) - end end end diff --git a/spec/lib/miq_automation_engine/service_methods/miq_ae_service_vm_spec.rb b/spec/lib/miq_automation_engine/service_methods/miq_ae_service_vm_spec.rb index 309f46fcba4..d52b45ad170 100644 --- a/spec/lib/miq_automation_engine/service_methods/miq_ae_service_vm_spec.rb +++ b/spec/lib/miq_automation_engine/service_methods/miq_ae_service_vm_spec.rb @@ -10,6 +10,7 @@ module MiqAeServiceVmSpec @ae_result_key = 'foo' @vm = FactoryGirl.create(:vm_vmware, :name => "template1", :location => "abc/abc.vmx") + allow(MiqServer).to receive(:my_zone).and_return('default') end def invoke_ae @@ -215,5 +216,36 @@ def invoke_ae expect(service_vm.retirement_warn).to eq(60) expect(vm.retirement_last_warn).to be_nil end + + context "#create_snapshot" do + it "without memory" do + service_vm.create_snapshot('snap', 'crackle & pop') + + expect(MiqQueue.first.args.first).to have_attributes( + :task => 'create_snapshot', + :memory => false, + :name => 'snap', + :description => 'crackle & pop' + ) + end + + it "with memory" do + service_vm.create_snapshot('snap', 'crackle & pop', true) + + expect(MiqQueue.first.args.first).to have_attributes( + :task => 'create_snapshot', + :memory => true, + :name => 'snap', + :description => 'crackle & pop' + ) + end + + it "when not supported" do + vm_amazon = FactoryGirl.create(:vm_amazon, :name => "template1") + svc_vm = MiqAeMethodService::MiqAeServiceManageIQ_Providers_Amazon_CloudManager_Vm.find(vm_amazon.id) + + expect { svc_vm.create_snapshot('snap', 'crackle & pop') }.to raise_error(RuntimeError) + end + end end end