You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2019/04/05 14:04:25 UTC

[ignite] branch master updated: IGNITE-11387 Web console: Actualized cluster configuration.

This is an automated email from the ASF dual-hosted git repository.

akuznetsov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new cf6ce6c  IGNITE-11387 Web console: Actualized cluster configuration.
cf6ce6c is described below

commit cf6ce6cfd97619e74b3e89cab3fb157d43db8c07
Author: Vasiliy Sisko <vs...@gridgain.com>
AuthorDate: Fri Apr 5 21:04:08 2019 +0700

    IGNITE-11387 Web console: Actualized cluster configuration.
---
 modules/web-console/backend/app/schemas.js         | 11 +++
 .../components/cluster-edit-form/template.tpl.pug  |  4 ++
 .../cluster-edit-form/templates/encryption.pug     | 81 ++++++++++++++++++++++
 .../cluster-edit-form/templates/mvcc.pug           |  4 +-
 .../generator/generator/AbstractTransformer.js     |  5 ++
 .../generator/generator/ConfigurationGenerator.js  | 41 +++++++++++
 .../generator/defaults/Cluster.service.js          |  6 ++
 .../WebConsoleConfigurationSelfTest.java           |  8 +++
 8 files changed, 158 insertions(+), 2 deletions(-)

diff --git a/modules/web-console/backend/app/schemas.js b/modules/web-console/backend/app/schemas.js
index 3e62a3d..dafdc60 100644
--- a/modules/web-console/backend/app/schemas.js
+++ b/modules/web-console/backend/app/schemas.js
@@ -1214,6 +1214,17 @@ module.exports.factory = function(mongoose) {
             subIntervals: Number,
             walAutoArchiveAfterInactivity: Number
         },
+        encryptionSpi: {
+            kind: {type: String, enum: ['Noop', 'Keystore', 'Custom']},
+            Keystore: {
+                keySize: Number,
+                masterKeyName: String,
+                keyStorePath: String
+            },
+            Custom: {
+                className: String
+            }
+        },
         mvccVacuumThreadCount: Number,
         mvccVacuumFrequency: Number,
         authenticationEnabled: Boolean,
diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/template.tpl.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/template.tpl.pug
index e30cfdb..008fd97 100644
--- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/template.tpl.pug
+++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/template.tpl.pug
@@ -37,6 +37,10 @@ form(id='cluster' name='ui.inputForm' novalidate)
         include ./templates/data-storage
 
         include ./templates/discovery
+
+        //- Since ignite 2.7
+        include ./templates/encryption
+
         include ./templates/events
         include ./templates/failover
         include ./templates/hadoop
diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/encryption.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/encryption.pug
new file mode 100644
index 0000000..102453c
--- /dev/null
+++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/encryption.pug
@@ -0,0 +1,81 @@
+//-
+    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.
+
+include /app/helpers/jade/mixins
+include /app/configuration/mixins
+
+-var form = 'encryption'
+-var model = '$ctrl.clonedCluster.encryptionSpi'
+
+panel-collapsible(ng-show='$ctrl.available("2.7.0")' ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Encryption
+    panel-description Encryption features for an Ignite
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                +form-field__dropdown({
+                    label: 'Encryption SPI:',
+                    model: `${model}.kind`,
+                    name: '"encryptionSpi"',
+                    placeholder: 'Disabled',
+                    options: '[\
+                            {value: null, label: "Disabled"},\
+                            {value: "Keystore", label: "Keystore"},\
+                            {value: "Custom", label: "Custom"}\
+                        ]',
+                    tip: 'Provides an ability to save an intermediate job state\
+                        <ul>\
+                            <li>Disabled - Encryption disabled</li>\
+                            <li>Keystore - Base on JDK provided cipher algorithm implementations</li>\
+                            <li>Custom - Custom encryption SPI implementation</li>\
+                        </ul>'
+                })
+            .pc-form-grid-col-60(ng-if-start=`${model}.kind === "Keystore"`)
+                +form-field__text({
+                    label: 'Key store path:',
+                    model: `${model}.Keystore.keyStorePath`,
+                    name: '"EncryptionKeyStorePath"',
+                    placeholder: 'Path to master key store file',
+                    tip: 'Path to master key store file'
+                })
+            .pc-form-grid-col-60
+                +form-field__number({
+                    label: 'Key size:',
+                    model: `${model}.Keystore.keySize`,
+                    name: '"EncryptionKeySize"',
+                    placeholder: '256',
+                    min: '1',
+                    tip: 'Encryption key size'
+                })
+            .pc-form-grid-col-60(ng-if-end)
+                +form-field__text({
+                    label: 'Master key name:',
+                    model: `${model}.Keystore.masterKeyName`,
+                    name: '"EncryptionMasterKeyName"',
+                    placeholder: 'ignite.master.key',
+                    tip: 'Mater key name'
+                })
+            .pc-form-grid-col-60(ng-if=`${model}.kind === "Custom"`)
+                +form-field__java-class({
+                    label: 'Class:',
+                    model: `${model}.Custom.className`,
+                    name: '"EncryptionClassName"',
+                    required: true,
+                    tip: 'Custom encryption SPI implementation class name',
+                    validationActive: true
+                })
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterEncryption')
diff --git a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/mvcc.pug b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/mvcc.pug
index 213b524..17e8b21 100644
--- a/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/mvcc.pug
+++ b/modules/web-console/frontend/app/configuration/components/page-configure-advanced/components/cluster-edit-form/templates/mvcc.pug
@@ -25,7 +25,7 @@ panel-collapsible(ng-show='$ctrl.available("2.7.0")' ng-form=form on-open=`ui.lo
     panel-description Multiversion concurrency control (MVCC) configuration.
     panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
         .pca-form-column-6.pc-form-grid-row
-            .pc-form-grid-col-30(ng-if='$ctrl.available("2.1.0")')
+            .pc-form-grid-col-30
                 +form-field__number({
                     label: 'Vacuum thread pool size:',
                     model: `${model}.mvccVacuumThreadCount`,
@@ -34,7 +34,7 @@ panel-collapsible(ng-show='$ctrl.available("2.7.0")' ng-form=form on-open=`ui.lo
                     min: '0',
                     tip: 'Number of MVCC vacuum cleanup threads'
                 })
