[lxc-devel] [lxd/master] NIC Routed: Adds support for multiple interfaces

tomponline on Github lxc-bot at linuxcontainers.org
Mon Mar 9 16:28:46 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 497 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200309/a3c0cbad/attachment.bin>
-------------- next part --------------
From 8f7f45b72373cc9cf4a75b7a30fad442529af704 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 9 Mar 2020 16:14:20 +0000
Subject: [PATCH 1/5] doc/instances: Adds missing host_name key on routed nic
 device

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 doc/instances.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/doc/instances.md b/doc/instances.md
index e217700ab9..c01e6a1f58 100644
--- a/doc/instances.md
+++ b/doc/instances.md
@@ -462,6 +462,7 @@ Key                     | Type      | Default           | Required  | Descriptio
 :--                     | :--       | :--               | :--       | :--
 parent                  | string    | -                 | no        | The name of the host device to join the instance to
 name                    | string    | kernel assigned   | no        | The name of the interface inside the instance
+host\_name              | string    | randomly assigned | no        | The name of the interface inside the host
 mtu                     | integer   | parent MTU        | no        | The MTU of the new interface
 hwaddr                  | string    | randomly assigned | no        | The MAC address of the new interface
 ipv4.address            | string    | -                 | no        | Comma delimited list of IPv4 static addresses to add to the instance

From ce03803313e2f7548a392f5983dac7be8ec1cb90 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 9 Mar 2020 16:16:17 +0000
Subject: [PATCH 2/5] doc/instances: Documents ipv4.gateway and ipv6.gateway
 routed NIC keys

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 doc/instances.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/doc/instances.md b/doc/instances.md
index c01e6a1f58..c569b94784 100644
--- a/doc/instances.md
+++ b/doc/instances.md
@@ -466,7 +466,9 @@ host\_name              | string    | randomly assigned | no        | The name o
 mtu                     | integer   | parent MTU        | no        | The MTU of the new interface
 hwaddr                  | string    | randomly assigned | no        | The MAC address of the new interface
 ipv4.address            | string    | -                 | no        | Comma delimited list of IPv4 static addresses to add to the instance
+ipv4.gateway            | string    | auto              | no        | Whether to add an automatic default IPv4 gateway, can be "auto" or "none"
 ipv6.address            | string    | -                 | no        | Comma delimited list of IPv6 static addresses to add to the instance
+ipv6.gateway            | string    | auto              | no        | Whether to add an automatic default IPv6 gateway, can be "auto" or "none"
 vlan                    | integer   | -                 | no        | The VLAN ID to attach to
 
 #### bridged, macvlan or ipvlan for connection to physical network

From 41e4b48e73aaf54e10dcf1c8d1ea7e1cea907bf1 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 9 Mar 2020 16:16:40 +0000
Subject: [PATCH 3/5] lxd/device/device/utils/network: Adds NetworkValidGateway
 helper

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device_utils_network.go | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go
index a8850aa5c8..2a57e1be84 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -683,6 +683,15 @@ func NetworkValidNetworkV6List(value string) error {
 	return nil
 }
 
