chef-provisioning-vsphere 0.5.6 → 0.5.7.dev

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc055e1b2d6b786a8f6283601e4b639d8c366721
4
- data.tar.gz: 055c8b542e35ac504d6e32a17fe220efcfdc2d1e
3
+ metadata.gz: c95b01dfc2b3264c2e059c2c2251994e346ecdb9
4
+ data.tar.gz: 39fcb92ec638a6002688e89a75b4040648ebd009
5
5
  SHA512:
6
- metadata.gz: 3de7ecf45f3b2cb52a0d56e1f0e9807f328d7268908b7519023e678fb061990aec6dbc159034e92d3a46509e3fa66ccbba23fb4eeb9b9c90e23bf2849b45de7c
7
- data.tar.gz: 3df8118f086fa318d4f3bd8dbb0c1af69ffd28ce021cf61bff428f4c168e3a48f88c5c24b5374edf3c9e09709eb9bb2f96ef170d1b95b62812384a8843613846
6
+ metadata.gz: 295ea892e8aa73e61eb09cfd8e18663e01a2a6cd21cdf3bed5780c5de9a6a760730b61a18d7d286edf1bad39139461df9047f448f7c7492322a5ceb61f7a8eb0
7
+ data.tar.gz: 2a73a1f8c4308bcf701c915d849617eabc1011bed490fca7006da9e0ae4daca77b70d317b254304478612f02c8da53e61d3856e63354459daf4e7ed12d574f58
@@ -0,0 +1,190 @@
1
+ module ChefProvisioningVsphere
2
+ class CloneSpecBuilder
3
+ def initialize(vsphere_helper, action_handler)
4
+ @vsphere_helper = vsphere_helper
5
+ @action_handler = action_handler
6
+ end
7
+
8
+ attr_reader :vsphere_helper
9
+ attr_reader :action_handler
10
+
11
+ def build(vm_template, vm_name, options)
12
+ clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(
13
+ location: relocate_spec_for(vm_template, options),
14
+ powerOn: false,
15
+ template: false,
16
+ config: RbVmomi::VIM.VirtualMachineConfigSpec(
17
+ :cpuHotAddEnabled => true,
18
+ :memoryHotAddEnabled => true,
19
+ :cpuHotRemoveEnabled => true,
20
+ :deviceChange => Array.new)
21
+ )
22
+
23
+ unless options[:annotation].to_s.nil?
24
+ clone_spec.config.annotation = options[:annotation]
25
+ end
26
+
27
+ unless options[:num_cpus].to_s.nil?
28
+ clone_spec.config.numCPUs = options[:num_cpus]
29
+ end
30
+
31
+ unless options[:memory_mb].to_s.nil?
32
+ clone_spec.config.memoryMB = options[:memory_mb]
33
+ end
34
+
35
+ unless options[:network_name].nil?
36
+ deviceAdditions, changes = vsphere_helper.network_device_changes(
37
+ action_handler,
38
+ vm_template,
39
+ options
40
+ )
41
+ clone_spec.config.deviceChange = changes
42
+ end
43
+
44
+ clone_spec.customization = customization_options_from(
45
+ vm_template,
46
+ vm_name,
47
+ options
48
+ )
49
+
50
+ clone_spec
51
+ end
52
+
53
+ def relocate_spec_for(vm_template, options)
54
+ if options.has_key?(:host)
55
+ host = vsphere_helper.find_host(options[:host])
56
+ rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(host: host)
57
+ else
58
+ pool = vm_template.resourcePool
59
+ vpool = vsphere_helper.find_pool(options[:resource_pool])
60
+ rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(pool: vpool || pool)
61
+ raise "either :host or :resource_pool must be specified \
62
+ when cloning from a VM Template" if pool.nil?
63
+ end
64
+
65
+ if options[:use_linked_clone]
66
+ vsphere_helper.create_delta_disk(vm_template)
67
+ rspec.diskMoveType = :moveChildMostDiskBacking
68
+ end
69
+
70
+ unless options[:datastore].to_s.empty?
71
+ rspec.datastore = vsphere_helper.find_datastore(options[:datastore])
72
+ end
73
+
74
+ rspec
75
+ end
76
+
77
+ def customization_options_from(vm_template, vm_name, options)
78
+ if options.has_key?(:customization_spec)
79
+ if(options[:customization_spec].is_a?(Hash))
80
+ cust_options = options[:customization_spec]
81
+ ip_settings = cust_options[:ipsettings]
82
+ cust_domain = cust_options[:domain]
83
+
84
+ raise ArgumentError, 'domain is required' unless cust_domain
85
+ cust_ip_settings = nil
86
+ if ip_settings && ip_settings.key?(:ip)
87
+ unless cust_options[:ipsettings].key?(:subnetMask)
88
+ raise ArgumentError, 'subnetMask is required for static ip'
89
+ end
90
+ cust_ip_settings = RbVmomi::VIM::CustomizationIPSettings.new(
91
+ ip_settings)
92
+ action_handler.report_progress "customizing #{vm_name} \
93
+ with static IP #{ip_settings[:ip]}"
94
+ cust_ip_settings.ip = RbVmomi::VIM::CustomizationFixedIp(
95
+ :ipAddress => ip_settings[:ip])
96
+ end
97
+ if cust_ip_settings.nil?
98
+ cust_ip_settings= RbVmomi::VIM::CustomizationIPSettings.new(
99
+ :ip => RbVmomi::VIM::CustomizationDhcpIpGenerator.new())
100
+ cust_ip_settings.dnsServerList = ip_settings[:dnsServerList]
101
+ action_handler.report_progress "customizing #{vm_name} with /
102
+ dynamic IP and DNS: #{ip_settings[:dnsServerList]}"
103
+ end
104
+
105
+ cust_ip_settings.dnsDomain = cust_domain
106
+ global_ip_settings = RbVmomi::VIM::CustomizationGlobalIPSettings.new
107
+ global_ip_settings.dnsServerList = cust_ip_settings.dnsServerList
108
+ global_ip_settings.dnsSuffixList = [cust_domain]
109
+ cust_hostname = hostname_from(cust_options, vm_name)
110
+ cust_hwclockutc = cust_options[:hw_clock_utc]
111
+ cust_timezone = cust_options[:time_zone]
112
+
113
+ if vm_template.config.guestId.start_with?('win')
114
+ cust_prep = windows_prep_for(options, vm_name)
115
+ else
116
+ cust_prep = RbVmomi::VIM::CustomizationLinuxPrep.new(
117
+ :domain => cust_domain,
118
+ :hostName => cust_hostname,
119
+ :hwClockUTC => cust_hwclockutc,
120
+ :timeZone => cust_timezone
121
+ )
122
+ end
123
+ cust_adapter_mapping = [
124
+ RbVmomi::VIM::CustomizationAdapterMapping.new(
125
+ :adapter => cust_ip_settings)
126
+ ]
127
+ RbVmomi::VIM::CustomizationSpec.new(
128
+ :identity => cust_prep,
129
+ :globalIPSettings => global_ip_settings,
130
+ :nicSettingMap => cust_adapter_mapping
131
+ )
132
+ else
133
+ vsphere_helper.find_customization_spec(cust_options)
134
+ end
135
+ end
136
+ end
137
+
138
+ def hostname_from(options, vm_name)
139
+ if options.key?(:hostname)
140
+ RbVmomi::VIM::CustomizationFixedName.new(:name => options[:hostname])
141
+ else
142
+ RbVmomi::VIM::CustomizationFixedName.new(:name => vm_name)
143
+ end
144
+ end
145
+
146
+ def windows_prep_for(options, vm_name)
147
+ cust_options = options[:customization_spec]
148
+ cust_runonce = RbVmomi::VIM::CustomizationGuiRunOnce.new(
149
+ :commandList => [
150
+ 'winrm set winrm/config/client/auth @{Basic="true"}',
151
+ 'winrm set winrm/config/service/auth @{Basic="true"}',
152
+ 'winrm set winrm/config/service @{AllowUnencrypted="true"}',
153
+ 'shutdown -l'])
154
+
155
+ cust_login_password = RbVmomi::VIM::CustomizationPassword(
156
+ :plainText => true,
157
+ :value => options[:ssh][:password])
158
+ if cust_options.has_key?(:domain) and cust_options[:domain] != 'local'
159
+ cust_domain_password = RbVmomi::VIM::CustomizationPassword(
160
+ :plainText => true,
161
+ :value => ENV['domainAdminPassword'] || cust_options[:domainAdminPassword])
162
+ cust_id = RbVmomi::VIM::CustomizationIdentification.new(
163
+ :joinDomain => cust_options[:domain],
164
+ :domainAdmin => cust_options[:domainAdmin],
165
+ :domainAdminPassword => cust_domain_password)
166
+ #puts "my env passwd is: #{ENV['domainAdminPassword']}"
167
+ action_handler.report_progress "joining domain #{cust_options[:domain]} /
168
+ with user: #{cust_options[:domainAdmin]}"
169
+ else
170
+ cust_id = RbVmomi::VIM::CustomizationIdentification.new(
171
+ :joinWorkgroup => 'WORKGROUP')
172
+ end
173
+ cust_gui_unattended = RbVmomi::VIM::CustomizationGuiUnattended.new(
174
+ :autoLogon => true,
175
+ :autoLogonCount => 1,
176
+ :password => cust_login_password,
177
+ :timeZone => cust_options[:win_time_zone])
178
+ cust_userdata = RbVmomi::VIM::CustomizationUserData.new(
179
+ :computerName => hostname_from(cust_options, vm_name),
180
+ :fullName => cust_options[:org_name],
181
+ :orgName => cust_options[:org_name],
182
+ :productId => cust_options[:product_id])
183
+ RbVmomi::VIM::CustomizationSysprep.new(
184
+ :guiRunOnce => cust_runonce,
185
+ :identification => cust_id,
186
+ :guiUnattended => cust_gui_unattended,
187
+ :userData => cust_userdata)
188
+ end
189
+ end
190
+ end
@@ -3,6 +3,7 @@ require 'cheffish/merged_config'
3
3
  require 'chef/provisioning/driver'
