| package cnmallocator | |
| import ( | |
| "strings" | |
| "github.com/docker/docker/libnetwork/driverapi" | |
| "github.com/docker/docker/libnetwork/drivers/overlay/overlayutils" | |
| "github.com/docker/docker/libnetwork/ipamapi" | |
| "github.com/docker/docker/libnetwork/ipams/defaultipam" | |
| "github.com/docker/docker/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) | |
| } |