overlay_windows.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package overlay
  2. //go:generate protoc -I.:../../Godeps/_workspace/src/github.com/gogo/protobuf --gogo_out=import_path=github.com/docker/docker/libnetwork/drivers/overlay,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto:. overlay.proto
  3. import (
  4. "encoding/json"
  5. "net"
  6. "sync"
  7. "github.com/Microsoft/hcsshim"
  8. "github.com/docker/docker/libnetwork/datastore"
  9. "github.com/docker/docker/libnetwork/discoverapi"
  10. "github.com/docker/docker/libnetwork/driverapi"
  11. "github.com/docker/docker/libnetwork/netlabel"
  12. "github.com/docker/docker/libnetwork/types"
  13. "github.com/sirupsen/logrus"
  14. )
  15. const (
  16. networkType = "overlay"
  17. )
  18. type driver struct {
  19. config map[string]interface{}
  20. networks networkTable
  21. store datastore.DataStore
  22. localStore datastore.DataStore
  23. once sync.Once
  24. joinOnce sync.Once
  25. sync.Mutex
  26. }
  27. // Register registers a new instance of the overlay driver.
  28. func Register(r driverapi.Registerer, config map[string]interface{}) error {
  29. c := driverapi.Capability{
  30. DataScope: datastore.GlobalScope,
  31. ConnectivityScope: datastore.GlobalScope,
  32. }
  33. d := &driver{
  34. networks: networkTable{},
  35. config: config,
  36. }
  37. if data, ok := config[netlabel.GlobalKVClient]; ok {
  38. var err error
  39. dsc, ok := data.(discoverapi.DatastoreConfigData)
  40. if !ok {
  41. return types.InternalErrorf("incorrect data in datastore configuration: %v", data)
  42. }
  43. d.store, err = datastore.NewDataStoreFromConfig(dsc)
  44. if err != nil {
  45. return types.InternalErrorf("failed to initialize data store: %v", err)
  46. }
  47. }
  48. if data, ok := config[netlabel.LocalKVClient]; ok {
  49. var err error
  50. dsc, ok := data.(discoverapi.DatastoreConfigData)
  51. if !ok {
  52. return types.InternalErrorf("incorrect data in datastore configuration: %v", data)
  53. }
  54. d.localStore, err = datastore.NewDataStoreFromConfig(dsc)
  55. if err != nil {
  56. return types.InternalErrorf("failed to initialize local data store: %v", err)
  57. }
  58. }
  59. d.restoreHNSNetworks()
  60. return r.RegisterDriver(networkType, d, c)
  61. }
  62. func (d *driver) restoreHNSNetworks() error {
  63. logrus.Infof("Restoring existing overlay networks from HNS into docker")
  64. hnsresponse, err := hcsshim.HNSListNetworkRequest("GET", "", "")
  65. if err != nil {
  66. return err
  67. }
  68. for _, v := range hnsresponse {
  69. if v.Type != networkType {
  70. continue
  71. }
  72. logrus.Infof("Restoring overlay network: %s", v.Name)
  73. n := d.convertToOverlayNetwork(&v)
  74. d.addNetwork(n)
  75. //
  76. // We assume that any network will be recreated on daemon restart
  77. // and therefore don't restore hns endpoints for now
  78. //
  79. //n.restoreNetworkEndpoints()
  80. }
  81. return nil
  82. }
  83. func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network {
  84. n := &network{
  85. id: v.Name,
  86. hnsID: v.Id,
  87. driver: d,
  88. endpoints: endpointTable{},
  89. subnets: []*subnet{},
  90. providerAddress: v.ManagementIP,
  91. }
  92. for _, hnsSubnet := range v.Subnets {
  93. vsidPolicy := &hcsshim.VsidPolicy{}
  94. for _, policy := range hnsSubnet.Policies {
  95. if err := json.Unmarshal([]byte(policy), &vsidPolicy); err == nil && vsidPolicy.Type == "VSID" {
  96. break
  97. }
  98. }
  99. gwIP := net.ParseIP(hnsSubnet.GatewayAddress)
  100. localsubnet := &subnet{
  101. vni: uint32(vsidPolicy.VSID),
  102. gwIP: &gwIP,
  103. }
  104. _, subnetIP, err := net.ParseCIDR(hnsSubnet.AddressPrefix)
  105. if err != nil {
  106. logrus.Errorf("Error parsing subnet address %s ", hnsSubnet.AddressPrefix)
  107. continue
  108. }
  109. localsubnet.subnetIP = subnetIP
  110. n.subnets = append(n.subnets, localsubnet)
  111. }
  112. return n
  113. }
  114. func (d *driver) Type() string {
  115. return networkType
  116. }
  117. func (d *driver) IsBuiltIn() bool {
  118. return true
  119. }
  120. // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster
  121. func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error {
  122. return types.NotImplementedErrorf("not implemented")
  123. }
  124. // DiscoverDelete is a notification for a discovery delete event, such as a node leaving a cluster
  125. func (d *driver) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error {
  126. return types.NotImplementedErrorf("not implemented")
  127. }