vagrant-parallels 2.3.1 → 2.4.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
  SHA256:
3
- metadata.gz: 45a092a3894860152f2315793cb2a6ca541bc3488b168e3e08c9ba9637f8c867
4
- data.tar.gz: 7e6a76e6734bad9691232004722d0cc04f5bc53992798bd6e5074341dce985af
3
+ metadata.gz: 5316a81fe9c64de94bb88a2db7b9efcc015325d4b95bd4ec6302f7441334e0c3
4
+ data.tar.gz: d493a896f4b9776f2755038d333046c6fa920f7e1fdd45de96dee0ae4cf33ef4
5
5
  SHA512:
6
- metadata.gz: 5ff72d8b55fde7f2d4444048fe9c736e0f312c61f8b5098b0ac5569a1b3415a6c6671b9c54375190cbcd43aebf55b74fbde681ae9ff2c77f0144bd199a525b60
7
- data.tar.gz: 5181b7a0c84d03f593e7e4102e8289c95c292a5328566802f017851617259911012745707b78799bf113bd96e78200f95a6762abbb85135181883c273439dd6b
6
+ metadata.gz: 874be6069e0cf9ec4ee115d75b7979bd68a1c007d04f0552dae2a808d7025c8659926a906ce37814ee19c7c2e04ef7b753d2c5b1d2121f8670092a40b77b5248
7
+ data.tar.gz: 53435b75213e446b68d679f2600d47e70cc4d5fec8141d9be6e9eba270030cfa9f3d48cf398d5ce07311503de8a053802fb1629408bd49e5f49d25cbf40d0562
data/CHANGELOG.md CHANGED
@@ -1,10 +1,36 @@
1
- ## 2.3.1 (March 23, 2022)
1
+ ## 2.4.0 (May 22, 2023)
2
+ IMPROVEMENTS:
3
+ - use clonefile copy for macvm boxes
4
+ [[GH-459](https://github.com/Parallels/vagrant-parallels/pull/459)]
5
+
6
+ BUG FIXES:
7
+ - Bump activesupport from 6.1.7.3 to 6.1.7.5
8
+ [[GH-457](https://github.com/Parallels/vagrant-parallels/pull/457)]
9
+ - Don't try to call methdods on Nil
10
+ [[GH-456](https://github.com/Parallels/vagrant-parallels/pull/456)]
11
+ - Add a doc note for releasing a new provider version
12
+ [[GH-452](https://github.com/Parallels/vagrant-parallels/pull/452)]
13
+ - website: Remove unused images
14
+ [[GH-450](https://github.com/Parallels/vagrant-parallels/pull/450)]
15
+ - adding macos
16
+ [[GH-447](https://github.com/Parallels/vagrant-parallels/pull/447)]
17
+
18
+ ## 2.4.0 (May 22, 2023)
19
+ IMPROVEMENTS:
20
+ - Implement shared folder support for `.macvm` VMs
21
+ [[GH-448](https://github.com/Parallels/vagrant-parallels/pull/448)]
22
+
23
+ BUG FIXES:
24
+ - Fix shared folder mount error on `.macvm` VMs
25
+ [[GH-445](https://github.com/Parallels/vagrant-parallels/pull/445)]
26
+
27
+ ## 2.3.1 (March 23, 2023)
2
28
  BUG FIXES:
3
29
  - Fix the detection of VM IP. Wait for the IP to become available to
4
30
  avoid connection issues and Vagrant warnings.
5
31
  [[GH-440](https://github.com/Parallels/vagrant-parallels/issues/440)]
6
32
 
7
- ## 2.3.0 (March 22, 2022)
33
+ ## 2.3.0 (March 22, 2023)
8
34
  IMPROVEMENTS:
9
35
  - Support fetching the VM IP using prlctl
10
36
  [[GH-434](https://github.com/Parallels/vagrant-parallels/pull/434)].
@@ -4,7 +4,6 @@ module VagrantPlugins
4
4
  module Parallels
5
5
  module Action
6
6
  class Import
7
- include VagrantPlugins::Parallels::Util::Common
8
7
  @@lock = Mutex.new
9
8
 
10
9
  def initialize(app, env)
@@ -26,7 +25,7 @@ module VagrantPlugins
26
25
 
27
26
  # Linked clones are supported only for PD 11 and higher
28
27
  # Linked clones are not supported in macvms
29
- if env[:machine].provider_config.linked_clone and !is_macvm(env)
28
+ if env[:machine].provider_config.linked_clone and !Util::Common::is_macvm(env[:machine])
30
29
  # Linked clone creation should not be concurrent [GH-206]
31
30
  options[:snapshot_id] = env[:clone_snapshot_id]
32
31
  options[:linked] = true
@@ -6,7 +6,6 @@ module VagrantPlugins
6
6
  module Parallels
7
7
  module Action
8
8
  class PrepareCloneSnapshot
9
- include VagrantPlugins::Parallels::Util::Common
10
9
  @@lock = Mutex.new
11
10
 
12
11
  def initialize(app, env)
@@ -20,7 +19,7 @@ module VagrantPlugins
20
19
  return @app.call(env)
21
20
  end
22
21
 
23
- if is_macvm(env)
22
+ if Util::Common::is_macvm(env[:machine])
24
23
  #Ignore, since macvms doesn't support snapshot creation
25
24
  @logger.info('Snapshot creation is not supported yet for macOS ARM Guests, skip snapshot preparing')
26
25
  return @app.call(env)
@@ -4,7 +4,6 @@ module VagrantPlugins
4
4
  module Parallels
5
5
  module Action
6
6
  class SaneDefaults
7
- include VagrantPlugins::Parallels::Util::Common
8
7
 
9
8
  def initialize(app, env)
10
9
  @logger = Log4r::Logger.new('vagrant_parallels::action::sanedefaults')
@@ -30,7 +29,7 @@ module VagrantPlugins
30
29
 
31
30
  def default_settings
32
31
  # Options defined below are not supported for `*.macvm` VMs
33
- return {} if is_macvm(@env)
32
+ return {} if Util::Common::is_macvm(@env[:machine])
34
33
 
35
34
  {
36
35
  tools_autoupdate: 'no',
@@ -78,7 +78,26 @@ module VagrantPlugins
78
78
  # @return [String] UUID of the new VM.
79
79
  def clone_vm(src_name, options = {})
80
80
  dst_name = "vagrant_temp_#{(Time.now.to_f * 1000.0).to_i}_#{rand(100000)}"
81
+ src_vm = json { execute_prlctl('list', '--json', '-i', src_name) }.first
81
82
 
83
+ if options[:linked] || !Util::Common.is_apfs?(src_vm.fetch('Home'))
84
+ # If linked clone is an option, or path to src is not on APFS, then do the normal clone.
85
+ prlctl_clone_vm(src_name, dst_name, options)
86
+ else
87
+ # We can use clonefile on APFS to do a fast CoW clone of the VM source and then register
88
+ copy_clone_vm(src_name, dst_name, options)
89
+ end
90
+ read_vms[dst_name]
91
+ end
92
+
93
+ # Uses prlctl to clone an existing registered VM
94
+ #
95
+ # @param [String] src_name Name or UUID of the source VM or template.
96
+ # @param [String] dst_name Name of the destination VM.
97
+ # @param [<String => String>] options Options to clone virtual machine.
98
+ def prlctl_clone_vm(src_name, dst_name, options = {})
99
+ list_args = ['list', '--json', '-i', src_name]
100
+ src_vm = json { execute_prlctl(*list_args) }.first
82
101
  args = ['clone', src_name, '--name', dst_name]
83
102
  args.concat(['--dst', options[:dst]]) if options[:dst]
84
103
 
@@ -97,7 +116,41 @@ module VagrantPlugins
97
116
  yield $1.to_i if block_given?
98
117
  end
99
118
  end
100
- read_vms[dst_name]
119
+ end
120
+
121
+ # Uses cp with clonefile flag to clone an existing registered VM
122
+ #
123
+ # @param [String] src_name Name or UUID of the source VM or template.
124
+ # @param [String] dst_name Name of the destination VM.
125
+ # @param [<String => String>] options Options to clone virtual machine.
126
+ def copy_clone_vm(src_name, dst_name, options = {})
127
+ list_args = ['list', '--json', '-i', src_name]
128
+ src_vm = json { execute_prlctl(*list_args) }.first
129
+ basepath = File.dirname(src_vm.fetch('Home')).delete_suffix('/')
130
+ extension = File.basename(src_vm.fetch('Home')).delete_suffix('/').split('.').last
131
+ clonepath = File.join(ENV['HOME'], "Parallels", "#{dst_name}.#{extension}")
132
+ execute('cp', '-c', '-R', '-p', src_vm.fetch('Home'), clonepath)
133
+
134
+ # Update config.pvs with dst_name as this is what Parallels uses when registering
135
+ update_vm_name(File.join(clonepath, 'config.pvs'), dst_name)
136
+
137
+ # Register the cloned path as a new VM
138
+ args = ['register', clonepath]
139
+ # Regenerate SourceVmUuid of the cloned VM
140
+ args << '--regenerate-src-uuid' if options[:regenerate_src_uuid]
141
+
142
+ # Regenerate SourceVmUuid of the cloned VM
143
+ execute_prlctl(*args)
144
+
145
+ # Don't need the box hanging around in Parallels
146
+ execute_prlctl('unregister', src_name)
147
+ end
148
+
149
+ def update_vm_name(config_pvs_path, name)
150
+ xml = Nokogiri::XML(File.read(config_pvs_path))
151
+ elem = xml.at_xpath('//ParallelsVirtualMachine/Identification/VmName')
152
+ elem.content = name
153
+ File.write(config_pvs_path, xml.to_xml)
101
154
  end
102
155
 
103
156
  # Compacts the specified virtual disk image
@@ -103,6 +103,16 @@ module VagrantPlugins
103
103
  SyncedFolder
104
104
  end
105
105
 
106
+ synced_folder(:parallels_macvm) do
107
+ require_relative 'synced_folder_macvm'
108
+ SyncedFolderMacVM
109
+ end
110
+
111
+ synced_folder_capability(:parallels_macvm, "mount_name") do
112
+ require_relative "cap/mount_options"
113
+ SyncedFolderCap::MountOptions
114
+ end
115
+
106
116
  synced_folder_capability(:parallels, "mount_name") do
107
117
  require_relative "cap/mount_options"
108
118
  SyncedFolderCap::MountOptions
@@ -4,9 +4,10 @@ module VagrantPlugins
4
4
  module Parallels
5
5
  class SyncedFolder < Vagrant.plugin('2', :synced_folder)
6
6
  def usable?(machine, raise_errors=false)
7
- # These synced folders only work if the provider is Parallels
7
+ # These synced folders only work if the provider is Parallels and the guest is not *.macvm
8
8
  machine.provider_name == :parallels &&
9
- machine.provider_config.functional_psf
9
+ machine.provider_config.functional_psf &&
10
+ !Util::Common::is_macvm(machine)
10
11
  end
11
12
 
12
13
  def prepare(machine, folders, _opts)
@@ -0,0 +1,50 @@
1
+ require 'vagrant/util/platform'
2
+
3
+ module VagrantPlugins
4
+ module Parallels
5
+ class SyncedFolderMacVM < Vagrant.plugin('2', :synced_folder)
6
+ def usable?(machine, raise_errors=false)
7
+ # These synced folders only work if the provider is Parallels and the guest is *.macvm
8
+ machine.provider_name == :parallels && Util::Common::is_macvm(machine)
9
+ end
10
+
11
+ def prepare(machine, folders, _opts)
12
+ # Setup shared folder definitions in the VM config.
13
+ defs = []
14
+ folders.each do |id, data|
15
+ hostpath = data[:hostpath]
16
+ if !data[:hostpath_exact]
17
+ hostpath = Vagrant::Util::Platform.cygwin_windows_path(hostpath)
18
+ end
19
+
20
+ defs << {
21
+ name: data[:plugin].capability(:mount_name, id, data),
22
+ hostpath: hostpath.to_s,
23
+ }
24
+ end
25
+
26
+ driver(machine).share_folders(defs)
27
+ end
28
+
29
+ def enable(machine, folders, _opts)
30
+ # TBD: Synced folders for *.macvm are not implemented yet
31
+ return
32
+ end
33
+
34
+ def disable(machine, folders, _opts)
35
+ # Remove the shared folders from the VM metadata
36
+ names = folders.map { |id, data| data[:plugin].capability(:mount_name, id, data) }
37
+ driver(machine).unshare_folders(names)
38
+ end
39
+
40
+ def cleanup(machine, opts)
41
+ driver(machine).clear_shared_folders if machine.id && machine.id != ''
42
+ end
43
+
44
+ # This is here so that we can stub it for tests
45
+ def driver(machine)
46
+ machine.provider.driver
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,5 @@
1
+ require 'shellwords'
2
+
1
3
  module VagrantPlugins
2
4
  module Parallels
3
5
  module Util
@@ -5,10 +7,27 @@ module VagrantPlugins
5
7
 
6
8
  # Determines whether the VM's box contains a macOS guest for an Apple Silicon host.
7
9
  # In this case the image file ends with '.macvm' instead of '.pvm'
8
- def is_macvm(env)
9
- return !!Dir.glob(env[:machine].box.directory.join('*.macvm')).first
10
+ def self.is_macvm(machine)
11
+ return !machine.box.nil? && !!Dir.glob(machine.box.directory.join('*.macvm')).first
12
+ end
13
+
14
+ # Determines if the box directory is on an APFS filesystem
15
+ def self.is_apfs?(path, &block)
16
+ output = {stdout: '', stderr: ''}
17
+ df_command = %w[df -T apfs]
18
+ df_command << Shellwords.escape(path)
19
+ execute(*df_command, &block).exit_code == 0
10
20
  end
11
21
 
22
+ private
23
+
24
+ def self.execute(*command, &block)
25
+ command << { notify: [:stdout, :stderr] }
26
+
27
+ Vagrant::Util::Busy.busy(lambda {}) do
28
+ Vagrant::Util::Subprocess.execute(*command, &block)
29
+ end
30
+ end
12
31
  end
13
32
  end
14
33
  end
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Parallels
3
- VERSION = '2.3.1'
3
+ VERSION = '2.4.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: 2.3.1
4
+ version: 2.4.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: 2023-03-23 00:00:00.000000000 Z
12
+ date: 2023-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -142,6 +142,7 @@ files:
142
142
  - lib/vagrant-parallels/plugin.rb
143
143
  - lib/vagrant-parallels/provider.rb
144
144
  - lib/vagrant-parallels/synced_folder.rb
145
+ - lib/vagrant-parallels/synced_folder_macvm.rb
145
146
  - lib/vagrant-parallels/util/common.rb
146
147
  - lib/vagrant-parallels/util/compile_forwarded_ports.rb
147
148
  - lib/vagrant-parallels/util/unix_mount_helpers.rb
@@ -166,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
167
  - !ruby/object:Gem::Version
167
168
  version: 1.3.6
168
169
  requirements: []
169
- rubygems_version: 3.2.33
170
+ rubygems_version: 3.4.10
170
171
  signing_key:
171
172
  specification_version: 4
172
173
  summary: Parallels provider for Vagrant.