peerdb_windows.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package overlay
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net"
  7. "github.com/Microsoft/hcsshim"
  8. "github.com/containerd/log"
  9. "github.com/docker/docker/libnetwork/types"
  10. )
  11. const ovPeerTable = "overlay_peer_table"
  12. func (d *driver) peerAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, peerMac net.HardwareAddr, vtep net.IP, updateDb bool) error {
  13. log.G(context.TODO()).Debugf("WINOVERLAY: Enter peerAdd for ca ip %s with ca mac %s", peerIP.String(), peerMac.String())
  14. if err := validateID(nid, eid); err != nil {
  15. return err
  16. }
  17. n := d.network(nid)
  18. if n == nil {
  19. return nil
  20. }
  21. if updateDb {
  22. log.G(context.TODO()).Info("WINOVERLAY: peerAdd: notifying HNS of the REMOTE endpoint")
  23. hnsEndpoint := &hcsshim.HNSEndpoint{
  24. Name: eid,
  25. VirtualNetwork: n.hnsID,
  26. MacAddress: peerMac.String(),
  27. IPAddress: peerIP,
  28. IsRemoteEndpoint: true,
  29. }
  30. paPolicy, err := json.Marshal(hcsshim.PaPolicy{
  31. Type: "PA",
  32. PA: vtep.String(),
  33. })
  34. if err != nil {
  35. return err
  36. }
  37. hnsEndpoint.Policies = append(hnsEndpoint.Policies, paPolicy)
  38. configurationb, err := json.Marshal(hnsEndpoint)
  39. if err != nil {
  40. return err
  41. }
  42. // Temp: We have to create an endpoint object to keep track of the HNS ID for
  43. // this endpoint so that we can retrieve it later when the endpoint is deleted.
  44. // This seems unnecessary when we already have dockers EID. See if we can pass
  45. // the global EID to HNS to use as it's ID, rather than having each HNS assign
  46. // it's own local ID for the endpoint
  47. addr, err := types.ParseCIDR(peerIP.String() + "/32")
  48. if err != nil {
  49. return err
  50. }
  51. n.removeEndpointWithAddress(addr)
  52. hnsresponse, err := endpointRequest("POST", "", string(configurationb))
  53. if err != nil {
  54. return err
  55. }
  56. ep := &endpoint{
  57. id: eid,
  58. nid: nid,
  59. addr: addr,
  60. mac: peerMac,
  61. profileID: hnsresponse.Id,
  62. remote: true,
  63. }
  64. n.addEndpoint(ep)
  65. }
  66. return nil
  67. }
  68. func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMask, peerMac net.HardwareAddr, vtep net.IP, updateDb bool) error {
  69. log.G(context.TODO()).Infof("WINOVERLAY: Enter peerDelete for endpoint %s and peer ip %s", eid, peerIP.String())
  70. if err := validateID(nid, eid); err != nil {
  71. return err
  72. }
  73. n := d.network(nid)
  74. if n == nil {
  75. return nil
  76. }
  77. ep := n.endpoint(eid)
  78. if ep == nil {
  79. return fmt.Errorf("could not find endpoint with id %s", eid)
  80. }
  81. if updateDb {
  82. _, err := endpointRequest("DELETE", ep.profileID, "")
  83. if err != nil {
  84. return err
  85. }
  86. n.deleteEndpoint(eid)
  87. }
  88. return nil
  89. }