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  }