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