vagrant-vmware-esxi 2.0.7 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 343c96c9a16c7657eecc7386265446c25d30918d
4
- data.tar.gz: 8eb77a209ec5b5707d655210e420abaa14482795
3
+ metadata.gz: a0fd559e963813bd56e7f2dedf83924abbe16706
4
+ data.tar.gz: 56447256f57346e7f1b3da2de4da83d0a529c237
5
5
  SHA512:
6
- metadata.gz: b9f8620e0c93b40a8f8892c823c7818cdd533578547adc9f6eeaa24a3edac91432303eb73d233fd97ffa0c736334dab49bee381f55b79e5afc50c3bb307577c8
7
- data.tar.gz: dacca0c01725ff30f9174604016ea739b797485d7b4989011cfca602b91282dde14b39fa8dfae0acab0b5f6b8a3c4631374f0415dac58a7c16980bb0d35d8ca0
6
+ metadata.gz: 00200e42bb32d12799a69d1f50a79c9345078c4d84875017ad7c8d1cef46e168296d1ba06aab9720fc5b0e66bc9086b739ac9e938d291bfedaa54a20c44eff2e
7
+ data.tar.gz: 043e6563f627a24a820f4963eff2e225ff082063db94f7bddbb8d25ec87e2d57449c9368140c16ecd2e4205e8d665931ab5122567126c9486d4bdf6e72a27d20
data/README.md CHANGED
@@ -9,9 +9,14 @@ Refer to the WIKI for documentation, examples and other information...
9
9
  >https://github.com/josenk/vagrant-vmware-esxi/wiki
10
10
 
11
11
 
12
+ What's new!
13
+ -----------
14
+ Added support to clone from a VM! Refer to the WIKI for documentation, example and other information.
15
+ >https://github.com/josenk/vagrant-vmware-esxi/wiki/How-to-clone_from_vm.
12
16
 
13
17
  Features and Compatibility
14
18
  --------------------------
19
+ * Clone from VMs. Clone a VM on the esxi host instead of transferring a box stored on your local pc.
15
20
  * Any of the vmware Box formats should be compatible.
16
21
  * vmware_desktop, vmware_fusion, vmware_workstation...
17
22
  * To be fully functional, you must have open-vm-tools or vmware tools installed.
@@ -78,7 +83,7 @@ Vagrant.configure('2') do |config|
78
83
  # Here are some of the MANY examples....
79
84
  config.vm.box = 'generic/centos7'
80
85
  #config.vm.box = 'generic/centos6'
81
- #config.vm.box = 'generic/fedora26'
86
+ #config.vm.box = 'generic/fedora27'
82
87
  #config.vm.box = 'generic/freebsd11'
83
88
  #config.vm.box = 'generic/ubuntu1710'
84
89
  #config.vm.box = 'generic/debian9'
@@ -145,6 +150,13 @@ Vagrant.configure('2') do |config|
145
150
  # Vagrant will NOT create a Resource pool it for you.
146
151
  #esxi.esxi_resource_pool = '/Vagrant'
147
152
 
153
+ # Optional. Specify a VM to clone instead of uploading a box.
154
+ # Vagrant can use any stopped VM as the source 'box'. The VM must be
155
+ # registered, stopped and must have the vagrant insecure ssh key installed.
156
+ # If the VM is stored in a resource pool, it must be specified.
157
+ # See wiki: https://github.com/josenk/vagrant-vmware-esxi/wiki/How-to-clone_from_vm.
158
+ #esxi.clone_from_vm = 'resource_pool/source_vm'
159
+
148
160
  # OPTIONAL. Guest VM name to use.
149
161
  # The Default will be automatically generated.
150
162
  #esxi.guest_name = 'Custom-Guest-VM_Name'
@@ -256,8 +268,12 @@ Known issues with vmware_esxi
256
268
 
257
269
  Version History
258
270
  ---------------
271
+ * 2.1.0 Add support for clone_from_vm.
272
+ Fix, use esxcli to get storage information.
273
+
259
274
  * 2.0.7 Fix, Doesn't wait for running when executing "vagrant reload"
260
275
  Fix, "vagrant halt" will now attempt a graceful shutdown before doing a hard power off.
276
+
261
277
  * 2.0.6 Fix Windows compatibility by not supporting ed25519 ssh keys. When net-ssh 5.x is released AND vagrant allows it's use, I will support ed25519 again.
262
278
  Fix, encode '/' in esxi passwords.
263
279
  Fix, Get local IP address for NFS syncd folders. Filter out localhost 127.0.0.0/8.
@@ -126,6 +126,14 @@ Vagrant.configure('2') do |config|
126
126
  # Vagrant will NOT create a Resource pool it for you.
127
127
  #esxi.esxi_resource_pool = '/Vagrant'
128
128
 
