Skip to content

Commit 073859a

Browse files
authored
Merge pull request #826 from agrare/fix_snapshot_ems_ref_obj_no_method_error
Fix snapshot ems ref obj no method error
2 parents 30a3bd0 + 8938cae commit 073859a

File tree

4 files changed

+78
-38
lines changed

4 files changed

+78
-38
lines changed

app/models/manageiq/providers/vmware/infra_manager/ems_ref_obj_mixin.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module ManageIQ::Providers::Vmware::InfraManager::EmsRefObjMixin
22
extend ActiveSupport::Concern
33

4+
autoload :VimString, 'VMwareWebService/VimTypes'
5+
46
def ems_ref_obj
57
@ems_ref_obj ||= VimString.new(ems_ref, ems_ref_type, :ManagedObjectReference) if ems_ref.present? && ems_ref_type.present?
68
end

app/models/manageiq/providers/vmware/infra_manager/provision/cloning.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,18 @@ def start_clone(clone_options)
117117

118118
[:config, :customization, :linked_clone].each { |key| vim_clone_options[key] = clone_options[key] }
119119

120-
[:folder, :host, :pool, :snapshot].each do |key|
120+
[:folder, :host, :pool].each do |key|
121121
ci = clone_options[key]
122122
next if ci.nil?
123+
123124
vim_clone_options[key] = ci.ems_ref_obj
124125
end
125126

127+
if clone_options[:snapshot]
128+
ci = clone_options[:snapshot]
129+
vim_clone_options[:snapshot] = VimString.new(ci.ems_ref, ci.ems_ref_type, :ManagedObjectReference) if ci.ems_ref.present? && ci.ems_ref_type.present?
130+
end
131+
126132
vim_clone_options[:datastore] = datastore_ems_ref(clone_options)
127133
vim_clone_options[:disk] = build_disk_relocate_spec(vim_clone_options[:datastore])
128134
vim_clone_options[:storage_profile] = build_storage_profile(clone_options[:storage_profile]) unless clone_options[:storage_profile].nil?

spec/factories/resource_pool.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
FactoryBot.define do
2+
factory :resource_pool_vmware, :class => "ManageIQ::Providers::Vmware::InfraManager::ResourcePool", :parent => :resource_pool do
3+
sequence(:ems_ref) { |n| "resgroups-#{n}" }
4+
ems_ref_type { "ResourcePool" }
5+
end
6+
end
Lines changed: 63 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,77 @@
11
describe ManageIQ::Providers::Vmware::InfraManager::Provision::Cloning do
2+
let(:zone) { EvmSpecHelper.local_miq_server.zone }
3+
let(:ems) { FactoryBot.create(:ems_vmware_with_authentication, :zone => zone) }
4+
let(:user_admin) { FactoryBot.create(:user_admin) }
5+
let(:template) { FactoryBot.create(:template_vmware, :name => "template1", :ext_management_system => ems, :cpu_limit => -1, :cpu_reserve => 0) }
6+
let(:provision) { FactoryBot.create(:miq_provision_vmware, :userid => user_admin.userid, :miq_request => provision_request, :source => template, :request_type => 'template', :state => 'pending', :status => 'Ok', :options => options) }
7+
let(:provision_request) { FactoryBot.create(:miq_provision_request, :requester => user_admin, :src_vm_id => template.id) }
8+
let(:options) do
9+
{
10+
:pass => 1,
11+
:vm_name => "clone test",
12+
:number_of_vms => 1,
13+
:cpu_limit => -1,
14+
:cpu_reserve => 0,
15+
:src_vm_id => [template.id, template.name],
16+
}
17+
end
18+
219
context "#dest_folder" do
3-
before do
4-
@os = FactoryBot.create(:operating_system)
5-
@admin = FactoryBot.create(:user_admin)
6-
@target_vm_name = 'clone test'
7-
@options = {
8-
:pass => 1,
9-
:vm_name => @target_vm_name,
10-
:number_of_vms => 1,
11-
:cpu_limit => -1,
12-
:cpu_reserve => 0
13-
}
14-
@ems = FactoryBot.create(:ems_vmware_with_authentication, :api_version => '6.0')
15-
@vm_template = FactoryBot.create(:template_vmware, :name => "template1", :ext_management_system => @ems, :operating_system => @os, :cpu_limit => -1, :cpu_reserve => 0)
16-
@pr = FactoryBot.create(:miq_provision_request, :requester => @admin, :src_vm_id => @vm_template.id)
17-
@options[:src_vm_id] = [@vm_template.id, @vm_template.name]
18-
@vm_prov = FactoryBot.create(:miq_provision_vmware, :userid => @admin.userid, :miq_request => @pr, :source => @vm_template, :request_type => 'template', :state => 'pending', :status => 'Ok', :options => @options)
19-
end
20+
let(:folder_name) { 'folder_one' }
21+
let(:ems_folder) { FactoryBot.create(:vmware_folder_vm) }
22+
let(:dest_host) { FactoryBot.create(:host_vmware, :ext_management_system => ems) }
23+
let(:dc_nested) { EvmSpecHelper::EmsMetadataHelper.vmware_nested_folders(ems) }
24+
let(:dest_host_nested) { FactoryBot.create(:host_vmware, :ext_management_system => ems).tap { |h| h.parent = dc_nested } }
25+
let(:vm_folder_nested) { FactoryBot.create(:ems_folder, :name => 'vm', :ems_id => ems.id).tap { |v| v.parent = dc_nested } }
2026

