You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2015/07/31 04:28:54 UTC

[41/41] incubator-ignite git commit: # ignite-1121 Sql tab

# ignite-1121 Sql tab


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e24f3b74
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e24f3b74
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e24f3b74

Branch: refs/heads/ignite-1121
Commit: e24f3b74bdf6a3bb5171717537fb834532e4f0b3
Parents: 6ecf626
Author: Andrey <an...@gridgain.com>
Authored: Fri Jul 31 09:29:28 2015 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Fri Jul 31 09:29:28 2015 +0700

----------------------------------------------------------------------
 .../src/main/js/agents/agent-manager.js         | 283 +++++++++++++++++++
 .../src/main/js/agents/agent-server.js          |  90 ++++++
 modules/control-center-web/src/main/js/app.js   |   8 +-
 .../src/main/js/controllers/common-module.js    |  26 +-
 .../src/main/js/controllers/sql-controller.js   |  22 +-
 modules/control-center-web/src/main/js/db.js    |  12 +
 .../src/main/js/keys/test.crt                   |  13 +
 .../src/main/js/keys/test.key                   |  18 ++
 .../src/main/js/routes/agent.js                 |  84 ++++++
 .../src/main/js/routes/notebooks.js             | 102 +++++++
 .../src/main/js/routes/sql.js                   |   4 +-
 .../src/main/js/views/includes/header.jade      |   7 +-
 .../src/main/js/views/sql/sql.jade              |   3 +-
 .../src/test/js/routes/agent.js                 |  94 ++++++
 modules/nodejs/src/main/js/cluster-node.js      |  23 +-
 modules/nodejs/src/main/js/ignite.js            |   5 +-
 .../http/jetty/GridJettyJsonConfig.java         |   3 +
 .../src/main/js/agents/agent-manager.js         | 283 -------------------
 .../src/main/js/agents/agent-server.js          |  90 ------
 .../src/main/js/keys/test.crt                   |  13 -
 .../src/main/js/keys/test.key                   |  18 --
 .../src/main/js/routes/agent.js                 |  84 ------
 .../src/test/js/routes/agent.js                 |  94 ------
 23 files changed, 778 insertions(+), 601 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/agents/agent-manager.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/agents/agent-manager.js b/modules/control-center-web/src/main/js/agents/agent-manager.js
