Refactor id generator to it's own package

This commit is contained in:
Jonathan Leibiusky @xetorthio
2017-09-14 10:20:20 -03:00
parent 3ca50eae2e
commit 86a0f7d1e9
9 changed files with 64 additions and 60 deletions

3
api.go
View File

@@ -8,6 +8,7 @@ import (
"github.com/play-with-docker/play-with-docker/docker" "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/event"
"github.com/play-with-docker/play-with-docker/handlers" "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/provisioner"
"github.com/play-with-docker/play-with-docker/pwd" "github.com/play-with-docker/play-with-docker/pwd"
"github.com/play-with-docker/play-with-docker/scheduler" "github.com/play-with-docker/play-with-docker/scheduler"
@@ -22,7 +23,7 @@ func main() {
s := initStorage() s := initStorage()
f := initFactory(s) 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) sp := provisioner.NewOverlaySessionProvisioner(f)
core := pwd.NewPWD(f, e, s, sp, ipf) core := pwd.NewPWD(f, e, s, sp, ipf)

5
id/generator.go Normal file
View File

@@ -0,0 +1,5 @@
package id
type Generator interface {
NewId() string
}

12
id/mock.go Normal file
View File

@@ -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)
}

10
id/xid.go Normal file
View File

@@ -0,0 +1,10 @@
package id
import "github.com/rs/xid"
type XIDGenerator struct {
}
func (x XIDGenerator) NewId() string {
return xid.New().String()
}

View File

@@ -12,19 +12,20 @@ import (
"github.com/play-with-docker/play-with-docker/config" "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/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/pwd/types"
"github.com/play-with-docker/play-with-docker/router" "github.com/play-with-docker/play-with-docker/router"
"github.com/play-with-docker/play-with-docker/storage" "github.com/play-with-docker/play-with-docker/storage"
"github.com/rs/xid"
) )
type DinD struct { type DinD struct {
factory docker.FactoryApi factory docker.FactoryApi
storage storage.StorageApi storage storage.StorageApi
generator id.Generator
} }
func NewDinD(f docker.FactoryApi, s storage.StorageApi) *DinD { func NewDinD(generator id.Generator, f docker.FactoryApi, s storage.StorageApi) *DinD {
return &DinD{factory: f, storage: s} return &DinD{generator: generator, factory: f, storage: s}
} }
func checkHostnameExists(sessionId, hostname string, instances []*types.Instance) bool { 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 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{ opts := docker.CreateContainerOpts{
Image: conf.ImageName, Image: conf.ImageName,
SessionId: session.Id, SessionId: session.Id,

View File

@@ -8,6 +8,7 @@ import (
"github.com/play-with-docker/play-with-docker/config" "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/docker"
"github.com/play-with-docker/play-with-docker/event" "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/provisioner"
"github.com/play-with-docker/play-with-docker/pwd/types" "github.com/play-with-docker/play-with-docker/pwd/types"
"github.com/play-with-docker/play-with-docker/storage" "github.com/play-with-docker/play-with-docker/storage"
@@ -18,11 +19,11 @@ import (
func TestClientNew(t *testing.T) { func TestClientNew(t *testing.T) {
_s := &storage.Mock{} _s := &storage.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_d := &docker.Mock{} _d := &docker.Mock{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")
@@ -59,10 +60,10 @@ func TestClientNew(t *testing.T) {
func TestClientCount(t *testing.T) { func TestClientCount(t *testing.T) {
_s := &storage.Mock{} _s := &storage.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_d := &docker.Mock{} _d := &docker.Mock{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")
@@ -98,10 +99,10 @@ func TestClientCount(t *testing.T) {
func TestClientResizeViewPort(t *testing.T) { func TestClientResizeViewPort(t *testing.T) {
_s := &storage.Mock{} _s := &storage.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_d := &docker.Mock{} _d := &docker.Mock{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")

View File

@@ -9,6 +9,7 @@ import (
"github.com/play-with-docker/play-with-docker/config" "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/docker"
"github.com/play-with-docker/play-with-docker/event" "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/provisioner"
"github.com/play-with-docker/play-with-docker/pwd/types" "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/router"
@@ -21,9 +22,9 @@ func TestInstanceResizeTerminal(t *testing.T) {
_d := &docker.Mock{} _d := &docker.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_s := &storage.Mock{} _s := &storage.Mock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_d.On("ContainerResize", "foobar", uint(24), uint(80)).Return(nil) _d.On("ContainerResize", "foobar", uint(24), uint(80)).Return(nil)
@@ -45,9 +46,9 @@ func TestInstanceNew(t *testing.T) {
_d := &docker.Mock{} _d := &docker.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_s := &storage.Mock{} _s := &storage.Mock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")
@@ -71,7 +72,7 @@ func TestInstanceNew(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
expectedInstance := types.Instance{ expectedInstance := types.Instance{
Name: fmt.Sprintf("%s_node1", session.Id[:8]), Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]),
Hostname: "node1", Hostname: "node1",
IP: "10.0.0.1", IP: "10.0.0.1",
RoutableIP: "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("CreateContainer", expectedContainerOpts).Return(nil)
_d.On("GetContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, 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) _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"}) instance, err := p.InstanceNew(session, types.InstanceConfig{PlaygroundFQDN: "something.play-with-docker.com"})
assert.Nil(t, err) assert.Nil(t, err)
@@ -113,9 +114,9 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) {
_d := &docker.Mock{} _d := &docker.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_s := &storage.Mock{} _s := &storage.Mock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")
@@ -140,7 +141,7 @@ func TestInstanceNew_WithNotAllowedImage(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
expectedInstance := types.Instance{ expectedInstance := types.Instance{
Name: fmt.Sprintf("%s_node1", session.Id[:8]), Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]),
Hostname: "node1", Hostname: "node1",
IP: "10.0.0.1", IP: "10.0.0.1",
RoutableIP: "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("CreateContainer", expectedContainerOpts).Return(nil)
_d.On("GetContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, 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) _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"}) instance, err := p.InstanceNew(session, types.InstanceConfig{ImageName: "redis"})
assert.Nil(t, err) assert.Nil(t, err)
@@ -181,10 +182,10 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) {
_d := &docker.Mock{} _d := &docker.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_s := &storage.Mock{} _s := &storage.Mock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")
@@ -208,7 +209,7 @@ func TestInstanceNew_WithCustomHostname(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
expectedInstance := types.Instance{ expectedInstance := types.Instance{
Name: fmt.Sprintf("%s_redis-master", session.Id[:8]), Name: fmt.Sprintf("%s_aaaabbbbcccc", session.Id[:8]),
Hostname: "redis-master", Hostname: "redis-master",
IP: "10.0.0.1", IP: "10.0.0.1",
RoutableIP: "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("CreateContainer", expectedContainerOpts).Return(nil)
_d.On("GetContainerIPs", expectedInstance.Name).Return(map[string]string{session.Id: "10.0.0.1"}, 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) _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"}) instance, err := p.InstanceNew(session, types.InstanceConfig{ImageName: "redis", Hostname: "redis-master"})

View File

@@ -8,12 +8,11 @@ import (
"github.com/play-with-docker/play-with-docker/docker" "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/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/provisioner"
"github.com/play-with-docker/play-with-docker/pwd/types" "github.com/play-with-docker/play-with-docker/pwd/types"
"github.com/play-with-docker/play-with-docker/storage" "github.com/play-with-docker/play-with-docker/storage"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/rs/xid"
"github.com/stretchr/testify/mock"
) )
var ( var (
@@ -52,7 +51,7 @@ type pwd struct {
dockerFactory docker.FactoryApi dockerFactory docker.FactoryApi
event event.EventApi event event.EventApi
storage storage.StorageApi storage storage.StorageApi
generator IdGenerator generator id.Generator
clientCount int32 clientCount int32
sessionProvisioner provisioner.SessionProvisionerApi sessionProvisioner provisioner.SessionProvisionerApi
instanceProvisionerFactory provisioner.InstanceProvisionerFactoryApi instanceProvisionerFactory provisioner.InstanceProvisionerFactoryApi
@@ -60,26 +59,6 @@ type pwd struct {
dindProvisioner provisioner.InstanceProvisionerApi 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") var sessionComplete = errors.New("Session is complete")
func SessionComplete(e error) bool { 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 { 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) // 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) { func (p *pwd) getProvisioner(t string) (provisioner.InstanceProvisionerApi, error) {
return p.instanceProvisionerFactory.GetProvisioner(t) return p.instanceProvisionerFactory.GetProvisioner(t)
/*
if t == "windows" {
return p.windowsProvisioner, nil
} else {
return p.dindProvisioner, nil
}
*/
} }
func (p *pwd) setGauges() { func (p *pwd) setGauges() {

View File

@@ -8,6 +8,7 @@ import (
"github.com/play-with-docker/play-with-docker/config" "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/docker"
"github.com/play-with-docker/play-with-docker/event" "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/provisioner"
"github.com/play-with-docker/play-with-docker/storage" "github.com/play-with-docker/play-with-docker/storage"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@@ -20,10 +21,10 @@ func TestSessionNew(t *testing.T) {
_d := &docker.Mock{} _d := &docker.Mock{}
_f := &docker.FactoryMock{} _f := &docker.FactoryMock{}
_s := &storage.Mock{} _s := &storage.Mock{}
_g := &mockGenerator{} _g := &id.MockGenerator{}
_e := &event.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) sp := provisioner.NewOverlaySessionProvisioner(_f)
_g.On("NewId").Return("aaaabbbbcccc") _g.On("NewId").Return("aaaabbbbcccc")