129
+ # Optional. Specify a VM to clone instead of uploading a box.
130
+ # Vagrant can use any stopped VM as the source 'box'. The VM must be
131
+ # registered, stopped and must have the vagrant insecure ssh key installed.
132
+ # If the VM is stored in a resource pool, it must be specified. If this
133
+ # option is specified, config.vm.box should be set to a dummy box.
134
+ # See wiki: https://github.com/josenk/vagrant-vmware-esxi/wiki/How-to-clone_from_vm.
135
+ #esxi.clone_from_vm = 'resource_pool/source_vm'
136
+
129
137
  # OPTIONAL. Guest VM name to use.
130
138
  # The Default will be automatically generated. It will be based on
131
139
  # the guest_name_prefix (see below), your hostname & username and path.
@@ -27,9 +27,7 @@ module VagrantPlugins
27
27
  if env1[:machine_state].to_s == 'running'
28
28
  b1.use Shutdown
29
29
  b1.use Call, WaitForState, :powered_off, 30 do |env1, b2|
30
- unless env1[:result] == 'True'
31
- b2.use Halt
32
- end
30
+ b2.use Halt unless env1[:result] == 'True'
33
31
  end
34
32
  else
35
33
  b1.use Halt
@@ -113,9 +111,7 @@ module VagrantPlugins
113
111
  Vagrant::Action::Builder.new.tap do |b|
114
112
  b.use SetESXiPassword
115
113
  b.use Call, ReadState do |env1, b1|
116
- unless env1[:machine_state] == 'powered_off'
117
- b1.use Halt
118
- end
114
+ b1.use Halt unless env1[:machine_state] == 'powered_off'
119
115
  b1.use ReadState
120
116
  b1.use Destroy
121
117
  end
@@ -164,6 +160,7 @@ module VagrantPlugins
164
160
  b1.use Provision
165
161
  b1.use SyncedFolderCleanup
166
162
  b1.use SyncedFolders
163
+ #b1.use SetHostname # Still too buggy. Tested with vagrant 2.0.4dev
167
164
  end
168
165
  end
169
166
  end
@@ -31,6 +31,16 @@ module VagrantPlugins
31
31
  return
32
32
  end
33
33
 
34
+ #
35
+ # Verify ovftool is installed.
36
+ #
37
+ unless system 'ovftool --version'
38
+ raise Errors::OVFToolError,
39
+ message: 'ovftool not found or not in your path.'\
40
+ " Please download and "\
41
+ ' install from http://www.vmware.com.'
42
+ end
43
+
34
44
  # Set desired_guest_name
35
45
  if !env[:machine].config.vm.hostname.nil?
36
46
  # A hostname has been set, so use it.
@@ -52,15 +62,38 @@ module VagrantPlugins
52
62
  desired_guest_name = desired_guest_name[0..252].gsub(/_/,'-').gsub(/[^0-9A-Za-z\-\.]/i, '').strip
53
63
  @logger.info("vagrant-vmware-esxi, createvm: config.guest_name: #{config.guest_name}")
54
64
 
55
- #
56
65
  # Source vmx / vmdk files
57
66
  src_dir = env[:machine].box.directory
58
67
  @logger.info("vagrant-vmware-esxi, createvm: src_dir: #{src_dir}")
59
68
 
60
- vmx_file = Dir.glob("#{src_dir}/*.vmx").first
61
- vmdk_files = Dir.glob("#{src_dir}/*.vmdk")
62
- @logger.info("vagrant-vmware-esxi, createvm: vmx_file: #{vmx_file}")
63
- @logger.info("vagrant-vmware-esxi, createvm: vmdk_files: #{vmdk_files}")
69
+ if config.clone_from_vm.nil?
70
+ vmx_file = Dir.glob("#{src_dir}/*.vmx").first
71
+ @logger.info("vagrant-vmware-esxi, createvm: vmx_file: #{vmx_file}")
72
+ source_vmx_contents = File.read(vmx_file)
73
+ else
74
+ begin
75
+ tmpdir = Dir.mktmpdir
76
+ rescue
77
+ raise Errors::GeneralError,
78
+ message: "Unable to create tmp dir #{tmpdir}"
79
+ end
80
+ #
81
+ # Source from Clone Source
82
+ clone_from_vm_path = "vi://#{config.esxi_username}:#{$encoded_esxi_password}@#{config.esxi_hostname}/#{config.clone_from_vm}"
83
+ ovf_cmd = "ovftool --noSSLVerify --overwrite --powerOffTarget --noDisks --targetType=vmx "\
84
+ "#{clone_from_vm_path} #{tmpdir}"
85
+ unless system "#{ovf_cmd}"
86
+ raise Errors::OVFToolError,
87
+ message: "Unable to access #{config.clone_from_vm}"
88
+ end
89
+ vmx_file = Dir.glob("#{tmpdir}/#{config.clone_from_vm.split('/')[-1]}/*.vmx").first
90
+ unless source_vmx_contents = File.read(vmx_file)
91
+ raise Errors::GeneralError,
92
+ message: "Unable to read #{vmx_file}"
93
+ end
94
+
95
+ puts "source_vmx_contents: #{source_vmx_contents}" if config.debug =~ %r{vmx}i
96
+ end
64
97
 