new file mode 100644
index 0000000..10d3a56
--- /dev/null
+++ b/modules/control-center-web/src/main/js/agents/agent-manager.js
@@ -0,0 +1,283 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var WebSocketServer = require('ws').Server;
+
+var apacheIgnite = require('apache-ignite');
+
+var db = require('../db');
+
+var AgentServer = require('./agent-server').AgentServer;
+
+/**
+ * @constructor
+ */
+function AgentManager(srv) {
+    this._clients = {};
+
+    this._server = srv;
+
+    this._wss = new WebSocketServer({ server: this._server });
+
+    var self = this;
+
+    this._wss.on('connection', function(ws) {
+        var client = new Client(ws, self);
+    });
+}
+
+/**
+ * @param userId
+ * @param {Client} client
+ */
+AgentManager.prototype._removeClient = function(userId, client) {
+    var connections = this._clients[userId];
+
+    if (connections) {
+        removeFromArray(connections, client);
+
+        if (connections.length == 0)
+            delete this._clients[userId];
+    }
+};
+
+/**
+ * @param userId
+ * @param {Client} client
+ */
+AgentManager.prototype._addClient = function(userId, client) {
+    var existingConnections = this._clients[userId];
+
+    if (!existingConnections) {
+        existingConnections = [];
+
+        this._clients[userId] = existingConnections;
+    }
+
+    existingConnections.push(client);
+};
+
+/**
+ * @param userId
+ * @return {Client}
+ */
+AgentManager.prototype.findClient = function(userId) {
+    var clientsList = this._clients[userId];
+
+    if (!clientsList)
+        return null;
+
+    return clientsList[0];
+};
+
+/**
+ * For tests only!!!
+ * @return {Client}
+ */
+AgentManager.prototype.getOneClient = function() {
+    for (var userId in this._clients) {
+        if (this._clients.hasOwnProperty(userId)) {
+            var m = this._clients[userId];
+
+            if (m.length > 0)
+                return m[0];
+        }
+    }
+
+    return null;
+};
+
+
+/**
+ * @constructor
+ * @param {AgentManager} manager
+ * @param {WebSocket} ws
+ */
+function Client(ws, manager) {
+    var self = this;
+
+    this._manager = manager;
+    this._ws = ws;
+
+    ws.on('close', function() {
+        if (self.user) {
+            self._manager._removeClient(self.user._id, self);
+        }
+    });
+
+    ws.on('message', function (msg) {
+        self._handleMessage(JSON.parse(msg))
+    });
+
+    this._restCounter = 0;
+
+    this._cbMap = {};
+}
+
+/**
+ * @param {String|Object} msg
+ * @param {Function} cb
+ */
+Client.prototype.sendMessage = function(msg, cb) {
+    if (typeof msg == 'object') {
+        msg = JSON.stringify(msg);
+    }
+
+    this._ws.send(msg, cb);
+};
+
+/**
+ * @param {String} path
+ * @param {Object} params
+ * @param {Function} cb
+ * @param {String} method
+ * @param {String} body
+ * @param {Object} headers
+ */
+Client.prototype.invokeRest = function(path, params, cb, method, body, headers) {
+    var self = this;
+
+    if (typeof(params) != 'object')
+        throw "'params' argument must be an object";
+
+    if (typeof(cb) != 'function')
+        throw "callback must be a function";
+
+    if (body && typeof(body) != 'string')
+        throw "body must be a string";
+
+    if (headers && typeof(headers) != 'object')
+        throw "headers must be an object";
+
+    if (!method)
+        method = 'GET';
+    else
+        method = method.toUpperCase();
+
+    if (method != 'GET' && method != 'POST')
+        throw "Unknown HTTP method: " + method;
+
+    var reqId = this._restCounter++;
+
+    this._cbMap[reqId] = cb;
+
+    this.sendMessage({
+        id: reqId,
+        type: 'RestRequest',
+        method: method,
+        params: params,
+        path: path,
+        body: body,
+        headers: headers
+    }, function(err) {
+        if (err) {
+            delete self._cbMap[reqId];
+
+            cb(err)
+        }
+    })
+};
+
+/**
+ * @param {Object} msg
+ */
+Client.prototype._handleMessage = function(msg) {
+    var self = this;
+
+    switch (msg.type) {
+        case 'AuthMessage':
+            var account = db.Account.findByUsername(msg.login, function(err, account) {
+                if (err) {
+                    ws.send("{type: 'AuthResult', success: false}");
+                }
+                else {
+                    account.authenticate(msg.password, function(err, user, res) {
+                        if (!user) {
+                            self._ws.send(JSON.stringify({type: 'AuthResult', success: false, message: res.message}));
+                        }
+                        else {
+                            self._ws.send("{type: 'AuthResult', success: true}");
+
+                            self._user = account;
+
+                            self._manager._addClient(account._id, self);
+
+                            self._ignite = new apacheIgnite.Ignite(new AgentServer(self));
+                        }
+                    });
+                }
+            });
+
+            break;
+
+        case 'RestResult':
+            var cb = this._cbMap[msg.requestId];
+
+            if (!cb)
+                break;
+
+            delete this._cbMap[msg.requestId];
+
+            if (!msg.executed) {
+                cb(msg.message)
+            }
+            else {
+                cb(null, msg.code, msg.message)
+            }
+
+            break;
+
+        default:
+            this._ws.close()
+    }
+};
+
+/**
+ * @return {Ignite}
+ */
+Client.prototype.ignite = function() {
+    return this._ignite;
+};
+
+function removeFromArray(arr, val) {
+    var idx;
+
+    while ((idx = arr.indexOf(val)) !== -1) {
+        arr.splice(idx, 1);
+    }
+}
+
+exports.AgentManager = AgentManager;
+
+/**
+ * @type {AgentManager}
+ */
+var manager = null;
+
+exports.createManager = function(srv) {
+    if (manager)
+        throw "Agent manager already cleared!";
+
+    manager = new AgentManager(srv);
+};
+
+/**
+ * @return {AgentManager}
+ */
+exports.getAgentManager = function() {
+    return manager;
+};

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/agents/agent-server.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/agents/agent-server.js b/modules/control-center-web/src/main/js/agents/agent-server.js
new file mode 100644
index 0000000..31dee5a
--- /dev/null
+++ b/modules/control-center-web/src/main/js/agents/agent-server.js
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Creates an instance of server for Ignite
+ *
+ * @constructor
+ * @this {AgentServer}
+ * @param {Client} client connected client
+ */
+function AgentServer(client) {
+    this._client = client;
+}
+
+/**
+ * Run http request
+ *
+ * @this {AgentServer}
+ * @param {Command} cmd Command
+ * @param {callback} callback on finish
+ */
+AgentServer.prototype.runCommand = function(cmd, callback) {
+    var params = {cmd: cmd.name()};
+
+    for (var p of cmd._params) {
+        params[p.key] = p.value;
+    }
+
+    var body = undefined;
+
+    var headers = undefined;
+
+    if (cmd._isPost()) {
+        body = cmd.postData();
+
+        headers = {'Content-Length': body.length, 'JSONObject': 'application/json'};
+    }
+
+    this._client.invokeRest("ignite", params, function(error, code, message) {
+        if (error) {
+            callback(error);
+            return
+        }
+
+        if (code !== 200) {
+            if (code === 401) {
+                callback.call(null, "Authentication failed. Status code 401.");
+            }
+            else {
+                callback.call(null, "Request failed. Status code " + code);
+            }
+
+            return;
+        }
+
+        var igniteResponse;
+
+        try {
+            igniteResponse = JSON.parse(message);
+        }
+        catch (e) {
+            callback.call(null, e, null);
+
+            return;
+        }
+
+        if (igniteResponse.successStatus) {
+            callback.call(null, igniteResponse.error, null)
+        }
+        else {
+            callback.call(null, null, igniteResponse.response);
+        }
+    }, cmd._method(), body, headers);
+};
+
+exports.AgentServer = AgentServer;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/app.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app.js b/modules/control-center-web/src/main/js/app.js
index 930c798..7741822 100644
--- a/modules/control-center-web/src/main/js/app.js
+++ b/modules/control-center-web/src/main/js/app.js
@@ -26,6 +26,7 @@ var session = require('express-session');
 var mongoStore = require('connect-mongo')(session);
 
 var publicRoutes = require('./routes/public');
+var notebooksRoutes = require('./routes/notebooks');
 var clustersRouter = require('./routes/clusters');
 var cachesRouter = require('./routes/caches');
 var metadataRouter = require('./routes/metadata');
@@ -123,8 +124,11 @@ app.use('/configuration/clusters', clustersRouter);
 app.use('/configuration/caches', cachesRouter);
 app.use('/configuration/metadata', metadataRouter);
 app.use('/configuration/summary', summary);
-app.use('/sql', sqlRouter);
-app.use('/agent', agentRouter);
+
+app.use('/notebooks', mustAuthenticated, notebooksRoutes);
+app.use('/sql', mustAuthenticated, sqlRouter);
+
+app.use('/agent', mustAuthenticated, agentRouter);
 
 // Catch 404 and forward to error handler.
 app.use(function (req, res, next) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/controllers/common-module.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/controllers/common-module.js b/modules/control-center-web/src/main/js/controllers/common-module.js
index df2ff19..8d3efed 100644
--- a/modules/control-center-web/src/main/js/controllers/common-module.js
+++ b/modules/control-center-web/src/main/js/controllers/common-module.js
@@ -481,4 +481,28 @@ controlCenterModule.controller('auth', [
                     $alert({placement: 'top', container: '#errors-container', title: $scope.errorMessage(data)});
                 });
         };
