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