65
98
  #
66
99
  # Open the network connection
@@ -79,8 +112,8 @@ module VagrantPlugins
79
112
  #
80
113
  # Figure out DataStore
81
114
  r = ssh.exec!(
82
- 'df 2>/dev/null| grep "^[VMFS|NFS].*/vmfs/volumes/" | '\
83
- 'sort -nk4 | sed "s|.*/vmfs/volumes/||g"')
115
+ 'esxcli storage filesystem list | grep "/vmfs/volumes/.*[VMFS|NFS]" | '\
116
+ "sort -nk7 | awk '{print $2}'")
84
117
 
85
118
  availvolumes = r.split(/\n/)
86
119
  if config.debug =~ %r{true}i
@@ -196,60 +229,93 @@ module VagrantPlugins
196
229
  @logger.info('vagrant-vmware-esxi, createvm: '\
197
230
  "esxi_virtual_network: #{@guestvm_network}")
198
231
 
199
- # finalize some paramaters
200
- #if (config.guest_memsize.is_a? String) || (config.guest_memsize.is_a? Integer)
201
- # desired_guest_memsize = config.guest_memsize.to_s.to_i
202
- #end
203
- #if (config.guest_numvcpus.is_a? String) || (config.guest_numvcpus.is_a? Integer)
204
- # desired_guest_numvcpus = config.guest_numvcpus.to_s.to_i
205
- #end
232
+ # Set some defaults
206
233
  desired_guest_memsize = config.guest_memsize.to_s.to_i unless config.guest_memsize.nil?
234
+ desired_guest_memsize = 1024 if desired_guest_memsize.nil?
235
+
207
236
  desired_guest_numvcpus = config.guest_numvcpus.to_s.to_i unless config.guest_numvcpus.nil?
237
+ desired_guest_numvcpus = 1 if desired_guest_numvcpus.nil?
238
+
239
+ unless config.guest_guestos.nil?
240
+ if config.supported_guest_guestos.include? config.guest_guestos.downcase
241
+ desired_guestos = config.guest_guestos.downcase.strip
242
+ else
243
+ config.guest_guestos = nil
244
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
245
+ message: 'WARNING : '\
246
+ "GuestOS: #{config.guest_guestos} not "\
247
+ "supported, using box/ovftool defaults")
248
+ end
249
+ end
250
+
251
+ unless config.guest_virtualhw_version.nil?
252
+ if config.supported_guest_virtualhw_versions.include? config.guest_virtualhw_version.to_i
253
+ desired_virtualhw_version = config.guest_virtualhw_version.to_i.to_s
254
+ else
255
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
256
+ message: 'WARNING : '\
257
+ "Invalid guest_virtualhw_version: #{config.guest_virtualhw_version},"\
258
+ "using ovftool defaults")
259
+ config.guest_virtualhw_version = nil
260
+ end
261
+ end
262
+
263
+ unless config.guest_nic_type.nil?
264
+ if config.supported_guest_nic_types.include? config.guest_nic_type.downcase
265
+ desired_nic_type = config.guest_nic_type.downcase
266
+ else
267
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
268
+ message: 'WARNING : '\
269
+ "NIC type: #{config.guest_nic_type} not "\
270
+ "found, using ovftool defaults.")
271
+ config.guest_nic_type = nil
272
+ end
273
+ end
208
274
 
209
275
  #
210
276
  # Fix/clean up vmx file.
211
277
  #
212
278
  new_vmx_contents = ''
213
- File.readlines(vmx_file).each do |line|
279
+ source_vmx_contents.each_line do |line|
214
280
 
215
281
  case line
216
282
  when /^displayname =/i
217
283
  new_vmx_contents << "displayname = \"#{desired_guest_name}\"\n"
284
+
218
285
  when /^memsize =/i
