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>
93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
//go:build linux
|
|
|
|
package macvlan
|
|
|
|
import (
|
|
"context"
|
|
"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/netutils"
|
|
"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))
|
|
}
|
|
ep := &endpoint{
|
|
id: eid,
|
|
nid: nid,
|
|
addr: ifInfo.Address(),
|
|
addrv6: ifInfo.AddressIPv6(),
|
|
mac: ifInfo.MacAddress(),
|
|
}
|
|
if ep.mac == nil {
|
|
ep.mac = netutils.GenerateRandomMAC()
|
|
if err := ifInfo.SetMacAddress(ep.mac); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
// disallow portmapping -p
|
|
if opt, ok := epOptions[netlabel.PortMap]; ok {
|
|
if _, ok := opt.([]types.PortBinding); ok {
|
|
if len(opt.([]types.PortBinding)) > 0 {
|
|
log.G(ctx).Warnf("macvlan 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("macvlan driver does not support port exposures")
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := d.storeUpdate(ep); err != nil {
|
|
return fmt.Errorf("failed to save macvlan endpoint %.7s to store: %v", ep.id, err)
|
|
}
|
|
|
|
n.addEndpoint(ep)
|
|
|
|
return nil
|
|
}
|
|
|
|
// DeleteEndpoint removes 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 macvlan endpoint %.7s from store: %v", ep.id, err)
|
|
}
|
|
|
|
n.deleteEndpoint(ep.id)
|
|
|
|
return nil
|
|
}
|