-            .pc-form-grid-col-30(ng-if='$ctrl.available("2.1.0")')
+            .pc-form-grid-col-30
                 +form-field__number({
                     label: 'Vacuum intervals:',
                     model: `${model}.mvccVacuumFrequency`,
diff --git a/modules/web-console/frontend/app/configuration/generator/generator/AbstractTransformer.js b/modules/web-console/frontend/app/configuration/generator/generator/AbstractTransformer.js
index ac2d8db..e765379 100644
--- a/modules/web-console/frontend/app/configuration/generator/generator/AbstractTransformer.js
+++ b/modules/web-console/frontend/app/configuration/generator/generator/AbstractTransformer.js
@@ -160,6 +160,11 @@ export default class AbstractTransformer {
         return this.toSection(this.generator.clusterMvcc(cluster, available));
     }
 
+    // Generate encryption group.
+    static clusterEncryption(encryption, available) {
+        return this.toSection(this.generator.clusterEncryption(encryption, available));
+    }
+
     // Generate marshaller group.
     static clusterMarshaller(cluster, available) {
         return this.toSection(this.generator.clusterMarshaller(cluster, available));
diff --git a/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js b/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
index 587dae6..0e9e099 100644
--- a/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
+++ b/modules/web-console/frontend/app/configuration/generator/generator/ConfigurationGenerator.js
@@ -99,6 +99,7 @@ export default class IgniteConfigurationGenerator {
             this.clusterDataStorageConfiguration(cluster, available, cfg);
 
         this.clusterDeployment(cluster, available, cfg);
+        this.clusterEncryption(cluster.encryptionSpi, available, cfg);
         this.clusterEvents(cluster, available, cfg);
         this.clusterFailover(cluster, available, cfg);
         this.clusterHadoop(cluster.hadoopConfiguration, cfg);
@@ -1162,6 +1163,46 @@ export default class IgniteConfigurationGenerator {
     }
 
     // Generate events group.
+    static clusterEncryption(encryption, available, cfg = this.igniteConfigurationBean(cluster)) {
+        if (!available('2.7.0'))
+            return cfg;
+
+        let bean;
+
+        switch (_.get(encryption, 'kind')) {
+            case 'Keystore':
+                bean = new Bean('org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi', 'encryptionSpi',
+                    encryption.Keystore, clusterDflts.encryptionSpi.Keystore)
+                    .stringProperty('keyStorePath');
+
+                if (nonEmpty(bean.valueOf('keyStorePath')))
+                    bean.propertyChar('keyStorePassword', 'encryption.key.storage.password', 'YOUR_ENCRYPTION_KEY_STORAGE_PASSWORD');
+
+
+                bean.intProperty('keySize')
+                    .stringProperty('masterKeyName');
+
+                break;
+
+            case 'Custom':
+                const clsName = _.get(encryption, 'Custom.className');
+
+                if (clsName)
+                    bean = new EmptyBean(clsName);
+
+                break;
+
+            default:
+                // No-op.
+        }
+
+        if (bean)
+            cfg.beanProperty('encryptionSpi', bean);
+
+        return cfg;
+    }
+
+    // Generate events group.
     static clusterEvents(cluster, available, cfg = this.igniteConfigurationBean(cluster)) {
         const eventStorage = cluster.eventStorage;
 
diff --git a/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js b/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
index fc69e32..54e9b3d 100644
--- a/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
+++ b/modules/web-console/frontend/app/configuration/generator/generator/defaults/Cluster.service.js
@@ -443,6 +443,12 @@ const DFLT_CLUSTER = {
         useIgniteSslContextFactory: true,
         sslClientAuth: false
     },
+    encryptionSpi: {
+        Keystore: {
+            keySize: 256,
+            masterKeyName: 'ignite.master.key'
+        }
+    },
     authenticationEnabled: false,
     sqlQueryHistorySize: 1000,
     allSegmentationResolversPassRequired: true,
diff --git a/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java b/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
index ebfd833..3365778 100644
--- a/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
+++ b/modules/web-console/src/test/java/org/apache/ignite/console/configuration/WebConsoleConfigurationSelfTest.java
@@ -75,6 +75,7 @@ import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
 import org.apache.ignite.spi.deployment.local.LocalDeploymentSpi;
 import org.apache.ignite.spi.deployment.uri.UriDeploymentSpi;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi;
 import org.apache.ignite.spi.eventstorage.memory.MemoryEventStorageSpi;
 import org.apache.ignite.spi.failover.always.AlwaysFailoverSpi;
 import org.apache.ignite.spi.failover.jobstealing.JobStealingFailoverSpi;
@@ -193,6 +194,7 @@ public class WebConsoleConfigurationSelfTest {
         igniteCfgProps.add("pluginConfigurations");
         igniteCfgProps.add("mvccVacuumFrequency");
         igniteCfgProps.add("mvccVacuumThreadCount");
+        igniteCfgProps.add("encryptionSpi");
         igniteCfgProps.add("authenticationEnabled");
         igniteCfgProps.add("sqlQueryHistorySize");
         igniteCfgProps.add("lifecycleBeans");
@@ -233,6 +235,12 @@ public class WebConsoleConfigurationSelfTest {
         metadata.put(IgniteConfiguration.class,
             new MetadataInfo(igniteCfgProps, igniteCfgPropsDep, igniteCfgPropsExcl));
 
+        Set<String> encriptionSpiProps = new HashSet<>();
+        encriptionSpiProps.add("keySize");
+        encriptionSpiProps.add("masterKeyName");
+        encriptionSpiProps.add("keyStorePath");
+        metadata.put(KeystoreEncryptionSpi.class, new MetadataInfo(encriptionSpiProps, EMPTY_FIELDS, SPI_EXCLUDED_FIELDS));
+
         Set<String> cacheKeyCfgProps = new HashSet<>();
         cacheKeyCfgProps.add("typeName");
         cacheKeyCfgProps.add("affinityKeyFieldName");