219
- if desired_guest_memsize.nil?
220
- new_vmx_contents << line
286
+ if config.guest_memsize.nil?
221
287
  desired_guest_memsize = line.gsub(/^memsize = /i, '').gsub(/\"/, '').to_i
222
- else
223
- new_vmx_contents << "memsize = \"#{desired_guest_memsize}\"\n"
224
288
  end
289
+ new_vmx_contents << "memsize = \"#{desired_guest_memsize}\"\n"
290
+
225
291
  when /^numvcpus =/i
226
- if desired_guest_numvcpus.nil?
227
- new_vmx_contents << line
292
+ if config.guest_numvcpus.nil?
228
293
  desired_guest_numvcpus = line.gsub(/^numvcpus = /i, '').gsub(/\"/, '').to_i
229
- else
230
- new_vmx_contents << "numvcpus = \"#{desired_guest_numvcpus}\"\n"
231
294
  end
232
- when /^ethernet[0-9]/i
233
- # Do nothing, delete these lines, we'll fix it later.
234
- when /^guestOS = /i
295
+ new_vmx_contents << "numvcpus = \"#{desired_guest_numvcpus}\"\n"
235
296
 
236
- in_vmx_guest_guestos = line.gsub(/^guestOS = /i, '').gsub(/\"/, '').strip
297
+ when /^guestOS = /i
237
298
  if config.guest_guestos.nil?
238
- config.guest_guestos = in_vmx_guest_guestos
299
+ desired_guestos = line.gsub(/^guestOS = /i, '').gsub(/\"/, '').strip
239
300
  new_vmx_contents << line
240
301
  else
241
- if config.supported_guest_guestos.include? config.guest_guestos.downcase
242
- config.guest_guestos = config.guest_guestos.downcase.strip
243
- new_vmx_contents << "guestOS = \"#{config.guest_guestos}\"\n"
244
- else
245
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
246
- message: 'WARNING : '\
247
- "GuestOS: #{config.guest_guestos} not "\
248
- "supported, using box/ovftool defaults")
249
- config.guest_guestos = in_vmx_guest_guestos
250
- new_vmx_contents << line
251
- end
302
+ new_vmx_contents << "guestOS = \"#{desired_guestos}\"\n"
252
303
  end
304
+
305
+ when /^virtualHW.version = /i
306
+ if desired_virtualhw_version.nil?
307
+ desired_virtualhw_version = line.gsub(/^virtualHW.version = /i, '').gsub(/\"/, '').strip
308
+ new_vmx_contents << line
309
+ else
310
+ new_vmx_contents << "virtualHW.version = \"#{desired_virtualhw_version}\"\n"
311
+ end
312
+
313
+ when /^ethernet[0-9]/i
314
+ # Just save the nic type
315
+ if (line =~ /ethernet0.virtualDev = /i) and desired_nic_type.nil?
316
+ desired_nic_type = line.gsub(/ethernet0.virtualDev = /i, '').gsub('"', '').strip
317
+ end
318
+
253
319
  else
254
320
  new_vmx_contents << line
255
321
  end
@@ -258,29 +324,7 @@ module VagrantPlugins
258
324
 
259
325
  # finalize vmx.
260
326
  unless new_vmx_contents =~ %r{^numvcpus =}i
261
- if desired_guest_numvcpus.nil?
262
- new_vmx_contents << "numvcpus = \"1\"\n"
263
- else
264
- new_vmx_contents << "numvcpus = \"#{desired_guest_numvcpus}\"\n"
265
- end
266
- end
267
-
268
- # Append virt network options
269
- netOpts = ""
270
- networkID = 0
271
- for element in @guestvm_network do
272
- if config.debug =~ %r{true}i
273
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
274
- message: "Network[#{networkID}] : #{element}")
275
- end
276
- new_vmx_contents << "ethernet#{networkID}.networkName = \"net#{networkID}\"\n"
277
- new_vmx_contents << "ethernet#{networkID}.present = \"TRUE\"\n"
278
- new_vmx_contents << "ethernet#{networkID}.addressType = \"generated\"\n"
279
- netOpts << " --net:\"net#{networkID}=#{element}\""
280
- networkID += 1
281
- if networkID >= 4
282
- break
283
- end
327
+ new_vmx_contents << "numvcpus = \"#{desired_guest_numvcpus}\"\n"
284
328
  end
285
329
 
286
330
  # Write new vmx file on local filesystem
@@ -334,21 +378,6 @@ module VagrantPlugins
334
378
  config.guest_mac_address = new_guest_mac_address
335
379
  end
336
380
 
337
- # Validate nic types
338
- if config.guest_nic_type.nil?
339
- guest_nic_type = nil
340
- else
341
- if config.supported_guest_nic_types.include?(config.guest_nic_type.downcase)
342
- guest_nic_type = config.guest_nic_type.downcase
343
- else
344
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
345
- message: 'WARNING : '\
346
- "NIC type: #{config.guest_nic_type} not "\
347
- "found, using ovftool defaults.")
348
- guest_nic_type = nil
349
- end
350
- end
351
-
352
381
  # Validate disk types (thin, thick, etc...)
353
382
  if config.guest_disk_type.nil?
354
383
  guest_disk_type = "thin"
@@ -382,19 +411,6 @@ module VagrantPlugins
382
411
  config.guest_storage = new_guest_storage
383
412
  end
384
413
 
385
- # Validate virtual HW levels
386
- unless config.guest_virtualhw_version.nil?
387
- if config.supported_guest_virtualhw_versions.include? config.guest_virtualhw_version.to_i
388
- guest_virtualhw_version = config.guest_virtualhw_version.to_i.to_s
389
- else
390
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
391
- message: 'WARNING : '\
392
- "Invalid guest_virtualhw_version: #{config.guest_virtualhw_version},"\
393
- " using ovftool defaults")
394
- guest_virtualhw_version = nil
395
- end
396
- end
397
-
398
414
  # Validate local_lax setting (use relaxed (--lax) ovftool option)
399
415
  unless config.local_lax.nil?
400
416
  if config.local_lax == 'True'
@@ -404,7 +420,6 @@ module VagrantPlugins
404
420
  end
405
421
  end
406
422
 
407
-
408
423
  #
409
424
  # Print summary
410
425
  #
@@ -423,10 +438,15 @@ module VagrantPlugins
423
438
  message: " --- Guest Summary ---")
