Show a message when connection to terminal has been lost
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/play-with-docker/play-with-docker/event"
|
"github.com/play-with-docker/play-with-docker/event"
|
||||||
"github.com/play-with-docker/play-with-docker/pwd/types"
|
"github.com/play-with-docker/play-with-docker/pwd/types"
|
||||||
@@ -50,9 +51,17 @@ type info struct {
|
|||||||
name string
|
name string
|
||||||
data []byte
|
data []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type state struct {
|
||||||
|
name string
|
||||||
|
status string
|
||||||
|
}
|
||||||
|
|
||||||
type manager struct {
|
type manager struct {
|
||||||
|
session *types.Session
|
||||||
sendCh chan info
|
sendCh chan info
|
||||||
receiveCh chan info
|
receiveCh chan info
|
||||||
|
stateCh chan state
|
||||||
terminals map[string]*terminal
|
terminals map[string]*terminal
|
||||||
errorCh chan *types.Instance
|
errorCh chan *types.Instance
|
||||||
instances map[string]*types.Instance
|
instances map[string]*types.Instance
|
||||||
@@ -67,6 +76,12 @@ func (m *manager) Receive(cb func(name string, data []byte)) {
|
|||||||
cb(i.name, i.data)
|
cb(i.name, i.data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (m *manager) Status(cb func(name, status string)) {
|
||||||
|
for s := range m.stateCh {
|
||||||
|
cb(s.name, s.status)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (m *manager) connect(instance *types.Instance) error {
|
func (m *manager) connect(instance *types.Instance) error {
|
||||||
if !m.trackingInstance(instance) {
|
if !m.trackingInstance(instance) {
|
||||||
return nil
|
return nil
|
||||||
@@ -87,6 +102,7 @@ func (m *manager) connectTerminal(instance *types.Instance) error {
|
|||||||
t := terminal{conn: conn, write: chw, instance: instance}
|
t := terminal{conn: conn, write: chw, instance: instance}
|
||||||
m.terminals[instance.Name] = &t
|
m.terminals[instance.Name] = &t
|
||||||
t.Go(m.receiveCh, m.errorCh)
|
t.Go(m.receiveCh, m.errorCh)
|
||||||
|
m.stateCh <- state{name: instance.Name, status: "connect"}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -156,8 +172,10 @@ func (m *manager) process() {
|
|||||||
log.Println("Instance doesn't exist anymore. Won't reconnect")
|
log.Println("Instance doesn't exist anymore. Won't reconnect")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
log.Println("Reconnecting")
|
m.stateCh <- state{name: instance.Name, status: "reconnect"}
|
||||||
|
time.AfterFunc(time.Second, func() {
|
||||||
m.connect(instance)
|
m.connect(instance)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,23 +185,30 @@ func (m *manager) Close() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewManager(s *types.Session) (*manager, error) {
|
func (m *manager) Start() error {
|
||||||
m := &manager{
|
instances, err := core.InstanceFindBySession(m.session)
|
||||||
sendCh: make(chan info),
|
|
||||||
receiveCh: make(chan info),
|
|
||||||
terminals: make(map[string]*terminal),
|
|
||||||
errorCh: make(chan *types.Instance),
|
|
||||||
instances: make(map[string]*types.Instance),
|
|
||||||
}
|
|
||||||
|
|
||||||
instances, err := core.InstanceFindBySession(s)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
for _, i := range instances {
|
for _, i := range instances {
|
||||||
m.instances[i.Name] = i
|
m.instances[i.Name] = i
|
||||||
m.connect(i)
|
m.connect(i)
|
||||||
}
|
}
|
||||||
|
go m.process()
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewManager(s *types.Session) (*manager, error) {
|
||||||
|
m := &manager{
|
||||||
|
session: s,
|
||||||
|
sendCh: make(chan info, 10),
|
||||||
|
receiveCh: make(chan info, 10),
|
||||||
|
stateCh: make(chan state, 10),
|
||||||
|
terminals: make(map[string]*terminal),
|
||||||
|
errorCh: make(chan *types.Instance, 10),
|
||||||
|
instances: make(map[string]*types.Instance),
|
||||||
|
}
|
||||||
|
|
||||||
e.On(event.INSTANCE_NEW, func(sessionId string, args ...interface{}) {
|
e.On(event.INSTANCE_NEW, func(sessionId string, args ...interface{}) {
|
||||||
if sessionId != s.Id {
|
if sessionId != s.Id {
|
||||||
return
|
return
|
||||||
@@ -211,6 +236,5 @@ func NewManager(s *types.Session) (*manager, error) {
|
|||||||
m.disconnect(instance)
|
m.disconnect(instance)
|
||||||
})
|
})
|
||||||
|
|
||||||
go m.process()
|
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,15 @@ func WS(so socketio.Socket) {
|
|||||||
go m.Receive(func(name string, data []byte) {
|
go m.Receive(func(name string, data []byte) {
|
||||||
so.Emit("instance terminal out", name, string(data))
|
so.Emit("instance terminal out", name, string(data))
|
||||||
})
|
})
|
||||||
|
go m.Status(func(name, status string) {
|
||||||
|
so.Emit("instance terminal status", name, status)
|
||||||
|
})
|
||||||
|
|
||||||
|
err = m.Start()
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
so.On("session close", func() {
|
so.On("session close", func() {
|
||||||
m.Close()
|
m.Close()
|
||||||
|
|||||||
@@ -174,6 +174,11 @@
|
|||||||
|
|
||||||
var socket = io({ path: '/sessions/' + sessionId + '/ws' });
|
var socket = io({ path: '/sessions/' + sessionId + '/ws' });
|
||||||
|
|
||||||
|
socket.on('instance terminal status', function(name, status) {
|
||||||
|
var instance = $scope.idx[name];
|
||||||
|
instance.status = status;
|
||||||
|
});
|
||||||
|
|
||||||
socket.on('session ready', function(ready) {
|
socket.on('session ready', function(ready) {
|
||||||
$scope.setSessionState(ready);
|
$scope.setSessionState(ready);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -123,6 +123,7 @@
|
|||||||
<span>{{uploadMessage}}</span>
|
<span>{{uploadMessage}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div ng-show="instance.status=='reconnect'" class="uploadStatus">Connection has been lost. Sometimes this happens when a windows instance is joining a swarm. Trying to reconnect terminal...</div>
|
||||||
<md-card-content flex id="terminal-{{instance.name}}" class="terminal-container">
|
<md-card-content flex id="terminal-{{instance.name}}" class="terminal-container">
|
||||||
</md-card-content>
|
</md-card-content>
|
||||||
</md-card>
|
</md-card>
|
||||||
|
|||||||
Reference in New Issue
Block a user