github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/overlay/ov_endpoint.go (about)

     1  //go:build linux
     2  
     3  package overlay
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  	"net"
     9  
    10  	"github.com/Prakhar-Agarwal-byte/moby/libnetwork/driverapi"
    11  	"github.com/Prakhar-Agarwal-byte/moby/libnetwork/netutils"
    12  	"github.com/Prakhar-Agarwal-byte/moby/libnetwork/ns"
    13  	"github.com/containerd/log"
    14  )
    15  
    16  type endpointTable map[string]*endpoint
    17  
    18  type endpoint struct {
    19  	id     string
    20  	nid    string
    21  	ifName string
    22  	mac    net.HardwareAddr
    23  	addr   *net.IPNet
    24  }
    25  
    26  func (n *network) endpoint(eid string) *endpoint {
    27  	n.Lock()
    28  	defer n.Unlock()
    29  
    30  	return n.endpoints[eid]
    31  }
    32  
    33  func (n *network) addEndpoint(ep *endpoint) {
    34  	n.Lock()
    35  	n.endpoints[ep.id] = ep
    36  	n.Unlock()
    37  }
    38  
    39  func (n *network) deleteEndpoint(eid string) {
    40  	n.Lock()
    41  	delete(n.endpoints, eid)
    42  	n.Unlock()
    43  }
    44  
    45  func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error {
    46  	var err error
    47  	if err = validateID(nid, eid); err != nil {
    48  		return err
    49  	}
    50  
    51  	// Since we perform lazy configuration make sure we try
    52  	// configuring the driver when we enter CreateEndpoint since
    53  	// CreateNetwork may not be called in every node.
    54  	if err := d.configure(); err != nil {
    55  		return err
    56  	}
    57  
    58  	n := d.network(nid)
    59  	if n == nil {
    60  		return fmt.Errorf("network id %q not found", nid)
    61  	}
    62  
    63  	ep := &endpoint{
    64  		id:   eid,
    65  		nid:  n.id,
    66  		addr: ifInfo.Address(),
    67  		mac:  ifInfo.MacAddress(),
    68  	}
    69  	if ep.addr == nil {
    70  		return fmt.Errorf("create endpoint was not passed interface IP address")
    71  	}
    72  
    73  	if s := n.getSubnetforIP(ep.addr); s == nil {
    74  		return fmt.Errorf("no matching subnet for IP %q in network %q", ep.addr, nid)
    75  	}
    76  
    77  	if ep.mac == nil {
    78  		ep.mac = netutils.GenerateMACFromIP(ep.addr.IP)
    79  		if err := ifInfo.SetMacAddress(ep.mac); err != nil {
    80  			return err
    81  		}
    82  	}
    83  
    84  	n.addEndpoint(ep)
    85  
    86  	return nil
    87  }
    88  
    89  func (d *driver) DeleteEndpoint(nid, eid string) error {
    90  	nlh := ns.NlHandle()
    91  
    92  	if err := validateID(nid, eid); err != nil {
    93  		return err
    94  	}
    95  
    96  	n := d.network(nid)
    97  	if n == nil {
    98  		return fmt.Errorf("network id %q not found", nid)
    99  	}
   100  
   101  	ep := n.endpoint(eid)
   102  	if ep == nil {
   103  		return fmt.Errorf("endpoint id %q not found", eid)
   104  	}
   105  
   106  	n.deleteEndpoint(eid)
   107  
   108  	if ep.ifName == "" {
   109  		return nil
   110  	}
   111  
   112  	link, err := nlh.LinkByName(ep.ifName)
   113  	if err != nil {
   114  		log.G(context.TODO()).Debugf("Failed to retrieve interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err)
   115  		return nil
   116  	}
   117  	if err := nlh.LinkDel(link); err != nil {
   118  		log.G(context.TODO()).Debugf("Failed to delete interface (%s)'s link on endpoint (%s) delete: %v", ep.ifName, ep.id, err)
   119  	}
   120  
   121  	return nil
   122  }
   123  
   124  func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) {
   125  	return make(map[string]interface{}), nil
   126  }