Repository: incubator-ignite Updated Branches: refs/heads/ignite-843 3e44bf56d -> 9005bd11a
IGNITE-843: WIP on persistence UI. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/9005bd11 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/9005bd11 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/9005bd11 Branch: refs/heads/ignite-843 Commit: 9005bd11a52e6991f5d252fb980d92f3b753c3c9 Parents: 3e44bf5 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Thu Jun 25 02:05:12 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Thu Jun 25 02:05:12 2015 +0700 ---------------------------------------------------------------------- modules/webconfig/nodejs/db.js | 44 +++++++++- .../nodejs/public/form-models/persistence.json | 20 ++++- .../javascripts/controllers/persistence.js | 17 +++- modules/webconfig/nodejs/routes/persistence.js | 91 ++++++++++++++++++++ .../nodejs/views/includes/controls.jade | 7 ++ modules/webconfig/nodejs/views/persistence.jade | 14 ++- 6 files changed, 181 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/db.js ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/db.js b/modules/webconfig/nodejs/db.js index c1a618d..1a2a5e7 100644 --- a/modules/webconfig/nodejs/db.js +++ b/modules/webconfig/nodejs/db.js @@ -97,10 +97,16 @@ var CacheSchema = new Schema({ rebalanceThrottle: Number, store: { - kind: {type: String, enum: ['CacheJdbcPojoStoreFactory', 'CacheJdbcBlobStoreFactory', 'CacheHibernateBlobStoreFactory']}, + kind: { + type: String, + enum: ['CacheJdbcPojoStoreFactory', 'CacheJdbcBlobStoreFactory', 'CacheHibernateBlobStoreFactory'] + }, CacheJdbcPojoStoreFactory: { dataSourceBean: String, - dialect: {type: String, enum: ['BasicJdbcDialect', 'OracleDialect', 'DB2Dialect', 'SQLServerDialect', 'MySQLDialect', 'H2Dialect']} + dialect: { + type: String, + enum: ['BasicJdbcDialect', 'OracleDialect', 'DB2Dialect', 'SQLServerDialect', 'MySQLDialect', 'H2Dialect'] + } }, CacheJdbcBlobStoreFactory: { user: String, @@ -151,6 +157,7 @@ exports.Cache = mongoose.model('Cache', CacheSchema); // Define discovery model. exports.Discovery = mongoose.model('Discovery', new Schema(DiscoveryObj)); +// Define cluster schema. var ClusterSchema = new Schema({ space: {type: ObjectId, ref: 'Space'}, name: String, @@ -206,7 +213,8 @@ var ClusterSchema = new Schema({ 'EVTS_CACHE_QUERY', 'EVTS_SWAPSPACE', 'EVTS_IGFS'] }], managementThreadPoolSize: Number, - marshaller: {kind: {type: String, enum: ['OptimizedMarshaller', 'JdkMarshaller']}, + marshaller: { + kind: {type: String, enum: ['OptimizedMarshaller', 'JdkMarshaller']}, OptimizedMarshaller: { poolSize: Number, requireSerializable: Boolean @@ -231,7 +239,8 @@ var ClusterSchema = new Schema({ segmentationPolicy: {type: String, enum: ['RESTART_JVM', 'STOP', 'NOOP']}, allSegmentationResolversPassRequired: Boolean, segmentationResolveAttempts: Number, - swapSpaceSpi: {kind: {type: String, enum: ['FileSwapSpaceSpi']}, + swapSpaceSpi: { + kind: {type: String, enum: ['FileSwapSpaceSpi']}, FileSwapSpaceSpi: { baseDirectory: String, readStripesNumber: Number, @@ -259,6 +268,33 @@ var ClusterSchema = new Schema({ // Define cluster model. exports.Cluster = mongoose.model('Cluster', ClusterSchema); +// Define persistence schema. +var PersistenceSchema = new Schema({ + space: {type: ObjectId, ref: 'Space'}, + name: String, + database: {type: String, enum: ['oracle', 'db2', 'mssql', 'postgre', 'mysql', 'h2']}, + user: String, + tables: [{ + use: Boolean, + schemaName: String, + tableName: String, + keyClass: String, + valueClass: String, + columns: [{ + use: Boolean, + pk: Boolean, + ak: Boolean, + dbName: String, + dbType: Number, + javaName: String, + javaType: String + }] + }] +}); + +// Define persistence model. +exports.Persistence = mongoose.model('Persistence', PersistenceSchema); + exports.upsert = function (model, data, cb) { if (data._id) { var id = data._id; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/public/form-models/persistence.json ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/public/form-models/persistence.json b/modules/webconfig/nodejs/public/form-models/persistence.json index ab421b5..515aa6c 100644 --- a/modules/webconfig/nodejs/public/form-models/persistence.json +++ b/modules/webconfig/nodejs/public/form-models/persistence.json @@ -1,5 +1,5 @@ { - "general": [ + "connection": [ { "label": "Database", "type": "dropdown", @@ -9,6 +9,24 @@ "tip": [ "Select database to connect and generate cache type metadata" ] + }, + { + "label": "User", + "type": "text", + "model": "user", + "placeholder": "", + "tip": [ + "User name for connecting to database" + ] + }, + { + "label": "Password", + "type": "password", + "model": "user", + "placeholder": "", + "tip": [ + "User name for connecting to database" + ] } ] } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/public/javascripts/controllers/persistence.js ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/public/javascripts/controllers/persistence.js b/modules/webconfig/nodejs/public/javascripts/controllers/persistence.js index 6f24528..88b4d31 100644 --- a/modules/webconfig/nodejs/public/javascripts/controllers/persistence.js +++ b/modules/webconfig/nodejs/public/javascripts/controllers/persistence.js @@ -17,18 +17,27 @@ configuratorModule.controller('persistenceController', ['$scope', '$alert', '$http', function ($scope, $alert, $http) { $scope.databases = [ - {value: 'oracle', label: 'Oracle'}, + {value: 'oracle', label: 'Oracle database'}, {value: 'db2', label: 'IBM DB2'}, {value: 'mssql', label: 'MS SQL Server'}, {value: 'postgre', label: 'PostgreSQL'}, - {value: 'mysql', label: 'MySQL'} + {value: 'mysql', label: 'MySQL'}, + {value: 'h2', label: 'H2 database'} ]; - $scope.general = []; + $scope.connection = []; + + $scope.persistences = []; $http.get('/form-models/persistence.json') .success(function (data) { - $scope.general = data.general; + $scope.connection = data.connection; }); + + // Add new persistence. + $scope.createItem = function() { + $scope.backupItem = {database: oracle}; + $scope.backupItem.space = $scope.spaces[0]._id; + }; }] ); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/routes/persistence.js ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/routes/persistence.js b/modules/webconfig/nodejs/routes/persistence.js new file mode 100644 index 0000000..3163fdd --- /dev/null +++ b/modules/webconfig/nodejs/routes/persistence.js @@ -0,0 +1,91 @@ +/* + * 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'); + +/** + * Send spaces and persistences accessed for user account. + * + * @param req Request. + * @param res Response. + */ +function selectAll(req, res) { + var user_id = req.user._id; + + // 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 persistences for spaces. + db.Persistence.find({space: {$in: space_ids}}, function (err, persistences) { + if (err) + return res.status(500).send(err.message); + + res.json({spaces: spaces, persistences: persistences}); + }); + }); +} + +/** + * Get spaces and persistences accessed for user account. + */ +router.get('/', function(req, res) { + selectAll(req, res); +}); + +/** + * Save persistence. + */ +router.post('/save', function(req, res) { + if (req.body._id) + db.Persistence.update({_id: req.body._id}, req.body, {upsert: true}, function(err, persistence) { + if (err) + return res.status(500).send(err.message); + + res.send(req.body._id); + }); + else { + var persistence = new db.Persistence(req.body); + + persistence.save(function(err, persistence) { + if (err) + return res.status(500).send(err.message); + + res.send(persistence._id); + }); + } +}); + +/** + * Remove persistence by ._id. + */ +router.post('/remove', function(req, res) { + db.Persistence.remove(req.body, function (err) { + if (err) + return res.status(500).send(err.message); + + res.sendStatus(200); + }) +}); + +module.exports = router; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/views/includes/controls.jade ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/views/includes/controls.jade b/modules/webconfig/nodejs/views/includes/controls.jade index 6033177..e25f6dd 100644 --- a/modules/webconfig/nodejs/views/includes/controls.jade +++ b/modules/webconfig/nodejs/views/includes/controls.jade @@ -99,6 +99,13 @@ mixin form-row .input-tip input.form-control(type='text' ng-if='!group.model' ng-model='backupItem[field.model]' placeholder='{{field.placeholder}}' ng-required='field.required') input.form-control(type='text' ng-if='group.model' ng-model='backupItem[group.model][field.model]' placeholder='{{field.placeholder}}' ng-required='field.required') + div(ng-switch-when='password') + label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: + .col-sm-4 + +tipField('field.tip') + .input-tip + input.form-control(type='password' ng-if='!group.model' ng-model='backupItem[field.model]' placeholder='{{field.placeholder}}' ng-required='field.required') + input.form-control(type='password' ng-if='group.model' ng-model='backupItem[group.model][field.model]' placeholder='{{field.placeholder}}' ng-required='field.required') div(ng-switch-when='number') label(class=lblClasses ng-class='{required: field.required}') {{field.label}}: .col-sm-4 http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9005bd11/modules/webconfig/nodejs/views/persistence.jade ---------------------------------------------------------------------- diff --git a/modules/webconfig/nodejs/views/persistence.jade b/modules/webconfig/nodejs/views/persistence.jade index 74b2cec..39cdd6e 100644 --- a/modules/webconfig/nodejs/views/persistence.jade +++ b/modules/webconfig/nodejs/views/persistence.jade @@ -27,13 +27,21 @@ block content p Create and configure Ignite persistence. hr .docs-body(ng-controller='persistenceController') - form.form-horizontal(name='persistenceForm') + .links(ng-hide='persistences.length == 0') + table.col-sm-12(st-table='persistences') + tbody + tr(ng-repeat='row in persistences track by row._id') + td.col-sm-6(ng-class='{active: row._id == selectedItem._id}') + a(ng-click='selectItem(row)') {{$index + 1}}. {{row.name}}, {{row.database | displayValue:databases:'Database not set'}} + button.btn.btn-primary(ng-click='createItem()') Add + hr + form.form-horizontal(name='inputForm') div(bs-collapse data-start-collapsed='false') .panel.panel-default .panel-heading h3 - a(bs-collapse-toggle) General + a(bs-collapse-toggle) Connection .panel-collapse(bs-collapse-target) .panel-body - .settings-row(ng-repeat='field in general') + .settings-row(ng-repeat='field in connection') +form-row