| package pwd |
|
|
| import ( |
| "context" |
| "fmt" |
| "testing" |
| "time" |
|
|
| dtypes "github.com/docker/docker/api/types" |
| "github.com/play-with-docker/play-with-docker/config" |
| "github.com/play-with-docker/play-with-docker/docker" |
| "github.com/play-with-docker/play-with-docker/event" |
| "github.com/play-with-docker/play-with-docker/id" |
| "github.com/play-with-docker/play-with-docker/provisioner" |
| "github.com/play-with-docker/play-with-docker/pwd/types" |
| "github.com/play-with-docker/play-with-docker/router" |
| "github.com/play-with-docker/play-with-docker/storage" |
| "github.com/stretchr/testify/assert" |
| "github.com/stretchr/testify/mock" |
| ) |
|
|
| func TestInstanceResizeTerminal(t *testing.T) { |
| _d := &docker.Mock{} |
| _f := &docker.FactoryMock{} |
| _s := &storage.Mock{} |
| _g := &id.MockGenerator{} |
| _e := &event.Mock{} |
| ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) |
| sp := provisioner.NewOverlaySessionProvisioner(_f) |
|
|
| s := &types.Session{Id: "aaaabbbbcccc"} |
| _d.On("ContainerResize", "foobar", uint(24), uint(80)).Return(nil) |
| _s.On("SessionGet", "aaaabbbbcccc").Return(s, nil) |
| _f.On("GetForSession", s).Return(_d, nil) |
|
|
| p := NewPWD(_f, _e, _s, sp, ipf) |
|
|
| err := p.InstanceResizeTerminal(&types.Instance{Name: "foobar", SessionId: "aaaabbbbcccc"}, 24, 80) |
| assert.Nil(t, err) |
|
|
| _d.AssertExpectations(t) |
| _f.AssertExpectations(t) |
| _s.AssertExpectations(t) |
| _g.AssertExpectations(t) |
| _e.M.AssertExpectations(t) |
| } |
|
|
| func TestInstanceNew(t *testing.T) { |
| _d := &docker.Mock{} |
| _f := &docker.FactoryMock{} |
| _s := &storage.Mock{} |
| _g := &id.MockGenerator{} |
| _e := &event.Mock{} |
| ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) |
| sp := provisioner.NewOverlaySessionProvisioner(_f) |
|
|
| _g.On("NewId").Return("aaaabbbbcccc") |
| _f.On("GetForSession", mock.AnythingOfType("*types.Session")).Return(_d, nil) |
| _d.On("NetworkCreate", "aaaabbbbcccc", dtypes.NetworkCreate{Attachable: true, Driver: "overlay"}).Return(nil) |
| _d.On("DaemonHost").Return("localhost") |
| _d.On("NetworkConnect", config.L2ContainerName, "aaaabbbbcccc", "").Return("10.0.0.1", nil) |
| _s.On("SessionPut", mock.AnythingOfType("*types.Session")).Return(nil) |
| _s.On("SessionCount").Return(1, nil) |
| _s.On("ClientCount").Return(0, nil) |
| _s.On("InstanceCount").Return(0, nil) |
| _s.On("InstanceFindBySessionId", "aaaabbbbcccc").Return([]*types.Instance{}, nil) |
|
|
| var nilArgs []interface{} |
| _e.M.On("Emit", event.SESSION_NEW, "aaaabbbbcccc", nilArgs).Return() |
|
|
| p := NewPWD(_f, _e, _s, sp, ipf) |
| p.generator = _g |
|
|
| playground := &types.Playground{Id: "foobar", DefaultDinDInstanceImage: "franela/dind"} |
|
|
| _s.On("PlaygroundGet", "foobar").Return(playground, nil) |
|
|
| sConfig := types.SessionConfig{Playground: playground, UserId: "", Duration: time.Hour, Stack: "", StackName: "", ImageName: ""} |
| session, err := p.SessionNew(context.Background(), sConfig) |
| assert.Nil(t, err) |
|
|
| expectedInstance := types.Instance{ |
| Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), |
| Hostname: "node1", |
| IP: "10.0.0.1", |
| RoutableIP: "10.0.0.1", |
| Image: "franela/dind", |
| SessionId: session.Id, |
| SessionHost: session.Host, |
| ProxyHost: router.EncodeHost(session.Id, "10.0.0.1", router.HostOpts{}), |
| } |
| expectedContainerOpts := docker.CreateContainerOpts{ |
| Image: expectedInstance.Image, |
| SessionId: session.Id, |
| ContainerName: expectedInstance.Name, |
| Hostname: expectedInstance.Hostname, |
| ServerCert: nil, |
| ServerKey: nil, |
| CACert: nil, |
| Privileged: false, |
| HostFQDN: "something.play-with-docker.com", |
| Networks: []string{session.Id}, |
| } |
| _d.On("ContainerCreate", expectedContainerOpts).Return(nil) |
| _d.On("ContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, nil) |
| _s.On("InstancePut", mock.AnythingOfType("*types.Instance")).Return(nil) |
| _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_aaaabbbbcccc", "10.0.0.1", "node1", "ip10-0-0-1-aaaabbbbcccc"}).Return() |
|
|
| instance, err := p.InstanceNew(session, types.InstanceConfig{PlaygroundFQDN: "something.play-with-docker.com"}) |
| assert.Nil(t, err) |
|
|
| assert.Equal(t, expectedInstance, *instance) |
|
|
| _d.AssertExpectations(t) |
| _f.AssertExpectations(t) |
| _s.AssertExpectations(t) |
| _g.AssertExpectations(t) |
| _e.M.AssertExpectations(t) |
| } |
|
|
| func TestInstanceNew_Privileged(t *testing.T) { |
| _d := &docker.Mock{} |
| _f := &docker.FactoryMock{} |
| _s := &storage.Mock{} |
| _g := &id.MockGenerator{} |
| _e := &event.Mock{} |
| ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) |
| sp := provisioner.NewOverlaySessionProvisioner(_f) |
|
|
| _g.On("NewId").Return("aaaabbbbcccc") |
| _f.On("GetForSession", mock.AnythingOfType("*types.Session")).Return(_d, nil) |
| _d.On("NetworkCreate", "aaaabbbbcccc", dtypes.NetworkCreate{Attachable: true, Driver: "overlay"}).Return(nil) |
| _d.On("DaemonHost").Return("localhost") |
| _d.On("NetworkConnect", config.L2ContainerName, "aaaabbbbcccc", "").Return("10.0.0.1", nil) |
| _s.On("SessionPut", mock.AnythingOfType("*types.Session")).Return(nil) |
| _s.On("SessionCount").Return(1, nil) |
| _s.On("ClientCount").Return(0, nil) |
| _s.On("InstanceCount").Return(0, nil) |
| _s.On("InstanceFindBySessionId", "aaaabbbbcccc").Return([]*types.Instance{}, nil) |
|
|
| var nilArgs []interface{} |
| _e.M.On("Emit", event.SESSION_NEW, "aaaabbbbcccc", nilArgs).Return() |
|
|
| p := NewPWD(_f, _e, _s, sp, ipf) |
| p.generator = _g |
|
|
| playground := &types.Playground{Id: "foobar"} |
| sConfig := types.SessionConfig{Playground: playground, UserId: "", Duration: time.Hour, Stack: "", StackName: "", ImageName: ""} |
| session, err := p.SessionNew(context.Background(), sConfig) |
|
|
| assert.Nil(t, err) |
|
|
| |
| |
| |
| |
| config.Unsafe = true |
| defer func() { |
| config.Unsafe = false |
| }() |
|
|
| expectedInstance := types.Instance{ |
| Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), |
| Hostname: "node1", |
| IP: "10.0.0.1", |
| RoutableIP: "10.0.0.1", |
| Image: "redis", |
| SessionId: session.Id, |
| SessionHost: session.Host, |
| ProxyHost: router.EncodeHost(session.Id, "10.0.0.1", router.HostOpts{}), |
| } |
| expectedContainerOpts := docker.CreateContainerOpts{ |
| Image: expectedInstance.Image, |
| SessionId: session.Id, |
| ContainerName: expectedInstance.Name, |
| Hostname: expectedInstance.Hostname, |
| ServerCert: nil, |
| ServerKey: nil, |
| CACert: nil, |
| Privileged: true, |
| Envs: []string{"HELLO=WORLD"}, |
| Networks: []string{session.Id, "arpanet"}, |
| } |
| _d.On("ContainerCreate", expectedContainerOpts).Return(nil) |
| _d.On("ContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, nil) |
| _s.On("InstancePut", mock.AnythingOfType("*types.Instance")).Return(nil) |
| _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_aaaabbbbcccc", "10.0.0.1", "node1", "ip10-0-0-1-aaaabbbbcccc"}).Return() |
|
|
| instance, err := p.InstanceNew(session, types.InstanceConfig{ImageName: "redis", Envs: []string{"HELLO=WORLD"}, Networks: []string{"arpanet"}, Privileged: true}) |
| assert.Nil(t, err) |
|
|
| assert.Equal(t, expectedInstance, *instance) |
|
|
| _d.AssertExpectations(t) |
| _f.AssertExpectations(t) |
| _s.AssertExpectations(t) |
| _g.AssertExpectations(t) |
| _e.M.AssertExpectations(t) |
| } |
|
|
| func TestInstanceNew_WithNotAllowedImage(t *testing.T) { |
| _d := &docker.Mock{} |
| _f := &docker.FactoryMock{} |
| _s := &storage.Mock{} |
| _g := &id.MockGenerator{} |
| _e := &event.Mock{} |
| ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) |
| sp := provisioner.NewOverlaySessionProvisioner(_f) |
|
|
| _g.On("NewId").Return("aaaabbbbcccc") |
| _f.On("GetForSession", mock.AnythingOfType("*types.Session")).Return(_d, nil) |
| _d.On("NetworkCreate", "aaaabbbbcccc", dtypes.NetworkCreate{Attachable: true, Driver: "overlay"}).Return(nil) |
| _d.On("DaemonHost").Return("localhost") |
| _d.On("NetworkConnect", config.L2ContainerName, "aaaabbbbcccc", "").Return("10.0.0.1", nil) |
| _s.On("SessionPut", mock.AnythingOfType("*types.Session")).Return(nil) |
| _s.On("SessionCount").Return(1, nil) |
| _s.On("ClientCount").Return(0, nil) |
| _s.On("InstanceCount").Return(0, nil) |
| _s.On("InstanceFindBySessionId", "aaaabbbbcccc").Return([]*types.Instance{}, nil) |
|
|
| var nilArgs []interface{} |
| _e.M.On("Emit", event.SESSION_NEW, "aaaabbbbcccc", nilArgs).Return() |
|
|
| p := NewPWD(_f, _e, _s, sp, ipf) |
| p.generator = _g |
|
|
| playground := &types.Playground{Id: "foobar"} |
| sConfig := types.SessionConfig{Playground: playground, UserId: "", Duration: time.Hour, Stack: "", StackName: "", ImageName: ""} |
| session, err := p.SessionNew(context.Background(), sConfig) |
|
|
| assert.Nil(t, err) |
|
|
| |
| |
| |
| |
| config.Unsafe = true |
| defer func() { |
| config.Unsafe = false |
| }() |
|
|
| expectedInstance := types.Instance{ |
| Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), |
| Hostname: "node1", |
| IP: "10.0.0.1", |
| RoutableIP: "10.0.0.1", |
| Image: "redis", |
| SessionId: session.Id, |
| SessionHost: session.Host, |
| ProxyHost: router.EncodeHost(session.Id, "10.0.0.1", router.HostOpts{}), |
| } |
| expectedContainerOpts := docker.CreateContainerOpts{ |
| Image: expectedInstance.Image, |
| SessionId: session.Id, |
| ContainerName: expectedInstance.Name, |
| Hostname: expectedInstance.Hostname, |
| ServerCert: nil, |
| ServerKey: nil, |
| CACert: nil, |
| Privileged: false, |
| Envs: []string{"HELLO=WORLD"}, |
| Networks: []string{session.Id, "arpanet"}, |
| } |
| _d.On("ContainerCreate", expectedContainerOpts).Return(nil) |
| _d.On("ContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, nil) |
| _s.On("InstancePut", mock.AnythingOfType("*types.Instance")).Return(nil) |
| _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_aaaabbbbcccc", "10.0.0.1", "node1", "ip10-0-0-1-aaaabbbbcccc"}).Return() |
|
|
| instance, err := p.InstanceNew(session, types.InstanceConfig{ImageName: "redis", Envs: []string{"HELLO=WORLD"}, Networks: []string{"arpanet"}}) |
| assert.Nil(t, err) |
|
|
| assert.Equal(t, expectedInstance, *instance) |
|
|
| _d.AssertExpectations(t) |
| _f.AssertExpectations(t) |
| _s.AssertExpectations(t) |
| _g.AssertExpectations(t) |
| _e.M.AssertExpectations(t) |
| } |
|
|
| func TestInstanceNew_WithCustomHostname(t *testing.T) { |
| _d := &docker.Mock{} |
| _f := &docker.FactoryMock{} |
| _s := &storage.Mock{} |
| _g := &id.MockGenerator{} |
| _e := &event.Mock{} |
|
|
| ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) |
| sp := provisioner.NewOverlaySessionProvisioner(_f) |
|
|
| _g.On("NewId").Return("aaaabbbbcccc") |
| _f.On("GetForSession", mock.AnythingOfType("*types.Session")).Return(_d, nil) |
| _d.On("NetworkCreate", "aaaabbbbcccc", dtypes.NetworkCreate{Attachable: true, Driver: "overlay"}).Return(nil) |
| _d.On("DaemonHost").Return("localhost") |
| _d.On("NetworkConnect", config.L2ContainerName, "aaaabbbbcccc", "").Return("10.0.0.1", nil) |
| _s.On("SessionPut", mock.AnythingOfType("*types.Session")).Return(nil) |
| _s.On("SessionCount").Return(1, nil) |
| _s.On("ClientCount").Return(0, nil) |
| _s.On("InstanceCount").Return(0, nil) |
|
|
| var nilArgs []interface{} |
| _e.M.On("Emit", event.SESSION_NEW, "aaaabbbbcccc", nilArgs).Return() |
|
|
| p := NewPWD(_f, _e, _s, sp, ipf) |
| p.generator = _g |
|
|
| playground := &types.Playground{Id: "foobar"} |
| sConfig := types.SessionConfig{Playground: playground, UserId: "", Duration: time.Hour, Stack: "", StackName: "", ImageName: ""} |
| session, err := p.SessionNew(context.Background(), sConfig) |
| assert.Nil(t, err) |
|
|
| expectedInstance := types.Instance{ |
| Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), |
| Hostname: "redis-master", |
| IP: "10.0.0.1", |
| RoutableIP: "10.0.0.1", |
| Image: "redis", |
| SessionHost: session.Host, |
| SessionId: session.Id, |
| ProxyHost: router.EncodeHost(session.Id, "10.0.0.1", router.HostOpts{}), |
| } |
| expectedContainerOpts := docker.CreateContainerOpts{ |
| Image: expectedInstance.Image, |
| SessionId: session.Id, |
| ContainerName: expectedInstance.Name, |
| Hostname: expectedInstance.Hostname, |
| ServerCert: nil, |
| ServerKey: nil, |
| CACert: nil, |
| Privileged: false, |
| Networks: []string{session.Id}, |
| } |
|
|
| _d.On("ContainerCreate", expectedContainerOpts).Return(nil) |
| _d.On("ContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, nil) |
| _s.On("InstancePut", mock.AnythingOfType("*types.Instance")).Return(nil) |
| _e.M.On("Emit", event.INSTANCE_NEW, "aaaabbbbcccc", []interface{}{"aaaabbbb_aaaabbbbcccc", "10.0.0.1", "redis-master", "ip10-0-0-1-aaaabbbbcccc"}).Return() |
|
|
| instance, err := p.InstanceNew(session, types.InstanceConfig{ImageName: "redis", Hostname: "redis-master"}) |
|
|
| assert.Nil(t, err) |
|
|
| assert.Equal(t, expectedInstance, *instance) |
|
|
| _d.AssertExpectations(t) |
| _f.AssertExpectations(t) |
| _s.AssertExpectations(t) |
| _g.AssertExpectations(t) |
| _e.M.AssertExpectations(t) |
| } |
|
|