424
439
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
425
440
  message: "VM Name : #{desired_guest_name}")
426
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
427
- message: "Box : #{env[:machine].box.name}")
428
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
429
- message: "Box Ver : #{env[:machine].box.version}")
441
+ if config.clone_from_vm.nil?
442
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
443
+ message: "Box : #{env[:machine].box.name}")
444
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
445
+ message: "Box Ver : #{env[:machine].box.version}")
446
+ else
447
+ env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
448
+ message: "Clone from VM : #{config.clone_from_vm}")
449
+ end
430
450
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
431
451
  message: "Memsize (MB) : #{desired_guest_memsize}")
432
452
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
@@ -435,9 +455,9 @@ module VagrantPlugins
435
455
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
436
456
  message: "Mac Address : #{config.guest_mac_address[0..3]}")
437
457
  end
438
- unless guest_nic_type.nil?
458
+ unless config.guest_nic_type.nil?
439
459
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
440
- message: "Nic Type : #{guest_nic_type}")
460
+ message: "Nic Type : #{desired_nic_type}")
441
461
  end
442
462
  unless config.guest_disk_type.nil?
443
463
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
@@ -448,10 +468,10 @@ module VagrantPlugins
448
468
  message: "Storage (GB) : #{config.guest_storage[0..13]}")
449
469
  end
450
470
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
451
- message: "Guest OS type : #{config.guest_guestos}")
452
- unless guest_virtualhw_version.nil?
471
+ message: "Guest OS type : #{desired_guestos}")
472
+ unless config.virtualhw_version.nil?
453
473
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
454
- message: "Virtual HW ver : #{guest_virtualhw_version}")
474
+ message: "Virtual HW ver : #{desired_virtualhw_version}")
455
475
  end
456
476
  if config.local_lax == 'True'
457
477
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
@@ -464,20 +484,15 @@ module VagrantPlugins
464
484
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
465
485
  message: " --- Guest Build ---")
466
486
 
467
- #
468
- # Using ovftool, import vmx in box folder, export to ESXi server
469
- #
470
- unless system 'ovftool --version'
471
- raise Errors::OVFToolError,
472
- message: 'ovftool not found or not in your path.'\
473
- " Please download and "\
474
- ' install from http://www.vmware.com.'
487
+ if config.clone_from_vm.nil?
488
+ src_path = new_vmx_file
489
+ else
490
+ src_path = clone_from_vm_path
475
491
  end
476
-
477
492
  ovf_cmd = "ovftool --noSSLVerify #{overwrite_opts} "\
478
- "#{netOpts} -dm=#{guest_disk_type} #{local_laxoption} "\
493
+ "-dm=#{guest_disk_type} #{local_laxoption} "\
479
494
  "-ds=\"#{@guestvm_dsname}\" --name=\"#{desired_guest_name}\" "\
480
- "\"#{new_vmx_file}\" vi://#{config.esxi_username}:"\
495
+ "\"#{src_path}\" vi://#{config.esxi_username}:"\
481
496
  "#{$encoded_esxi_password}@#{config.esxi_hostname}"\
482
497
  "#{esxi_resource_pool}"
483
498
 
@@ -505,10 +520,11 @@ module VagrantPlugins
505
520
  message: "Keeping file : #{new_vmx_file}")
506
521
  else
507
522
  File.delete(new_vmx_file)
523
+ FileUtils.remove_entry tmpdir unless tmpdir.nil?
508
524
  end
509
525
 
510
526
  #
511
- # Re-open the network connection to get VMID and do final adjustments
527
+ # Re-open the network connection to get VMID and do adjustments
512
528
  # to vmx file.
513
529
  #
