[lxc-devel] [lxd/master] Network: Pushes FillConfig logic down into network driver

tomponline on Github lxc-bot at linuxcontainers.org
Thu Jul 16 16:07:39 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 517 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200716/782cfdb4/attachment.bin>
-------------- next part --------------
From 81b60574fd2ae82d6e94fd3f75dcb850e8c5c9ba Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 15:50:58 +0100
Subject: [PATCH 1/8] lxd/networks: Allow for different managed network types
 in doNetworkGet

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

diff --git a/lxd/networks.go b/lxd/networks.go
index bdaf20cdc9..4e114e2b41 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -391,13 +391,12 @@ func doNetworkGet(d *Daemon, name string) (api.Network, error) {
 	// Set the device type as needed
 	if osInfo != nil && shared.IsLoopback(osInfo) {
 		n.Type = "loopback"
-	} else if dbInfo != nil || shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bridge", n.Name)) {
-		if dbInfo != nil {
-			n.Managed = true
-			n.Description = dbInfo.Description
-			n.Config = dbInfo.Config
-		}
-
+	} else if dbInfo != nil {
+		n.Managed = true
+		n.Description = dbInfo.Description
+		n.Config = dbInfo.Config
+		n.Type = dbInfo.Type
+	} else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bridge", n.Name)) {
 		n.Type = "bridge"
 	} else if shared.PathExists(fmt.Sprintf("/proc/net/vlan/%s", n.Name)) {
 		n.Type = "vlan"

From a5048d0c890bb0da8f4e5f2cef1a852f05d1fd80 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:23:06 +0100
Subject: [PATCH 2/8] lxd/network/network/interface: Adds fillConfig to
 interface

Allows per-network driver type default config generation.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_interface.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/lxd/network/network_interface.go b/lxd/network/network_interface.go
index 46445b3310..9c2fd7424b 100644
--- a/lxd/network/network_interface.go
+++ b/lxd/network/network_interface.go
@@ -10,6 +10,7 @@ import (
 type Network interface {
 	// Load.
 	init(state *state.State, id int64, name string, netType string, description string, config map[string]string)
+	fillConfig(*api.NetworksPost) error
 
 	// Config.
 	Validate(config map[string]string) error

From 7468b3ec1ec9712a1641d76bf3558096341097f0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:30:45 +0100
Subject: [PATCH 3/8] lxd/network/driver/common: Adds default fillConfig
 function

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

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index 87c5a8720c..bcc8b6a96d 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -47,6 +47,11 @@ func (n *common) init(state *state.State, id int64, name string, netType string,
 	n.description = description
 }
 
+// fillConfig fills requested config with any default values, by default this is a no-op.
+func (n *common) fillConfig(req *api.NetworksPost) error {
+	return nil
+}
+
 // validationRules returns a map of config rules common to all drivers.
 func (n *common) validationRules() map[string]func(string) error {
 	return map[string]func(string) error{}

From 85c90ffa9e3452979dbcb1fa016c003e68a1231d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:33:37 +0100
Subject: [PATCH 4/8] lxd/network/driver/common: Adds default HandleHeartbeat
 function

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

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index bcc8b6a96d..7b0c4e3c91 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -310,3 +310,8 @@ func (n *common) delete(clusterNotification bool) error {
 
 	return nil
 }
+
+// HandleHeartbeat is a no-op.
+func (n *common) HandleHeartbeat(heartbeatData *cluster.APIHeartbeat) error {
+	return nil
+}

From 311bd7c0bfd7898c091ae5fb52e2940441490785 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:24:35 +0100
Subject: [PATCH 5/8] lxd/network/network/load: Adds per-driver FillConfig
 wrapper

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

diff --git a/lxd/network/network_load.go b/lxd/network/network_load.go
index afca5dd0e5..132e6933c5 100644
--- a/lxd/network/network_load.go
+++ b/lxd/network/network_load.go
@@ -2,6 +2,7 @@ package network
 
 import (
 	"github.com/lxc/lxd/lxd/state"
+	"github.com/lxc/lxd/shared/api"
 )
 
 var drivers = map[string]func() Network{
@@ -42,3 +43,27 @@ func Validate(name string, netType string, config map[string]string) error {
 	n.init(nil, 0, name, netType, "", config)
 	return n.Validate(config)
 }
+
+// FillConfig populates the supplied api.NetworkPost with automatically populated values.
+func FillConfig(req *api.NetworksPost) error {
+	driverFunc, ok := drivers[req.Type]
+	if !ok {
+		return ErrUnknownDriver
+	}
+
+	n := driverFunc()
+	n.init(nil, 0, req.Name, req.Type, req.Description, req.Config)
+
+	err := n.fillConfig(req)
+	if err != nil {
+		return err
+	}
+
+	// Replace "auto" by actual values.
+	err = fillAuto(req.Config)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

From fd5187b96011b21c93f907b34f8f7d14d11a6c8a Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:24:58 +0100
Subject: [PATCH 6/8] lxd/network/network/utils: Removes generic FillConfig

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 34 ----------------------------------
 1 file changed, 34 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 564a31980b..7f47cf77e4 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -459,40 +459,6 @@ func ForkdnsServersList(networkName string) ([]string, error) {
 	return servers, nil
 }
 
-// FillConfig populates the supplied api.NetworkPost with automatically populated values.
-func FillConfig(req *api.NetworksPost) error {
-	// Set some default values where needed
-	if req.Config["bridge.mode"] == "fan" {
-		if req.Config["fan.underlay_subnet"] == "" {
-			req.Config["fan.underlay_subnet"] = "auto"
-		}
-	} else {
-		if req.Config["ipv4.address"] == "" {
-			req.Config["ipv4.address"] = "auto"
-		}
-		if req.Config["ipv4.address"] == "auto" && req.Config["ipv4.nat"] == "" {
-			req.Config["ipv4.nat"] = "true"
-		}
-
-		if req.Config["ipv6.address"] == "" {
-			content, err := ioutil.ReadFile("/proc/sys/net/ipv6/conf/default/disable_ipv6")
-			if err == nil && string(content) == "0\n" {
-				req.Config["ipv6.address"] = "auto"
-			}
-		}
-		if req.Config["ipv6.address"] == "auto" && req.Config["ipv6.nat"] == "" {
-			req.Config["ipv6.nat"] = "true"
-		}
-	}
-
-	// Replace "auto" by actual values
-	err := fillAuto(req.Config)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
 func fillAuto(config map[string]string) error {
 	if config["ipv4.address"] == "auto" {
 		subnet, err := randomSubnetV4()

From 98778fe134cf0a436ce60ced75bae60b7aafc1e7 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:23:43 +0100
Subject: [PATCH 7/8] lxd/network/driver/bridge: fillConfig implementation

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

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 9de8f6bf6f..2fc3b4170b 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -41,6 +41,37 @@ type bridge struct {
 	common
 }
 
+// fillConfig fills requested config with any default values.
+func (n *bridge) fillConfig(req *api.NetworksPost) error {
+	// Set some default values where needed.
+	if req.Config["bridge.mode"] == "fan" {
+		if req.Config["fan.underlay_subnet"] == "" {
+			req.Config["fan.underlay_subnet"] = "auto"
+		}
+	} else {
+		if req.Config["ipv4.address"] == "" {
+			req.Config["ipv4.address"] = "auto"
+		}
+
+		if req.Config["ipv4.address"] == "auto" && req.Config["ipv4.nat"] == "" {
+			req.Config["ipv4.nat"] = "true"
+		}
+
+		if req.Config["ipv6.address"] == "" {
+			content, err := ioutil.ReadFile("/proc/sys/net/ipv6/conf/default/disable_ipv6")
+			if err == nil && string(content) == "0\n" {
+				req.Config["ipv6.address"] = "auto"
+			}
+		}
+
+		if req.Config["ipv6.address"] == "auto" && req.Config["ipv6.nat"] == "" {
+			req.Config["ipv6.nat"] = "true"
+		}
+	}
+
+	return nil
+}
+
 // Validate network config.
 func (n *bridge) Validate(config map[string]string) error {
 	// Build driver specific rules dynamically.

From 033cc963c848d44f6b505ccd984f653bc52e6778 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 16 Jul 2020 16:54:08 +0100
Subject: [PATCH 8/8] lxd/network/driver/bridge: Exposes error message from
 ValidNetworkName in Validate

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_bridge.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 2fc3b4170b..9160ccfeb3 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -86,8 +86,8 @@ func (n *bridge) Validate(config map[string]string) error {
 
 			for _, entry := range strings.Split(value, ",") {
 				entry = strings.TrimSpace(entry)
-				if ValidNetworkName(entry) != nil {
-					return fmt.Errorf("Invalid interface name '%s'", entry)
+				if err := ValidNetworkName(value); err != nil {
+					return errors.Wrapf(err, "Invalid interface name %q", value)
 				}
 			}
 


More information about the lxc-devel mailing list