WIP
This commit is contained in:
5
docker/docker.go
Normal file
5
docker/docker.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package docker
|
||||
|
||||
type Docker interface {
|
||||
CreateNetwork(id string) error
|
||||
}
|
||||
9
pwd/docker_mock_test.go
Normal file
9
pwd/docker_mock_test.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package pwd
|
||||
|
||||
type mockDocker struct {
|
||||
createNetwork func(string) error
|
||||
}
|
||||
|
||||
func (m *mockDocker) CreateNetwork(id string) error {
|
||||
return m.createNetwork(id)
|
||||
}
|
||||
41
pwd/pwd.go
Normal file
41
pwd/pwd.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package pwd
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/play-with-docker/play-with-docker/docker"
|
||||
)
|
||||
|
||||
type Session struct {
|
||||
rw sync.Mutex
|
||||
Id string `json:"id"`
|
||||
Instances map[string]*Instance `json:"instances"`
|
||||
clients []*Client `json:"-"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
ExpiresAt time.Time `json:"expires_at"`
|
||||
scheduled bool `json:"-"`
|
||||
ticker *time.Ticker `json:"-"`
|
||||
PwdIpAddress string `json:"pwd_ip_address"`
|
||||
Ready bool `json:"ready"`
|
||||
Stack string `json:"stack"`
|
||||
closingTimer *time.Timer `json:"-"`
|
||||
}
|
||||
|
||||
type Instance struct {
|
||||
}
|
||||
|
||||
type Client struct {
|
||||
}
|
||||
|
||||
type pwd struct {
|
||||
docker docker.Docker `json:"-"`
|
||||
}
|
||||
|
||||
type PWDApi interface {
|
||||
NewSession(duration time.Duration, stack string) (*Session, error)
|
||||
}
|
||||
|
||||
func NewPWD(d docker.Docker) pwd {
|
||||
return pwd{docker: d}
|
||||
}
|
||||
66
pwd/session.go
Normal file
66
pwd/session.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package pwd
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/franela/play-with-docker.old/config"
|
||||
"github.com/twinj/uuid"
|
||||
)
|
||||
|
||||
func (p *pwd) NewSession(duration time.Duration, stack, stackName string) (*Session, error) {
|
||||
s := &Session{}
|
||||
s.Id = uuid.NewV4().String()
|
||||
s.Instances = map[string]*Instance{}
|
||||
s.CreatedAt = time.Now()
|
||||
s.ExpiresAt = s.CreatedAt.Add(duration)
|
||||
/*
|
||||
if stack == "" {
|
||||
s.Ready = true
|
||||
}
|
||||
s.Stack = stack
|
||||
*/
|
||||
log.Printf("NewSession id=[%s]\n", s.Id)
|
||||
|
||||
if err := p.docker.CreateNetwork(s.Id); err != nil {
|
||||
log.Println("ERROR NETWORKING")
|
||||
return nil, err
|
||||
}
|
||||
log.Printf("Network [%s] created for session [%s]\n", s.Id, s.Id)
|
||||
|
||||
s.Prepare()
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// This function should be called any time a session needs to be prepared:
|
||||
// 1. Like when it is created
|
||||
// 2. When it was loaded from storage
|
||||
func (s *Session) Prepare() error {
|
||||
s.scheduleSessionClose()
|
||||
|
||||
// Connect PWD daemon to the new network
|
||||
s.connectToNetwork()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Session) scheduleSessionClose() {
|
||||
timeLeft := s.ExpiresAt.Sub(time.Now())
|
||||
s.closingTimer = time.AfterFunc(timeLeft, func() {
|
||||
s.Close()
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Session) Close() {
|
||||
}
|
||||
|
||||
func (s *Session) connectToNetwork() {
|
||||
ip, err := ConnectNetwork(config.PWDContainerName, s.Id, "")
|
||||
if err != nil {
|
||||
log.Println("ERROR NETWORKING")
|
||||
return nil, err
|
||||
}
|
||||
s.PwdIpAddress = ip
|
||||
log.Printf("Connected %s to network [%s]\n", config.PWDContainerName, s.Id)
|
||||
}
|
||||
33
pwd/session_test.go
Normal file
33
pwd/session_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package pwd
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestNewSession_WithoutStack(t *testing.T) {
|
||||
createdNetworkId := ""
|
||||
|
||||
mock := &mockDocker{}
|
||||
mock.createNetwork = func(id string) error {
|
||||
createdNetworkId = id
|
||||
return nil
|
||||
}
|
||||
|
||||
p := NewPWD(mock)
|
||||
|
||||
before := time.Now()
|
||||
s, e := p.NewSession(time.Hour, "", "")
|
||||
|
||||
assert.Nil(t, e)
|
||||
assert.NotNil(t, s)
|
||||
|
||||
assert.NotEmpty(t, s.Id)
|
||||
assert.WithinDuration(t, s.CreatedAt, before, time.Since(before))
|
||||
assert.WithinDuration(t, s.ExpiresAt, before.Add(time.Hour), time.Second)
|
||||
assert.Equal(t, s.Id, createdNetworkId)
|
||||
|
||||
assert.NotNil(t, s.closingTimer)
|
||||
}
|
||||
Reference in New Issue
Block a user