514
530
  Net::SSH.start(config.esxi_hostname, config.esxi_username,
@@ -621,64 +637,31 @@ module VagrantPlugins
621
637
 
622
638
  # read each line in vmx to customize
623
639
  new_vmx_contents = ''
624
- vmx_need_change_flag = false
625
640
  esxi_orig_vmx_file.each_line do |line|
626
641
 
627
642
  case line
628
643
 
629
- # configure virtualHW ver
644
+ when /^memsize = /i
645
+ new_vmx_contents << "memsize = \"#{desired_guest_memsize}\"\n"
646
+
647
+ when /^numvcpus = /i
648
+ new_vmx_contents << "numvcpus = \"#{desired_guest_numvcpus}\"\n"
649
+
630
650
  when /^virtualHW.version = /i
631
- if guest_virtualhw_version.nil?
632
- new_vmx_contents << line
633
- else
634
- new_vmx_contents << "virtualHW.version = \"#{guest_virtualhw_version}\"\n"
635
- vmx_need_change_flag = true
636
- end
651
+ new_vmx_contents << "virtualHW.version = \"#{desired_virtualhw_version}\"\n"
637
652
 
638
653
  when /^guestOS = /i
639
- if config.guest_guestos.nil?
640
- new_vmx_contents << line
641
- else
642
- new_vmx_contents << "guestOS = \"#{config.guest_guestos}\"\n"
643
- vmx_need_change_flag = true
644
- end
654
+ new_vmx_contents << "guestOS = \"#{desired_guestos}\"\n"
645
655
 
646
- # configure mac and nic type.
647
656
  when /^ethernet[0-9]/i
648
- nicindex = line[8].to_i
649
- if line.match(/^ethernet[0-9].networkName = /i)
650
- new_vmx_contents << line
651
- elsif line.match(/^ethernet0.virtualDev = /i)
652
- # Update guest_nic_type if it's set, otherwise, save eth0 guest_nic_type
653
- # for the remaining nics. (ovftool doesn't set it...)
654
- if guest_nic_type.nil?
655
- guest_nic_type = line.gsub(/ethernet0.virtualDev = /i, '').gsub('"', '').strip
656
- new_vmx_contents << line
657
- else
658
- new_vmx_contents << line.gsub(/ = .*$/, " = \"#{guest_nic_type}\"\n")
659
- vmx_need_change_flag = true
660
- end
661
- elsif (line.match(/^ethernet[0-9].addressType = /i) &&
662
- !config.guest_mac_address[nicindex].nil?)
663
- # Update MAC address if it's set
664
- guest_mac_address = config.guest_mac_address[nicindex]
665
- if guest_mac_address =~ /^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$/i
666
- new_vmx_contents << line.gsub(/ = .*$/, " = \"static\"")
667
- new_vmx_contents << line.gsub(/Type = .*$/, " = \"#{guest_mac_address}\"")
668
- vmx_need_change_flag = true
669
- elsif guest_mac_address == ''
670
- new_vmx_contents << line
671
- else
672
- new_vmx_contents << line
673
- end
674
- end
657
+ # Delete these entries. We'll append them later.
658
+
675
659
  else
676
660
  line_changed = false
677
661
  if config.guest_custom_vmx_settings.is_a? Array
678
662
  env[:machine].provider_config.guest_custom_vmx_settings.each do |k, v|
679
663
  if line =~ /#{k} = /
680
664
  new_vmx_contents << "#{k} = \"#{v}\"\n"
681
- vmx_need_change_flag = true
682
665
  line_changed = true
683
666
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
684
667
  message: "Custom vmx : Modify #{k} = \"#{v}\"")
@@ -691,25 +674,29 @@ module VagrantPlugins
691
674
  end
692
675
  end
693
676
 
694
- # For all nics, configure guest_nic_type and enable nics
695
- if guest_nic_type.nil?
696
- guest_nic_type = "e1000"
697
- end
677
+ # For all nics, configure desired_nic_type and enable nics
678
+ desired_nic_type = 'e1000' if desired_nic_type.nil?
679
+
698
680
  if config.esxi_virtual_network.is_a? Array
699
681
  number_of_adapters = config.esxi_virtual_network.count
700
682
  else
701
683
  number_of_adapters = 1
702
684
  end
703
685
 
704
- 1.upto(number_of_adapters) do |index|
705
- nic_index = index - 1
706
- unless new_vmx_contents =~ /ethernet#{nic_index}.virtualDev = \"#{guest_nic_type}\"/i
707
- new_vmx_contents << "ethernet#{nic_index}.virtualDev = \"#{guest_nic_type}\"\n"
708
- vmx_need_change_flag = true
709
- end
710
- unless new_vmx_contents =~ /ethernet#{nic_index}.present = \"TRUE\"/i
711
- new_vmx_contents << "ethernet#{nic_index}.present = \"TRUE\"\n"
712
- vmx_need_change_flag = true
686
+ 0.upto(number_of_adapters - 1) do |nic_index|
687
+ new_vmx_contents << "ethernet#{nic_index}.networkName = \"#{@guestvm_network[nic_index]}\"\n"
688
+ new_vmx_contents << "ethernet#{nic_index}.virtualDev = \"#{desired_nic_type}\"\n"
689
+ new_vmx_contents << "ethernet#{nic_index}.present = \"TRUE\"\n"
690
+ if config.guest_mac_address[nic_index].nil?
691
+ new_vmx_contents << "ethernet#{nic_index}.addressType = \"generated\"\n"
692
+ else
693
+ guest_mac_address = config.guest_mac_address[nic_index]
694
+ if guest_mac_address =~ /^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$/i
695
+ new_vmx_contents << "ethernet#{nic_index}.addressType = \"static\"\n"
696
+ new_vmx_contents << "ethernet#{nic_index}.address = \"#{guest_mac_address}\"\n"
697
+ else
698
+ new_vmx_contents << "ethernet#{nic_index}.addressType = \"generated\"\n"
699
+ end
713
700
  end
