vagrant-vmware-esxi 2.0.7 → 2.1.0

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: 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