IGNITE-7612 Web Console: Refactored mongoose schemas to separate module.

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

Branch: refs/heads/master
Commit: 71db7079343955a36753a88a17a38dae34a22a3b
Parents: 958975e
Author: Alexey Kuznetsov <akuznet...@apache.org>
Authored: Fri Feb 2 17:09:37 2018 +0700
Committer: Alexey Kuznetsov <akuznet...@apache.org>
Committed: Fri Feb 2 17:09:37 2018 +0700

----------------------------------------------------------------------
 modules/web-console/backend/app/mongo.js      | 1127 +------------------
 modules/web-console/backend/app/schemas.js    | 1147 ++++++++++++++++++++
 modules/web-console/backend/services/users.js |    1 +
 3 files changed, 1159 insertions(+), 1116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/71db7079/modules/web-console/backend/app/mongo.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/mongo.js 
b/modules/web-console/backend/app/mongo.js
index bd03d6a..661d6f9 100644
--- a/modules/web-console/backend/app/mongo.js
+++ b/modules/web-console/backend/app/mongo.js
@@ -17,7 +17,7 @@
 
 'use strict';
 
-const passportMongo = require('passport-local-mongoose');
+const _ = require('lodash');
 
 // Fire me up!
 
@@ -26,1130 +26,25 @@ const passportMongo = require('passport-local-mongoose');
  */
 module.exports = {
     implements: 'mongo',
-    inject: ['settings', 'mongoose']
+    inject: ['settings', 'mongoose', 'schemas']
 };
 
