[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1030987: bullseye-pu: package vagrant/2.2.14+dfsg-2



Package: release.debian.org
Severity: normal
Tags: bullseye
User: release.debian.org@packages.debian.org
Usertags: pu
X-Debbugs-Cc: vagrant@packages.debian.org
Control: affects -1 + src:vagrant

[ Reason ]
Since VirtualBox is not in stable, people will install it either from
upstream, and from Fasttrack (https://fasttrack.debian.net/). When a new
version of VirtualBox comes out, vagrant needs change to work with it.

[ Impact ]
stable users can't use vagrant with the latest VirtualBox (7.0).

[ Tests ]
The full testsuite passes, plus I got one real user to test on theur
system and confirm it works for them.

[ Risks ]
This is a direct cherry pick, with only 1 line change, from the upstream
patch that added VirtualBox 7.0 support. I don't see significant risk.

[ Checklist ]
  [x] *all* changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in (old)stable
  [x] the issue is verified as fixed in unstable

I also attached the actual patch so it's easier to read than the
diff-in-diff in the debdiff.

[ Changes ]
The patch adds a new driver for VirtualBox 7.0, plus unit tests for it.

[ Other info ]
n/a
diff --git a/debian/changelog b/debian/changelog
index fc3cfcf..a28263d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+vagrant (2.2.14+dfsg-2) bullseye; urgency=medium
+
+  * Add support for VirtualBox 7.0 (Closes: #1026227)
+
+ -- Antonio Terceiro <terceiro@debian.org>  Tue, 07 Feb 2023 10:33:52 +0100
+
 vagrant (2.2.14+dfsg-1) unstable; urgency=medium
 
   * New upstream version 2.2.14+dfsg
diff --git a/debian/patches/0007-Add-support-for-VirtualBox-7.0.patch b/debian/patches/0007-Add-support-for-VirtualBox-7.0.patch
new file mode 100644
index 0000000..431a3b5
--- /dev/null
+++ b/debian/patches/0007-Add-support-for-VirtualBox-7.0.patch
@@ -0,0 +1,264 @@
+From: Chris Roberts <croberts@hashicorp.com>
+Date: Fri, 14 Oct 2022 10:44:49 -0700
+Subject: Add support for VirtualBox 7.0
+
+Signed-off-by: Antonio Terceiro <terceiro@debian.org>
+Changes from the original patch:
+
+- replace `require "rexml"` with `require "rexml/document"` to work with with
+  the rexml shipped with Ruby 2.7
+
+---
+ lib/vagrant/errors.rb                              |   4 +
+ plugins/providers/virtualbox/driver/meta.rb        |   1 +
+ plugins/providers/virtualbox/driver/version_7_0.rb |  67 +++++++++++++
+ plugins/providers/virtualbox/plugin.rb             |   1 +
+ templates/locales/en.yml                           |   5 +
+ .../virtualbox/driver/version_7_0_test.rb          | 109 +++++++++++++++++++++
+ 6 files changed, 187 insertions(+)
+ create mode 100644 plugins/providers/virtualbox/driver/version_7_0.rb
+ create mode 100644 test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb
+
+diff --git a/lib/vagrant/errors.rb b/lib/vagrant/errors.rb
+index 782615b..4329d29 100644
+--- a/lib/vagrant/errors.rb
++++ b/lib/vagrant/errors.rb
+@@ -940,6 +940,10 @@ module Vagrant
+       error_key(:virtualbox_broken_version_040214)
+     end
+ 
++    class VirtualBoxConfigNotFound < VagrantError
++      error_key(:virtualbox_config_not_found)
++    end
++
+     class VirtualBoxDisksDefinedExceedLimit < VagrantError
+       error_key(:virtualbox_disks_defined_exceed_limit)
+     end
+diff --git a/plugins/providers/virtualbox/driver/meta.rb b/plugins/providers/virtualbox/driver/meta.rb
+index c3be8c8..04c130c 100644
+--- a/plugins/providers/virtualbox/driver/meta.rb
++++ b/plugins/providers/virtualbox/driver/meta.rb
+@@ -65,6 +65,7 @@ module VagrantPlugins
+             "5.2" => Version_5_2,
+             "6.0" => Version_6_0,
+             "6.1" => Version_6_1,
++            "7.0" => Version_7_0,
+           }
+ 
+           if @@version.start_with?("4.2.14")
+diff --git a/plugins/providers/virtualbox/driver/version_7_0.rb b/plugins/providers/virtualbox/driver/version_7_0.rb
+new file mode 100644
+index 0000000..d94e66b
+--- /dev/null
++++ b/plugins/providers/virtualbox/driver/version_7_0.rb
+@@ -0,0 +1,67 @@
++require "rexml/document"
++require File.expand_path("../version_6_1", __FILE__)
++
++module VagrantPlugins
++  module ProviderVirtualBox
++    module Driver
++      # Driver for VirtualBox 7.0.x
++      class Version_7_0 < Version_6_1
++        def initialize(uuid)
++          super
++
++          @logger = Log4r::Logger.new("vagrant::provider::virtualbox_7_0")
++        end
++
++        # The initial VirtualBox 7.0 release has an issue with displaying port
++        # forward information. When a single port forward is defined, the forwarding
++        # information can be found in the `showvminfo` output. Once more than a
++        # single port forward is defined, no forwarding information is provided
++        # in the `showvminfo` output. To work around this we grab the VM configuration
++        # file from the `showvminfo` output and extract the port forward information
++        # from there instead.
++        def read_forwarded_ports(uuid=nil, active_only=false)
++          @version ||= Meta.new.version
++
++          # Only use this override for the 7.0.0 release. If it is still broken
++          # on the 7.0.1 release we can modify the version check.
++          return super if @version != "7.0.0"
++
++          uuid ||= @uuid
++
++          @logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
++
++          results = []
++
++          info = execute("showvminfo", uuid, "--machinereadable", retryable: true)
++          result = info.match(/CfgFile="(?<path>.+?)"/)
++          if result.nil?
++            raise Vagrant::Errors::VirtualBoxConfigNotFound,
++                  uuid: uuid
++          end
++
++          File.open(result[:path], "r") do |f|
++            doc = REXML::Document.new(f)
++            networks = REXML::XPath.each(doc.root, "//Adapter")
++            networks.each do |net|
++              REXML::XPath.each(doc.root, net.xpath + "/NAT/Forwarding") do |fwd|
++                # Result Array values:
++                # [NIC Slot, Name, Host Port, Guest Port, Host IP]
++                result = [
++                  net.attribute("slot").value.to_i + 1,
++                  fwd.attribute("name")&.value.to_s,
++                  fwd.attribute("hostport")&.value.to_i,
++                  fwd.attribute("guestport")&.value.to_i,
++                  fwd.attribute("hostip")&.value.to_s
++                ]
++                @logger.debug(" - #{result.inspect}")
++                results << result
++              end
++            end
++          end
++
++          results
++        end
++      end
++    end
++  end
++end
+diff --git a/plugins/providers/virtualbox/plugin.rb b/plugins/providers/virtualbox/plugin.rb
+index ad48bd0..dbc1492 100644
+--- a/plugins/providers/virtualbox/plugin.rb
++++ b/plugins/providers/virtualbox/plugin.rb
+@@ -95,6 +95,7 @@ module VagrantPlugins
+       autoload :Version_5_2, File.expand_path("../driver/version_5_2", __FILE__)
+       autoload :Version_6_0, File.expand_path("../driver/version_6_0", __FILE__)
+       autoload :Version_6_1, File.expand_path("../driver/version_6_1", __FILE__)
++      autoload :Version_7_0, File.expand_path("../driver/version_7_0", __FILE__)
+     end
+ 
+     module Model
+diff --git a/templates/locales/en.yml b/templates/locales/en.yml
+index 782904f..c75c802 100644
+--- a/templates/locales/en.yml
++++ b/templates/locales/en.yml
+@@ -1693,6 +1693,11 @@ en:
+         4.2.14 contains a critical bug which prevents it from working with
+         Vagrant. VirtualBox 4.2.16+ fixes this problem. Please upgrade
+         VirtualBox.
++      virtualbox_config_not_found: |-
++        Vagrant was unable to locate the configuration file for the requested
++        VirtualBox VM. Verify the requested VM exists and try again.
++
++          UUID provided: %{uuid}
+       virtualbox_disks_controller_not_found: |-
+         Vagrant expected to find a storage controller called '%{name}',
+         but there is no controller with this name attached to the current VM.
+diff --git a/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb b/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb
+new file mode 100644
+index 0000000..58c9e6d
+--- /dev/null
++++ b/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb
+@@ -0,0 +1,109 @@
++require "stringio"
++require_relative "../base"
++
++describe VagrantPlugins::ProviderVirtualBox::Driver::Version_7_0 do
++  include_context "virtualbox"
++
++  let(:vbox_version) { "7.0.0" }
++
++  subject { VagrantPlugins::ProviderVirtualBox::Driver::Version_7_0.new(uuid) }
++
++  it_behaves_like "a version 5.x virtualbox driver"
++  it_behaves_like "a version 6.x virtualbox driver"
++
++  describe "#read_forwarded_ports" do
++    let(:uuid) { "MACHINE-UUID" }
++    let(:cfg_path) { "MACHINE_CONFIG_PATH" }
++    let(:vm_info) {
++%(name="vagrant-test_default_1665781960041_56631"
++Encryption:     disabled
++groups="/"
++ostype="Ubuntu (64-bit)"
++UUID="#{uuid}"
++CfgFile="#{cfg_path}"
++SnapFldr="/VirtualBox VMs/vagrant-test_default_1665781960041_56631/Snapshots"
++LogFldr="/VirtualBox VMs/vagrant-test_default_1665781960041_56631/Logs"
++memory=1024)
++    }
++    let(:config_file) {
++      StringIO.new(
++%(<?xml version="1.0"?>
++<VirtualBox xmlns="http://www.virtualbox.org/"; version="1.19-linux">
++  <Machine uuid="{623842dc-0947-4143-aa4e-7d180c5eb348}" name="vagrant-test_default_1665781960041_56631" OSType="Ubuntu_64" snapshotFolder="Snapshots">
++    <Hardware>
++      <Network>
++        <Adapter slot="0" enabled="true" MACAddress="080027BB1475" type="82540EM">
++          <NAT localhost-reachable="true">
++            <DNS use-proxy="true"/>
++            <Forwarding name="ssh" proto="1" hostip="127.0.0.1" hostport="2222" guestport="22"/>
++            <Forwarding name="tcp7700" proto="1" hostport="7700" guestport="80"/>
++          </NAT>
++        </Adapter>
++        <Adapter slot="1" enabled="true" MACAddress="080027DD5ADF" type="82540EM">
++          <DisabledModes>
++            <InternalNetwork name="intnet"/>
++            <NATNetwork name="NatNetwork"/>
++          </DisabledModes>
++          <HostOnlyInterface name="vboxnet0"/>
++        </Adapter>
++      </Network>
++    </Hardware>
++  </Machine>
++</VirtualBox>)
++      )
++    }
++
++    before do
++      allow_any_instance_of(VagrantPlugins::ProviderVirtualBox::Driver::Meta).to receive(:version).and_return(vbox_version)
++    end
++
++    describe "VirtualBox version 7.0.0" do
++      let(:vbox_version) { "7.0.0" }
++
++      before do
++        allow(subject).to receive(:execute).with("showvminfo", uuid, any_args).and_return(vm_info)
++        allow(File).to receive(:open).with(cfg_path, "r").and_yield(config_file)
++      end
++
++      it "should return two port forward values" do
++        expect(subject.read_forwarded_ports.size).to eq(2)
++      end
++
++      it "should have port forwards on slot one" do
++        subject.read_forwarded_ports.each do |fwd|
++          expect(fwd.first).to eq(1)
++        end
++      end
++
++      it "should include host ip for ssh forward" do
++        fwd = subject.read_forwarded_ports.detect { |f| f[1] == "ssh" }
++        expect(fwd).not_to be_nil
++        expect(fwd.last).to eq("127.0.0.1")
++      end
++
++      describe "when config file cannot be determine" do
++        let(:vm_info) { %(name="vagrant-test_default_1665781960041_56631") }
++
++        it "should raise a custom error" do
++          expect(File).not_to receive(:open).with(cfg_path, "r")
++
++          expect { subject.read_forwarded_ports }.to raise_error(Vagrant::Errors::VirtualBoxConfigNotFound)
++        end
++      end
++    end
++
++    describe "VirtualBox version greater than 7.0.0" do
++      let(:vbox_version) { "7.0.1" }
++
++      before do
++        allow(subject).to receive(:execute).with("showvminfo", uuid, any_args).and_return(vm_info)
++      end
++
++      it "should not read configuration file" do
++        expect(File).not_to receive(:open).with(cfg_path, "r")
++        subject.read_forwarded_ports
++      end
++    end
++
++  end
++end
diff --git a/debian/patches/series b/debian/patches/series
index 1950db9..0da9673 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@
 0005-Relax-dependency-resolution.patch
 0005-Skip-tests-that-require-winrm.patch
 0006-tests-fix-tests-to-work-against-installed-package.patch
+0007-Add-support-for-VirtualBox-7.0.patch
From: Chris Roberts <croberts@hashicorp.com>
Date: Fri, 14 Oct 2022 10:44:49 -0700
Subject: Add support for VirtualBox 7.0

Signed-off-by: Antonio Terceiro <terceiro@debian.org>
Changes from the original patch:

- replace `require "rexml"` with `require "rexml/document"` to work with with
  the rexml shipped with Ruby 2.7

---
 lib/vagrant/errors.rb                              |   4 +
 plugins/providers/virtualbox/driver/meta.rb        |   1 +
 plugins/providers/virtualbox/driver/version_7_0.rb |  67 +++++++++++++
 plugins/providers/virtualbox/plugin.rb             |   1 +
 templates/locales/en.yml                           |   5 +
 .../virtualbox/driver/version_7_0_test.rb          | 109 +++++++++++++++++++++
 6 files changed, 187 insertions(+)
 create mode 100644 plugins/providers/virtualbox/driver/version_7_0.rb
 create mode 100644 test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb

diff --git a/lib/vagrant/errors.rb b/lib/vagrant/errors.rb
index 782615b..4329d29 100644
--- a/lib/vagrant/errors.rb
+++ b/lib/vagrant/errors.rb
@@ -940,6 +940,10 @@ module Vagrant
       error_key(:virtualbox_broken_version_040214)
     end
 
+    class VirtualBoxConfigNotFound < VagrantError
+      error_key(:virtualbox_config_not_found)
+    end
+
     class VirtualBoxDisksDefinedExceedLimit < VagrantError
       error_key(:virtualbox_disks_defined_exceed_limit)
     end
diff --git a/plugins/providers/virtualbox/driver/meta.rb b/plugins/providers/virtualbox/driver/meta.rb
index c3be8c8..04c130c 100644
--- a/plugins/providers/virtualbox/driver/meta.rb
+++ b/plugins/providers/virtualbox/driver/meta.rb
@@ -65,6 +65,7 @@ module VagrantPlugins
             "5.2" => Version_5_2,
             "6.0" => Version_6_0,
             "6.1" => Version_6_1,
+            "7.0" => Version_7_0,
           }
 
           if @@version.start_with?("4.2.14")
diff --git a/plugins/providers/virtualbox/driver/version_7_0.rb b/plugins/providers/virtualbox/driver/version_7_0.rb
new file mode 100644
index 0000000..d94e66b
--- /dev/null
+++ b/plugins/providers/virtualbox/driver/version_7_0.rb
@@ -0,0 +1,67 @@
+require "rexml/document"
+require File.expand_path("../version_6_1", __FILE__)
+
+module VagrantPlugins
+  module ProviderVirtualBox
+    module Driver
+      # Driver for VirtualBox 7.0.x
+      class Version_7_0 < Version_6_1
+        def initialize(uuid)
+          super
+
+          @logger = Log4r::Logger.new("vagrant::provider::virtualbox_7_0")
+        end
+
+        # The initial VirtualBox 7.0 release has an issue with displaying port
+        # forward information. When a single port forward is defined, the forwarding
+        # information can be found in the `showvminfo` output. Once more than a
+        # single port forward is defined, no forwarding information is provided
+        # in the `showvminfo` output. To work around this we grab the VM configuration
+        # file from the `showvminfo` output and extract the port forward information
+        # from there instead.
+        def read_forwarded_ports(uuid=nil, active_only=false)
+          @version ||= Meta.new.version
+
+          # Only use this override for the 7.0.0 release. If it is still broken
+          # on the 7.0.1 release we can modify the version check.
+          return super if @version != "7.0.0"
+
+          uuid ||= @uuid
+
+          @logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
+
+          results = []
+
+          info = execute("showvminfo", uuid, "--machinereadable", retryable: true)
+          result = info.match(/CfgFile="(?<path>.+?)"/)
+          if result.nil?
+            raise Vagrant::Errors::VirtualBoxConfigNotFound,
+                  uuid: uuid
+          end
+
+          File.open(result[:path], "r") do |f|
+            doc = REXML::Document.new(f)
+            networks = REXML::XPath.each(doc.root, "//Adapter")
+            networks.each do |net|
+              REXML::XPath.each(doc.root, net.xpath + "/NAT/Forwarding") do |fwd|
+                # Result Array values:
+                # [NIC Slot, Name, Host Port, Guest Port, Host IP]
+                result = [
+                  net.attribute("slot").value.to_i + 1,
+                  fwd.attribute("name")&.value.to_s,
+                  fwd.attribute("hostport")&.value.to_i,
+                  fwd.attribute("guestport")&.value.to_i,
+                  fwd.attribute("hostip")&.value.to_s
+                ]
+                @logger.debug(" - #{result.inspect}")
+                results << result
+              end
+            end
+          end
+
+          results
+        end
+      end
+    end
+  end
+end
diff --git a/plugins/providers/virtualbox/plugin.rb b/plugins/providers/virtualbox/plugin.rb
index ad48bd0..dbc1492 100644
--- a/plugins/providers/virtualbox/plugin.rb
+++ b/plugins/providers/virtualbox/plugin.rb
@@ -95,6 +95,7 @@ module VagrantPlugins
       autoload :Version_5_2, File.expand_path("../driver/version_5_2", __FILE__)
       autoload :Version_6_0, File.expand_path("../driver/version_6_0", __FILE__)
       autoload :Version_6_1, File.expand_path("../driver/version_6_1", __FILE__)
+      autoload :Version_7_0, File.expand_path("../driver/version_7_0", __FILE__)
     end
 
     module Model
diff --git a/templates/locales/en.yml b/templates/locales/en.yml
index 782904f..c75c802 100644
--- a/templates/locales/en.yml
+++ b/templates/locales/en.yml
@@ -1693,6 +1693,11 @@ en:
         4.2.14 contains a critical bug which prevents it from working with
         Vagrant. VirtualBox 4.2.16+ fixes this problem. Please upgrade
         VirtualBox.
+      virtualbox_config_not_found: |-
+        Vagrant was unable to locate the configuration file for the requested
+        VirtualBox VM. Verify the requested VM exists and try again.
+
+          UUID provided: %{uuid}
       virtualbox_disks_controller_not_found: |-
         Vagrant expected to find a storage controller called '%{name}',
         but there is no controller with this name attached to the current VM.
diff --git a/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb b/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb
new file mode 100644
index 0000000..58c9e6d
--- /dev/null
+++ b/test/unit/plugins/providers/virtualbox/driver/version_7_0_test.rb
@@ -0,0 +1,109 @@
+require "stringio"
+require_relative "../base"
+
+describe VagrantPlugins::ProviderVirtualBox::Driver::Version_7_0 do
+  include_context "virtualbox"
+
+  let(:vbox_version) { "7.0.0" }
+
+  subject { VagrantPlugins::ProviderVirtualBox::Driver::Version_7_0.new(uuid) }
+
+  it_behaves_like "a version 5.x virtualbox driver"
+  it_behaves_like "a version 6.x virtualbox driver"
+
+  describe "#read_forwarded_ports" do
+    let(:uuid) { "MACHINE-UUID" }
+    let(:cfg_path) { "MACHINE_CONFIG_PATH" }
+    let(:vm_info) {
+%(name="vagrant-test_default_1665781960041_56631"
+Encryption:     disabled
+groups="/"
+ostype="Ubuntu (64-bit)"
+UUID="#{uuid}"
+CfgFile="#{cfg_path}"
+SnapFldr="/VirtualBox VMs/vagrant-test_default_1665781960041_56631/Snapshots"
+LogFldr="/VirtualBox VMs/vagrant-test_default_1665781960041_56631/Logs"
+memory=1024)
+    }
+    let(:config_file) {
+      StringIO.new(
+%(<?xml version="1.0"?>
+<VirtualBox xmlns="http://www.virtualbox.org/"; version="1.19-linux">
+  <Machine uuid="{623842dc-0947-4143-aa4e-7d180c5eb348}" name="vagrant-test_default_1665781960041_56631" OSType="Ubuntu_64" snapshotFolder="Snapshots">
+    <Hardware>
+      <Network>
+        <Adapter slot="0" enabled="true" MACAddress="080027BB1475" type="82540EM">
+          <NAT localhost-reachable="true">
+            <DNS use-proxy="true"/>
+            <Forwarding name="ssh" proto="1" hostip="127.0.0.1" hostport="2222" guestport="22"/>
+            <Forwarding name="tcp7700" proto="1" hostport="7700" guestport="80"/>
+          </NAT>
+        </Adapter>
+        <Adapter slot="1" enabled="true" MACAddress="080027DD5ADF" type="82540EM">
+          <DisabledModes>
+            <InternalNetwork name="intnet"/>
+            <NATNetwork name="NatNetwork"/>
+          </DisabledModes>
+          <HostOnlyInterface name="vboxnet0"/>
+        </Adapter>
+      </Network>
+    </Hardware>
+  </Machine>
+</VirtualBox>)
+      )
+    }
+
+    before do
+      allow_any_instance_of(VagrantPlugins::ProviderVirtualBox::Driver::Meta).to receive(:version).and_return(vbox_version)
+    end
+
+    describe "VirtualBox version 7.0.0" do
+      let(:vbox_version) { "7.0.0" }
+
+      before do
+        allow(subject).to receive(:execute).with("showvminfo", uuid, any_args).and_return(vm_info)
+        allow(File).to receive(:open).with(cfg_path, "r").and_yield(config_file)
+      end
+
+      it "should return two port forward values" do
+        expect(subject.read_forwarded_ports.size).to eq(2)
+      end
+
+      it "should have port forwards on slot one" do
+        subject.read_forwarded_ports.each do |fwd|
+          expect(fwd.first).to eq(1)
+        end
+      end
+
+      it "should include host ip for ssh forward" do
+        fwd = subject.read_forwarded_ports.detect { |f| f[1] == "ssh" }
+        expect(fwd).not_to be_nil
+        expect(fwd.last).to eq("127.0.0.1")
+      end
+
+      describe "when config file cannot be determine" do
+        let(:vm_info) { %(name="vagrant-test_default_1665781960041_56631") }
+
+        it "should raise a custom error" do
+          expect(File).not_to receive(:open).with(cfg_path, "r")
+
+          expect { subject.read_forwarded_ports }.to raise_error(Vagrant::Errors::VirtualBoxConfigNotFound)
+        end
+      end
+    end
+
+    describe "VirtualBox version greater than 7.0.0" do
+      let(:vbox_version) { "7.0.1" }
+
+      before do
+        allow(subject).to receive(:execute).with("showvminfo", uuid, any_args).and_return(vm_info)
+      end
+
+      it "should not read configuration file" do
+        expect(File).not_to receive(:open).with(cfg_path, "r")
+        subject.read_forwarded_ports
+      end
+    end
+
+  end
+end

Attachment: signature.asc
Description: PGP signature


Reply to: