From 30d0270744f7ea6c2df1bdde1b4f4d6ec50ccdc8 Mon Sep 17 00:00:00 2001 From: Ralf Teusner Date: Wed, 21 Oct 2015 17:18:28 +0200 Subject: [PATCH] Show correct timeout message on timeout. Do not show a message on valid exit. --- app/assets/javascripts/editor.js | 16 ++++++---------- app/controllers/submissions_controller.rb | 6 ++++++ lib/docker_client.rb | 5 +++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/editor.js b/app/assets/javascripts/editor.js index 3966f584..cf57c08f 100644 --- a/app/assets/javascripts/editor.js +++ b/app/assets/javascripts/editor.js @@ -30,7 +30,7 @@ $(function() { numMessages = 0, turtlecanvas = $('#turtlecanvas'), prompt = $('#prompt'), - commands = ['input', 'write', 'turtle', 'turtlebatch', 'exit', 'status'], + commands = ['input', 'write', 'turtle', 'turtlebatch', 'exit', 'timeout', 'status'], streams = ['stdin', 'stdout', 'stderr']; var ENTER_KEY_CODE = 13; @@ -1004,7 +1004,7 @@ $(function() { }; var showTimeoutMessage = function() { - $.flash.danger({ + $.flash.info({ icon: ['fa', 'fa-clock-o'], text: $('#editor').data('message-timeout') }); @@ -1059,14 +1059,6 @@ $(function() { running = false; toggleButtonStates(); hidePrompt(); - flashKillMessage(); - } - - var flashKillMessage = function() { - $.flash.info({ - icon: ['fa', 'fa-clock-o'], - text: "Your program was stopped." // todo get data attribute - }); } // todo set this from websocket command, required to e.g. stop container @@ -1176,6 +1168,10 @@ $(function() { case 'exit': killWebsocketAndContainer(); break; + case 'timeout': + // just show the timeout message here. Another exit command is sent by the rails backend when the socket to the docker container closes. + showTimeoutMessage(); + break; case 'status': showStatus(msg) break; diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index e56c73c7..13435a46 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -90,6 +90,12 @@ class SubmissionsController < ApplicationController hijack do |tubesock| Thread.new { EventMachine.run } unless EventMachine.reactor_running? && EventMachine.reactor_thread.alive? + + # socket is the socket into the container, tubesock is the socket to the client + + # give the docker_client the tubesock object, so that it can send messages (timeout) + @docker_client.tubesock = tubesock + result = @docker_client.execute_run_command(@submission, params[:filename]) tubesock.send_data JSON.dump({'cmd' => 'status', 'status' => result[:status]}) diff --git a/lib/docker_client.rb b/lib/docker_client.rb index 5a1a001c..28d62697 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -12,6 +12,7 @@ class DockerClient attr_reader :container attr_reader :socket + attr_accessor :tubesock def self.check_availability! Timeout.timeout(config[:connection_timeout]) { Docker.version } @@ -176,6 +177,10 @@ class DockerClient sleep(timeout) if container.status != :returned Rails.logger.info("Killing container after timeout of " + timeout.to_s + " seconds.") + # send timeout to the tubesock socket + if(@tubesock) + @tubesock.send_data JSON.dump({'cmd' => 'timeout'}) + end kill_container(container) end end