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 2016/03/28 10:47:53 UTC

[13/50] [abbrv] ignite git commit: IGNITE-843 Refactoring, jsDoc.

IGNITE-843 Refactoring, jsDoc.


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

Branch: refs/heads/ignite-2875
Commit: b30b52b1ab8f7e50252857af97e18b0c3092b782
Parents: 2651715
Author: Andrey <an...@gridgain.com>
Authored: Mon Mar 21 14:27:08 2016 +0700
Committer: Andrey <an...@gridgain.com>
Committed: Mon Mar 21 14:27:08 2016 +0700

----------------------------------------------------------------------
 .../src/main/js/app/decorator/select.js         |  25 +-
 .../control-center-web/src/main/js/app/index.js |   1 -
 .../js/app/services/AgentMonitor.service.js     |  10 +
 .../src/main/js/controllers/sql-controller.js   |   2 +-
 modules/control-center-web/src/main/js/serve.js |  12 +-
 .../src/main/js/serve/agent.js                  | 195 +++++++-------
 .../control-center-web/src/main/js/serve/app.js |   2 +-
 .../src/main/js/serve/browser.js                | 254 +++++++++++++++++++
 .../src/main/js/serve/configure.js              |   3 +
 .../control-center-web/src/main/js/serve/io.js  | 242 ------------------
 .../src/main/js/serve/mail.js                   |   3 +
 .../src/main/js/serve/mongo.js                  |   3 +
 .../src/main/js/serve/routes/agent.js           |   2 +-
 .../src/main/js/serve/routes/profile.js         |  12 +-
 .../src/main/js/serve/settings.js               |   3 +
 15 files changed, 407 insertions(+), 362 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/app/decorator/select.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/decorator/select.js b/modules/control-center-web/src/main/js/app/decorator/select.js
index f232f88..13a4041 100644
--- a/modules/control-center-web/src/main/js/app/decorator/select.js
+++ b/modules/control-center-web/src/main/js/app/decorator/select.js
@@ -31,31 +31,32 @@ angular.module('mgcrea.ngStrap.select')
 
             const scope = deligate.$scope;
 