+// NetworkValidGateway validates the gateway value.
+func NetworkValidGateway(value string) error {
+	if shared.StringInSlice(value, []string{"none", "auto"}) {
+		return nil
+	}
+
+	return fmt.Errorf("Invalid gateway: %s")
+}
+
 // networkParsePortRange validates a port range in the form n-n.
 func networkParsePortRange(r string) (int64, int64, error) {
 	entries := strings.Split(r, "-")

From 8b94d9b0b2bf7398bf95c2e7f2d54738e50855b6 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 9 Mar 2020 16:17:32 +0000
Subject: [PATCH 4/5] lxd/device/nic: Adds ipv4.gateway and ipv6.gateway
 validation

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic.go | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/lxd/device/nic.go b/lxd/device/nic.go
index d33a8820a3..5cd0f70c5a 100644
--- a/lxd/device/nic.go
+++ b/lxd/device/nic.go
@@ -27,6 +27,7 @@ func nicLoadByType(c deviceConfig.Device) device {
 
 // nicValidationRules returns config validation rules for nic devices.
 func nicValidationRules(requiredFields []string, optionalFields []string) map[string]func(value string) error {
+
 	// Define a set of default validators for each field name.
 	defaultValidators := map[string]func(value string) error{
 		"name":                    shared.IsAny,
@@ -49,6 +50,8 @@ func nicValidationRules(requiredFields []string, optionalFields []string) map[st
 		"ipv4.routes":             NetworkValidNetworkV4List,
 		"ipv6.routes":             NetworkValidNetworkV6List,
 		"boot.priority":           shared.IsUint32,
+		"ipv4.gateway":            NetworkValidGateway,
+		"ipv6.gateway":            NetworkValidGateway,
 	}
 
 	validators := map[string]func(value string) error{}
@@ -94,3 +97,13 @@ func nicValidationRules(requiredFields []string, optionalFields []string) map[st
 
 	return validators
 }
+
+// nicHasAutoGateway takes the value of the "ipv4.gateway" or "ipv6.gateway" config keys and returns whether they
+// specify whether the gateway mode is automatic or not
+func nicHasAutoGateway(value string) bool {
+	if value == "" || value == "auto" {
+		return true
+	}
+
+	return false
+}

From 60eebc31e9d6b59f91fa5509f6c32cfafac7a2cd Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 9 Mar 2020 16:18:02 +0000
Subject: [PATCH 5/5] lxd/device/nic/routed: Adds support for not adding
 automatic default gateway

Uses ipv4.gateway=none or ipv6.gateway=none option respectively.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_routed.go | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/lxd/device/nic_routed.go b/lxd/device/nic_routed.go
index 8cca5851d9..e6ef7f50c7 100644
--- a/lxd/device/nic_routed.go
+++ b/lxd/device/nic_routed.go
@@ -37,6 +37,8 @@ func (d *nicRouted) validateConfig(instConf instance.ConfigReader) error {
 		"hwaddr",
 		"host_name",
 		"vlan",
+		"ipv4.gateway",
+		"ipv6.gateway",
 	}
 
 	rules := nicValidationRules(requiredFields, optionalFields)
@@ -214,8 +216,10 @@ func (d *nicRouted) Start() (*deviceConfig.RunConfig, error) {
 			nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv4.address", Value: fmt.Sprintf("%s/32", addr)})
 		}
 
-		// Use a fixed link-local address as the next-hop default gateway.
-		nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv4.gateway", Value: nicRoutedIPv4GW})
+		if nicHasAutoGateway(d.config["ipv4.gateway"]) {
+			// Use a fixed link-local address as the next-hop default gateway.
+			nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv4.gateway", Value: nicRoutedIPv4GW})
+		}
 	}
 
 	if d.config["ipv6.address"] != "" {
@@ -224,8 +228,10 @@ func (d *nicRouted) Start() (*deviceConfig.RunConfig, error) {
 			nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv6.address", Value: fmt.Sprintf("%s/128", addr)})
 		}
 
-		// Use a fixed link-local address as the next-hop default gateway.
-		nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv6.gateway", Value: nicRoutedIPv6GW})
+		if nicHasAutoGateway(d.config["ipv6.gateway"]) {
+			// Use a fixed link-local address as the next-hop default gateway.
+			nic = append(nic, deviceConfig.RunConfigItem{Key: "ipv6.gateway", Value: nicRoutedIPv6GW})
+		}
 	}
 
 	runConf.NetworkInterface = nic
@@ -273,14 +279,14 @@ func (d *nicRouted) postStart() error {
 	// inside the instance work and ensure that traffic doesn't periodically halt whilst ARP/NDP
 	// is re-detected.
 	if v["host_name"] != "" {
-		if d.config["ipv4.address"] != "" {
+		if d.config["ipv4.address"] != "" && nicHasAutoGateway(d.config["ipv4.gateway"]) {
 			_, err := shared.RunCommand("ip", "-4", "addr", "add", fmt.Sprintf("%s/32", nicRoutedIPv4GW), "dev", v["host_name"])
 			if err != nil {
 				return err
 			}
 		}
 
-		if d.config["ipv6.address"] != "" {
+		if d.config["ipv6.address"] != "" && nicHasAutoGateway(d.config["ipv6.gateway"]) {
 			_, err := shared.RunCommand("ip", "-6", "addr", "add", fmt.Sprintf("%s/128", nicRoutedIPv6GW), "dev", v["host_name"])
 			if err != nil {
 				return err


More information about the lxc-devel mailing list