-    }]);
\ No newline at end of file
+    }]);
+
+// Navigation bar controller.
+controlCenterModule.controller('notebooks', ['$scope', '$http','$common', function ($scope, $http, $common) {
+    $scope.notebooks = [];
+
+    // When landing on the page, get clusters and show them.
+    $http.post('/notebooks/list')
+        .success(function (data) {
+            $scope.notebooks = data;
+
+            if ($scope.notebooks.length > 0) {
+                $scope.notebookDropdown = [
+                    { text: 'Create new notebook', href: '/notebooks/new', target: '_self' },
+                    { divider: true }
+                ];
+
+                for (notebook of $scope.notebooks)
+                    $scope.notebookDropdown.push({text: notebook.name, href: '/sql/' + notebook._id, target: '_self'});
+            }
+        })
+        .error(function (errMsg) {
+            $common.showError(errMsg);
+        });
+}]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/controllers/sql-controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/controllers/sql-controller.js b/modules/control-center-web/src/main/js/controllers/sql-controller.js
index b4b4335..1e67a08 100644
--- a/modules/control-center-web/src/main/js/controllers/sql-controller.js
+++ b/modules/control-center-web/src/main/js/controllers/sql-controller.js
@@ -15,7 +15,11 @@
  * limitations under the License.
  */
 
-controlCenterModule.controller('sqlController', ['$scope', '$http', '$common', function ($scope, $http, $common) {
+controlCenterModule.controller('sqlController', ['$scope', '$controller', '$http', '$common',
+    function ($scope, $controller, $http, $common) {
+    // Initialize the super class and extend it.
+    angular.extend(this, $controller('notebooks', {$scope: $scope}));
+
     $scope.joinTip = $common.joinTip;
 
     $scope.pageSizes = [50, 100, 200, 400, 800, 1000];
@@ -26,6 +30,22 @@ controlCenterModule.controller('sqlController', ['$scope', '$http', '$common', f
         {value: 'LOCAL', label: 'LOCAL'}
     ];
 
+    var loadNotebook = function() {
+        $http.post('/notebooks/get', {nodeId: $scope.nodeId})
+            .success(function (notebook) {
+                $scope.notebook = notebook;
+            })
+            .error(function (errMsg) {
+                $common.showError(errMsg);
+            });
+    };
+
+    loadNotebook();
+
+    $scope.addParagraph = function(notebook) {
+        notebook.paragraphs.push({});
+    };
+
     $scope.tabs = [];
 
     $scope.addTab = function() {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/db.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/db.js b/modules/control-center-web/src/main/js/db.js
index 5232e24..401beff 100644
--- a/modules/control-center-web/src/main/js/db.js
+++ b/modules/control-center-web/src/main/js/db.js
@@ -355,6 +355,18 @@ var PersistenceSchema = new Schema({
 // Define persistence model.
 exports.Persistence = mongoose.model('Persistence', PersistenceSchema);
 
+// Define persistence schema.
+var NotebookSchema = new Schema({
+    space: {type: ObjectId, ref: 'Space'},
+    name: String,
+    paragraph: [{
+        query: String
+    }]
+});
+
+// Define persistence model.
+exports.Notebook = mongoose.model('Notebook', NotebookSchema);
+
 exports.upsert = function (model, data, cb) {
     if (data._id) {
         var id = data._id;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/keys/test.crt
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/keys/test.crt b/modules/control-center-web/src/main/js/keys/test.crt
new file mode 100644
index 0000000..50c6d5c
--- /dev/null
+++ b/modules/control-center-web/src/main/js/keys/test.crt
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB6zCCAVQCCQDcAphbU6UcLjANBgkqhkiG9w0BAQsFADA6MRIwEAYDVQQDDAls
+b2NhbGhvc3QxJDAiBgkqhkiG9w0BCQEWFXNldmRva2ltb3ZAYXBhY2hlLm9yZzAe
+Fw0xNTA3MTQxMzAyNTNaFw0xODA2MjMxMzAyNTNaMDoxEjAQBgNVBAMMCWxvY2Fs
+aG9zdDEkMCIGCSqGSIb3DQEJARYVc2V2ZG9raW1vdkBhcGFjaGUub3JnMIGfMA0G
+CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP/zpJrdHqCj6lPpeFF6LQtzKef6UiyBBo
+rbuOtCCgW8KMJJciluBWk2126qLt9smBN4jBpSNU3pq0r9gBMUTd/LSe7aY4D5ED
+Pjp7XsypNVKeHaHbFi7KhfHy0LYxsWiNPmmHJv4dtYOp+pGK25rkXNfyJxxjgxN6
+wo34+MnZIQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAFk9XEjcdyihws+fVmdGGUFo
+bVxI9YGH6agiNbU3WNF4B4VRzcPPW8z2mEo7eF9kgYmq/YzH4T8tgi/qkL/u8eZV
+Wmi9bg6RThLN6/hj3wVoOFKykbDQ05FFdhIJXN5UOjPmxYM97EKqg6J0W2HAb8SG
++UekPnmAo/2HTKsLykH8
+-----END CERTIFICATE-----

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/keys/test.key
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/keys/test.key b/modules/control-center-web/src/main/js/keys/test.key
new file mode 100644
index 0000000..1b395c0
--- /dev/null
+++ b/modules/control-center-web/src/main/js/keys/test.key
@@ -0,0 +1,18 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,6798185330CE2EE2
+
+sOwkmD8rvjx11l09V26dJhLhl+SyPIhyeZ3TqHXrYCATKoXlzidT+uPu1jVYtrwr
+nBLA6TrIDYRrBNlEsqGZ0cSvWTIczzVW1xZKHEJo5q2vUT/W8u/Q1QQtS3P3GeKF
+dEzx496rpZqwwVw59GNbuIwyYoVvQf3iEXzfhplGmLPELYIplDFOLgNuXQyXSGx6
+rwKsCxXMLsDyrA6DCz0Odf08p2HvWk/s5Ne3DFcQlqRNtIrBVGD2O0/Fp8ZZ2I4E
+Yn2OIIWJff3HanOjLOWKdN8YAn5UleNmlEUdIHeS5qaQ68mabOxLkSef9qglV+sd
+FHTtUq0cG6t6nhxZBziexha6v1yl/xABAHHhNPOfak+HthWxRD4N9f1yFYAeTmkn
+4kwBWoSUe12XRf2pGNqhEUKN/KhDmWk85wI55i/Cu2XmNoiBFlS9BXrRYU8uVCJw
+KlxjKTDWl1opCyvxTDxJnMkt44ZT445LRePKVueGIIKSUIXNQypOE+C1I0CL0N2W
+Ts3m9nthquvLeMx92k7b8yW69BER5uac3SIlGCOJObQXsHgyk8wYiyd/zLKfjctG
+PXieaW81UKjp+GqWpvWPz3VqnKwoyUWeVOOTviurli6kYOrHuySTMqMb6hxJctw9
+grAQTT0UPiAKWcM7InLzZnRjco+v9QLLEokjVngXPba16K/CItFY16xuGlaFLW7Y
+XTc67AkL8b76HBZelMjmCsqjvSoULhuMFwTOvUMm/mSM8rMoi9asrJRLQHRMWCST
+/6RENPLzPlOMnNLBujpBbn8V3/aYzEZsHMI+6S3d27WYlTJIqpabSA==
+-----END RSA PRIVATE KEY-----

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/agent.js b/modules/control-center-web/src/main/js/routes/agent.js
new file mode 100644
index 0000000..4646c28
--- /dev/null
+++ b/modules/control-center-web/src/main/js/routes/agent.js
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var router = require('express').Router();
+var agentManager = require('../agents/agent-manager');
+
+var apacheIgnite = require('apache-ignite');
+var SqlFieldsQuery = apacheIgnite.SqlFieldsQuery;
+
+/* GET summary page. */
+router.post('/topology', function(req, res) {
+    var client = agentManager.getAgentManager().getOneClient();
+
+    if (!client)
+        return res.status(500).send("Client not found");
+
+    client.ignite().cluster().then(function (clusters) {
+        res.json(clusters.map(function (cluster) {
+            var caches = Object.keys(cluster._caches).map(function(key) {
+                return {"name" : key, "mode" : cluster._caches[key] }
+            });
+
+            return { nodeId: cluster._nodeId, caches: caches };
+        }));
+    }, function (err) {
+        res.send(err);
+    });
+});
+
+/* GET summary page. */
+router.post('/query', function(req, res) {
+    var client = agentManager.getAgentManager().getOneClient();
+
+    if (!client)
+        return res.status(500).send("Client not found");
+
+    // Create sql query.
+    var qry = new SqlFieldsQuery(req.body.query);
+
+    // Set page size for query.
+    qry.setPageSize(req.body.pageSize);
+
+    // Get query cursor.
+    client.ignite().cache(req.body.cacheName).query(qry).nextPage().then(function (cursor) {
+        res.json({meta: cursor.fieldsMetadata(), rows: cursor.page(), queryId: cursor.queryId()});
+    }, function (err) {
+        res.status(500).send(err);
+    });
+});
+
+/* GET summary page. */
+router.post('/next_page', function(req, res) {
+    var client = agentManager.getAgentManager().getOneClient();
+
+    if (!client)
+        return res.status(500).send("Client not found");
+
+    var cache = client.ignite().cache(req.body.cacheName);
+
+    var cmd = cache._createCommand("qryfetch").addParam("qryId", req.body.queryId).
+        addParam("psz", req.body.pageSize);
+
+    cache.__createPromise(cmd).then(function (page) {
+        res.json({rows: page["items"], last: page === null || page["last"]});
+    }, function (err) {
+        res.status(500).send(err);
+    });
+});
+
+module.exports = router;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/routes/notebooks.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/notebooks.js b/modules/control-center-web/src/main/js/routes/notebooks.js
new file mode 100644
index 0000000..5b7ac8e
--- /dev/null
+++ b/modules/control-center-web/src/main/js/routes/notebooks.js
@@ -0,0 +1,102 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  * contributor license agreements.  See the NOTICE file distributed with
+ *  * this work for additional information regarding copyright ownership.
+ *  * The ASF licenses this file to You under the Apache License, Version 2.0
+ *  * (the "License"); you may not use this file except in compliance with
+ *  * the License.  You may obtain a copy of the License at
+ *  *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+
+var router = require('express').Router();
+var db = require('../db');
+
+/**
+ * Get notebooks names accessed for user account.
+ *
+ * @param req Request.
+ * @param res Response.
+ */
+router.post('/list', function (req, res) {
+    var user_id = req.currentUserId();
+
+    // Get owned space and all accessed space.
+    db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) {
+        if (err)
+            return res.status(500).send(err.message);
+
+        var space_ids = spaces.map(function (value) {
+            return value._id;
+        });
+
+        // Get all metadata for spaces.
+        db.Notebook.find({space: {$in: space_ids}}).select('_id name').sort('name').exec(function (err, notebooks) {
+            if (err)
+                return res.status(500).send(err.message);
+
+            res.json(notebooks);
+        });
+    });
+});
+
+/**
+ * Get notebook accessed for user account.
+ *
+ * @param req Request.
+ * @param res Response.
+ */
+router.post('/get', function (req, res) {
+    var user_id = req.currentUserId();
+
+    // Get owned space and all accessed space.
+    db.Space.find({$or: [{owner: user_id}, {usedBy: {$elemMatch: {account: user_id}}}]}, function (err, spaces) {
+        if (err)
+            return res.status(500).send(err.message);
+
+        var space_ids = spaces.map(function (value) {
+            return value._id;
+        });
+
+        // Get all metadata for spaces.
+        db.Notebook.findOne({$or : [{space: {$in: space_ids}}, {_id: req.body.noteId}]}).exec(function (err, notebook) {
+            if (err)
+                return res.status(500).send(err.message);
+
+            res.json(notebook);
+        });
+    });
+});
+
+/**
+ * Create new notebook for user account.
+ *
+ * @param req Request.
+ * @param res Response.
+ */
+router.get('/new', function (req, res) {
+    var user_id = req.currentUserId();
+
+    // Get owned space and all accessed space.
+    db.Space.findOne({owner: user_id}, function (err, space) {
+        if (err)
+            return res.status(500).send(err.message);
+
+        (new db.Notebook({space: space.id, name: 'Notebook', paragraph: []})).save(function (err, notebook) {
+            if (err)
+                return res.status(500).send(err.message);
+
+            return res.redirect('/sql/' + notebook._id);
+        });
+    });
+});
+
+module.exports = router;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/routes/sql.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/routes/sql.js b/modules/control-center-web/src/main/js/routes/sql.js
index ce4565d..d11be69 100644
--- a/modules/control-center-web/src/main/js/routes/sql.js
+++ b/modules/control-center-web/src/main/js/routes/sql.js
@@ -17,8 +17,8 @@
 
 var router = require('express').Router();
 var db = require('../db');
-router.get('/', function(req, res) {
-    res.render('sql/sql');
+router.get('/:noteId', function (req, res) {
+    res.render('sql/sql', {noteId: req.params.noteId});
 });
 
 module.exports = router;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/views/includes/header.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/includes/header.jade b/modules/control-center-web/src/main/js/views/includes/header.jade
index bfd5275..49ea592 100644
--- a/modules/control-center-web/src/main/js/views/includes/header.jade
+++ b/modules/control-center-web/src/main/js/views/includes/header.jade
@@ -29,11 +29,14 @@ header.header(id='header')
             ul.nav.navbar-nav(ng-controller='activeLink' ng-show='user')
                 +header-item('/configuration', '/configuration/clusters', 'Configuration')
                 //+header-item('/monitoring', '/monitoring', 'Monitoring')
-                +header-item('/sql', '/sql', 'SQL')
+                li(ng-controller='notebooks')
+                    a.dropdown-toggle(ng-hide='notebooks.length == 0' data-toggle='dropdown' bs-dropdown='notebookDropdown' data-placement='bottom-right') SQL
+                        span.caret
+                    a(ng-hide='notebooks.length > 0' ng-class='{active: isActive("/sql")}' href='/notebooks/new') SQL
                 //+header-item('/deploy', '/deploy', 'Deploy')
             ul.nav.navbar-nav.pull-right
                 li(ng-if='user')
-                    a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='userDropdown' data-placement='bottom-right') {{user.username}}
+                    a.dropdown-toggle(data-toggle='dropdown' bs-dropdown='userDropdown' data-placement='bottom-right' data-ng-bind='::user.username')
                         span.caret
                 li.nav-login(ng-if='!user')
                     a(ng-click='login()' href='#') Log In
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/main/js/views/sql/sql.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/views/sql/sql.jade b/modules/control-center-web/src/main/js/views/sql/sql.jade
index 2ce6958..53e6639 100644
--- a/modules/control-center-web/src/main/js/views/sql/sql.jade
+++ b/modules/control-center-web/src/main/js/views/sql/sql.jade
@@ -11,6 +11,7 @@
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
+
 extends ../templates/layout
 
 append scripts
@@ -27,7 +28,7 @@ block container
                 .docs-header
                     h1 Connect to Ignite and Execute SQL Queries
                     hr
-                .docs-body(ng-controller='sqlController')
+                .docs-body(ng-controller='sqlController' ng-init='noteId = #{JSON.stringify(noteId)};')
                     - var tab = 'tabs[tabs.activeIdx]'
 
                     .block-callout-parent.block-callout-border.margin-bottom-dflt

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/control-center-web/src/test/js/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/test/js/routes/agent.js b/modules/control-center-web/src/test/js/routes/agent.js
new file mode 100644
index 0000000..c8bfd82
--- /dev/null
+++ b/modules/control-center-web/src/test/js/routes/agent.js
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var request = require('supertest'),
+    should = require('should'),
+    app = require('../../app'),
+    fs = require('fs'),
+    https = require('https'),
+    config = require('../../helpers/configuration-loader.js'),
+    agentManager = require('../../agents/agent-manager');
+
+/**
+ * Create HTTP server.
+ */
+/**
+ * Start agent server.
+ */
+var agentServer = https.createServer({
+    key: fs.readFileSync(config.get('monitor:server:key')),
+    cert: fs.readFileSync(config.get('monitor:server:cert')),
+    passphrase: config.get('monitor:server:keyPassphrase')
+});
+
+agentServer.listen(config.get('monitor:server:port'));
+
+agentManager.createManager(agentServer);
+
+describe('request from agent', function() {
+    var agent = request.agent(app);
+
+    before(function (done) {
+        this.timeout(10000);
+
+        agent
+            .post('/login')
+            .send({email: 'anovikov@gridgain.com', password: 'extHB2aXgb'})
+            .expect(302)
+            .end(function (err) {
+                if (err)
+                    throw err;
+
+                setTimeout(done, 5000);
+            });
+    });
+
+    it('should return topology snapshot', function(done){
+        agent
+            .post('/agent/topology')
+            .send({})
+            .end(function(err, nodes) {
+                if (err) {
+                    console.log(err.response.text);
+
+                    throw err;
+                }
+
+                console.log(nodes);
+
+                done();
+            });
+    });
+
+    //it('should query result', function(done){
+    //    agent
+    //        .post('/agent/query')
+    //        .send({
+    //            username: 'nva',
+    //            password: 'nva.141',
+    //            host: 'localhost',
+    //            port: '5432',
+    //            dbName: 'ggmonitor'
+    //        })
+    //        .end(function(err, res) {
+    //            if (err)
+    //                throw err;
+    //
+    //            done();
+    //        });
+    //});
+});

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/nodejs/src/main/js/cluster-node.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/main/js/cluster-node.js b/modules/nodejs/src/main/js/cluster-node.js
index 940f123..7ef4fb3 100644
--- a/modules/nodejs/src/main/js/cluster-node.js
+++ b/modules/nodejs/src/main/js/cluster-node.js
@@ -15,15 +15,17 @@
  * limitations under the License.
  */
 
- /**
-  * @constructor
-  * @this{ClusterNode}
-  * @param {string} nodeId Node id
-  * @param {Object.<string,string>} attr Node Attributes
-  */
-function ClusterNode(nodeId, attr) {
+/**
+ * @constructor
+ * @this{ClusterNode}
+ * @param {string} nodeId Node id
+ * @param {Object.<string,string>} attr Node Attributes
+ * @param {Object.<string,string>} caches Node caches name, mode
+ */
+function ClusterNode(nodeId, attr, caches) {
     this._nodeId = nodeId;
     this._attr = attr;
+    this._caches = caches;
 }
 
 /**
@@ -40,4 +42,11 @@ ClusterNode.prototype.attributes = function() {
     return this._attr;
 }
 
+/**
+ * @returns {Object.<string,string>} Node caches name, mode
+ */
+ClusterNode.prototype.caches = function() {
+    return this._caches;
+}
+
 exports.ClusterNode = ClusterNode
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/nodejs/src/main/js/ignite.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/main/js/ignite.js b/modules/nodejs/src/main/js/ignite.js
index 5b68c23..47facc0 100644
--- a/modules/nodejs/src/main/js/ignite.js
+++ b/modules/nodejs/src/main/js/ignite.js
@@ -129,9 +129,8 @@ Ignite.prototype.cluster = function() {
                 else {
                     var nodes = [];
 
-                    for (var node of res) {
-                        nodes.push(new ClusterNode(node.nodeId, node.attributes));
-                    }
+                    for (var node of res)
+                        nodes.push(new ClusterNode(node.nodeId, node.attributes, node.caches));
 
                     resolve(nodes);
                 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyJsonConfig.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyJsonConfig.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyJsonConfig.java
index e36da80..ad6ee22 100644
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyJsonConfig.java
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyJsonConfig.java
@@ -39,6 +39,9 @@ public class GridJettyJsonConfig extends JsonConfig {
     private static class ToStringJsonProcessor implements JsonValueProcessor {
         /** {@inheritDoc} */
         @Override public Object processArrayValue(Object val, JsonConfig jsonCfg) {
+            if (val != null && val.getClass() == UUID.class)
+                return val.toString();
+
             throw new UnsupportedOperationException("Serialize array to string is not supported: " + val);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/main/js/agents/agent-manager.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/agents/agent-manager.js b/modules/web-control-center/src/main/js/agents/agent-manager.js
deleted file mode 100644
index 10d3a56..0000000
--- a/modules/web-control-center/src/main/js/agents/agent-manager.js
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var WebSocketServer = require('ws').Server;
-
-var apacheIgnite = require('apache-ignite');
-
-var db = require('../db');
-
-var AgentServer = require('./agent-server').AgentServer;
-
-/**
- * @constructor
- */
-function AgentManager(srv) {
-    this._clients = {};
-
-    this._server = srv;
-
-    this._wss = new WebSocketServer({ server: this._server });
-
-    var self = this;
-
-    this._wss.on('connection', function(ws) {
-        var client = new Client(ws, self);
-    });
-}
-
-/**
- * @param userId
- * @param {Client} client
- */
-AgentManager.prototype._removeClient = function(userId, client) {
-    var connections = this._clients[userId];
-
-    if (connections) {
-        removeFromArray(connections, client);
-
-        if (connections.length == 0)
-            delete this._clients[userId];
-    }
-};
-
-/**
- * @param userId
- * @param {Client} client
- */
-AgentManager.prototype._addClient = function(userId, client) {
-    var existingConnections = this._clients[userId];
-
-    if (!existingConnections) {
-        existingConnections = [];
-
-        this._clients[userId] = existingConnections;
-    }
-
-    existingConnections.push(client);
-};
-
-/**
- * @param userId
- * @return {Client}
- */
-AgentManager.prototype.findClient = function(userId) {
-    var clientsList = this._clients[userId];
-
-    if (!clientsList)
-        return null;
-
-    return clientsList[0];
-};
-
-/**
- * For tests only!!!
- * @return {Client}
- */
-AgentManager.prototype.getOneClient = function() {
-    for (var userId in this._clients) {
-        if (this._clients.hasOwnProperty(userId)) {
-            var m = this._clients[userId];
-
-            if (m.length > 0)
-                return m[0];
-        }
-    }
-
-    return null;
-};
-
-
-/**
- * @constructor
- * @param {AgentManager} manager
- * @param {WebSocket} ws
- */
-function Client(ws, manager) {
-    var self = this;
-
-    this._manager = manager;
-    this._ws = ws;
-
-    ws.on('close', function() {
-        if (self.user) {
-            self._manager._removeClient(self.user._id, self);
-        }
-    });
-
-    ws.on('message', function (msg) {
-        self._handleMessage(JSON.parse(msg))
-    });
-
-    this._restCounter = 0;
-
-    this._cbMap = {};
-}
-
-/**
- * @param {String|Object} msg
- * @param {Function} cb
- */
-Client.prototype.sendMessage = function(msg, cb) {
-    if (typeof msg == 'object') {
-        msg = JSON.stringify(msg);
-    }
-
-    this._ws.send(msg, cb);
-};
-
-/**
- * @param {String} path
- * @param {Object} params
- * @param {Function} cb
- * @param {String} method
- * @param {String} body
- * @param {Object} headers
- */
-Client.prototype.invokeRest = function(path, params, cb, method, body, headers) {
-    var self = this;
-
-    if (typeof(params) != 'object')
-        throw "'params' argument must be an object";
-
-    if (typeof(cb) != 'function')
-        throw "callback must be a function";
-
-    if (body && typeof(body) != 'string')
-        throw "body must be a string";
-
-    if (headers && typeof(headers) != 'object')
-        throw "headers must be an object";
-
-    if (!method)
-        method = 'GET';
-    else
-        method = method.toUpperCase();
-
-    if (method != 'GET' && method != 'POST')
-        throw "Unknown HTTP method: " + method;
-
-    var reqId = this._restCounter++;
-
-    this._cbMap[reqId] = cb;
-
-    this.sendMessage({
-        id: reqId,
-        type: 'RestRequest',
-        method: method,
-        params: params,
-        path: path,
-        body: body,
-        headers: headers
-    }, function(err) {
-        if (err) {
-            delete self._cbMap[reqId];
-
-            cb(err)
-        }
-    })
-};
-
-/**
- * @param {Object} msg
- */
-Client.prototype._handleMessage = function(msg) {
-    var self = this;
-
-    switch (msg.type) {
-        case 'AuthMessage':
-            var account = db.Account.findByUsername(msg.login, function(err, account) {
-                if (err) {
-                    ws.send("{type: 'AuthResult', success: false}");
-                }
-                else {
-                    account.authenticate(msg.password, function(err, user, res) {
-                        if (!user) {
-                            self._ws.send(JSON.stringify({type: 'AuthResult', success: false, message: res.message}));
-                        }
-                        else {
-                            self._ws.send("{type: 'AuthResult', success: true}");
-
-                            self._user = account;
-
-                            self._manager._addClient(account._id, self);
-
-                            self._ignite = new apacheIgnite.Ignite(new AgentServer(self));
-                        }
-                    });
-                }
-            });
-
-            break;
-
-        case 'RestResult':
-            var cb = this._cbMap[msg.requestId];
-
-            if (!cb)
-                break;
-
-            delete this._cbMap[msg.requestId];
-
-            if (!msg.executed) {
-                cb(msg.message)
-            }
-            else {
-                cb(null, msg.code, msg.message)
-            }
-
-            break;
-
-        default:
-            this._ws.close()
-    }
-};
-
-/**
- * @return {Ignite}
- */
-Client.prototype.ignite = function() {
-    return this._ignite;
-};
-
-function removeFromArray(arr, val) {
-    var idx;
-
-    while ((idx = arr.indexOf(val)) !== -1) {
-        arr.splice(idx, 1);
-    }
-}
-
-exports.AgentManager = AgentManager;
-
-/**
- * @type {AgentManager}
- */
-var manager = null;
-
-exports.createManager = function(srv) {
-    if (manager)
-        throw "Agent manager already cleared!";
-
-    manager = new AgentManager(srv);
-};
-
-/**
- * @return {AgentManager}
- */
-exports.getAgentManager = function() {
-    return manager;
-};

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/main/js/agents/agent-server.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/agents/agent-server.js b/modules/web-control-center/src/main/js/agents/agent-server.js
deleted file mode 100644
index 31dee5a..0000000
--- a/modules/web-control-center/src/main/js/agents/agent-server.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Creates an instance of server for Ignite
- *
- * @constructor
- * @this {AgentServer}
- * @param {Client} client connected client
- */
-function AgentServer(client) {
-    this._client = client;
-}
-
-/**
- * Run http request
- *
- * @this {AgentServer}
- * @param {Command} cmd Command
- * @param {callback} callback on finish
- */
-AgentServer.prototype.runCommand = function(cmd, callback) {
-    var params = {cmd: cmd.name()};
-
-    for (var p of cmd._params) {
-        params[p.key] = p.value;
-    }
-
-    var body = undefined;
-
-    var headers = undefined;
-
-    if (cmd._isPost()) {
-        body = cmd.postData();
-
-        headers = {'Content-Length': body.length, 'JSONObject': 'application/json'};
-    }
-
-    this._client.invokeRest("ignite", params, function(error, code, message) {
-        if (error) {
-            callback(error);
-            return
-        }
-
-        if (code !== 200) {
-            if (code === 401) {
-                callback.call(null, "Authentication failed. Status code 401.");
-            }
-            else {
-                callback.call(null, "Request failed. Status code " + code);
-            }
-
-            return;
-        }
-
-        var igniteResponse;
-
-        try {
-            igniteResponse = JSON.parse(message);
-        }
-        catch (e) {
-            callback.call(null, e, null);
-
-            return;
-        }
-
-        if (igniteResponse.successStatus) {
-            callback.call(null, igniteResponse.error, null)
-        }
-        else {
-            callback.call(null, null, igniteResponse.response);
-        }
-    }, cmd._method(), body, headers);
-};
-
-exports.AgentServer = AgentServer;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/main/js/keys/test.crt
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/keys/test.crt b/modules/web-control-center/src/main/js/keys/test.crt
deleted file mode 100644
index 50c6d5c..0000000
--- a/modules/web-control-center/src/main/js/keys/test.crt
+++ /dev/null
@@ -1,13 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIB6zCCAVQCCQDcAphbU6UcLjANBgkqhkiG9w0BAQsFADA6MRIwEAYDVQQDDAls
-b2NhbGhvc3QxJDAiBgkqhkiG9w0BCQEWFXNldmRva2ltb3ZAYXBhY2hlLm9yZzAe
-Fw0xNTA3MTQxMzAyNTNaFw0xODA2MjMxMzAyNTNaMDoxEjAQBgNVBAMMCWxvY2Fs
-aG9zdDEkMCIGCSqGSIb3DQEJARYVc2V2ZG9raW1vdkBhcGFjaGUub3JnMIGfMA0G
-CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDP/zpJrdHqCj6lPpeFF6LQtzKef6UiyBBo
-rbuOtCCgW8KMJJciluBWk2126qLt9smBN4jBpSNU3pq0r9gBMUTd/LSe7aY4D5ED
-Pjp7XsypNVKeHaHbFi7KhfHy0LYxsWiNPmmHJv4dtYOp+pGK25rkXNfyJxxjgxN6
-wo34+MnZIQIDAQABMA0GCSqGSIb3DQEBCwUAA4GBAFk9XEjcdyihws+fVmdGGUFo
-bVxI9YGH6agiNbU3WNF4B4VRzcPPW8z2mEo7eF9kgYmq/YzH4T8tgi/qkL/u8eZV
-Wmi9bg6RThLN6/hj3wVoOFKykbDQ05FFdhIJXN5UOjPmxYM97EKqg6J0W2HAb8SG
-+UekPnmAo/2HTKsLykH8
------END CERTIFICATE-----

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/main/js/keys/test.key
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/keys/test.key b/modules/web-control-center/src/main/js/keys/test.key
deleted file mode 100644
index 1b395c0..0000000
--- a/modules/web-control-center/src/main/js/keys/test.key
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,6798185330CE2EE2
-
-sOwkmD8rvjx11l09V26dJhLhl+SyPIhyeZ3TqHXrYCATKoXlzidT+uPu1jVYtrwr
-nBLA6TrIDYRrBNlEsqGZ0cSvWTIczzVW1xZKHEJo5q2vUT/W8u/Q1QQtS3P3GeKF
-dEzx496rpZqwwVw59GNbuIwyYoVvQf3iEXzfhplGmLPELYIplDFOLgNuXQyXSGx6
-rwKsCxXMLsDyrA6DCz0Odf08p2HvWk/s5Ne3DFcQlqRNtIrBVGD2O0/Fp8ZZ2I4E
-Yn2OIIWJff3HanOjLOWKdN8YAn5UleNmlEUdIHeS5qaQ68mabOxLkSef9qglV+sd
-FHTtUq0cG6t6nhxZBziexha6v1yl/xABAHHhNPOfak+HthWxRD4N9f1yFYAeTmkn
-4kwBWoSUe12XRf2pGNqhEUKN/KhDmWk85wI55i/Cu2XmNoiBFlS9BXrRYU8uVCJw
-KlxjKTDWl1opCyvxTDxJnMkt44ZT445LRePKVueGIIKSUIXNQypOE+C1I0CL0N2W
-Ts3m9nthquvLeMx92k7b8yW69BER5uac3SIlGCOJObQXsHgyk8wYiyd/zLKfjctG
-PXieaW81UKjp+GqWpvWPz3VqnKwoyUWeVOOTviurli6kYOrHuySTMqMb6hxJctw9
-grAQTT0UPiAKWcM7InLzZnRjco+v9QLLEokjVngXPba16K/CItFY16xuGlaFLW7Y
-XTc67AkL8b76HBZelMjmCsqjvSoULhuMFwTOvUMm/mSM8rMoi9asrJRLQHRMWCST
-/6RENPLzPlOMnNLBujpBbn8V3/aYzEZsHMI+6S3d27WYlTJIqpabSA==
------END RSA PRIVATE KEY-----

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/main/js/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/main/js/routes/agent.js b/modules/web-control-center/src/main/js/routes/agent.js
deleted file mode 100644
index 4646c28..0000000
--- a/modules/web-control-center/src/main/js/routes/agent.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var router = require('express').Router();
-var agentManager = require('../agents/agent-manager');
-
-var apacheIgnite = require('apache-ignite');
-var SqlFieldsQuery = apacheIgnite.SqlFieldsQuery;
-
-/* GET summary page. */
-router.post('/topology', function(req, res) {
-    var client = agentManager.getAgentManager().getOneClient();
-
-    if (!client)
-        return res.status(500).send("Client not found");
-
-    client.ignite().cluster().then(function (clusters) {
-        res.json(clusters.map(function (cluster) {
-            var caches = Object.keys(cluster._caches).map(function(key) {
-                return {"name" : key, "mode" : cluster._caches[key] }
-            });
-
-            return { nodeId: cluster._nodeId, caches: caches };
-        }));
-    }, function (err) {
-        res.send(err);
-    });
-});
-
-/* GET summary page. */
-router.post('/query', function(req, res) {
-    var client = agentManager.getAgentManager().getOneClient();
-
-    if (!client)
-        return res.status(500).send("Client not found");
-
-    // Create sql query.
-    var qry = new SqlFieldsQuery(req.body.query);
-
-    // Set page size for query.
-    qry.setPageSize(req.body.pageSize);
-
-    // Get query cursor.
-    client.ignite().cache(req.body.cacheName).query(qry).nextPage().then(function (cursor) {
-        res.json({meta: cursor.fieldsMetadata(), rows: cursor.page(), queryId: cursor.queryId()});
-    }, function (err) {
-        res.status(500).send(err);
-    });
-});
-
-/* GET summary page. */
-router.post('/next_page', function(req, res) {
-    var client = agentManager.getAgentManager().getOneClient();
-
-    if (!client)
-        return res.status(500).send("Client not found");
-
-    var cache = client.ignite().cache(req.body.cacheName);
-
-    var cmd = cache._createCommand("qryfetch").addParam("qryId", req.body.queryId).
-        addParam("psz", req.body.pageSize);
-
-    cache.__createPromise(cmd).then(function (page) {
-        res.json({rows: page["items"], last: page === null || page["last"]});
-    }, function (err) {
-        res.status(500).send(err);
-    });
-});
-
-module.exports = router;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e24f3b74/modules/web-control-center/src/test/js/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/web-control-center/src/test/js/routes/agent.js b/modules/web-control-center/src/test/js/routes/agent.js
deleted file mode 100644
index 6a7fa2c..0000000
--- a/modules/web-control-center/src/test/js/routes/agent.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var request = require('supertest'),
-    should = require('should'),
-    app = require('../../app'),
-    fs = require('fs'),
-    https = require('https'),
-    config = require('../../helpers/configuration-loader.js'),
-    agentManager = require('../../agents/agent-manager');
-
-/**
- * Create HTTP server.
- */
-/**
- * Start agent server.
- */
-var agentServer = https.createServer({
-    key: fs.readFileSync(config.get('monitor:server:key')),
-    cert: fs.readFileSync(config.get('monitor:server:cert')),
-    passphrase: config.get('monitor:server:keyPassphrase')
-});
-
-agentServer.listen(config.get('monitor:server:port'));
-
-agentManager.createManager(agentServer);
-
-describe('request from agent', function() {
-    var agent = request.agent(app);
-
-    before(function (done) {
-        this.timeout(10000);
-
-        agent
-            .post('/login')
-            .send({email: 'anovikov@gridgain.com', password: 'extHB2aXgb'})
-            .expect(302)
-            .end(function (err) {
-                if (err)
-                    throw err;
-
-                setTimeout(done, 5000);
-            });
-    });
-
-    it('should return topology snapshot', function(done){
-        agent
-            .post('/agent/topology')
-            .send({})
-            .end(function(err, nodes) {
-                if (err) {
-                    console.log(err.response.text);
-
-                    throw err;
-                }
-
-                console.log(nodes);
-
-                done();
-            });
-    });
-
-    //it('should query result', function(done){
-    //    agent
-    //        .post('/agent/query')
-    //        .send({
-    //            username: 'nva',
-    //            password: 'nva.141',
-    //            host: 'localhost',
-    //            port: '5432',
-    //            dbName: 'ggmonitor'
-    //        })
-    //        .end(function(err, res) {
-    //            if (err)
-    //                throw err;
-    //
-    //            done();
-    //        });
-    //});
-});
\ No newline at end of file