vagrant-parallels 1.6.0 → 1.6.1

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