Storage has now it's own package.

Remove global `sessions` map and use configured storage.
Add a `types` package so both `pwd` and `storage` can access without
circular dependencies.
Now the session is prepared when requested and not on load.
This commit is contained in:
Jonathan Leibiusky @xetorthio
2017-06-14 18:35:21 -03:00
parent 2eff799c58
commit e9911abf94
22 changed files with 814 additions and 499 deletions

View File

@@ -2,24 +2,21 @@ package pwd
import (
"fmt"
"net"
"sync"
"testing"
"time"
"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/pwd/types"
"github.com/stretchr/testify/assert"
)
func TestSessionNew(t *testing.T) {
sessions = map[string]*Session{}
config.PWDContainerName = "pwd"
var connectContainerName, connectNetworkName, connectIP string
createdNetworkId := ""
saveCalled := false
expectedSessions := map[string]*Session{}
expectedSessions := map[string]*types.Session{}
docker := &mockDocker{}
docker.createNetwork = func(id string) error {
@@ -33,15 +30,15 @@ func TestSessionNew(t *testing.T) {
return "10.0.0.1", nil
}
var scheduledSession *Session
var scheduledSession *types.Session
tasks := &mockTasks{}
tasks.schedule = func(s *Session) {
tasks.schedule = func(s *types.Session) {
scheduledSession = s
}
broadcast := &mockBroadcast{}
storage := &mockStorage{}
storage.save = func() error {
storage.sessionPut = func(s *types.Session) error {
saveCalled = true
return nil
}
@@ -72,7 +69,7 @@ func TestSessionNew(t *testing.T) {
assert.Equal(t, "imageName", s.ImageName)
assert.False(t, s.Ready)
assert.NotNil(t, s.closingTimer)
assert.NotNil(t, s.ClosingTimer())
assert.Equal(t, config.PWDContainerName, connectContainerName)
assert.Equal(t, s.Id, connectNetworkName)
@@ -82,7 +79,6 @@ func TestSessionNew(t *testing.T) {
assert.Equal(t, s, scheduledSession)
assert.Equal(t, expectedSessions, sessions)
assert.True(t, saveCalled)
}
@@ -208,72 +204,72 @@ func TestSessionSetup(t *testing.T) {
manager1 := fmt.Sprintf("%s_manager1", s.Id[:8])
manager1Received := *s.Instances[manager1]
assert.Equal(t, Instance{
assert.Equal(t, types.Instance{
Name: manager1,
Image: "franela/dind",
Hostname: "manager1",
IP: "10.0.0.1",
Alias: "",
IsDockerHost: true,
session: s,
conn: manager1Received.conn,
docker: manager1Received.docker,
Session: s,
Terminal: manager1Received.Terminal,
Docker: manager1Received.Docker,
}, manager1Received)
manager2 := fmt.Sprintf("%s_manager2", s.Id[:8])
manager2Received := *s.Instances[manager2]
assert.Equal(t, Instance{
assert.Equal(t, types.Instance{
Name: manager2,
Image: "franela/dind",
Hostname: "manager2",
IP: "10.0.0.2",
Alias: "",
IsDockerHost: true,
session: s,
conn: manager2Received.conn,
docker: manager2Received.docker,
Session: s,
Terminal: manager2Received.Terminal,
Docker: manager2Received.Docker,
}, manager2Received)
manager3 := fmt.Sprintf("%s_manager3", s.Id[:8])
manager3Received := *s.Instances[manager3]
assert.Equal(t, Instance{
assert.Equal(t, types.Instance{
Name: manager3,
Image: "franela/dind:overlay2-dev",
Hostname: "manager3",
IP: "10.0.0.3",
Alias: "",
IsDockerHost: true,
session: s,
conn: manager3Received.conn,
docker: manager3Received.docker,
Session: s,
Terminal: manager3Received.Terminal,
Docker: manager3Received.Docker,
}, manager3Received)
worker1 := fmt.Sprintf("%s_worker1", s.Id[:8])
worker1Received := *s.Instances[worker1]
assert.Equal(t, Instance{
assert.Equal(t, types.Instance{
Name: worker1,
Image: "franela/dind",
Hostname: "worker1",
IP: "10.0.0.4",
Alias: "",
IsDockerHost: true,
session: s,
conn: worker1Received.conn,
docker: worker1Received.docker,
Session: s,
Terminal: worker1Received.Terminal,
Docker: worker1Received.Docker,
}, worker1Received)
other := fmt.Sprintf("%s_other", s.Id[:8])
otherReceived := *s.Instances[other]
assert.Equal(t, Instance{
assert.Equal(t, types.Instance{
Name: other,
Image: "franela/dind",
Hostname: "other",
IP: "10.0.0.5",
Alias: "",
IsDockerHost: true,
session: s,
conn: otherReceived.conn,
docker: otherReceived.docker,
Session: s,
Terminal: otherReceived.Terminal,
Docker: otherReceived.Docker,
}, otherReceived)
assert.True(t, swarmInitOnMaster1)
@@ -281,100 +277,3 @@ func TestSessionSetup(t *testing.T) {
assert.True(t, manager3JoinedHasManager)
assert.True(t, worker1JoinedHasWorker)
}
func TestSessionLoadAndPrepare(t *testing.T) {
config.PWDContainerName = "pwd"
lock := sync.Mutex{}
var s1NetworkConnect []string
var s2NetworkConnect []string
wg := sync.WaitGroup{}
wg.Add(3)
connectedInstances := []string{}
sessions = map[string]*Session{}
i1 := &Instance{
Image: "dind",
Name: "session1_i1",
Hostname: "i1",
IP: "10.0.0.10",
IsDockerHost: true,
}
i2 := &Instance{
Image: "dind",
Name: "session1_i2",
Hostname: "i1",
IP: "10.0.0.11",
IsDockerHost: true,
}
i3 := &Instance{
Image: "dind",
Name: "session1_i3",
Hostname: "i1",
IP: "10.0.0.12",
IsDockerHost: true,
}
s1 := &Session{
Id: "session1",
Instances: map[string]*Instance{"session1_i1": i1},
CreatedAt: time.Now(),
ExpiresAt: time.Now().Add(time.Hour),
PwdIpAddress: "10.0.0.1",
Ready: true,
Stack: "",
StackName: "",
}
s2 := &Session{
Id: "session2",
Instances: map[string]*Instance{"session1_i2": i2, "session1_i3": i3},
CreatedAt: time.Now(),
ExpiresAt: time.Now().Add(time.Hour),
PwdIpAddress: "10.0.0.2",
Ready: true,
Stack: "",
StackName: "",
}
dock := &mockDocker{}
dock.createAttachConnection = func(instanceName string) (net.Conn, error) {
lock.Lock()
defer lock.Unlock()
connectedInstances = append(connectedInstances, instanceName)
wg.Done()
return &mockConn{}, nil
}
dock.connectNetwork = func(container, network, ip string) (string, error) {
if s1.Id == network {
s1NetworkConnect = []string{container, network, ip}
} else if s2.Id == network {
s2NetworkConnect = []string{container, network, ip}
}
return ip, nil
}
tasks := &mockTasks{}
tasks.schedule = func(s *Session) {
s.ticker = time.NewTicker(1 * time.Second)
}
broadcast := &mockBroadcast{}
storage := &mockStorage{}
storage.load = func() error {
sessions = map[string]*Session{"session1": s1, "session2": s2}
return nil
}
p := NewPWD(dock, tasks, broadcast, storage)
err := p.SessionLoadAndPrepare()
assert.Nil(t, err)
assert.Len(t, sessions, 2)
assert.NotNil(t, s1.closingTimer)
assert.NotNil(t, s2.closingTimer)
assert.NotNil(t, s1.ticker)
assert.NotNil(t, s2.ticker)
assert.Equal(t, []string{"pwd", s1.Id, s1.PwdIpAddress}, s1NetworkConnect)
assert.Equal(t, []string{"pwd", s2.Id, s2.PwdIpAddress}, s2NetworkConnect)
wg.Wait()
assert.Subset(t, connectedInstances, []string{i1.Name, i2.Name, i3.Name})
}