Skip to content

Commit

Permalink
incusd/network: De-duplicate external interfaces validation
Browse files Browse the repository at this point in the history
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
  • Loading branch information
stgraber committed Oct 3, 2024
1 parent 29eb2a1 commit 270438a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 82 deletions.
45 changes: 4 additions & 41 deletions internal/server/network/driver_bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,47 +163,10 @@ func (n *bridge) Validate(config map[string]string) error {
"bgp.ipv4.nexthop": validate.Optional(validate.IsNetworkAddressV4),
"bgp.ipv6.nexthop": validate.Optional(validate.IsNetworkAddressV6),

"bridge.driver": validate.Optional(validate.IsOneOf("native", "openvswitch")),
"bridge.external_interfaces": validate.Optional(func(value string) error {
for _, entry := range strings.Split(value, ",") {
entry = strings.TrimSpace(entry)

// Test for extended configuration of external interface.
entryParts := strings.Split(entry, "/")
if len(entryParts) == 3 {
// The first part is the interface name.
entry = strings.TrimSpace(entryParts[0])
}

err := validate.IsInterfaceName(entry)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", entry, err)
}

if len(entryParts) == 3 {
// Check if the parent interface is valid.
parent := strings.TrimSpace(entryParts[1])
err := validate.IsInterfaceName(parent)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", parent, err)
}

// Check if the VLAN ID is valid.
vlanID, err := strconv.Atoi(entryParts[2])
if err != nil {
return fmt.Errorf("Invalid VLAN ID %q: %w", entryParts[2], err)
}

if vlanID < 1 || vlanID > 4094 {
return fmt.Errorf("Invalid VLAN ID %q", entryParts[2])
}
}
}

return nil
}),
"bridge.hwaddr": validate.Optional(validate.IsNetworkMAC),
"bridge.mtu": validate.Optional(validate.IsNetworkMTU),
"bridge.driver": validate.Optional(validate.IsOneOf("native", "openvswitch")),
"bridge.external_interfaces": validate.Optional(validateExternalInterfaces),
"bridge.hwaddr": validate.Optional(validate.IsNetworkMAC),
"bridge.mtu": validate.Optional(validate.IsNetworkMTU),

"ipv4.address": validate.Optional(func(value string) error {
if validate.IsOneOf("none", "auto")(value) == nil {
Expand Down
45 changes: 4 additions & 41 deletions internal/server/network/driver_ovn.go
Original file line number Diff line number Diff line change
Expand Up @@ -350,47 +350,10 @@ func (n *ovn) getExternalSubnetInUse(uplinkNetworkName string) ([]externalSubnet
// Validate network config.
func (n *ovn) Validate(config map[string]string) error {
rules := map[string]func(value string) error{
"network": validate.IsAny,
"bridge.hwaddr": validate.Optional(validate.IsNetworkMAC),
"bridge.mtu": validate.Optional(validate.IsNetworkMTU),
"bridge.external_interfaces": validate.Optional(func(value string) error {
for _, entry := range strings.Split(value, ",") {
entry = strings.TrimSpace(entry)

// Test for extended configuration of external interface.
entryParts := strings.Split(entry, "/")
if len(entryParts) == 3 {
// The first part is the interface name.
entry = strings.TrimSpace(entryParts[0])
}

err := validate.IsInterfaceName(entry)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", entry, err)
}

if len(entryParts) == 3 {
// Check if the parent interface is valid.
parent := strings.TrimSpace(entryParts[1])
err := validate.IsInterfaceName(parent)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", parent, err)
}

// Check if the VLAN ID is valid.
vlanID, err := strconv.Atoi(entryParts[2])
if err != nil {
return fmt.Errorf("Invalid VLAN ID %q: %w", entryParts[2], err)
}

if vlanID < 1 || vlanID > 4094 {
return fmt.Errorf("Invalid VLAN ID %q", entryParts[2])
}
}
}

return nil
}),
"network": validate.IsAny,
"bridge.hwaddr": validate.Optional(validate.IsNetworkMAC),
"bridge.mtu": validate.Optional(validate.IsNetworkMTU),
"bridge.external_interfaces": validate.Optional(validateExternalInterfaces),
"ipv4.address": validate.Optional(func(value string) error {
if validate.IsOneOf("none", "auto")(value) == nil {
return nil
Expand Down
39 changes: 39 additions & 0 deletions internal/server/network/network_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -1442,3 +1442,42 @@ func ProxyParseAddr(data string) (*deviceConfig.ProxyAddress, error) {

return newProxyAddr, nil
}

func validateExternalInterfaces(value string) error {
for _, entry := range strings.Split(value, ",") {
entry = strings.TrimSpace(entry)

// Test for extended configuration of external interface.
entryParts := strings.Split(entry, "/")
if len(entryParts) == 3 {
// The first part is the interface name.
entry = strings.TrimSpace(entryParts[0])
}

err := validate.IsInterfaceName(entry)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", entry, err)
}

if len(entryParts) == 3 {
// Check if the parent interface is valid.
parent := strings.TrimSpace(entryParts[1])
err := validate.IsInterfaceName(parent)
if err != nil {
return fmt.Errorf("Invalid interface name %q: %w", parent, err)
}

// Check if the VLAN ID is valid.
vlanID, err := strconv.Atoi(entryParts[2])
if err != nil {
return fmt.Errorf("Invalid VLAN ID %q: %w", entryParts[2], err)
}

if vlanID < 1 || vlanID > 4094 {
return fmt.Errorf("Invalid VLAN ID %q", entryParts[2])
}
}
}

return nil
}

0 comments on commit 270438a

Please sign in to comment.