From 674aba120428530720a41c2a133b880d90e98500 Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Sun, 9 Jan 2022 21:54:19 -0700 Subject: [PATCH 1/6] Issue 401 Adds basic support manual support for ARM based macs --- lib/vagrant-parallels/config.rb | 4 ++++ lib/vagrant-parallels/driver/base.rb | 2 ++ .../guest_cap/darwin/install_parallels_tools.rb | 5 ++++- .../guest_cap/linux/install_parallels_tools.rb | 5 ++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-parallels/config.rb b/lib/vagrant-parallels/config.rb index bdf96bb0..c1450376 100644 --- a/lib/vagrant-parallels/config.rb +++ b/lib/vagrant-parallels/config.rb @@ -12,6 +12,7 @@ class Config < Vagrant.plugin('2', :config) attr_reader :network_adapters attr_accessor :regen_src_uuid attr_accessor :update_guest_tools + attr_accessor :guest_tools_arch # Compatibility with virtualbox provider's syntax alias :check_guest_additions= :check_guest_tools= @@ -27,6 +28,7 @@ def initialize @name = UNSET_VALUE @regen_src_uuid = UNSET_VALUE @update_guest_tools = UNSET_VALUE + @guest_tools_arch = UNSET_VALUE network_adapter(0, :shared) end @@ -81,6 +83,8 @@ def finalize! if @update_guest_tools == UNSET_VALUE @update_guest_tools = false end + + @guest_tools_arch = nil if @guest_tools_arch == UNSET_VALUE end def validate(machine) diff --git a/lib/vagrant-parallels/driver/base.rb b/lib/vagrant-parallels/driver/base.rb index 326bd8f7..1ad4fe47 100644 --- a/lib/vagrant-parallels/driver/base.rb +++ b/lib/vagrant-parallels/driver/base.rb @@ -438,7 +438,9 @@ def read_guest_tools_iso_path(guest_os) guest_os = guest_os.to_sym iso_name = { linux: 'prl-tools-lin.iso', + linux_arm: 'prl-tools-lin-arm.iso', darwin: 'prl-tools-mac.iso', + darwin_arm: 'prl-tools-mac-arm.iso', windows: 'PTIAgent.exe' } return nil unless iso_name[guest_os] diff --git a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb index 0097dabf..059dfff3 100644 --- a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb @@ -5,8 +5,11 @@ class InstallParallelsTools def self.install_parallels_tools(machine) machine.communicate.tap do |comm| + guest_os = 'darwin' + + (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '-arm' : '') + tools_iso_path = File.expand_path( - machine.provider.driver.read_guest_tools_iso_path('darwin'), + machine.provider.driver.read_guest_tools_iso_path(gues_os), machine.env.root_path ) remote_file = '/tmp/prl-tools-mac.iso' diff --git a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb index 2d962917..c1b83621 100644 --- a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb @@ -7,9 +7,12 @@ def self.install_parallels_tools(machine) if ptiagent_usable?(machine) machine.communicate.sudo('ptiagent-cmd --install') else + guest_os = 'linux' + + (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '-arm' : '') + machine.communicate.tap do |comm| tools_iso_path = File.expand_path( - machine.provider.driver.read_guest_tools_iso_path('linux'), + machine.provider.driver.read_guest_tools_iso_path(guest_os), machine.env.root_path ) remote_file = '/tmp/prl-tools-lin.iso' From 57db61b04ac0d25bc1567c7c52f1263b97e0a70d Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Mon, 17 Jan 2022 16:44:09 -0700 Subject: [PATCH 2/6] Issue 401 Matches the format of the _arm append to that defined in the tools definition --- .../guest_cap/darwin/install_parallels_tools.rb | 2 +- .../guest_cap/linux/install_parallels_tools.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb index 059dfff3..7b3346e0 100644 --- a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb @@ -6,7 +6,7 @@ class InstallParallelsTools def self.install_parallels_tools(machine) machine.communicate.tap do |comm| guest_os = 'darwin' + - (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '-arm' : '') + (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '_arm' : '') tools_iso_path = File.expand_path( machine.provider.driver.read_guest_tools_iso_path(gues_os), diff --git a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb index c1b83621..ece4f415 100644 --- a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb @@ -8,7 +8,7 @@ def self.install_parallels_tools(machine) machine.communicate.sudo('ptiagent-cmd --install') else guest_os = 'linux' + - (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '-arm' : '') + (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '_arm' : '') machine.communicate.tap do |comm| tools_iso_path = File.expand_path( From 97ae9f33a42b2a3864c4e54759703487207cbecb Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Sat, 12 Feb 2022 10:53:19 -0700 Subject: [PATCH 3/6] Issue #401 Makes the arch detection for darwin/linux automatic by asking the guest OS their arch --- lib/vagrant-parallels/driver/base.rb | 4 ++-- .../guest_cap/darwin/install_parallels_tools.rb | 8 ++++---- .../guest_cap/linux/install_parallels_tools.rb | 10 ++++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/vagrant-parallels/driver/base.rb b/lib/vagrant-parallels/driver/base.rb index 1ad4fe47..0156c1ee 100644 --- a/lib/vagrant-parallels/driver/base.rb +++ b/lib/vagrant-parallels/driver/base.rb @@ -434,8 +434,8 @@ def read_guest_ip # # @param [String] guest_os Guest os type: "linux", "darwin" or "windows" # @return [String] Path to the ISO. - def read_guest_tools_iso_path(guest_os) - guest_os = guest_os.to_sym + def read_guest_tools_iso_path(guest_os, arch=nil) + guest_os = (guest_os + (['arm', 'arm64', 'aarch64'].include?(arch.to_s.strip) ? '_arm' : '')).to_sym iso_name = { linux: 'prl-tools-lin.iso', linux_arm: 'prl-tools-lin-arm.iso', diff --git a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb index 7b3346e0..6d33441b 100644 --- a/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/darwin/install_parallels_tools.rb @@ -5,11 +5,11 @@ class InstallParallelsTools def self.install_parallels_tools(machine) machine.communicate.tap do |comm| - guest_os = 'darwin' + - (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '_arm' : '') - + arch = '' + comm.execute("uname -p") { |type, data| arch << data if type == :stdout } + tools_iso_path = File.expand_path( - machine.provider.driver.read_guest_tools_iso_path(gues_os), + machine.provider.driver.read_guest_tools_iso_path("darwin", arch), machine.env.root_path ) remote_file = '/tmp/prl-tools-mac.iso' diff --git a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb index ece4f415..88198562 100644 --- a/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb +++ b/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb @@ -1,3 +1,5 @@ +require 'log4r' + module VagrantPlugins module Parallels module GuestLinuxCap @@ -7,12 +9,12 @@ def self.install_parallels_tools(machine) if ptiagent_usable?(machine) machine.communicate.sudo('ptiagent-cmd --install') else - guest_os = 'linux' + - (['arm', 'arm64'].include?(machine.provider_config.guest_tools_arch) ? '_arm' : '') - machine.communicate.tap do |comm| + arch = '' + comm.execute("uname -p") { |type, data| arch << data if type == :stdout } + tools_iso_path = File.expand_path( - machine.provider.driver.read_guest_tools_iso_path(guest_os), + machine.provider.driver.read_guest_tools_iso_path("linux", arch), machine.env.root_path ) remote_file = '/tmp/prl-tools-lin.iso' From 6663410c7dab0caa6c3e49ab814d2ee2b3217a7a Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Sat, 19 Feb 2022 23:42:45 -0700 Subject: [PATCH 4/6] Issue #401 Removes unnecessary accessor guest_tools_arch which is now auto determined --- lib/vagrant-parallels/config.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/vagrant-parallels/config.rb b/lib/vagrant-parallels/config.rb index c1450376..bdf96bb0 100644 --- a/lib/vagrant-parallels/config.rb +++ b/lib/vagrant-parallels/config.rb @@ -12,7 +12,6 @@ class Config < Vagrant.plugin('2', :config) attr_reader :network_adapters attr_accessor :regen_src_uuid attr_accessor :update_guest_tools - attr_accessor :guest_tools_arch # Compatibility with virtualbox provider's syntax alias :check_guest_additions= :check_guest_tools= @@ -28,7 +27,6 @@ def initialize @name = UNSET_VALUE @regen_src_uuid = UNSET_VALUE @update_guest_tools = UNSET_VALUE - @guest_tools_arch = UNSET_VALUE network_adapter(0, :shared) end @@ -83,8 +81,6 @@ def finalize! if @update_guest_tools == UNSET_VALUE @update_guest_tools = false end - - @guest_tools_arch = nil if @guest_tools_arch == UNSET_VALUE end def validate(machine) From 938820b3a2d3fded147c64c2fe6d35b28afbbe8c Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Mon, 21 Feb 2022 18:21:59 -0700 Subject: [PATCH 5/6] Issue #401 Adding base_test rspec --- test/unit/driver/base_test.rb | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 test/unit/driver/base_test.rb diff --git a/test/unit/driver/base_test.rb b/test/unit/driver/base_test.rb new file mode 100644 index 00000000..accbc711 --- /dev/null +++ b/test/unit/driver/base_test.rb @@ -0,0 +1,68 @@ +require_relative '../base' + +require VagrantPlugins::Parallels.source_root.join('lib/vagrant-parallels/driver/base') + +describe VagrantPlugins::Parallels::Driver::Base do + include_context 'parallels' + before do + stub_const('Vagrant::Util::Subprocess', subprocess) + allow(subprocess).to receive(:execute). + with('mdfind', any_args). + and_return(subprocess_result(stdout: "/application.app")) + + allow(File).to receive(:exist?).with(any_args).and_return(true) + end + + describe 'read_guest_tools_iso_path' do + subject(:instance) { described_class.new uuid } + + it "reads `linux`:nil success" do + expect(instance.read_guest_tools_iso_path('linux')).to end_with('prl-tools-lin.iso') + end + it "reads `linux`:`x86_64` success" do + expect(instance.read_guest_tools_iso_path('linux', 'x86_64')).to end_with('prl-tools-lin.iso') + end + it "reads `linux`:`aarch64` success" do + expect(instance.read_guest_tools_iso_path('linux', 'aarch64')).to end_with('prl-tools-lin-arm.iso') + end + it "reads `linux`:`arm64` success" do + expect(instance.read_guest_tools_iso_path('linux', 'arm64')).to end_with('prl-tools-lin-arm.iso') + end + + it "reads `darwin`:nil success" do + expect(instance.read_guest_tools_iso_path('darwin')).to end_with('prl-tools-mac.iso') + end + it "reads `darwin`:`x86_64` success" do + expect(instance.read_guest_tools_iso_path('darwin', 'x86_64')).to end_with('prl-tools-mac.iso') + end + it "reads `darwin`:`aarch64` success" do + expect(instance.read_guest_tools_iso_path('darwin', 'aarch64')).to end_with('prl-tools-mac-arm.iso') + end + it "reads `darwin`:`arm64` success" do + expect(instance.read_guest_tools_iso_path('darwin', 'arm64')).to end_with('prl-tools-mac-arm.iso') + end + it "reads `darwin`:`arm` success" do + expect(instance.read_guest_tools_iso_path('darwin', 'arm')).to end_with('prl-tools-mac-arm.iso') + end + + it "reads `windows`:nil success" do + expect(instance.read_guest_tools_iso_path('windows')).to end_with('PTIAgent.exe') + end + it "reads `windows`:`x86_64` success" do + expect(instance.read_guest_tools_iso_path('windows')).to end_with('PTIAgent.exe') + end + it "reads `windows`:`aarch64` success" do + expect(instance.read_guest_tools_iso_path('windows')).to end_with('PTIAgent.exe') + end + + it "reads `unknown`:nil success" do + expect(instance.read_guest_tools_iso_path('unknown')).to eq(nil) + end + + it "reads `linux`:nil exception" do + VagrantPlugins::Parallels::Plugin.setup_i18n + allow(File).to receive(:exist?).and_return(false) + expect(instance.read_guest_tools_iso_path('linux')).to raise_exception + end + end +end From 5495f23bfa0039050b4a35b4f3608ee2341d6c45 Mon Sep 17 00:00:00 2001 From: Matt Stuart Date: Tue, 22 Feb 2022 11:26:08 -0700 Subject: [PATCH 6/6] Issue #401 Correcting the final unit test that catches the missing path exception --- test/unit/driver/base_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/driver/base_test.rb b/test/unit/driver/base_test.rb index accbc711..3e8ecd45 100644 --- a/test/unit/driver/base_test.rb +++ b/test/unit/driver/base_test.rb @@ -62,7 +62,7 @@ it "reads `linux`:nil exception" do VagrantPlugins::Parallels::Plugin.setup_i18n allow(File).to receive(:exist?).and_return(false) - expect(instance.read_guest_tools_iso_path('linux')).to raise_exception + expect { instance.read_guest_tools_iso_path('linux') }.to raise_exception end end end