From 62b7e3516904465f31b4a46a9993ebb4d58a9296 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Wed, 9 Oct 2019 09:56:59 -0700 Subject: [PATCH] Fixes #11094: Determine prefix for docker public networks Prior to this commit, the docker action was using the method `prefix` on an IPv4 and IPv6 address. This works fine for ruby versions 2.5 and newer, however the ruby shipped with Vagrant is before 2.5, and therefore the IPv4 and IPv6 classes do not have the prefix method, resulting in an error. This commit fixes that by using a different method of determining the prefix. --- plugins/providers/docker/action/prepare_networks.rb | 7 ++++--- .../providers/docker/action/prepare_networks_test.rb | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/providers/docker/action/prepare_networks.rb b/plugins/providers/docker/action/prepare_networks.rb index 4d1904e85..e52126f47 100644 --- a/plugins/providers/docker/action/prepare_networks.rb +++ b/plugins/providers/docker/action/prepare_networks.rb @@ -191,7 +191,8 @@ module VagrantPlugins base_opts[:opt] = "parent=#{bridge_interface.name}" subnet = IPAddr.new(bridge_interface.addr.ip_address << "/" << bridge_interface.netmask.ip_unpack.first) - base_opts[:subnet] = "#{subnet}/#{subnet.prefix}" + prefix = subnet.ipv4? ? 24 : 64 + base_opts[:subnet] = "#{subnet}/#{prefix}" subnet_addr = IPAddr.new(base_opts[:subnet]) base_opts[:driver] = "macvlan" base_opts[:gateway] = subnet_addr.succ.to_s @@ -282,7 +283,6 @@ module VagrantPlugins begin range = IPAddr.new(range) if !subnet.include?(range) - puts "we in here" env[:ui].warn(I18n.t( "docker_provider.network_bridge_iprange_outofbounds", subnet: network_options[:subnet], @@ -297,7 +297,8 @@ module VagrantPlugins range = nil end end - "#{range}/#{range.prefix}" + prefix = range.ipv4? ? 24 : 64 + "#{range}/#{prefix}" end # Execute the action diff --git a/test/unit/plugins/providers/docker/action/prepare_networks_test.rb b/test/unit/plugins/providers/docker/action/prepare_networks_test.rb index 095ca4335..039669417 100644 --- a/test/unit/plugins/providers/docker/action/prepare_networks_test.rb +++ b/test/unit/plugins/providers/docker/action/prepare_networks_test.rb @@ -305,7 +305,7 @@ describe VagrantPlugins::DockerProvider::Action::PrepareNetworks do describe "#process_public_network" do let(:options) { {:ip=>"172.30.130.2", :subnet=>"172.30.0.0/16", :driver=>"bridge", :id=>"30e017d5-488f-5a2f-a3ke-k8dce8246b60"} } - let(:ipaddr) { double("ipaddr", prefix: 22, succ: "10.1.10.2", ipv6?: false) } + let(:ipaddr) { double("ipaddr", prefix: 22, succ: "10.1.10.2", ipv4?: true, ipv6?: false) } it "raises an error if there are no network interfaces" do expect(subject).to receive(:list_interfaces).and_return([]) @@ -331,7 +331,7 @@ describe VagrantPlugins::DockerProvider::Action::PrepareNetworks do describe "#request_public_gateway" do let(:options) { {:ip=>"172.30.130.2", :subnet=>"172.30.0.0/16", :driver=>"bridge", :id=>"30e017d5-488f-5a2f-a3ke-k8dce8246b60"} } let(:ipaddr) { double("ipaddr", to_s: "172.30.130.2", prefix: 22, succ: "172.30.130.3", - ipv6?: false) } + ipv4?: true, ipv6?: false) } it "requests a gateway" do allow(IPAddr).to receive(:new).and_return(ipaddr) @@ -347,7 +347,7 @@ describe VagrantPlugins::DockerProvider::Action::PrepareNetworks do describe "#request_public_iprange" do let(:options) { {:ip=>"172.30.130.2", :subnet=>"172.30.0.0/16", :driver=>"bridge", :id=>"30e017d5-488f-5a2f-a3ke-k8dce8246b60"} } let(:ipaddr) { double("ipaddr", to_s: "172.30.100.2", prefix: 22, succ: "172.30.100.3", - ipv6?: false) } + ipv4?: true, ipv6?: false) } let(:subnet) { double("ipaddr", to_s: "172.30.130.2", prefix: 22, succ: "172.30.130.3", ipv6?: false) }