package cnmallocator import ( "strings" "github.com/moby/moby/v2/daemon/libnetwork/driverapi" "github.com/moby/moby/v2/daemon/libnetwork/drivers/overlay/overlayutils" "github.com/moby/moby/v2/daemon/libnetwork/ipamapi" "github.com/moby/moby/v2/daemon/libnetwork/ipams/defaultipam" "github.com/moby/moby/v2/pkg/plugingetter" "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/manager/allocator/networkallocator" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type Provider struct { pg plugingetter.PluginGetter } var _ networkallocator.Provider = &Provider{} // NewProvider returns a new cnmallocator provider. func NewProvider(pg plugingetter.PluginGetter) *Provider { return &Provider{pg: pg} } // ValidateIPAMDriver implements networkallocator.NetworkProvider. func (p *Provider) ValidateIPAMDriver(driver *api.Driver) error { if driver == nil { // It is ok to not specify the driver. We will choose // a default driver. return nil } if driver.Name == "" { return status.Errorf(codes.InvalidArgument, "driver name: if driver is specified name is required") } if strings.ToLower(driver.Name) == defaultipam.DriverName { return nil } return p.validatePluginDriver(driver, ipamapi.PluginEndpointType) } // ValidateIngressNetworkDriver implements networkallocator.NetworkProvider. func (p *Provider) ValidateIngressNetworkDriver(driver *api.Driver) error { if driver != nil && driver.Name != "overlay" { return status.Errorf(codes.Unimplemented, "only overlay driver is currently supported for ingress network") } return p.ValidateNetworkDriver(driver) } // ValidateNetworkDriver implements networkallocator.NetworkProvider. func (p *Provider) ValidateNetworkDriver(driver *api.Driver) error { if driver == nil { // It is ok to not specify the driver. We will choose // a default driver. return nil } if driver.Name == "" { return status.Errorf(codes.InvalidArgument, "driver name: if driver is specified name is required") } // First check against the known drivers if IsBuiltInDriver(driver.Name) { return nil } return p.validatePluginDriver(driver, driverapi.NetworkPluginEndpointType) } func (p *Provider) validatePluginDriver(driver *api.Driver, pluginType string) error { if p.pg == nil { return status.Errorf(codes.InvalidArgument, "plugin %s not supported", driver.Name) } plug, err := p.pg.Get(driver.Name, pluginType, plugingetter.Lookup) if err != nil { return status.Errorf(codes.InvalidArgument, "error during lookup of plugin %s", driver.Name) } if plug.IsV1() { return status.Errorf(codes.InvalidArgument, "legacy plugin %s of type %s is not supported in swarm mode", driver.Name, pluginType) } return nil } func (p *Provider) SetDefaultVXLANUDPPort(port uint32) error { return overlayutils.ConfigVXLANUDPPort(port) }