4
4
  require 'chef/provisioning/machine/windows_machine'
5
5
  require 'chef/provisioning/machine/unix_machine'
6
+ require 'chef/provisioning/vsphere_driver/clone_spec_builder'
6
7
  require 'chef/provisioning/vsphere_driver/version'
7
8
  require 'chef/provisioning/vsphere_driver/vsphere_helpers'
8
9
  require 'chef/provisioning/vsphere_driver/vsphere_url'
@@ -11,7 +12,6 @@ module ChefProvisioningVsphere
11
12
  # Provisions machines in vSphere.
12
13
  class VsphereDriver < Chef::Provisioning::Driver
13
14
  include Chef::Mixin::ShellOut
14
- include ChefProvisioningVsphere::Helpers
15
15
 
16
16
  def self.from_url(driver_url, config)
17
17
  VsphereDriver.new(driver_url, config)
@@ -163,7 +163,7 @@ module ChefProvisioningVsphere
163
163
  end
164
164
 
165
165
  def find_or_create_vm(bootstrap_options, machine_spec, action_handler)
166
- vm = find_vm(
166
+ vm = vsphere_helper.find_vm(
167
167
  bootstrap_options[:vm_folder],
168
168
  machine_spec.name
169
169
  )
@@ -231,7 +231,7 @@ module ChefProvisioningVsphere
231
231
  end
232
232
  return if networks.nil? || networks.count < 2
233
233
 
234
- new_nics = add_extra_nic(
234
+ new_nics = vsphere_helper.add_extra_nic(
235
235
  action_handler,
236
236
  vm_template_for(bootstrap_options),
237
237
  bootstrap_options,
@@ -313,7 +313,7 @@ module ChefProvisioningVsphere
313
313
  msg << vm.guest.toolsRunningStatus
314
314
  msg << '. powering up server...'
315
315
  action_handler.report_progress(msg.join)
316
- start_vm(vm)
316
+ vsphere_helper.start_vm(vm)
317
317
  else
318
318
  restart_server(action_handler, machine_spec, machine_options)
319
319
  end
@@ -395,7 +395,7 @@ module ChefProvisioningVsphere
395
395
  vm = vm_for(machine_spec)
396
396
  if vm
397
397
  action_handler.perform_action "Shutdown guest OS and power off VM [#{vm.parent.name}/#{vm.name}]" do
398
- stop_vm(vm)
398
+ vsphere_helper.stop_vm(vm)
399
399
  end
400
400
  end
401
401
  end
@@ -405,14 +405,14 @@ module ChefProvisioningVsphere
405
405
  vm = vm_for(machine_spec)
406
406
  if vm
407
407
  action_handler.perform_action "Power on VM [#{vm.parent.name}/#{vm.name}]" do
408
- start_vm(vm, machine_options[:bootstrap_options][:ssh][:port])
408
+ vsphere_helper.start_vm(vm, machine_options[:bootstrap_options][:ssh][:port])
409
409
  end
410
410
  end
411
411
  vm
412
412
  end
413
413
 
414
414
  def restart_server(action_handler, machine_spec, machine_options)
415
- action_handler.perform_action "restart machine #{machine_spec.name} (#{vm.config.instanceUuid} on #{driver_url})" do
415
+ action_handler.perform_action "restart machine #{machine_spec.name} (#{driver_url})" do
416
416
  stop_machine(action_handler, machine_spec, machine_options)
417
417
  start_machine(action_handler, machine_spec, machine_options)
418
418
  machine_spec.location['started_at'] = Time.now.utc.to_s
@@ -484,25 +484,52 @@ module ChefProvisioningVsphere
484
484
 
485
485
  def vm_for(machine_spec)
486
486
  if machine_spec.location
487
- find_vm_by_id(machine_spec.location['server_id'])
487
+ vsphere_helper.find_vm_by_id(machine_spec.location['server_id'])
488
488
  else
489
489
  nil
490
490
  end
491
491
  end
492
492
 
493
493
  def clone_vm(action_handler, bootstrap_options, machine_name)
494
- do_vm_clone(
495
- action_handler,
496
- vm_template_for(bootstrap_options),
497
- machine_name,
498
- bootstrap_options
494
+ vm_template = vm_template_for(bootstrap_options)
495
+
496
+ spec_builder = CloneSpecBuilder.new(vsphere_helper, action_handler)
497
+ clone_spec = spec_builder.build(vm_template, machine_name, bootstrap_options)
498
+
499
+ vm_folder = vsphere_helper.find_folder(bootstrap_options[:vm_folder])
500
+ vm_template.CloneVM_Task(
501
+ name: machine_name,
502
+ folder: vm_folder,
503
+ spec: clone_spec
504
+ ).wait_for_completion
505
+
506
+ vm = vsphere_helper.find_vm(vm_folder, machine_name)
507
+
508
+ if bootstrap_options[:additional_disk_size_gb].to_i > 0
509
+ task = vm.ReconfigVM_Task(
510
+ spec: RbVmomi::VIM.VirtualMachineConfigSpec(
511
+ deviceChange: [
512
+ vsphere_helper.virtual_disk_for(vm, bootstrap_options)
513
+ ]
514
+ )
515
+ )
516
+ task.wait_for_completion
517
+ end
518
+
519
+ vm
520
+ end
521
+
522
+ def vsphere_helper
523
+ @vsphere_helper ||= VsphereHelper.new(
524
+ connect_options,
525
+ config[:machine_options][:bootstrap_options][:datacenter]
499
526
  )
500
527
  end
501
528
 
502
529
  def vm_template_for(bootstrap_options)
503
530
  template_folder = bootstrap_options[:template_folder]
504
531
  template_name = bootstrap_options[:template_name]
505
- find_vm(template_folder, template_name) ||
532
+ vsphere_helper.find_vm(template_folder, template_name) ||
506
533
  raise("vSphere VM Template not found [#{template_folder}/#{template_name}]")
507
534
  end
508
535
 
@@ -1,3 +1,3 @@
1
1
  module ChefProvisioningVsphere
2
- VERSION = '0.5.6'
2
+ VERSION = '0.5.7.dev'
3
3
  end
@@ -1,16 +1,24 @@
1
1
  require 'rbvmomi'
2
2
 
3
3
  module ChefProvisioningVsphere
4
- module Helpers
4
+ class VsphereHelper
5
5
 
6
6
  if !$guest_op_managers
7
7
  $guest_op_managers = {}
8
8
  end
9
9
 
10
- def vim(options = connect_options)
10
+ def initialize(connect_options, datacenter_name)
11
+ @connect_options = connect_options
12
+ @datacenter_name = datacenter_name
13
+ end
14
+
15
+ attr_reader :connect_options
16
+ attr_reader :datacenter_name
17
+
18
+ def vim
11
19
  if @current_connection.nil? or @current_connection.serviceContent.sessionManager.currentSession.nil?
12
- puts "establishing connection to #{options[:host]}"
13
- @current_connection = RbVmomi::VIM.connect options
20
+ puts "establishing connection to #{connect_options[:host]}"
21
+ @current_connection = RbVmomi::VIM.connect connect_options
14
22
  str_conn = @current_connection.pretty_inspect # a string in the format of VIM(host ip)
15
23
 
16
24
  # we are caching guest operation managers in a global variable...terrible i know
@@ -31,8 +39,8 @@ module ChefProvisioningVsphere
31
39
  folder.find(vm_name, RbVmomi::VIM::VirtualMachine)
32
40
  end
33
41
 
34
- def find_vm_by_id(uuid, connection = vim)
35
- vm = connection.searchIndex.FindByUuid(
42
+ def find_vm_by_id(uuid)
43
+ vm = vim.searchIndex.FindByUuid(
36
44
  uuid: uuid,
37
45
  vmSearch: true,
38
46
  instanceUuid: true
@@ -108,9 +116,8 @@ module ChefProvisioningVsphere
108
116
  end
109
117
 
110
118
  def datacenter
111
- dc_name = config[:machine_options][:bootstrap_options][:datacenter]
112
- @datacenter ||= vim.serviceInstance.find_datacenter(dc_name) ||
113
- raise("vSphere Datacenter not found [#{dc_name}]")
119
+ @datacenter ||= vim.serviceInstance.find_datacenter(datacenter_name) ||
120
+ raise("vSphere Datacenter not found [#{datacenter_name}]")
114
121
  end
115
122
 
116
123
  def network_adapter_for(operation, network_name, network_label, device_key, backing_info)
@@ -206,28 +213,6 @@ module ChefProvisioningVsphere
206
213
  end
207
214
  end
208
215
 
209
- def relocate_spec_for(vm_template, options)
210
- if options.has_key?(:host)
211
- host = find_host(options[:host])
212
- rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(host: host)
213
- else
214
- pool = options[:resource_pool] ? find_pool(options[:resource_pool]) : vm_template.resourcePool
215
- rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(pool: pool)
216
- raise 'either :host or :resource_pool must be specified when cloning from a VM Template' if pool.nil?
217
- end
218
-
219
- if options.has_key?(:use_linked_clone)
220
- create_delta_disk(vm_template)
221
- rspec.diskMoveType = :moveChildMostDiskBacking
222
- end
223
-
224
- unless options[:datastore].to_s.empty?
225
- rspec.datastore = find_datastore(options[:datastore])
226
- end
227
-
228
- rspec
229
- end
230
-
231
216
  def create_delta_disk(vm_template)
232
217
  disks = vm_template.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
233
218
  disks.select { |disk| disk.backing.parent == nil }.each do |disk|
@@ -326,110 +311,6 @@ module ChefProvisioningVsphere
326
311
  datacenter.datastore.find { |f| f.info.name == datastore_name } or raise "no such datastore #{datastore_name}"
327
312
  end
328
313
 
329
- def customization_options_from(action_handler, vm_template, vm_name, options)
330
- if options.has_key?(:customization_spec)
331
- if(options[:customization_spec].is_a?(Hash))
332
- cust_options = options[:customization_spec]
333
- ip_settings = cust_options[:ipsettings]
334
- cust_domain = cust_options[:domain]
335
-
336
- raise ArgumentError, 'domain is required' unless cust_domain
337
- cust_ip_settings = nil
338
- if ip_settings && ip_settings.key?(:ip)
339
- unless cust_options[:ipsettings].key?(:subnetMask)
340
- raise ArgumentError, 'subnetMask is required for static ip'
341
- end
342
- cust_ip_settings = RbVmomi::VIM::CustomizationIPSettings.new(ip_settings)
343
- action_handler.report_progress "customizing #{vm_name} with static IP #{ip_settings[:ip]}"
344
- cust_ip_settings.ip = RbVmomi::VIM::CustomizationFixedIp(:ipAddress => ip_settings[:ip])
345
- end
346
- if cust_ip_settings.nil?
347
- cust_ip_settings= RbVmomi::VIM::CustomizationIPSettings.new(:ip => RbVmomi::VIM::CustomizationDhcpIpGenerator.new())
348
- cust_ip_settings.dnsServerList = ip_settings[:dnsServerList]
349
- action_handler.report_progress "customizing #{vm_name} with dynamic IP and DNS: #{ip_settings[:dnsServerList]}"
350
- end
351
-
352
- cust_ip_settings.dnsDomain = cust_domain
353
- cust_global_ip_settings = RbVmomi::VIM::CustomizationGlobalIPSettings.new
354
- cust_global_ip_settings.dnsServerList = cust_ip_settings.dnsServerList
355
- cust_global_ip_settings.dnsSuffixList = [cust_domain]
356
- cust_hostname = hostname_from(cust_options, vm_name)
357
- cust_hwclockutc = cust_options[:hw_clock_utc]
358
- cust_timezone = cust_options[:time_zone]
359
-
360
- if vm_template.config.guestId.start_with?('win')
361
- cust_prep = windows_prep_for(action_handler, options, vm_name)
362
- else
363
- cust_prep = RbVmomi::VIM::CustomizationLinuxPrep.new(
364
- :domain => cust_domain,
365
- :hostName => cust_hostname,
366
- :hwClockUTC => cust_hwclockutc,
367
- :timeZone => cust_timezone
368
- )
369
- end
370
- cust_adapter_mapping = [RbVmomi::VIM::CustomizationAdapterMapping.new(:adapter => cust_ip_settings)]
371
- RbVmomi::VIM::CustomizationSpec.new(
372
- :identity => cust_prep,
373
- :globalIPSettings => cust_global_ip_settings,
374
- :nicSettingMap => cust_adapter_mapping
375
- )
376
- else
377
- find_customization_spec(cust_options)
378
- end
379
- end
380
- end
381
-
382
- def windows_prep_for(action_handler, options, vm_name)
383
- cust_options = options[:customization_spec]
384
- cust_runonce = RbVmomi::VIM::CustomizationGuiRunOnce.new(
385
- :commandList => [
386
- 'winrm set winrm/config/client/auth @{Basic="true"}',
387
- 'winrm set winrm/config/service/auth @{Basic="true"}',
388
- 'winrm set winrm/config/service @{AllowUnencrypted="true"}',
389
- 'shutdown -l'])
390
-
391
- cust_login_password = RbVmomi::VIM::CustomizationPassword(
392
- :plainText => true,
393
- :value => options[:ssh][:password])
394
- if cust_options.has_key?(:domain) and cust_options[:domain] != 'local'
395
- cust_domain_password = RbVmomi::VIM::CustomizationPassword(
396
- :plainText => true,
397
- :value => ENV['domainAdminPassword'] || cust_options[:domainAdminPassword])
398
- cust_id = RbVmomi::VIM::CustomizationIdentification.new(
399
- :joinDomain => cust_options[:domain],
400
- :domainAdmin => cust_options[:domainAdmin],
401
- :domainAdminPassword => cust_domain_password)
402
- #puts "my env passwd is: #{ENV['domainAdminPassword']}"
403
- action_handler.report_progress "joining domain #{cust_options[:domain]} with user: #{cust_options[:domainAdmin]}"
404
- else
405
- cust_id = RbVmomi::VIM::CustomizationIdentification.new(
406
- :joinWorkgroup => 'WORKGROUP')
407
- end
408
- cust_gui_unattended = RbVmomi::VIM::CustomizationGuiUnattended.new(
409
- :autoLogon => true,
410
- :autoLogonCount => 1,
411
- :password => cust_login_password,
412
- :timeZone => cust_options[:win_time_zone])
413
- cust_userdata = RbVmomi::VIM::CustomizationUserData.new(
414
- :computerName => hostname_from(cust_options, vm_name),
415
- :fullName => cust_options[:org_name],
416
- :orgName => cust_options[:org_name],
417
- :productId => cust_options[:product_id])
418
- RbVmomi::VIM::CustomizationSysprep.new(
419
- :guiRunOnce => cust_runonce,
420
- :identification => cust_id,
421
- :guiUnattended => cust_gui_unattended,
422
- :userData => cust_userdata)
423
- end
424
-
425
- def hostname_from(options, vm_name)
426
- if options.key?(:hostname)
427
- RbVmomi::VIM::CustomizationFixedName.new(:name => options[:hostname])
428
- else
429
- RbVmomi::VIM::CustomizationFixedName.new(:name => vm_name)
430
- end
431
- end
432
-
433
314
  def find_entity(name, parent_folder, &block)
434
315
  parts = name.split('/').reject(&:empty?)
435
316
  parts.each do |item|
@@ -456,8 +337,8 @@ module ChefProvisioningVsphere
456
337
 
457
338
  raise "vSphere Host not found [#{host_name}]" if host.nil?
458
339
 
459
- if !host.is_a?(RbVmomi::VIM::HostSystem) && host.respond_to?(:host)
460
- host = host.host
340
+ if host.is_a?(RbVmomi::VIM::ComputeResource)
341
+ host = host.first
461
342
  end
462
343
  host
463
344
  end
@@ -34,8 +34,6 @@ require 'chef/provisioning/machine_spec'
34
34
  # }
35
35
 
36
36
  describe 'vsphere_driver' do
37
- include ChefProvisioningVsphere::Helpers
38
-
39
37
  before :all do
40
38
  @vm_name = "cmvd-test-#{SecureRandom.hex}"
41
39
  @metal_config = eval File.read(File.expand_path('../config.rb', __FILE__))
@@ -49,8 +47,11 @@ describe 'vsphere_driver' do
49
47
  @metal_config[:machine_options][:convergence_options] = {:chef_server => chef_server}
50
48
  machine = @driver.ready_machine(action_handler, @machine_spec, @metal_config[:machine_options])
51
49
  @server_id = @machine_spec.location['server_id']
52
- @connection = vim(@metal_config[:driver_options])
53
- @vm = find_vm_by_id(@server_id, @connection)
50
+ @vsphere_helper = ChefProvisioningVsphere::VsphereHelper.new(
51
+ @metal_config[:driver_options],
52
+ @metal_config[:machine_options][:bootstrap_options][:datacenter]
53
+ )
54
+ @vm = @vsphere_helper.find_vm_by_id(@server_id)
54
55
  end
55
56
  end
56
57
 
@@ -101,7 +102,7 @@ describe 'vsphere_driver' do
101
102
  end
102
103
  end
103
104
  it 'is in the correct datacenter' do
104
- expect(@connection.serviceInstance.find_datacenter(@metal_config[:machine_options][:bootstrap_options][:datacenter]).find_vm("#{@vm.parent.name}/#{@vm_name}")).not_to eq(nil)
105
+ expect(@vsphere_helper.vim.serviceInstance.find_datacenter(@metal_config[:machine_options][:bootstrap_options][:datacenter]).find_vm("#{@vm.parent.name}/#{@vm_name}")).not_to eq(nil)
105
106
  end
106
107
  it 'has an added disk of the correct size' do
107
108
  disk_count = @vm.disks.count
@@ -146,7 +147,7 @@ describe 'vsphere_driver' do
146
147
  @metal_config[:machine_options]
147
148
  )
148
149
  end
149
- vm = find_vm_by_id(@server_id, @connection)
150
+ vm = @vsphere_helper.find_vm_by_id(@server_id)
150
151
  expect(vm).to eq(nil)
151
152
  end
152
153
  end
@@ -0,0 +1,34 @@
1
+ require 'chef/provisioning/vsphere_driver'
2
+
3
+ require_relative 'support/vsphere_helper_stub'
4
+
5
+ describe ChefProvisioningVsphere::CloneSpecBuilder do
6
+ let(:options) { { host: 'host' } }
7
+ let(:vm_template) { double('template', resourcePool: 'pool') }
8
+
9
+ before { allow(vm_template).to receive_message_chain(:config, :guestId) }
10
+
11
+ subject do
12
+ builder = ChefProvisioningVsphere::CloneSpecBuilder.new(
13
+ ChefProvisioningVsphereStubs::VsphereHelperStub.new,
14
+ Chef::Provisioning::ActionHandler.new
15
+ )
16
+ builder.build(vm_template, 'machine_name', options)
17
+ end
18
+
19
+ context 'using linked clones' do
20
+ before { options[:use_linked_clone] = true }
21
+
22
+ it 'sets the disk move type of the relocation spec' do
23
+ expect(subject.location.diskMoveType).to be :moveChildMostDiskBacking
24
+ end
25
+ end
26
+
27
+ context 'not using linked clones' do
28
+ before { options[:use_linked_clone] = false }
29
+
30
+ it 'sets the disk move type of the relocation spec' do
31
+ expect(subject.location.diskMoveType).to be nil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ module ChefProvisioningVsphereStubs
2
+ class VsphereHelperStub < ChefProvisioningVsphere::VsphereHelper
3
+ def initialize
4
+ end
5
+
6
+ def network_device_changes(action_handler, vm_template, options)
7
+ [
8
+ [RbVmomi::VIM::VirtualDeviceConfigSpec.new],
9
+ [RbVmomi::VIM::VirtualDeviceConfigSpec.new]
10
+ ]
11
+ end
12
+
13
+ def find_host(host_name)
14
+ RbVmomi::VIM::HostSystem.new(nil, nil)
15
+ end
16
+
17
+ def find_pool(pool_name)
18
+ RbVmomi::VIM::ResourcePool.new(nil, nil)
19
+ end
20
+
21
+ def find_datastore(datastore_name)
22
+ RbVmomi::VIM::Datastore.new
23
+ end
24
+
25
+ def find_customization_spec(options)
26
+ RbVmomi::VIM::CustomizationSpec.new
27
+ end
28
+
29
+ def create_delta_disk(vm_template)
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-provisioning-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.5.7.dev
5
5
  platform: ruby
6
6
  authors:
7
7
  - CenturyLink Cloud
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-09 00:00:00.000000000 Z
11
+ date: 2015-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbvmomi
@@ -103,6 +103,7 @@ files:
103
103
  - contribution-notice
104
104
  - lib/chef/provisioning/driver_init/vsphere.rb
105
105
  - lib/chef/provisioning/vsphere_driver.rb
106
+ - lib/chef/provisioning/vsphere_driver/clone_spec_builder.rb
106
107
  - lib/chef/provisioning/vsphere_driver/driver.rb
107
108
  - lib/chef/provisioning/vsphere_driver/version.rb
108
109
  - lib/chef/provisioning/vsphere_driver/vsphere_helpers.rb
@@ -112,6 +113,8 @@ files:
112
113
  - spec/integration_tests/vsphere_driver_spec.rb
113
114
  - spec/unit_tests/VsphereDriver_spec.rb
114
115
  - spec/unit_tests/VsphereUrl_spec.rb
116
+ - spec/unit_tests/clone_spec_builder_spec.rb
117
+ - spec/unit_tests/support/vsphere_helper_stub.rb
115
118
  homepage: https://github.com/tier3/chef-provisioning-vsphere
116
119
  licenses:
117
120
  - MIT
@@ -127,9 +130,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
127
130
  version: '0'
128
131
  required_rubygems_version: !ruby/object:Gem::Requirement
129
132
  requirements:
130
- - - ">="
133
+ - - ">"
131
134
  - !ruby/object:Gem::Version
132
- version: '0'
135
+ version: 1.3.1
133
136
  requirements: []
134
137
  rubyforge_project:
135
138
  rubygems_version: 2.4.4
@@ -141,4 +144,6 @@ test_files:
141
144
  - spec/integration_tests/vsphere_driver_spec.rb
142
145
  - spec/unit_tests/VsphereDriver_spec.rb
143
146
  - spec/unit_tests/VsphereUrl_spec.rb
147
+ - spec/unit_tests/clone_spec_builder_spec.rb
148
+ - spec/unit_tests/support/vsphere_helper_stub.rb
144
149
  has_rdoc: