github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/drivers/bridge/bridge_store.go (about) 1 package bridge 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net" 7 8 "github.com/Sirupsen/logrus" 9 "github.com/docker/libnetwork/datastore" 10 "github.com/docker/libnetwork/discoverapi" 11 "github.com/docker/libnetwork/netlabel" 12 "github.com/docker/libnetwork/types" 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 (%s) restored", ncfg.ID[0:7]) 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 (%s) not found for restored bridge endpoint (%s)", ep.nid[0:7], ep.id[0:7]) 86 logrus.Debugf("Deleting stale bridge endpoint (%s) from store", ep.id[0:7]) 87 if err := d.storeDelete(ep); err != nil { 88 logrus.Debugf("Failed to delete stale bridge endpoint (%s) from store", ep.id[0:7]) 89 } 90 continue 91 } 92 n.endpoints[ep.id] = ep 93 n.restorePortAllocations(ep) 94 logrus.Debugf("Endpoint (%s) restored to network (%s)", ep.id[0:7], ep.nid[0:7]) 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["Mtu"] = ncfg.Mtu 141 nMap["Internal"] = ncfg.Internal 142 nMap["DefaultBridge"] = ncfg.DefaultBridge 143 nMap["DefaultBindingIP"] = ncfg.DefaultBindingIP.String() 144 nMap["DefaultGatewayIPv4"] = ncfg.DefaultGatewayIPv4.String() 145 nMap["DefaultGatewayIPv6"] = ncfg.DefaultGatewayIPv6.String() 146 nMap["BridgeIfaceCreator"] = ncfg.BridgeIfaceCreator 147 148 if ncfg.AddressIPv4 != nil { 149 nMap["AddressIPv4"] = ncfg.AddressIPv4.String() 150 } 151 152 if ncfg.AddressIPv6 != nil { 153 nMap["AddressIPv6"] = ncfg.AddressIPv6.String() 154 } 155 156 return json.Marshal(nMap) 157 } 158 159 func (ncfg *networkConfiguration) UnmarshalJSON(b []byte) error { 160 var ( 161 err error 162 nMap map[string]interface{} 163 ) 164 165 if err = json.Unmarshal(b, &nMap); err != nil { 166 return err 167 } 168 169 if v, ok := nMap["AddressIPv4"]; ok { 170 if ncfg.AddressIPv4, err = types.ParseCIDR(v.(string)); err != nil { 171 return types.InternalErrorf("failed to decode bridge network address IPv4 after json unmarshal: %s", v.(string)) 172 } 173 } 174 175 if v, ok := nMap["AddressIPv6"]; ok { 176 if ncfg.AddressIPv6, err = types.ParseCIDR(v.(string)); err != nil { 177 return types.InternalErrorf("failed to decode bridge network address IPv6 after json unmarshal: %s", v.(string)) 178 } 179 } 180 181 ncfg.DefaultBridge = nMap["DefaultBridge"].(bool) 182 ncfg.DefaultBindingIP = net.ParseIP(nMap["DefaultBindingIP"].(string)) 183 ncfg.DefaultGatewayIPv4 = net.ParseIP(nMap["DefaultGatewayIPv4"].(string)) 184 ncfg.DefaultGatewayIPv6 = net.ParseIP(nMap["DefaultGatewayIPv6"].(string)) 185 ncfg.ID = nMap["ID"].(string) 186 ncfg.BridgeName = nMap["BridgeName"].(string) 187 ncfg.EnableIPv6 = nMap["EnableIPv6"].(bool) 188 ncfg.EnableIPMasquerade = nMap["EnableIPMasquerade"].(bool) 189 ncfg.EnableICC = nMap["EnableICC"].(bool) 190 ncfg.Mtu = int(nMap["Mtu"].(float64)) 191 if v, ok := nMap["Internal"]; ok { 192 ncfg.Internal = v.(bool) 193 } 194 195 if v, ok := nMap["BridgeIfaceCreator"]; ok { 196 ncfg.BridgeIfaceCreator = ifaceCreator(v.(float64)) 197 } 198 199 return nil 200 } 201 202 func (ncfg *networkConfiguration) Key() []string { 203 return []string{bridgePrefix, ncfg.ID} 204 } 205 206 func (ncfg *networkConfiguration) KeyPrefix() []string { 207 return []string{bridgePrefix} 208 } 209 210 func (ncfg *networkConfiguration) Value() []byte { 211 b, err := json.Marshal(ncfg) 212 if err != nil { 213 return nil 214 } 215 return b 216 } 217 218 func (ncfg *networkConfiguration) SetValue(value []byte) error { 219 return json.Unmarshal(value, ncfg) 220 } 221 222 func (ncfg *networkConfiguration) Index() uint64 { 223 return ncfg.dbIndex 224 } 225 226 func (ncfg *networkConfiguration) SetIndex(index uint64) { 227 ncfg.dbIndex = index 228 ncfg.dbExists = true 229 } 230 231 func (ncfg *networkConfiguration) Exists() bool { 232 return ncfg.dbExists 233 } 234 235 func (ncfg *networkConfiguration) Skip() bool { 236 return false 237 } 238 239 func (ncfg *networkConfiguration) New() datastore.KVObject { 240 return &networkConfiguration{} 241 } 242 243 func (ncfg *networkConfiguration) CopyTo(o datastore.KVObject) error { 244 dstNcfg := o.(*networkConfiguration) 245 *dstNcfg = *ncfg 246 return nil 247 } 248 249 func (ncfg *networkConfiguration) DataScope() string { 250 return datastore.LocalScope 251 } 252 253 func (ep *bridgeEndpoint) MarshalJSON() ([]byte, error) { 254 epMap := make(map[string]interface{}) 255 epMap["id"] = ep.id 256 epMap["nid"] = ep.nid 257 epMap["SrcName"] = ep.srcName 258 epMap["MacAddress"] = ep.macAddress.String() 259 epMap["Addr"] = ep.addr.String() 260 if ep.addrv6 != nil { 261 epMap["Addrv6"] = ep.addrv6.String() 262 } 263 epMap["Config"] = ep.config 264 epMap["ContainerConfig"] = ep.containerConfig 265 epMap["ExternalConnConfig"] = ep.extConnConfig 266 epMap["PortMapping"] = ep.portMapping 267 268 return json.Marshal(epMap) 269 } 270 271 func (ep *bridgeEndpoint) UnmarshalJSON(b []byte) error { 272 var ( 273 err error 274 epMap map[string]interface{} 275 ) 276 277 if err = json.Unmarshal(b, &epMap); err != nil { 278 return fmt.Errorf("Failed to unmarshal to bridge endpoint: %v", err) 279 } 280 281 if v, ok := epMap["MacAddress"]; ok { 282 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 283 return types.InternalErrorf("failed to decode bridge endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 284 } 285 } 286 if v, ok := epMap["Addr"]; ok { 287 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 288 return types.InternalErrorf("failed to decode bridge endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 289 } 290 } 291 if v, ok := epMap["Addrv6"]; ok { 292 if ep.addrv6, err = types.ParseCIDR(v.(string)); err != nil { 293 return types.InternalErrorf("failed to decode bridge endpoint IPv6 address (%s) after json unmarshal: %v", v.(string), err) 294 } 295 } 296 ep.id = epMap["id"].(string) 297 ep.nid = epMap["nid"].(string) 298 ep.srcName = epMap["SrcName"].(string) 299 d, _ := json.Marshal(epMap["Config"]) 300 if err := json.Unmarshal(d, &ep.config); err != nil { 301 logrus.Warnf("Failed to decode endpoint config %v", err) 302 } 303 d, _ = json.Marshal(epMap["ContainerConfig"]) 304 if err := json.Unmarshal(d, &ep.containerConfig); err != nil { 305 logrus.Warnf("Failed to decode endpoint container config %v", err) 306 } 307 d, _ = json.Marshal(epMap["ExternalConnConfig"]) 308 if err := json.Unmarshal(d, &ep.extConnConfig); err != nil { 309 logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) 310 } 311 d, _ = json.Marshal(epMap["PortMapping"]) 312 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 313 logrus.Warnf("Failed to decode endpoint port mapping %v", err) 314 } 315 316 return nil 317 } 318 319 func (ep *bridgeEndpoint) Key() []string { 320 return []string{bridgeEndpointPrefix, ep.id} 321 } 322 323 func (ep *bridgeEndpoint) KeyPrefix() []string { 324 return []string{bridgeEndpointPrefix} 325 } 326 327 func (ep *bridgeEndpoint) Value() []byte { 328 b, err := json.Marshal(ep) 329 if err != nil { 330 return nil 331 } 332 return b 333 } 334 335 func (ep *bridgeEndpoint) SetValue(value []byte) error { 336 return json.Unmarshal(value, ep) 337 } 338 339 func (ep *bridgeEndpoint) Index() uint64 { 340 return ep.dbIndex 341 } 342 343 func (ep *bridgeEndpoint) SetIndex(index uint64) { 344 ep.dbIndex = index 345 ep.dbExists = true 346 } 347 348 func (ep *bridgeEndpoint) Exists() bool { 349 return ep.dbExists 350 } 351 352 func (ep *bridgeEndpoint) Skip() bool { 353 return false 354 } 355 356 func (ep *bridgeEndpoint) New() datastore.KVObject { 357 return &bridgeEndpoint{} 358 } 359 360 func (ep *bridgeEndpoint) CopyTo(o datastore.KVObject) error { 361 dstEp := o.(*bridgeEndpoint) 362 *dstEp = *ep 363 return nil 364 } 365 366 func (ep *bridgeEndpoint) DataScope() string { 367 return datastore.LocalScope 368 } 369 370 func (n *bridgeNetwork) restorePortAllocations(ep *bridgeEndpoint) { 371 if ep.extConnConfig == nil || 372 ep.extConnConfig.ExposedPorts == nil || 373 ep.extConnConfig.PortBindings == nil { 374 return 375 } 376 tmp := ep.extConnConfig.PortBindings 377 ep.extConnConfig.PortBindings = ep.portMapping 378 _, err := n.allocatePorts(ep, n.config.DefaultBindingIP, n.driver.config.EnableUserlandProxy) 379 if err != nil { 380 logrus.Warnf("Failed to reserve existing port mapping for endpoint %s:%v", ep.id[0:7], err) 381 } 382 ep.extConnConfig.PortBindings = tmp 383 }