714
701
  end
715
702
 
@@ -718,39 +705,28 @@ module VagrantPlugins
718
705
  env[:machine].provider_config.guest_custom_vmx_settings.each do |k, v|
719
706
  unless new_vmx_contents =~ /#{k} = /
720
707
  new_vmx_contents << "#{k} = \"#{v}\"\n"
721
- vmx_need_change_flag = true
722
708
  env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
723
709
  message: "Custom vmx : Append #{k} = \"#{v}\"")
724
710
  end
725
711
  end
726
712
  end
727
713
 
728
- # If there was changes, update esxi
729
- if vmx_need_change_flag == true
730
- if config.debug =~ %r{vmx}i
731
- puts "new vmx: #{new_vmx_contents}"
732
- puts "\n\n"
733
- end
734
- r = ''
735
- ssh.open_channel do |channel|
736
- channel.exec("cat >#{dst_vmx_file}") do |ch, success|
737
- raise Errors::ESXiError,
738
- message: "Unable to update vmx file.\n"\
739
- " #{r}" unless success
740
-
741
- channel.send_data(new_vmx_contents)
742
- channel.eof!
743
- end
744
- end
745
- ssh.loop
746
- else
747
- if config.debug =~ %r{vmx}i
748
- env[:ui].info I18n.t('vagrant_vmware_esxi.vagrant_vmware_esxi_message',
749
- message: 'ESXi vmx file : Unmodified')
714
+ # update vmx on esxi
715
+ if config.debug =~ %r{vmx}i
716
+ puts "new vmx: #{new_vmx_contents}"
717
+ puts "\n\n"
718
+ end
719
+ r = ''
720
+ ssh.open_channel do |channel|
721
+ channel.exec("cat >#{dst_vmx_file}") do |ch, success|
722
+ raise Errors::ESXiError,
723
+ message: "Unable to update vmx file.\n"\
724
+ " #{r}" unless success
725
+ channel.send_data(new_vmx_contents)
726
+ channel.eof!
750
727
  end
751
728
  end
752
-
753
-
729
+ ssh.loop
754
730
 
755
731
  # Done
756
732
  end
@@ -39,7 +39,6 @@ module VagrantPlugins
39
39
  " #{env[:machine_state]}")
40
40
 
41
41
  if config.saved_ipaddress.nil? or config.local_use_ip_cache == 'False'
42
- puts "Determine guest IP address." if config.debug =~ %r{ip}i
43
42
 
44
43
  # Figure out vm_ipaddress
