github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/drivers/bridge/bridge_store.go (about) 1 package bridge 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net" 7 8 "github.com/docker/libnetwork/datastore" 9 "github.com/docker/libnetwork/discoverapi" 10 "github.com/docker/libnetwork/netlabel" 11 "github.com/docker/libnetwork/types" 12 "github.com/sirupsen/logrus" 13 ) 14 15 const ( 16 // network config prefix was not specific enough. 17 // To be backward compatible, need custom endpoint 18 // prefix with different root 19 bridgePrefix = "bridge" 20 bridgeEndpointPrefix = "bridge-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("bridge 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(bridgePrefix), &networkConfiguration{}) 51 if err != nil && err != datastore.ErrKeyNotFound { 52 return fmt.Errorf("failed to get bridge 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 err = d.createNetwork(ncfg); err != nil { 63 logrus.Warnf("could not create bridge network for id %s bridge name %s while booting up from persistent state: %v", ncfg.ID, ncfg.BridgeName, err) 64 } 65 logrus.Debugf("Network (%.7s) restored", ncfg.ID) 66 } 67 68 return nil 69 } 70 71 func (d *driver) populateEndpoints() error { 72 kvol, err := d.store.List(datastore.Key(bridgeEndpointPrefix), &bridgeEndpoint{}) 73 if err != nil && err != datastore.ErrKeyNotFound { 74 return fmt.Errorf("failed to get bridge endpoints from store: %v", err) 75 } 76 77 if err == datastore.ErrKeyNotFound { 78 return nil 79 } 80 81 for _, kvo := range kvol { 82 ep := kvo.(*bridgeEndpoint) 83 n, ok := d.networks[ep.nid] 84 if !ok { 85 logrus.Debugf("Network (%.7s) not found for restored bridge endpoint (%.7s)", ep.nid, ep.id) 86 logrus.Debugf("Deleting stale bridge endpoint (%.7s) from store", ep.id) 87 if err := d.storeDelete(ep); err != nil { 88 logrus.Debugf("Failed to delete stale bridge endpoint (%.7s) from store", ep.id) 89 } 90 continue 91 } 92 n.endpoints[ep.id] = ep 93 n.restorePortAllocations(ep) 94 logrus.Debugf("Endpoint (%.7s) restored to network (%.7s)", ep.id, ep.nid) 95 } 96 97 return nil 98 } 99 100 func (d *driver) storeUpdate(kvObject datastore.KVObject) error { 101 if d.store == nil { 102 logrus.Warnf("bridge store not initialized. kv object %s is not added to the store", datastore.Key(kvObject.Key()...)) 103 return nil 104 } 105 106 if err := d.store.PutObjectAtomic(kvObject); err != nil { 107 return fmt.Errorf("failed to update bridge store for object type %T: %v", kvObject, err) 108 } 109 110 return nil 111 } 112 113 func (d *driver) storeDelete(kvObject datastore.KVObject) error { 114 if d.store == nil { 115 logrus.Debugf("bridge store not initialized. kv object %s is not deleted from store", datastore.Key(kvObject.Key()...)) 116 return nil 117 } 118 119 retry: 120 if err := d.store.DeleteObjectAtomic(kvObject); err != nil { 121 if err == datastore.ErrKeyModified { 122 if err := d.store.GetObject(datastore.Key(kvObject.Key()...), kvObject); err != nil { 123 return fmt.Errorf("could not update the kvobject to latest when trying to delete: %v", err) 124 } 125 goto retry 126 } 127 return err 128 } 129 130 return nil 131 } 132 133 func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { 134 nMap := make(map[string]interface{}) 135 nMap["ID"] = ncfg.ID 136 nMap["BridgeName"] = ncfg.BridgeName 137 nMap["EnableIPv6"] = ncfg.EnableIPv6 138 nMap["EnableIPMasquerade"] = ncfg.EnableIPMasquerade 139 nMap["EnableICC"] = ncfg.EnableICC 140 nMap["InhibitIPv4"] = ncfg.InhibitIPv4 141 nMap["Mtu"] = ncfg.Mtu 142 nMap["Internal"] = ncfg.Internal 143 nMap["DefaultBridge"] = ncfg.DefaultBridge 144 nMap["DefaultBindingIP"] = ncfg.DefaultBindingIP.String() 145 nMap["HostIP"] = ncfg.HostIP.String() 146 nMap["DefaultGatewayIPv4"] = ncfg.DefaultGatewayIPv4.String() 147 nMap["DefaultGatewayIPv6"] = ncfg.DefaultGatewayIPv6.String() 148 nMap["ContainerIfacePrefix"] = ncfg.ContainerIfacePrefix 149 nMap["BridgeIfaceCreator"] = ncfg.BridgeIfaceCreator 150 151 if ncfg.AddressIPv4 != nil { 152 nMap["AddressIPv4"] = ncfg.AddressIPv4.String() 153 } 154 155 if ncfg.AddressIPv6 != nil { 156 nMap["AddressIPv6"] = ncfg.AddressIPv6.String() 157 } 158 159 return json.Marshal(nMap) 160 } 161 162 func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { 163 var ( 164 err error 165 nMap map[string]interface{} 166 ) 167 168 if err = json.Unmarshal(b, &nMap); err != nil { 169 return err 170 } 171 172 if v, ok := nMap["AddressIPv4"]; ok { 173 if ncfg.AddressIPv4, err = types.ParseCIDR(v.(string)); err != nil { 174 return types.InternalErrorf("failed to decode bridge network address IPv4 after json unmarshal: %s", v.(string)) 175 } 176 } 177 178 if v, ok := nMap["AddressIPv6"]; ok { 179 if ncfg.AddressIPv6, err = types.ParseCIDR(v.(string)); err != nil { 180 return types.InternalErrorf("failed to decode bridge network address IPv6 after json unmarshal: %s", v.(string)) 181 } 182 } 183 184 if v, ok := nMap["ContainerIfacePrefix"]; ok { 185 ncfg.ContainerIfacePrefix = v.(string) 186 } 187 188 if v, ok := nMap["HostIP"]; ok { 189 ncfg.HostIP = net.ParseIP(v.(string)) 190 } 191 192 ncfg.DefaultBridge = nMap["DefaultBridge"].(bool) 193 ncfg.DefaultBindingIP = net.ParseIP(nMap["DefaultBindingIP"].(string)) 194 ncfg.DefaultGatewayIPv4 = net.ParseIP(nMap["DefaultGatewayIPv4"].(string)) 195 ncfg.DefaultGatewayIPv6 = net.ParseIP(nMap["DefaultGatewayIPv6"].(string)) 196 ncfg.ID = nMap["ID"].(string) 197 ncfg.BridgeName = nMap["BridgeName"].(string) 198 ncfg.EnableIPv6 = nMap["EnableIPv6"].(bool) 199 ncfg.EnableIPMasquerade = nMap["EnableIPMasquerade"].(bool) 200 ncfg.EnableICC = nMap["EnableICC"].(bool) 201 if v, ok := nMap["InhibitIPv4"]; ok { 202 ncfg.InhibitIPv4 = v.(bool) 203 } 204 205 ncfg.Mtu = int(nMap["Mtu"].(float64)) 206 if v, ok := nMap["Internal"]; ok { 207 ncfg.Internal = v.(bool) 208 } 209 210 if v, ok := nMap["BridgeIfaceCreator"]; ok { 211 ncfg.BridgeIfaceCreator = ifaceCreator(v.(float64)) 212 } 213 214 return nil 215 } 216 217 func (ncfg *networkConfiguration) Key() []string { 218 return []string{bridgePrefix, ncfg.ID} 219 } 220 221 func (ncfg *networkConfiguration) KeyPrefix() []string { 222 return []string{bridgePrefix} 223 } 224 225 func (ncfg *networkConfiguration) Value() []byte { 226 b, err := json.Marshal(ncfg) 227 if err != nil { 228 return nil 229 } 230 return b 231 } 232 233 func (ncfg *networkConfiguration) SetValue(value []byte) error { 234 return json.Unmarshal(value, ncfg) 235 } 236 237 func (ncfg *networkConfiguration) Index() uint64 { 238 return ncfg.dbIndex 239 } 240 241 func (ncfg *networkConfiguration) SetIndex(index uint64) { 242 ncfg.dbIndex = index 243 ncfg.dbExists = true 244 } 245 246 func (ncfg *networkConfiguration) Exists() bool { 247 return ncfg.dbExists 248 } 249 250 func (ncfg *networkConfiguration) Skip() bool { 251 return false 252 } 253 254 func (ncfg *networkConfiguration) New() datastore.KVObject { 255 return &networkConfiguration{} 256 } 257 258 func (ncfg *networkConfiguration) CopyTo(o datastore.KVObject) error { 259 dstNcfg := o.(*networkConfiguration) 260 *dstNcfg = *ncfg 261 return nil 262 } 263 264 func (ncfg *networkConfiguration) DataScope() string { 265 return datastore.LocalScope 266 } 267 268 func (ep *bridgeEndpoint) MarshalJSON() ([]byte, error) { 269 epMap := make(map[string]interface{}) 270 epMap["id"] = ep.id 271 epMap["nid"] = ep.nid 272 epMap["SrcName"] = ep.srcName 273 epMap["MacAddress"] = ep.macAddress.String() 274 epMap["Addr"] = ep.addr.String() 275 if ep.addrv6 != nil { 276 epMap["Addrv6"] = ep.addrv6.String() 277 } 278 epMap["Config"] = ep.config 279 epMap["ContainerConfig"] = ep.containerConfig 280 epMap["ExternalConnConfig"] = ep.extConnConfig 281 epMap["PortMapping"] = ep.portMapping 282 283 return json.Marshal(epMap) 284 } 285 286 func (ep *bridgeEndpoint) UnmarshalJSON(b []byte) error { 287 var ( 288 err error 289 epMap map[string]interface{} 290 ) 291 292 if err = json.Unmarshal(b, &epMap); err != nil { 293 return fmt.Errorf("Failed to unmarshal to bridge endpoint: %v", err) 294 } 295 296 if v, ok := epMap["MacAddress"]; ok { 297 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 298 return types.InternalErrorf("failed to decode bridge endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 299 } 300 } 301 if v, ok := epMap["Addr"]; ok { 302 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 303 return types.InternalErrorf("failed to decode bridge endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 304 } 305 } 306 if v, ok := epMap["Addrv6"]; ok { 307 if ep.addrv6, err = types.ParseCIDR(v.(string)); err != nil { 308 return types.InternalErrorf("failed to decode bridge endpoint IPv6 address (%s) after json unmarshal: %v", v.(string), err) 309 } 310 } 311 ep.id = epMap["id"].(string) 312 ep.nid = epMap["nid"].(string) 313 ep.srcName = epMap["SrcName"].(string) 314 d, _ := json.Marshal(epMap["Config"]) 315 if err := json.Unmarshal(d, &ep.config); err != nil { 316 logrus.Warnf("Failed to decode endpoint config %v", err) 317 } 318 d, _ = json.Marshal(epMap["ContainerConfig"]) 319 if err := json.Unmarshal(d, &ep.containerConfig); err != nil { 320 logrus.Warnf("Failed to decode endpoint container config %v", err) 321 } 322 d, _ = json.Marshal(epMap["ExternalConnConfig"]) 323 if err := json.Unmarshal(d, &ep.extConnConfig); err != nil { 324 logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) 325 } 326 d, _ = json.Marshal(epMap["PortMapping"]) 327 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 328 logrus.Warnf("Failed to decode endpoint port mapping %v", err) 329 } 330 331 return nil 332 } 333 334 func (ep *bridgeEndpoint) Key() []string { 335 return []string{bridgeEndpointPrefix, ep.id} 336 } 337 338 func (ep *bridgeEndpoint) KeyPrefix() []string { 339 return []string{bridgeEndpointPrefix} 340 } 341 342 func (ep *bridgeEndpoint) Value() []byte { 343 b, err := json.Marshal(ep) 344 if err != nil { 345 return nil 346 } 347 return b 348 } 349 350 func (ep *bridgeEndpoint) SetValue(value []byte) error { 351 return json.Unmarshal(value, ep) 352 } 353 354 func (ep *bridgeEndpoint) Index() uint64 { 355 return ep.dbIndex 356 } 357 358 func (ep *bridgeEndpoint) SetIndex(index uint64) { 359 ep.dbIndex = index 360 ep.dbExists = true 361 } 362 363 func (ep *bridgeEndpoint) Exists() bool { 364 return ep.dbExists 365 } 366 367 func (ep *bridgeEndpoint) Skip() bool { 368 return false 369 } 370 371 func (ep *bridgeEndpoint) New() datastore.KVObject { 372 return &bridgeEndpoint{} 373 } 374 375 func (ep *bridgeEndpoint) CopyTo(o datastore.KVObject) error { 376 dstEp := o.(*bridgeEndpoint) 377 *dstEp = *ep 378 return nil 379 } 380 381 func (ep *bridgeEndpoint) DataScope() string { 382 return datastore.LocalScope 383 } 384 385 func (n *bridgeNetwork) restorePortAllocations(ep *bridgeEndpoint) { 386 if ep.extConnConfig == nil || 387 ep.extConnConfig.ExposedPorts == nil || 388 ep.extConnConfig.PortBindings == nil { 389 return 390 } 391 tmp := ep.extConnConfig.PortBindings 392 ep.extConnConfig.PortBindings = ep.portMapping 393 _, err := n.allocatePorts(ep, n.config.DefaultBindingIP, n.driver.config.EnableUserlandProxy) 394 if err != nil { 395 logrus.Warnf("Failed to reserve existing port mapping for endpoint %.7s:%v", ep.id, err) 396 } 397 ep.extConnConfig.PortBindings = tmp 398 }