github.com/rish1988/moby@v25.0.2+incompatible/libnetwork/drivers/windows/windows_store.go (about) 1 //go:build windows 2 3 package windows 4 5 import ( 6 "context" 7 "encoding/json" 8 "fmt" 9 "net" 10 11 "github.com/containerd/log" 12 "github.com/docker/docker/libnetwork/datastore" 13 "github.com/docker/docker/libnetwork/discoverapi" 14 "github.com/docker/docker/libnetwork/netlabel" 15 "github.com/docker/docker/libnetwork/types" 16 ) 17 18 const ( 19 windowsPrefix = "windows" 20 windowsEndpointPrefix = "windows-endpoint" 21 ) 22 23 func (d *driver) initStore(option map[string]interface{}) error { 24 if data, ok := option[netlabel.LocalKVClient]; ok { 25 var err error 26 dsc, ok := data.(discoverapi.DatastoreConfigData) 27 if !ok { 28 return types.InternalErrorf("incorrect data in datastore configuration: %v", data) 29 } 30 d.store, err = datastore.FromConfig(dsc) 31 if err != nil { 32 return types.InternalErrorf("windows driver failed to initialize data store: %v", err) 33 } 34 35 err = d.populateNetworks() 36 if err != nil { 37 return err 38 } 39 40 err = d.populateEndpoints() 41 if err != nil { 42 return err 43 } 44 } 45 46 return nil 47 } 48 49 func (d *driver) populateNetworks() error { 50 kvol, err := d.store.List(&networkConfiguration{Type: d.name}) 51 if err != nil && err != datastore.ErrKeyNotFound { 52 return fmt.Errorf("failed to get windows network configurations from store: %v", err) 53 } 54 55 // It's normal for network configuration state to be empty. Just return. 56 if err == datastore.ErrKeyNotFound { 57 return nil 58 } 59 60 for _, kvo := range kvol { 61 ncfg := kvo.(*networkConfiguration) 62 if ncfg.Type != d.name { 63 continue 64 } 65 d.createNetwork(ncfg) 66 log.G(context.TODO()).Debugf("Network %v (%.7s) restored", d.name, ncfg.ID) 67 } 68 69 return nil 70 } 71 72 func (d *driver) populateEndpoints() error { 73 kvol, err := d.store.List(&hnsEndpoint{Type: d.name}) 74 if err != nil && err != datastore.ErrKeyNotFound { 75 return fmt.Errorf("failed to get endpoints from store: %v", err) 76 } 77 78 if err == datastore.ErrKeyNotFound { 79 return nil 80 } 81 82 for _, kvo := range kvol { 83 ep := kvo.(*hnsEndpoint) 84 if ep.Type != d.name { 85 continue 86 } 87 n, ok := d.networks[ep.nid] 88 if !ok { 89 log.G(context.TODO()).Debugf("Network (%.7s) not found for restored endpoint (%.7s)", ep.nid, ep.id) 90 log.G(context.TODO()).Debugf("Deleting stale endpoint (%.7s) from store", ep.id) 91 if err := d.storeDelete(ep); err != nil { 92 log.G(context.TODO()).Debugf("Failed to delete stale endpoint (%.7s) from store", ep.id) 93 } 94 continue 95 } 96 n.endpoints[ep.id] = ep 97 log.G(context.TODO()).Debugf("Endpoint (%.7s) restored to network (%.7s)", ep.id, ep.nid) 98 } 99 100 return nil 101 } 102 103 func (d *driver) storeUpdate(kvObject datastore.KVObject) error { 104 if d.store == nil { 105 log.G(context.TODO()).Warnf("store not initialized. kv object %s is not added to the store", datastore.Key(kvObject.Key()...)) 106 return nil 107 } 108 109 if err := d.store.PutObjectAtomic(kvObject); err != nil { 110 return fmt.Errorf("failed to update store for object type %T: %v", kvObject, err) 111 } 112 113 return nil 114 } 115 116 func (d *driver) storeDelete(kvObject datastore.KVObject) error { 117 if d.store == nil { 118 log.G(context.TODO()).Debugf("store not initialized. kv object %s is not deleted from store", datastore.Key(kvObject.Key()...)) 119 return nil 120 } 121 122 retry: 123 if err := d.store.DeleteObjectAtomic(kvObject); err != nil { 124 if err == datastore.ErrKeyModified { 125 if err := d.store.GetObject(kvObject); err != nil { 126 return fmt.Errorf("could not update the kvobject to latest when trying to delete: %v", err) 127 } 128 goto retry 129 } 130 return err 131 } 132 133 return nil 134 } 135 136 func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { 137 nMap := make(map[string]interface{}) 138 139 nMap["ID"] = ncfg.ID 140 nMap["Type"] = ncfg.Type 141 nMap["Name"] = ncfg.Name 142 nMap["HnsID"] = ncfg.HnsID 143 nMap["VLAN"] = ncfg.VLAN 144 nMap["VSID"] = ncfg.VSID 145 nMap["DNSServers"] = ncfg.DNSServers 146 nMap["DNSSuffix"] = ncfg.DNSSuffix 147 nMap["SourceMac"] = ncfg.SourceMac 148 nMap["NetworkAdapterName"] = ncfg.NetworkAdapterName 149 150 return json.Marshal(nMap) 151 } 152 153 func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { 154 var ( 155 err error 156 nMap map[string]interface{} 157 ) 158 159 if err = json.Unmarshal(b, &nMap); err != nil { 160 return err 161 } 162 163 ncfg.ID = nMap["ID"].(string) 164 ncfg.Type = nMap["Type"].(string) 165 ncfg.Name = nMap["Name"].(string) 166 ncfg.HnsID = nMap["HnsID"].(string) 167 ncfg.VLAN = uint(nMap["VLAN"].(float64)) 168 ncfg.VSID = uint(nMap["VSID"].(float64)) 169 ncfg.DNSServers = nMap["DNSServers"].(string) 170 ncfg.DNSSuffix = nMap["DNSSuffix"].(string) 171 ncfg.SourceMac = nMap["SourceMac"].(string) 172 ncfg.NetworkAdapterName = nMap["NetworkAdapterName"].(string) 173 return nil 174 } 175 176 func (ncfg *networkConfiguration) Key() []string { 177 return []string{windowsPrefix + ncfg.Type, ncfg.ID} 178 } 179 180 func (ncfg *networkConfiguration) KeyPrefix() []string { 181 return []string{windowsPrefix + ncfg.Type} 182 } 183 184 func (ncfg *networkConfiguration) Value() []byte { 185 b, err := json.Marshal(ncfg) 186 if err != nil { 187 return nil 188 } 189 return b 190 } 191 192 func (ncfg *networkConfiguration) SetValue(value []byte) error { 193 return json.Unmarshal(value, ncfg) 194 } 195 196 func (ncfg *networkConfiguration) Index() uint64 { 197 return ncfg.dbIndex 198 } 199 200 func (ncfg *networkConfiguration) SetIndex(index uint64) { 201 ncfg.dbIndex = index 202 ncfg.dbExists = true 203 } 204 205 func (ncfg *networkConfiguration) Exists() bool { 206 return ncfg.dbExists 207 } 208 209 func (ncfg *networkConfiguration) Skip() bool { 210 return false 211 } 212 213 func (ncfg *networkConfiguration) New() datastore.KVObject { 214 return &networkConfiguration{Type: ncfg.Type} 215 } 216 217 func (ncfg *networkConfiguration) CopyTo(o datastore.KVObject) error { 218 dstNcfg := o.(*networkConfiguration) 219 *dstNcfg = *ncfg 220 return nil 221 } 222 223 func (ep *hnsEndpoint) MarshalJSON() ([]byte, error) { 224 epMap := make(map[string]interface{}) 225 epMap["id"] = ep.id 226 epMap["nid"] = ep.nid 227 epMap["Type"] = ep.Type 228 epMap["profileID"] = ep.profileID 229 epMap["MacAddress"] = ep.macAddress.String() 230 if ep.addr.IP != nil { 231 epMap["Addr"] = ep.addr.String() 232 } 233 if ep.gateway != nil { 234 epMap["gateway"] = ep.gateway.String() 235 } 236 epMap["epOption"] = ep.epOption 237 epMap["epConnectivity"] = ep.epConnectivity 238 epMap["PortMapping"] = ep.portMapping 239 240 return json.Marshal(epMap) 241 } 242 243 func (ep *hnsEndpoint) UnmarshalJSON(b []byte) error { 244 var ( 245 err error 246 epMap map[string]interface{} 247 ) 248 249 if err = json.Unmarshal(b, &epMap); err != nil { 250 return fmt.Errorf("Failed to unmarshal to endpoint: %v", err) 251 } 252 if v, ok := epMap["MacAddress"]; ok { 253 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 254 return types.InternalErrorf("failed to decode endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 255 } 256 } 257 if v, ok := epMap["Addr"]; ok { 258 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 259 log.G(context.TODO()).Warnf("failed to decode endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 260 } 261 } 262 if v, ok := epMap["gateway"]; ok { 263 ep.gateway = net.ParseIP(v.(string)) 264 } 265 ep.id = epMap["id"].(string) 266 ep.Type = epMap["Type"].(string) 267 ep.nid = epMap["nid"].(string) 268 ep.profileID = epMap["profileID"].(string) 269 d, _ := json.Marshal(epMap["epOption"]) 270 if err := json.Unmarshal(d, &ep.epOption); err != nil { 271 log.G(context.TODO()).Warnf("Failed to decode endpoint container config %v", err) 272 } 273 d, _ = json.Marshal(epMap["epConnectivity"]) 274 if err := json.Unmarshal(d, &ep.epConnectivity); err != nil { 275 log.G(context.TODO()).Warnf("Failed to decode endpoint external connectivity configuration %v", err) 276 } 277 d, _ = json.Marshal(epMap["PortMapping"]) 278 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 279 log.G(context.TODO()).Warnf("Failed to decode endpoint port mapping %v", err) 280 } 281 282 return nil 283 } 284 285 func (ep *hnsEndpoint) Key() []string { 286 return []string{windowsEndpointPrefix + ep.Type, ep.id} 287 } 288 289 func (ep *hnsEndpoint) KeyPrefix() []string { 290 return []string{windowsEndpointPrefix + ep.Type} 291 } 292 293 func (ep *hnsEndpoint) Value() []byte { 294 b, err := json.Marshal(ep) 295 if err != nil { 296 return nil 297 } 298 return b 299 } 300 301 func (ep *hnsEndpoint) SetValue(value []byte) error { 302 return json.Unmarshal(value, ep) 303 } 304 305 func (ep *hnsEndpoint) Index() uint64 { 306 return ep.dbIndex 307 } 308 309 func (ep *hnsEndpoint) SetIndex(index uint64) { 310 ep.dbIndex = index 311 ep.dbExists = true 312 } 313 314 func (ep *hnsEndpoint) Exists() bool { 315 return ep.dbExists 316 } 317 318 func (ep *hnsEndpoint) Skip() bool { 319 return false 320 } 321 322 func (ep *hnsEndpoint) New() datastore.KVObject { 323 return &hnsEndpoint{Type: ep.Type} 324 } 325 326 func (ep *hnsEndpoint) CopyTo(o datastore.KVObject) error { 327 dstEp := o.(*hnsEndpoint) 328 *dstEp = *ep 329 return nil 330 }