21-
let(:folder_name) { 'folder_one' }
22-
let(:ems_folder) { double('ems_folder') }
23-
let(:dest_host) do
24-
FactoryBot.create(:host_vmware, :ext_management_system => ems)
27+
it "returns a folder if one is found" do
28+
options[:placement_folder_name] = [ems_folder.id, ems_folder.name]
29+
expect(provision).to receive(:find_folder).never
30+
provision.dest_folder
2531
end
2632

27-
let(:dc_nested) do
28-
EvmSpecHelper::EmsMetadataHelper.vmware_nested_folders(@ems)
33+
it "attempts to find a usable folder if the ems_folder does not exist" do
34+
provision.options[:dest_host] = [dest_host_nested.id, dest_host_nested.name]
35+
expect(provision).to receive(:find_folder).once
36+
provision.dest_folder
2937
end
38+
end
3039

31-
let(:dest_host_nested) do
32-
FactoryBot.create(:host_vmware, :ext_management_system => @ems).tap { |h| h.parent = dc_nested }
33-
end
40+
context "#start_clone" do
41+
let(:folder) { FactoryBot.create(:vmware_folder_vm, :ext_management_system => ems) }
42+
let(:host) { FactoryBot.create(:host_vmware_esx, :ext_management_system => ems, :ems_ref => "host-1") }
43+
let(:pool) { FactoryBot.create(:resource_pool_vmware, :ext_management_system => ems) }
44+
let(:snapshot) { FactoryBot.create(:snapshot, :ems_ref => "snapshot-1", :ems_ref_type => "Snapshot") }
45+
let(:datastore) { FactoryBot.create(:storage_vmware, :ext_management_system => ems) }
3446

35-
let(:vm_folder_nested) do
36-
FactoryBot.create(:ems_folder, :name => 'vm', :ems_id => @ems.id).tap { |v| v.parent = dc_nested }
47+
let(:clone_options) do
48+
{
49+
:name => "clone test",
50+
:folder => folder,
51+
:host => host,
52+
:pool => pool,
53+
:snapshot => snapshot,
54+
:datastore => datastore
55+
}
3756
end
3857

39-
it "returns a folder if one is found" do
40-
expect(EmsFolder).to receive(:find_by).and_return(:ems_folder)
41-
expect(@vm_prov).to receive(:find_folder).never
42-
@vm_prov.dest_folder
43-
end
58+
# Building the disk relocate spec has to connect to the ems so we need to
59+
# stub that out here.
60+
before { allow(provision).to receive(:build_disk_relocate_spec) }
4461

45-
it "attempts to find a usable folder if the ems_folder does not exist" do
46-
@vm_prov.options[:dest_host] = [dest_host_nested.id, dest_host_nested.name]
47-
expect(@vm_prov).to receive(:find_folder).once
48-
@vm_prov.dest_folder
62+
it "converts AR objects to VimTypes" do
63+
expect(provision)
64+
.to receive(:clone_vm)
65+
.with(
66+
hash_including(
67+
:folder => folder.ems_ref_obj,
68+
:host => host.ems_ref_obj,
69+
:pool => pool.ems_ref_obj,
70+
:snapshot => VimString.new(snapshot.ems_ref, snapshot.ems_ref_type, :ManagedObjectReference)
71+
)
72+
)
73+
74+
provision.start_clone(clone_options)
4975
end
5076
end
5177
end

0 commit comments

Comments
 (0)