-const defineSchema = (mongoose) => {
-    const Schema = mongoose.Schema;
+const defineSchema = (mongoose, schemas) => {
     const ObjectId = mongoose.Schema.Types.ObjectId;
     const result = { connection: mongoose.connection };
 
     result.ObjectId = ObjectId;
 
-    // Define Account schema.
-    const AccountSchema = new Schema({
-        firstName: String,
-        lastName: String,
-        email: String,
-        phone: String,
-        company: String,
-        country: String,
-        registered: Date,
-        lastLogin: Date,
-        lastActivity: Date,
-        admin: Boolean,
-        token: String,
-        resetPasswordToken: String
-    });
-
-    // Install passport plugin.
-    AccountSchema.plugin(passportMongo, {
-        usernameField: 'email', limitAttempts: true, lastLoginField: 
'lastLogin',
-        usernameLowerCase: true
-    });
-
-    const transform = (doc, ret) => {
-        return {
-            _id: ret._id,
-            email: ret.email,
-            phone: ret.phone,
-            firstName: ret.firstName,
-            lastName: ret.lastName,
-            company: ret.company,
-            country: ret.country,
-            admin: ret.admin,
-            token: ret.token,
-            registered: ret.registered,
-            lastLogin: ret.lastLogin,
-            lastActivity: ret.lastActivity
-        };
-    };
-
-    // Configure transformation to JSON.
-    AccountSchema.set('toJSON', { transform });
-
-    // Configure transformation to JSON.
-    AccountSchema.set('toObject', { transform });
-
     result.errCodes = {
         DUPLICATE_KEY_ERROR: 11000,
         DUPLICATE_KEY_UPDATE_ERROR: 11001
     };
 
-    // Define Account model.
-    result.Account = mongoose.model('Account', AccountSchema);
-
-    // Define Space model.
-    result.Space = mongoose.model('Space', new Schema({
-        name: String,
-        owner: {type: ObjectId, ref: 'Account'},
-        demo: {type: Boolean, default: false},
-        usedBy: [{
-            permission: {type: String, enum: ['VIEW', 'FULL']},
-            account: {type: ObjectId, ref: 'Account'}
-        }]
-    }));
-
-    // Define Domain model schema.
-    const DomainModelSchema = new Schema({
-        space: {type: ObjectId, ref: 'Space', index: true, required: true},
-        caches: [{type: ObjectId, ref: 'Cache'}],
-        queryMetadata: {type: String, enum: ['Annotations', 'Configuration']},
-        kind: {type: String, enum: ['query', 'store', 'both']},
-        tableName: String,
-        keyFieldName: String,
-        valueFieldName: String,
-        databaseSchema: String,
-        databaseTable: String,
-        keyType: String,
-        valueType: {type: String},
-        keyFields: [{
-            databaseFieldName: String,
-            databaseFieldType: String,
-            javaFieldName: String,
-            javaFieldType: String
-        }],
-        valueFields: [{
-            databaseFieldName: String,
-            databaseFieldType: String,
-            javaFieldName: String,
-            javaFieldType: String
-        }],
-        queryKeyFields: [String],
-        fields: [{name: String, className: String}],
-        aliases: [{field: String, alias: String}],
-        indexes: [{
-            name: String,
-            indexType: {type: String, enum: ['SORTED', 'FULLTEXT', 
'GEOSPATIAL']},
-            fields: [{name: String, direction: Boolean}]
-        }],
-        generatePojo: Boolean
-    });
-
-    DomainModelSchema.index({valueType: 1, space: 1}, {unique: true});
-
-    // Define model of Domain models.
-    result.DomainModel = mongoose.model('DomainModel', DomainModelSchema);
-
-    // Define Cache schema.
-    const CacheSchema = new Schema({
-        space: {type: ObjectId, ref: 'Space', index: true, required: true},
-        name: {type: String},
-        groupName: {type: String},
-        clusters: [{type: ObjectId, ref: 'Cluster'}],
-        domains: [{type: ObjectId, ref: 'DomainModel'}],
-        cacheMode: {type: String, enum: ['PARTITIONED', 'REPLICATED', 
'LOCAL']},
-        atomicityMode: {type: String, enum: ['ATOMIC', 'TRANSACTIONAL']},
-        partitionLossPolicy: {type: String, enum: ['READ_ONLY_SAFE', 
'READ_ONLY_ALL', 'READ_WRITE_SAFE', 'READ_WRITE_ALL', 'IGNORE']},
-
-        affinity: {
-            kind: {type: String, enum: ['Default', 'Rendezvous', 'Fair', 
'Custom']},
-            Rendezvous: {
-                affinityBackupFilter: String,
-                partitions: Number,
-                excludeNeighbors: Boolean
-            },
-            Fair: {
-                affinityBackupFilter: String,
-                partitions: Number,
-                excludeNeighbors: Boolean
-            },
-            Custom: {
-                className: String
-            }
-        },
-
-        affinityMapper: String,
-
-        nodeFilter: {
-            kind: {type: String, enum: ['Default', 'Exclude', 'IGFS', 
'OnNodes', 'Custom']},
-            Exclude: {
-                nodeId: String
-            },
-            IGFS: {
-                igfs: {type: ObjectId, ref: 'Igfs'}
-            },
-            Custom: {
-                className: String
-            }
-        },
-
-        backups: Number,
-        memoryMode: {type: String, enum: ['ONHEAP_TIERED', 'OFFHEAP_TIERED', 
'OFFHEAP_VALUES']},
-        offHeapMaxMemory: Number,
-        startSize: Number,
-        swapEnabled: Boolean,
-
-        onheapCacheEnabled: Boolean,
-
-        evictionPolicy: {
-            kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
-            LRU: {
-                batchSize: Number,
-                maxMemorySize: Number,
-                maxSize: Number
-            },
-            FIFO: {
-                batchSize: Number,
-                maxMemorySize: Number,
-                maxSize: Number
-            },
-            SORTED: {
-                batchSize: Number,
-                maxMemorySize: Number,
-                maxSize: Number
-            }
-        },
-
-        rebalanceMode: {type: String, enum: ['SYNC', 'ASYNC', 'NONE']},
-        rebalanceBatchSize: Number,
-        rebalanceBatchesPrefetchCount: Number,
-        rebalanceOrder: Number,
-        rebalanceDelay: Number,
-        rebalanceTimeout: Number,
-        rebalanceThrottle: Number,
-
-        cacheStoreFactory: {
-            kind: {
-                type: String,
-                enum: ['CacheJdbcPojoStoreFactory', 
'CacheJdbcBlobStoreFactory', 'CacheHibernateBlobStoreFactory']
-            },
-            CacheJdbcPojoStoreFactory: {
-                dataSourceBean: String,
-                dialect: {
-                    type: String,
-                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
-                },
-                batchSize: Number,
-                maximumPoolSize: Number,
-                maximumWriteAttempts: Number,
-                parallelLoadCacheMinimumThreshold: Number,
-                hasher: String,
-                transformer: String,
-                sqlEscapeAll: Boolean
-            },
-            CacheJdbcBlobStoreFactory: {
-                connectVia: {type: String, enum: ['URL', 'DataSource']},
-                connectionUrl: String,
-                user: String,
-                dataSourceBean: String,
-                dialect: {
-                    type: String,
-                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
-                },
-                initSchema: Boolean,
-                createTableQuery: String,
-                loadQuery: String,
-                insertQuery: String,
-                updateQuery: String,
-                deleteQuery: String
-            },
-            CacheHibernateBlobStoreFactory: {
-                hibernateProperties: [{name: String, value: String}]
-            }
-        },
-        storeKeepBinary: Boolean,
-        loadPreviousValue: Boolean,
-        readThrough: Boolean,
-        writeThrough: Boolean,
-
-        writeBehindEnabled: Boolean,
-        writeBehindBatchSize: Number,
-        writeBehindFlushSize: Number,
-        writeBehindFlushFrequency: Number,
-        writeBehindFlushThreadCount: Number,
-        writeBehindCoalescing: {type: Boolean, default: true},
-
-        invalidate: Boolean,
-        defaultLockTimeout: Number,
-        atomicWriteOrderMode: {type: String, enum: ['CLOCK', 'PRIMARY']},
-        writeSynchronizationMode: {type: String, enum: ['FULL_SYNC', 
'FULL_ASYNC', 'PRIMARY_SYNC']},
-
-        sqlEscapeAll: Boolean,
-        sqlSchema: String,
-        sqlOnheapRowCacheSize: Number,
-        longQueryWarningTimeout: Number,
-        sqlFunctionClasses: [String],
-        snapshotableIndex: Boolean,
-        queryDetailMetricsSize: Number,
-        queryParallelism: Number,
-        statisticsEnabled: Boolean,
-        managementEnabled: Boolean,
-        readFromBackup: Boolean,
-        copyOnRead: Boolean,
-        maxConcurrentAsyncOperations: Number,
-        nearConfiguration: {
-            enabled: Boolean,
-            nearStartSize: Number,
-            nearEvictionPolicy: {
-                kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
-                LRU: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                },
-                FIFO: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                },
-                SORTED: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                }
-            }
-        },
-        clientNearConfiguration: {
-            enabled: Boolean,
-            nearStartSize: Number,
-            nearEvictionPolicy: {
-                kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
-                LRU: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                },
-                FIFO: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                },
-                SORTED: {
-                    batchSize: Number,
-                    maxMemorySize: Number,
-                    maxSize: Number
-                }
-            }
-        },
-        evictionFilter: String,
-        memoryPolicyName: String,
-        dataRegionName: String,
-        sqlIndexMaxInlineSize: Number,
-        topologyValidator: String
-    });
-
-    CacheSchema.index({name: 1, space: 1}, {unique: true});
-
-    // Define Cache model.
-    result.Cache = mongoose.model('Cache', CacheSchema);
-
-    const IgfsSchema = new Schema({
-        space: {type: ObjectId, ref: 'Space', index: true, required: true},
-        name: {type: String},
-        clusters: [{type: ObjectId, ref: 'Cluster'}],
-        affinnityGroupSize: Number,
-        blockSize: Number,
-        streamBufferSize: Number,
-        dataCacheName: String,
-        metaCacheName: String,
-        defaultMode: {type: String, enum: ['PRIMARY', 'PROXY', 'DUAL_SYNC', 
'DUAL_ASYNC']},
-        dualModeMaxPendingPutsSize: Number,
-        dualModePutExecutorService: String,
-        dualModePutExecutorServiceShutdown: Boolean,
-        fragmentizerConcurrentFiles: Number,
-        fragmentizerEnabled: Boolean,
-        fragmentizerThrottlingBlockLength: Number,
-        fragmentizerThrottlingDelay: Number,
-        ipcEndpointConfiguration: {
-            type: {type: String, enum: ['SHMEM', 'TCP']},
-            host: String,
-            port: Number,
-            memorySize: Number,
-            tokenDirectoryPath: String,
-            threadCount: Number
-        },
-        ipcEndpointEnabled: Boolean,
-        maxSpaceSize: Number,
-        maximumTaskRangeLength: Number,
-        managementPort: Number,
-        pathModes: [{path: String, mode: {type: String, enum: ['PRIMARY', 
'PROXY', 'DUAL_SYNC', 'DUAL_ASYNC']}}],
-        perNodeBatchSize: Number,
-        perNodeParallelBatchCount: Number,
-        prefetchBlocks: Number,
-        sequentialReadsBeforePrefetch: Number,
-        trashPurgeTimeout: Number,
-        secondaryFileSystemEnabled: Boolean,
-        secondaryFileSystem: {
-            uri: String,
-            cfgPath: String,
-            userName: String
-        },
-        colocateMetadata: Boolean,
-        relaxedConsistency: Boolean,
-        updateFileLengthOnFlush: Boolean
+    // Define models.
+    _.forEach(schemas, (schema, name) => {
+        result[name] = mongoose.model(name, schema);
     });
 
-    IgfsSchema.index({name: 1, space: 1}, {unique: true});
-
-    // Define IGFS model.
-    result.Igfs = mongoose.model('Igfs', IgfsSchema);
-
-    // Define Cluster schema.
-    const ClusterSchema = new Schema({
-        space: {type: ObjectId, ref: 'Space', index: true, required: true},
-        name: {type: String},
-        activeOnStart: {type: Boolean, default: true},
-        localHost: String,
-        discovery: {
-            localAddress: String,
-            localPort: Number,
-            localPortRange: Number,
-            addressResolver: String,
-            socketTimeout: Number,
-            ackTimeout: Number,
-            maxAckTimeout: Number,
-            networkTimeout: Number,
-            joinTimeout: Number,
-            threadPriority: Number,
-            heartbeatFrequency: Number,
-            maxMissedHeartbeats: Number,
-            maxMissedClientHeartbeats: Number,
-            topHistorySize: Number,
-            listener: String,
-            dataExchange: String,
-            metricsProvider: String,
-            reconnectCount: Number,
-            statisticsPrintFrequency: Number,
-            ipFinderCleanFrequency: Number,
-            authenticator: String,
-            forceServerMode: Boolean,
-            clientReconnectDisabled: Boolean,
-            kind: {type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 
'GoogleStorage', 'Jdbc', 'SharedFs', 'ZooKeeper', 'Kubernetes']},
-            Vm: {
-                addresses: [String]
-            },
-            Multicast: {
-                multicastGroup: String,
-                multicastPort: Number,
-                responseWaitTime: Number,
-                addressRequestAttempts: Number,
-                localAddress: String,
-                addresses: [String]
-            },
-            S3: {
-                bucketName: String,
-                clientConfiguration: {
-                    protocol: {type: String, enum: ['HTTP', 'HTTPS']},
-                    maxConnections: Number,
-                    userAgent: String,
-                    localAddress: String,
-                    proxyHost: String,
-                    proxyPort: Number,
-                    proxyUsername: String,
-                    proxyDomain: String,
-                    proxyWorkstation: String,
-                    retryPolicy: {
-                        kind: {type: String, enum: ['Default', 
'DefaultMaxRetries', 'DynamoDB', 'DynamoDBMaxRetries', 'Custom', 
'CustomClass']},
-                        DefaultMaxRetries: {
-                            maxErrorRetry: Number
-                        },
-                        DynamoDBMaxRetries: {
-                            maxErrorRetry: Number
-                        },
-                        Custom: {
-                            retryCondition: String,
-                            backoffStrategy: String,
-                            maxErrorRetry: Number,
-                            honorMaxErrorRetryInClientConfig: Boolean
-                        },
-                        CustomClass: {
-                            className: String
-                        }
-                    },
-                    maxErrorRetry: Number,
-                    socketTimeout: Number,
-                    connectionTimeout: Number,
-                    requestTimeout: Number,
-                    useReaper: Boolean,
-                    useGzip: Boolean,
-                    signerOverride: String,
-                    preemptiveBasicProxyAuth: Boolean,
-                    connectionTTL: Number,
-                    connectionMaxIdleMillis: Number,
-                    useTcpKeepAlive: Boolean,
-                    dnsResolver: String,
-                    responseMetadataCacheSize: Number,
-                    secureRandom: String
-                }
-            },
-            Cloud: {
-                credential: String,
-                credentialPath: String,
-                identity: String,
-                provider: String,
-                regions: [String],
-                zones: [String]
-            },
-            GoogleStorage: {
-                projectName: String,
-                bucketName: String,
-                serviceAccountP12FilePath: String,
-                serviceAccountId: String,
-                addrReqAttempts: String
-            },
-            Jdbc: {
-                initSchema: Boolean,
-                dataSourceBean: String,
-                dialect: {
-                    type: String,
-                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
-                }
-            },
-            SharedFs: {
-                path: String
-            },
-            ZooKeeper: {
-                curator: String,
-                zkConnectionString: String,
-                retryPolicy: {
-                    kind: {type: String, enum: ['ExponentialBackoff', 
'BoundedExponentialBackoff', 'UntilElapsed',
-                        'NTimes', 'OneTime', 'Forever', 'Custom']},
-                    ExponentialBackoff: {
-                        baseSleepTimeMs: Number,
-                        maxRetries: Number,
-                        maxSleepMs: Number
-                    },
-                    BoundedExponentialBackoff: {
-                        baseSleepTimeMs: Number,
-                        maxSleepTimeMs: Number,
-                        maxRetries: Number
-                    },
-                    UntilElapsed: {
-                        maxElapsedTimeMs: Number,
-                        sleepMsBetweenRetries: Number
-                    },
-                    NTimes: {
-                        n: Number,
-                        sleepMsBetweenRetries: Number
-                    },
-                    OneTime: {
-                        sleepMsBetweenRetry: Number
-                    },
-                    Forever: {
-                        retryIntervalMs: Number
-                    },
-                    Custom: {
-                        className: String
-                    }
-                },
-                basePath: String,
-                serviceName: String,
-                allowDuplicateRegistrations: Boolean
-            },
-            Kubernetes: {
-                serviceName: String,
-                namespace: String,
-                masterUrl: String,
-                accountToken: String
-            }
-        },
-        atomicConfiguration: {
-            backups: Number,
-            cacheMode: {type: String, enum: ['LOCAL', 'REPLICATED', 
'PARTITIONED']},
-            atomicSequenceReserveSize: Number,
-            affinity: {
-                kind: {type: String, enum: ['Default', 'Rendezvous', 
'Custom']},
-                Rendezvous: {
-                    affinityBackupFilter: String,
-                    partitions: Number,
-                    excludeNeighbors: Boolean
-                },
-                Custom: {
-                    className: String
-                }
-            }
-        },
-        binaryConfiguration: {
-            idMapper: String,
-            nameMapper: String,
-            serializer: String,
-            typeConfigurations: [{
-                typeName: String,
-                idMapper: String,
-                nameMapper: String,
-                serializer: String,
-                enum: Boolean
-            }],
-            compactFooter: Boolean
-        },
-        caches: [{type: ObjectId, ref: 'Cache'}],
-        clockSyncSamples: Number,
-        clockSyncFrequency: Number,
-        deploymentMode: {type: String, enum: ['PRIVATE', 'ISOLATED', 'SHARED', 
'CONTINUOUS']},
-        discoveryStartupDelay: Number,
-        igfsThreadPoolSize: Number,
-        igfss: [{type: ObjectId, ref: 'Igfs'}],
-        includeEventTypes: [String],
-        eventStorage: {
-            kind: {type: String, enum: ['Memory', 'Custom']},
-            Memory: {
-                expireAgeMs: Number,
-                expireCount: Number,
-                filter: String
-            },
-            Custom: {
-                className: String
-            }
-        },
-        managementThreadPoolSize: Number,
-        marshaller: {
-            kind: {type: String, enum: ['OptimizedMarshaller', 
'JdkMarshaller']},
-            OptimizedMarshaller: {
-                poolSize: Number,
-                requireSerializable: Boolean
-            }
-        },
-        marshalLocalJobs: Boolean,
-        marshallerCacheKeepAliveTime: Number,
-        marshallerCacheThreadPoolSize: Number,
-        metricsExpireTime: Number,
-        metricsHistorySize: Number,
-        metricsLogFrequency: Number,
-        metricsUpdateFrequency: Number,
-        networkTimeout: Number,
-        networkSendRetryDelay: Number,
-        networkSendRetryCount: Number,
-        communication: {
-            listener: String,
-            localAddress: String,
-            localPort: Number,
-            localPortRange: Number,
-            sharedMemoryPort: Number,
-            directBuffer: Boolean,
-            directSendBuffer: Boolean,
-            idleConnectionTimeout: Number,
-            connectTimeout: Number,
-            maxConnectTimeout: Number,
-            reconnectCount: Number,
-            socketSendBuffer: Number,
-            socketReceiveBuffer: Number,
-            messageQueueLimit: Number,
-            slowClientQueueLimit: Number,
-            tcpNoDelay: Boolean,
-            ackSendThreshold: Number,
-            unacknowledgedMessagesBufferSize: Number,
-            socketWriteTimeout: Number,
-            selectorsCount: Number,
-            addressResolver: String
-        },
-        connector: {
-            enabled: Boolean,
-            jettyPath: String,
-            host: String,
-            port: Number,
-            portRange: Number,
-            idleTimeout: Number,
-            idleQueryCursorTimeout: Number,
-            idleQueryCursorCheckFrequency: Number,
-            receiveBufferSize: Number,
-            sendBufferSize: Number,
-            sendQueueLimit: Number,
-            directBuffer: Boolean,
-            noDelay: Boolean,
-            selectorCount: Number,
-            threadPoolSize: Number,
-            messageInterceptor: String,
-            secretKey: String,
-            sslEnabled: Boolean,
-            sslClientAuth: Boolean,
-            sslFactory: String
-        },
-        peerClassLoadingEnabled: Boolean,
-        peerClassLoadingLocalClassPathExclude: [String],
-        peerClassLoadingMissedResourcesCacheSize: Number,
-        peerClassLoadingThreadPoolSize: Number,
-        publicThreadPoolSize: Number,
-        swapSpaceSpi: {
-            kind: {type: String, enum: ['FileSwapSpaceSpi']},
-            FileSwapSpaceSpi: {
-                baseDirectory: String,
-                readStripesNumber: Number,
-                maximumSparsity: Number,
-                maxWriteQueueSize: Number,
-                writeBufferSize: Number
-            }
-        },
-        systemThreadPoolSize: Number,
-        timeServerPortBase: Number,
-        timeServerPortRange: Number,
-        transactionConfiguration: {
-            defaultTxConcurrency: {type: String, enum: ['OPTIMISTIC', 
'PESSIMISTIC']},
-            defaultTxIsolation: {type: String, enum: ['READ_COMMITTED', 
'REPEATABLE_READ', 'SERIALIZABLE']},
-            defaultTxTimeout: Number,
-            pessimisticTxLogLinger: Number,
-            pessimisticTxLogSize: Number,
-            txSerializableEnabled: Boolean,
-            txManagerFactory: String
-        },
-        sslEnabled: Boolean,
-        sslContextFactory: {
-            keyAlgorithm: String,
-            keyStoreFilePath: String,
-            keyStoreType: String,
-            protocol: String,
-            trustStoreFilePath: String,
-            trustStoreType: String,
-            trustManagers: [String]
-        },
-        rebalanceThreadPoolSize: Number,
-        odbc: {
-            odbcEnabled: Boolean,
-            endpointAddress: String,
-            socketSendBufferSize: Number,
-            socketReceiveBufferSize: Number,
-            maxOpenCursors: Number,
-            threadPoolSize: Number
-        },
-        attributes: [{name: String, value: String}],
-        collision: {
-            kind: {type: String, enum: ['Noop', 'PriorityQueue', 'FifoQueue', 
'JobStealing', 'Custom']},
-            PriorityQueue: {
-                parallelJobsNumber: Number,
-                waitingJobsNumber: Number,
-                priorityAttributeKey: String,
-                jobPriorityAttributeKey: String,
-                defaultPriority: Number,
-                starvationIncrement: Number,
-                starvationPreventionEnabled: Boolean
-            },
-            FifoQueue: {
-                parallelJobsNumber: Number,
-                waitingJobsNumber: Number
-            },
-            JobStealing: {
-                activeJobsThreshold: Number,
-                waitJobsThreshold: Number,
-                messageExpireTime: Number,
-                maximumStealingAttempts: Number,
-                stealingEnabled: Boolean,
-                stealingAttributes: [{name: String, value: String}],
-                externalCollisionListener: String
-            },
-            Custom: {
-                class: String
-            }
-        },
-        failoverSpi: [{
-            kind: {type: String, enum: ['JobStealing', 'Never', 'Always', 
'Custom']},
-            JobStealing: {
-                maximumFailoverAttempts: Number
-            },
-            Always: {
-                maximumFailoverAttempts: Number
-            },
-            Custom: {
-                class: String
-            }
-        }],
-        logger: {
-            kind: {type: 'String', enum: ['Log4j2', 'Null', 'Java', 'JCL', 
'SLF4J', 'Log4j', 'Custom']},
-            Log4j2: {
-                level: {type: String, enum: ['OFF', 'FATAL', 'ERROR', 'WARN', 
'INFO', 'DEBUG', 'TRACE', 'ALL']},
-                path: String
-            },
-            Log4j: {
-                mode: {type: String, enum: ['Default', 'Path']},
-                level: {type: String, enum: ['OFF', 'FATAL', 'ERROR', 'WARN', 
'INFO', 'DEBUG', 'TRACE', 'ALL']},
-                path: String
-            },
-            Custom: {
-                class: String
-            }
-        },
-        cacheKeyConfiguration: [{
-            typeName: String,
-            affinityKeyFieldName: String
-        }],
-        checkpointSpi: [{
-            kind: {type: String, enum: ['FS', 'Cache', 'S3', 'JDBC', 
'Custom']},
-            FS: {
-                directoryPaths: [String],
-                checkpointListener: String
-            },
-            Cache: {
-                cache: {type: ObjectId, ref: 'Cache'},
-                checkpointListener: String
-            },
-            S3: {
-                awsCredentials: {
-                    kind: {type: String, enum: ['Basic', 'Properties', 
'Anonymous', 'BasicSession', 'Custom']},
-                    Properties: {
-                        path: String
-                    },
-                    Custom: {
-                        className: String
-                    }
-                },
-                bucketNameSuffix: String,
-                clientConfiguration: {
-                    protocol: {type: String, enum: ['HTTP', 'HTTPS']},
-                    maxConnections: Number,
-                    userAgent: String,
-                    localAddress: String,
-                    proxyHost: String,
-                    proxyPort: Number,
-                    proxyUsername: String,
-                    proxyDomain: String,
-                    proxyWorkstation: String,
-                    retryPolicy: {
-                        kind: {type: String, enum: ['Default', 
'DefaultMaxRetries', 'DynamoDB', 'DynamoDBMaxRetries', 'Custom']},
-                        DefaultMaxRetries: {
-                            maxErrorRetry: Number
-                        },
-                        DynamoDBMaxRetries: {
-                            maxErrorRetry: Number
-                        },
-                        Custom: {
-                            retryCondition: String,
-                            backoffStrategy: String,
-                            maxErrorRetry: Number,
-                            honorMaxErrorRetryInClientConfig: Boolean
-                        }
-                    },
-                    maxErrorRetry: Number,
-                    socketTimeout: Number,
-                    connectionTimeout: Number,
-                    requestTimeout: Number,
-                    useReaper: Boolean,
-                    useGzip: Boolean,
-                    signerOverride: String,
-                    preemptiveBasicProxyAuth: Boolean,
-                    connectionTTL: Number,
-                    connectionMaxIdleMillis: Number,
-                    useTcpKeepAlive: Boolean,
-                    dnsResolver: String,
-                    responseMetadataCacheSize: Number,
-                    secureRandom: String
-                },
-                checkpointListener: String
-            },
-            JDBC: {
-                dataSourceBean: String,
-                dialect: {
-                    type: String,
-                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
-                },
-                user: String,
-                checkpointTableName: String,
-                keyFieldName: String,
-                keyFieldType: String,
-                valueFieldName: String,
-                valueFieldType: String,
-                expireDateFieldName: String,
-                expireDateFieldType: String,
-                numberOfRetries: Number,
-                checkpointListener: String
-            },
-            Custom: {
-                className: String
-            }
-        }],
-        clientConnectorConfiguration: {
-            enabled: Boolean,
-            host: String,
-            port: Number,
-            portRange: Number,
-            socketSendBufferSize: Number,
-            socketReceiveBufferSize: Number,
-            tcpNoDelay: {type: Boolean, default: true},
-            maxOpenCursorsPerConnection: Number,
-            threadPoolSize: Number
-        },
-        loadBalancingSpi: [{
-            kind: {type: String, enum: ['RoundRobin', 'Adaptive', 
'WeightedRandom', 'Custom']},
-            RoundRobin: {
-                perTask: Boolean
-            },
-            Adaptive: {
-                loadProbe: {
-                    kind: {type: String, enum: ['Job', 'CPU', 
'ProcessingTime', 'Custom']},
-                    Job: {
-                        useAverage: Boolean
-                    },
-                    CPU: {
-                        useAverage: Boolean,
-                        useProcessors: Boolean,
-                        processorCoefficient: Number
-                    },
-                    ProcessingTime: {
-                        useAverage: Boolean
-                    },
-                    Custom: {
-                        className: String
-                    }
-                }
-            },
-            WeightedRandom: {
-                nodeWeight: Number,
-                useWeights: Boolean
-            },
-            Custom: {
-                className: String
-            }
-        }],
-        deploymentSpi: {
-            kind: {type: String, enum: ['URI', 'Local', 'Custom']},
-            URI: {
-                uriList: [String],
-                temporaryDirectoryPath: String,
-                scanners: [String],
-                listener: String,
-                checkMd5: Boolean,
-                encodeUri: Boolean
-            },
-            Local: {
-                listener: String
-            },
-            Custom: {
-                className: String
-            }
-        },
-        warmupClosure: String,
-        hadoopConfiguration: {
-            mapReducePlanner: {
-                kind: {type: String, enum: ['Weighted', 'Custom']},
-                Weighted: {
-                    localMapperWeight: Number,
-                    remoteMapperWeight: Number,
-                    localReducerWeight: Number,
-                    remoteReducerWeight: Number,
-                    preferLocalReducerThresholdWeight: Number
-                },
-                Custom: {
-                    className: String
-                }
-            },
-            finishedJobInfoTtl: Number,
-            maxParallelTasks: Number,
-            maxTaskQueueSize: Number,
-            nativeLibraryNames: [String]
-        },
-        serviceConfigurations: [{
-            name: String,
-            service: String,
-            maxPerNodeCount: Number,
-            totalCount: Number,
-            nodeFilter: {
-                kind: {type: String, enum: ['Default', 'Exclude', 'IGFS', 
'OnNodes', 'Custom']},
-                Exclude: {
-                    nodeId: String
-                },
-                IGFS: {
-                    igfs: {type: ObjectId, ref: 'Igfs'}
-                },
-                Custom: {
-                    className: String
-                }
-            },
-            cache: {type: ObjectId, ref: 'Cache'},
-            affinityKey: String
-        }],
-        cacheSanityCheckEnabled: {type: Boolean, default: true},
-        classLoader: String,
-        consistentId: String,
-        failureDetectionTimeout: Number,
-        clientFailureDetectionTimeout: Number,
-        workDirectory: String,
-        lateAffinityAssignment: Boolean,
-        utilityCacheKeepAliveTime: Number,
-        asyncCallbackPoolSize: Number,
-        dataStreamerThreadPoolSize: Number,
-        queryThreadPoolSize: Number,
-        stripedPoolSize: Number,
-        serviceThreadPoolSize: Number,
-        utilityCacheThreadPoolSize: Number,
-        executorConfiguration: [{
-            name: String,
-            size: Number
-        }],
-        dataStorageConfiguration: {
-            systemRegionInitialSize: Number,
-            systemRegionMaxSize: Number,
-            pageSize: Number,
-            concurrencyLevel: Number,
-            defaultDataRegionConfiguration: {
-                name: String,
-                initialSize: Number,
-                maxSize: Number,
-                swapPath: String,
-                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
-                evictionThreshold: Number,
-                emptyPagesPoolSize: Number,
-                metricsEnabled: Boolean,
-                metricsSubIntervalCount: Number,
-                metricsRateTimeInterval: Number,
-                persistenceEnabled: Boolean,
-                checkpointPageBufferSize: Number
-            },
-            dataRegionConfigurations: [{
-                name: String,
-                initialSize: Number,
-                maxSize: Number,
-                swapPath: String,
-                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
-                evictionThreshold: Number,
-                emptyPagesPoolSize: Number,
-                metricsEnabled: Boolean,
-                metricsSubIntervalCount: Number,
-                metricsRateTimeInterval: Number,
-                persistenceEnabled: Boolean,
-                checkpointPageBufferSize: Number
-            }],
-            storagePath: String,
-            metricsEnabled: Boolean,
-            alwaysWriteFullPages: Boolean,
-            checkpointFrequency: Number,
-            checkpointThreads: Number,
-            checkpointWriteOrder: {type: String, enum: ['RANDOM', 
'SEQUENTIAL']},
-            walPath: String,
-            walArchivePath: String,
-            walMode: {type: String, enum: ['DEFAULT', 'LOG_ONLY', 
'BACKGROUND', 'NONE']},
-            walSegments: Number,
-            walSegmentSize: Number,
-            walHistorySize: Number,
-            walFlushFrequency: Number,
-            walFsyncDelayNanos: Number,
-            walRecordIteratorBufferSize: Number,
-            lockWaitTime: Number,
-            walBufferSize: Number,
-            walThreadLocalBufferSize: Number,
-            metricsSubIntervalCount: Number,
-            metricsRateTimeInterval: Number,
-            fileIOFactory: {type: String, enum: ['RANDOM', 'ASYNC']},
-            walAutoArchiveAfterInactivity: Number,
-            writeThrottlingEnabled: Boolean,
-            walCompactionEnabled: Boolean
-        },
-        memoryConfiguration: {
-            systemCacheInitialSize: Number,
-            systemCacheMaxSize: Number,
-            pageSize: Number,
-            concurrencyLevel: Number,
-            defaultMemoryPolicyName: String,
-            defaultMemoryPolicySize: Number,
-            memoryPolicies: [{
-                name: String,
-                initialSize: Number,
-                maxSize: Number,
-                swapFilePath: String,
-                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
-                evictionThreshold: Number,
-                emptyPagesPoolSize: Number,
-                metricsEnabled: Boolean,
-                subIntervals: Number,
-                rateTimeInterval: Number
-            }]
-        },
-        longQueryWarningTimeout: Number,
-        sqlConnectorConfiguration: {
-            enabled: Boolean,
-            host: String,
-            port: Number,
-            portRange: Number,
-            socketSendBufferSize: Number,
-            socketReceiveBufferSize: Number,
-            tcpNoDelay: {type: Boolean, default: true},
-            maxOpenCursorsPerConnection: Number,
-            threadPoolSize: Number
-        },
-        persistenceStoreConfiguration: {
-            enabled: Boolean,
-            persistentStorePath: String,
-            metricsEnabled: Boolean,
-            alwaysWriteFullPages: Boolean,
-            checkpointingFrequency: Number,
-            checkpointingPageBufferSize: Number,
-            checkpointingThreads: Number,
-            walStorePath: String,
-            walArchivePath: String,
-            walMode: {type: String, enum: ['DEFAULT', 'LOG_ONLY', 
'BACKGROUND', 'NONE']},
-            walSegments: Number,
-            walSegmentSize: Number,
-            walHistorySize: Number,
-            walFlushFrequency: Number,
-            walFsyncDelayNanos: Number,
-            walRecordIteratorBufferSize: Number,
-            lockWaitTime: Number,
-            rateTimeInterval: Number,
-            tlbSize: Number,
-            subIntervals: Number
-        }
-    });
-
-    ClusterSchema.index({name: 1, space: 1}, {unique: true});
-
-    // Define Cluster model.
-    result.Cluster = mongoose.model('Cluster', ClusterSchema);
-
-    // Define Notebook schema.
-    const NotebookSchema = new Schema({
-        space: {type: ObjectId, ref: 'Space', index: true, required: true},
-        name: String,
-        expandedParagraphs: [Number],
-        paragraphs: [{
-            name: String,
-            query: String,
-            editor: Boolean,
-            result: {type: String, enum: ['none', 'table', 'bar', 'pie', 
'line', 'area']},
-            pageSize: Number,
-            timeLineSpan: String,
-            maxPages: Number,
-            hideSystemColumns: Boolean,
-            cacheName: String,
-            useAsDefaultSchema: Boolean,
-            chartsOptions: {barChart: {stacked: Boolean}, areaChart: {style: 
String}},
-            rate: {
-                value: Number,
-                unit: Number
-            },
-            qryType: String,
-            nonCollocatedJoins: {type: Boolean, default: false},
-            enforceJoinOrder: {type: Boolean, default: false},
-            lazy: {type: Boolean, default: false}
-        }]
-    });
-
-    NotebookSchema.index({name: 1, space: 1}, {unique: true});
-
-    // Define Notebook model.
-    result.Notebook = mongoose.model('Notebook', NotebookSchema);
-
-    // Define Activities schema.
-    const ActivitiesSchema = new Schema({
-        owner: {type: ObjectId, ref: 'Account'},
-        date: Date,
-        group: String,
-        action: String,
-        amount: { type: Number, default: 0 }
-    });
-
-    ActivitiesSchema.index({ owner: 1, group: 1, action: 1, date: 1}, { 
unique: true });
-
-    // Define Activities model.
-    result.Activities = mongoose.model('Activities', ActivitiesSchema);
-
-    // Define Notifications schema.
-    const NotificationsSchema = new Schema({
-        owner: {type: ObjectId, ref: 'Account'},
-        date: Date,
-        message: String,
-        isShown: Boolean
-    });
-
-    // Define Notifications model.
-    result.Notifications = mongoose.model('Notifications', 
NotificationsSchema);
-
     result.handleError = function(res, err) {
         // TODO IGNITE-843 Send error to admin
         res.status(err.code || 500).send(err.message);
@@ -1158,7 +53,7 @@ const defineSchema = (mongoose) => {
     return result;
 };
 
-module.exports.factory = function(settings, mongoose) {
+module.exports.factory = function(settings, mongoose, schemas) {
     // Use native promises
     mongoose.Promise = global.Promise;
 
@@ -1166,9 +61,9 @@ module.exports.factory = function(settings, mongoose) {
 
     // Connect to mongoDB database.
     return mongoose.connect(settings.mongoUrl, {server: {poolSize: 4}})
-        .then(() => defineSchema(mongoose))
-        .catch(() => {
-            console.log('Failed to connect to local MongoDB, will try to 
download and start embedded MongoDB');
+        .then(() => defineSchema(mongoose, schemas))
+        .catch((err) => {
+            console.log('Failed to connect to local MongoDB, will try to 
download and start embedded MongoDB', err);
 
             const {MongodHelper} = require('mongodb-prebuilt');
             const {MongoDBDownload} = require('mongodb-download');
@@ -1216,7 +111,7 @@ module.exports.factory = function(settings, mongoose) {
                             return Promise.reject(err);
                         });
                 })
-                .then(() => defineSchema(mongoose))
+                .then(() => defineSchema(mongoose, schemas))
                 .then((mongo) => {
                     if (settings.packaged) {
                         return mongo.Account.count()

http://git-wip-us.apache.org/repos/asf/ignite/blob/71db7079/modules/web-console/backend/app/schemas.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/schemas.js 
b/modules/web-console/backend/app/schemas.js
new file mode 100644
index 0000000..0ed85b2
--- /dev/null
+++ b/modules/web-console/backend/app/schemas.js
@@ -0,0 +1,1147 @@
+/*
+ * 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';
+
+const passportMongo = require('passport-local-mongoose');
+
+// Fire me up!
+
+/**
+ * Module mongo schema.
+ */
+module.exports = {
+    implements: 'schemas',
+    inject: ['mongoose']
+};
+
+module.exports.factory = function(mongoose) {
+    const Schema = mongoose.Schema;
+    const ObjectId = mongoose.Schema.Types.ObjectId;
+
+    // Define Account schema.
+    const Account = new Schema({
+        firstName: String,
+        lastName: String,
+        email: String,
+        phone: String,
+        company: String,
+        country: String,
+        registered: Date,
+        lastLogin: Date,
+        lastActivity: Date,
+        admin: Boolean,
+        token: String,
+        resetPasswordToken: String
+    });
+
+    // Install passport plugin.
+    Account.plugin(passportMongo, {
+        usernameField: 'email', limitAttempts: true, lastLoginField: 
'lastLogin',
+        usernameLowerCase: true
+    });
+
+    const transform = (doc, ret) => {
+        return {
+            _id: ret._id,
+            email: ret.email,
+            phone: ret.phone,
+            firstName: ret.firstName,
+            lastName: ret.lastName,
+            company: ret.company,
+            country: ret.country,
+            admin: ret.admin,
+            token: ret.token,
+            registered: ret.registered,
+            lastLogin: ret.lastLogin,
+            lastActivity: ret.lastActivity
+        };
+    };
+
+    // Configure transformation to JSON.
+    Account.set('toJSON', {transform});
+
+    // Configure transformation to JSON.
+    Account.set('toObject', {transform});
+
+    // Define Space schema.
+    const Space = new Schema({
+        name: String,
+        owner: {type: ObjectId, ref: 'Account'},
+        demo: {type: Boolean, default: false},
+        usedBy: [{
+            permission: {type: String, enum: ['VIEW', 'FULL']},
+            account: {type: ObjectId, ref: 'Account'}
+        }]
+    });
+
+    // Define Domain model schema.
+    const DomainModel = new Schema({
+        space: {type: ObjectId, ref: 'Space', index: true, required: true},
+        caches: [{type: ObjectId, ref: 'Cache'}],
+        queryMetadata: {type: String, enum: ['Annotations', 'Configuration']},
+        kind: {type: String, enum: ['query', 'store', 'both']},
+        tableName: String,
+        keyFieldName: String,
+        valueFieldName: String,
+        databaseSchema: String,
+        databaseTable: String,
+        keyType: String,
+        valueType: {type: String},
+        keyFields: [{
+            databaseFieldName: String,
+            databaseFieldType: String,
+            javaFieldName: String,
+            javaFieldType: String
+        }],
+        valueFields: [{
+            databaseFieldName: String,
+            databaseFieldType: String,
+            javaFieldName: String,
+            javaFieldType: String
+        }],
+        queryKeyFields: [String],
+        fields: [{name: String, className: String}],
+        aliases: [{field: String, alias: String}],
+        indexes: [{
+            name: String,
+            indexType: {type: String, enum: ['SORTED', 'FULLTEXT', 
'GEOSPATIAL']},
+            fields: [{name: String, direction: Boolean}]
+        }],
+        generatePojo: Boolean
+    });
+
+    DomainModel.index({valueType: 1, space: 1}, {unique: true});
+
+    // Define Cache schema.
+    const Cache = new Schema({
+        space: {type: ObjectId, ref: 'Space', index: true, required: true},
+        name: {type: String},
+        groupName: {type: String},
+        clusters: [{type: ObjectId, ref: 'Cluster'}],
+        domains: [{type: ObjectId, ref: 'DomainModel'}],
+        cacheMode: {type: String, enum: ['PARTITIONED', 'REPLICATED', 
'LOCAL']},
+        atomicityMode: {type: String, enum: ['ATOMIC', 'TRANSACTIONAL']},
+        partitionLossPolicy: {
+            type: String,
+            enum: ['READ_ONLY_SAFE', 'READ_ONLY_ALL', 'READ_WRITE_SAFE', 
'READ_WRITE_ALL', 'IGNORE']
+        },
+
+        affinity: {
+            kind: {type: String, enum: ['Default', 'Rendezvous', 'Fair', 
'Custom']},
+            Rendezvous: {
+                affinityBackupFilter: String,
+                partitions: Number,
+                excludeNeighbors: Boolean
+            },
+            Fair: {
+                affinityBackupFilter: String,
+                partitions: Number,
+                excludeNeighbors: Boolean
+            },
+            Custom: {
+                className: String
+            }
+        },
+
+        affinityMapper: String,
+
+        nodeFilter: {
+            kind: {type: String, enum: ['Default', 'Exclude', 'IGFS', 
'OnNodes', 'Custom']},
+            Exclude: {
+                nodeId: String
+            },
+            IGFS: {
+                igfs: {type: ObjectId, ref: 'Igfs'}
+            },
+            Custom: {
+                className: String
+            }
+        },
+
+        backups: Number,
+        memoryMode: {type: String, enum: ['ONHEAP_TIERED', 'OFFHEAP_TIERED', 
'OFFHEAP_VALUES']},
+        offHeapMaxMemory: Number,
+        startSize: Number,
+        swapEnabled: Boolean,
+
+        onheapCacheEnabled: Boolean,
+
+        evictionPolicy: {
+            kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
+            LRU: {
+                batchSize: Number,
+                maxMemorySize: Number,
+                maxSize: Number
+            },
+            FIFO: {
+                batchSize: Number,
+                maxMemorySize: Number,
+                maxSize: Number
+            },
+            SORTED: {
+                batchSize: Number,
+                maxMemorySize: Number,
+                maxSize: Number
+            }
+        },
+
+        rebalanceMode: {type: String, enum: ['SYNC', 'ASYNC', 'NONE']},
+        rebalanceBatchSize: Number,
+        rebalanceBatchesPrefetchCount: Number,
+        rebalanceOrder: Number,
+        rebalanceDelay: Number,
+        rebalanceTimeout: Number,
+        rebalanceThrottle: Number,
+
+        cacheStoreFactory: {
+            kind: {
+                type: String,
+                enum: ['CacheJdbcPojoStoreFactory', 
'CacheJdbcBlobStoreFactory', 'CacheHibernateBlobStoreFactory']
+            },
+            CacheJdbcPojoStoreFactory: {
+                dataSourceBean: String,
+                dialect: {
+                    type: String,
+                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
+                },
+                batchSize: Number,
+                maximumPoolSize: Number,
+                maximumWriteAttempts: Number,
+                parallelLoadCacheMinimumThreshold: Number,
+                hasher: String,
+                transformer: String,
+                sqlEscapeAll: Boolean
+            },
+            CacheJdbcBlobStoreFactory: {
+                connectVia: {type: String, enum: ['URL', 'DataSource']},
+                connectionUrl: String,
+                user: String,
+                dataSourceBean: String,
+                dialect: {
+                    type: String,
+                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
+                },
+                initSchema: Boolean,
+                createTableQuery: String,
+                loadQuery: String,
+                insertQuery: String,
+                updateQuery: String,
+                deleteQuery: String
+            },
+            CacheHibernateBlobStoreFactory: {
+                hibernateProperties: [{name: String, value: String}]
+            }
+        },
+        storeKeepBinary: Boolean,
+        loadPreviousValue: Boolean,
+        readThrough: Boolean,
+        writeThrough: Boolean,
+
+        writeBehindEnabled: Boolean,
+        writeBehindBatchSize: Number,
+        writeBehindFlushSize: Number,
+        writeBehindFlushFrequency: Number,
+        writeBehindFlushThreadCount: Number,
+        writeBehindCoalescing: {type: Boolean, default: true},
+
+        invalidate: Boolean,
+        defaultLockTimeout: Number,
+        atomicWriteOrderMode: {type: String, enum: ['CLOCK', 'PRIMARY']},
+        writeSynchronizationMode: {type: String, enum: ['FULL_SYNC', 
'FULL_ASYNC', 'PRIMARY_SYNC']},
+
+        sqlEscapeAll: Boolean,
+        sqlSchema: String,
+        sqlOnheapRowCacheSize: Number,
+        longQueryWarningTimeout: Number,
+        sqlFunctionClasses: [String],
+        snapshotableIndex: Boolean,
+        queryDetailMetricsSize: Number,
+        queryParallelism: Number,
+        statisticsEnabled: Boolean,
+        managementEnabled: Boolean,
+        readFromBackup: Boolean,
+        copyOnRead: Boolean,
+        maxConcurrentAsyncOperations: Number,
+        nearConfiguration: {
+            enabled: Boolean,
+            nearStartSize: Number,
+            nearEvictionPolicy: {
+                kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
+                LRU: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                },
+                FIFO: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                },
+                SORTED: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                }
+            }
+        },
+        clientNearConfiguration: {
+            enabled: Boolean,
+            nearStartSize: Number,
+            nearEvictionPolicy: {
+                kind: {type: String, enum: ['LRU', 'FIFO', 'SORTED']},
+                LRU: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                },
+                FIFO: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                },
+                SORTED: {
+                    batchSize: Number,
+                    maxMemorySize: Number,
+                    maxSize: Number
+                }
+            }
+        },
+        evictionFilter: String,
+        memoryPolicyName: String,
+        dataRegionName: String,
+        sqlIndexMaxInlineSize: Number,
+        topologyValidator: String
+    });
+
+    Cache.index({name: 1, space: 1}, {unique: true});
+
+    const Igfs = new Schema({
+        space: {type: ObjectId, ref: 'Space', index: true, required: true},
+        name: {type: String},
+        clusters: [{type: ObjectId, ref: 'Cluster'}],
+        affinnityGroupSize: Number,
+        blockSize: Number,
+        streamBufferSize: Number,
+        dataCacheName: String,
+        metaCacheName: String,
+        defaultMode: {type: String, enum: ['PRIMARY', 'PROXY', 'DUAL_SYNC', 
'DUAL_ASYNC']},
+        dualModeMaxPendingPutsSize: Number,
+        dualModePutExecutorService: String,
+        dualModePutExecutorServiceShutdown: Boolean,
+        fragmentizerConcurrentFiles: Number,
+        fragmentizerEnabled: Boolean,
+        fragmentizerThrottlingBlockLength: Number,
+        fragmentizerThrottlingDelay: Number,
+        ipcEndpointConfiguration: {
+            type: {type: String, enum: ['SHMEM', 'TCP']},
+            host: String,
+            port: Number,
+            memorySize: Number,
+            tokenDirectoryPath: String,
+            threadCount: Number
+        },
+        ipcEndpointEnabled: Boolean,
+        maxSpaceSize: Number,
+        maximumTaskRangeLength: Number,
+        managementPort: Number,
+        pathModes: [{path: String, mode: {type: String, enum: ['PRIMARY', 
'PROXY', 'DUAL_SYNC', 'DUAL_ASYNC']}}],
+        perNodeBatchSize: Number,
+        perNodeParallelBatchCount: Number,
+        prefetchBlocks: Number,
+        sequentialReadsBeforePrefetch: Number,
+        trashPurgeTimeout: Number,
+        secondaryFileSystemEnabled: Boolean,
+        secondaryFileSystem: {
+            uri: String,
+            cfgPath: String,
+            userName: String
+        },
+        colocateMetadata: Boolean,
+        relaxedConsistency: Boolean,
+        updateFileLengthOnFlush: Boolean
+    });
+
+    Igfs.index({name: 1, space: 1}, {unique: true});
+
+
+    // Define Cluster schema.
+    const Cluster = new Schema({
+        space: {type: ObjectId, ref: 'Space', index: true, required: true},
+        name: {type: String},
+        activeOnStart: {type: Boolean, default: true},
+        localHost: String,
+        discovery: {
+            localAddress: String,
+            localPort: Number,
+            localPortRange: Number,
+            addressResolver: String,
+            socketTimeout: Number,
+            ackTimeout: Number,
+            maxAckTimeout: Number,
+            networkTimeout: Number,
+            joinTimeout: Number,
+            threadPriority: Number,
+            heartbeatFrequency: Number,
+            maxMissedHeartbeats: Number,
+            maxMissedClientHeartbeats: Number,
+            topHistorySize: Number,
+            listener: String,
+            dataExchange: String,
+            metricsProvider: String,
+            reconnectCount: Number,
+            statisticsPrintFrequency: Number,
+            ipFinderCleanFrequency: Number,
+            authenticator: String,
+            forceServerMode: Boolean,
+            clientReconnectDisabled: Boolean,
+            kind: {
+                type: String,
+                enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 
'Jdbc', 'SharedFs', 'ZooKeeper', 'Kubernetes']
+            },
+            Vm: {
+                addresses: [String]
+            },
+            Multicast: {
+                multicastGroup: String,
+                multicastPort: Number,
+                responseWaitTime: Number,
+                addressRequestAttempts: Number,
+                localAddress: String,
+                addresses: [String]
+            },
+            S3: {
+                bucketName: String,
+                clientConfiguration: {
+                    protocol: {type: String, enum: ['HTTP', 'HTTPS']},
+                    maxConnections: Number,
+                    userAgent: String,
+                    localAddress: String,
+                    proxyHost: String,
+                    proxyPort: Number,
+                    proxyUsername: String,
+                    proxyDomain: String,
+                    proxyWorkstation: String,
+                    retryPolicy: {
+                        kind: {
+                            type: String,
+                            enum: ['Default', 'DefaultMaxRetries', 'DynamoDB', 
'DynamoDBMaxRetries', 'Custom', 'CustomClass']
+                        },
+                        DefaultMaxRetries: {
+                            maxErrorRetry: Number
+                        },
+                        DynamoDBMaxRetries: {
+                            maxErrorRetry: Number
+                        },
+                        Custom: {
+                            retryCondition: String,
+                            backoffStrategy: String,
+                            maxErrorRetry: Number,
+                            honorMaxErrorRetryInClientConfig: Boolean
+                        },
+                        CustomClass: {
+                            className: String
+                        }
+                    },
+                    maxErrorRetry: Number,
+                    socketTimeout: Number,
+                    connectionTimeout: Number,
+                    requestTimeout: Number,
+                    useReaper: Boolean,
+                    useGzip: Boolean,
+                    signerOverride: String,
+                    preemptiveBasicProxyAuth: Boolean,
+                    connectionTTL: Number,
+                    connectionMaxIdleMillis: Number,
+                    useTcpKeepAlive: Boolean,
+                    dnsResolver: String,
+                    responseMetadataCacheSize: Number,
+                    secureRandom: String
+                }
+            },
+            Cloud: {
+                credential: String,
+                credentialPath: String,
+                identity: String,
+                provider: String,
+                regions: [String],
+                zones: [String]
+            },
+            GoogleStorage: {
+                projectName: String,
+                bucketName: String,
+                serviceAccountP12FilePath: String,
+                serviceAccountId: String,
+                addrReqAttempts: String
+            },
+            Jdbc: {
+                initSchema: Boolean,
+                dataSourceBean: String,
+                dialect: {
+                    type: String,
+                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
+                }
+            },
+            SharedFs: {
+                path: String
+            },
+            ZooKeeper: {
+                curator: String,
+                zkConnectionString: String,
+                retryPolicy: {
+                    kind: {
+                        type: String, enum: ['ExponentialBackoff', 
'BoundedExponentialBackoff', 'UntilElapsed',
+                            'NTimes', 'OneTime', 'Forever', 'Custom']
+                    },
+                    ExponentialBackoff: {
+                        baseSleepTimeMs: Number,
+                        maxRetries: Number,
+                        maxSleepMs: Number
+                    },
+                    BoundedExponentialBackoff: {
+                        baseSleepTimeMs: Number,
+                        maxSleepTimeMs: Number,
+                        maxRetries: Number
+                    },
+                    UntilElapsed: {
+                        maxElapsedTimeMs: Number,
+                        sleepMsBetweenRetries: Number
+                    },
+                    NTimes: {
+                        n: Number,
+                        sleepMsBetweenRetries: Number
+                    },
+                    OneTime: {
+                        sleepMsBetweenRetry: Number
+                    },
+                    Forever: {
+                        retryIntervalMs: Number
+                    },
+                    Custom: {
+                        className: String
+                    }
+                },
+                basePath: String,
+                serviceName: String,
+                allowDuplicateRegistrations: Boolean
+            },
+            Kubernetes: {
+                serviceName: String,
+                namespace: String,
+                masterUrl: String,
+                accountToken: String
+            }
+        },
+        atomicConfiguration: {
+            backups: Number,
+            cacheMode: {type: String, enum: ['LOCAL', 'REPLICATED', 
'PARTITIONED']},
+            atomicSequenceReserveSize: Number,
+            affinity: {
+                kind: {type: String, enum: ['Default', 'Rendezvous', 
'Custom']},
+                Rendezvous: {
+                    affinityBackupFilter: String,
+                    partitions: Number,
+                    excludeNeighbors: Boolean
+                },
+                Custom: {
+                    className: String
+                }
+            }
+        },
+        binaryConfiguration: {
+            idMapper: String,
+            nameMapper: String,
+            serializer: String,
+            typeConfigurations: [{
+                typeName: String,
+                idMapper: String,
+                nameMapper: String,
+                serializer: String,
+                enum: Boolean
+            }],
+            compactFooter: Boolean
+        },
+        caches: [{type: ObjectId, ref: 'Cache'}],
+        clockSyncSamples: Number,
+        clockSyncFrequency: Number,
+        deploymentMode: {type: String, enum: ['PRIVATE', 'ISOLATED', 'SHARED', 
'CONTINUOUS']},
+        discoveryStartupDelay: Number,
+        igfsThreadPoolSize: Number,
+        igfss: [{type: ObjectId, ref: 'Igfs'}],
+        includeEventTypes: [String],
+        eventStorage: {
+            kind: {type: String, enum: ['Memory', 'Custom']},
+            Memory: {
+                expireAgeMs: Number,
+                expireCount: Number,
+                filter: String
+            },
+            Custom: {
+                className: String
+            }
+        },
+        managementThreadPoolSize: Number,
+        marshaller: {
+            kind: {type: String, enum: ['OptimizedMarshaller', 
'JdkMarshaller']},
+            OptimizedMarshaller: {
+                poolSize: Number,
+                requireSerializable: Boolean
+            }
+        },
+        marshalLocalJobs: Boolean,
+        marshallerCacheKeepAliveTime: Number,
+        marshallerCacheThreadPoolSize: Number,
+        metricsExpireTime: Number,
+        metricsHistorySize: Number,
+        metricsLogFrequency: Number,
+        metricsUpdateFrequency: Number,
+        networkTimeout: Number,
+        networkSendRetryDelay: Number,
+        networkSendRetryCount: Number,
+        communication: {
+            listener: String,
+            localAddress: String,
+            localPort: Number,
+            localPortRange: Number,
+            sharedMemoryPort: Number,
+            directBuffer: Boolean,
+            directSendBuffer: Boolean,
+            idleConnectionTimeout: Number,
+            connectTimeout: Number,
+            maxConnectTimeout: Number,
+            reconnectCount: Number,
+            socketSendBuffer: Number,
+            socketReceiveBuffer: Number,
+            messageQueueLimit: Number,
+            slowClientQueueLimit: Number,
+            tcpNoDelay: Boolean,
+            ackSendThreshold: Number,
+            unacknowledgedMessagesBufferSize: Number,
+            socketWriteTimeout: Number,
+            selectorsCount: Number,
+            addressResolver: String
+        },
+        connector: {
+            enabled: Boolean,
+            jettyPath: String,
+            host: String,
+            port: Number,
+            portRange: Number,
+            idleTimeout: Number,
+            idleQueryCursorTimeout: Number,
+            idleQueryCursorCheckFrequency: Number,
+            receiveBufferSize: Number,
+            sendBufferSize: Number,
+            sendQueueLimit: Number,
+            directBuffer: Boolean,
+            noDelay: Boolean,
+            selectorCount: Number,
+            threadPoolSize: Number,
+            messageInterceptor: String,
+            secretKey: String,
+            sslEnabled: Boolean,
+            sslClientAuth: Boolean,
+            sslFactory: String
+        },
+        peerClassLoadingEnabled: Boolean,
+        peerClassLoadingLocalClassPathExclude: [String],
+        peerClassLoadingMissedResourcesCacheSize: Number,
+        peerClassLoadingThreadPoolSize: Number,
+        publicThreadPoolSize: Number,
+        swapSpaceSpi: {
+            kind: {type: String, enum: ['FileSwapSpaceSpi']},
+            FileSwapSpaceSpi: {
+                baseDirectory: String,
+                readStripesNumber: Number,
+                maximumSparsity: Number,
+                maxWriteQueueSize: Number,
+                writeBufferSize: Number
+            }
+        },
+        systemThreadPoolSize: Number,
+        timeServerPortBase: Number,
+        timeServerPortRange: Number,
+        transactionConfiguration: {
+            defaultTxConcurrency: {type: String, enum: ['OPTIMISTIC', 
'PESSIMISTIC']},
+            defaultTxIsolation: {type: String, enum: ['READ_COMMITTED', 
'REPEATABLE_READ', 'SERIALIZABLE']},
+            defaultTxTimeout: Number,
+            pessimisticTxLogLinger: Number,
+            pessimisticTxLogSize: Number,
+            txSerializableEnabled: Boolean,
+            txManagerFactory: String
+        },
+        sslEnabled: Boolean,
+        sslContextFactory: {
+            keyAlgorithm: String,
+            keyStoreFilePath: String,
+            keyStoreType: String,
+            protocol: String,
+            trustStoreFilePath: String,
+            trustStoreType: String,
+            trustManagers: [String]
+        },
+        rebalanceThreadPoolSize: Number,
+        odbc: {
+            odbcEnabled: Boolean,
+            endpointAddress: String,
+            socketSendBufferSize: Number,
+            socketReceiveBufferSize: Number,
+            maxOpenCursors: Number,
+            threadPoolSize: Number
+        },
+        attributes: [{name: String, value: String}],
+        collision: {
+            kind: {type: String, enum: ['Noop', 'PriorityQueue', 'FifoQueue', 
'JobStealing', 'Custom']},
+            PriorityQueue: {
+                parallelJobsNumber: Number,
+                waitingJobsNumber: Number,
+                priorityAttributeKey: String,
+                jobPriorityAttributeKey: String,
+                defaultPriority: Number,
+                starvationIncrement: Number,
+                starvationPreventionEnabled: Boolean
+            },
+            FifoQueue: {
+                parallelJobsNumber: Number,
+                waitingJobsNumber: Number
+            },
+            JobStealing: {
+                activeJobsThreshold: Number,
+                waitJobsThreshold: Number,
+                messageExpireTime: Number,
+                maximumStealingAttempts: Number,
+                stealingEnabled: Boolean,
+                stealingAttributes: [{name: String, value: String}],
+                externalCollisionListener: String
+            },
+            Custom: {
+                class: String
+            }
+        },
+        failoverSpi: [{
+            kind: {type: String, enum: ['JobStealing', 'Never', 'Always', 
'Custom']},
+            JobStealing: {
+                maximumFailoverAttempts: Number
+            },
+            Always: {
+                maximumFailoverAttempts: Number
+            },
+            Custom: {
+                class: String
+            }
+        }],
+        logger: {
+            kind: {type: 'String', enum: ['Log4j2', 'Null', 'Java', 'JCL', 
'SLF4J', 'Log4j', 'Custom']},
+            Log4j2: {
+                level: {type: String, enum: ['OFF', 'FATAL', 'ERROR', 'WARN', 
'INFO', 'DEBUG', 'TRACE', 'ALL']},
+                path: String
+            },
+            Log4j: {
+                mode: {type: String, enum: ['Default', 'Path']},
+                level: {type: String, enum: ['OFF', 'FATAL', 'ERROR', 'WARN', 
'INFO', 'DEBUG', 'TRACE', 'ALL']},
+                path: String
+            },
+            Custom: {
+                class: String
+            }
+        },
+        cacheKeyConfiguration: [{
+            typeName: String,
+            affinityKeyFieldName: String
+        }],
+        checkpointSpi: [{
+            kind: {type: String, enum: ['FS', 'Cache', 'S3', 'JDBC', 
'Custom']},
+            FS: {
+                directoryPaths: [String],
+                checkpointListener: String
+            },
+            Cache: {
+                cache: {type: ObjectId, ref: 'Cache'},
+                checkpointListener: String
+            },
+            S3: {
+                awsCredentials: {
+                    kind: {type: String, enum: ['Basic', 'Properties', 
'Anonymous', 'BasicSession', 'Custom']},
+                    Properties: {
+                        path: String
+                    },
+                    Custom: {
+                        className: String
+                    }
+                },
+                bucketNameSuffix: String,
+                clientConfiguration: {
+                    protocol: {type: String, enum: ['HTTP', 'HTTPS']},
+                    maxConnections: Number,
+                    userAgent: String,
+                    localAddress: String,
+                    proxyHost: String,
+                    proxyPort: Number,
+                    proxyUsername: String,
+                    proxyDomain: String,
+                    proxyWorkstation: String,
+                    retryPolicy: {
+                        kind: {
+                            type: String,
+                            enum: ['Default', 'DefaultMaxRetries', 'DynamoDB', 
'DynamoDBMaxRetries', 'Custom']
+                        },
+                        DefaultMaxRetries: {
+                            maxErrorRetry: Number
+                        },
+                        DynamoDBMaxRetries: {
+                            maxErrorRetry: Number
+                        },
+                        Custom: {
+                            retryCondition: String,
+                            backoffStrategy: String,
+                            maxErrorRetry: Number,
+                            honorMaxErrorRetryInClientConfig: Boolean
+                        }
+                    },
+                    maxErrorRetry: Number,
+                    socketTimeout: Number,
+                    connectionTimeout: Number,
+                    requestTimeout: Number,
+                    useReaper: Boolean,
+                    useGzip: Boolean,
+                    signerOverride: String,
+                    preemptiveBasicProxyAuth: Boolean,
+                    connectionTTL: Number,
+                    connectionMaxIdleMillis: Number,
+                    useTcpKeepAlive: Boolean,
+                    dnsResolver: String,
+                    responseMetadataCacheSize: Number,
+                    secureRandom: String
+                },
+                checkpointListener: String
+            },
+            JDBC: {
+                dataSourceBean: String,
+                dialect: {
+                    type: String,
+                    enum: ['Generic', 'Oracle', 'DB2', 'SQLServer', 'MySQL', 
'PostgreSQL', 'H2']
+                },
+                user: String,
+                checkpointTableName: String,
+                keyFieldName: String,
+                keyFieldType: String,
+                valueFieldName: String,
+                valueFieldType: String,
+                expireDateFieldName: String,
+                expireDateFieldType: String,
+                numberOfRetries: Number,
+                checkpointListener: String
+            },
+            Custom: {
+                className: String
+            }
+        }],
+        clientConnectorConfiguration: {
+            enabled: Boolean,
+            host: String,
+            port: Number,
+            portRange: Number,
+            socketSendBufferSize: Number,
+            socketReceiveBufferSize: Number,
+            tcpNoDelay: {type: Boolean, default: true},
+            maxOpenCursorsPerConnection: Number,
+            threadPoolSize: Number
+        },
+        loadBalancingSpi: [{
+            kind: {type: String, enum: ['RoundRobin', 'Adaptive', 
'WeightedRandom', 'Custom']},
+            RoundRobin: {
+                perTask: Boolean
+            },
+            Adaptive: {
+                loadProbe: {
+                    kind: {type: String, enum: ['Job', 'CPU', 
'ProcessingTime', 'Custom']},
+                    Job: {
+                        useAverage: Boolean
+                    },
+                    CPU: {
+                        useAverage: Boolean,
+                        useProcessors: Boolean,
+                        processorCoefficient: Number
+                    },
+                    ProcessingTime: {
+                        useAverage: Boolean
+                    },
+                    Custom: {
+                        className: String
+                    }
+                }
+            },
+            WeightedRandom: {
+                nodeWeight: Number,
+                useWeights: Boolean
+            },
+            Custom: {
+                className: String
+            }
+        }],
+        deploymentSpi: {
+            kind: {type: String, enum: ['URI', 'Local', 'Custom']},
+            URI: {
+                uriList: [String],
+                temporaryDirectoryPath: String,
+                scanners: [String],
+                listener: String,
+                checkMd5: Boolean,
+                encodeUri: Boolean
+            },
+            Local: {
+                listener: String
+            },
+            Custom: {
+                className: String
+            }
+        },
+        warmupClosure: String,
+        hadoopConfiguration: {
+            mapReducePlanner: {
+                kind: {type: String, enum: ['Weighted', 'Custom']},
+                Weighted: {
+                    localMapperWeight: Number,
+                    remoteMapperWeight: Number,
+                    localReducerWeight: Number,
+                    remoteReducerWeight: Number,
+                    preferLocalReducerThresholdWeight: Number
+                },
+                Custom: {
+                    className: String
+                }
+            },
+            finishedJobInfoTtl: Number,
+            maxParallelTasks: Number,
+            maxTaskQueueSize: Number,
+            nativeLibraryNames: [String]
+        },
+        serviceConfigurations: [{
+            name: String,
+            service: String,
+            maxPerNodeCount: Number,
+            totalCount: Number,
+            nodeFilter: {
+                kind: {type: String, enum: ['Default', 'Exclude', 'IGFS', 
'OnNodes', 'Custom']},
+                Exclude: {
+                    nodeId: String
+                },
+                IGFS: {
+                    igfs: {type: ObjectId, ref: 'Igfs'}
+                },
+                Custom: {
+                    className: String
+                }
+            },
+            cache: {type: ObjectId, ref: 'Cache'},
+            affinityKey: String
+        }],
+        cacheSanityCheckEnabled: {type: Boolean, default: true},
+        classLoader: String,
+        consistentId: String,
+        failureDetectionTimeout: Number,
+        clientFailureDetectionTimeout: Number,
+        workDirectory: String,
+        lateAffinityAssignment: Boolean,
+        utilityCacheKeepAliveTime: Number,
+        asyncCallbackPoolSize: Number,
+        dataStreamerThreadPoolSize: Number,
+        queryThreadPoolSize: Number,
+        stripedPoolSize: Number,
+        serviceThreadPoolSize: Number,
+        utilityCacheThreadPoolSize: Number,
+        executorConfiguration: [{
+            name: String,
+            size: Number
+        }],
+        dataStorageConfiguration: {
+            systemRegionInitialSize: Number,
+            systemRegionMaxSize: Number,
+            pageSize: Number,
+            concurrencyLevel: Number,
+            defaultDataRegionConfiguration: {
+                name: String,
+                initialSize: Number,
+                maxSize: Number,
+                swapPath: String,
+                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
+                evictionThreshold: Number,
+                emptyPagesPoolSize: Number,
+                metricsEnabled: Boolean,
+                metricsSubIntervalCount: Number,
+                metricsRateTimeInterval: Number,
+                persistenceEnabled: Boolean,
+                checkpointPageBufferSize: Number
+            },
+            dataRegionConfigurations: [{
+                name: String,
+                initialSize: Number,
+                maxSize: Number,
+                swapPath: String,
+                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
+                evictionThreshold: Number,
+                emptyPagesPoolSize: Number,
+                metricsEnabled: Boolean,
+                metricsSubIntervalCount: Number,
+                metricsRateTimeInterval: Number,
+                persistenceEnabled: Boolean,
+                checkpointPageBufferSize: Number
+            }],
+            storagePath: String,
+            metricsEnabled: Boolean,
+            alwaysWriteFullPages: Boolean,
+            checkpointFrequency: Number,
+            checkpointThreads: Number,
+            checkpointWriteOrder: {type: String, enum: ['RANDOM', 
'SEQUENTIAL']},
+            walPath: String,
+            walArchivePath: String,
+            walMode: {type: String, enum: ['DEFAULT', 'LOG_ONLY', 
'BACKGROUND', 'NONE']},
+            walSegments: Number,
+            walSegmentSize: Number,
+            walHistorySize: Number,
+            walFlushFrequency: Number,
+            walFsyncDelayNanos: Number,
+            walRecordIteratorBufferSize: Number,
+            lockWaitTime: Number,
+            walBufferSize: Number,
+            walThreadLocalBufferSize: Number,
+            metricsSubIntervalCount: Number,
+            metricsRateTimeInterval: Number,
+            fileIOFactory: {type: String, enum: ['RANDOM', 'ASYNC']},
+            walAutoArchiveAfterInactivity: Number,
+            writeThrottlingEnabled: Boolean,
+            walCompactionEnabled: Boolean
+        },
+        memoryConfiguration: {
+            systemCacheInitialSize: Number,
+            systemCacheMaxSize: Number,
+            pageSize: Number,
+            concurrencyLevel: Number,
+            defaultMemoryPolicyName: String,
+            defaultMemoryPolicySize: Number,
+            memoryPolicies: [{
+                name: String,
+                initialSize: Number,
+                maxSize: Number,
+                swapFilePath: String,
+                pageEvictionMode: {type: String, enum: ['DISABLED', 
'RANDOM_LRU', 'RANDOM_2_LRU']},
+                evictionThreshold: Number,
+                emptyPagesPoolSize: Number,
+                metricsEnabled: Boolean,
+                subIntervals: Number,
+                rateTimeInterval: Number
+            }]
+        },
+        longQueryWarningTimeout: Number,
+        sqlConnectorConfiguration: {
+            enabled: Boolean,
+            host: String,
+            port: Number,
+            portRange: Number,
+            socketSendBufferSize: Number,
+            socketReceiveBufferSize: Number,
+            tcpNoDelay: {type: Boolean, default: true},
+            maxOpenCursorsPerConnection: Number,
+            threadPoolSize: Number
+        },
+        persistenceStoreConfiguration: {
+            enabled: Boolean,
+            persistentStorePath: String,
+            metricsEnabled: Boolean,
+            alwaysWriteFullPages: Boolean,
+            checkpointingFrequency: Number,
+            checkpointingPageBufferSize: Number,
+            checkpointingThreads: Number,
+            walStorePath: String,
+            walArchivePath: String,
+            walMode: {type: String, enum: ['DEFAULT', 'LOG_ONLY', 
'BACKGROUND', 'NONE']},
+            walSegments: Number,
+            walSegmentSize: Number,
+            walHistorySize: Number,
+            walFlushFrequency: Number,
+            walFsyncDelayNanos: Number,
+            walRecordIteratorBufferSize: Number,
+            lockWaitTime: Number,
+            rateTimeInterval: Number,
+            tlbSize: Number,
+            subIntervals: Number
+        }
+    });
+
+    Cluster.index({name: 1, space: 1}, {unique: true});
+
+    // Define Notebook schema.
+    const Notebook = new Schema({
+        space: {type: ObjectId, ref: 'Space', index: true, required: true},
+        name: String,
+        expandedParagraphs: [Number],
+        paragraphs: [{
+            name: String,
+            query: String,
+            editor: Boolean,
+            result: {type: String, enum: ['none', 'table', 'bar', 'pie', 
'line', 'area']},
+            pageSize: Number,
+            timeLineSpan: String,
+            maxPages: Number,
+            hideSystemColumns: Boolean,
+            cacheName: String,
+            useAsDefaultSchema: Boolean,
+            chartsOptions: {barChart: {stacked: Boolean}, areaChart: {style: 
String}},
+            rate: {
+                value: Number,
+                unit: Number
+            },
+            qryType: String,
+            nonCollocatedJoins: {type: Boolean, default: false},
+            enforceJoinOrder: {type: Boolean, default: false},
+            lazy: {type: Boolean, default: false}
+        }]
+    });
+
+    Notebook.index({name: 1, space: 1}, {unique: true});
+
+    // Define Activities schema.
+    const Activities = new Schema({
+        owner: {type: ObjectId, ref: 'Account'},
+        date: Date,
+        group: String,
+        action: String,
+        amount: {type: Number, default: 0}
+    });
+
+    Activities.index({owner: 1, group: 1, action: 1, date: 1}, {unique: true});
+
+    // Define Notifications schema.
+    const Notifications = new Schema({
+        owner: {type: ObjectId, ref: 'Account'},
+        date: Date,
+        message: String,
+        isShown: Boolean
+    });
+
+    return {
+        Space,
+        Account,
+        DomainModel,
+        Cache,
+        Igfs,
+        Cluster,
+        Notebook,
+        Activities,
+        Notifications
+    };
+};

http://git-wip-us.apache.org/repos/asf/ignite/blob/71db7079/modules/web-console/backend/services/users.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/services/users.js 
b/modules/web-console/backend/services/users.js
index 93e752f..43bceda 100644
--- a/modules/web-console/backend/services/users.js
+++ b/modules/web-console/backend/services/users.js
@@ -135,6 +135,7 @@ module.exports.factory = (errors, settings, mongo, 
spacesService, mailsService,
 
         /**
          * Get list of user accounts and summary information.
+         *
          * @returns {mongo.Account[]} - returns all accounts with counters 
object
          */
         static list(params) {

Reply via email to