diff --git a/lib/vagrant-parallels/driver/base.rb b/lib/vagrant-parallels/driver/base.rb index 326bd8f7..0156c1ee 100644 --- a/lib/vagrant-parallels/driver/base.rb +++ b/lib/vagrant-parallels/driver/base.rb @@ -434,11 +434,13 @@ 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', 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..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,8 +5,11 @@ class InstallParallelsTools def self.install_parallels_tools(machine) 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('darwin'), + 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 2d962917..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 @@ -8,8 +10,11 @@ def self.install_parallels_tools(machine) machine.communicate.sudo('ptiagent-cmd --install') else 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('linux'), + machine.provider.driver.read_guest_tools_iso_path("linux", arch), machine.env.root_path ) remote_file = '/tmp/prl-tools-lin.iso' diff --git a/test/unit/driver/base_test.rb b/test/unit/driver/base_test.rb new file mode 100644 index 00000000..3e8ecd45 --- /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