in plugins/ecs-bridge/engine/engine.go [229:269]
func (engine *engine) ConfigureBridge(result *current.Result, bridge *netlink.Bridge) error {
addrs, err := engine.netLink.AddrList(bridge, syscall.AF_INET)
if err != nil && err != syscall.ENOENT {
return errors.Wrapf(err,
"bridge configure: unable to list addresses for bridge %s",
bridge.Attrs().Name)
}
resultBridgeNetwork := &net.IPNet{
IP: result.IPs[0].Gateway,
Mask: result.IPs[0].Address.Mask,
}
resultBridgeCIDR := resultBridgeNetwork.String()
if len(addrs) > 0 {
for _, addr := range addrs {
if addr.IPNet.String() == resultBridgeCIDR {
return nil
}
}
return errors.New("bridge configure: mismatch in bridge ip address")
}
bridgeAddr := &netlink.Addr{
IPNet: resultBridgeNetwork,
}
addrAddErr := engine.netLink.AddrAdd(bridge, bridgeAddr)
if addrAddErr == nil {
return nil
}
if strings.Contains(addrAddErr.Error(), fileExistsErrMsg) {
// if we fail to assign ip address because of a file exist error, the error is probably caused by someone else
// assigned the address right before we assigned it, which is fine
return nil
}
return errors.Wrapf(addrAddErr,
"bridge configure: unable to assign ip address to bridge %s",
bridge.Attrs().Name)
}