func()

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)
}