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 2018/04/12 04:24:07 UTC

[09/16] ignite git commit: IGNITE-7996 Move configuration form templates.

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/connector.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/connector.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/connector.pug
new file mode 100644
index 0000000..76c5016
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/connector.pug
@@ -0,0 +1,100 @@
+//-
+    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
+
+-var form = 'connector'
+-var model = '$ctrl.clonedCluster.connector'
+-var enabled = model + '.enabled'
+-var sslEnabled = enabled + ' && ' + model + '.sslEnabled'
+
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Connector configuration
+    panel-description
+        | Configure HTTP REST configuration to enable HTTP server features. 
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/rest-api#general-configuration" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                +checkbox('Enabled', enabled, '"restEnabled"', 'Flag indicating whether to configure connector configuration')
+            .pc-form-grid-col-60
+                +text-enabled('Jetty configuration path:', `${model}.jettyPath`, '"connectorJettyPath"', enabled, 'false', 'Input path to Jetty configuration',
+                    'Path, either absolute or relative to IGNITE_HOME, to Jetty XML configuration file<br/>\
+                    Jetty is used to support REST over HTTP protocol for accessing Ignite APIs remotely<br/>\
+                    If not provided, Jetty instance with default configuration will be started picking IgniteSystemProperties.IGNITE_JETTY_HOST and IgniteSystemProperties.IGNITE_JETTY_PORT as host and port respectively')
+            .pc-form-grid-col-20
+                +text-ip-address('TCP host:', `${model}.host`, '"connectorHost"', enabled, 'IgniteConfiguration#getLocalHost()',
+                    'Host for TCP binary protocol server<br/>\
+                    This can be either an IP address or a domain name<br/>\
+                    If not defined, system - wide local address will be used IgniteConfiguration#getLocalHost()<br/>\
+                    You can also use "0.0.0.0" value to bind to all locally - available IP addresses')
+            .pc-form-grid-col-20
+                +number-min-max('TCP port:', `${model}.port`, '"connectorPort"', enabled, '11211', '1024', '65535', 'Port for TCP binary protocol server')
+            .pc-form-grid-col-20
+                +number('TCP port range:', `${model}.portRange`, '"connectorPortRange"', enabled, '100', '1', 'Number of ports for TCP binary protocol server to try if configured port is already in use')
+            .pc-form-grid-col-60
+                +number('Idle query cursor timeout:', `${model}.idleQueryCursorTimeout`, '"connectorIdleQueryCursorTimeout"', enabled, '600000', '0',
+                    'Reject open query cursors that is not used timeout<br/>\
+                    If no fetch query request come within idle timeout, it will be removed on next check for old query cursors')
+            .pc-form-grid-col-60
+                +number('Idle query cursor check frequency:', `${model}.idleQueryCursorCheckFrequency`, '"connectorIdleQueryCursorCheckFrequency"', enabled, '60000', '0',
+                    'Idle query cursors check frequency<br/>\
+                    This setting is used to reject open query cursors that is not used')
+            .pc-form-grid-col-30
+                +number('Idle timeout:', `${model}.idleTimeout`, '"connectorIdleTimeout"', enabled, '7000', '0',
+                    'Idle timeout for REST server<br/>\
+                    This setting is used to reject half - opened sockets<br/>\
+                    If no packets come within idle timeout, the connection is closed')
+            .pc-form-grid-col-30
+                +number('Receive buffer size:', `${model}.receiveBufferSize`, '"connectorReceiveBufferSize"', enabled, '32768', '0', 'REST TCP server receive buffer size')
+            .pc-form-grid-col-30
+                +number('Send buffer size:', `${model}.sendBufferSize`, '"connectorSendBufferSize"', enabled, '32768', '0', 'REST TCP server send buffer size')
+            .pc-form-grid-col-30
+                +number('Send queue limit:', `${model}.sendQueueLimit`, '"connectorSendQueueLimit"', enabled, 'unlimited', '0',
+                    'REST TCP server send queue limit<br/>\
+                    If the limit exceeds, all successive writes will block until the queue has enough capacity')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Direct buffer', `${model}.directBuffer`, '"connectorDirectBuffer"', enabled,
+                    'Flag indicating whether REST TCP server should use direct buffers<br/>\
+                    A direct buffer is a buffer that is allocated and accessed using native system calls, without using JVM heap<br/>\
+                    Enabling direct buffer may improve performance and avoid memory issues(long GC pauses due to huge buffer size)')
+            .pc-form-grid-col-60
+                +checkbox-enabled('TCP_NODELAY option', `${model}.noDelay`, '"connectorNoDelay"', enabled,
+                    'Flag indicating whether TCP_NODELAY option should be set for accepted client connections<br/>\
+                    Setting this option reduces network latency and should be enabled in majority of cases<br/>\
+                    For more information, see Socket#setTcpNoDelay(boolean)')
+            .pc-form-grid-col-30
+                +number('Selector count:', `${model}.selectorCount`, '"connectorSelectorCount"', enabled, 'min(4, availableProcessors)', '1',
+                    'Number of selector threads in REST TCP server<br/>\
+                    Higher value for this parameter may increase throughput, but also increases context switching')
+            .pc-form-grid-col-30
+                +number('Thread pool size:', `${model}.threadPoolSize`, '"connectorThreadPoolSize"', enabled, 'max(8, availableProcessors) * 2', '1',
+                    'Thread pool size to use for processing of client messages (REST requests)')
+            .pc-form-grid-col-60
+                +java-class('Message interceptor:', `${model}.messageInterceptor`, '"connectorMessageInterceptor"', enabled, 'false',
+                    'Interceptor allows to transform all objects exchanged via REST protocol<br/>\
+                    For example if you use custom serialisation on client you can write interceptor to transform binary representations received from client to Java objects and later access them from java code directly')
+            .pc-form-grid-col-60
+                +text-enabled('Secret key:', `${model}.secretKey`, '"connectorSecretKey"', enabled, 'false', 'Specify to enable authentication', 'Secret key to authenticate REST requests')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Enable SSL', `${model}.sslEnabled`, '"connectorSslEnabled"', enabled, 'Enables/disables SSL for REST TCP binary protocol')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Enable SSL client auth', `${model}.sslClientAuth`, '"connectorSslClientAuth"', sslEnabled, 'Flag indicating whether or not SSL client authentication is required')
+            .pc-form-grid-col-60
+                +java-class('SSL factory:', `${model}.sslFactory`, '"connectorSslFactory"', sslEnabled, sslEnabled,
+                    'Instance of Factory that will be used to create an instance of SSLContext for Secure Socket Layer on TCP binary protocol')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterConnector')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
new file mode 100644
index 0000000..c9fea56
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/data-storage.pug
@@ -0,0 +1,301 @@
+//-
+    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
+
+-var form = 'dataStorageConfiguration'
+-var model = '$ctrl.clonedCluster.dataStorageConfiguration'
+-var dfltRegionModel = model + '.defaultDataRegionConfiguration'
+-var dataRegionConfigurations = model + '.dataRegionConfigurations'
+
+mixin data-region-form({modelAt, namePlaceholder, dataRegionsAt})
+    .pc-form-grid-col-60
+        +sane-ignite-form-field-text({
+            label: 'Name:',
+            model: `${modelAt}.name`,
+            name: '"name"',
+            placeholder: namePlaceholder,
+        })(
+            ng-model-options='{allowInvalid: true}'
+
+            pc-not-in-collection='::$ctrl.Clusters.dataRegion.name.invalidValues'
+            ignite-unique=dataRegionsAt
+            ignite-unique-property='name'
+            ignite-unique-skip=`["_id", ${modelAt}]`
+        )
+            +form-field-feedback(_, 'notInCollection', '{{::$ctrl.Clusters.dataRegion.name.invalidValues[0]}} is reserved for internal use')
+            +form-field-feedback(_, 'igniteUnique', 'Name should be unique')
+
+    .pc-form-grid-col-30
+        pc-form-field-size(
+            label='Initial size:'
+            ng-model=`${modelAt}.initialSize`
+            name='initialSize'
+            placeholder='{{ $ctrl.Clusters.dataRegion.initialSize.default / _drISScale.value }}'
+            min='{{ ::$ctrl.Clusters.dataRegion.initialSize.min }}'
+            on-scale-change='_drISScale = $event'
+        )
+
+    .pc-form-grid-col-30
+        pc-form-field-size(
+            ng-model=`${modelAt}.maxSize`
+            ng-model-options='{allowInvalid: true}'
+            name='maxSize'
+            label='Maximum size:'
+            placeholder='{{ ::$ctrl.Clusters.dataRegion.maxSize.default }}'
+            min=`{{ $ctrl.Clusters.dataRegion.maxSize.min(${modelAt}) }}`
+        )
+
+    .pc-form-grid-col-60
+        +text('Swap file path:', `${modelAt}.swapFilePath`, '"swapFilePath"', 'false', 'Input swap file path', 'An optional path to a memory mapped file for this data region')
+        
+    .pc-form-grid-col-60
+        +number('Checkpoint page buffer:', `${modelAt}.checkpointPageBufferSize`, '"checkpointPageBufferSize"', 'true', '0', '0', 'Amount of memory allocated for a checkpoint temporary buffer in bytes')
+
+    .pc-form-grid-col-60
+        +dropdown('Eviction mode:', `${modelAt}.pageEvictionMode`, '"pageEvictionMode"', 'true', 'DISABLED',
+        '[\
+            {value: "DISABLED", label: "DISABLED"},\
+            {value: "RANDOM_LRU", label: "RANDOM_LRU"},\
+            {value: "RANDOM_2_LRU", label: "RANDOM_2_LRU"}\
+        ]',
+        `An algorithm for memory pages eviction
+        <ul>
+            <li>DISABLED - Eviction is disabled</li>
+            <li>RANDOM_LRU - Once a memory region defined by a data region is configured, an off-heap array is allocated to track last usage timestamp for every individual data page</li>
+            <li>RANDOM_2_LRU - Differs from Random - LRU only in a way that two latest access timestamps are stored for every data page</li>
+        </ul>`)
+
+    .pc-form-grid-col-30
+        +sane-ignite-form-field-number({
+            label: 'Eviction threshold:',
+            model: `${modelAt}.evictionThreshold`,
+            name: '"evictionThreshold"',
+            placeholder: '{{ ::$ctrl.Clusters.dataRegion.evictionThreshold.default }}',
+            min: '{{ ::$ctrl.Clusters.dataRegion.evictionThreshold.min }}',
+            max: '{{ ::$ctrl.Clusters.dataRegion.evictionThreshold.max }}',
+            step: '{{ ::$ctrl.Clusters.dataRegion.evictionThreshold.step }}',
+            tip: 'A threshold for memory pages eviction initiation'
+        })
+
+    .pc-form-grid-col-30
+        +sane-ignite-form-field-number({
+            label: 'Empty pages pool size:',
+            model: `${modelAt}.emptyPagesPoolSize`,
+            name: '"emptyPagesPoolSize"',
+            placeholder: '{{ ::$ctrl.Clusters.dataRegion.emptyPagesPoolSize.default }}',
+            min: '{{ ::$ctrl.Clusters.dataRegion.emptyPagesPoolSize.min }}',
+            max: `{{ $ctrl.Clusters.dataRegion.emptyPagesPoolSize.max($ctrl.clonedCluster, ${modelAt}) }}`,
+            tip: 'The minimal number of empty pages to be present in reuse lists for this data region'
+        })
+
+    .pc-form-grid-col-30
+        +sane-ignite-form-field-number({
+            label: 'Metrics sub interval count:',
+            model: `${modelAt}.subIntervals`,
+            name: '"subIntervals"',
+            placeholder: '{{ ::$ctrl.Clusters.dataRegion.subIntervals.default }}',
+            min: '{{ ::$ctrl.Clusters.dataRegion.subIntervals.min }}',
+            step: '{{ ::$ctrl.Clusters.dataRegion.subIntervals.step }}',
+            tip: 'A number of sub-intervals the whole rate time interval will be split into to calculate allocation and eviction rates'
+        })
+
+    .pc-form-grid-col-30
+        pc-form-field-size(
+            ng-model=`${modelAt}.rateTimeInterval`
+            ng-model-options='{allowInvalid: true}'
+            name='rateTimeInterval'
+            size-type='seconds'
+            label='Metrics rate time interval:'
+            placeholder='{{ $ctrl.Clusters.dataRegion.rateTimeInterval.default / _rateTimeIntervalScale.value }}'
+            min=`{{ ::$ctrl.Clusters.dataRegion.rateTimeInterval.min }}`
+            tip='Time interval for allocation rate and eviction rate monitoring purposes'
+            on-scale-change='_rateTimeIntervalScale = $event'
+            size-scale-label='s'
+        )
+            
+    .pc-form-grid-col-60
+        +checkbox('Metrics enabled', `${modelAt}.metricsEnabled`, '"MemoryPolicyMetricsEnabled"',
+        'Whether memory metrics are enabled by default on node startup')
+
+    .pc-form-grid-col-60
+        +checkbox('Persistence enabled', `${modelAt}.persistenceEnabled`, '"RegionPersistenceEnabled" + $index',
+        'Enable Ignite Native Persistence')
+
+panel-collapsible(ng-show='$ctrl.available("2.3.0")' ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Data storage configuration
+    panel-description
+        | Page memory is a manageable off-heap based memory architecture that is split into pages of fixed size. 
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/distributed-persistent-store" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`$ctrl.available("2.3.0") && ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-30
+                +sane-ignite-form-field-dropdown({
+                    label: 'Page size:',
+                    model: `${model}.pageSize`,
+                    name: '"DataStorageConfigurationPageSize"',
+                    options: `$ctrl.Clusters.dataStorageConfiguration.pageSize.values`,
+                    tip: 'Every memory region is split on pages of fixed size'
+                })
+            .pc-form-grid-col-30
+                +number('Concurrency level:', model + '.concurrencyLevel', '"DataStorageConfigurationConcurrencyLevel"',
+                'true', 'availableProcessors', '2', 'The number of concurrent segments in Ignite internal page mapping tables')
+            .pc-form-grid-col-60.pc-form-group__text-title
+                span System region
+            .pc-form-group.pc-form-grid-row
+                .pc-form-grid-col-30
+                    pc-form-field-size(
+                        label='Initial size:'
+                        ng-model=`${model}.systemRegionInitialSize`
+                        name='DataStorageSystemRegionInitialSize'
+                        placeholder='{{ $ctrl.Clusters.dataStorageConfiguration.systemRegionInitialSize.default / systemRegionInitialSizeScale.value }}'
+                        min='{{ ::$ctrl.Clusters.dataStorageConfiguration.systemRegionInitialSize.min }}'
+                        tip='Initial size of a data region reserved for system cache'
+                        on-scale-change='systemRegionInitialSizeScale = $event'
+                    )
+                .pc-form-grid-col-30
+                    pc-form-field-size(
+                        label='Max size:'
+                        ng-model=`${model}.systemRegionMaxSize`
+                        name='DataStorageSystemRegionMaxSize'
+                        placeholder='{{ $ctrl.Clusters.dataStorageConfiguration.systemRegionMaxSize.default / systemRegionMaxSizeScale.value }}'
+                        min='{{ $ctrl.Clusters.dataStorageConfiguration.systemRegionMaxSize.min($ctrl.clonedCluster) }}'
+                        tip='Maximum data region size reserved for system cache'
+                        on-scale-change='systemRegionMaxSizeScale = $event'
+                    )
+            .pc-form-grid-col-60.pc-form-group__text-title
+                span Default data region
+            .pc-form-group.pc-form-grid-row
+                +data-region-form({
+                    modelAt: dfltRegionModel,
+                    namePlaceholder: '{{ ::$ctrl.Clusters.dataRegion.name.default }}',
+                    dataRegionsAt: dataRegionConfigurations
+                })
+            .pc-form-grid-col-60
+                .ignite-form-field
+                    .ignite-form-field__label Data region configurations
+                    .ignite-form-field__control
+                        list-editable(name='dataRegionConfigurations' ng-model=dataRegionConfigurations)
+                            list-editable-item-edit.pc-form-grid-row
+                                - form = '$parent.form'
+                                +data-region-form({
+                                    modelAt: '$item',
+                                    namePlaceholder: 'Data region name',
+                                    dataRegionsAt: dataRegionConfigurations
+                                })
+                                - form = 'dataStorageConfiguration'
+                            list-editable-no-items
+                                list-editable-add-item-button(
+                                    add-item=`$ctrl.Clusters.addDataRegionConfiguration($ctrl.clonedCluster)`
+                                    label-single='data region configuration'
+                                    label-multiple='data region configurations'
+                                )
+
+            .pc-form-grid-col-60
+                +text-enabled('Storage path:', `${model}.storagePath`, '"DataStoragePath"', 'true', 'false', 'db',
+                'Directory where index and partition files are stored')
+            .pc-form-grid-col-60
+                +number('Checkpoint frequency:', `${model}.checkpointFrequency`, '"DataStorageCheckpointFrequency"', 'true', '180000', '1',
+                'Frequency which is a minimal interval when the dirty pages will be written to the Persistent Store')
+            .pc-form-grid-col-20
+                +number('Checkpoint threads:', `${model}.checkpointThreads`, '"DataStorageCheckpointThreads"', 'true', '4', '1', 'A number of threads to use for the checkpoint purposes')
+            .pc-form-grid-col-20
+                +dropdown('Checkpoint write order:', `${model}.checkpointWriteOrder`, '"DataStorageCheckpointWriteOrder"', 'true', 'SEQUENTIAL',
+                '[\
+                    {value: "RANDOM", label: "RANDOM"},\
+                    {value: "SEQUENTIAL", label: "SEQUENTIAL"}\
+                ]',
+                'Order of writing pages to disk storage during checkpoint.\
+                <ul>\
+                    <li>RANDOM - Pages are written in order provided by checkpoint pages collection iterator</li>\
+                    <li>SEQUENTIAL - All checkpoint pages are collected into single list and sorted by page index</li>\
+                </ul>')
+            .pc-form-grid-col-20
+                +dropdown('WAL mode:', `${model}.walMode`, '"DataStorageWalMode"', 'true', 'DEFAULT',
+                '[\
+                    {value: "DEFAULT", label: "DEFAULT"},\
+                    {value: "LOG_ONLY", label: "LOG_ONLY"},\
+                    {value: "BACKGROUND", label: "BACKGROUND"},\
+                    {value: "NONE", label: "NONE"}\
+                ]',
+                'Type define behavior wal fsync.\
+                <ul>\
+                    <li>DEFAULT - full-sync disk writes</li>\
+                    <li>LOG_ONLY - flushes application buffers</li>\
+                    <li>BACKGROUND - does not force application&#39;s buffer flush</li>\
+                    <li>NONE - WAL is disabled</li>\
+                </ul>')
+            .pc-form-grid-col-60
+                +text-enabled('WAL path:', `${model}.walPath`, '"DataStorageWalPath"', 'true', 'false', 'db/wal', 'A path to the directory where WAL is stored')
+            .pc-form-grid-col-60
+                +text-enabled('WAL archive path:', `${model}.walArchivePath`, '"DataStorageWalArchivePath"', 'true', 'false', 'db/wal/archive', 'A path to the WAL archive directory')
+            .pc-form-grid-col-20
+                +number('WAL segments:', `${model}.walSegments`, '"DataStorageWalSegments"', 'true', '10', '1', 'A number of WAL segments to work with')
+            .pc-form-grid-col-20
+                +number('WAL segment size:', `${model}.walSegmentSize`, '"DataStorageWalSegmentSize"', 'true', '67108864', '0', 'Size of a WAL segment')
+            .pc-form-grid-col-20
+                +number('WAL history size:', `${model}.walHistorySize`, '"DataStorageWalHistorySize"', 'true', '20', '1', 'A total number of checkpoints to keep in the WAL history')
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
+                +number('WAL buffer size:', `${model}.walBufferSize`, '"DataStorageWalBufferSize"', 'true', 'WAL segment size / 4', '1',
+                'Size of WAL buffer')
+            .pc-form-grid-col-30
+                +number('WAL flush frequency:', `${model}.walFlushFrequency`, '"DataStorageWalFlushFrequency"', 'true', '2000', '1',
+                'How often will be fsync, in milliseconds. In background mode, exist thread which do fsync by timeout')
+            .pc-form-grid-col-30
+                +number('WAL fsync delay:', `${model}.walFsyncDelayNanos`, '"DataStorageWalFsyncDelay"', 'true', '1000', '1', 'WAL fsync delay, in nanoseconds')
+            .pc-form-grid-col-60
+                +number('WAL record iterator buffer size:', `${model}.walRecordIteratorBufferSize`, '"DataStorageWalRecordIteratorBufferSize"', 'true', '67108864', '1',
+                'How many bytes iterator read from disk(for one reading), during go ahead WAL')
+            .pc-form-grid-col-30
+                +number('Lock wait time:', `${model}.lockWaitTime`, '"DataStorageLockWaitTime"', 'true', '10000', '1',
+                'Time out in milliseconds, while wait and try get file lock for start persist manager')
+            .pc-form-grid-col-30
+                +number('WAL thread local buffer size:', `${model}.walThreadLocalBufferSize`, '"DataStorageWalThreadLocalBufferSize"', 'true', '131072', '1',
+                'Define size thread local buffer. Each thread which write to WAL have thread local buffer for serialize recode before write in WAL')
+            .pc-form-grid-col-30
+                +number('Metrics sub interval count:', `${model}.metricsSubIntervalCount`, '"DataStorageMetricsSubIntervalCount"', 'true', '5', '1',
+                'Number of sub - intervals the whole rate time interval will be split into to calculate rate - based metrics')
+            .pc-form-grid-col-30
+                +number('Metrics rate time interval:', `${model}.metricsRateTimeInterval`, '"DataStorageMetricsRateTimeInterval"', 'true', '60000', '1000',
+                'The length of the time interval for rate - based metrics. This interval defines a window over which hits will be tracked')
+            .pc-form-grid-col-30
+                +dropdown('File IO factory:', `${model}.fileIOFactory`, '"DataStorageFileIOFactory"', 'true', 'Default',
+                '[\
+                    {value: "RANDOM", label: "RANDOM"},\
+                    {value: "ASYNC", label: "ASYNC"},\
+                    {value: null, label: "Default"},\
+                ]',
+                'Order of writing pages to disk storage during checkpoint.\
+                <ul>\
+                    <li>RANDOM - Pages are written in order provided by checkpoint pages collection iterator</li>\
+                    <li>SEQUENTIAL - All checkpoint pages are collected into single list and sorted by page index</li>\
+                </ul>')
+            .pc-form-grid-col-30
+                +number('WAL auto archive after inactivity:', `${model}.walAutoArchiveAfterInactivity`, '"DataStorageWalAutoArchiveAfterInactivity"', 'true', '-1', '-1',
+                'Time in millis to run auto archiving segment after last record logging')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Metrics enabled', `${model}.metricsEnabled`, '"DataStorageMetricsEnabled"', 'true', 'Flag indicating whether persistence metrics collection is enabled')
+            .pc-form-grid-col-60
+                +checkbox-enabled('Always write full pages', `${model}.alwaysWriteFullPages`, '"DataStorageAlwaysWriteFullPages"', 'true', 'Flag indicating whether always write full pages')
+            .pc-form-grid-col-60
+                +checkbox('Write throttling enabled', `${model}.writeThrottlingEnabled`, '"DataStorageWriteThrottlingEnabled"',
+                'Throttle threads that generate dirty pages too fast during ongoing checkpoint')
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.4.0")')
+                +checkbox('Enable WAL compaction', `${model}.walCompactionEnabled`, '"DataStorageWalCompactionEnabled"',
+                'If true, system filters and compresses WAL archive in background')
+
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterDataStorageConfiguration')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/deployment.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/deployment.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/deployment.pug
new file mode 100644
index 0000000..1f0b615
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/deployment.pug
@@ -0,0 +1,192 @@
+//-
+    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
+
+-var form = 'deployment'
+-var model = '$ctrl.clonedCluster'
+-var modelDeployment = '$ctrl.clonedCluster.deploymentSpi'
+-var exclude = model + '.peerClassLoadingLocalClassPathExclude'
+-var enabled = '$ctrl.clonedCluster.peerClassLoadingEnabled'
+-var uriListModel = modelDeployment + '.URI.uriList'
+-var scannerModel = modelDeployment + '.URI.scanners'
+-var uriDeployment = modelDeployment + '.kind === "URI"'
+-var localDeployment = modelDeployment + '.kind === "Local"'
+-var customDeployment = modelDeployment + '.kind === "Custom"'
+
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Class deployment
+    panel-description
+        | Task and resources deployment in cluster.
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/deployment-modes" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60
+                +dropdown('Deployment mode:', `${model}.deploymentMode`, '"deploymentMode"', 'true', 'SHARED',
+                    '[\
+                        {value: "PRIVATE", label: "PRIVATE"},\
+                        {value: "ISOLATED", label: "ISOLATED"}, \
+                        {value: "SHARED", label: "SHARED"},\
+                        {value: "CONTINUOUS", label: "CONTINUOUS"}\
+                    ]',
+                    'Task classes and resources sharing mode<br/>\
+                    The following deployment modes are supported:\
+                    <ul>\
+                        <li>PRIVATE - in this mode deployed classes do not share resources</li>\
+                        <li>ISOLATED - in this mode tasks or classes deployed within the same class loader will share the same instances of resources</li>\
+                        <li>SHARED - same as ISOLATED, but now tasks from different master nodes with the same user version and same class loader will share the same class loader on remote nodes</li>\
+                        <li>CONTINUOUS - same as SHARED deployment mode, but resources will not be undeployed even after all master nodes left grid</li>\
+                    </ul>')
+            .pc-form-grid-col-60
+                +checkbox('Enable peer class loading', `${model}.peerClassLoadingEnabled`, '"peerClassLoadingEnabled"', 'Enables/disables peer class loading')
+            .pc-form-grid-col-60
+                +number('Missed resources cache size:', `${model}.peerClassLoadingMissedResourcesCacheSize`, '"peerClassLoadingMissedResourcesCacheSize"', enabled, '100', '0',
+                    'If size greater than 0, missed resources will be cached and next resource request ignored<br/>\
+                    If size is 0, then request for the resource will be sent to the remote node every time this resource is requested')
+            .pc-form-grid-col-60
+                +number('Pool size:', `${model}.peerClassLoadingThreadPoolSize`, '"peerClassLoadingThreadPoolSize"', enabled, '2', '1', 'Thread pool size to use for peer class loading')
+            .pc-form-grid-col-60
+                mixin clusters-deployment-packages
+                    .ignite-form-field
+                        -let items = exclude
+                        -var uniqueTip = 'Such package already exists!'
+
+                        list-editable(
+                            ng-model=items
+                            name='localClassPathExclude'
+                            list-editable-cols=`::[{
+                                name: "Local class path excludes:",
+                                tip: "List of packages from the system classpath that need to be peer-to-peer loaded from task originating node<br/>
+                                '*' is supported at the end of the package name which means that all sub-packages and their classes are included like in Java package import clause"
+                            }]`
+                            ng-disabled=enabledToDisabled(enabled)
+                        )
+                            list-editable-item-view {{ $item }}
+
+                            list-editable-item-edit
+                                +list-java-package-field('Package name', '$item', '"packageName"', items)(
+                                    ignite-auto-focus
+                                )
+                                    +unique-feedback('"packageName"', uniqueTip)
+
+                            list-editable-no-items
+                                list-editable-add-item-button(
+                                    add-item=`$editLast($ctrl.Clusters.addPeerClassLoadingLocalClassPathExclude(${model}))`
+                                    label-single='package'
+                                    label-multiple='packages'
+                                )
+
+                -var form = '$parent.form'
+                +clusters-deployment-packages
+                -var form = 'deployment'
+
+            //- Since ignite 2.0
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.0.0")')
+                +java-class('Class loader:', model + '.classLoader', '"classLoader"', 'true', 'false',
+                    'Loader which will be used for instantiating execution context')
+
+            .pc-form-grid-col-60
+                +dropdown('Deployment variant:', modelDeployment + '.kind', '"deploymentKind"', 'true', 'Default',
+                    '[\
+                        {value: "URI", label: "URI"},\
+                        {value: "Local", label: "Local"}, \
+                        {value: "Custom", label: "Custom"},\
+                        {value: null, label: "Default"}\
+                    ]',
+                    'Grid deployment SPI is in charge of deploying tasks and classes from different sources:\
+                    <ul>\
+                        <li>URI - Deploy tasks from different sources like file system folders, email and HTTP</li>\
+                        <li>Local - Only within VM deployment on local node</li>\
+                        <li>Custom - Custom implementation of DeploymentSpi</li>\
+                        <li>Default - Default configuration of LocalDeploymentSpi will be used</li>\
+                    </ul>')
+            .pc-form-group(ng-show=uriDeployment).pc-form-grid-row
+                .pc-form-grid-col-60
+                    mixin clusters-deployment-uri
+                        .ignite-form-field
+                            -let items = uriListModel
+                            -var uniqueTip = 'Such URI already configured!'
+
+                            list-editable(
+                                ng-model=items
+                                name='uriList'
+                                list-editable-cols=`::[{
+                                    name: "URI list:",
+                                    tip: "List of URI which point to GAR file and which should be scanned by SPI for the new tasks"
+                                }]`
+                            )
+                                list-editable-item-view {{ $item }}
+
+                                list-editable-item-edit
+                                    +list-url-field('URL', '$item', '"url"', items)
+                                        +unique-feedback('"url"', uniqueTip)
+
+                                list-editable-no-items
+                                    list-editable-add-item-button(
+                                        add-item=`$editLast((${items} = ${items} || []).push(''))`
+                                        label-single='URI'
+                                        label-multiple='URIs'
+                                    )
+
+                    - var form = '$parent.form'
+                    +clusters-deployment-uri
+                    - var form = 'deployment'
+
+                .pc-form-grid-col-60
+                    +text('Temporary directory path:', modelDeployment + '.URI.temporaryDirectoryPath', '"DeploymentURITemporaryDirectoryPath"', 'false', 'Temporary directory path',
+                    'Absolute path to temporary directory which will be used by deployment SPI to keep all deployed classes in')
+                .pc-form-grid-col-60
+                    mixin clusters-deployment-scanner
+                        .ignite-form-field
+                            -let items = scannerModel
+                            -var uniqueTip = 'Such scanner already configured!'
+
+                            list-editable(
+                                ng-model=items
+                                name='scannerModel'
+                                list-editable-cols=`::[{name: "URI deployment scanners:"}]`
+                            )
+                                list-editable-item-view {{ $item }}
+
+                                list-editable-item-edit
+                                    +list-java-class-field('Scanner', '$item', '"scanner"', items)
+                                        +unique-feedback('"scanner"', uniqueTip)
+
+                                list-editable-no-items
+                                    list-editable-add-item-button(
+                                        add-item=`$editLast((${items} = ${items} || []).push(''))`
+                                        label-single='scanner'
+                                        label-multiple='scanners'
+                                    )
+
+                    - var form = '$parent.form'
+                    +clusters-deployment-scanner
+                    - var form = 'deployment'
+
+                .pc-form-grid-col-60
+                    +java-class('Listener:', `${modelDeployment}.URI.listener`, '"DeploymentURIListener"', 'true', 'false', 'Deployment event listener', uriDeployment)
+                .pc-form-grid-col-60
+                    +checkbox('Check MD5', `${modelDeployment}.URI.checkMd5`, '"DeploymentURICheckMd5"', 'Exclude files with same md5s from deployment')
+                .pc-form-grid-col-60
+                    +checkbox('Encode URI', `${modelDeployment}.URI.encodeUri`, '"DeploymentURIEncodeUri"', 'URI must be encoded before usage')
+            .pc-form-group(ng-show=localDeployment).pc-form-grid-row
+                .pc-form-grid-col-60
+                    +java-class('Listener:', `${modelDeployment}.Local.listener`, '"DeploymentLocalListener"', 'true', 'false', 'Deployment event listener', localDeployment)
+            .pc-form-group(ng-show=customDeployment).pc-form-grid-row
+                .pc-form-grid-col-60
+                    +java-class('Class:', `${modelDeployment}.Custom.className`, '"DeploymentCustom"', 'true', customDeployment, 'DeploymentSpi implementation class', customDeployment)
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterDeployment')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
new file mode 100644
index 0000000..35bd5e8
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/discovery.pug
@@ -0,0 +1,97 @@
+//-
+    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
+
+-var form = 'discovery'
+-var model = '$ctrl.clonedCluster.discovery'
+
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Discovery
+    panel-description
+        | TCP/IP discovery configuration. 
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/cluster-config" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-20
+                +text-ip-address('Local address:', `${model}.localAddress`, '"discoLocalAddress"', 'true', '228.1.2.4',
+                    'Local host IP address that discovery SPI uses<br/>\
+                    If not provided a first found non-loopback address will be used')
+            .pc-form-grid-col-20
+                +number-min-max('Local port:', `${model}.localPort`, '"discoLocalPort"', 'true', '47500', '1024', '65535', 'Local port which node uses')
+            .pc-form-grid-col-20
+                +number('Local port range:', `${model}.localPortRange`, '"discoLocalPortRange"', 'true', '100', '1', 'Local port range')
+            .pc-form-grid-col-60
+                +java-class('Address resolver:', `${model}.addressResolver`, '"discoAddressResolver"', 'true', 'false',
+                    'Provides resolution between external and internal addresses')
+            .pc-form-grid-col-30
+                +number('Socket timeout:', `${model}.socketTimeout`, '"socketTimeout"', 'true', '5000', '0', 'Socket operations timeout')
+            .pc-form-grid-col-30
+                +sane-ignite-form-field-number({
+                    label: 'Acknowledgement timeout:',
+                    model: `${model}.ackTimeout`,
+                    name: '"ackTimeout"',
+                    disabled: 'false',
+                    placeholder: '5000',
+                    min: '0',
+                    max: `{{ ${model}.maxAckTimeout || 600000 }}`,
+                    tip: 'Message acknowledgement timeout'
+                })
+                    +form-field-feedback('"ackTimeout"', 'max', `Acknowledgement timeout should be less than max acknowledgement timeout ({{ ${model}.maxAckTimeout || 60000 }}).`)
+            .pc-form-grid-col-30
+                +number('Max acknowledgement timeout:', `${model}.maxAckTimeout`, '"maxAckTimeout"', 'true', '600000', '0', 'Maximum message acknowledgement timeout')
+            .pc-form-grid-col-30
+                +number('Network timeout:', `${model}.networkTimeout`, '"discoNetworkTimeout"', 'true', '5000', '1', 'Timeout to use for network operations')
+            .pc-form-grid-col-30
+                +number('Join timeout:', `${model}.joinTimeout`, '"joinTimeout"', 'true', '0', '0',
+                    'Join timeout<br/>' +
+                    '0 means wait forever')
+            .pc-form-grid-col-30
+                +number('Thread priority:', `${model}.threadPriority`, '"threadPriority"', 'true', '10', '1', 'Thread priority for all threads started by SPI')
+
+            //- Removed in ignite 2.0
+            .pc-form-grid-col-60(ng-if='$ctrl.available(["1.0.0", "2.0.0"])')
+                +number('Heartbeat frequency:', `${model}.heartbeatFrequency`, '"heartbeatFrequency"', 'true', '2000', '1', 'Heartbeat messages issuing frequency')
+            .pc-form-grid-col-30
+                +number('Max heartbeats miss w/o init:', `${model}.maxMissedHeartbeats`, '"maxMissedHeartbeats"', 'true', '1', '1',
+                    'Max heartbeats count node can miss without initiating status check')
+            .pc-form-grid-col-30(ng-if-end)
+                +number('Max missed client heartbeats:', `${model}.maxMissedClientHeartbeats`, '"maxMissedClientHeartbeats"', 'true', '5', '1',
+                    'Max heartbeats count node can miss without failing client node')
+
+            .pc-form-grid-col-60
+                +number('Topology history:', `${model}.topHistorySize`, '"topHistorySize"', 'true', '1000', '0', 'Size of topology snapshots history')
+            .pc-form-grid-col-60
+                +java-class('Discovery listener:', `${model}.listener`, '"discoListener"', 'true', 'false', 'Listener for grid node discovery events')
+            .pc-form-grid-col-60
+                +java-class('Data exchange:', `${model}.dataExchange`, '"dataExchange"', 'true', 'false', 'Class name of handler for initial data exchange between Ignite nodes')
+            .pc-form-grid-col-60
+                +java-class('Metrics provider:', `${model}.metricsProvider`, '"metricsProvider"', 'true', 'false', 'Class name of metric provider to discovery SPI')
+            .pc-form-grid-col-30
+                +number('Reconnect count:', `${model}.reconnectCount`, '"discoReconnectCount"', 'true', '10', '1', 'Reconnect attempts count')
+            .pc-form-grid-col-30
+                +number('Statistics frequency:', `${model}.statisticsPrintFrequency`, '"statisticsPrintFrequency"', 'true', '0', '1', 'Statistics print frequency')
+            .pc-form-grid-col-60
+                +number('IP finder clean frequency:', `${model}.ipFinderCleanFrequency`, '"ipFinderCleanFrequency"', 'true', '60000', '1', 'IP finder clean frequency')
+            .pc-form-grid-col-60
+                +java-class('Node authenticator:', `${model}.authenticator`, '"authenticator"', 'true', 'false', 'Class name of node authenticator implementation')
+            .pc-form-grid-col-60
+                +checkbox('Force server mode', `${model}.forceServerMode`, '"forceServerMode"', 'Force start TCP/IP discovery in server mode')
+            .pc-form-grid-col-60
+                +checkbox('Client reconnect disabled', `${model}.clientReconnectDisabled`, '"clientReconnectDisabled"',
+                    'Disable try of client to reconnect after server detected client node failure')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterDiscovery')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/events.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/events.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/events.pug
new file mode 100644
index 0000000..a41999e
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/events.pug
@@ -0,0 +1,66 @@
+//-
+    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
+
+-var form = 'events'
+-var model = '$ctrl.clonedCluster'
+-var modelEventStorage = model + '.eventStorage'
+-var modelEventStorageKind = modelEventStorage + '.kind'
+-var eventStorageMemory = modelEventStorageKind + ' === "Memory"'
+-var eventStorageCustom = modelEventStorageKind + ' === "Custom"'
+
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Events
+    panel-description
+        | Grid events are used for notification about what happens within the grid. 
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/events" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-60(ng-if='$ctrl.available(["1.0.0", "2.0.0"])')
+                +dropdown('Event storage:', modelEventStorageKind, '"eventStorageKind"', 'true', 'Disabled', '$ctrl.eventStorage',
+                'Regulate how grid store events locally on node\
+                <ul>\
+                    <li>Memory - All events are kept in the FIFO queue in-memory</li>\
+                    <li>Custom - Custom implementation of event storage SPI</li>\
+                </ul>')
+            .pc-form-grid-col-60(ng-if='$ctrl.available("2.0.0")')
+                +dropdown('Event storage:', modelEventStorageKind, '"eventStorageKind"', 'true', 'Disabled', '$ctrl.eventStorage',
+                'Regulate how grid store events locally on node\
+                <ul>\
+                    <li>Memory - All events are kept in the FIFO queue in-memory</li>\
+                    <li>Custom - Custom implementation of event storage SPI</li>\
+                    <li>Disabled - Events are not collected</li>\
+                </ul>')
+            .pc-form-group.pc-form-grid-row(ng-if=modelEventStorageKind)
+                .pc-form-grid-col-30(ng-if-start=eventStorageMemory)
+                    +number('Events expiration time:', `${modelEventStorage}.Memory.expireAgeMs`, '"EventStorageExpireAgeMs"', 'true', 'Long.MAX_VALUE', '1', 'All events that exceed this value will be removed from the queue when next event comes')
+                .pc-form-grid-col-30
+                    +number('Events queue size:', `${modelEventStorage}.Memory.expireCount`, '"EventStorageExpireCount"', 'true', '10000', '1', 'Events will be filtered out when new request comes')
+                .pc-form-grid-col-60(ng-if-end)
+                    +java-class('Filter:', `${modelEventStorage}.Memory.filter`, '"EventStorageFilter"', 'true', 'false',
+                    'Filter for events to be recorded<br/>\
+                    Should be implementation of o.a.i.lang.IgnitePredicate&lt;o.a.i.events.Event&gt;', eventStorageMemory)
+
+                .pc-form-grid-col-60(ng-if=eventStorageCustom)
+                    +java-class('Class:', `${modelEventStorage}.Custom.className`, '"EventStorageCustom"', 'true', eventStorageCustom, 'Event storage implementation class name', eventStorageCustom)
+
+                .pc-form-grid-col-60
+                    +dropdown-multiple('Include type:', `${model}.includeEventTypes`, '"includeEventTypes"', true, 'Choose recorded event types', '', '$ctrl.eventGroups',
+                    'Array of event types, which will be recorded by GridEventStorageManager#record(Event)<br/>\
+                    Note, that either the include event types or the exclude event types can be established')
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterEvents')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/failover.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/failover.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/failover.pug
new file mode 100644
index 0000000..2e92f83
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/failover.pug
@@ -0,0 +1,89 @@
+//-
+    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
+
+-var model = '$ctrl.clonedCluster'
+-var form = 'failoverSpi'
+-var failoverSpi = model + '.failoverSpi'
+-var failoverCustom = '$item.kind === "Custom"'
+
+panel-collapsible(ng-form=form on-open=`ui.loadPanel('${form}')`)
+    panel-title Failover configuration
+    panel-description
+        | Failover SPI provides ability to supply custom logic for handling failed execution of a grid job. 
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/fault-tolerance" target="_blank") More info]
+    panel-content.pca-form-row(ng-if=`ui.isPanelLoaded('${form}')`)
+        .pca-form-column-6.pc-form-grid-row
+            //- Since ignite 2.0
+            .pc-form-grid-col-60(ng-if-start='$ctrl.available("2.0.0")')
+                +number('Failure detection timeout:', model + '.failureDetectionTimeout', '"failureDetectionTimeout"', 'true',
+                    '10000', '1', 'Failure detection timeout is used to determine how long the communication or discovery SPIs should wait before considering a remote connection failed')
+            .pc-form-grid-col-60(ng-if-end)
+                +number('Client failure detection timeout:', model + '.clientFailureDetectionTimeout', '"clientFailureDetectionTimeout"', 'true',
+                    '30000', '1', 'Failure detection timeout is used to determine how long the communication or discovery SPIs should wait before considering a remote connection failed')
+
+            .pc-form-grid-col-60(ng-init='failoverSpiTbl={type: "failoverSpi", model: "failoverSpi", focusId: "kind", ui: "failover-table"}')
+                mixin clusters-failover-spi
+                    .ignite-form-field
+                        +ignite-form-field__label('Failover SPI configurations:', '"failoverSpi"')
+                            +tooltip(`Failover SPI configurations`)
+                        .ignite-form-field__control
+                            -let items = failoverSpi
+
+                            list-editable(ng-model=items name='failoverSpi')
+                                list-editable-item-edit
+                                    - form = '$parent.form'
+                                    .settings-row
+                                        +sane-ignite-form-field-dropdown({
+                                            required: true,
+                                            label: 'Failover SPI:',
+                                            model: '$item.kind',
+                                            name: '"failoverKind"',
+                                            placeholder: 'Choose Failover SPI',
+                                            options: '::$ctrl.Clusters.failoverSpis',
+                                            tip: `
+                                            Provides ability to supply custom logic for handling failed execution of a grid job
+                                            <ul>
+                                                <li>Job stealing - Supports job stealing from over-utilized nodes to under-utilized nodes</li>
+                                                <li>Never - Jobs are ordered as they arrived</li>
+                                                <li>Always - Jobs are first ordered by their priority</li>
+                                                <li>Custom - Jobs are activated immediately on arrival to mapped node</li>
+                                                <li>Default - Default FailoverSpi implementation</li>
+                                            </ul>`
+                                        })
+
+                                    .settings-row(ng-show='$item.kind === "JobStealing"')
+                                        +number('Maximum failover attempts:', '$item.JobStealing.maximumFailoverAttempts', '"jsMaximumFailoverAttempts"', 'true', '5', '0',
+                                            'Maximum number of attempts to execute a failed job on another node')
+                                    .settings-row(ng-show='$item.kind === "Always"')
+                                        +number('Maximum failover attempts:', '$item.Always.maximumFailoverAttempts', '"alwaysMaximumFailoverAttempts"', 'true', '5', '0',
+                                            'Maximum number of attempts to execute a failed job on another node')
+                                    .settings-row(ng-show=failoverCustom)
+                                        +java-class('SPI implementation', '$item.Custom.class', '"failoverSpiClass"', 'true', failoverCustom,
+                                            'Custom FailoverSpi implementation class name.', failoverCustom)
+
+                                list-editable-no-items
+                                    list-editable-add-item-button(
+                                        add-item=`(${items} = ${items} || []).push({})`
+                                        label-single='failover SPI'
+                                        label-multiple='failover SPIs'
+                                    )
+
+                +clusters-failover-spi
+
+        .pca-form-column-6
+            +preview-xml-java(model, 'clusterFailover')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
new file mode 100644
index 0000000..86f6384
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general.pug
@@ -0,0 +1,89 @@
+//-
+    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
+
+-var form = 'general'
+-var model = '$ctrl.clonedCluster'
+-var modelDiscoveryKind = model + '.discovery.kind'
+
+include ./general/discovery/cloud
+include ./general/discovery/google
+include ./general/discovery/jdbc
+include ./general/discovery/multicast
+include ./general/discovery/s3
+include ./general/discovery/shared
+include ./general/discovery/vm
+include ./general/discovery/zookeeper
+include ./general/discovery/kubernetes
+
+panel-collapsible(opened=`::true` ng-form=form)
+    panel-title General
+    panel-description
+        | Common cluster configuration.
+        | #[a.link-success(href="https://apacheignite.readme.io/docs/clustering" target="_blank") More info]
+    panel-content.pca-form-row
+        .pca-form-column-6.pc-form-grid-row
+            .pc-form-grid-col-30
+                +sane-ignite-form-field-text({
+                    label: 'Name:',
+                    model: `${model}.name`,
+                    name: '"clusterName"',
+                    disabled: 'false',
+                    placeholder: 'Input name',
+                    required: true,
+                    tip: 'Instance name allows to indicate to what grid this particular grid instance belongs to'
+                })(
+                    ignite-unique='$ctrl.shortClusters'
+                    ignite-unique-property='name'
+                    ignite-unique-skip=`["_id", ${model}]`
+                )
+                    +unique-feedback(`${model}.name`, 'Cluster name should be unique.')
+
+            .pc-form-grid-col-30
+                +text-ip-address('Local host:', `${model}.localHost`, '"localHost"', 'true', '0.0.0.0',
+                    'System-wide local address or host for all Ignite components to bind to<br/>\
+                    If not defined then Ignite tries to use local wildcard address<br/>\
+                    That means that all services will be available on all network interfaces of the host machine')
+
+            .pc-form-grid-col-60
+                +dropdown('Discovery:', `${model}.discovery.kind`, '"discovery"', 'true', 'Choose discovery', '$ctrl.Clusters.discoveries',
+                'Discovery allows to discover remote nodes in grid\
+                <ul>\
+                    <li>Static IPs - IP Finder which works only with pre configured list of IP addresses specified</li>\
+                    <li>Multicast - Multicast based IP finder</li>\
+                    <li>AWS S3 - AWS S3 based IP finder that automatically discover cluster nodes on Amazon EC2 cloud</li>\
+                    <li>Apache jclouds - Apache jclouds multi cloud toolkit based IP finder for cloud platforms with unstable IP addresses</li>\
+                    <li>Google cloud storage - Google Cloud Storage based IP finder that automatically discover cluster nodes on Google Compute Engine cluster</li>\
+                    <li>JDBC - JDBC based IP finder that use database to store node IP address</li>\
+                    <li>Shared filesystem - Shared filesystem based IP finder that use file to store node IP address</li>\
+                    <li>Apache ZooKeeper - Apache ZooKeeper based IP finder when you use ZooKeeper to coordinate your distributed environment</li>\
+                    <li>Kubernetes - IP finder for automatic lookup of Ignite nodes running in Kubernetes environment</li>\
+                </ul>')
+            .pc-form-group
+                +discovery-cloud()(ng-if=`${modelDiscoveryKind} === 'Cloud'`)
+                +discovery-google()(ng-if=`${modelDiscoveryKind} === 'GoogleStorage'`)
+                +discovery-jdbc()(ng-if=`${modelDiscoveryKind} === 'Jdbc'`)
+                +discovery-multicast()(ng-if=`${modelDiscoveryKind} === 'Multicast'`)
+                +discovery-s3()(ng-if=`${modelDiscoveryKind} === 'S3'`)
+                +discovery-shared()(ng-if=`${modelDiscoveryKind} === 'SharedFs'`)
+                +discovery-vm()(ng-if=`${modelDiscoveryKind} === 'Vm'`)
+                +discovery-zookeeper()(ng-if=`${modelDiscoveryKind} === 'ZooKeeper'`)
+                +discovery-kubernetes()(ng-if=`${modelDiscoveryKind} === 'Kubernetes'`)
+
+        .pca-form-column-6
+            -var model = '$ctrl.clonedCluster'
+            +preview-xml-java(model, 'clusterGeneral')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
new file mode 100644
index 0000000..074756e
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/cloud.pug
@@ -0,0 +1,78 @@
+//-
+    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
+
+mixin discovery-cloud(modelAt='$ctrl.clonedCluster')
+
+    -const model = `${modelAt}.discovery.Cloud`
+    -const discoveryKind = 'Cloud'
+    -const required = `${modelAt}.discovery.kind == "${discoveryKind}"`
+    -const regions = `${model}.regions`
+    -const zones = `${model}.zones`
+    -const formRegions = 'discoveryCloudRegions'
+    -const formZones = 'discoveryCloudZones'
+
+    div.pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text('Credential:', `${model}.credential`, '"credential"', 'false', 'Input cloud credential',
+                'Credential that is used during authentication on the cloud<br/>\
+                Depending on a cloud platform it can be a password or access key')
+        .pc-form-grid-col-30
+            +text('Path to credential:', `${model}.credentialPath`, '"credentialPath"', 'false', 'Input path to credential',
+                'Path to a credential that is used during authentication on the cloud<br/>\
+                Access key or private key should be stored in a plain or PEM file without a passphrase')
+        .pc-form-grid-col-30
+            +text('Identity:', `${model}.identity`, '"' + discoveryKind + 'Identity"', required, 'Input identity',
+                'Identity that is used as a user name during a connection to the cloud<br/>\
+                Depending on a cloud platform it can be an email address, user name, etc')
+        .pc-form-grid-col-30
+            +text('Provider:', `${model}.provider`, '"' + discoveryKind + 'Provider"', required, 'Input provider', 'Cloud provider to use')
+        .pc-form-grid-col-60
+            .ignite-form-field
+                +list-text-field({
+                    items: regions,
+                    lbl: 'Region name',
+                    name: 'regionName',
+                    itemName: 'region',
+                    itemsName: 'regions'
+                })(
+                    list-editable-cols=`::[{
+                        name: 'Regions:',
+                        tip: "List of regions where VMs are located<br />
+                        If the regions are not set then every region, that a cloud provider has, will be investigated. This could lead to significant performance degradation<br />
+                        Note, that some cloud providers, like Google Compute Engine, doesn't have a notion of a region. For such providers regions are redundant"
+                    }]`
+                )
+                    +unique-feedback(_, 'Such region already exists!')
+
+        .pc-form-grid-col-60
+            .ignite-form-field
+                +list-text-field({
+                    items: zones,
+                    lbl: 'Zone name',
+                    name: 'zoneName',
+                    itemName: 'zone',
+                    itemsName: 'zones'
+                })(
+                    list-editable-cols=`::[{
+                        name: 'Zones:',
+                        tip: "List of zones where VMs are located<br />
+                        If the zones are not set then every zone from specified regions, will be taken into account<br />
+                        Note, that some cloud providers, like Rackspace, doesn't have a notion of a zone. For such providers zones are redundant"
+                    }]`
+                )
+                    +unique-feedback(_, 'Such zone already exists!')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
new file mode 100644
index 0000000..7de3843
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/google.pug
@@ -0,0 +1,38 @@
+//-
+    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
+
+mixin discovery-google(modelAt = '$ctrl.clonedCluster')
+    -const discoveryKind = 'GoogleStorage'
+    -const required = `${modelAt}.discovery.kind == '${discoveryKind}'`
+    -const model = `${modelAt}.discovery.GoogleStorage`
+
+    .pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text('Project name:', `${model}.projectName`, `'${discoveryKind}ProjectName'`, required, 'Input project name', '' +
+                'Google Cloud Platforms project name<br/>\
+                Usually this is an auto generated project number(ex. 208709979073) that can be found in "Overview" section of Google Developer Console')
+        .pc-form-grid-col-30
+            +text('Bucket name:', `${model}.bucketName`, `'${discoveryKind}BucketName'`, required, 'Input bucket name',
+                'Google Cloud Storage bucket name<br/>\
+                If the bucket does not exist Ignite will automatically create it<br/>\
+                However the name must be unique across whole Google Cloud Storage and Service Account Id must be authorized to perform this operation')
+        .pc-form-grid-col-30
+            +text('Private key path:', `${model}.serviceAccountP12FilePath`, `'${discoveryKind}ServiceAccountP12FilePath'`, required, 'Input private key path',
+                'Full path to the private key in PKCS12 format of the Service Account')
+        .pc-form-grid-col-30
+            +text('Account id:', `${model}.serviceAccountId`, `'${discoveryKind}ServiceAccountId'`, required, 'Input account id', 'Service account ID (typically an e-mail address)')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
new file mode 100644
index 0000000..7b23a22
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/jdbc.pug
@@ -0,0 +1,35 @@
+//-
+    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
+
+mixin discovery-jdbc(modelAt = '$ctrl.clonedCluster')
+    -const model = `${modelAt}.discovery.Jdbc`
+    -const required = `${modelAt}.discovery.kind === "Jdbc"`
+
+    .pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text('Data source bean name:', `${model}.dataSourceBean`,
+                '"dataSourceBean"', required, 'Input bean name', 'Name of the data source bean in Spring context')
+        .pc-form-grid-col-30
+            +dialect('Dialect:', `${model}.dialect`, '"dialect"', required,
+                'Dialect of SQL implemented by a particular RDBMS:', 'Generic JDBC dialect', 'Choose JDBC dialect')
+        .pc-form-grid-col-60
+            +checkbox('DB schema should be initialized by Ignite', `${model}.initSchema`, '"initSchema"',
+                'Flag indicating whether DB schema should be initialized by Ignite or was explicitly created by user')
+        .pc-form-grid-col-30(ng-if=`$ctrl.Clusters.requiresProprietaryDrivers(${modelAt})`)
+            a.link-success(ng-href=`{{ $ctrl.Clusters.JDBCDriverURL(${modelAt}) }}` target='_blank')
+                | Download JDBC drivers?
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
new file mode 100644
index 0000000..9232022
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/kubernetes.pug
@@ -0,0 +1,38 @@
+//-
+    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
+
+mixin discovery-kubernetes(modelAt = '$ctrl.clonedCluster')
+    -const discoveryKind = 'Kubernetes'
+    -const model = `${modelAt}.discovery.Kubernetes`
+
+    .pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text('Service name:', `${model}.serviceName`, `'${discoveryKind}ServiceName'`, 'false', 'ignite',
+                "The name of Kubernetes service for Ignite pods' IP addresses lookup.<br/>\
+                The name of the service must be equal to the name set in service's Kubernetes configuration.<br/>\
+                If this parameter is not changed then the name of the service has to be set to 'ignite' in the corresponding Kubernetes configuration.")
+        .pc-form-grid-col-30
+            +text('Namespace:', `${model}.namespace`, `'${discoveryKind}Namespace'`, 'false', 'default',
+                "The namespace the Kubernetes service belongs to.<br/>\
+                By default, it's supposed that the service is running under Kubernetes `default` namespace.")
+        .pc-form-grid-col-60
+            +url('Kubernetes server:', `${model}.masterUrl`, `'${discoveryKind}MasterUrl'`, 'true', 'false', 'https://kubernetes.default.svc.cluster.local:443',
+                'The host name of the Kubernetes API server')
+        .pc-form-grid-col-60
+            +text('Service token file:', `${model}.accountToken`, `'${discoveryKind}AccountToken'`, 'false', '/var/run/secrets/kubernetes.io/serviceaccount/token',
+                'The path to the service token file')

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
new file mode 100644
index 0000000..639a374
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/multicast.pug
@@ -0,0 +1,63 @@
+//-
+    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
+
+mixin discovery-multicast(modelAt = '$ctrl.clonedCluster')
+    -const model = `${modelAt}.discovery.Multicast`
+    -const addresses = `${model}.addresses`
+
+    .pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text-ip-address('IP address:', `${model}.multicastGroup`, '"multicastGroup"', 'true', '228.1.2.4', 'IP address of multicast group')
+        .pc-form-grid-col-30
+            +number-min-max('Port number:', `${model}.multicastPort`, '"multicastPort"', 'true', '47400', '0', '65535', 'Port number which multicast messages are sent to')
+        .pc-form-grid-col-20
+            +number('Waits for reply:', `${model}.responseWaitTime`, '"responseWaitTime"', 'true', '500', '0',
+                'Time in milliseconds IP finder waits for reply to multicast address request')
+        .pc-form-grid-col-20
+            +number('Attempts count:', `${model}.addressRequestAttempts`, '"addressRequestAttempts"', 'true', '2', '0',
+                'Number of attempts to send multicast address request<br/>\
+                IP finder re - sends request only in case if no reply for previous request is received')
+        .pc-form-grid-col-20
+            +text-ip-address('Local address:', `${model}.localAddress`, '"localAddress"', 'true', '0.0.0.0',
+                'Local host address used by this IP finder<br/>\
+                If provided address is non - loopback then multicast socket is bound to this interface<br/>\
+                If local address is not set or is any local address then IP finder creates multicast sockets for all found non - loopback addresses')
+        .pc-form-grid-col-60
+            .ignite-form-field
+                .ignite-form-field__control
+                    +list-addresses({
+                        items: addresses,
+                        name: 'multicastAddresses',
+                        tip: `Addresses may be represented as follows:
+                        <ul>
+                            <li>IP address (e.g. 127.0.0.1, 9.9.9.9, etc)</li>
+                            <li>IP address and port (e.g. 127.0.0.1:47500, 9.9.9.9:47501, etc)</li>
+                            <li>IP address and port range (e.g. 127.0.0.1:47500..47510, 9.9.9.9:47501..47504, etc)</li>
+                            <li>Hostname (e.g. host1.com, host2, etc)</li>
+                            <li>Hostname and port (e.g. host1.com:47500, host2:47502, etc)</li>
+                            <li>Hostname and port range (e.g. host1.com:47500..47510, host2:47502..47508, etc)</li>
+                        </ul>
+                        If port is 0 or not provided then default port will be used (depends on discovery SPI configuration)<br />
+                        If port range is provided (e.g. host:port1..port2) the following should be considered:
+                        </ul>
+                        <ul>
+                            <li> port1 &lt; port2 should be true</li>
+                            <li> Both port1 and port2 should be greater than 0</li>
+                        </ul>`
+                    })
+                    

http://git-wip-us.apache.org/repos/asf/ignite/blob/68719446/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
new file mode 100644
index 0000000..41d45ac
--- /dev/null
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/components/cluster-edit-form/templates/general/discovery/s3.pug
@@ -0,0 +1,38 @@
+//-
+    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
+
+mixin discovery-s3(modelAt = '$ctrl.clonedCluster')
+
+    -var discoveryKind = 'S3'
+    -var required = `${modelAt}.discovery.kind == '${discoveryKind}'`
+    -var model = `${modelAt}.discovery.S3`
+
+    .pc-form-grid-row&attributes(attributes=attributes)
+        .pc-form-grid-col-30
+            +text('Bucket name:', `${model}.bucketName`, `'${discoveryKind}BucketName'`, required, 'Input bucket name', 'Bucket name for IP finder')
+        .pc-form-grid-col-30
+            .pc-form-grid__text-only-item(style='font-style: italic;color: #424242;')
+                | AWS credentials will be generated as stub
+        .pc-form-grid-col-40(ng-if-start=`$ctrl.available("2.4.0")`)
+            +text('Bucket endpoint:', `${model}.bucketEndpoint`, `'${discoveryKind}BucketEndpoint'`, false, 'Input bucket endpoint',
+            'Bucket endpoint for IP finder<br/> \
+            For information about possible endpoint names visit <a href="http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region">docs.aws.amazon.com</a>')
+        .pc-form-grid-col-20(ng-if-end)
+            +text('SSE algorithm:', `${model}.SSEAlgorithm`, `'${discoveryKind}SSEAlgorithm'`, false, 'Input SSE algorithm',
+            'Server-side encryption algorithm for Amazon S3-managed encryption keys<br/> \
+            For information about possible S3-managed encryption keys visit <a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html">docs.aws.amazon.com</a>')
\ No newline at end of file