mirror of
https://github.com/moby/moby.git
synced 2026-08-09 01:21:37 +00:00
If IPv6 is enabled for a bridge network, by the time configuration is applied, the bridge will always have an address. Assert that, by raising an error when the configuration is validated. Use that to simplify the logic used to calculate which addresses should be assigned to a bridge. Also remove a redundant check in setupGatewayIPv6() and the error associated with it. Fix unit tests that enabled IPv6, but didn't supply an IPv6 IPAM address/pool. Before this change, these tests passed but silently left the bridge without an IPv6 address. (The daemon already ensured there was an IPv6 address, this change does not add a new restriction on config at that level.) Signed-off-by: Rob Murray <rob.murray@docker.com>
202 lines
6.4 KiB
Go
202 lines
6.4 KiB
Go
//go:build linux
|
|
|
|
package bridge
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
// ErrConfigExists error is returned when driver already has a config applied.
|
|
type ErrConfigExists struct{}
|
|
|
|
func (ece *ErrConfigExists) Error() string {
|
|
return "configuration already exists, bridge configuration can be applied only once"
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (ece *ErrConfigExists) Forbidden() {}
|
|
|
|
// ErrInvalidDriverConfig error is returned when Bridge Driver is passed an invalid config
|
|
type ErrInvalidDriverConfig struct{}
|
|
|
|
func (eidc *ErrInvalidDriverConfig) Error() string {
|
|
return "Invalid configuration passed to Bridge Driver"
|
|
}
|
|
|
|
// ErrInvalidNetworkConfig error is returned when a network is created on a driver without valid config.
|
|
type ErrInvalidNetworkConfig struct{}
|
|
|
|
func (einc *ErrInvalidNetworkConfig) Error() string {
|
|
return "trying to create a network on a driver without valid config"
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (einc *ErrInvalidNetworkConfig) Forbidden() {}
|
|
|
|
// ErrInvalidEndpointConfig error is returned when an endpoint create is attempted with an invalid endpoint configuration.
|
|
type ErrInvalidEndpointConfig struct{}
|
|
|
|
func (eiec *ErrInvalidEndpointConfig) Error() string {
|
|
return "trying to create an endpoint with an invalid endpoint configuration"
|
|
}
|
|
|
|
// InvalidParameter denotes the type of this error
|
|
func (eiec *ErrInvalidEndpointConfig) InvalidParameter() {}
|
|
|
|
// ErrNetworkExists error is returned when a network already exists and another network is created.
|
|
type ErrNetworkExists struct{}
|
|
|
|
func (ene *ErrNetworkExists) Error() string {
|
|
return "network already exists, bridge can only have one network"
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (ene *ErrNetworkExists) Forbidden() {}
|
|
|
|
// ErrIfaceName error is returned when a new name could not be generated.
|
|
type ErrIfaceName struct{}
|
|
|
|
func (ein *ErrIfaceName) Error() string {
|
|
return "failed to find name for new interface"
|
|
}
|
|
|
|
// InternalError denotes the type of this error
|
|
func (ein *ErrIfaceName) InternalError() {}
|
|
|
|
// ErrNoIPAddr error is returned when bridge has no IPv4 address configured.
|
|
type ErrNoIPAddr struct{}
|
|
|
|
func (enip *ErrNoIPAddr) Error() string {
|
|
return "bridge has no IPv4 address configured"
|
|
}
|
|
|
|
// InternalError denotes the type of this error
|
|
func (enip *ErrNoIPAddr) InternalError() {}
|
|
|
|
// ErrInvalidGateway is returned when the user provided default gateway (v4/v6) is not not valid.
|
|
type ErrInvalidGateway struct{}
|
|
|
|
func (eig *ErrInvalidGateway) Error() string {
|
|
return "default gateway ip must be part of the network"
|
|
}
|
|
|
|
// InvalidParameter denotes the type of this error
|
|
func (eig *ErrInvalidGateway) InvalidParameter() {}
|
|
|
|
// ErrInvalidMtu is returned when the user provided MTU is not valid.
|
|
type ErrInvalidMtu int
|
|
|
|
func (eim ErrInvalidMtu) Error() string {
|
|
return fmt.Sprintf("invalid MTU number: %d", int(eim))
|
|
}
|
|
|
|
// InvalidParameter denotes the type of this error
|
|
func (eim ErrInvalidMtu) InvalidParameter() {}
|
|
|
|
// ErrUnsupportedAddressType is returned when the specified address type is not supported.
|
|
type ErrUnsupportedAddressType string
|
|
|
|
func (uat ErrUnsupportedAddressType) Error() string {
|
|
return fmt.Sprintf("unsupported address type: %s", string(uat))
|
|
}
|
|
|
|
// InvalidParameter denotes the type of this error
|
|
func (uat ErrUnsupportedAddressType) InvalidParameter() {}
|
|
|
|
// ActiveEndpointsError is returned when there are
|
|
// still active endpoints in the network being deleted.
|
|
type ActiveEndpointsError string
|
|
|
|
func (aee ActiveEndpointsError) Error() string {
|
|
return fmt.Sprintf("network %s has active endpoint", string(aee))
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (aee ActiveEndpointsError) Forbidden() {}
|
|
|
|
// InvalidNetworkIDError is returned when the passed
|
|
// network id for an existing network is not a known id.
|
|
type InvalidNetworkIDError string
|
|
|
|
func (inie InvalidNetworkIDError) Error() string {
|
|
return fmt.Sprintf("invalid network id %s", string(inie))
|
|
}
|
|
|
|
// NotFound denotes the type of this error
|
|
func (inie InvalidNetworkIDError) NotFound() {}
|
|
|
|
// InvalidEndpointIDError is returned when the passed
|
|
// endpoint id is not valid.
|
|
type InvalidEndpointIDError string
|
|
|
|
func (ieie InvalidEndpointIDError) Error() string {
|
|
return fmt.Sprintf("invalid endpoint id: %s", string(ieie))
|
|
}
|
|
|
|
// InvalidParameter denotes the type of this error
|
|
func (ieie InvalidEndpointIDError) InvalidParameter() {}
|
|
|
|
// EndpointNotFoundError is returned when the no endpoint
|
|
// with the passed endpoint id is found.
|
|
type EndpointNotFoundError string
|
|
|
|
func (enfe EndpointNotFoundError) Error() string {
|
|
return fmt.Sprintf("endpoint not found: %s", string(enfe))
|
|
}
|
|
|
|
// NotFound denotes the type of this error
|
|
func (enfe EndpointNotFoundError) NotFound() {}
|
|
|
|
// NonDefaultBridgeExistError is returned when a non-default
|
|
// bridge config is passed but it does not already exist.
|
|
type NonDefaultBridgeExistError string
|
|
|
|
func (ndbee NonDefaultBridgeExistError) Error() string {
|
|
return fmt.Sprintf("bridge device with non default name %s must be created manually", string(ndbee))
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (ndbee NonDefaultBridgeExistError) Forbidden() {}
|
|
|
|
// NonDefaultBridgeNeedsIPError is returned when a non-default
|
|
// bridge config is passed but it has no ip configured
|
|
type NonDefaultBridgeNeedsIPError string
|
|
|
|
func (ndbee NonDefaultBridgeNeedsIPError) Error() string {
|
|
return fmt.Sprintf("bridge device with non default name %s must have a valid IP address", string(ndbee))
|
|
}
|
|
|
|
// Forbidden denotes the type of this error
|
|
func (ndbee NonDefaultBridgeNeedsIPError) Forbidden() {}
|
|
|
|
// IPv4AddrAddError is returned when IPv4 address could not be added to the bridge.
|
|
type IPv4AddrAddError struct {
|
|
IP *net.IPNet
|
|
Err error
|
|
}
|
|
|
|
func (ipv4 *IPv4AddrAddError) Error() string {
|
|
return fmt.Sprintf("failed to add IPv4 address %s to bridge: %v", ipv4.IP, ipv4.Err)
|
|
}
|
|
|
|
// InternalError denotes the type of this error
|
|
func (ipv4 *IPv4AddrAddError) InternalError() {}
|
|
|
|
// IPv4AddrNoMatchError is returned when the bridge's IPv4 address does not match configured.
|
|
type IPv4AddrNoMatchError struct {
|
|
IP net.IP
|
|
CfgIP net.IP
|
|
}
|
|
|
|
func (ipv4 *IPv4AddrNoMatchError) Error() string {
|
|
return fmt.Sprintf("bridge IPv4 (%s) does not match requested configuration %s", ipv4.IP, ipv4.CfgIP)
|
|
}
|
|
|
|
// IPv6AddrNoMatchError is returned when the bridge's IPv6 address does not match configured.
|
|
type IPv6AddrNoMatchError net.IPNet
|
|
|
|
func (ipv6 *IPv6AddrNoMatchError) Error() string {
|
|
return fmt.Sprintf("bridge IPv6 addresses do not match the expected bridge configuration %s", (*net.IPNet)(ipv6).String())
|
|
}
|