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