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:
@@ -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})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user