[lxc-devel] [lxd/master] Implement bridge.hwaddr

stgraber on Github lxc-bot at linuxcontainers.org
Wed Jul 25 16:25:01 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180725/84d14a82/attachment.bin>
-------------- next part --------------
From ee7a35d09e6f21bc39ee3930d0f4464da0027381 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 25 Jul 2018 12:20:11 -0400
Subject: [PATCH 1/2] tests: Fix race in network test
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 test/suites/network.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/suites/network.sh b/test/suites/network.sh
index 76a293248..d242d9560 100644
--- a/test/suites/network.sh
+++ b/test/suites/network.sh
@@ -30,9 +30,9 @@ test_network() {
 
   # rename network
   lxc network create lxdt$$
-  lxc network rename lxdt$$ newnet
+  lxc network rename lxdt$$ newnet$$
   lxc network list | grep -qv lxdt$$  # the old name is gone
-  lxc network delete newnet
+  lxc network delete newnet$$
 
   # Unconfigured bridge
   lxc network create lxdt$$ ipv4.address=none ipv6.address=none

From 30f1e3e8470f3d2987b96fb72b1ac2f870c6ca22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 25 Jul 2018 12:24:01 -0400
Subject: [PATCH 2/2] lxd/network: Add bridge.hwaddr config key
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #4828

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 doc/api-extensions.md   | 3 +++
 doc/networks.md         | 1 +
 lxd/networks.go         | 8 ++++++++
 lxd/networks_config.go  | 3 ++-
 scripts/bash/lxd-client | 2 +-
 shared/version/api.go   | 1 +
 test/suites/network.sh  | 2 ++
 7 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 5ea7aa802..244606c29 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -554,3 +554,6 @@ cpu-profile, memory-profile and print-goroutines debug options.
 
 ## proxy\_haproxy\_protocol
 Adds a proxy\_protocol key to the proxy device which controls the use of the HAProxy PROXY protocol header.
+
+## network\_hwaddr
+Adds a bridge.hwaddr key to control the MAC address of the bridge.
diff --git a/doc/networks.md b/doc/networks.md
index 2b29b7a0c..91ad0845e 100644
--- a/doc/networks.md
+++ b/doc/networks.md
@@ -23,6 +23,7 @@ Key                             | Type      | Condition             | Default
 :--                             | :--       | :--                   | :--                       | :--
 bridge.driver                   | string    | -                     | native                    | Bridge driver ("native" or "openvswitch")
 bridge.external\_interfaces     | string    | -                     | -                         | Comma separate list of unconfigured network interfaces to include in the bridge
+bridge.hwaddr                   | string    | -                     | -                         | MAC address for the bridge
 bridge.mode                     | string    | -                     | standard                  | Bridge operation mode ("standard" or "fan")
 bridge.mtu                      | integer   | -                     | 1500                      | Bridge MTU (default varies if tunnel or fan setup)
 dns.domain                      | string    | -                     | lxd                       | Domain to advertise to DHCP clients and use for DNS resolution
diff --git a/lxd/networks.go b/lxd/networks.go
index 26d3e4442..3dcce09b6 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -1046,6 +1046,14 @@ func (n *network) Start() error {
 		return err
 	}
 
+	// Set the MAC address
+	if n.config["bridge.hwaddr"] != "" {
+		_, err = shared.RunCommand("ip", "link", "set", "dev", n.name, "address", n.config["bridge.hwaddr"])
+		if err != nil {
+			return err
+		}
+	}
+
 	// Bring it up
 	_, err = shared.RunCommand("ip", "link", "set", "dev", n.name, "up")
 	if err != nil {
diff --git a/lxd/networks_config.go b/lxd/networks_config.go
index 5c79a9d86..5209b526f 100644
--- a/lxd/networks_config.go
+++ b/lxd/networks_config.go
@@ -26,7 +26,8 @@ var networkConfigKeys = map[string]func(value string) error{
 
 		return nil
 	},
-	"bridge.mtu": shared.IsInt64,
+	"bridge.hwaddr": shared.IsAny,
+	"bridge.mtu":    shared.IsInt64,
 	"bridge.mode": func(value string) error {
 		return shared.IsOneOf(value, []string{"standard", "fan"})
 	},
diff --git a/scripts/bash/lxd-client b/scripts/bash/lxd-client
index ceed02fa2..19eb19ef9 100644
--- a/scripts/bash/lxd-client
+++ b/scripts/bash/lxd-client
@@ -93,7 +93,7 @@ _have lxc && {
       user.network_mode user.user-data user.vendor-data"
 
     networks_keys="bridge.driver bridge.external_interfaces bridge.mode \
-      bridge.mtu dns.domain dns.mode fan.overlay_subnet fan.type \
+      bridge.mtu bridge.hwaddr dns.domain dns.mode fan.overlay_subnet fan.type \
       fan.underlay_subnet ipv4.address ipv4.dhcp ipv4.dhcp.expiry ipv4.dhcp.gateway \
       ipv4.dhcp.ranges ipv4.firewall ipv4.nat ipv4.routes ipv4.routing \
       ipv6.address ipv6.dhcp ipv6.dhcp.expiry ipv6.dhcp.ranges \
diff --git a/shared/version/api.go b/shared/version/api.go
index e843cb29a..374869945 100644
--- a/shared/version/api.go
+++ b/shared/version/api.go
@@ -116,6 +116,7 @@ var APIExtensions = []string{
 	"unix_priv_drop",
 	"pprof_http",
 	"proxy_haproxy_protocol",
+	"network_hwaddr",
 }
 
 // APIExtensionsCount returns the number of available API extensions.
diff --git a/test/suites/network.sh b/test/suites/network.sh
index d242d9560..fe1152ab7 100644
--- a/test/suites/network.sh
+++ b/test/suites/network.sh
@@ -11,6 +11,8 @@ test_network() {
   lxc network set lxdt$$ ipv4.routing false
   lxc network set lxdt$$ ipv6.routing false
   lxc network set lxdt$$ ipv6.dhcp.stateful true
+  lxc network set lxdt$$ bridge.hwaddr 00:11:22:33:44:55
+  [ "$(cat /sys/class/net/lxdt$$/address)" = "00:11:22:33:44:55" ]
 
   # validate unset and patch
   [ "$(lxc network get lxdt$$ ipv6.dhcp.stateful)" = "true" ]


More information about the lxc-devel mailing list