|
@@ -8,7 +8,6 @@ import (
|
|
"github.com/dotcloud/docker/engine"
|
|
"github.com/dotcloud/docker/engine"
|
|
"github.com/dotcloud/docker/execdriver"
|
|
"github.com/dotcloud/docker/execdriver"
|
|
"github.com/dotcloud/docker/graphdriver"
|
|
"github.com/dotcloud/docker/graphdriver"
|
|
- "github.com/dotcloud/docker/networkdriver/ipallocator"
|
|
|
|
"github.com/dotcloud/docker/pkg/mount"
|
|
"github.com/dotcloud/docker/pkg/mount"
|
|
"github.com/dotcloud/docker/pkg/term"
|
|
"github.com/dotcloud/docker/pkg/term"
|
|
"github.com/dotcloud/docker/utils"
|
|
"github.com/dotcloud/docker/utils"
|
|
@@ -16,7 +15,6 @@ import (
|
|
"io"
|
|
"io"
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
"log"
|
|
"log"
|
|
- "net"
|
|
|
|
"os"
|
|
"os"
|
|
"path"
|
|
"path"
|
|
"path/filepath"
|
|
"path/filepath"
|
|
@@ -47,7 +45,6 @@ type Container struct {
|
|
State State
|
|
State State
|
|
Image string
|
|
Image string
|
|
|
|
|
|
- network *NetworkInterface
|
|
|
|
NetworkSettings *NetworkSettings
|
|
NetworkSettings *NetworkSettings
|
|
|
|
|
|
ResolvConfPath string
|
|
ResolvConfPath string
|
|
@@ -558,6 +555,7 @@ func populateCommand(c *Container) {
|
|
en *execdriver.Network
|
|
en *execdriver.Network
|
|
driverConfig []string
|
|
driverConfig []string
|
|
)
|
|
)
|
|
|
|
+
|
|
if !c.Config.NetworkDisabled {
|
|
if !c.Config.NetworkDisabled {
|
|
network := c.NetworkSettings
|
|
network := c.NetworkSettings
|
|
en = &execdriver.Network{
|
|
en = &execdriver.Network{
|
|
@@ -603,15 +601,18 @@ func (container *Container) Start() (err error) {
|
|
if container.State.IsRunning() {
|
|
if container.State.IsRunning() {
|
|
return fmt.Errorf("The container %s is already running.", container.ID)
|
|
return fmt.Errorf("The container %s is already running.", container.ID)
|
|
}
|
|
}
|
|
|
|
+
|
|
defer func() {
|
|
defer func() {
|
|
if err != nil {
|
|
if err != nil {
|
|
container.cleanup()
|
|
container.cleanup()
|
|
}
|
|
}
|
|
}()
|
|
}()
|
|
|
|
+
|
|
if err := container.Mount(); err != nil {
|
|
if err := container.Mount(); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- if container.runtime.networkManager.disabled {
|
|
|
|
|
|
+
|
|
|
|
+ if container.runtime.config.DisableNetwork {
|
|
container.Config.NetworkDisabled = true
|
|
container.Config.NetworkDisabled = true
|
|
container.buildHostnameAndHostsFiles("127.0.1.1")
|
|
container.buildHostnameAndHostsFiles("127.0.1.1")
|
|
} else {
|
|
} else {
|
|
@@ -669,34 +670,39 @@ func (container *Container) Start() (err error) {
|
|
}
|
|
}
|
|
|
|
|
|
if len(children) > 0 {
|
|
if len(children) > 0 {
|
|
- container.activeLinks = make(map[string]*Link, len(children))
|
|
|
|
-
|
|
|
|
- // If we encounter an error make sure that we rollback any network
|
|
|
|
- // config and ip table changes
|
|
|
|
- rollback := func() {
|
|
|
|
- for _, link := range container.activeLinks {
|
|
|
|
- link.Disable()
|
|
|
|
- }
|
|
|
|
- container.activeLinks = nil
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for p, child := range children {
|
|
|
|
- link, err := NewLink(container, child, p, runtime.networkManager.bridgeIface)
|
|
|
|
- if err != nil {
|
|
|
|
- rollback()
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- container.activeLinks[link.Alias()] = link
|
|
|
|
- if err := link.Enable(); err != nil {
|
|
|
|
- rollback()
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
|
|
+ panic("todo crosbymichael")
|
|
|
|
+ /*
|
|
|
|
+ linking is specific to iptables and the bridge we need to move this to a job
|
|
|
|
+
|
|
|
|
+ container.activeLinks = make(map[string]*Link, len(children))
|
|
|
|
+
|
|
|
|
+ // If we encounter an error make sure that we rollback any network
|
|
|
|
+ // config and ip table changes
|
|
|
|
+ rollback := func() {
|
|
|
|
+ for _, link := range container.activeLinks {
|
|
|
|
+ link.Disable()
|
|
|
|
+ }
|
|
|
|
+ container.activeLinks = nil
|
|
|
|
+ }
|
|
|
|
|
|
- for _, envVar := range link.ToEnv() {
|
|
|
|
- env = append(env, envVar)
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ for p, child := range children {
|
|
|
|
+ link, err := NewLink(container, child, p, runtime.networkManager.bridgeIface)
|
|
|
|
+ if err != nil {
|
|
|
|
+ rollback()
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ container.activeLinks[link.Alias()] = link
|
|
|
|
+ if err := link.Enable(); err != nil {
|
|
|
|
+ rollback()
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, envVar := range link.ToEnv() {
|
|
|
|
+ env = append(env, envVar)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ */
|
|
}
|
|
}
|
|
|
|
|
|
for _, elem := range container.Config.Env {
|
|
for _, elem := range container.Config.Env {
|
|
@@ -1102,34 +1108,44 @@ func (container *Container) allocateNetwork() error {
|
|
}
|
|
}
|
|
|
|
|
|
var (
|
|
var (
|
|
- iface *NetworkInterface
|
|
|
|
- err error
|
|
|
|
|
|
+ env *engine.Env
|
|
|
|
+ eng = container.runtime.srv.Eng
|
|
)
|
|
)
|
|
if container.State.IsGhost() {
|
|
if container.State.IsGhost() {
|
|
- if manager := container.runtime.networkManager; manager.disabled {
|
|
|
|
- iface = &NetworkInterface{disabled: true}
|
|
|
|
|
|
+ if container.runtime.config.DisableNetwork {
|
|
|
|
+ env = &engine.Env{}
|
|
} else {
|
|
} 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
|
|
|
|
|
|
+ // TODO: @crosbymichael
|
|
|
|
+ panic("not implemented")
|
|
|
|
+ /*
|
|
|
|
+ iface = &NetworkInterface{
|
|
|
|
+ IPNet: net.IPNet{IP: net.ParseIP(container.NetworkSettings.IPAddress), Mask: manager.bridgeNetwork.Mask},
|
|
|
|
+ Gateway: manager.bridgeNetwork.IP,
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- iface, err = container.runtime.networkManager.Allocate()
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
|
|
+
|
|
|
|
+ // request an existing ip
|
|
|
|
+ if iface != nil && iface.IPNet.IP != nil {
|
|
|
|
+ if _, err := ipallocator.RequestIP(manager.bridgeNetwork, &iface.IPNet.IP); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ job = eng.Job("allocate_interface", container.ID)
|
|
|
|
+ if err := job.Run(); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ */
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- iface, err = container.runtime.networkManager.Allocate()
|
|
|
|
|
|
+ job := eng.Job("allocate_interface", container.ID)
|
|
|
|
+ var err error
|
|
|
|
+ env, err = job.Stdout.AddEnv()
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ if err := job.Run(); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if container.Config.PortSpecs != nil {
|
|
if container.Config.PortSpecs != nil {
|
|
@@ -1171,37 +1187,43 @@ func (container *Container) allocateNetwork() error {
|
|
if container.hostConfig.PublishAllPorts && len(binding) == 0 {
|
|
if container.hostConfig.PublishAllPorts && len(binding) == 0 {
|
|
binding = append(binding, PortBinding{})
|
|
binding = append(binding, PortBinding{})
|
|
}
|
|
}
|
|
|
|
+
|
|
for i := 0; i < len(binding); i++ {
|
|
for i := 0; i < len(binding); i++ {
|
|
b := binding[i]
|
|
b := binding[i]
|
|
- nat, err := iface.AllocatePort(port, b)
|
|
|
|
- if err != nil {
|
|
|
|
- iface.Release()
|
|
|
|
|
|
+
|
|
|
|
+ portJob := eng.Job("allocate_port", container.ID)
|
|
|
|
+ portJob.Setenv("HostIP", b.HostIp)
|
|
|
|
+ portJob.Setenv("HostPort", b.HostPort)
|
|
|
|
+ portJob.Setenv("Proto", port.Proto())
|
|
|
|
+ portJob.Setenv("ContainerPort", port.Port())
|
|
|
|
+
|
|
|
|
+ if err := portJob.Run(); err != nil {
|
|
|
|
+ eng.Job("release_interface", container.ID).Run()
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- utils.Debugf("Allocate port: %s:%s->%s", nat.Binding.HostIp, port, nat.Binding.HostPort)
|
|
|
|
- binding[i] = nat.Binding
|
|
|
|
}
|
|
}
|
|
bindings[port] = binding
|
|
bindings[port] = binding
|
|
}
|
|
}
|
|
container.writeHostConfig()
|
|
container.writeHostConfig()
|
|
|
|
|
|
container.NetworkSettings.Ports = bindings
|
|
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()
|
|
|
|
|
|
+ container.NetworkSettings.Bridge = env.Get("Bridge")
|
|
|
|
+ container.NetworkSettings.IPAddress = env.Get("IP")
|
|
|
|
+ container.NetworkSettings.IPPrefixLen = env.GetInt("IPPrefixLen")
|
|
|
|
+ container.NetworkSettings.Gateway = env.Get("Gateway")
|
|
|
|
+ fmt.Printf("\n-----> %#v\n", container.NetworkSettings)
|
|
|
|
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
func (container *Container) releaseNetwork() {
|
|
func (container *Container) releaseNetwork() {
|
|
- if container.Config.NetworkDisabled || container.network == nil {
|
|
|
|
|
|
+ if container.Config.NetworkDisabled {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- container.network.Release()
|
|
|
|
- container.network = nil
|
|
|
|
|
|
+ eng := container.runtime.srv.Eng
|
|
|
|
+
|
|
|
|
+ eng.Job("release_interface", container.ID).Run()
|
|
container.NetworkSettings = &NetworkSettings{}
|
|
container.NetworkSettings = &NetworkSettings{}
|
|
}
|
|
}
|
|
|
|
|