diff --git a/cmd/sand-agent/sand-agent.go b/cmd/sand-agent/sand-agent.go index c36954b3..e90770d0 100644 --- a/cmd/sand-agent/sand-agent.go +++ b/cmd/sand-agent/sand-agent.go @@ -13,9 +13,9 @@ import ( "github.com/Scalingo/go-etcd-lock/v5/lock" "github.com/Scalingo/go-handlers" - dockeripam "github.com/Scalingo/go-plugins-helpers/ipam" - dockernetwork "github.com/Scalingo/go-plugins-helpers/network" - dockersdk "github.com/Scalingo/go-plugins-helpers/sdk" + dockerpluginsipam "github.com/Scalingo/go-plugins-helpers/v2/ipam" + dockerpluginsnetwork "github.com/Scalingo/go-plugins-helpers/v2/network" + dockerpluginssdk "github.com/Scalingo/go-plugins-helpers/v2/sdk" "github.com/Scalingo/go-utils/graceful" "github.com/Scalingo/go-utils/logger" "github.com/Scalingo/go-utils/logger/plugins/rollbarplugin" @@ -130,10 +130,15 @@ func main() { plugin := docker.NewDockerPlugin( c, networkRepository, endpointRepository, dockerRepository, ipAllocator, ) - manifest := `{"Implements": ["NetworkDriver", "IpamDriver"]}` - dockerPluginRouter := dockersdk.NewHandler(log, manifest) - dockernetwork.ConfigureHandler(dockerPluginRouter, plugin.DockerNetworkPlugin) - dockeripam.ConfigureHandler(dockerPluginRouter, plugin.DockerIPAMPlugin) + manifest := dockerpluginssdk.Manifest{ + Implements: []dockerpluginssdk.DriverImplementationName{ + dockerpluginsnetwork.ImplementationName, + dockerpluginsipam.ImplementationName, + }, + } + dockerPluginRouter := dockerpluginssdk.NewHandler(log, manifest) + dockerpluginsnetwork.ConfigureHandler(dockerPluginRouter, plugin.DockerNetworkPlugin) + dockerpluginsipam.ConfigureHandler(dockerPluginRouter, plugin.DockerIPAMPlugin) err = docker.WritePluginSpecsOnDisk(ctx, c) if err != nil { diff --git a/go.mod b/go.mod index 19331264..cfffec1a 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,11 @@ module github.com/Scalingo/sand -go 1.25.0 +go 1.25.5 require ( github.com/Scalingo/go-etcd-lock/v5 v5.0.11 github.com/Scalingo/go-handlers v1.11.1 - github.com/Scalingo/go-plugins-helpers v1.4.0 + github.com/Scalingo/go-plugins-helpers/v2 v2.5.1 github.com/Scalingo/go-utils/etcd v1.2.2 github.com/Scalingo/go-utils/graceful v1.3.3 github.com/Scalingo/go-utils/logger v1.12.2 @@ -23,7 +23,7 @@ require ( go.etcd.io/etcd/api/v3 v3.6.10 go.etcd.io/etcd/client/v3 v3.6.10 go.uber.org/mock v0.6.0 - golang.org/x/sys v0.43.0 + golang.org/x/sys v0.44.0 google.golang.org/grpc v1.80.0 gopkg.in/errgo.v1 v1.0.1 ) @@ -41,7 +41,7 @@ require ( github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.7.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/docker/go-connections v0.7.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-logr/logr v1.4.3 // indirect @@ -51,7 +51,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/moby/sys/reexec v0.1.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rollbar/rollbar-go v1.4.8 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/urfave/negroni/v3 v3.1.1 // indirect diff --git a/go.sum b/go.sum index 1730c3bd..04352b6d 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,8 @@ github.com/Scalingo/go-etcd-lock/v5 v5.0.11 h1:WgiuwUUGwcmhYk/+crsK9QoTxtUoJObwt github.com/Scalingo/go-etcd-lock/v5 v5.0.11/go.mod h1:bc6kyqFtV9Fdk18SqrqeGd04m6qlTJleIebIazPD9Kw= github.com/Scalingo/go-handlers v1.11.1 h1:c1BnZe2EhCebIzfygoOmcl7iZlUdn5OYuG/4xdAddT8= github.com/Scalingo/go-handlers v1.11.1/go.mod h1:FP+IibVd+yWkSY9B+rzcIi629MMk/7kNfcEjIZUhMq4= -github.com/Scalingo/go-plugins-helpers v1.4.0 h1:TXysHoesEcH5Q4JBCo0prxWLFY0/yp2Q2WFBGa+Curo= -github.com/Scalingo/go-plugins-helpers v1.4.0/go.mod h1:pPivLa4FeG8iB0nff7NwI7gIZ4bMr62u/prYXktoWIo= +github.com/Scalingo/go-plugins-helpers/v2 v2.5.1 h1:UCjyKYXc6iJ0j+kyh1ocV7epgW/VGa0EPakZyGJC/X4= +github.com/Scalingo/go-plugins-helpers/v2 v2.5.1/go.mod h1:PLP/0axAGPxWBP6f8Q1cUNQ8ckHBHmm1iDvsqKcKv9Y= github.com/Scalingo/go-utils/crypto v1.1.1 h1:+F4JqC/8Lu8b1MDJwdQjT19yzLhShWPk+K93cUv7KVg= github.com/Scalingo/go-utils/crypto v1.1.1/go.mod h1:29dsjRaXxNI6tUG2ZbNWs4A5pqmwCAztdgfudGQDuhY= github.com/Scalingo/go-utils/errors/v2 v2.5.1 h1:1tfJW6/ZxTgrRmFTlKQCOtArQquOW0/XdZQzx8wMHoM= @@ -40,8 +40,9 @@ github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7 github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= github.com/docker/go-plugins-helpers v0.0.0-20240701071450-45e2431495c8 h1:IMfrF5LCzP2Vhw7j4IIH3HxPsCLuZYjDqFAM/C88ulg= @@ -91,8 +92,9 @@ github.com/moby/sys/reexec v0.1.0/go.mod h1:EqjBg8F3X7iZe5pU6nRZnYCMUTXoxsjiIfHu github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rollbar/rollbar-go v1.4.8 h1:SAKy97CHXSFZjxQUxmuBnQmfzCjX54kvQGEQZHEqwuQ= @@ -175,8 +177,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= diff --git a/integrations/docker/driver_ipam.go b/integrations/docker/driver_ipam.go index 8724b747..964d48d7 100644 --- a/integrations/docker/driver_ipam.go +++ b/integrations/docker/driver_ipam.go @@ -4,12 +4,13 @@ import ( "context" "net" - "github.com/Scalingo/go-plugins-helpers/ipam" + "github.com/pkg/errors" + + "github.com/Scalingo/go-plugins-helpers/v2/ipam" "github.com/Scalingo/go-utils/logger" "github.com/Scalingo/sand/api/types" "github.com/Scalingo/sand/ipallocator" "github.com/Scalingo/sand/network" - "github.com/pkg/errors" ) type dockerIPAMPlugin struct { @@ -31,12 +32,11 @@ func (p *dockerIPAMPlugin) GetDefaultAddressSpaces(context.Context) (*ipam.Addre } func (p *dockerIPAMPlugin) RequestPool(ctx context.Context, req *ipam.RequestPoolRequest) (*ipam.RequestPoolResponse, error) { - log := logger.Get(ctx) - id := req.Options["sand-id"] if id == "" { return nil, errors.New("IPAM option sand-id is mandatory") } + ctx, log := logger.WithFieldToCtx(ctx, "pool_id", id) network, ok, err := p.networkRepository.Exists(ctx, id) if err != nil { @@ -46,7 +46,7 @@ func (p *dockerIPAMPlugin) RequestPool(ctx context.Context, req *ipam.RequestPoo return nil, errors.Errorf("SAND network %v does not exist", id) } - log.Info("pool initialized") + log.Info("Pool initialized") res := ipam.RequestPoolResponse{ PoolID: id, Pool: network.IPRange, @@ -61,10 +61,9 @@ func (p *dockerIPAMPlugin) ReleasePool(ctx context.Context, req *ipam.ReleasePoo } func (p *dockerIPAMPlugin) RequestAddress(ctx context.Context, req *ipam.RequestAddressRequest) (*ipam.RequestAddressResponse, error) { - log := logger.Get(ctx) - log = log.WithField("pool_id", req.PoolID) + ctx, log := logger.WithFieldToCtx(ctx, "pool_id", req.PoolID) - if req.Options["RequestAddressType"] == "com.docker.network.gateway" { + if req.Options.RequestAddressType == ipam.RequestAddressTypeGateway { id := req.PoolID network, ok, err := p.networkRepository.Exists(ctx, id) if err != nil { @@ -85,16 +84,15 @@ func (p *dockerIPAMPlugin) RequestAddress(ctx context.Context, req *ipam.Request if err != nil { return nil, errors.Wrapf(err, "fail to request address in pool %v - %v", req.PoolID, req.Address) } - log.Infof("obtained address: %v", ip) + log.Infof("Obtained address: %v", ip) return &ipam.RequestAddressResponse{ Address: ip, }, nil } func (p *dockerIPAMPlugin) ReleaseAddress(ctx context.Context, req *ipam.ReleaseAddressRequest) error { - log := logger.Get(ctx) id := req.PoolID - log = log.WithField("pool_id", id) + ctx, log := logger.WithFieldToCtx(ctx, "pool_id", id) network, ok, err := p.networkRepository.Exists(ctx, id) if err != nil { @@ -118,6 +116,6 @@ func (p *dockerIPAMPlugin) ReleaseAddress(ctx context.Context, req *ipam.Release if err != nil { return errors.Wrapf(err, "fail to release address in pool %v - %v", id, req.Address) } - log.Infof("released address: %v", req.Address) + log.Infof("Released address: %v", req.Address) return nil } diff --git a/integrations/docker/driver_network.go b/integrations/docker/driver_network.go index 00dff59c..8e2fc846 100644 --- a/integrations/docker/driver_network.go +++ b/integrations/docker/driver_network.go @@ -6,7 +6,7 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" - "github.com/Scalingo/go-plugins-helpers/network" + "github.com/Scalingo/go-plugins-helpers/v2/network" "github.com/Scalingo/go-utils/logger" "github.com/Scalingo/sand/api/params" "github.com/Scalingo/sand/endpoint" @@ -30,17 +30,15 @@ func (p *dockerNetworkPlugin) CreateNetwork(ctx context.Context, req *network.Cr log := logger.Get(ctx) log.Info("Create network by docker integration") - opts, ok := req.Options["com.docker.network.generic"].(map[string]interface{}) - if !ok { - return errors.Errorf("invalid generic options: %+v, not a map[string]interface{}", req.Options["com.docker.network.generic"]) + if req.Options.Generic == nil { + return errors.New("generic options must be defined") } - id, ok := opts["sand-id"].(string) - if !ok { - return errors.New("sand-id should be a string") + id := req.Options.Generic["sand-id"] + if id == "" { + return errors.New("sand-id must be defined") } - log = log.WithField("network_id", id) - ctx = logger.ToCtx(ctx, log) + ctx, log = logger.WithFieldToCtx(ctx, "network_id", id) network, ok, err := p.networkRepository.Exists(ctx, id) if err != nil { @@ -66,8 +64,7 @@ func (p *dockerNetworkPlugin) AllocateNetwork(ctx context.Context, req *network. } func (p *dockerNetworkPlugin) DeleteNetwork(ctx context.Context, req *network.DeleteNetworkRequest) error { - log := logger.Get(ctx).WithField("docker_network_id", req.NetworkID) - ctx = logger.ToCtx(ctx, log) + ctx, log := logger.WithFieldToCtx(ctx, "docker_network_id", req.NetworkID) log.Info("Delete network by docker integration") dpn, err := p.dockerPluginRepository.GetNetworkByDockerID(ctx, req.NetworkID) @@ -75,8 +72,7 @@ func (p *dockerNetworkPlugin) DeleteNetwork(ctx context.Context, req *network.De return errors.Wrapf(err, "fail to get docker id binding") } - log = log.WithField("network_id", dpn.SandNetworkID) - ctx = logger.ToCtx(ctx, log) + ctx, log = logger.WithFieldToCtx(ctx, "network_id", dpn.SandNetworkID) network, ok, err := p.networkRepository.Exists(ctx, dpn.SandNetworkID) if err != nil { @@ -105,16 +101,15 @@ func (p *dockerNetworkPlugin) FreeNetwork(ctx context.Context, req *network.Free } func (p *dockerNetworkPlugin) CreateEndpoint(ctx context.Context, req *network.CreateEndpointRequest) (*network.CreateEndpointResponse, error) { - log := logger.Get(ctx).WithField("docker_network_id", req.NetworkID) - ctx = logger.ToCtx(ctx, log) + ctx, log := logger.WithFieldToCtx(ctx, "docker_network_id", req.NetworkID) log.Info("Create endpoint by docker integration") + dpn, err := p.dockerPluginRepository.GetNetworkByDockerID(ctx, req.NetworkID) if err != nil { return nil, errors.Wrapf(err, "fail to get docker id binding") } + ctx, _ = logger.WithFieldToCtx(ctx, "network_id", dpn.SandNetworkID) - log = log.WithField("network_id", dpn.SandNetworkID) - ctx = logger.ToCtx(ctx, log) n, ok, err := p.networkRepository.Exists(ctx, dpn.SandNetworkID) if err != nil { return nil, errors.Wrapf(err, "fail to get network %v", dpn.SandNetworkID) @@ -136,8 +131,7 @@ func (p *dockerNetworkPlugin) CreateEndpoint(ctx context.Context, req *network.C if err != nil { return nil, errors.Wrapf(err, "fail to create endpoint") } - log = log.WithField("endpoint_id", e.ID) - ctx = logger.ToCtx(ctx, log) + ctx, log = logger.WithFieldToCtx(ctx, "endpoint_id", e.ID) err = p.dockerPluginRepository.SaveEndpoint(ctx, DockerPluginEndpoint{ DockerPluginNetwork: dpn, @@ -159,7 +153,7 @@ func (p *dockerNetworkPlugin) CreateEndpoint(ctx context.Context, req *network.C } func (p *dockerNetworkPlugin) DeleteEndpoint(ctx context.Context, req *network.DeleteEndpointRequest) error { - log := logger.Get(ctx).WithField("docker_endpoint_id", req.EndpointID) + ctx, log := logger.WithFieldToCtx(ctx, "docker_endpoint_id", req.EndpointID) log.Info("Delete endpoint by docker integration") dpe, err := p.dockerPluginRepository.GetEndpointByDockerID(ctx, req.EndpointID) @@ -167,11 +161,10 @@ func (p *dockerNetworkPlugin) DeleteEndpoint(ctx context.Context, req *network.D return errors.Wrapf(err, "fail to get docker id binding") } - log = log.WithFields(logrus.Fields{ + ctx, log = logger.WithFieldsToCtx(ctx, logrus.Fields{ "endpoint_id": dpe.SandEndpointID, "network_id": dpe.SandNetworkID, }) - ctx = logger.ToCtx(ctx, log) n, ok, err := p.networkRepository.Exists(ctx, dpe.SandNetworkID) if err != nil { diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/LICENSE b/vendor/github.com/Scalingo/go-plugins-helpers/v2/LICENSE similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/LICENSE rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/LICENSE diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/NOTICE b/vendor/github.com/Scalingo/go-plugins-helpers/v2/NOTICE similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/NOTICE rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/NOTICE diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/ipam/README.md b/vendor/github.com/Scalingo/go-plugins-helpers/v2/ipam/README.md similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/ipam/README.md rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/ipam/README.md diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/ipam/api.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/ipam/api.go similarity index 75% rename from vendor/github.com/Scalingo/go-plugins-helpers/ipam/api.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/ipam/api.go index fc013895..884d9be4 100644 --- a/vendor/github.com/Scalingo/go-plugins-helpers/ipam/api.go +++ b/vendor/github.com/Scalingo/go-plugins-helpers/v2/ipam/api.go @@ -6,12 +6,13 @@ import ( "github.com/sirupsen/logrus" - "github.com/Scalingo/go-plugins-helpers/sdk" + "github.com/Scalingo/go-plugins-helpers/v2/sdk" "github.com/Scalingo/go-utils/logger" ) const ( - manifest = `{"Implements": ["IpamDriver"]}` + // ImplementationName is the name of the interface all IPAM plugins implement + ImplementationName sdk.DriverImplementationName = "IpamDriver" capabilitiesPath = "/IpamDriver.GetCapabilities" addressSpacesPath = "/IpamDriver.GetDefaultAddressSpaces" @@ -23,17 +24,18 @@ const ( // Ipam represent the interface a driver must fulfill. type Ipam interface { - GetCapabilities(context.Context) (*CapabilitiesResponse, error) - GetDefaultAddressSpaces(context.Context) (*AddressSpacesResponse, error) - RequestPool(context.Context, *RequestPoolRequest) (*RequestPoolResponse, error) - ReleasePool(context.Context, *ReleasePoolRequest) error - RequestAddress(context.Context, *RequestAddressRequest) (*RequestAddressResponse, error) - ReleaseAddress(context.Context, *ReleaseAddressRequest) error + GetCapabilities(ctx context.Context) (*CapabilitiesResponse, error) + GetDefaultAddressSpaces(ctx context.Context) (*AddressSpacesResponse, error) + RequestPool(ctx context.Context, req *RequestPoolRequest) (*RequestPoolResponse, error) + ReleasePool(ctx context.Context, req *ReleasePoolRequest) error + RequestAddress(ctx context.Context, req *RequestAddressRequest) (*RequestAddressResponse, error) + ReleaseAddress(ctx context.Context, req *ReleaseAddressRequest) error } // CapabilitiesResponse returns whether or not this IPAM required pre-made MAC type CapabilitiesResponse struct { - RequiresMACAddress bool + RequiresMACAddress bool + RequiresRequestReplay bool } // AddressSpacesResponse returns the default local and global address space names for this IPAM @@ -67,9 +69,19 @@ type ReleasePoolRequest struct { type RequestAddressRequest struct { PoolID string Address string - Options map[string]string + Options RequestAddressRequestOptions } +type RequestAddressRequestOptions struct { + RequestAddressType RequestAddressType `json:"RequestAddressType"` +} + +type RequestAddressType string + +const ( + RequestAddressTypeGateway RequestAddressType = "com.docker.network.gateway" +) + // RequestAddressResponse is formed with allocated address by IPAM type RequestAddressResponse struct { Address string @@ -82,16 +94,6 @@ type ReleaseAddressRequest struct { Address string } -// ErrorResponse is a formatted error message that libnetwork can understand -type ErrorResponse struct { - Err string -} - -// NewErrorResponse creates an ErrorResponse with the provided message -func NewErrorResponse(msg string) *ErrorResponse { - return &ErrorResponse{Err: msg} -} - // Handler forwards requests and responses between the docker daemon and the plugin. type Handler struct { ipam Ipam @@ -100,7 +102,9 @@ type Handler struct { // NewHandler initializes the request handler with a driver implementation. func NewHandler(logger logrus.FieldLogger, driver Ipam) *Handler { - h := &Handler{driver, sdk.NewHandler(logger, manifest)} + h := &Handler{driver, sdk.NewHandler(logger, sdk.Manifest{ + Implements: []sdk.DriverImplementationName{ImplementationName}, + })} h.initMux() return h } @@ -115,19 +119,17 @@ func (h *Handler) initMux() { h.HandleFunc(capabilitiesPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { res, err := h.ipam.GetCapabilities(r.Context()) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(addressSpacesPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { res, err := h.ipam.GetDefaultAddressSpaces(r.Context()) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(requestPoolPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -143,10 +145,9 @@ func (h *Handler) initMux() { })) res, err := h.ipam.RequestPool(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(releasePoolPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -160,10 +161,9 @@ func (h *Handler) initMux() { })) err = h.ipam.ReleasePool(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(requestAddressPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -178,10 +178,9 @@ func (h *Handler) initMux() { })) res, err := h.ipam.RequestAddress(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(releaseAddressPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -196,10 +195,9 @@ func (h *Handler) initMux() { })) err = h.ipam.ReleaseAddress(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) } diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/network/README.md b/vendor/github.com/Scalingo/go-plugins-helpers/v2/network/README.md similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/network/README.md rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/network/README.md diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/network/api.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/network/api.go similarity index 78% rename from vendor/github.com/Scalingo/go-plugins-helpers/network/api.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/network/api.go index 37c59344..d6315d4b 100644 --- a/vendor/github.com/Scalingo/go-plugins-helpers/network/api.go +++ b/vendor/github.com/Scalingo/go-plugins-helpers/v2/network/api.go @@ -7,16 +7,13 @@ import ( "github.com/sirupsen/logrus" - "github.com/Scalingo/go-plugins-helpers/sdk" + "github.com/Scalingo/go-plugins-helpers/v2/sdk" "github.com/Scalingo/go-utils/logger" ) const ( - manifest = `{"Implements": ["NetworkDriver"]}` - // LocalScope is the correct scope response for a local scope driver - LocalScope = `local` - // GlobalScope is the correct scope response for a global scope driver - GlobalScope = `global` + // ImplementationName is the name of the interface all network plugins implement + ImplementationName sdk.DriverImplementationName = "NetworkDriver" capabilitiesPath = "/NetworkDriver.GetCapabilities" allocateNetworkPath = "/NetworkDriver.AllocateNetwork" @@ -36,26 +33,38 @@ const ( // Driver represent the interface a driver must fulfill. type Driver interface { - GetCapabilities(context.Context) (*CapabilitiesResponse, error) - CreateNetwork(context.Context, *CreateNetworkRequest) error - AllocateNetwork(context.Context, *AllocateNetworkRequest) (*AllocateNetworkResponse, error) - DeleteNetwork(context.Context, *DeleteNetworkRequest) error - FreeNetwork(context.Context, *FreeNetworkRequest) error - CreateEndpoint(context.Context, *CreateEndpointRequest) (*CreateEndpointResponse, error) - DeleteEndpoint(context.Context, *DeleteEndpointRequest) error - EndpointInfo(context.Context, *InfoRequest) (*InfoResponse, error) - Join(context.Context, *JoinRequest) (*JoinResponse, error) - Leave(context.Context, *LeaveRequest) error - DiscoverNew(context.Context, *DiscoveryNotification) error - DiscoverDelete(context.Context, *DiscoveryNotification) error - ProgramExternalConnectivity(context.Context, *ProgramExternalConnectivityRequest) error - RevokeExternalConnectivity(context.Context, *RevokeExternalConnectivityRequest) error + // GetCapabilities returns the driver capabilities + // https://github.com/moby/moby/blob/master/libnetwork/docs/remote.md#set-capability + GetCapabilities(ctx context.Context) (*CapabilitiesResponse, error) + CreateNetwork(ctx context.Context, req *CreateNetworkRequest) error + AllocateNetwork(ctx context.Context, req *AllocateNetworkRequest) (*AllocateNetworkResponse, error) + DeleteNetwork(ctx context.Context, req *DeleteNetworkRequest) error + FreeNetwork(ctx context.Context, req *FreeNetworkRequest) error + CreateEndpoint(ctx context.Context, req *CreateEndpointRequest) (*CreateEndpointResponse, error) + DeleteEndpoint(ctx context.Context, req *DeleteEndpointRequest) error + EndpointInfo(ctx context.Context, req *InfoRequest) (*InfoResponse, error) + Join(ctx context.Context, req *JoinRequest) (*JoinResponse, error) + Leave(ctx context.Context, req *LeaveRequest) error + DiscoverNew(ctx context.Context, req *DiscoveryNotification) error + DiscoverDelete(ctx context.Context, req *DiscoveryNotification) error + ProgramExternalConnectivity(ctx context.Context, req *ProgramExternalConnectivityRequest) error + RevokeExternalConnectivity(ctx context.Context, req *RevokeExternalConnectivityRequest) error } +type CapabilitiesResponseScope string + +const ( + // LocalScope is the correct scope response for a local scope driver + LocalScope CapabilitiesResponseScope = "local" + // GlobalScope is the correct scope response for a global scope driver + GlobalScope CapabilitiesResponseScope = "global" +) + // CapabilitiesResponse returns whether or not this network is global or local type CapabilitiesResponse struct { - Scope string - ConnectivityScope string + Scope CapabilitiesResponseScope + ConnectivityScope CapabilitiesResponseScope + GwAllocChecker bool } // AllocateNetworkRequest requests allocation of new network by manager @@ -87,11 +96,17 @@ type FreeNetworkRequest struct { // CreateNetworkRequest is sent by the daemon when a network needs to be created type CreateNetworkRequest struct { NetworkID string - Options map[string]interface{} + Options CreateNetworkRequestOptions IPv4Data []*IPAMData IPv6Data []*IPAMData } +type CreateNetworkRequestOptions struct { + Generic map[string]string `json:"com.docker.network.generic"` + EnableIPv4 bool `json:"com.docker.network.enable_ipv4"` + EnableIPv6 bool `json:"com.docker.network.enable_ipv6"` +} + // IPAMData contains IPv4 or IPv6 addressing information type IPAMData struct { AddressSpace string @@ -179,11 +194,6 @@ type LeaveRequest struct { EndpointID string } -// ErrorResponse is a formatted error message that libnetwork can understand -type ErrorResponse struct { - Err string -} - // DiscoveryNotification is sent by the daemon when a new discovery event occurs type DiscoveryNotification struct { DiscoveryType int @@ -205,11 +215,6 @@ type RevokeExternalConnectivityRequest struct { EndpointID string } -// NewErrorResponse creates an ErrorResponse with the provided message -func NewErrorResponse(msg string) *ErrorResponse { - return &ErrorResponse{Err: msg} -} - // Handler forwards requests and responses between the docker daemon and the plugin. type Handler struct { driver Driver @@ -218,7 +223,9 @@ type Handler struct { // NewHandler initializes the request handler with a driver implementation. func NewHandler(logger logrus.FieldLogger, driver Driver) *Handler { - h := &Handler{driver, sdk.NewHandler(logger, manifest)} + h := &Handler{driver, sdk.NewHandler(logger, sdk.Manifest{ + Implements: []sdk.DriverImplementationName{ImplementationName}, + })} h.initMux() return h } @@ -233,15 +240,12 @@ func (h *Handler) initMux() { h.HandleFunc(capabilitiesPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { res, err := h.driver.GetCapabilities(r.Context()) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } if res == nil { - err := errors.New("Network driver must implement GetCapabilities") - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) - return err + return errors.New("network driver must implement GetCapabilities") } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(createNetworkPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -255,10 +259,9 @@ func (h *Handler) initMux() { })) err = h.driver.CreateNetwork(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(allocateNetworkPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -272,10 +275,9 @@ func (h *Handler) initMux() { })) res, err := h.driver.AllocateNetwork(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(deleteNetworkPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -289,10 +291,9 @@ func (h *Handler) initMux() { })) err = h.driver.DeleteNetwork(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(freeNetworkPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -306,10 +307,9 @@ func (h *Handler) initMux() { })) err = h.driver.FreeNetwork(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(createEndpointPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -324,10 +324,9 @@ func (h *Handler) initMux() { })) res, err := h.driver.CreateEndpoint(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(deleteEndpointPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -342,10 +341,9 @@ func (h *Handler) initMux() { })) err = h.driver.DeleteEndpoint(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(endpointInfoPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -360,10 +358,9 @@ func (h *Handler) initMux() { })) res, err := h.driver.EndpointInfo(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(joinPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -378,10 +375,9 @@ func (h *Handler) initMux() { })) res, err := h.driver.Join(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, res, false) + sdk.EncodeResponse(w, res) return nil }) h.HandleFunc(leavePath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -396,10 +392,9 @@ func (h *Handler) initMux() { })) err = h.driver.Leave(ctx, req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(discoverNewPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -410,10 +405,9 @@ func (h *Handler) initMux() { } err = h.driver.DiscoverNew(r.Context(), req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(discoverDeletePath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -424,10 +418,9 @@ func (h *Handler) initMux() { } err = h.driver.DiscoverDelete(r.Context(), req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(programExtConnPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -438,10 +431,9 @@ func (h *Handler) initMux() { } err = h.driver.ProgramExternalConnectivity(r.Context(), req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) h.HandleFunc(revokeExtConnPath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { @@ -452,10 +444,9 @@ func (h *Handler) initMux() { } err = h.driver.RevokeExternalConnectivity(r.Context(), req) if err != nil { - sdk.EncodeResponse(w, NewErrorResponse(err.Error()), true) return err } - sdk.EncodeResponse(w, struct{}{}, false) + sdk.EncodeResponse(w, struct{}{}) return nil }) } diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/encoder.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/encoder.go similarity index 63% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/encoder.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/encoder.go index 195812a4..e8204343 100644 --- a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/encoder.go +++ b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/encoder.go @@ -11,25 +11,22 @@ import ( const DefaultContentTypeV1_1 = "application/vnd.docker.plugins.v1.1+json" // DecodeRequest decodes an http request into a given structure. -func DecodeRequest(w http.ResponseWriter, r *http.Request, req interface{}) (err error) { - if err = json.NewDecoder(r.Body).Decode(req); err != nil { +func DecodeRequest(w http.ResponseWriter, r *http.Request, req any) error { + err := json.NewDecoder(r.Body).Decode(req) + if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) + return err } - return + return nil } // EncodeResponse encodes the given structure into an http response. -func EncodeResponse(w http.ResponseWriter, res interface{}, err bool) { - w.Header().Set("Content-Type", DefaultContentTypeV1_1) - if err { - w.WriteHeader(http.StatusInternalServerError) - } +func EncodeResponse(w http.ResponseWriter, res any) { json.NewEncoder(w).Encode(res) } // StreamResponse streams a response object to the client func StreamResponse(w http.ResponseWriter, data io.ReadCloser) { - w.Header().Set("Content-Type", DefaultContentTypeV1_1) if _, err := copyBuf(w, data); err != nil { fmt.Printf("ERROR in stream: %v\n", err) } diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/handler.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/handler.go similarity index 78% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/handler.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/handler.go index 02b0a2a2..9475e638 100644 --- a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/handler.go +++ b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/handler.go @@ -2,7 +2,6 @@ package sdk import ( "crypto/tls" - "fmt" "net" "net/http" "os" @@ -20,14 +19,22 @@ type Handler struct { mux *handlers.Router } +type DriverImplementationName string + +type Manifest struct { + Implements []DriverImplementationName `json:"Implements"` +} + // NewHandler creates a new Handler with an http mux. -func NewHandler(logger logrus.FieldLogger, manifest string) Handler { +// It configures a single default route for the plugin activation and adds a bunch of middlewares. +func NewHandler(logger logrus.FieldLogger, manifest Manifest) Handler { mux := handlers.NewRouter(logger) mux.Use(handlers.ErrorMiddleware) + mux.Use(errorMiddleware) + mux.Use(contentTypeMiddleware) mux.HandleFunc(activatePath, func(w http.ResponseWriter, r *http.Request, p map[string]string) error { - w.Header().Set("Content-Type", DefaultContentTypeV1_1) - fmt.Fprintln(w, manifest) + EncodeResponse(w, manifest) return nil }) @@ -92,6 +99,12 @@ func (h Handler) ServeWindows(addr, pluginName, daemonDir string, pipeConfig *Wi return h.Serve(l) } +// Use adds a middleware at the beginning of the middleware stack. The lastly added middleware is called first. +// All the middlewares MUST wrap the `http.ResponseWriter` into a `negroni.ResponseWriter` so that one can call `ResponseWriter.Status()` and `ResponseWriter.Size()` in the various middlewares. +func (h Handler) Use(m handlers.Middleware) { + h.mux.Use(m) +} + // HandleFunc registers a function to handle a request path with. func (h Handler) HandleFunc(path string, fn handlers.HandlerFunc) { h.mux.HandleFunc(path, fn) diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/middlewares.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/middlewares.go new file mode 100644 index 00000000..d6cddd86 --- /dev/null +++ b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/middlewares.go @@ -0,0 +1,46 @@ +package sdk + +import ( + "encoding/json" + "net/http" + + "github.com/urfave/negroni/v3" + + "github.com/Scalingo/go-handlers" +) + +// contentTypeMiddleware sets the HTTP header `Content-Type` to the content type accepted and sent by Docker plugins +var contentTypeMiddleware = handlers.MiddlewareFunc(func(handler handlers.HandlerFunc) handlers.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request, vars map[string]string) error { + rw := negroni.NewResponseWriter(w) + rw.Header().Set("Content-Type", DefaultContentTypeV1_1) + return handler(rw, r, vars) + } +}) + +// ErrorResponse is a formatted error message that Docker can understand +type ErrorResponse struct { + Err string +} + +// NewErrorResponse creates an ErrorResponse with the provided error +func NewErrorResponse(err error) ErrorResponse { + return ErrorResponse{Err: err.Error()} +} + +// errorMiddleware encodes in JSON the error returned by the handler to the HTTP request body +var errorMiddleware = handlers.MiddlewareFunc(func(handler handlers.HandlerFunc) handlers.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request, vars map[string]string) error { + rw := negroni.NewResponseWriter(w) + err := handler(rw, r, vars) + if err != nil { + if rw.Status() == 0 { + rw.WriteHeader(http.StatusInternalServerError) + } + json.NewEncoder(rw).Encode(NewErrorResponse(err)) + return err + } + + return nil + } +}) diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/pool.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/pool.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/pool.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/pool.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/spec_file_generator.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/spec_file_generator.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/spec_file_generator.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/spec_file_generator.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/tcp_listener.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/tcp_listener.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/tcp_listener.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/tcp_listener.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_nosystemd.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_nosystemd.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_nosystemd.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_nosystemd.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_systemd.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_systemd.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_systemd.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_systemd.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_unsupported.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_unsupported.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/unix_listener_unsupported.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/unix_listener_unsupported.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_listener.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_listener.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_listener.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_listener.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_listener_unsupported.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_listener_unsupported.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_listener_unsupported.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_listener_unsupported.go diff --git a/vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_pipe_config.go b/vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_pipe_config.go similarity index 100% rename from vendor/github.com/Scalingo/go-plugins-helpers/sdk/windows_pipe_config.go rename to vendor/github.com/Scalingo/go-plugins-helpers/v2/sdk/windows_pipe_config.go diff --git a/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/golang.org/x/sys/unix/affinity_linux.go index 3ea47038..acd6257f 100644 --- a/vendor/golang.org/x/sys/unix/affinity_linux.go +++ b/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -13,11 +13,19 @@ import ( const cpuSetSize = _CPU_SETSIZE / _NCPUBITS -// CPUSet represents a CPU affinity mask. +// CPUSet represents a bit mask of CPUs, to be used with [SchedGetaffinity], [SchedSetaffinity], +// and [SetMemPolicy]. +// +// Note this type can only represent CPU IDs 0 through 1023. +// Use [CPUSetDynamic]/[NewCPUSet] instead to avoid this limit. type CPUSet [cpuSetSize]cpuMask -func schedAffinity(trap uintptr, pid int, set *CPUSet) error { - _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set))) +// CPUSetDynamic represents a bit mask of CPUs, to be used with [SchedGetaffinityDynamic], +// [SchedSetaffinityDynamic], and [SetMemPolicyDynamic]. Use [NewCPUSet] to allocate. +type CPUSetDynamic []cpuMask + +func schedAffinity(trap uintptr, pid int, size uintptr, ptr unsafe.Pointer) error { + _, _, e := RawSyscall(trap, uintptr(pid), uintptr(size), uintptr(ptr)) if e != 0 { return errnoErr(e) } @@ -27,13 +35,13 @@ func schedAffinity(trap uintptr, pid int, set *CPUSet) error { // SchedGetaffinity gets the CPU affinity mask of the thread specified by pid. // If pid is 0 the calling thread is used. func SchedGetaffinity(pid int, set *CPUSet) error { - return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set) + return schedAffinity(SYS_SCHED_GETAFFINITY, pid, unsafe.Sizeof(*set), unsafe.Pointer(set)) } // SchedSetaffinity sets the CPU affinity mask of the thread specified by pid. // If pid is 0 the calling thread is used. func SchedSetaffinity(pid int, set *CPUSet) error { - return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set) + return schedAffinity(SYS_SCHED_SETAFFINITY, pid, unsafe.Sizeof(*set), unsafe.Pointer(set)) } // Zero clears the set s, so that it contains no CPUs. @@ -45,9 +53,7 @@ func (s *CPUSet) Zero() { // will silently ignore any invalid CPU bits in [CPUSet] so this is an // efficient way of resetting the CPU affinity of a process. func (s *CPUSet) Fill() { - for i := range s { - s[i] = ^cpuMask(0) - } + cpuMaskFill(s[:]) } func cpuBitsIndex(cpu int) int { @@ -58,24 +64,27 @@ func cpuBitsMask(cpu int) cpuMask { return cpuMask(1 << (uint(cpu) % _NCPUBITS)) } -// Set adds cpu to the set s. -func (s *CPUSet) Set(cpu int) { +func cpuMaskFill(s []cpuMask) { + for i := range s { + s[i] = ^cpuMask(0) + } +} + +func cpuMaskSet(s []cpuMask, cpu int) { i := cpuBitsIndex(cpu) if i < len(s) { s[i] |= cpuBitsMask(cpu) } } -// Clear removes cpu from the set s. -func (s *CPUSet) Clear(cpu int) { +func cpuMaskClear(s []cpuMask, cpu int) { i := cpuBitsIndex(cpu) if i < len(s) { s[i] &^= cpuBitsMask(cpu) } } -// IsSet reports whether cpu is in the set s. -func (s *CPUSet) IsSet(cpu int) bool { +func cpuMaskIsSet(s []cpuMask, cpu int) bool { i := cpuBitsIndex(cpu) if i < len(s) { return s[i]&cpuBitsMask(cpu) != 0 @@ -83,11 +92,98 @@ func (s *CPUSet) IsSet(cpu int) bool { return false } -// Count returns the number of CPUs in the set s. -func (s *CPUSet) Count() int { +func cpuMaskCount(s []cpuMask) int { c := 0 for _, b := range s { c += bits.OnesCount64(uint64(b)) } return c } + +// Set adds cpu to the set s. If cpu is out of bounds for s, no action is taken. +func (s *CPUSet) Set(cpu int) { + cpuMaskSet(s[:], cpu) +} + +// Clear removes cpu from the set s. If cpu is out of bounds for s, no action is taken. +func (s *CPUSet) Clear(cpu int) { + cpuMaskClear(s[:], cpu) +} + +// IsSet reports whether cpu is in the set s. +func (s *CPUSet) IsSet(cpu int) bool { + return cpuMaskIsSet(s[:], cpu) +} + +// Count returns the number of CPUs in the set s. +func (s *CPUSet) Count() int { + return cpuMaskCount(s[:]) +} + +// NewCPUSet creates a CPU affinity mask capable of representing CPU IDs +// up to maxCPU (exclusive). +func NewCPUSet(maxCPU int) CPUSetDynamic { + numMasks := (maxCPU + _NCPUBITS - 1) / _NCPUBITS + if numMasks == 0 { + numMasks = 1 + } + return make(CPUSetDynamic, numMasks) +} + +// Zero clears the set s, so that it contains no CPUs. +func (s CPUSetDynamic) Zero() { + clear(s) +} + +// Fill adds all possible CPU bits to the set s. On Linux, [SchedSetaffinityDynamic] +// will silently ignore any invalid CPU bits in [CPUSetDynamic] so this is an +// efficient way of resetting the CPU affinity of a process. +func (s CPUSetDynamic) Fill() { + cpuMaskFill(s) +} + +// Set adds cpu to the set s. If cpu is out of bounds for s, no action is taken. +func (s CPUSetDynamic) Set(cpu int) { + cpuMaskSet(s, cpu) +} + +// Clear removes cpu from the set s. If cpu is out of bounds for s, no action is taken. +func (s CPUSetDynamic) Clear(cpu int) { + cpuMaskClear(s, cpu) +} + +// IsSet reports whether cpu is in the set s. +func (s CPUSetDynamic) IsSet(cpu int) bool { + return cpuMaskIsSet(s, cpu) +} + +// Count returns the number of CPUs in the set s. +func (s CPUSetDynamic) Count() int { + return cpuMaskCount(s) +} + +func (s CPUSetDynamic) size() uintptr { + return uintptr(len(s)) * unsafe.Sizeof(cpuMask(0)) +} + +func (s CPUSetDynamic) pointer() unsafe.Pointer { + if len(s) == 0 { + return nil + } + return unsafe.Pointer(&s[0]) +} + +// SchedGetaffinityDynamic gets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +// +// If the set is smaller than the size of the affinity mask used by the kernel, +// [EINVAL] is returned. +func SchedGetaffinityDynamic(pid int, set CPUSetDynamic) error { + return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set.size(), set.pointer()) +} + +// SchedSetaffinityDynamic sets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedSetaffinityDynamic(pid int, set CPUSetDynamic) error { + return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set.size(), set.pointer()) +} diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index d0ed6119..f6ddee1a 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -51,7 +51,7 @@ if [[ "$GOOS" = "linux" ]]; then # Files generated through docker (use $cmd so you can Ctl-C the build or run) set -e $cmd docker build --tag generate:$GOOS $GOOS - $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS + $cmd docker run --rm --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && pwd):/build generate:$GOOS exit fi diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 06c0eea6..f7b82bcc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -2644,8 +2644,12 @@ func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { //sys Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) //sys Mseal(b []byte, flags uint) (err error) -//sys setMemPolicy(mode int, mask *CPUSet, size int) (err error) = SYS_SET_MEMPOLICY +//sys setMemPolicy(mode int, mask unsafe.Pointer, size uintptr) (err error) = SYS_SET_MEMPOLICY func SetMemPolicy(mode int, mask *CPUSet) error { - return setMemPolicy(mode, mask, _CPU_SETSIZE) + return setMemPolicy(mode, unsafe.Pointer(mask), _CPU_SETSIZE) +} + +func SetMemPolicyDynamic(mode int, mask CPUSetDynamic) error { + return setMemPolicy(mode, mask.pointer(), mask.size()) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index cd2dd797..ecf92bfa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -82,6 +82,9 @@ func Time(t *Time_t) (Time_t, error) { } func Utime(path string, buf *Utimbuf) error { + if buf == nil { + return Utimes(path, nil) + } tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 745e5c7e..17373807 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -113,6 +113,9 @@ func Time(t *Time_t) (Time_t, error) { } func Utime(path string, buf *Utimbuf) error { + if buf == nil { + return Utimes(path, nil) + } tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index dd2262a4..a3fd1d0b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -150,6 +150,9 @@ func Time(t *Time_t) (Time_t, error) { } func Utime(path string, buf *Utimbuf) error { + if buf == nil { + return Utimes(path, nil) + } tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 8cf3670b..fc5543c5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -112,6 +112,9 @@ func Time(t *Time_t) (Time_t, error) { } func Utime(path string, buf *Utimbuf) error { + if buf == nil { + return Utimes(path, nil) + } tv := []Timeval{ {Sec: buf.Actime}, {Sec: buf.Modtime}, diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 8935d10a..886f5de5 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -2241,8 +2241,8 @@ func Mseal(b []byte, flags uint) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func setMemPolicy(mode int, mask *CPUSet, size int) (err error) { - _, _, e1 := Syscall(SYS_SET_MEMPOLICY, uintptr(mode), uintptr(unsafe.Pointer(mask)), uintptr(size)) +func setMemPolicy(mode int, mask unsafe.Pointer, size uintptr) (err error) { + _, _, e1 := Syscall(SYS_SET_MEMPOLICY, uintptr(mode), uintptr(mask), uintptr(size)) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index d7664365..453a7b97 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -892,9 +892,13 @@ const socket_error = uintptr(^uint32(0)) //sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar //sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx //sys GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex +//sys GetIfTable2Ex(level uint32, table **MibIfTable2) (errcode error) = iphlpapi.GetIfTable2Ex //sys GetIpForwardEntry2(row *MibIpForwardRow2) (errcode error) = iphlpapi.GetIpForwardEntry2 //sys GetIpForwardTable2(family uint16, table **MibIpForwardTable2) (errcode error) = iphlpapi.GetIpForwardTable2 +//sys GetIpInterfaceEntry(row *MibIpInterfaceRow) (errcode error) = iphlpapi.GetIpInterfaceEntry +//sys GetIpInterfaceTable(family uint16, table **MibIpInterfaceTable) (errcode error) = iphlpapi.GetIpInterfaceTable //sys GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry +//sys GetUnicastIpAddressTable(family uint16, table **MibUnicastIpAddressTable) (errcode error) = iphlpapi.GetUnicastIpAddressTable //sys FreeMibTable(memory unsafe.Pointer) = iphlpapi.FreeMibTable //sys NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange //sys NotifyRouteChange2(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyRouteChange2 @@ -1693,10 +1697,13 @@ func NewNTUnicodeString(s string) (*NTUnicodeString, error) { if err != nil { return nil, err } - n := uint16(len(s16) * 2) + n := len(s16) * 2 + if n > (1<<16)-1 { + return nil, syscall.EINVAL + } return &NTUnicodeString{ - Length: n - 2, // subtract 2 bytes for the NULL terminator - MaximumLength: n, + Length: uint16(n) - 2, // subtract 2 bytes for the NULL terminator + MaximumLength: uint16(n), Buffer: &s16[0], }, nil } diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index d5658a13..d82299e3 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -2320,6 +2320,21 @@ type MibIfRow2 struct { OutQLen uint64 } +// MIB_IF_TABLE_LEVEL enumeration from netioapi.h or +// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ne-netioapi-mib_if_table_level. +const ( + MibIfTableNormal = 0 + MibIfTableRaw = 1 + MibIfTableNormalWithoutStatistics = 2 +) + +// MibIfTable2 contains a table of logical and physical interface entries. See +// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_if_table2. +type MibIfTable2 struct { + NumEntries uint32 + Table [1]MibIfRow2 +} + // IP_ADDRESS_PREFIX stores an IP address prefix. See // https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-ip_address_prefix. type IpAddressPrefix struct { @@ -2413,6 +2428,13 @@ type MibUnicastIpAddressRow struct { CreationTimeStamp Filetime } +// MibUnicastIpAddressTable contains a table of unicast IP address entries. See +// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_unicastipaddress_table. +type MibUnicastIpAddressTable struct { + NumEntries uint32 + Table [1]MibUnicastIpAddressRow +} + const ScopeLevelCount = 16 // MIB_IPINTERFACE_ROW stores interface management information for a particular IP address family on a network interface. @@ -2455,6 +2477,13 @@ type MibIpInterfaceRow struct { DisableDefaultRoutes uint8 } +// MibIpInterfaceTable contains a table of IP interface entries. See +// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_ipinterface_table. +type MibIpInterfaceTable struct { + NumEntries uint32 + Table [1]MibIpInterfaceRow +} + // Console related constants used for the mode parameter to SetConsoleMode. See // https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index fe7a4ea1..a506ac0f 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -188,9 +188,13 @@ var ( procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") procGetIfEntry2Ex = modiphlpapi.NewProc("GetIfEntry2Ex") + procGetIfTable2Ex = modiphlpapi.NewProc("GetIfTable2Ex") procGetIpForwardEntry2 = modiphlpapi.NewProc("GetIpForwardEntry2") procGetIpForwardTable2 = modiphlpapi.NewProc("GetIpForwardTable2") + procGetIpInterfaceEntry = modiphlpapi.NewProc("GetIpInterfaceEntry") + procGetIpInterfaceTable = modiphlpapi.NewProc("GetIpInterfaceTable") procGetUnicastIpAddressEntry = modiphlpapi.NewProc("GetUnicastIpAddressEntry") + procGetUnicastIpAddressTable = modiphlpapi.NewProc("GetUnicastIpAddressTable") procNotifyIpInterfaceChange = modiphlpapi.NewProc("NotifyIpInterfaceChange") procNotifyRouteChange2 = modiphlpapi.NewProc("NotifyRouteChange2") procNotifyUnicastIpAddressChange = modiphlpapi.NewProc("NotifyUnicastIpAddressChange") @@ -1674,6 +1678,14 @@ func GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) { return } +func GetIfTable2Ex(level uint32, table **MibIfTable2) (errcode error) { + r0, _, _ := syscall.SyscallN(procGetIfTable2Ex.Addr(), uintptr(level), uintptr(unsafe.Pointer(table))) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + func GetIpForwardEntry2(row *MibIpForwardRow2) (errcode error) { r0, _, _ := syscall.SyscallN(procGetIpForwardEntry2.Addr(), uintptr(unsafe.Pointer(row))) if r0 != 0 { @@ -1690,6 +1702,22 @@ func GetIpForwardTable2(family uint16, table **MibIpForwardTable2) (errcode erro return } +func GetIpInterfaceEntry(row *MibIpInterfaceRow) (errcode error) { + r0, _, _ := syscall.SyscallN(procGetIpInterfaceEntry.Addr(), uintptr(unsafe.Pointer(row))) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetIpInterfaceTable(family uint16, table **MibIpInterfaceTable) (errcode error) { + r0, _, _ := syscall.SyscallN(procGetIpInterfaceTable.Addr(), uintptr(family), uintptr(unsafe.Pointer(table))) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + func GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) { r0, _, _ := syscall.SyscallN(procGetUnicastIpAddressEntry.Addr(), uintptr(unsafe.Pointer(row))) if r0 != 0 { @@ -1698,6 +1726,14 @@ func GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) { return } +func GetUnicastIpAddressTable(family uint16, table **MibUnicastIpAddressTable) (errcode error) { + r0, _, _ := syscall.SyscallN(procGetUnicastIpAddressTable.Addr(), uintptr(family), uintptr(unsafe.Pointer(table))) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + func NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) { var _p0 uint32 if initialNotification { diff --git a/vendor/modules.txt b/vendor/modules.txt index 01c80d04..02d74df9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -14,11 +14,11 @@ github.com/Scalingo/go-etcd-lock/v5/lock # github.com/Scalingo/go-handlers v1.11.1 ## explicit; go 1.25.0 github.com/Scalingo/go-handlers -# github.com/Scalingo/go-plugins-helpers v1.4.0 -## explicit; go 1.23.5 -github.com/Scalingo/go-plugins-helpers/ipam -github.com/Scalingo/go-plugins-helpers/network -github.com/Scalingo/go-plugins-helpers/sdk +# github.com/Scalingo/go-plugins-helpers/v2 v2.5.1 +## explicit; go 1.25.5 +github.com/Scalingo/go-plugins-helpers/v2/ipam +github.com/Scalingo/go-plugins-helpers/v2/network +github.com/Scalingo/go-plugins-helpers/v2/sdk # github.com/Scalingo/go-utils/crypto v1.1.1 ## explicit; go 1.24 github.com/Scalingo/go-utils/crypto @@ -63,7 +63,7 @@ github.com/coreos/go-systemd/v22/journal # github.com/cpuguy83/go-md2man/v2 v2.0.7 ## explicit; go 1.12 github.com/cpuguy83/go-md2man/v2/md2man -# github.com/davecgh/go-spew v1.1.1 +# github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc ## explicit github.com/davecgh/go-spew/spew # github.com/docker/go-connections v0.7.0 @@ -112,7 +112,7 @@ github.com/moby/sys/reexec # github.com/pkg/errors v0.9.1 ## explicit github.com/pkg/errors -# github.com/pmezard/go-difflib v1.0.0 +# github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 ## explicit github.com/pmezard/go-difflib/difflib # github.com/rollbar/rollbar-go v1.4.8 @@ -230,7 +230,7 @@ golang.org/x/net/internal/httpcommon golang.org/x/net/internal/httpsfv golang.org/x/net/internal/timeseries golang.org/x/net/trace -# golang.org/x/sys v0.43.0 +# golang.org/x/sys v0.44.0 ## explicit; go 1.25.0 golang.org/x/sys/unix golang.org/x/sys/windows