The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7721

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Introduces concept of "real" networks vs "virtual" networks, where the former is tied to one or more actual Linux network interfaces, and the latter is not. These "virtual" networks have much relaxed naming rules compared with their "real" counterparts.


From 1c0b92cfc7980fd46c75027bcc52daffae789356 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:56:00 +0100
Subject: [PATCH 1/9] lxd/network/network/utils: Renames ValidNetworkName to
 validRealNetworkName

- Clarifies error messages.
- Unexports.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/network_utils.go | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index ae2e4977d2..9ff38e8d45 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -30,26 +30,26 @@ import (
        "github.com/lxc/lxd/shared/logger"
 )
 
-// ValidNetworkName validates network name.
-func ValidNetworkName(value string) error {
+// validRealNetworkName validates a real network interface name.
+func validRealNetworkName(value string) error {
        // Not a veth-liked name
        if strings.HasPrefix(value, "veth") {
-               return fmt.Errorf("Interface name cannot be prefix with veth")
+               return fmt.Errorf("Network interface cannot be prefix with 
veth")
        }
 
        // Validate the length
        if len(value) < 2 {
-               return fmt.Errorf("Interface name is too short (minimum 2 
characters)")
+               return fmt.Errorf("Network interface is too short (minimum 2 
characters)")
        }
 
        if len(value) > 15 {
-               return fmt.Errorf("Interface name is too long (maximum 15 
characters)")
+               return fmt.Errorf("Network interface is too long (maximum 15 
characters)")
        }
 
        // Validate the character set
        match, _ := regexp.MatchString("^[-_a-zA-Z0-9.]*$", value)
        if !match {
-               return fmt.Errorf("Interface name contains invalid characters")
+               return fmt.Errorf("Network interface contains invalid 
characters")
        }
 
        return nil

From 9ded358c1cd98e3a5f097f78a038272f9f900c08 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:56:42 +0100
Subject: [PATCH 2/9] lxd/network/network/utils: Adds validVirtualNetworkName

For validating networks that do not have their own interface.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/network_utils.go | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 9ff38e8d45..db95a64ca3 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -55,6 +55,15 @@ func validRealNetworkName(value string) error {
        return nil
 }
 
+// validVirtualNetworkName validates a virtual network name (one that doesn't 
have an actual network interface).
+func validVirtualNetworkName(value string) error {
+       if strings.Contains(value, "/") {
+               return fmt.Errorf(`Network name cannot contain "\"`)
+       }
+
+       return nil
+}
+
 func networkValidPort(value string) error {
        if value == "" {
                return nil

From adb2fe40345428696227681effeac1f23cb70517 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:57:13 +0100
Subject: [PATCH 3/9] lxd/network/network/interfaces: Adds ValidateName

Signed-off-by: Thomas Parrott <thomas.parr...@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 514f3e4d1c..20e3ca5cdc 100644
--- a/lxd/network/network_interface.go
+++ b/lxd/network/network_interface.go
@@ -16,6 +16,7 @@ type Network interface {
        fillConfig(config map[string]string) error
 
        // Config.
+       ValidateName(name string) error
        Validate(config map[string]string) error
        Name() string
        Type() string

From a2f59616486acb805fcaa511b87b29fdf772c7f2 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:57:56 +0100
Subject: [PATCH 4/9] lxd/network/driver/bridge: Implements ValidateName

Also switches to use validRealNetworkName.

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

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 436d41d778..b7b85151d9 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -118,6 +118,11 @@ func (n *bridge) fillConfig(config map[string]string) 
error {
        return nil
 }
 
+// ValidateName validates network name.
+func (n *bridge) ValidateName(name string) error {
+       return validRealNetworkName(name)
+}
+
 // Validate network config.
 func (n *bridge) Validate(config map[string]string) error {
        // Build driver specific rules dynamically.
@@ -132,7 +137,7 @@ func (n *bridge) Validate(config map[string]string) error {
 
                        for _, entry := range strings.Split(value, ",") {
                                entry = strings.TrimSpace(entry)
-                               if err := ValidNetworkName(entry); err != nil {
+                               if err := validRealNetworkName(entry); err != 
nil {
                                        return errors.Wrapf(err, "Invalid 
interface name %q", entry)
                                }
                        }
@@ -255,7 +260,7 @@ func (n *bridge) Validate(config map[string]string) error {
                        case "id":
                                rules[k] = validate.Optional(validate.IsInt64)
                        case "inteface":
-                               rules[k] = ValidNetworkName
+                               rules[k] = validRealNetworkName
                        case "ttl":
                                rules[k] = validate.Optional(validate.IsUint8)
                        }

From aab6e4543ffe1e91e45283dc07994bc86a62d02e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:58:41 +0100
Subject: [PATCH 5/9] lxd/network/driver/macvlan: Implements ValidateName

Also switches to use validRealNetworkName for parent setting.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_macvlan.go | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/lxd/network/driver_macvlan.go b/lxd/network/driver_macvlan.go
index 549672049d..ec1ea681e6 100644
--- a/lxd/network/driver_macvlan.go
+++ b/lxd/network/driver_macvlan.go
@@ -3,8 +3,6 @@ package network
 import (
        "fmt"
 
-       "github.com/pkg/errors"
-
        "github.com/lxc/lxd/lxd/revert"
        "github.com/lxc/lxd/shared/api"
        log "github.com/lxc/lxd/shared/log15"
@@ -16,16 +14,15 @@ type macvlan struct {
        common
 }
 
+// ValidateName validates network name.
+func (n *macvlan) ValidateName(name string) error {
+       return validVirtualNetworkName(name)
+}
+
 // Validate network config.
 func (n *macvlan) Validate(config map[string]string) error {
        rules := map[string]func(value string) error{
-               "parent": func(value string) error {
-                       if err := ValidNetworkName(value); err != nil {
-                               return errors.Wrapf(err, "Invalid interface 
name %q", value)
-                       }
-
-                       return nil
-               },
+               "parent":           validRealNetworkName,
                "mtu":              validate.Optional(validate.IsInt64),
                "vlan":             validate.Optional(validate.IsNetworkVLAN),
                "maas.subnet.ipv4": validate.IsAny,

From 03e88399acdfbe5e84a04aa118aab2e3580a565c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:59:28 +0100
Subject: [PATCH 6/9] lxd/network/driver/sriov: Implements ValidateName

Also switches to use validRealNetworkName for parent setting.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_sriov.go | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/lxd/network/driver_sriov.go b/lxd/network/driver_sriov.go
index 87eb4f37e5..75ad8d6a0e 100644
--- a/lxd/network/driver_sriov.go
+++ b/lxd/network/driver_sriov.go
@@ -3,8 +3,6 @@ package network
 import (
        "fmt"
 
-       "github.com/pkg/errors"
-
        "github.com/lxc/lxd/lxd/revert"
        "github.com/lxc/lxd/shared/api"
        log "github.com/lxc/lxd/shared/log15"
@@ -16,16 +14,15 @@ type sriov struct {
        common
 }
 
+// ValidateName validates network name.
+func (n *sriov) ValidateName(name string) error {
+       return validVirtualNetworkName(name)
+}
+
 // Validate network config.
 func (n *sriov) Validate(config map[string]string) error {
        rules := map[string]func(value string) error{
-               "parent": func(value string) error {
-                       if err := ValidNetworkName(value); err != nil {
-                               return errors.Wrapf(err, "Invalid interface 
name %q", value)
-                       }
-
-                       return nil
-               },
+               "parent":           validRealNetworkName,
                "mtu":              validate.Optional(validate.IsInt64),
                "vlan":             validate.Optional(validate.IsNetworkVLAN),
                "maas.subnet.ipv4": validate.IsAny,

From 5fe77addd0358971b75a1a368b5c4c036ab1c12c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 17:59:53 +0100
Subject: [PATCH 7/9] lxd/network/network/load: Adds ValidateName helper
 function

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/network_load.go | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/lxd/network/network_load.go b/lxd/network/network_load.go
index 0990e30662..9ce8122d59 100644
--- a/lxd/network/network_load.go
+++ b/lxd/network/network_load.go
@@ -29,20 +29,34 @@ func LoadByName(s *state.State, name string) (Network, 
error) {
        return n, nil
 }
 
-// Validate validates the supplied network configuration for the specified 
network type.
+// ValidateName validates the supplied network name for the specified network 
type.
+func ValidateName(name string, netType string) error {
+       driverFunc, ok := drivers[netType]
+       if !ok {
+               return ErrUnknownDriver
+       }
+
+       n := driverFunc()
+       n.init(nil, 0, name, netType, "", nil, "Unknown")
+
+       return n.ValidateName(name)
+}
+
+// Validate validates the supplied network name and configuration for the 
specified network type.
 func Validate(name string, netType string, config map[string]string) error {
        driverFunc, ok := drivers[netType]
        if !ok {
                return ErrUnknownDriver
        }
 
-       err := ValidNetworkName(name)
+       n := driverFunc()
+       n.init(nil, 0, name, netType, "", config, "Unknown")
+
+       err := n.ValidateName(name)
        if err != nil {
                return err
        }
 
-       n := driverFunc()
-       n.init(nil, 0, name, netType, "", config, "Unknown")
        return n.Validate(config)
 }
 

From ce3637fb1c838d314900dd71d9a8158801209bfe Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 18:00:18 +0100
Subject: [PATCH 8/9] lxd/main/init/interactive: Switches to
 network.ValidateName for bridge validation

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/main_init_interactive.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/main_init_interactive.go b/lxd/main_init_interactive.go
index 7a6bacdf5a..493a3b62d9 100644
--- a/lxd/main_init_interactive.go
+++ b/lxd/main_init_interactive.go
@@ -351,7 +351,7 @@ func (c *cmdInit) askNetworking(config *cmdInitData, d 
lxd.InstanceServer) error
                net.Config = map[string]string{}
 
                // Network name
-               net.Name = cli.AskString("What should the new bridge be called? 
[default=lxdbr0]: ", "lxdbr0", network.ValidNetworkName)
+               net.Name = cli.AskString("What should the new bridge be called? 
[default=lxdbr0]: ", "lxdbr0", func(netName string) error { return 
network.ValidateName(netName, "bridge") })
                _, _, err := d.GetNetwork(net.Name)
                if err == nil {
                        fmt.Printf("The requested network bridge \"%s\" already 
exists. Please choose another name.\n", net.Name)

From b97b03191e3780611b29fbbd7ba9a4a92426fff0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Mon, 3 Aug 2020 18:00:44 +0100
Subject: [PATCH 9/9] lxd/networks: Switches to network.ValidateName

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

diff --git a/lxd/networks.go b/lxd/networks.go
index 5f892d3bcf..cee9c0ea68 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -111,11 +111,6 @@ func networksPost(d *Daemon, r *http.Request) 
response.Response {
                return response.BadRequest(fmt.Errorf("No name provided"))
        }
 
-       err = network.ValidNetworkName(req.Name)
-       if err != nil {
-               return response.BadRequest(err)
-       }
-
        if req.Type == "" {
                req.Type = "bridge"
        }
@@ -124,6 +119,11 @@ func networksPost(d *Daemon, r *http.Request) 
response.Response {
                req.Config = map[string]string{}
        }
 
+       err = network.ValidateName(req.Name, req.Type)
+       if err != nil {
+               return response.BadRequest(err)
+       }
+
        // Convert requested network type to DB type code.
        var dbNetType db.NetworkType
        switch req.Type {
@@ -611,7 +611,7 @@ func networkPost(d *Daemon, r *http.Request) 
response.Response {
                return response.BadRequest(fmt.Errorf("No name provided"))
        }
 
-       err = network.ValidNetworkName(req.Name)
+       err = network.ValidateName(req.Name, n.Type())
        if err != nil {
                return response.BadRequest(err)
        }
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to