github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/windows/overlay/overlay_windows.go (about) 1 package overlay 2 3 //go:generate protoc -I=. -I=../../../../vendor/ --gogo_out=import_path=github.com/Prakhar-Agarwal-byte/moby/libnetwork/drivers/overlay:. overlay.proto 4 5 import ( 6 "context" 7 "encoding/json" 8 "net" 9 "sync" 10 11 "github.com/Microsoft/hcsshim" 12 "github.com/containerd/log" 13 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/driverapi" 14 "github.com/Prakhar-Agarwal-byte/moby/libnetwork/scope" 15 ) 16 17 const ( 18 NetworkType = "overlay" 19 ) 20 21 type driver struct { 22 networks networkTable 23 sync.Mutex 24 } 25 26 // Register registers a new instance of the overlay driver. 27 func Register(r driverapi.Registerer) error { 28 d := &driver{ 29 networks: networkTable{}, 30 } 31 32 d.restoreHNSNetworks() 33 34 return r.RegisterDriver(NetworkType, d, driverapi.Capability{ 35 DataScope: scope.Global, 36 ConnectivityScope: scope.Global, 37 }) 38 } 39 40 func (d *driver) restoreHNSNetworks() error { 41 log.G(context.TODO()).Infof("Restoring existing overlay networks from HNS into docker") 42 43 hnsresponse, err := hcsshim.HNSListNetworkRequest("GET", "", "") 44 if err != nil { 45 return err 46 } 47 48 for _, v := range hnsresponse { 49 if v.Type != NetworkType { 50 continue 51 } 52 53 log.G(context.TODO()).Infof("Restoring overlay network: %s", v.Name) 54 n := d.convertToOverlayNetwork(&v) 55 d.addNetwork(n) 56 57 // 58 // We assume that any network will be recreated on daemon restart 59 // and therefore don't restore hns endpoints for now 60 // 61 // n.restoreNetworkEndpoints() 62 } 63 64 return nil 65 } 66 67 func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network { 68 n := &network{ 69 id: v.Name, 70 hnsID: v.Id, 71 driver: d, 72 endpoints: endpointTable{}, 73 subnets: []*subnet{}, 74 providerAddress: v.ManagementIP, 75 } 76 77 for _, hnsSubnet := range v.Subnets { 78 vsidPolicy := &hcsshim.VsidPolicy{} 79 for _, policy := range hnsSubnet.Policies { 80 if err := json.Unmarshal([]byte(policy), &vsidPolicy); err == nil && vsidPolicy.Type == "VSID" { 81 break 82 } 83 } 84 85 gwIP := net.ParseIP(hnsSubnet.GatewayAddress) 86 localsubnet := &subnet{ 87 vni: uint32(vsidPolicy.VSID), 88 gwIP: &gwIP, 89 } 90 91 _, subnetIP, err := net.ParseCIDR(hnsSubnet.AddressPrefix) 92 if err != nil { 93 log.G(context.TODO()).Errorf("Error parsing subnet address %s ", hnsSubnet.AddressPrefix) 94 continue 95 } 96 97 localsubnet.subnetIP = subnetIP 98 99 n.subnets = append(n.subnets, localsubnet) 100 } 101 102 return n 103 } 104 105 func (d *driver) Type() string { 106 return NetworkType 107 } 108 109 func (d *driver) IsBuiltIn() bool { 110 return true 111 }