1
0
mirror of https://github.com/bingohuang/docker-labs.git synced 2025-10-04 17:33:21 +08:00

Make session replication

This commit is contained in:
Marcos Lilljedahl
2016-10-08 14:26:25 +02:00
parent 02d50073c5
commit b3e7dcae3b
4 changed files with 114 additions and 21 deletions

View File

@@ -6,8 +6,10 @@ import (
"golang.org/x/net/context"
"golang.org/x/net/websocket"
"github.com/franela/play-with-docker/cookoo"
"github.com/franela/play-with-docker/services"
"github.com/go-zoo/bone"
"github.com/twinj/uuid"
)
// Echo the data received on the WebSocket.
@@ -20,26 +22,41 @@ func Exec(ws *websocket.Conn) {
session := services.GetSession(sessionId)
instance := services.GetInstance(session, instanceId)
if instance.ExecId == "" {
execId, err := services.CreateExecConnection(instance.Name, ctx)
if instance.Stdout == nil {
id, err := services.CreateExecConnection(instance.Name, ctx)
if err != nil {
return
}
instance.ExecId = execId
}
conn, err := services.AttachExecConnection(instance.ExecId, ctx)
if err != nil {
return
conn, err := services.AttachExecConnection(id, ctx)
if err != nil {
return
}
instance.Conn = conn
instance.Stdout = &cookoo.MultiWriter{}
instance.Stdout.Init()
u1 := uuid.NewV4()
instance.Stdout.AddWriter(u1.String(), ws)
go func() {
io.Copy(instance.Stdout, instance.Conn.Reader)
}()
defer conn.Close()
go func() {
io.Copy(instance.Conn.Conn, ws)
}()
select {
case <-ctx.Done():
}
} else {
u1 := uuid.NewV4()
instance.Stdout.AddWriter(u1.String(), ws)
go func() {
io.Copy(instance.Conn.Conn, ws)
}()
select {
case <-ctx.Done():
}
}
defer conn.Close()
go func() {
io.Copy(ws, conn.Reader)
}()
go func() {
io.Copy(conn.Conn, ws)
}()
select {
case <-ctx.Done():
}
}