github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/drivers/windows/windows_store.go (about) 1 //go:build windows 2 // +build windows 3 4 package windows 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "net" 10 11 "github.com/docker/libnetwork/datastore" 12 "github.com/docker/libnetwork/discoverapi" 13 "github.com/docker/libnetwork/netlabel" 14 "github.com/docker/libnetwork/types" 15 "github.com/sirupsen/logrus" 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.NewDataStoreFromConfig(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(datastore.Key(windowsPrefix), &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 logrus.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(datastore.Key(windowsEndpointPrefix), &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 logrus.Debugf("Network (%.7s) not found for restored endpoint (%.7s)", ep.nid, ep.id) 90 logrus.Debugf("Deleting stale endpoint (%.7s) from store", ep.id) 91 if err := d.storeDelete(ep); err != nil { 92 logrus.Debugf("Failed to delete stale endpoint (%.7s) from store", ep.id) 93 } 94 continue 95 } 96 n.endpoints[ep.id] = ep 97 logrus.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 logrus.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 logrus.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(datastore.Key(kvObject.Key()...), 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 (ncfg *networkConfiguration) DataScope() string { 224 return datastore.LocalScope 225 } 226 227 func (ep *hnsEndpoint) MarshalJSON() ([]byte, error) { 228 epMap := make(map[string]interface{}) 229 epMap["id"] = ep.id 230 epMap["nid"] = ep.nid 231 epMap["Type"] = ep.Type 232 epMap["profileID"] = ep.profileID 233 epMap["MacAddress"] = ep.macAddress.String() 234 if ep.addr.IP != nil { 235 epMap["Addr"] = ep.addr.String() 236 } 237 if ep.gateway != nil { 238 epMap["gateway"] = ep.gateway.String() 239 } 240 epMap["epOption"] = ep.epOption 241 epMap["epConnectivity"] = ep.epConnectivity 242 epMap["PortMapping"] = ep.portMapping 243 244 return json.Marshal(epMap) 245 } 246 247 func (ep *hnsEndpoint) UnmarshalJSON(b []byte) error { 248 var ( 249 err error 250 epMap map[string]interface{} 251 ) 252 253 if err = json.Unmarshal(b, &epMap); err != nil { 254 return fmt.Errorf("Failed to unmarshal to endpoint: %v", err) 255 } 256 if v, ok := epMap["MacAddress"]; ok { 257 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 258 return types.InternalErrorf("failed to decode endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 259 } 260 } 261 if v, ok := epMap["Addr"]; ok { 262 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 263 logrus.Warnf("failed to decode endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 264 } 265 } 266 if v, ok := epMap["gateway"]; ok { 267 ep.gateway = net.ParseIP(v.(string)) 268 } 269 ep.id = epMap["id"].(string) 270 ep.Type = epMap["Type"].(string) 271 ep.nid = epMap["nid"].(string) 272 ep.profileID = epMap["profileID"].(string) 273 d, _ := json.Marshal(epMap["epOption"]) 274 if err := json.Unmarshal(d, &ep.epOption); err != nil { 275 logrus.Warnf("Failed to decode endpoint container config %v", err) 276 } 277 d, _ = json.Marshal(epMap["epConnectivity"]) 278 if err := json.Unmarshal(d, &ep.epConnectivity); err != nil { 279 logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) 280 } 281 d, _ = json.Marshal(epMap["PortMapping"]) 282 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 283 logrus.Warnf("Failed to decode endpoint port mapping %v", err) 284 } 285 286 return nil 287 } 288 289 func (ep *hnsEndpoint) Key() []string { 290 return []string{windowsEndpointPrefix + ep.Type, ep.id} 291 } 292 293 func (ep *hnsEndpoint) KeyPrefix() []string { 294 return []string{windowsEndpointPrefix + ep.Type} 295 } 296 297 func (ep *hnsEndpoint) Value() []byte { 298 b, err := json.Marshal(ep) 299 if err != nil { 300 return nil 301 } 302 return b 303 } 304 305 func (ep *hnsEndpoint) SetValue(value []byte) error { 306 return json.Unmarshal(value, ep) 307 } 308 309 func (ep *hnsEndpoint) Index() uint64 { 310 return ep.dbIndex 311 } 312 313 func (ep *hnsEndpoint) SetIndex(index uint64) { 314 ep.dbIndex = index 315 ep.dbExists = true 316 } 317 318 func (ep *hnsEndpoint) Exists() bool { 319 return ep.dbExists 320 } 321 322 func (ep *hnsEndpoint) Skip() bool { 323 return false 324 } 325 326 func (ep *hnsEndpoint) New() datastore.KVObject { 327 return &hnsEndpoint{Type: ep.Type} 328 } 329 330 func (ep *hnsEndpoint) CopyTo(o datastore.KVObject) error { 331 dstEp := o.(*hnsEndpoint) 332 *dstEp = *ep 333 return nil 334 } 335 336 func (ep *hnsEndpoint) DataScope() string { 337 return datastore.LocalScope 338 }