+            const _valueMap = (index) => {
+                if (angular.isUndefined(scope.$matches[index]))
+                    return null;
+
+                return scope.$matches[index].value;
+            };
+
             const selectAll = (active) => {
-                var selected = [];
+                const selected = [];
 
-                scope.$apply(function () {
-                    for (var i = 0; i < scope.$matches.length; i++) {
+                scope.$apply(() => {
+                    for (let i = 0; i < scope.$matches.length; i++) {
                         if (scope.$isActive(i) === active) {
                             selected[i] = scope.$matches[i].value;
 
                             deligate.activate(i);
 
-                            controller.$setViewValue(scope.$activeIndex.map(function (index) {
-                                if (angular.isUndefined(scope.$matches[index])) {
-                                    return null;
-                                }
-                                return scope.$matches[index].value;
-                            }));
+                            controller.$setViewValue(scope.$activeIndex.map(_valueMap));
                         }
                     }
                 });
 
                 // Emit events.
-                for (var i = 0; i < selected.length; i++) {
-                    if (selected[i]) {
+                for (let i = 0; i < selected.length; i++) {
+                    if (selected[i])
                         scope.$emit(options.prefixEvent + '.select', selected[i], i, deligate);
-                    }
                 }
             };
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/app/index.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/index.js b/modules/control-center-web/src/main/js/app/index.js
index 1537eb9..60a3a8b 100644
--- a/modules/control-center-web/src/main/js/app/index.js
+++ b/modules/control-center-web/src/main/js/app/index.js
@@ -20,7 +20,6 @@ import _ from 'lodash';
 import ace from 'ace';
 import angular from 'angular';
 import pdfMake from 'pdfmake';
-import io from 'socket.io-client';
 
 window._ = _;
 window.ace = ace;

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/app/services/AgentMonitor.service.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/services/AgentMonitor.service.js b/modules/control-center-web/src/main/js/app/services/AgentMonitor.service.js
index cf66b61..1b661a3 100644
--- a/modules/control-center-web/src/main/js/app/services/AgentMonitor.service.js
+++ b/modules/control-center-web/src/main/js/app/services/AgentMonitor.service.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import io from 'socket.io-client';
+
 class IgniteAgentMonitor {
     constructor(socketFactory, $root, $q, $state, $modal, $common) {
         this._scope = $root.$new();
@@ -257,6 +259,14 @@ class IgniteAgentMonitor {
     }
 
     /**
+     * @param {Object} args
+     * @returns {Promise}
+     */
+    queryGetAll(args) {
+        return this._rest('node:query:getAll', args);
+    }
+
+    /**
      * @param {Boolean} demo
      * @returns {Promise}
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/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 dd712f8..35c0126 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
@@ -902,7 +902,7 @@ consoleModule.controller('sqlController', [
         };
 
         $scope.exportCsvAll = function (paragraph) {
-            IgniteAgentMonitor.query({
+            IgniteAgentMonitor.queryGetAll({
                     demo: $scope.demo,
                     type: paragraph.queryArgs.type,
                     query: paragraph.queryArgs.query,

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve.js b/modules/control-center-web/src/main/js/serve.js
index 74342a9..cba74d3 100644
--- a/modules/control-center-web/src/main/js/serve.js
+++ b/modules/control-center-web/src/main/js/serve.js
@@ -66,12 +66,12 @@ const fireUp = require('fire-up').newInjector({
     ]
 });
 
-Promise.all([fireUp('settings'), fireUp('app'), fireUp('agent'), fireUp('io')])
+Promise.all([fireUp('settings'), fireUp('app'), fireUp('agent-manager'), fireUp('browser-manager')])
     .then((values) => {
         const settings = values[0];
         const app = values[1];
-        const agent = values[2];
-        const io = values[3];
+        const agentMgr = values[2];
+        const browserMgr = values[3];
 
         // Start rest server.
         const server = settings.server.SSLOptions
@@ -82,7 +82,7 @@ Promise.all([fireUp('settings'), fireUp('app'), fireUp('agent'), fireUp('io')])
         server.on('listening', _onListening.bind(null, server.address()));
 
         app.listen(server);
-        io.listen(server);
+        browserMgr.attach(server);
 
         // Start agent server.
         const agentServer = settings.agent.SSLOptions
@@ -92,13 +92,13 @@ Promise.all([fireUp('settings'), fireUp('app'), fireUp('agent'), fireUp('io')])
         agentServer.on('error', _onError.bind(null, settings.agent.port));
         agentServer.on('listening', _onListening.bind(null, agentServer.address()));
 
-        agent.listen(agentServer);
+        agentMgr.attach(agentServer);
 
         // Used for automated test.
         if (process.send)
             process.send('running');
     }).catch((err) => {
-        console.error(error);
+        console.error(err);
 
         process.exit(1);
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/agent.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/agent.js b/modules/control-center-web/src/main/js/serve/agent.js
index 04d7ed6..6e249f0 100644
--- a/modules/control-center-web/src/main/js/serve/agent.js
+++ b/modules/control-center-web/src/main/js/serve/agent.js
@@ -19,8 +19,11 @@
 
 // Fire me up!
 
+/**
+ * Module interaction with agents.
+ */
 module.exports = {
-    implements: 'agent',
+    implements: 'agent-manager',
     inject: ['require(lodash)', 'require(fs)', 'require(path)', 'require(jszip)', 'require(socket.io)', 'require(apache-ignite)', 'settings', 'mongo']
 };
 
@@ -81,34 +84,44 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
         }
     }
 
+    /**
+     * Connected agent descriptor.
+     */
     class Agent {
         /**
-         * @param {socketIo.Socket} _wsSrv
-         * @param {AgentManager} manager
+         * @param {socketIo.Socket} socket - Agent socket for interaction.
          */
-        constructor(_wsSrv, manager) {
-            const self = this;
-
-            this._manager = manager;
-
+        constructor(socket) {
             /**
+             * Agent socket for interaction.
+             *
              * @type {socketIo.Socket}
              * @private
              */
-            this._wsAgents = _wsSrv;
+            this._socket = socket;
 
-            this._wsAgents.on('disconnect', () => {
-                if (self._user)
-                    self._manager._removeAgent(self._user._id, self);
-            });
+            /**
+             * Executor for grid.
+             *
+             * @type {apacheIgnite.Ignite}
+             * @private
+             */
+            this._cluster = new apacheIgnite.Ignite(new AgentServer(this));
 
-            this._wsAgents.on('agent:auth', (msg, cb) => self._processAuth(msg, cb));
+            /**
+             * Executor for demo node.
+             *
+             * @type {apacheIgnite.Ignite}
+             * @private
+             */
+            this._demo = new apacheIgnite.Ignite(new AgentServer(this, true));
         }
 
         /**
+         * Send message to agent.
          *
-         * @param event
-         * @param data
+         * @param {String} event - Event name.
+         * @param {Object} data - Transmitted data.
          * @returns {Promise}
          */
         _exec(event, data) {
@@ -125,12 +138,33 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
         }
 
         /**
-         * @param {String} uri
-         * @param {Object} params
-         * @param {Boolean} demo
-         * @param {String} [method]
-         * @param {Object} [headers]
-         * @param {String} [body]
+         * Send message to agent.
+         *
+         * @this {Agent}
+         * @param {String} event Command name.
+         * @param {Object} data Command params.
+         * @param {Function} [callback] on finish
+         */
+        _emit(event, data, callback) {
+            if (!this._socket.connected) {
+                if (callback)
+                    callback('org.apache.ignite.agent.AgentException: Connection is closed');
+
+                return;
+            }
+
+            this._socket.emit(event, data, callback);
+        }
+
+        /**
+         * Execute rest request on node.
+         *
+         * @param {String} uri - REST endpoint uri.
+         * @param {Object} params - REST request parameters.
+         * @param {Boolean} demo - true if execute on demo node.
+         * @param {String} [method] - Request method GET or POST.
+         * @param {Object} [headers] - REST request headers.
+         * @param {String} [body] - REST request body
          * @param {Function} [cb] Callback. Take 3 arguments: {Number} successStatus, {String} error,  {String} response.
          */
         executeRest(uri, params, demo, method, headers, body, cb) {
@@ -223,90 +257,38 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
         }
 
         /**
-         * Run http request
-         *
-         * @this {Agent}
-         * @param {String} event Command name.
-         * @param {Object} data Command params.
-         * @param {Function} [callback] on finish
-         */
-        _emit(event, data, callback) {
-            if (!this._wsAgents.connected) {
-                if (callback)
-                    callback('org.apache.ignite.agent.AgentException: Connection is closed');
-
-                return;
-            }
-
-            this._wsAgents.emit(event, data, callback);
-        }
-
-        /**
-         * Process auth request.
-         *
-         * @param {Object} data
-         * @param {Function} cb
-         * @private
-         */
-        _processAuth(data, cb) {
-            const self = this;
-
-            if (!_.isEmpty(this._manager.supportedAgents)) {
-                const ver = data.ver;
-                const bt = data.bt;
-
-                if (_.isEmpty(ver) || _.isEmpty(bt) || _.isEmpty(this._manager.supportedAgents[ver]) ||
-                    this._manager.supportedAgents[ver].buildTime > bt)
-                    return cb('You are using an older version of the agent. Please reload agent archive');
-            }
-
-            mongo.Account.findOne({token: data.token}, (err, account) => {
-                // TODO IGNITE-1379 send error to web master.
-                if (err)
-                    cb('Failed to authorize user');
-                else if (!account)
-                    cb('Invalid token, user not found');
-                else {
-                    self._user = account;
-
-                    self._manager._addAgent(account._id, self);
-
-                    self._cluster = new apacheIgnite.Ignite(new AgentServer(self));
-
-                    self._demo = new apacheIgnite.Ignite(new AgentServer(self, true));
-
-                    cb();
-                }
-            });
-        }
-
-        /**
-         * @returns {Ignite}
+         * @returns {apacheIgnite.Ignite}
          */
         ignite(demo) {
             return demo ? this._demo : this._cluster;
         }
     }
 
+    /**
+     * Connected agents manager.
+     */
     class AgentManager {
         /**
          * @constructor
          */
         constructor() {
             /**
+             * Connected agents by user id.
              * @type {Object.<ObjectId, Array.<Agent>>}
              */
             this._agents = {};
 
             /**
+             * Connected browsers by user id.
              * @type {Object.<ObjectId, Array.<Socket>>}
              */
-            this._users = {};
+            this._browsers = {};
 
             const agentArchives = fs.readdirSync(settings.agent.dists)
                 .filter((file) => path.extname(file) === '.zip');
 
             /**
+             * Supported agents distribution.
              * @type {Object.<String, String>}
              */
             this.supportedAgents = {};
@@ -360,14 +342,15 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
                 }
             }));
 
+            // Latest version of agent distribution.
             if (latest)
                 this.supportedAgents.latest = this.supportedAgents[latest];
         }
 
         /**
-         * @param {http.Server|https.Server} srv
+         * @param {http.Server|https.Server} srv Server instance that we want to attach agent handler.
          */
-        listen(srv) {
+        attach(srv) {
             if (this._server)
                 throw 'Agent server already started!';
 
@@ -376,11 +359,39 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
             /**
              * @type {WebSocketServer}
              */
-            this._wsAgents = socketio(this._server);
+            this._socket = socketio(this._server);
 
-            const self = this;
+            this._socket.on('connection', (socket) => {
+                socket.on('agent:auth', (data, cb) => {
+                    if (!_.isEmpty(this.supportedAgents)) {
+                        const ver = data.ver;
+                        const bt = data.bt;
+
+                        if (_.isEmpty(ver) || _.isEmpty(bt) || _.isEmpty(this.supportedAgents[ver]) ||
+                            this.supportedAgents[ver].buildTime > bt)
+                            return cb('You are using an older version of the agent. Please reload agent archive');
+                    }
 
-            this._wsAgents.on('connection', (_wsSrv) => new Agent(_wsSrv, self));
+                    mongo.Account.findOne({token: data.token}, (err, account) => {
+                        // TODO IGNITE-1379 send error to web master.
+                        if (err)
+                            cb('Failed to authorize user');
+                        else if (!account)
+                            cb('Invalid token, user not found');
+                        else {
+                            const agent = new Agent(socket);
+
+                            socket.on('disconnect', () => {
+                                this._removeAgent(account._id, agent);
+                            });
+
+                            this._addAgent(account._id, agent);
+
+                            cb();
+                        }
+                    });
+                });
+            });
         }
 
         /**
@@ -389,10 +400,10 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
          * @returns {int} connected agent count.
          */
         addAgentListener(userId, user) {
-            let users = this._users[userId];
+            let users = this._browsers[userId];
 
             if (!users)
-                this._users[userId] = users = [];
+                this._browsers[userId] = users = [];
 
             users.push(user);
 
@@ -407,7 +418,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
          * @returns {int} connected agent count.
          */
         removeAgentListener(userId, user) {
-            const users = this._users[userId];
+            const users = this._browsers[userId];
 
             _.remove(users, (_user) => _user === user);
         }
@@ -453,7 +464,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
 
             _.remove(agents, (_agent) => _agent === agent);
 
-            const users = this._users[userId];
+            const users = this._browsers[userId];
 
             _.forEach(users, (user) => user.emit('agent:count', {count: agents.length}));
         }
@@ -470,7 +481,7 @@ module.exports.factory = function(_, fs, path, JSZip, socketio, apacheIgnite, se
 
             agents.push(agent);
 
-            const users = this._users[userId];
+            const users = this._browsers[userId];
 
             _.forEach(users, (user) => user.emit('agent:count', {count: agents.length}));
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/app.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/app.js b/modules/control-center-web/src/main/js/serve/app.js
index e4b5eca..5d6b2cf 100644
--- a/modules/control-center-web/src/main/js/serve/app.js
+++ b/modules/control-center-web/src/main/js/serve/app.js
@@ -21,7 +21,7 @@
 
 module.exports = {
     implements: 'app',
-    inject: ['require(express)', 'configure', 'routes', 'io']
+    inject: ['require(express)', 'configure', 'routes']
 };
 
 module.exports.factory = function(Express, configure, routes) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/browser.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/browser.js b/modules/control-center-web/src/main/js/serve/browser.js
new file mode 100644
index 0000000..4470ce2
--- /dev/null
+++ b/modules/control-center-web/src/main/js/serve/browser.js
@@ -0,0 +1,254 @@
+/*
+ * 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.
+ */
+
+'use strict';
+
+// Fire me up!
+
+/**
+ * Module interaction with browsers.
+ */
+module.exports = {
+    implements: 'browser-manager',
+    inject: ['require(lodash)', 'require(socket.io)', 'require(apache-ignite)', 'agent-manager', 'configure']
+};
+
+module.exports.factory = (_, socketio, apacheIgnite, agentMgr, configure) => {
+    const SqlFieldsQuery = apacheIgnite.SqlFieldsQuery;
+    const ScanQuery = apacheIgnite.ScanQuery;
+
+    return {
+        attach: (server) => {
+            const io = socketio(server);
+
+            configure.socketio(io);
+
+            io.sockets.on('connection', (socket) => {
+                const user = socket.client.request.user;
+
+                // Return available drivers to browser.
+                socket.on('schemaImport:drivers', (cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => agent.availableDrivers())
+                        .then((drivers) => cb(null, drivers))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Return schemas from database to browser.
+                socket.on('schemaImport:schemas', (preset, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            const jdbcInfo = {user: preset.user, password: preset.password};
+
+                            return agent.metadataSchemas(preset.jdbcDriverJar, preset.jdbcDriverClass, preset.jdbcUrl, jdbcInfo);
+                        })
+                        .then((schemas) => cb(null, schemas))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Return tables from database to browser.
+                socket.on('schemaImport:tables', (preset, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            const jdbcInfo = {user: preset.user, password: preset.password};
+
+                            return agent.metadataTables(preset.jdbcDriverJar, preset.jdbcDriverClass, preset.jdbcUrl, jdbcInfo,
+                                preset.schemas, preset.tablesOnly);
+                        })
+                        .then((tables) => cb(null, tables))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Return topology command result from grid to browser.
+                socket.on('node:topology', (demo, attr, mtr, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => agent.ignite(demo).cluster(attr, mtr))
+                        .then((clusters) => cb(null, clusters))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Close query on node.
+                socket.on('node:query:close', (args, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            const cache = agent.ignite(args.demo).cache(args.cacheName);
+
+                            return cache.__createPromise(cache._createCommand('qrycls').addParam('qryId', args.queryId));
+                        })
+                        .then(() => cb())
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Execute query on node and return first page to browser.
+                socket.on('node:query', (args, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            // Create sql query.
+                            const qry = args.type === 'SCAN' ? new ScanQuery() : new SqlFieldsQuery(args.query);
+
+                            // Set page size for query.
+                            qry.setPageSize(args.pageSize);
+
+                            return agent.ignite(args.demo).cache(args.cacheName).query(qry).nextPage();
+                        })
+                        .then((cursor) => cb(null, {
+                            meta: cursor.fieldsMetadata(),
+                            rows: cursor.page(),
+                            queryId: cursor.queryId()
+                        }))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Fetch next page for query and return result to browser.
+                socket.on('node:query:fetch', (args, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            const cache = agent.ignite(args.demo).cache(args.cacheName);
+
+                            const cmd = cache._createCommand('qryfetch')
+                                .addParam('qryId', args.queryId)
+                                .addParam('pageSize', args.pageSize);
+
+                            return cache.__createPromise(cmd);
+                        })
+                        .then((page) => cb(null, {
+                            rows: page.items,
+                            last: page === null || page.last
+                        }))
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Execute query on node and return full result to browser.
+                socket.on('node:query:getAll', (args, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => {
+                            // Create sql query.
+                            const qry = args.type === 'SCAN' ? new ScanQuery() : new SqlFieldsQuery(args.query);
+
+                            // Set page size for query.
+                            qry.setPageSize(1024);
+
+                            const cursor = agent.ignite(args.demo).cache(args.cacheName).query(qry);
+
+                            return cursor.getAll()
+                                .then((rows) => cb(null, {meta: cursor.fieldsMetadata(), rows}));
+                        })
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                // Return cache metadata from all nodes in grid.
+                socket.on('node:cache:metadata', (args, cb) => {
+                    agentMgr.findAgent(user._id)
+                        .then((agent) => agent.ignite(args.demo).cache(args.cacheName).metadata())
+                        .then((caches) => {
+                            let types = [];
+
+                            const _compact = (className) => {
+                                return className.replace('java.lang.', '').replace('java.util.', '').replace('java.sql.', '');
+                            };
+
+                            const _typeMapper = (meta, typeName) => {
+                                let fields = meta.fields[typeName];
+
+                                let columns = [];
+
+                                for (const fieldName in fields) {
+                                    if (fields.hasOwnProperty(fieldName)) {
+                                        const fieldClass = _compact(fields[fieldName]);
+
+                                        columns.push({
+                                            type: 'field',
+                                            name: fieldName,
+                                            clazz: fieldClass,
+                                            system: fieldName === '_KEY' || fieldName === '_VAL',
+                                            cacheName: meta.cacheName,
+                                            typeName
+                                        });
+                                    }
+                                }
+
+                                const indexes = [];
+
+                                for (const index of meta.indexes[typeName]) {
+                                    fields = [];
+
+                                    for (const field of index.fields) {
+                                        fields.push({
+                                            type: 'index-field',
+                                            name: field,
+                                            order: index.descendings.indexOf(field) < 0,
+                                            unique: index.unique,
+                                            cacheName: meta.cacheName,
+                                            typeName
+                                        });
+                                    }
+
+                                    if (fields.length > 0) {
+                                        indexes.push({
+                                            type: 'index',
+                                            name: index.name,
+                                            children: fields,
+                                            cacheName: meta.cacheName,
+                                            typeName
+                                        });
+                                    }
+                                }
+
+                                columns = _.sortBy(columns, 'name');
+
+                                if (!_.isEmpty(indexes)) {
+                                    columns = columns.concat({
+                                        type: 'indexes',
+                                        name: 'Indexes',
+                                        cacheName: meta.cacheName,
+                                        typeName,
+                                        children: indexes
+                                    });
+                                }
+
+                                return {
+                                    type: 'type',
+                                    cacheName: meta.cacheName || '',
+                                    typeName,
+                                    children: columns
+                                };
+                            };
+
+                            for (const meta of caches) {
+                                const cacheTypes = meta.types.map(_typeMapper.bind(null, meta));
+
+                                if (!_.isEmpty(cacheTypes))
+                                    types = types.concat(cacheTypes);
+                            }
+
+                            return cb(null, types);
+                        })
+                        .catch((errMsg) => cb(errMsg));
+                });
+
+                const count = agentMgr.addAgentListener(user._id, socket);
+
+                socket.emit('agent:count', {count});
+            });
+
+            // Handle browser disconnect event.
+            io.sockets.on('disconnect', (socket) =>
+                agentMgr.removeAgentListener(socket.client.request.user._id, socket)
+            );
+        }
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/configure.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/configure.js b/modules/control-center-web/src/main/js/serve/configure.js
index ac27751..71f7c8a 100644
--- a/modules/control-center-web/src/main/js/serve/configure.js
+++ b/modules/control-center-web/src/main/js/serve/configure.js
@@ -19,6 +19,9 @@
 
 // Fire me up!
 
+/**
+ * Module for configuration express and websocket server.
+ */
 module.exports = {
     implements: 'configure',
     inject: ['require(morgan)', 'require(cookie-parser)', 'require(body-parser)',

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/io.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/io.js b/modules/control-center-web/src/main/js/serve/io.js
deleted file mode 100644
index ded00fa..0000000
--- a/modules/control-center-web/src/main/js/serve/io.js
+++ /dev/null
@@ -1,242 +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.
- */
-
-'use strict';
-
-// Fire me up!
-
-module.exports = {
-    implements: 'io',
-    inject: ['require(lodash)', 'require(socket.io)', 'require(apache-ignite)', 'agent', 'configure']
-};
-
-module.exports.factory = (_, socketio, apacheIgnite, agentMgr, configure) => {
-    const SqlFieldsQuery = apacheIgnite.SqlFieldsQuery;
-    const ScanQuery = apacheIgnite.ScanQuery;
-
-    return {
-        listen: (server) => {
-            const io = socketio(server);
-
-            configure.socketio(io);
-
-            io.sockets.on('connection', (socket) => {
-                const user = socket.client.request.user;
-
-                socket.on('schemaImport:drivers', (cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => agent.availableDrivers())
-                        .then((drivers) => cb(null, drivers))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('schemaImport:schemas', (preset, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            const jdbcInfo = {user: preset.user, password: preset.password};
-
-                            return agent.metadataSchemas(preset.jdbcDriverJar, preset.jdbcDriverClass, preset.jdbcUrl, jdbcInfo);
-                        })
-                        .then((schemas) => cb(null, schemas))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('schemaImport:tables', (preset, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            const jdbcInfo = {user: preset.user, password: preset.password};
-
-                            return agent.metadataTables(preset.jdbcDriverJar, preset.jdbcDriverClass, preset.jdbcUrl, jdbcInfo,
-                                preset.schemas, preset.tablesOnly);
-                        })
-                        .then((tables) => cb(null, tables))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:topology', (demo, attr, mtr, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => agent.ignite(demo).cluster(attr, mtr))
-                        .then((clusters) => cb(null, clusters))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:query:close', (args, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            const cache = agent.ignite(args.demo).cache(args.cacheName);
-
-                            return cache.__createPromise(cache._createCommand('qrycls').addParam('qryId', args.queryId));
-                        })
-                        .then(() => cb())
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:query', (args, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            // Create sql query.
-                            const qry = args.type === 'SCAN' ? new ScanQuery() : new SqlFieldsQuery(args.query);
-
-                            // Set page size for query.
-                            qry.setPageSize(args.pageSize);
-
-                            return agent.ignite(args.demo).cache(args.cacheName).query(qry).nextPage();
-                        })
-                        .then((cursor) => cb(null, {
-                            meta: cursor.fieldsMetadata(),
-                            rows: cursor.page(),
-                            queryId: cursor.queryId()
-                        }))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:query:fetch', (args, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            const cache = agent.ignite(args.demo).cache(args.cacheName);
-
-                            const cmd = cache._createCommand('qryfetch')
-                                .addParam('qryId', args.queryId)
-                                .addParam('pageSize', args.pageSize);
-
-                            return cache.__createPromise(cmd);
-                        })
-                        .then((page) => cb(null, {
-                            rows: page.items,
-                            last: page === null || page.last
-                        }))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:query:getAll', (args, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => {
-                            // Create sql query.
-                            const qry = args.type === 'SCAN' ? new ScanQuery() : new SqlFieldsQuery(args.query);
-
-                            // Set page size for query.
-                            qry.setPageSize(args.pageSize);
-
-                            return agent.ignite(args.demo).cache(args.cacheName).query(qry).getAll();
-                        })
-                        .then((cursor) => cb(null, {
-                            meta: cursor.fieldsMetadata(),
-                            rows: cursor.page()
-                        }))
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                socket.on('node:cache:metadata', (args, cb) => {
-                    agentMgr.findAgent(user._id)
-                        .then((agent) => agent.ignite(args.demo).cache(args.cacheName).metadata())
-                        .then((caches) => {
-                            let types = [];
-
-                            const _compact = (className) => {
-                                return className.replace('java.lang.', '').replace('java.util.', '').replace('java.sql.', '');
-                            };
-
-                            const _typeMapper = (meta, typeName) => {
-                                let fields = meta.fields[typeName];
-
-                                let columns = [];
-
-                                for (const fieldName in fields) {
-                                    if (fields.hasOwnProperty(fieldName)) {
-                                        const fieldClass = _compact(fields[fieldName]);
-
-                                        columns.push({
-                                            type: 'field',
-                                            name: fieldName,
-                                            clazz: fieldClass,
-                                            system: fieldName === '_KEY' || fieldName === '_VAL',
-                                            cacheName: meta.cacheName,
-                                            typeName
-                                        });
-                                    }
-                                }
-
-                                const indexes = [];
-
-                                for (const index of meta.indexes[typeName]) {
-                                    fields = [];
-
-                                    for (const field of index.fields) {
-                                        fields.push({
-                                            type: 'index-field',
-                                            name: field,
-                                            order: index.descendings.indexOf(field) < 0,
-                                            unique: index.unique,
-                                            cacheName: meta.cacheName,
-                                            typeName
-                                        });
-                                    }
-
-                                    if (fields.length > 0) {
-                                        indexes.push({
-                                            type: 'index',
-                                            name: index.name,
-                                            children: fields,
-                                            cacheName: meta.cacheName,
-                                            typeName
-                                        });
-                                    }
-                                }
-
-                                columns = _.sortBy(columns, 'name');
-
-                                if (!_.isEmpty(indexes)) {
-                                    columns = columns.concat({
-                                        type: 'indexes',
-                                        name: 'Indexes',
-                                        cacheName: meta.cacheName,
-                                        typeName,
-                                        children: indexes
-                                    });
-                                }
-
-                                return {
-                                    type: 'type',
-                                    cacheName: meta.cacheName || '',
-                                    typeName,
-                                    children: columns
-                                };
-                            };
-
-                            for (const meta of caches) {
-                                const cacheTypes = meta.types.map(_typeMapper.bind(null, meta));
-
-                                if (!_.isEmpty(cacheTypes))
-                                    types = types.concat(cacheTypes);
-                            }
-
-                            return cb(null, types);
-                        })
-                        .catch((errMsg) => cb(errMsg));
-                });
-
-                const count = agentMgr.addAgentListener(user._id, socket);
-
-                socket.emit('agent:count', {count});
-            });
-
-            io.sockets.on('disconnect', (socket) =>
-                agentMgr.removeAgentListener(socket.client.request.user._id, socket)
-            );
-        }
-    };
-};

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/mail.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/mail.js b/modules/control-center-web/src/main/js/serve/mail.js
index 36b4fa7..2c67276 100644
--- a/modules/control-center-web/src/main/js/serve/mail.js
+++ b/modules/control-center-web/src/main/js/serve/mail.js
@@ -19,6 +19,9 @@
 
 // Fire me up!
 
+/**
+ * Module for send email.
+ */
 module.exports = {
     implements: 'mail',
     inject: ['require(nodemailer)', 'settings']

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/mongo.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/mongo.js b/modules/control-center-web/src/main/js/serve/mongo.js
index 6a80b7a..67f2cba 100644
--- a/modules/control-center-web/src/main/js/serve/mongo.js
+++ b/modules/control-center-web/src/main/js/serve/mongo.js
@@ -19,6 +19,9 @@
 
 // Fire me up!
 
+/**
+ * Module mongo schema.
+ */
 module.exports = {
     implements: 'mongo',
     inject: ['require(mongoose-deep-populate)', 'require(passport-local-mongoose)', 'settings', 'ignite_modules/mongo:*']

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/routes/agent.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/routes/agent.js b/modules/control-center-web/src/main/js/serve/routes/agent.js
index 4e123bf..1d46170 100644
--- a/modules/control-center-web/src/main/js/serve/routes/agent.js
+++ b/modules/control-center-web/src/main/js/serve/routes/agent.js
@@ -21,7 +21,7 @@
 
 module.exports = {
     implements: 'agent-routes',
-    inject: ['require(lodash)', 'require(express)', 'require(fs)', 'require(jszip)', 'require(apache-ignite)', 'settings', 'agent']
+    inject: ['require(lodash)', 'require(express)', 'require(fs)', 'require(jszip)', 'require(apache-ignite)', 'settings', 'agent-manager']
 };
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/routes/profile.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/routes/profile.js b/modules/control-center-web/src/main/js/serve/routes/profile.js
index 9d24239..13ad045 100644
--- a/modules/control-center-web/src/main/js/serve/routes/profile.js
+++ b/modules/control-center-web/src/main/js/serve/routes/profile.js
@@ -21,18 +21,18 @@
 
 module.exports = {
     implements: 'profile-routes',
-    inject: ['require(lodash)', 'require(express)', 'mongo', 'agent']
+    inject: ['require(lodash)', 'require(express)', 'mongo', 'agent-manager']
 };
 
 /**
  *
- * @param _
- * @param express
+ * @param _ Lodash module
+ * @param express Express module
  * @param mongo
- * @param {AgentManager} agent
+ * @param {AgentManager} agentMgr
  * @returns {Promise}
  */
-module.exports.factory = function(_, express, mongo, agent) {
+module.exports.factory = function(_, express, mongo, agentMgr) {
     return new Promise((resolveFactory) => {
         const router = new express.Router();
 
@@ -80,7 +80,7 @@ module.exports.factory = function(_, express, mongo, agent) {
                 })
                 .then((user) => {
                     if (!params.token || user.token !== params.token)
-                        agent.close(user._id);
+                        agentMgr.close(user._id);
 
                     for (const param in params) {
                         if (params.hasOwnProperty(param))

http://git-wip-us.apache.org/repos/asf/ignite/blob/b30b52b1/modules/control-center-web/src/main/js/serve/settings.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/settings.js b/modules/control-center-web/src/main/js/serve/settings.js
index eada7f7..b8a3c71 100644
--- a/modules/control-center-web/src/main/js/serve/settings.js
+++ b/modules/control-center-web/src/main/js/serve/settings.js
@@ -19,6 +19,9 @@
 
 // Fire me up!
 
+/**
+ * Module with server-side configuration.
+ */
 module.exports = {
     implements: 'settings',
     inject: ['require(nconf)', 'require(fs)']