vagrant-parallels 1.6.0 → 1.6.1

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: de4565a0948c5dbbea3ac0b3680d486a5fe619bd
4
- data.tar.gz: 2b7c0a99d853ff724e3e779db4e11246fffc638d
3
+ metadata.gz: 8c838025184a0d6acdfbb7c6434427e3730fe16f
4
+ data.tar.gz: 88541ff940262fefdf1602ab2753ad73c5c8ce8e
5
5
  SHA512:
6
- metadata.gz: 738de6233a41e71bc6af35527ba4c6e42e325a24ff0933357218e0b4f4df3a7cbab66b620bc5354816d4f3c1e653e8e07ba0f57adfa2ed6a5a0bf7ba44b438bf
7
- data.tar.gz: e372a5bc4d234d2852c3c0542715fdc6331b768401866b6b7f57047d52a312c20c50e9b1ff979bf10ddf95233b6fdbb4669e6b01a7a0a6938cf2ff953d7a58eb
6
+ metadata.gz: bd23145472fdfb85da1abbea1d89fdf3d673ad4f74853bdfe9afe52c59a62a89245102ad6b806dd123ef266f293ed3afac4f739985ef0489081890f461223854
7
+ data.tar.gz: 272b8cbf4d71909b58f3bce0f33b6a3b3f77f07da3a3c5e355eea2244bd1028ca42310bf7c9db55f3d0491c14875d7517e59f347d6ac997bebe11d7ebdf36e21
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.6.1 (January 13, 2016)
2
+
3
+ BUG FIXES:
4
+ - action/import: Fix `regenerate_src_uuid` option behavior in parallel run
5
+ [[GH-241](https://github.com/Parallels/vagrant-parallels/pull/241)]
6
+ - action/box_unregister: Use temporary lock file to prevent early unregister
7
+ in parallel run [[GH-244](https://github.com/Parallels/vagrant-parallels/pull/244)]
8
+ - action/network: Fix detection of the next virtual network ID [[GH-245](https://github.com/Parallels/vagrant-parallels/pull/245)]
9
+
10
+
1
11
  ## 1.6.0 (December 24, 2015)
2
12
 
3
13
  BREAKING CHANGES:
@@ -1,3 +1,4 @@
1
+ require 'fileutils'
1
2
  require 'log4r'
2
3
 
3
4
  module VagrantPlugins
@@ -58,13 +59,35 @@ module VagrantPlugins
58
59
  config: tpl_config
59
60
  end
60
61
 
61
- id
62
+ id.delete('{}')
63
+ end
64
+
65
+ def lease_box_lock(env)
66
+ lease_file = env[:machine].box.directory.join('box_lease_count')
67
+
68
+ # If the temporary file, verify it is not too old. If its older than
69
+ # 1 hour, delete it first because previous run may be failed.
70
+ if lease_file.file? && lease_file.mtime.to_i < Time.now.to_i - 60 * 60
71
+ lease_file.delete
72
+ end
73
+
74
+ # Increment a counter in the file. Create the file if it doesn't exist
75
+ FileUtils.touch(lease_file)
76
+ File.open(lease_file ,'r+') do |file|
77
+ num = file.gets.to_i
78
+ file.rewind
79
+ file.puts num.next
80
+ file.fsync
81
+ file.flush
82
+ end
62
83
  end
63
84
 
64
85
  def register_box(env)
65
- box_id_file = env[:machine].box.directory.join('box_id')
86
+ # Increment the lock counter in the temporary lease file
87
+ lease_box_lock(env)
66
88
 
67
- # Read the master ID if we have it in the file.
89
+ # Read the box ID if we have it in the file.
90
+ box_id_file = env[:machine].box.directory.join('box_id')
68
91
  env[:clone_id] = box_id_file.read.chomp if box_id_file.file?
69
92
 
70
93
  # If we have the ID and the VM exists already, then we
@@ -84,11 +107,6 @@ module VagrantPlugins
84
107
  # We need the box ID to be the same for all parallel runs
85
108
  options = ['--preserve-uuid']
86
109
 
87
- if env[:machine].provider_config.regen_src_uuid \
88
- && env[:machine].provider.pd_version_satisfies?('>= 10.1.2')
89
- options << '--regenerate-src-uuid'
90
- end
91
-
92
110
  # Register the box VM image
93
111
  env[:machine].provider.driver.register(pvm, options)
94
112
  env[:clone_id] = box_id(env, pvm)
@@ -4,6 +4,8 @@ module VagrantPlugins
4
4
  module Parallels
5
5
  module Action
6
6
  class BoxUnregister
7
+ @@lock = Mutex.new
8
+
7
9
  def initialize(app, env)
8
10
  @app = app
9
11
  @logger = Log4r::Logger.new('vagrant_parallels::action::box_unregister')
@@ -15,7 +17,12 @@ module VagrantPlugins
15
17
  return @app.call(env)
16
18
  end
17
19
 
18
- unregister_box(env)
20
+ @@lock.synchronize do
21
+ lock_key = Digest::MD5.hexdigest(env[:machine].box.name)
22
+ env[:machine].env.lock(lock_key, retry: true) do
23
+ unregister_box(env)
24
+ end
25
+ end
19
26
 
20
27
  # If we got interrupted, then the import could have been
21
28
  # interrupted and its not a big deal. Just return out.
@@ -31,7 +38,32 @@ module VagrantPlugins
31
38
 
32
39
  private
33
40
 
41
+ def release_box_lock(lease_file)
42
+ return if !lease_file.file?
43
+
44
+ # Decrement the counter in the lease file
45
+ File.open(lease_file,'r+') do |file|
46
+ num = file.gets.to_i
47
+ file.rewind
48
+ file.puts(num - 1)
49
+ file.fsync
50
+ file.flush
51
+ end
52
+
53
+ # Delete the lease file if we are the last who need this box.
54
+ # Then the box image will be unregistered.
55
+ lease_file.delete if lease_file.read.chomp.to_i <= 1
56
+ end
57
+
34
58
  def unregister_box(env)
59
+ # Release the box lock
60
+ lease_file = env[:machine].box.directory.join('box_lease_count')
61
+ release_box_lock(lease_file)
62
+
63
+ # Do not unregister the box image if the temporary lease file exists
64
+ # Most likely it is cloning to another Vagrant env (in parallel run)
65
+ return if lease_file.file?
66
+
35
67
  if env[:clone_id] && env[:machine].provider.driver.vm_exists?(env[:clone_id])
36
68
  env[:ui].info I18n.t('vagrant_parallels.actions.vm.box.unregister')
37
69
  env[:machine].provider.driver.unregister(env[:clone_id])
@@ -14,6 +14,8 @@ module VagrantPlugins
14
14
  end
15
15
 
16
16
  def call(env)
17
+ options = {}
18
+
17
19
  # Disable requiring password for register and clone actions [GH-67].
18
20
  # It is available only since PD 10.
19
21
  if env[:machine].provider.pd_version_satisfies?('>= 10')
@@ -22,18 +24,27 @@ module VagrantPlugins
22
24
  env[:machine].provider.driver.disable_password_restrictions(acts)
23
25
  end
24
26
 
27
+ if env[:machine].provider_config.regen_src_uuid \
28
+ && env[:machine].provider.pd_version_satisfies?('>= 10.1.2')
29
+ options[:regenerate_src_uuid] = true
30
+ end
31
+
25
32
  # Linked clones are supported only for PD 11 and higher
26
33
  if env[:machine].provider_config.linked_clone \
27
34
  && env[:machine].provider.pd_version_satisfies?('>= 11')
28
35
  # Linked clone creation should not be concurrent [GH-206]
36
+ options[:snapshot_id] = env[:clone_snapshot_id]
37
+ options[:linked] = true
29
38
  @@lock.synchronize do
30
39
  lock_key = Digest::MD5.hexdigest("#{env[:clone_id]}-linked-clone")
31
40
  env[:machine].env.lock(lock_key, retry: true) do
32
- clone_linked(env)
41
+ env[:ui].info I18n.t('vagrant_parallels.actions.vm.clone.linked')
42
+ clone(env, options)
33
43
  end
34
44
  end
35
45
  else
36
- clone_full(env)
46
+ env[:ui].info I18n.t('vagrant_parallels.actions.vm.clone.full')
47
+ clone(env, options)
37
48
  end
38
49
 
39
50
  # If we got interrupted, then the import could have been
@@ -44,7 +55,7 @@ module VagrantPlugins
44
55
  raise Errors::VMCloneFailure if !env[:machine].id
45
56
 
46
57
  if env[:machine].provider_config.regen_src_uuid \
47
- && env[:machine].provider.pd_version_satisfies?('< 11')
58
+ && env[:machine].provider.pd_version_satisfies?('< 10.1.2')
48
59
  @logger.info('Regenerate SourceVmUuid by editing config.pvs file')
49
60
  env[:machine].provider.driver.regenerate_src_uuid
50
61
  end
@@ -88,27 +99,9 @@ module VagrantPlugins
88
99
 
89
100
  protected
90
101
 
91
- def clone_full(env)
92
- env[:ui].info I18n.t('vagrant_parallels.actions.vm.clone.full')
93
- env[:machine].id = env[:machine].provider.driver.clone_vm(
94
- env[:clone_id]) do |progress|
95
- env[:ui].clear_line
96
- env[:ui].report_progress(progress, 100, false)
97
- end
98
-
99
- # Clear the line one last time since the progress meter doesn't disappear
100
- # immediately.
101
- env[:ui].clear_line
102
- end
103
-
104
- def clone_linked(env)
105
- opts = {
106
- snapshot_id: env[:clone_snapshot_id],
107
- linked: true
108
- }
109
- env[:ui].info I18n.t('vagrant_parallels.actions.vm.clone.linked')
102
+ def clone(env, options)
110
103
  env[:machine].id = env[:machine].provider.driver.clone_vm(
111
- env[:clone_id], opts) do |progress|
104
+ env[:clone_id], options) do |progress|
112
105
  env[:ui].clear_line
113
106
  env[:ui].report_progress(progress, 100, false)
114
107
  end
@@ -415,7 +415,7 @@ module VagrantPlugins
415
415
  if net_nums.empty?
416
416
  'vagrant-vnet0'
417
417
  else
418
- free_names = Array(0..net_nums.max) - net_nums
418
+ free_names = Array(0..net_nums.max.next) - net_nums
419
419
  "vagrant-vnet#{free_names.first}"
420
420
  end
421
421
  end
@@ -67,6 +67,9 @@ module VagrantPlugins
67
67
  args << '--linked' if options[:linked]
68
68
  args.concat(['--id', options[:snapshot_id]]) if options[:snapshot_id]
69
69
 
70
+ # Regenerate SourceVmUuid of the cloned VM
71
+ args << '--regenerate-src-uuid' if options[:regenerate_src_uuid]
72
+
70
73
  execute_prlctl(*args) do |_, data|
71
74
  lines = data.split('\r')
72
75
  # The progress of the clone will be in the last line. Do a greedy
@@ -526,25 +529,7 @@ module VagrantPlugins
526
529
  # @param [String] pvm_file Path to the machine image (*.pvm)
527
530
  # @param [Array<String>] opts List of options for "prlctl register"
528
531
  def register(pvm_file, opts=[])
529
- args = [@prlctl_path, 'register', pvm_file, *opts]
530
-
531
- 3.times do
532
- result = raw(*args)
533
- # Exit if everything is OK
534
- return if result.exit_code == 0
535
-
536
- # It may occur in the race condition with other Vagrant processes.
537
- # It is OK, just exit.
538
- return if result.stderr.include?('is already registered.')
539
-
540
- # Sleep a bit though to give Parallels Desktop time to fix itself
541
- sleep 2
542
- end
543
-
544
- # If we reach this point, it means that we consistently got the
545
- # failure, do a standard execute now. This will raise an
546
- # exception if it fails again.
547
- execute(*args)
532
+ execute_prlctl('register', pvm_file, *opts)
548
533
  end
549
534
 
550
535
  # Switches the VM state to the specified snapshot
@@ -619,25 +604,7 @@ module VagrantPlugins
619
604
  # Virtual machine will be removed from the VM list, but its image will
620
605
  # not be deleted from the disk. So, it can be registered again.
621
606
  def unregister(uuid)
622
- args = [@prlctl_path, 'unregister', uuid]
623
- 3.times do
624
- result = raw(*args)
625
- # Exit if everything is OK
626
- return if result.exit_code == 0
627
-
628
- # It may occur in the race condition with other Vagrant processes.
629
- # Both are OK, just exit.
630
- return if result.stderr.include?('is not registered')
631
- return if result.stderr.include?('is being cloned')
632
-
633
- # Sleep a bit though to give Parallels Desktop time to fix itself
634
- sleep 2
635
- end
636
-
637
- # If we reach this point, it means that we consistently got the
638
- # failure, do a standard execute now. This will raise an
639
- # exception if it fails again.
640
- execute(*args)
607
+ execute_prlctl('unregister', uuid)
641
608
  end
642
609
 
643
610
  # Unshare folders.
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Parallels
3
- VERSION = '1.6.0'
3
+ VERSION = '1.6.1'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-parallels
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Zholobov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-24 00:00:00.000000000 Z
12
+ date: 2016-01-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler