diff --git a/docker/docker.go b/docker/docker.go index 1c25597..4e99e47 100644 --- a/docker/docker.go +++ b/docker/docker.go @@ -206,19 +206,19 @@ func (d *docker) DeleteContainer(id string) error { } type CreateContainerOpts struct { - Image string - WindowsEndpoint string - SessionId string - PwdIpAddress string - ContainerName string - Hostname string - ServerCert []byte - ServerKey []byte - CACert []byte - Privileged bool - HostFQDN string - Labels map[string]string - AdditionalNetworks []string + Image string + WindowsEndpoint string + SessionId string + PwdIpAddress string + ContainerName string + Hostname string + ServerCert []byte + ServerKey []byte + CACert []byte + Privileged bool + HostFQDN string + Labels map[string]string + Networks map[string]string } func (d *docker) CreateContainer(opts CreateContainerOpts) (string, error) { @@ -284,10 +284,15 @@ func (d *docker) CreateContainer(opts CreateContainerOpts) (string, error) { Env: env, Labels: opts.Labels, } - networkConf := &network.NetworkingConfig{ - map[string]*network.EndpointSettings{ - opts.SessionId: &network.EndpointSettings{Aliases: []string{opts.Hostname}}, - }, + + networkConf := &network.NetworkingConfig{} + ec := map[string]*network.EndpointSettings{} + for netId, hostname := range opts.Networks { + es := &network.EndpointSettings{} + if hostname != "" { + es.Aliases = []string{hostname} + } + ec[netId] = es } container, err := d.c.ContainerCreate(context.Background(), cf, h, networkConf, opts.ContainerName) @@ -307,13 +312,6 @@ func (d *docker) CreateContainer(opts CreateContainerOpts) (string, error) { } } - for _, netId := range opts.AdditionalNetworks { - set := &network.EndpointSettings{} - if err := d.c.NetworkConnect(context.Background(), netId, container.ID, set); err != nil { - return "", err - } - } - if err := d.copyIfSet(opts.ServerCert, "cert.pem", containerCertDir, opts.ContainerName); err != nil { return "", err } diff --git a/provisioner/dind.go b/provisioner/dind.go index d2f8cb0..c35c6e7 100644 --- a/provisioner/dind.go +++ b/provisioner/dind.go @@ -64,6 +64,7 @@ func (d *DinD) InstanceNew(session *types.Session, conf types.InstanceConfig) (* CACert: conf.CACert, HostFQDN: conf.Host, Privileged: true, + Networks: map[string]string{session.Id: conf.Hostname}, } dockerClient, err := d.factory.GetForSession(session.Id) diff --git a/provisioner/windows.go b/provisioner/windows.go index 469c340..324f7ff 100644 --- a/provisioner/windows.go +++ b/provisioner/windows.go @@ -82,6 +82,7 @@ func (d *windows) InstanceNew(session *types.Session, conf types.InstanceConfig) CACert: conf.CACert, Privileged: false, HostFQDN: conf.Host, + Networks: map[string]string{session.Id: conf.Hostname}, } dockerClient, err := d.factory.GetForSession(session.Id) diff --git a/pwd/instance_test.go b/pwd/instance_test.go index b241b9a..39c1646 100644 --- a/pwd/instance_test.go +++ b/pwd/instance_test.go @@ -89,6 +89,7 @@ func TestInstanceNew(t *testing.T) { CACert: nil, Privileged: true, HostFQDN: "something.play-with-docker.com", + Networks: map[string]string{session.Id: expectedInstance.Hostname}, } _d.On("CreateContainer", expectedContainerOpts).Return("10.0.0.1", nil) _s.On("InstanceCreate", "aaaabbbbcccc", mock.AnythingOfType("*types.Instance")).Return(nil) @@ -154,6 +155,7 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) { ServerKey: nil, CACert: nil, Privileged: true, + Networks: map[string]string{session.Id: expectedInstance.Hostname}, } _d.On("CreateContainer", expectedContainerOpts).Return("10.0.0.1", nil) _s.On("InstanceCreate", "aaaabbbbcccc", mock.AnythingOfType("*types.Instance")).Return(nil) @@ -219,6 +221,7 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) { ServerKey: nil, CACert: nil, Privileged: true, + Networks: map[string]string{session.Id: expectedInstance.Hostname}, } _d.On("CreateContainer", expectedContainerOpts).Return("10.0.0.1", nil) diff --git a/pwd/session_test.go b/pwd/session_test.go index f941570..a78424d 100644 --- a/pwd/session_test.go +++ b/pwd/session_test.go @@ -90,27 +90,27 @@ func TestSessionSetup(t *testing.T) { _s.On("SessionCount").Return(1, nil) _s.On("InstanceCount").Return(0, nil) - _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager1", Hostname: "manager1", Privileged: true, HostFQDN: "localhost"}).Return("10.0.0.2", nil) + _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager1", Hostname: "manager1", Privileged: true, HostFQDN: "localhost", Networks: map[string]string{"aaaabbbbcccc": "manager1"}}).Return("10.0.0.2", nil) _f.On("GetForInstance", mock.AnythingOfType("*types.Instance")).Return(_d, nil) _d.On("SwarmInit").Return(&docker.SwarmTokens{Manager: "managerToken", Worker: "workerToken"}, nil) _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_manager1", "10.0.0.2", "manager1", "ip10-0-0-2-aaaabbbbcccc"}).Return() - _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager2", Hostname: "manager2", Privileged: true}).Return("10.0.0.3", nil) + _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager2", Hostname: "manager2", Privileged: true, Networks: map[string]string{"aaaabbbbcccc": "manager2"}}).Return("10.0.0.3", nil) _f.On("GetForInstance", mock.AnythingOfType("*types.Instance")).Return(_d, nil) _d.On("SwarmJoin", "10.0.0.2:2377", "managerToken").Return(nil) _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_manager2", "10.0.0.3", "manager2", "ip10-0-0-3-aaaabbbbcccc"}).Return() - _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind:overlay2-dev", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager3", Hostname: "manager3", Privileged: true}).Return("10.0.0.4", nil) + _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind:overlay2-dev", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_manager3", Hostname: "manager3", Privileged: true, Networks: map[string]string{"aaaabbbbcccc": "manager3"}}).Return("10.0.0.4", nil) _f.On("GetForInstance", mock.AnythingOfType("*types.Instance")).Return(_d, nil) _d.On("SwarmJoin", "10.0.0.2:2377", "managerToken").Return(nil) _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_manager3", "10.0.0.4", "manager3", "ip10-0-0-4-aaaabbbbcccc"}).Return() - _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_worker1", Hostname: "worker1", Privileged: true}).Return("10.0.0.5", nil) + _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_worker1", Hostname: "worker1", Privileged: true, Networks: map[string]string{"aaaabbbbcccc": "worker1"}}).Return("10.0.0.5", nil) _f.On("GetForInstance", mock.AnythingOfType("*types.Instance")).Return(_d, nil) _d.On("SwarmJoin", "10.0.0.2:2377", "workerToken").Return(nil) _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_worker1", "10.0.0.5", "worker1", "ip10-0-0-5-aaaabbbbcccc"}).Return() - _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_other", Hostname: "other", Privileged: true}).Return("10.0.0.6", nil) + _d.On("CreateContainer", docker.CreateContainerOpts{Image: "franela/dind", SessionId: "aaaabbbbcccc", PwdIpAddress: "10.0.0.1", ContainerName: "aaaabbbb_other", Hostname: "other", Privileged: true, Networks: map[string]string{"aaaabbbbcccc": "other"}}).Return("10.0.0.6", nil) _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_other", "10.0.0.6", "other", "ip10-0-0-6-aaaabbbbcccc"}).Return() var nilArgs []interface{}