From 86a0f7d1e9e02d330ff49560869842657a4ef500 Mon Sep 17 00:00:00 2001 From: "Jonathan Leibiusky @xetorthio" Date: Thu, 14 Sep 2017 10:20:20 -0300 Subject: [PATCH] Refactor id generator to it's own package --- api.go | 3 ++- id/generator.go | 5 +++++ id/mock.go | 12 ++++++++++++ id/xid.go | 10 ++++++++++ provisioner/dind.go | 13 +++++++------ pwd/client_test.go | 13 +++++++------ pwd/instance_test.go | 29 +++++++++++++++-------------- pwd/pwd.go | 34 +++------------------------------- pwd/session_test.go | 5 +++-- 9 files changed, 64 insertions(+), 60 deletions(-) create mode 100644 id/generator.go create mode 100644 id/mock.go create mode 100644 id/xid.go diff --git a/api.go b/api.go index d7fa486..ebc11bc 100644 --- a/api.go +++ b/api.go @@ -8,6 +8,7 @@ import ( "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/handlers" + "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" "github.com/play-with-docker/play-with-docker/scheduler" @@ -22,7 +23,7 @@ func main() { s := initStorage() f := initFactory(s) - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(f, s), provisioner.NewDinD(f, s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(f, s), provisioner.NewDinD(id.XIDGenerator{}, f, s)) sp := provisioner.NewOverlaySessionProvisioner(f) core := pwd.NewPWD(f, e, s, sp, ipf) diff --git a/id/generator.go b/id/generator.go new file mode 100644 index 0000000..44727bc --- /dev/null +++ b/id/generator.go @@ -0,0 +1,5 @@ +package id + +type Generator interface { + NewId() string +} diff --git a/id/mock.go b/id/mock.go new file mode 100644 index 0000000..a854fe3 --- /dev/null +++ b/id/mock.go @@ -0,0 +1,12 @@ +package id + +import "github.com/stretchr/testify/mock" + +type MockGenerator struct { + mock.Mock +} + +func (m *MockGenerator) NewId() string { + args := m.Called() + return args.String(0) +} diff --git a/id/xid.go b/id/xid.go new file mode 100644 index 0000000..c87ac69 --- /dev/null +++ b/id/xid.go @@ -0,0 +1,10 @@ +package id + +import "github.com/rs/xid" + +type XIDGenerator struct { +} + +func (x XIDGenerator) NewId() string { + return xid.New().String() +} diff --git a/provisioner/dind.go b/provisioner/dind.go index 86c681d..21e6497 100644 --- a/provisioner/dind.go +++ b/provisioner/dind.go @@ -12,19 +12,20 @@ import ( "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/id" "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/rs/xid" ) type DinD struct { - factory docker.FactoryApi - storage storage.StorageApi + factory docker.FactoryApi + storage storage.StorageApi + generator id.Generator } -func NewDinD(f docker.FactoryApi, s storage.StorageApi) *DinD { - return &DinD{factory: f, storage: s} +func NewDinD(generator id.Generator, f docker.FactoryApi, s storage.StorageApi) *DinD { + return &DinD{generator: generator, factory: f, storage: s} } func checkHostnameExists(sessionId, hostname string, instances []*types.Instance) bool { @@ -59,7 +60,7 @@ func (d *DinD) InstanceNew(session *types.Session, conf types.InstanceConfig) (* } conf.Hostname = nodeName } - containerName := fmt.Sprintf("%s_%s", session.Id[:8], xid.New().String()) + containerName := fmt.Sprintf("%s_%s", session.Id[:8], d.generator.NewId()) opts := docker.CreateContainerOpts{ Image: conf.ImageName, SessionId: session.Id, diff --git a/pwd/client_test.go b/pwd/client_test.go index 27d0a79..f39af24 100644 --- a/pwd/client_test.go +++ b/pwd/client_test.go @@ -8,6 +8,7 @@ import ( "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/storage" @@ -18,11 +19,11 @@ import ( func TestClientNew(t *testing.T) { _s := &storage.Mock{} _f := &docker.FactoryMock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _d := &docker.Mock{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") @@ -59,10 +60,10 @@ func TestClientNew(t *testing.T) { func TestClientCount(t *testing.T) { _s := &storage.Mock{} _f := &docker.FactoryMock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _d := &docker.Mock{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") @@ -98,10 +99,10 @@ func TestClientCount(t *testing.T) { func TestClientResizeViewPort(t *testing.T) { _s := &storage.Mock{} _f := &docker.FactoryMock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _d := &docker.Mock{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") diff --git a/pwd/instance_test.go b/pwd/instance_test.go index 3fc54cb..37b3a8a 100644 --- a/pwd/instance_test.go +++ b/pwd/instance_test.go @@ -9,6 +9,7 @@ import ( "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" @@ -21,9 +22,9 @@ func TestInstanceResizeTerminal(t *testing.T) { _d := &docker.Mock{} _f := &docker.FactoryMock{} _s := &storage.Mock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _d.On("ContainerResize", "foobar", uint(24), uint(80)).Return(nil) @@ -45,9 +46,9 @@ func TestInstanceNew(t *testing.T) { _d := &docker.Mock{} _f := &docker.FactoryMock{} _s := &storage.Mock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") @@ -71,7 +72,7 @@ func TestInstanceNew(t *testing.T) { assert.Nil(t, err) expectedInstance := types.Instance{ - Name: fmt.Sprintf("%s_node1", session.Id[:8]), + Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), Hostname: "node1", IP: "10.0.0.1", RoutableIP: "10.0.0.1", @@ -95,7 +96,7 @@ func TestInstanceNew(t *testing.T) { _d.On("CreateContainer", expectedContainerOpts).Return(nil) _d.On("GetContainerIPs", 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_node1", "10.0.0.1", "node1", "ip10-0-0-1-aaaabbbbcccc"}).Return() + _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) @@ -113,9 +114,9 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) { _d := &docker.Mock{} _f := &docker.FactoryMock{} _s := &storage.Mock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") @@ -140,7 +141,7 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) { assert.Nil(t, err) expectedInstance := types.Instance{ - Name: fmt.Sprintf("%s_node1", session.Id[:8]), + Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), Hostname: "node1", IP: "10.0.0.1", RoutableIP: "10.0.0.1", @@ -163,7 +164,7 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) { _d.On("CreateContainer", expectedContainerOpts).Return(nil) _d.On("GetContainerIPs", 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_node1", "10.0.0.1", "node1", "ip10-0-0-1-aaaabbbbcccc"}).Return() + _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"}) assert.Nil(t, err) @@ -181,10 +182,10 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) { _d := &docker.Mock{} _f := &docker.FactoryMock{} _s := &storage.Mock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc") @@ -208,7 +209,7 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) { assert.Nil(t, err) expectedInstance := types.Instance{ - Name: fmt.Sprintf("%s_redis-master", session.Id[:8]), + Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]), Hostname: "redis-master", IP: "10.0.0.1", RoutableIP: "10.0.0.1", @@ -232,7 +233,7 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) { _d.On("CreateContainer", expectedContainerOpts).Return(nil) _d.On("GetContainerIPs", 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_redis-master", "10.0.0.1", "redis-master", "ip10-0-0-1-aaaabbbbcccc"}).Return() + _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"}) diff --git a/pwd/pwd.go b/pwd/pwd.go index c0f196a..a18815d 100644 --- a/pwd/pwd.go +++ b/pwd/pwd.go @@ -8,12 +8,11 @@ import ( "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/storage" "github.com/prometheus/client_golang/prometheus" - "github.com/rs/xid" - "github.com/stretchr/testify/mock" ) var ( @@ -52,7 +51,7 @@ type pwd struct { dockerFactory docker.FactoryApi event event.EventApi storage storage.StorageApi - generator IdGenerator + generator id.Generator clientCount int32 sessionProvisioner provisioner.SessionProvisionerApi instanceProvisionerFactory provisioner.InstanceProvisionerFactoryApi @@ -60,26 +59,6 @@ type pwd struct { dindProvisioner provisioner.InstanceProvisionerApi } -type IdGenerator interface { - NewId() string -} - -type xidGenerator struct { -} - -func (x xidGenerator) NewId() string { - return xid.New().String() -} - -type mockGenerator struct { - mock.Mock -} - -func (m *mockGenerator) NewId() string { - args := m.Called() - return args.String(0) -} - var sessionComplete = errors.New("Session is complete") func SessionComplete(e error) bool { @@ -118,18 +97,11 @@ type PWDApi interface { func NewPWD(f docker.FactoryApi, e event.EventApi, s storage.StorageApi, sp provisioner.SessionProvisionerApi, ipf provisioner.InstanceProvisionerFactoryApi) *pwd { // windowsProvisioner: provisioner.NewWindowsASG(f, s), dindProvisioner: provisioner.NewDinD(f) - return &pwd{dockerFactory: f, event: e, storage: s, generator: xidGenerator{}, sessionProvisioner: sp, instanceProvisionerFactory: ipf} + return &pwd{dockerFactory: f, event: e, storage: s, generator: id.XIDGenerator{}, sessionProvisioner: sp, instanceProvisionerFactory: ipf} } func (p *pwd) getProvisioner(t string) (provisioner.InstanceProvisionerApi, error) { return p.instanceProvisionerFactory.GetProvisioner(t) - /* - if t == "windows" { - return p.windowsProvisioner, nil - } else { - return p.dindProvisioner, nil - } - */ } func (p *pwd) setGauges() { diff --git a/pwd/session_test.go b/pwd/session_test.go index 12fa507..b49c04e 100644 --- a/pwd/session_test.go +++ b/pwd/session_test.go @@ -8,6 +8,7 @@ import ( "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/storage" "github.com/stretchr/testify/assert" @@ -20,10 +21,10 @@ func TestSessionNew(t *testing.T) { _d := &docker.Mock{} _f := &docker.FactoryMock{} _s := &storage.Mock{} - _g := &mockGenerator{} + _g := &id.MockGenerator{} _e := &event.Mock{} - ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_f, _s)) + ipf := provisioner.NewInstanceProvisionerFactory(provisioner.NewWindowsASG(_f, _s), provisioner.NewDinD(_g, _f, _s)) sp := provisioner.NewOverlaySessionProvisioner(_f) _g.On("NewId").Return("aaaabbbbcccc")