ov_endpoint.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package overlay
  2. import (
  3. "fmt"
  4. "net"
  5. "github.com/docker/libnetwork/driverapi"
  6. "github.com/docker/libnetwork/netutils"
  7. )
  8. type endpointTable map[string]*endpoint
  9. type endpoint struct {
  10. id string
  11. ifName string
  12. mac net.HardwareAddr
  13. addr *net.IPNet
  14. }
  15. func (n *network) endpoint(eid string) *endpoint {
  16. n.Lock()
  17. defer n.Unlock()
  18. return n.endpoints[eid]
  19. }
  20. func (n *network) addEndpoint(ep *endpoint) {
  21. n.Lock()
  22. n.endpoints[ep.id] = ep
  23. n.Unlock()
  24. }
  25. func (n *network) deleteEndpoint(eid string) {
  26. n.Lock()
  27. delete(n.endpoints, eid)
  28. n.Unlock()
  29. }
  30. func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo,
  31. epOptions map[string]interface{}) error {
  32. var err error
  33. if err = validateID(nid, eid); err != nil {
  34. return err
  35. }
  36. // Since we perform lazy configuration make sure we try
  37. // configuring the driver when we enter CreateEndpoint since
  38. // CreateNetwork may not be called in every node.
  39. if err := d.configure(); err != nil {
  40. return err
  41. }
  42. n := d.network(nid)
  43. if n == nil {
  44. return fmt.Errorf("network id %q not found", nid)
  45. }
  46. ep := &endpoint{
  47. id: eid,
  48. addr: ifInfo.Address(),
  49. mac: ifInfo.MacAddress(),
  50. }
  51. if ep.addr == nil {
  52. return fmt.Errorf("create endpoint was not passed interface IP address")
  53. }
  54. if s := n.getSubnetforIP(ep.addr); s == nil {
  55. return fmt.Errorf("no matching subnet for IP %q in network %q\n", ep.addr, nid)
  56. }
  57. if ep.mac == nil {
  58. ep.mac = netutils.GenerateMACFromIP(ep.addr.IP)
  59. if err := ifInfo.SetMacAddress(ep.mac); err != nil {
  60. return err
  61. }
  62. }
  63. n.addEndpoint(ep)
  64. return nil
  65. }
  66. func (d *driver) DeleteEndpoint(nid, eid string) error {
  67. if err := validateID(nid, eid); err != nil {
  68. return err
  69. }
  70. n := d.network(nid)
  71. if n == nil {
  72. return fmt.Errorf("network id %q not found", nid)
  73. }
  74. ep := n.endpoint(eid)
  75. if ep == nil {
  76. return fmt.Errorf("endpoint id %q not found", eid)
  77. }
  78. n.deleteEndpoint(eid)
  79. return nil
  80. }
  81. func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) {
  82. return make(map[string]interface{}, 0), nil
  83. }