45
44
  Net::SSH.start(config.esxi_hostname, config.esxi_username,
@@ -111,6 +111,7 @@ module VagrantPlugins
111
111
  #
112
112
  # Save network configuration for provisioner to do changes.
113
113
  #
114
+ sleep(1)
114
115
  env[:machine].guest.capability(
115
116
  :configure_networks, networks_to_configure)
116
117
  end
@@ -36,6 +36,7 @@ module VagrantPlugins
36
36
  env[:result] = 'False' # couldn't reach state in time
37
37
  end
38
38
  end
39
+ env[:machine].provider_config.saved_ipaddress = nil
39
40
  @app.call(env)
40
41
  end
41
42
  end
@@ -11,6 +11,7 @@ module VagrantPlugins
11
11
  attr_accessor :esxi_disk_store
12
12
  attr_accessor :esxi_virtual_network
13
13
  attr_accessor :esxi_resource_pool
14
+ attr_accessor :clone_from_vm
14
15
  attr_accessor :guest_username
15
16
  attr_accessor :guest_name
16
17
  attr_accessor :guest_name_prefix
@@ -66,6 +67,7 @@ module VagrantPlugins
66
67
  @esxi_disk_store = nil
67
68
  @esxi_virtual_network = nil
68
69
  @esxi_resource_pool = nil
70
+ @clone_from_vm = nil
69
71
  @guest_username = 'vagrant'
70
72
  @guest_name = nil
71
73
  @guest_name_prefix = 'V-'
@@ -152,13 +154,13 @@ module VagrantPlugins
152
154
  'debian9-64',
153
155
  'debian9',
154
156
  'dos',
155
- 'eComStation2',
156
- 'eComStation',
157
+ 'ecomstation2',
158
+ 'ecomstation',
157
159
  'fedora-64',
158
160
  'fedora',
159
161
  'freebsd-64',
160
162
  'freebsd',
161
- 'genericLinux',
163
+ 'genericlinux',
162
164
  'mandrake',
163
165
  'mandriva-64',
164
166
  'mandriva',
@@ -167,27 +169,27 @@ module VagrantPlugins
167
169
  'netware6',
168
170
  'nld9',
169
171
  'oes',
170
- 'openServer5',
171
- 'openServer6',
172
+ 'openserver5',
173
+ 'openserver6',
172
174
  'opensuse-64',
173
175
  'opensuse',
174
- 'oracleLinux6-64',
175
- 'oracleLinux-64',
176
- 'oracleLinux6',
177
- 'oracleLinux7-64',
178
- 'oracleLinux7',
179
- 'oracleLinux',
176
+ 'oraclelinux6-64',
177
+ 'oraclelinux-64',
178
+ 'oraclelinux6',
179
+ 'oraclelinux7-64',
180
+ 'oraclelinux7',
181
+ 'oraclelinux',
180
182
  'os2',
181
- 'other24xLinux-64',
182
- 'other24xLinux',
183
- 'other26xLinux-64',
184
- 'other26xLinux',
185
- 'other3xLinux-64',
186
- 'other3xLinux',
183
+ 'other24xlinux-64',
184
+ 'other24xlinux',
185
+ 'other26xlinux-64',
186
+ 'other26xlinux',
187
+ 'other3xlinux-64',
188
+ 'other3xlinux',
187
189
  'other',
188
- 'otherGuest-64',
189
- 'otherLinux-64',
190
- 'otherLinux',
190
+ 'otherguest-64',
191
+ 'otherlinux-64',
192
+ 'otherlinux',
191
193
  'redhat',
192
194
  'rhel2',
193
195
  'rhel3-64',
@@ -218,49 +220,49 @@ module VagrantPlugins
218
220
  'solaris9',
219
221
  'suse-64',
220
222
  'suse',
221
- 'turboLinux-64',
222
- 'turboLinux',
223
+ 'turbolinux-64',
224
+ 'turbolinux',
223
225
  'ubuntu-64',
224
226
  'ubuntu',
225
- 'unixWare7',
227
+ 'unixware7',
226
228
  'vmkernel5',
227
229
  'vmkernel65',
228
230
  'vmkernel6',
229
231
  'vmkernel',
230
- 'vmwarePhoton-64',
231
- 'win2000AdvServ',
232
- 'win2000Pro',
233
- 'win2000Serv',
232
+ 'vmwarephoton-64',
233
+ 'win2000advserv',
234
+ 'win2000pro',
235
+ 'win2000serv',
234
236
  'win31',
235
237
  'win95',
236
238
  'win98',
237
239
  'windows7-64',
238
240
  'windows7',
239
- 'windows7Server-64',
241
+ 'windows7server-64',
240
242
  'windows8-64',
241
243
  'windows8',
242
- 'windows8Server-64',
244
+ 'windows8server-64',
243
245
  'windows9-64',
244
246
  'windows9',
245
- 'windows9Server-64',
246
- 'windowsHyperV',
247
- 'winLonghorn-64',
248
- 'winLonghorn',
249
- 'winMe',
250
- 'winNetBusiness',
251
- 'winNetDatacenter-64',
252
- 'winNetDatacenter',
253
- 'winNetEnterprise-64',
254
- 'winNetEnterprise',
255
- 'winNetStandard-64',
256
- 'winNetStandard',
257
- 'winNetWeb',
258
- 'winNT',
259
- 'winVista-64',
260
- 'winVista',
261
- 'winXPHome',
262
- 'winXPPro-64',
263
- 'winXPPro'
247
+ 'windows9server-64',
248
+ 'windowshyperv',
249
+ 'winlonghorn-64',
250
+ 'winlonghorn',
251
+ 'winme',
252
+ 'winnetbusiness',
253
+ 'winnetdatacenter-64',
254
+ 'winnetdatacenter',
255
+ 'winnetenterprise-64',
256
+ 'winnetenterprise',
257
+ 'winnetstandard-64',
258
+ 'winnetstandard',
259
+ 'winnetweb',
260
+ 'winnt',
261
+ 'winvista-64',
262
+ 'winvista',
263
+ 'winxphome',
264
+ 'winxppro-64',
265
+ 'winxppro'
264
266
  ]
265
267
 
266
268
  # Legacy (1.x)
@@ -1,7 +1,7 @@
1
1
  # VERSION
2
2
  module VagrantPlugins
3
3
  module ESXi
4
- VERSION = '2.0.7'
4
+ VERSION = '2.1.0'
5
5
  $vagrant_vmware_esxi_version = VERSION
6
6
  end
7
7
  end
@@ -3,7 +3,7 @@ require File.expand_path('../lib/vagrant-vmware-esxi/version', __FILE__)
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'vagrant-vmware-esxi'
5
5
  s.version = VagrantPlugins::ESXi::VERSION
6
- s.date = '2018-03-21'
6
+ s.date = '2018-04-01'
7
7
  s.summary = 'Vagrant ESXi provider plugin'
8
8
  s.description = 'A Vagrant plugin that adds a VMware ESXi provider support'
9
9
  s.authors = ['Jonathan Senkerik']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-vmware-esxi
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.7
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Senkerik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-21 00:00:00.000000000 Z
11
+ date: 2018-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n