[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