github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/drivers/solaris/bridge/bridge_store.go (about) 1 // +build solaris 2 3 package bridge 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "net" 9 10 "github.com/Sirupsen/logrus" 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 ) 16 17 const ( 18 // network config prefix was not specific enough. 19 // To be backward compatible, need custom endpoint 20 // prefix with different root 21 bridgePrefix = "bridge" 22 bridgeEndpointPrefix = "bridge-endpoint" 23 ) 24 25 func (d *driver) initStore(option map[string]interface{}) error { 26 if data, ok := option[netlabel.LocalKVClient]; ok { 27 var err error 28 dsc, ok := data.(discoverapi.DatastoreConfigData) 29 if !ok { 30 return types.InternalErrorf("incorrect data in datastore configuration: %v", data) 31 } 32 d.store, err = datastore.NewDataStoreFromConfig(dsc) 33 if err != nil { 34 return types.InternalErrorf("bridge driver failed to initialize data store: %v", err) 35 } 36 37 err = d.populateNetworks() 38 if err != nil { 39 return err 40 } 41 42 err = d.populateEndpoints() 43 if err != nil { 44 return err 45 } 46 } 47 48 return nil 49 } 50 51 func (d *driver) populateNetworks() error { 52 kvol, err := d.store.List(datastore.Key(bridgePrefix), &networkConfiguration{}) 53 if err != nil && err != datastore.ErrKeyNotFound { 54 return fmt.Errorf("failed to get bridge network configurations from store: %v", err) 55 } 56 57 // It's normal for network configuration state to be empty. Just return. 58 if err == datastore.ErrKeyNotFound { 59 return nil 60 } 61 62 for _, kvo := range kvol { 63 ncfg := kvo.(*networkConfiguration) 64 if err = d.createNetwork(ncfg); err != nil { 65 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) 66 } 67 logrus.Debugf("Network (%s) restored", ncfg.ID[0:7]) 68 } 69 70 return nil 71 } 72 73 func (d *driver) populateEndpoints() error { 74 kvol, err := d.store.List(datastore.Key(bridgeEndpointPrefix), &bridgeEndpoint{}) 75 if err != nil && err != datastore.ErrKeyNotFound { 76 return fmt.Errorf("failed to get bridge endpoints from store: %v", err) 77 } 78 79 if err == datastore.ErrKeyNotFound { 80 return nil 81 } 82 83 for _, kvo := range kvol { 84 ep := kvo.(*bridgeEndpoint) 85 n, ok := d.networks[ep.nid] 86 if !ok { 87 logrus.Debugf("Network (%s) not found for restored bridge endpoint (%s)", ep.nid[0:7], ep.id[0:7]) 88 logrus.Debugf("Deleting stale bridge endpoint (%s) from store", ep.nid[0:7]) 89 if err := d.storeDelete(ep); err != nil { 90 logrus.Debugf("Failed to delete stale bridge endpoint (%s) from store", ep.nid[0:7]) 91 } 92 continue 93 } 94 n.endpoints[ep.id] = ep 95 n.restorePortAllocations(ep) 96 logrus.Debugf("Endpoint (%s) restored to network (%s)", ep.id[0:7], ep.nid[0:7]) 97 } 98 99 return nil 100 } 101 102 func (d *driver) storeUpdate(kvObject datastore.KVObject) error { 103 if d.store == nil { 104 logrus.Warnf("bridge store not initialized. kv object %s is not added to the store", datastore.Key(kvObject.Key()...)) 105 return nil 106 } 107 108 if err := d.store.PutObjectAtomic(kvObject); err != nil { 109 return fmt.Errorf("failed to update bridge store for object type %T: %v", kvObject, err) 110 } 111 112 return nil 113 } 114 115 func (d *driver) storeDelete(kvObject datastore.KVObject) error { 116 if d.store == nil { 117 logrus.Debugf("bridge store not initialized. kv object %s is not deleted from store", datastore.Key(kvObject.Key()...)) 118 return nil 119 } 120 121 retry: 122 if err := d.store.DeleteObjectAtomic(kvObject); err != nil { 123 if err == datastore.ErrKeyModified { 124 if err := d.store.GetObject(datastore.Key(kvObject.Key()...), kvObject); err != nil { 125 return fmt.Errorf("could not update the kvobject to latest when trying to delete: %v", err) 126 } 127 goto retry 128 } 129 return err 130 } 131 132 return nil 133 } 134 135 func (ncfg *networkConfiguration) MarshalJSON() ([]byte, error) { 136 nMap := make(map[string]interface{}) 137 nMap["ID"] = ncfg.ID 138 nMap["BridgeName"] = ncfg.BridgeName 139 nMap["BridgeNameInternal"] = ncfg.BridgeNameInternal 140 nMap["EnableIPv6"] = ncfg.EnableIPv6 141 nMap["EnableIPMasquerade"] = ncfg.EnableIPMasquerade 142 nMap["EnableICC"] = ncfg.EnableICC 143 nMap["Mtu"] = ncfg.Mtu 144 nMap["Internal"] = ncfg.Internal 145 nMap["DefaultBridge"] = ncfg.DefaultBridge 146 nMap["DefaultBindingIP"] = ncfg.DefaultBindingIP.String() 147 nMap["DefaultBindingIntf"] = ncfg.DefaultBindingIntf 148 nMap["DefaultGatewayIPv4"] = ncfg.DefaultGatewayIPv4.String() 149 nMap["DefaultGatewayIPv6"] = ncfg.DefaultGatewayIPv6.String() 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 ncfg.DefaultBridge = nMap["DefaultBridge"].(bool) 185 ncfg.DefaultBindingIP = net.ParseIP(nMap["DefaultBindingIP"].(string)) 186 ncfg.DefaultBindingIntf = nMap["DefaultBindingIntf"].(string) 187 ncfg.DefaultGatewayIPv4 = net.ParseIP(nMap["DefaultGatewayIPv4"].(string)) 188 ncfg.DefaultGatewayIPv6 = net.ParseIP(nMap["DefaultGatewayIPv6"].(string)) 189 ncfg.ID = nMap["ID"].(string) 190 ncfg.BridgeName = nMap["BridgeName"].(string) 191 ncfg.BridgeNameInternal = nMap["BridgeNameInternal"].(string) 192 ncfg.EnableIPv6 = nMap["EnableIPv6"].(bool) 193 ncfg.EnableIPMasquerade = nMap["EnableIPMasquerade"].(bool) 194 ncfg.EnableICC = nMap["EnableICC"].(bool) 195 ncfg.Mtu = int(nMap["Mtu"].(float64)) 196 if v, ok := nMap["Internal"]; ok { 197 ncfg.Internal = v.(bool) 198 } 199 200 return nil 201 } 202 203 func (ncfg *networkConfiguration) Key() []string { 204 return []string{bridgePrefix, ncfg.ID} 205 } 206 207 func (ncfg *networkConfiguration) KeyPrefix() []string { 208 return []string{bridgePrefix} 209 } 210 211 func (ncfg *networkConfiguration) Value() []byte { 212 b, err := json.Marshal(ncfg) 213 if err != nil { 214 return nil 215 } 216 return b 217 } 218 219 func (ncfg *networkConfiguration) SetValue(value []byte) error { 220 return json.Unmarshal(value, ncfg) 221 } 222 223 func (ncfg *networkConfiguration) Index() uint64 { 224 return ncfg.dbIndex 225 } 226 227 func (ncfg *networkConfiguration) SetIndex(index uint64) { 228 ncfg.dbIndex = index 229 ncfg.dbExists = true 230 } 231 232 func (ncfg *networkConfiguration) Exists() bool { 233 return ncfg.dbExists 234 } 235 236 func (ncfg *networkConfiguration) Skip() bool { 237 return false 238 } 239 240 func (ncfg *networkConfiguration) New() datastore.KVObject { 241 return &networkConfiguration{} 242 } 243 244 func (ncfg *networkConfiguration) CopyTo(o datastore.KVObject) error { 245 dstNcfg := o.(*networkConfiguration) 246 *dstNcfg = *ncfg 247 return nil 248 } 249 250 func (ncfg *networkConfiguration) DataScope() string { 251 return datastore.LocalScope 252 } 253 254 func (ep *bridgeEndpoint) MarshalJSON() ([]byte, error) { 255 epMap := make(map[string]interface{}) 256 epMap["id"] = ep.id 257 epMap["nid"] = ep.nid 258 epMap["SrcName"] = ep.srcName 259 epMap["MacAddress"] = ep.macAddress.String() 260 epMap["Addr"] = ep.addr.String() 261 if ep.addrv6 != nil { 262 epMap["Addrv6"] = ep.addrv6.String() 263 } 264 epMap["Config"] = ep.config 265 epMap["ContainerConfig"] = ep.containerConfig 266 epMap["ExternalConnConfig"] = ep.extConnConfig 267 epMap["PortMapping"] = ep.portMapping 268 269 return json.Marshal(epMap) 270 } 271 272 func (ep *bridgeEndpoint) UnmarshalJSON(b []byte) error { 273 var ( 274 err error 275 epMap map[string]interface{} 276 ) 277 278 if err = json.Unmarshal(b, &epMap); err != nil { 279 return fmt.Errorf("Failed to unmarshal to bridge endpoint: %v", err) 280 } 281 282 if v, ok := epMap["MacAddress"]; ok { 283 if ep.macAddress, err = net.ParseMAC(v.(string)); err != nil { 284 return types.InternalErrorf("failed to decode bridge endpoint MAC address (%s) after json unmarshal: %v", v.(string), err) 285 } 286 } 287 if v, ok := epMap["Addr"]; ok { 288 if ep.addr, err = types.ParseCIDR(v.(string)); err != nil { 289 return types.InternalErrorf("failed to decode bridge endpoint IPv4 address (%s) after json unmarshal: %v", v.(string), err) 290 } 291 } 292 if v, ok := epMap["Addrv6"]; ok { 293 if ep.addrv6, err = types.ParseCIDR(v.(string)); err != nil { 294 return types.InternalErrorf("failed to decode bridge endpoint IPv6 address (%s) after json unmarshal: %v", v.(string), err) 295 } 296 } 297 ep.id = epMap["id"].(string) 298 ep.nid = epMap["nid"].(string) 299 ep.srcName = epMap["SrcName"].(string) 300 d, _ := json.Marshal(epMap["Config"]) 301 if err := json.Unmarshal(d, &ep.config); err != nil { 302 logrus.Warnf("Failed to decode endpoint config %v", err) 303 } 304 d, _ = json.Marshal(epMap["ContainerConfig"]) 305 if err := json.Unmarshal(d, &ep.containerConfig); err != nil { 306 logrus.Warnf("Failed to decode endpoint container config %v", err) 307 } 308 d, _ = json.Marshal(epMap["ExternalConnConfig"]) 309 if err := json.Unmarshal(d, &ep.extConnConfig); err != nil { 310 logrus.Warnf("Failed to decode endpoint external connectivity configuration %v", err) 311 } 312 d, _ = json.Marshal(epMap["PortMapping"]) 313 if err := json.Unmarshal(d, &ep.portMapping); err != nil { 314 logrus.Warnf("Failed to decode endpoint port mapping %v", err) 315 } 316 317 return nil 318 } 319 320 func (ep *bridgeEndpoint) Key() []string { 321 return []string{bridgeEndpointPrefix, ep.id} 322 } 323 324 func (ep *bridgeEndpoint) KeyPrefix() []string { 325 return []string{bridgeEndpointPrefix} 326 } 327 328 func (ep *bridgeEndpoint) Value() []byte { 329 b, err := json.Marshal(ep) 330 if err != nil { 331 return nil 332 } 333 return b 334 } 335 336 func (ep *bridgeEndpoint) SetValue(value []byte) error { 337 return json.Unmarshal(value, ep) 338 } 339 340 func (ep *bridgeEndpoint) Index() uint64 { 341 return ep.dbIndex 342 } 343 344 func (ep *bridgeEndpoint) SetIndex(index uint64) { 345 ep.dbIndex = index 346 ep.dbExists = true 347 } 348 349 func (ep *bridgeEndpoint) Exists() bool { 350 return ep.dbExists 351 } 352 353 func (ep *bridgeEndpoint) Skip() bool { 354 return false 355 } 356 357 func (ep *bridgeEndpoint) New() datastore.KVObject { 358 return &bridgeEndpoint{} 359 } 360 361 func (ep *bridgeEndpoint) CopyTo(o datastore.KVObject) error { 362 dstEp := o.(*bridgeEndpoint) 363 *dstEp = *ep 364 return nil 365 } 366 367 func (ep *bridgeEndpoint) DataScope() string { 368 return datastore.LocalScope 369 } 370 371 func (n *bridgeNetwork) restorePortAllocations(ep *bridgeEndpoint) { 372 if ep.extConnConfig == nil || 373 ep.extConnConfig.ExposedPorts == nil || 374 ep.extConnConfig.PortBindings == nil { 375 return 376 } 377 tmp := ep.extConnConfig.PortBindings 378 ep.extConnConfig.PortBindings = ep.portMapping 379 _, err := n.allocatePorts(ep, n.config.DefaultBindingIntf, n.config.DefaultBindingIP, n.driver.config.EnableUserlandProxy) 380 if err != nil { 381 logrus.Warnf("Failed to reserve existing port mapping for endpoint %s:%v", ep.id[0:7], err) 382 } 383 ep.extConnConfig.PortBindings = tmp 384 }