func procGetNetworks(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var list []*networkResource // Look for query filters and validate name, queryByName := vars[urlNwName] shortID, queryByPid := vars[urlNwPID] if queryByName && queryByPid { return nil, &badQueryResponse } if queryByName { if nw, errRsp := findNetwork(c, name, byName); errRsp.isOK() { list = append(list, buildNetworkResource(nw)) } } else if queryByPid { // Return all the prefix-matching networks l := func(nw libnetwork.Network) bool { if strings.HasPrefix(nw.ID(), shortID) { list = append(list, buildNetworkResource(nw)) } return false } c.WalkNetworks(l) } else { for _, nw := range c.Networks() { list = append(list, buildNetworkResource(nw)) } } return list, &successResponse }
/*************************** NetworkController interface ****************************/ func procCreateNetwork(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var create networkCreate err := json.Unmarshal(body, &create) if err != nil { return "", &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest} } processCreateDefaults(c, &create) options := []libnetwork.NetworkOption{} if len(create.NetworkOpts) > 0 { if _, ok := create.NetworkOpts[netlabel.Internal]; ok { options = append(options, libnetwork.NetworkOptionInternalNetwork()) } } if len(create.DriverOpts) > 0 { options = append(options, libnetwork.NetworkOptionDriverOpts(create.DriverOpts)) } nw, err := c.NewNetwork(create.NetworkType, create.Name, options...) if err != nil { return "", convertNetworkError(err) } return nw.ID(), &createdResponse }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { if _, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil { return nil } netOption := map[string]string{ winlibnetwork.NetworkName: runconfig.DefaultDaemonNetworkMode().NetworkName(), } ipamV4Conf := libnetwork.IpamConf{} if config.bridgeConfig.FixedCIDR == "" { ipamV4Conf.PreferredPool = defaultNetworkSpace } else { ipamV4Conf.PreferredPool = config.bridgeConfig.FixedCIDR } v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} _, err := controller.NewNetwork(string(runconfig.DefaultDaemonNetworkMode()), runconfig.DefaultDaemonNetworkMode().NetworkName(), libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, }), libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), ) if err != nil { return fmt.Errorf("Error creating default network: %v", err) } return nil }
func procGetSandboxes(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var list []*sandboxResource cnd := getQueryCondition(vars) c.WalkSandboxes(sandboxWalker(cnd, &list)) return list, &successResponse }
func procGetNetworks(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var list []*networkResource for _, nw := range c.Networks() { nwr := buildNetworkResource(nw) list = append(list, nwr) } return list, &successResponse }
func handleSignals(controller libnetwork.NetworkController) { c := make(chan os.Signal, 1) signals := []os.Signal{os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT} signal.Notify(c, signals...) go func() { for _ = range c { controller.Stop() os.Exit(0) } }() }
func parseService(controller libnetwork.NetworkController, service string) (string, string, string) { dn := controller.Config().Daemon.DefaultNetwork dd := controller.Config().Daemon.DefaultDriver snd := strings.Split(service, ".") if len(snd) > 2 { return strings.Join(snd[:len(snd)-2], "."), snd[len(snd)-2], snd[len(snd)-1] } if len(snd) > 1 { return snd[0], snd[1], dd } return snd[0], dn, dd }
func createDefaultNetwork(c libnetwork.NetworkController) { nw := c.Config().Daemon.DefaultNetwork d := c.Config().Daemon.DefaultDriver createOptions := []libnetwork.NetworkOption{} genericOption := options.Generic{} if nw != "" && d != "" { // Bridge driver is special due to legacy reasons if d == "bridge" { genericOption[netlabel.GenericData] = map[string]string{ "BridgeName": "docker0", "DefaultBridge": "true", } createOptions = append(createOptions, libnetwork.NetworkOptionGeneric(genericOption), ipamOption(nw)) } if n, err := c.NetworkByName(nw); err == nil { logrus.Debugf("Default network %s already present. Deleting it", nw) if err = n.Delete(); err != nil { logrus.Debugf("Network could not be deleted: %v", err) return } } _, err := c.NewNetwork(d, nw, createOptions...) if err != nil { logrus.Errorf("Error creating default network : %s : %v", nw, err) } } }
func procCreateSandbox(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var create sandboxCreate err := json.Unmarshal(body, &create) if err != nil { return "", &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest} } sb, err := c.NewSandbox(create.ContainerID, create.parseOptions()...) if err != nil { return "", convertNetworkError(err) } return sb.ID(), &createdResponse }
/*************************** NetworkController interface ****************************/ func procCreateNetwork(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var create networkCreate err := json.Unmarshal(body, &create) if err != nil { return "", &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest} } nw, err := c.NewNetwork(create.NetworkType, create.Name, nil) if err != nil { return "", convertNetworkError(err) } return nw.ID(), &createdResponse }
func createNetwork(controller libnetwork.NetworkController, dnet string, driver string) (libnetwork.Network, error) { createOptions := []libnetwork.NetworkOption{} genericOption := options.Generic{} // Bridge driver is special due to legacy reasons if runconfig.NetworkMode(driver).IsBridge() { genericOption[netlabel.GenericData] = map[string]string{ bridge.BridgeName: dnet, } networkOption := libnetwork.NetworkOptionGeneric(genericOption) createOptions = append(createOptions, networkOption) } return controller.NewNetwork(driver, dnet, createOptions...) }
/*************************** NetworkController interface ****************************/ func procCreateNetwork(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { var create networkCreate err := json.Unmarshal(body, &create) if err != nil { return nil, &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest} } processCreateDefaults(c, &create) options := []libnetwork.NetworkOption{} if val, ok := create.NetworkOpts[netlabel.Internal]; ok { internal, err := strconv.ParseBool(val) if err != nil { return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest} } if internal { options = append(options, libnetwork.NetworkOptionInternalNetwork()) } } if val, ok := create.NetworkOpts[netlabel.EnableIPv6]; ok { enableIPv6, err := strconv.ParseBool(val) if err != nil { return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest} } options = append(options, libnetwork.NetworkOptionEnableIPv6(enableIPv6)) } if len(create.DriverOpts) > 0 { options = append(options, libnetwork.NetworkOptionDriverOpts(create.DriverOpts)) } if len(create.IPv4Conf) > 0 { ipamV4Conf := &libnetwork.IpamConf{ PreferredPool: create.IPv4Conf[0].PreferredPool, SubPool: create.IPv4Conf[0].SubPool, } options = append(options, libnetwork.NetworkOptionIpam("default", "", []*libnetwork.IpamConf{ipamV4Conf}, nil, nil)) } nw, err := c.NewNetwork(create.NetworkType, create.Name, create.ID, options...) if err != nil { return nil, convertNetworkError(err) } return nw.ID(), &createdResponse }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { if _, err := controller.NetworkByName(runconfig.DefaultDaemonNetworkMode().NetworkName()); err == nil { return nil } netOption := map[string]string{ winlibnetwork.NetworkName: runconfig.DefaultDaemonNetworkMode().NetworkName(), } var ipamOption libnetwork.NetworkOption var subnetPrefix string if config.bridgeConfig.FixedCIDR != "" { subnetPrefix = config.bridgeConfig.FixedCIDR } else { // TP5 doesn't support properly detecting subnet osv := system.GetOSVersion() if osv.Build < 14360 { subnetPrefix = defaultNetworkSpace } } if subnetPrefix != "" { ipamV4Conf := libnetwork.IpamConf{} ipamV4Conf.PreferredPool = subnetPrefix v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} ipamOption = libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil) } _, err := controller.NewNetwork(string(runconfig.DefaultDaemonNetworkMode()), runconfig.DefaultDaemonNetworkMode().NetworkName(), "", libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, }), ipamOption, ) if err != nil { return fmt.Errorf("Error creating default network: %v", err) } return nil }
func findSandbox(c libnetwork.NetworkController, s string, by int) (libnetwork.Sandbox, *responseStatus) { var ( sb libnetwork.Sandbox err error ) switch by { case byID: sb, err = c.SandboxByID(s) default: panic(fmt.Sprintf("unexpected selector for sandbox search: %d", by)) } if err != nil { if _, ok := err.(types.NotFoundError); ok { return nil, &responseStatus{Status: "Resource not found: Sandbox", StatusCode: http.StatusNotFound} } return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest} } return sb, &successResponse }
func findNetwork(c libnetwork.NetworkController, s string, by int) (libnetwork.Network, *responseStatus) { var ( nw libnetwork.Network err error ) switch by { case byID: nw, err = c.NetworkByID(s) case byName: nw, err = c.NetworkByName(s) default: panic(fmt.Sprintf("unexpected selector for network search: %d", by)) } if err != nil { if _, ok := err.(libnetwork.ErrNoSuchNetwork); ok { return nil, &responseStatus{Status: "Resource not found: Network", StatusCode: http.StatusNotFound} } return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest} } return nw, &successResponse }
func findService(c libnetwork.NetworkController, svs string, svBy int) (libnetwork.Endpoint, *responseStatus) { for _, nw := range c.Networks() { var ( ep libnetwork.Endpoint err error ) switch svBy { case byID: ep, err = nw.EndpointByID(svs) case byName: ep, err = nw.EndpointByName(svs) default: panic(fmt.Sprintf("unexpected selector for service search: %d", svBy)) } if err == nil { return ep, &successResponse } else if _, ok := err.(types.NotFoundError); !ok { return nil, convertNetworkError(err) } } return nil, &responseStatus{Status: "Service not found", StatusCode: http.StatusNotFound} }
func processCreateDefaults(c libnetwork.NetworkController, nc *networkCreate) { if nc.NetworkType == "" { nc.NetworkType = c.Config().Daemon.DefaultDriver } if nc.NetworkType == BridgeNetworkDriver { if nc.Options == nil { nc.Options = make(map[string]interface{}) } genericData, ok := nc.Options[netlabel.GenericData] if !ok { genericData = make(map[string]interface{}) } gData := genericData.(map[string]interface{}) if _, ok := gData["BridgeName"]; !ok { gData["BridgeName"] = nc.Name } if _, ok := gData["AllowNonDefaultBridge"]; !ok { gData["AllowNonDefaultBridge"] = "true" } nc.Options[netlabel.GenericData] = genericData } }
/****************** Service interface *******************/ func procGetServices(c libnetwork.NetworkController, vars map[string]string, body []byte) (interface{}, *responseStatus) { // Look for query filters and validate nwName, filterByNwName := vars[urlNwName] svName, queryBySvName := vars[urlEpName] shortID, queryBySvPID := vars[urlEpPID] if filterByNwName && queryBySvName || filterByNwName && queryBySvPID || queryBySvName && queryBySvPID { return nil, &badQueryResponse } var list []*endpointResource switch { case filterByNwName: // return all service present on the specified network nw, errRsp := findNetwork(c, nwName, byName) if !errRsp.isOK() { return list, &successResponse } for _, ep := range nw.Endpoints() { epr := buildEndpointResource(ep) list = append(list, epr) } case queryBySvName: // Look in each network for the service with the specified name l := func(ep libnetwork.Endpoint) bool { if ep.Name() == svName { list = append(list, buildEndpointResource(ep)) return true } return false } for _, nw := range c.Networks() { nw.WalkEndpoints(l) } case queryBySvPID: // Return all the prefix-matching services l := func(ep libnetwork.Endpoint) bool { if strings.HasPrefix(ep.ID(), shortID) { list = append(list, buildEndpointResource(ep)) } return false } for _, nw := range c.Networks() { nw.WalkEndpoints(l) } default: for _, nw := range c.Networks() { for _, ep := range nw.Endpoints() { epr := buildEndpointResource(ep) list = append(list, epr) } } } return list, &successResponse }
func createDefaultNetwork(c libnetwork.NetworkController) { nw := c.Config().Daemon.DefaultNetwork d := c.Config().Daemon.DefaultDriver createOptions := []libnetwork.NetworkOption{} genericOption := options.Generic{} if nw != "" && d != "" { // Bridge driver is special due to legacy reasons if d == "bridge" { genericOption[netlabel.GenericData] = map[string]interface{}{ "BridgeName": nw, } networkOption := libnetwork.NetworkOptionGeneric(genericOption) createOptions = append(createOptions, networkOption) } _, err := c.NewNetwork(d, nw, createOptions...) if err != nil { logrus.Errorf("Error creating default network : %s : %v", nw, err) } } }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { if n, err := controller.NetworkByName("bridge"); err == nil { if err = n.Delete(); err != nil { return fmt.Errorf("could not delete the default bridge network: %v", err) } } bridgeName := bridge.DefaultBridgeName if config.Bridge.Iface != "" { bridgeName = config.Bridge.Iface } netOption := map[string]string{ bridge.BridgeName: bridgeName, bridge.DefaultBridge: strconv.FormatBool(true), netlabel.DriverMTU: strconv.Itoa(config.Mtu), bridge.EnableIPMasquerade: strconv.FormatBool(config.Bridge.EnableIPMasq), bridge.EnableICC: strconv.FormatBool(config.Bridge.InterContainerCommunication), } // --ip processing if config.Bridge.DefaultIP != nil { netOption[bridge.DefaultBindingIP] = config.Bridge.DefaultIP.String() } ipamV4Conf := libnetwork.IpamConf{} ipamV4Conf.AuxAddresses = make(map[string]string) if nw, _, err := ipamutils.ElectInterfaceAddresses(bridgeName); err == nil { ipamV4Conf.PreferredPool = nw.String() hip, _ := types.GetHostPartIP(nw.IP, nw.Mask) if hip.IsGlobalUnicast() { ipamV4Conf.Gateway = nw.IP.String() } } if config.Bridge.IP != "" { ipamV4Conf.PreferredPool = config.Bridge.IP ip, _, err := net.ParseCIDR(config.Bridge.IP) if err != nil { return err } ipamV4Conf.Gateway = ip.String() } else if bridgeName == bridge.DefaultBridgeName && ipamV4Conf.PreferredPool != "" { logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool) } if config.Bridge.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.Bridge.FixedCIDR) if err != nil { return err } ipamV4Conf.SubPool = fCIDR.String() } if config.Bridge.DefaultGatewayIPv4 != nil { ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.Bridge.DefaultGatewayIPv4.String() } var ( ipamV6Conf *libnetwork.IpamConf deferIPv6Alloc bool ) if config.Bridge.FixedCIDRv6 != "" { _, fCIDRv6, err := net.ParseCIDR(config.Bridge.FixedCIDRv6) if err != nil { return err } // In case user has specified the daemon flag --fixed-cidr-v6 and the passed network has // at least 48 host bits, we need to guarantee the current behavior where the containers' // IPv6 addresses will be constructed based on the containers' interface MAC address. // We do so by telling libnetwork to defer the IPv6 address allocation for the endpoints // on this network until after the driver has created the endpoint and returned the // constructed address. Libnetwork will then reserve this address with the ipam driver. ones, _ := fCIDRv6.Mask.Size() deferIPv6Alloc = ones <= 80 if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} } ipamV6Conf.PreferredPool = fCIDRv6.String() } if config.Bridge.DefaultGatewayIPv6 != nil { if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} } ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.Bridge.DefaultGatewayIPv6.String() } v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} if ipamV6Conf != nil { v6Conf = append(v6Conf, ipamV6Conf) } // Initialize default network on "bridge" with the same name _, err := controller.NewNetwork("bridge", "bridge", libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, netlabel.EnableIPv6: config.Bridge.EnableIPv6, }), libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc)) if err != nil { return fmt.Errorf("Error creating default \"bridge\" network: %v", err) } return nil }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { option := options.Generic{ "EnableIPForwarding": config.Bridge.EnableIPForward, "EnableIPTables": config.Bridge.EnableIPTables, "EnableUserlandProxy": config.Bridge.EnableUserlandProxy} if err := controller.ConfigureNetworkDriver("bridge", options.Generic{netlabel.GenericData: option}); err != nil { return fmt.Errorf("Error initializing bridge driver: %v", err) } netOption := options.Generic{ "BridgeName": config.Bridge.Iface, "Mtu": config.Mtu, "EnableIPMasquerade": config.Bridge.EnableIPMasq, "EnableICC": config.Bridge.InterContainerCommunication, } if config.Bridge.IP != "" { ip, bipNet, err := net.ParseCIDR(config.Bridge.IP) if err != nil { return err } bipNet.IP = ip netOption["AddressIPv4"] = bipNet } if config.Bridge.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.Bridge.FixedCIDR) if err != nil { return err } netOption["FixedCIDR"] = fCIDR } if config.Bridge.FixedCIDRv6 != "" { _, fCIDRv6, err := net.ParseCIDR(config.Bridge.FixedCIDRv6) if err != nil { return err } netOption["FixedCIDRv6"] = fCIDRv6 } if config.Bridge.DefaultGatewayIPv4 != nil { netOption["DefaultGatewayIPv4"] = config.Bridge.DefaultGatewayIPv4 } if config.Bridge.DefaultGatewayIPv6 != nil { netOption["DefaultGatewayIPv6"] = config.Bridge.DefaultGatewayIPv6 } // --ip processing if config.Bridge.DefaultIP != nil { netOption["DefaultBindingIP"] = config.Bridge.DefaultIP } // Initialize default network on "bridge" with the same name _, err := controller.NewNetwork("bridge", "bridge", libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, netlabel.EnableIPv6: config.Bridge.EnableIPv6, })) if err != nil { return fmt.Errorf("Error creating default \"bridge\" network: %v", err) } return nil }
func processCreateDefaults(c libnetwork.NetworkController, nc *networkCreate) { if nc.NetworkType == "" { nc.NetworkType = c.Config().Daemon.DefaultDriver } }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { bridgeName := bridge.DefaultBridgeName if config.bridgeConfig.Iface != "" { bridgeName = config.bridgeConfig.Iface } netOption := map[string]string{ bridge.BridgeName: bridgeName, bridge.DefaultBridge: strconv.FormatBool(true), netlabel.DriverMTU: strconv.Itoa(config.Mtu), bridge.EnableIPMasquerade: strconv.FormatBool(config.bridgeConfig.EnableIPMasq), bridge.EnableICC: strconv.FormatBool(config.bridgeConfig.InterContainerCommunication), } // --ip processing if config.bridgeConfig.DefaultIP != nil { netOption[bridge.DefaultBindingIP] = config.bridgeConfig.DefaultIP.String() } var ( ipamV4Conf *libnetwork.IpamConf ipamV6Conf *libnetwork.IpamConf ) ipamV4Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} nwList, nw6List, err := netutils.ElectInterfaceAddresses(bridgeName) if err != nil { return errors.Wrap(err, "list bridge addresses failed") } nw := nwList[0] if len(nwList) > 1 && config.bridgeConfig.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) if err != nil { return errors.Wrap(err, "parse CIDR failed") } // Iterate through in case there are multiple addresses for the bridge for _, entry := range nwList { if fCIDR.Contains(entry.IP) { nw = entry break } } } ipamV4Conf.PreferredPool = lntypes.GetIPNetCanonical(nw).String() hip, _ := lntypes.GetHostPartIP(nw.IP, nw.Mask) if hip.IsGlobalUnicast() { ipamV4Conf.Gateway = nw.IP.String() } if config.bridgeConfig.IP != "" { ipamV4Conf.PreferredPool = config.bridgeConfig.IP ip, _, err := net.ParseCIDR(config.bridgeConfig.IP) if err != nil { return err } ipamV4Conf.Gateway = ip.String() } else if bridgeName == bridge.DefaultBridgeName && ipamV4Conf.PreferredPool != "" { logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool) } if config.bridgeConfig.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) if err != nil { return err } ipamV4Conf.SubPool = fCIDR.String() } if config.bridgeConfig.DefaultGatewayIPv4 != nil { ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.bridgeConfig.DefaultGatewayIPv4.String() } var deferIPv6Alloc bool if config.bridgeConfig.FixedCIDRv6 != "" { _, fCIDRv6, err := net.ParseCIDR(config.bridgeConfig.FixedCIDRv6) if err != nil { return err } // In case user has specified the daemon flag --fixed-cidr-v6 and the passed network has // at least 48 host bits, we need to guarantee the current behavior where the containers' // IPv6 addresses will be constructed based on the containers' interface MAC address. // We do so by telling libnetwork to defer the IPv6 address allocation for the endpoints // on this network until after the driver has created the endpoint and returned the // constructed address. Libnetwork will then reserve this address with the ipam driver. ones, _ := fCIDRv6.Mask.Size() deferIPv6Alloc = ones <= 80 if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} } ipamV6Conf.PreferredPool = fCIDRv6.String() // In case the --fixed-cidr-v6 is specified and the current docker0 bridge IPv6 // address belongs to the same network, we need to inform libnetwork about it, so // that it can be reserved with IPAM and it will not be given away to somebody else for _, nw6 := range nw6List { if fCIDRv6.Contains(nw6.IP) { ipamV6Conf.Gateway = nw6.IP.String() break } } } if config.bridgeConfig.DefaultGatewayIPv6 != nil { if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} } ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.bridgeConfig.DefaultGatewayIPv6.String() } v4Conf := []*libnetwork.IpamConf{ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} if ipamV6Conf != nil { v6Conf = append(v6Conf, ipamV6Conf) } // Initialize default network on "bridge" with the same name _, err = controller.NewNetwork("bridge", "bridge", "", libnetwork.NetworkOptionEnableIPv6(config.bridgeConfig.EnableIPv6), libnetwork.NetworkOptionDriverOpts(netOption), libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc)) if err != nil { return fmt.Errorf("Error creating default \"bridge\" network: %v", err) } return nil }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { if n, err := controller.NetworkByName("bridge"); err == nil { if err = n.Delete(); err != nil { return fmt.Errorf("could not delete the default bridge network: %v", err) } } bridgeName := bridge.DefaultBridgeName if config.bridgeConfig.Iface != "" { bridgeName = config.bridgeConfig.Iface } netOption := map[string]string{ bridge.BridgeName: bridgeName, bridge.DefaultBridge: strconv.FormatBool(true), netlabel.DriverMTU: strconv.Itoa(config.Mtu), bridge.EnableICC: strconv.FormatBool(config.bridgeConfig.InterContainerCommunication), } // --ip processing if config.bridgeConfig.DefaultIP != nil { netOption[bridge.DefaultBindingIP] = config.bridgeConfig.DefaultIP.String() } var ipamV4Conf *libnetwork.IpamConf ipamV4Conf = &libnetwork.IpamConf{AuxAddresses: make(map[string]string)} nwList, _, err := netutils.ElectInterfaceAddresses(bridgeName) if err != nil { return errors.Wrap(err, "list bridge addresses failed") } nw := nwList[0] if len(nwList) > 1 && config.bridgeConfig.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) if err != nil { return errors.Wrap(err, "parse CIDR failed") } // Iterate through in case there are multiple addresses for the bridge for _, entry := range nwList { if fCIDR.Contains(entry.IP) { nw = entry break } } } ipamV4Conf.PreferredPool = lntypes.GetIPNetCanonical(nw).String() hip, _ := lntypes.GetHostPartIP(nw.IP, nw.Mask) if hip.IsGlobalUnicast() { ipamV4Conf.Gateway = nw.IP.String() } if config.bridgeConfig.IP != "" { ipamV4Conf.PreferredPool = config.bridgeConfig.IP ip, _, err := net.ParseCIDR(config.bridgeConfig.IP) if err != nil { return err } ipamV4Conf.Gateway = ip.String() } else if bridgeName == bridge.DefaultBridgeName && ipamV4Conf.PreferredPool != "" { logrus.Infof("Default bridge (%s) is assigned with an IP address %s. Daemon option --bip can be used to set a preferred IP address", bridgeName, ipamV4Conf.PreferredPool) } if config.bridgeConfig.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.bridgeConfig.FixedCIDR) if err != nil { return err } ipamV4Conf.SubPool = fCIDR.String() } if config.bridgeConfig.DefaultGatewayIPv4 != nil { ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.bridgeConfig.DefaultGatewayIPv4.String() } v4Conf := []*libnetwork.IpamConf{ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} // Initialize default network on "bridge" with the same name _, err = controller.NewNetwork("bridge", "bridge", "", libnetwork.NetworkOptionDriverOpts(netOption), libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil), libnetwork.NetworkOptionDeferIPv6Alloc(false)) if err != nil { return fmt.Errorf("Error creating default 'bridge' network: %v", err) } return nil }
func initBridgeDriver(controller libnetwork.NetworkController, config *Config) error { if n, err := controller.NetworkByName("bridge"); err == nil { if err = n.Delete(); err != nil { return fmt.Errorf("could not delete the default bridge network: %v", err) } } bridgeName := bridge.DefaultBridgeName if config.Bridge.Iface != "" { bridgeName = config.Bridge.Iface } netOption := map[string]string{ bridge.BridgeName: bridgeName, bridge.DefaultBridge: strconv.FormatBool(true), netlabel.DriverMTU: strconv.Itoa(config.Mtu), bridge.EnableIPMasquerade: strconv.FormatBool(config.Bridge.EnableIPMasq), bridge.EnableICC: strconv.FormatBool(config.Bridge.InterContainerCommunication), } // --ip processing if config.Bridge.DefaultIP != nil { netOption[bridge.DefaultBindingIP] = config.Bridge.DefaultIP.String() } ipamV4Conf := libnetwork.IpamConf{} ipamV4Conf.AuxAddresses = make(map[string]string) if nw, _, err := ipamutils.ElectInterfaceAddresses(bridgeName); err == nil { ipamV4Conf.PreferredPool = nw.String() hip, _ := types.GetHostPartIP(nw.IP, nw.Mask) if hip.IsGlobalUnicast() { ipamV4Conf.Gateway = nw.IP.String() } } if config.Bridge.IP != "" { ipamV4Conf.PreferredPool = config.Bridge.IP ip, _, err := net.ParseCIDR(config.Bridge.IP) if err != nil { return err } ipamV4Conf.Gateway = ip.String() } if config.Bridge.FixedCIDR != "" { _, fCIDR, err := net.ParseCIDR(config.Bridge.FixedCIDR) if err != nil { return err } ipamV4Conf.SubPool = fCIDR.String() } if config.Bridge.DefaultGatewayIPv4 != nil { ipamV4Conf.AuxAddresses["DefaultGatewayIPv4"] = config.Bridge.DefaultGatewayIPv4.String() } var ipamV6Conf *libnetwork.IpamConf if config.Bridge.FixedCIDRv6 != "" { _, fCIDRv6, err := net.ParseCIDR(config.Bridge.FixedCIDRv6) if err != nil { return err } if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{} } ipamV6Conf.PreferredPool = fCIDRv6.String() } if config.Bridge.DefaultGatewayIPv6 != nil { if ipamV6Conf == nil { ipamV6Conf = &libnetwork.IpamConf{} } ipamV6Conf.AuxAddresses["DefaultGatewayIPv6"] = config.Bridge.DefaultGatewayIPv6.String() } v4Conf := []*libnetwork.IpamConf{&ipamV4Conf} v6Conf := []*libnetwork.IpamConf{} if ipamV6Conf != nil { v6Conf = append(v6Conf, ipamV6Conf) } // Initialize default network on "bridge" with the same name _, err := controller.NewNetwork("bridge", "bridge", libnetwork.NetworkOptionGeneric(options.Generic{ netlabel.GenericData: netOption, netlabel.EnableIPv6: config.Bridge.EnableIPv6, }), libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf)) if err != nil { return fmt.Errorf("Error creating default \"bridge\" network: %v", err) } return nil }