diff --git a/services/client.go b/services/client.go index d8a5756..8015e90 100644 --- a/services/client.go +++ b/services/client.go @@ -22,6 +22,10 @@ func NewClient(so socketio.Socket, session *Session) *Client { c := &Client{SO: so} + so.On("session close", func() { + CloseSession(session) + }) + so.On("terminal in", func(name, data string) { // User wrote something on the terminal. Need to write it to the instance terminal instance := GetInstance(session, name) diff --git a/services/instance.go b/services/instance.go index c9f5c17..19ebcd0 100644 --- a/services/instance.go +++ b/services/instance.go @@ -37,8 +37,6 @@ func getDindImageName() string { } func NewInstance(session *Session) (*Instance, error) { - - //TODO: Validate that a session can only have 5 instances log.Printf("NewInstance - using image: [%s]\n", dindImage) instance, err := CreateInstance(session.Id, dindImage) instance.Session = session diff --git a/services/session.go b/services/session.go index 0e7f6c7..d7ec84f 100644 --- a/services/session.go +++ b/services/session.go @@ -50,6 +50,27 @@ func CreateWSServer() *socketio.Server { return server } +func CloseSession(s *Session) error { + s.Lock() + defer s.Unlock() + wsServer.BroadcastTo(s.Id, "session end") + log.Printf("Starting clean up of session [%s]\n", s.Id) + for _, i := range s.Instances { + i.Conn.Close() + if err := DeleteContainer(i.Name); err != nil { + log.Println(err) + return err + } + } + if err := DeleteNetwork(s.Id); err != nil { + log.Println(err) + return err + } + delete(sessions, s.Id) + log.Printf("Cleaned up session [%s]\n", s.Id) + return nil +} + func NewSession() (*Session, error) { s := &Session{} s.Id = uuid.NewV4().String() @@ -60,22 +81,7 @@ func NewSession() (*Session, error) { // Schedule cleanup of the session time.AfterFunc(4*time.Hour, func() { - s = GetSession(s.Id) - s.Lock() - defer s.Unlock() - wsServer.BroadcastTo(s.Id, "session end") - log.Printf("Starting clean up of session [%s]\n", s.Id) - for _, i := range s.Instances { - i.Conn.Close() - if err := DeleteContainer(i.Name); err != nil { - log.Println(err) - } - } - if err := DeleteNetwork(s.Id); err != nil { - log.Println(err) - } - delete(sessions, s.Id) - log.Printf("Cleaned up session [%s]\n", s.Id) + CloseSession(s) }) if err := CreateNetwork(s.Id); err != nil { diff --git a/www/assets/app.js b/www/assets/app.js index 444fb31..f4e68c1 100644 --- a/www/assets/app.js +++ b/www/assets/app.js @@ -32,6 +32,10 @@ $scope.socket.emit('viewport resize', geometry.cols, geometry.rows); } + $scope.closeSession = function() { + $scope.socket.emit('session close'); + } + $scope.upsertInstance = function(info) { var i = info; if (!$scope.idx[i.name]) { diff --git a/www/index.html b/www/index.html index 3620491..deacd3a 100644 --- a/www/index.html +++ b/www/index.html @@ -26,6 +26,7 @@ md-whiteframe="4" layout="column"> + Close session

Instances