mirror of
https://github.com/moby/moby.git
synced 2026-08-03 22:51:03 +00:00
These drivers did not do anything meaningful in the `Leave` method; they would check if the network and/or endpoint were missing, in which case they produced an error, but the network and endpoint (if present) would not be used, so it was only validation. Such validation could still be relevant elsewhere, but looking at where this method is called; the `Driver.Leave()` is called in two places, both of which don't handle the error, other than logging it as a warning / error; It's called by `Endpoint.sbJoin()`, as part of the rollback;d5c838dc5e/daemon/libnetwork/endpoint.go (L539-L545)And `Endpoint.sbLeave()`, which also discards the error;d5c838dc5e/daemon/libnetwork/endpoint.go (L772-L776)Based on he above, this code looks to be redundant, so replacing it with a stub; returning `nil`. As replacing the code removed the use of network.getEndpoint, which was effectively a copy of network.endpoint (which didn't have error handling), I merged the two methods, and removed custom error-handling elsewhere. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
//go:build linux
|
|
|
|
package ipvlan
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/containerd/log"
|
|
"github.com/moby/moby/v2/daemon/libnetwork/driverapi"
|
|
"github.com/moby/moby/v2/daemon/libnetwork/netlabel"
|
|
"github.com/moby/moby/v2/daemon/libnetwork/ns"
|
|
"github.com/moby/moby/v2/daemon/libnetwork/types"
|
|
"github.com/moby/moby/v2/errdefs"
|
|
)
|
|
|
|
// CreateEndpoint assigns the mac, ip and endpoint id for the new container
|
|
func (d *driver) CreateEndpoint(ctx context.Context, nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]any) error {
|
|
if err := validateID(nid, eid); err != nil {
|
|
return err
|
|
}
|
|
n, err := d.getNetwork(nid)
|
|
if err != nil {
|
|
return errdefs.System(fmt.Errorf("network id %q not found", nid))
|
|
}
|
|
if ifInfo.MacAddress() != nil {
|
|
return errors.New("ipvlan interfaces do not support custom mac address assignment")
|
|
}
|
|
ep := &endpoint{
|
|
id: eid,
|
|
nid: nid,
|
|
addr: ifInfo.Address(),
|
|
addrv6: ifInfo.AddressIPv6(),
|
|
}
|
|
// disallow port mapping -p
|
|
if opt, ok := epOptions[netlabel.PortMap]; ok {
|
|
if _, ok := opt.([]types.PortBinding); ok {
|
|
if len(opt.([]types.PortBinding)) > 0 {
|
|
log.G(ctx).Warnf("ipvlan driver does not support port mappings")
|
|
}
|
|
}
|
|
}
|
|
// disallow port exposure --expose
|
|
if opt, ok := epOptions[netlabel.ExposedPorts]; ok {
|
|
if _, ok := opt.([]types.TransportPort); ok {
|
|
if len(opt.([]types.TransportPort)) > 0 {
|
|
log.G(ctx).Warnf("ipvlan driver does not support port exposures")
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := d.storeUpdate(ep); err != nil {
|
|
return fmt.Errorf("failed to save ipvlan endpoint %.7s to store: %v", ep.id, err)
|
|
}
|
|
|
|
n.addEndpoint(ep)
|
|
|
|
return nil
|
|
}
|
|
|
|
// DeleteEndpoint remove the endpoint and associated netlink interface
|
|
func (d *driver) DeleteEndpoint(nid, eid string) error {
|
|
if err := validateID(nid, eid); err != nil {
|
|
return err
|
|
}
|
|
n := d.network(nid)
|
|
if n == nil {
|
|
return fmt.Errorf("network id %q not found", nid)
|
|
}
|
|
ep, err := n.endpoint(eid)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if link, err := ns.NlHandle().LinkByName(ep.srcName); err == nil {
|
|
if err := ns.NlHandle().LinkDel(link); err != nil {
|
|
log.G(context.TODO()).WithError(err).Warnf("Failed to delete interface (%s)'s link on endpoint (%s) delete", ep.srcName, ep.id)
|
|
}
|
|
}
|
|
|
|
if err := d.storeDelete(ep); err != nil {
|
|
log.G(context.TODO()).Warnf("Failed to remove ipvlan endpoint %.7s from store: %v", ep.id, err)
|
|
}
|
|
n.deleteEndpoint(ep.id)
|
|
return nil
|
|
}
|