UNPKG

webgme-executor-worker

Version:

Worker for connecting to webgme executor framework

218 lines (198 loc) 11.1 kB
<!DOCTYPE html> <html> <head> <title>WebGME executor</title> <script src="http://code.jquery.com/jquery-1.11.1.min.js"> </script> <link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"> <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> <link href="styles/worker.css" rel="stylesheet"> <!-- script src="./lib/moment.min.js" type="text/javascript" --> <!-- script src="./lib/angular-file-upload-shim.min.js" type="text/javascript" --> <script src="https://code.angularjs.org/1.2.18/angular.js" type="text/javascript"></script> <script src="https://code.angularjs.org/1.2.18/angular-route.min.js" type="text/javascript"></script> <!--script src="/lib/angular-momentjs.js" type="text/javascript" --> <!-- link rel="stylesheet" href="./lib/font-awesome/css/font-awesome.min.css" --> <!-- script src="./lib/route-styles.js" type="text/javascript" --> <!-- script src="./lib/ui-bootstrap-tpls-0.11.0.min.js" type="text/javascript" --> <!-- script src="./lib/angular-file-upload.js" type="text/javascript" --> <script> // getScript require.js //$(document).ready(function () {config.forEach( function addWebGMEConnection(webGMEUrl, parameters) { var url = nodeRequire('url'); var dataControllerName = "ExecutorWorkerController_" + url.parse(webGMEUrl).hostname; var workerView = $('\ <div class="container">\ <div class="row">\ <h1 class="hostname"><span></span> <small></small></h1>\ <div class="col-md-12 status">Connecting...</div>\ </div>\ <div class="row controller">\ <div class="col-md-12">\ <ul>\ <li data-ng-repeat="job in jobs">\ <span class="hash">{{job.hash}}</span>\ <i class="badge" data-ng-class="{\'alert-success\': job.status === \'SUCCESS\', \'alert-danger\': job.status.indexOf(\'FAILED\') === 0, \'alert-info\': job.status === \'CREATED\'}">{{job.status}}</i>\ <span>{{job.name}}</span>\ <span>{{job.url}}</span>\ <span>{{job.resultHash}}</span>\ </li>\ </ul>\ </div>\ </div>\ </div>').appendTo($("#main")); workerView.find(".hostname span").text(url.parse(webGMEUrl).hostname); workerView.find(".hostname small").text(webGMEUrl); workerView.find(".controller").attr("data-ng-controller", dataControllerName); var statusDiv = workerView.find(".status"); $.ajax({ url: webGMEUrl + "/common/lib/requirejs/require.js", cache: true, dataType: "script", success: function () { var requirejs = window.requirejs; delete window.requirejs; // don't share requirejs state across WebGMEs, they may require different versions requirejs([webGMEUrl + "/bin/getconfig.js"], function (gmeConfig) { requirejs.config({ baseUrl: webGMEUrl + '/', paths: { //"eventDispatcher": 'common/EventDispatcher', //"notificationManager": 'js/NotificationManager', "clientUtil": 'js/util', //"loaderCircles": "js/Loader/LoaderCircles", //"loaderProgressBar": "js/Loader/LoaderProgressBar", "superagent": "common/lib/superagent/superagent", "q": "common/lib/q/q", "debug": "common/lib/debug/debug", "core": "common/core", //"codemirror": 'lib/codemirror/codemirror.amd', //"jquery-csszoom": 'lib/jquery/jquery.csszoom', "blob": "common/blob", "executor": "common/executor" // "jszip": 'lib/jszip/jszip', }, nodeRequire: nodeRequire }); // FIXME ugly hack for node-webkit var node_modules = ['fs', 'stream', 'path', 'child_process', 'minimatch', 'crypto', 'util', 'mime', 'http', 'https', 'events', 'rimraf' /*, 'superagent'*/]; node_modules.forEach(function (module_name) { requirejs.s.contexts._.defined[module_name] = nodeRequire(module_name); }); global.define = define; require('./src/ExecutorWorker') require('./src/ExecutorWorkerController') require('./src/ExecutorOutputQueue') delete global.define; var worker; requirejs(['executor-worker/ExecutorWorker', 'executor/JobInfo', 'executor-worker/ExecutorWorkerController', 'client/logger', 'debug'], function (ExecutorWorker, JobInfo, ExecutorWorkerController, Logger, _debug) { _debug.enable('*'); var webGMEPort = url.parse(webGMEUrl).port || (url.parse(webGMEUrl).protocol === 'https:' ? 443 : 80), logger = Logger.create('Index', gmeConfig.client.log); logger.debug('Logger created'); worker = new ExecutorWorker({ server: url.parse(webGMEUrl).hostname, serverPort: webGMEPort, httpsecure: url.parse(webGMEUrl).protocol === 'https:', sessionId: undefined, availableProcessesContainer: availableProcessesContainer, executorNonce: parameters.executorNonce, logger: logger.fork('ExecutorWorker')}); worker.queryWorkerAPI(function (err, response) { var refreshPeriod = 60 * 1000; var callback = function (err, response) { if (err) { statusDiv.css('color', 'white'); statusDiv.css('backgroundColor', 'red'); statusDiv.text(err); } else { statusDiv.css('color', 'white'); statusDiv.css('backgroundColor', 'green'); statusDiv.text('OK'); } if (response && response.refreshPeriod) { refreshPeriod = response.refreshPeriod; } var timeoutID = window.setTimeout(function () { worker.queryWorkerAPI(callback); }, refreshPeriod); }; callback(err, response); }); var WebGMEApp = angular.module('WebGMEApp', ['ngRoute']); WebGMEApp.value("worker", worker); // WebGMEApp.value("worker", null); WebGMEApp.controller(dataControllerName, ExecutorWorkerController); /*WebGMEApp.config(['$routeProvider', function ($routeProvider) { $routeProvider. when('/executor', { templateUrl: 'app/workspace/views/WorkspaceView.html', // css: 'app/workspace/styles/Workspace.css', controller: 'ExecutorWorkerController' }). otherwise({ redirectTo: '/executor' }); }]); */ angular.bootstrap(workerView, ['WebGMEApp']); // TODO: authentication? }); }); }, error: function(jqxhr, settings, exception) { // FIXME this doesn't fire statusDiv.text("Failed to connect"); }}); }; var webGMEUrls = Object.create(null); var maxConcurrentJobs = 1; var availableProcessesContainer = { availableProcesses: maxConcurrentJobs }; // shared among all ExecutorWorkers var nodeRequire = require; (function() { var fs = nodeRequire('fs'); function readConfig() { var config = [ "http://localhost:8888" ]; try { var configJSON = fs.readFileSync('config.json', {encoding: 'utf8'}); config = JSON.parse(configJSON); if (Array.isArray(config)) { var oldConfig = config; config = {}; oldConfig.forEach(function (webGMEUrl) { config[webGMEUrl] = {}; }); } else if (typeof(config) === "string") { config = { config: {} }; } else { } } catch (e) { if (e.code !== "ENOENT") { throw e; } } Object.getOwnPropertyNames(config).forEach(function (key) { var webGMEUrl; if (key.indexOf("http") === 0) { webGMEUrl = key; if (Object.prototype.hasOwnProperty.call(webGMEUrls, webGMEUrl)) { } else { webGMEUrls[webGMEUrl] = addWebGMEConnection(webGMEUrl, config[webGMEUrl]); } // TODO: handle removing URL } else if (key === "maxConcurrentJobs") { availableProcessesContainer.availableProcesses += config[maxConcurrentJobs] - maxConcurrentJobs; maxConcurrentJobs = config[maxConcurrentJobs]; } else { console.log("Unknown configuration key " + key); } }); } $(document).ready(readConfig); fs.watch("config.json", function() { setTimeout(readConfig, 200); }); // setTimeout: likely handle O_TRUNC of config.json (though `move config.json.tmp config.json` is preferred) })(); </script> </head> <body> <div class="container" id="main"> </div> </body> </html>