github.com/moby/docker@v26.1.3+incompatible/libnetwork/cnmallocator/provider.go (about) 1 package cnmallocator 2 3 import ( 4 "strings" 5 6 "github.com/docker/docker/libnetwork/driverapi" 7 "github.com/docker/docker/libnetwork/drivers/overlay/overlayutils" 8 "github.com/docker/docker/libnetwork/ipamapi" 9 "github.com/docker/docker/pkg/plugingetter" 10 "github.com/moby/swarmkit/v2/api" 11 "github.com/moby/swarmkit/v2/manager/allocator/networkallocator" 12 "google.golang.org/grpc/codes" 13 "google.golang.org/grpc/status" 14 ) 15 16 type Provider struct { 17 pg plugingetter.PluginGetter 18 } 19 20 var _ networkallocator.Provider = &Provider{} 21 22 // NewProvider returns a new cnmallocator provider. 23 func NewProvider(pg plugingetter.PluginGetter) *Provider { 24 return &Provider{pg: pg} 25 } 26 27 // ValidateIPAMDriver implements networkallocator.NetworkProvider. 28 func (p *Provider) ValidateIPAMDriver(driver *api.Driver) error { 29 if driver == nil { 30 // It is ok to not specify the driver. We will choose 31 // a default driver. 32 return nil 33 } 34 35 if driver.Name == "" { 36 return status.Errorf(codes.InvalidArgument, "driver name: if driver is specified name is required") 37 } 38 if strings.ToLower(driver.Name) == ipamapi.DefaultIPAM { 39 return nil 40 } 41 return p.validatePluginDriver(driver, ipamapi.PluginEndpointType) 42 } 43 44 // ValidateIngressNetworkDriver implements networkallocator.NetworkProvider. 45 func (p *Provider) ValidateIngressNetworkDriver(driver *api.Driver) error { 46 if driver != nil && driver.Name != "overlay" { 47 return status.Errorf(codes.Unimplemented, "only overlay driver is currently supported for ingress network") 48 } 49 return p.ValidateNetworkDriver(driver) 50 } 51 52 // ValidateNetworkDriver implements networkallocator.NetworkProvider. 53 func (p *Provider) ValidateNetworkDriver(driver *api.Driver) error { 54 if driver == nil { 55 // It is ok to not specify the driver. We will choose 56 // a default driver. 57 return nil 58 } 59 60 if driver.Name == "" { 61 return status.Errorf(codes.InvalidArgument, "driver name: if driver is specified name is required") 62 } 63 64 // First check against the known drivers 65 if IsBuiltInDriver(driver.Name) { 66 return nil 67 } 68 69 return p.validatePluginDriver(driver, driverapi.NetworkPluginEndpointType) 70 } 71 72 func (p *Provider) validatePluginDriver(driver *api.Driver, pluginType string) error { 73 if p.pg == nil { 74 return status.Errorf(codes.InvalidArgument, "plugin %s not supported", driver.Name) 75 } 76 77 plug, err := p.pg.Get(driver.Name, pluginType, plugingetter.Lookup) 78 if err != nil { 79 return status.Errorf(codes.InvalidArgument, "error during lookup of plugin %s", driver.Name) 80 } 81 82 if plug.IsV1() { 83 return status.Errorf(codes.InvalidArgument, "legacy plugin %s of type %s is not supported in swarm mode", driver.Name, pluginType) 84 } 85 86 return nil 87 } 88 89 func (p *Provider) SetDefaultVXLANUDPPort(port uint32) error { 90 return overlayutils.ConfigVXLANUDPPort(port) 91 }