// Allocate a network interface func Allocate(job *engine.Job) engine.Status { var ( ip *net.IP err error id = job.Args[0] requestedIP = net.ParseIP(job.Getenv("RequestedIP")) ) if requestedIP != nil { ip, err = ipallocator.RequestIP(bridgeNetwork, &requestedIP) } else { ip, err = ipallocator.RequestIP(bridgeNetwork, nil) } if err != nil { job.Error(err) return engine.StatusErr } out := engine.Env{} out.Set("IP", ip.String()) out.Set("Mask", bridgeNetwork.Mask.String()) out.Set("Gateway", bridgeNetwork.IP.String()) out.Set("Bridge", bridgeIface) size, _ := bridgeNetwork.Mask.Size() out.SetInt("IPPrefixLen", size) currentInterfaces[id] = &networkInterface{ IP: *ip, } out.WriteTo(job.Stdout) return engine.StatusOK }
// Allocate a network interface func (manager *NetworkManager) Allocate() (*NetworkInterface, error) { if manager.disabled { return &NetworkInterface{disabled: true}, nil } var ip *net.IP var err error ip, err = ipallocator.RequestIP(manager.bridgeNetwork, nil) if err != nil { return nil, err } iface := &NetworkInterface{ IPNet: net.IPNet{IP: *ip, Mask: manager.bridgeNetwork.Mask}, Gateway: manager.bridgeNetwork.IP, manager: manager, } return iface, nil }
// Allocate a network interface func (manager *NetworkManager) Allocate() (*NetworkInterface, error) { if manager.disabled { return &NetworkInterface{disabled: true}, nil } var ip *net.IP var err error ip, err = ipallocator.RequestIP(manager.bridgeNetwork, nil) if err != nil { return nil, err } // TODO: @crosbymichael why are we doing this ? /* // avoid duplicate IP ipNum := ipToInt(ip) firstIP := manager.ipAllocator.network.IP.To4().Mask(manager.ipAllocator.network.Mask) firstIPNum := ipToInt(firstIP) + 1 if firstIPNum == ipNum { ip, err = manager.ipAllocator.Acquire() if err != nil { return nil, err } } */ iface := &NetworkInterface{ IPNet: net.IPNet{IP: *ip, Mask: manager.bridgeNetwork.Mask}, Gateway: manager.bridgeNetwork.IP, manager: manager, } return iface, nil }
func (container *Container) allocateNetwork() error { if container.Config.NetworkDisabled { return nil } var ( iface *NetworkInterface err error ) if container.State.IsGhost() { if manager := container.runtime.networkManager; manager.disabled { iface = &NetworkInterface{disabled: true} } else { iface = &NetworkInterface{ IPNet: net.IPNet{IP: net.ParseIP(container.NetworkSettings.IPAddress), Mask: manager.bridgeNetwork.Mask}, Gateway: manager.bridgeNetwork.IP, manager: manager, } if iface != nil && iface.IPNet.IP != nil { if _, err := ipallocator.RequestIP(manager.bridgeNetwork, &iface.IPNet.IP); err != nil { return err } } else { iface, err = container.runtime.networkManager.Allocate() if err != nil { return err } } } } else { iface, err = container.runtime.networkManager.Allocate() if err != nil { return err } } if container.Config.PortSpecs != nil { utils.Debugf("Migrating port mappings for container: %s", strings.Join(container.Config.PortSpecs, ", ")) if err := migratePortMappings(container.Config, container.hostConfig); err != nil { return err } container.Config.PortSpecs = nil if err := container.writeHostConfig(); err != nil { return err } } var ( portSpecs = make(map[Port]struct{}) bindings = make(map[Port][]PortBinding) ) if !container.State.IsGhost() { if container.Config.ExposedPorts != nil { portSpecs = container.Config.ExposedPorts } if container.hostConfig.PortBindings != nil { bindings = container.hostConfig.PortBindings } } else { if container.NetworkSettings.Ports != nil { for port, binding := range container.NetworkSettings.Ports { portSpecs[port] = struct{}{} bindings[port] = binding } } } container.NetworkSettings.PortMapping = nil for port := range portSpecs { binding := bindings[port] if container.hostConfig.PublishAllPorts && len(binding) == 0 { binding = append(binding, PortBinding{}) } for i := 0; i < len(binding); i++ { b := binding[i] nat, err := iface.AllocatePort(port, b) if err != nil { iface.Release() return err } utils.Debugf("Allocate port: %s:%s->%s", nat.Binding.HostIp, port, nat.Binding.HostPort) binding[i] = nat.Binding } bindings[port] = binding } container.writeHostConfig() container.NetworkSettings.Ports = bindings container.network = iface container.NetworkSettings.Bridge = container.runtime.networkManager.bridgeIface container.NetworkSettings.IPAddress = iface.IPNet.IP.String() container.NetworkSettings.IPPrefixLen, _ = iface.IPNet.Mask.Size() container.NetworkSettings.Gateway = iface.Gateway.String() return nil }