You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by an...@apache.org on 2016/03/04 10:31:25 UTC

[30/50] ignite git commit: IGNITE-2724 WIP support for ZooKeeper.

IGNITE-2724 WIP support for ZooKeeper.


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

Branch: refs/heads/ignite-843
Commit: 37bc97741db7a08e7706aa529406017c01bba93c
Parents: 711086a
Author: vsisko <vs...@gridgain.com>
Authored: Thu Feb 25 19:20:37 2016 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Thu Feb 25 19:20:37 2016 +0700

----------------------------------------------------------------------
 .../control-center-web/src/main/js/.eslintrc    |   2 +-
 .../app/modules/states/configuration.state.js   |  17 +++
 .../states/configuration/clusters/general.jade  |   2 +
 .../general/discovery/zookeeper.directive.js    |  27 +++++
 .../clusters/general/discovery/zookeeper.jade   | 113 +++++++++++++++++++
 .../bounded-exponential-backoff.directive.js    |  27 +++++
 .../bounded-exponential-backoff.jade            |  57 ++++++++++
 .../zookeeper/retrypolicy/custom.directive.js   |  27 +++++
 .../discovery/zookeeper/retrypolicy/custom.jade |  30 +++++
 .../exponential-backoff.directive.js            |  27 +++++
 .../retrypolicy/exponential-backoff.jade        |  56 +++++++++
 .../zookeeper/retrypolicy/forever.directive.js  |  27 +++++
 .../zookeeper/retrypolicy/forever.jade          |  30 +++++
 .../zookeeper/retrypolicy/n-times.directive.js  |  27 +++++
 .../zookeeper/retrypolicy/n-times.jade          |  43 +++++++
 .../zookeeper/retrypolicy/one-time.directive.js |  27 +++++
 .../zookeeper/retrypolicy/one-time.jade         |  31 +++++
 .../retrypolicy/until-elapsed.directive.js      |  27 +++++
 .../zookeeper/retrypolicy/until-elapsed.jade    |  43 +++++++
 .../main/js/controllers/clusters-controller.js  |   7 +-
 .../main/js/helpers/generator/generator-java.js |  87 ++++++++++++++
 .../main/js/helpers/generator/generator-pom.js  |   3 +
 .../main/js/helpers/generator/generator-xml.js  | 102 +++++++++++++++++
 .../src/main/js/serve/mongo.js                  |  40 ++++++-
 24 files changed, 874 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/.eslintrc
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/.eslintrc b/modules/control-center-web/src/main/js/.eslintrc
index 000de6c..0341ed7 100644
--- a/modules/control-center-web/src/main/js/.eslintrc
+++ b/modules/control-center-web/src/main/js/.eslintrc
@@ -57,7 +57,7 @@ rules:
     generator-star-spacing: 0
     guard-for-in: 1
     handle-callback-err: 0
-    id-length: [2, {"min": 1, "max": 40}]
+    id-length: [2, {"min": 1, "max": 50}]
     indent: [2, 4, {"SwitchCase": 1}]
     key-spacing: [2, { "beforeColon": false, "afterColon": true }]
     lines-around-comment: 0

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration.state.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration.state.js b/modules/control-center-web/src/main/js/app/modules/states/configuration.state.js
index 57eb361..edd7f9d 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration.state.js
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration.state.js
@@ -46,6 +46,15 @@ import generalDiscoveryMulticast from './configuration/clusters/general/discover
 import generalDiscoveryS3 from './configuration/clusters/general/discovery/s3.directive';
 import generalDiscoveryShared from './configuration/clusters/general/discovery/shared.directive';
 import generalDiscoveryVm from './configuration/clusters/general/discovery/vm.directive';
+import generalDiscoveryZookeeper from './configuration/clusters/general/discovery/zookeeper.directive';
+
+import generalDiscoveryZookeeperRetryExponential from './configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.directive';
+import generalDiscoveryZookeeperRetryBoundedExponential from './configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.directive';
+import generalDiscoveryZookeeperRetryUntilElapsed from './configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.directive';
+import generalDiscoveryZookeeperRetryNTimes from './configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.directive';
+import generalDiscoveryZookeeperRetryOneTime from './configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.directive';
+import generalDiscoveryZookeeperRetryForever from './configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.directive';
+import generalDiscoveryZookeeperRetryCustom from './configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.directive';
 
 angular
 .module('ignite-console.states.configuration', [
@@ -76,6 +85,14 @@ angular
 .directive(...generalDiscoveryS3)
 .directive(...generalDiscoveryShared)
 .directive(...generalDiscoveryVm)
+.directive(...generalDiscoveryZookeeper)
+.directive(...generalDiscoveryZookeeperRetryExponential)
+.directive(...generalDiscoveryZookeeperRetryBoundedExponential)
+.directive(...generalDiscoveryZookeeperRetryUntilElapsed)
+.directive(...generalDiscoveryZookeeperRetryNTimes)
+.directive(...generalDiscoveryZookeeperRetryOneTime)
+.directive(...generalDiscoveryZookeeperRetryForever)
+.directive(...generalDiscoveryZookeeperRetryCustom)
 // Services.
 .service(...ConfigurationSummaryResource)
 .config(['$stateProvider', function($stateProvider) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general.jade
index 2f78db2..c750119 100644
--- a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general.jade
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general.jade
@@ -93,6 +93,8 @@ form.panel.panel-default(name='general' novalidate)
                             ng-if='#{model}.discovery.kind === "SharedFs"')
                         ignite-configuration-clusters-general-discovery-vm(
                             ng-if='#{model}.discovery.kind === "Vm"')
+                        ignite-configuration-clusters-general-discovery-zookeeper(
+                            ng-if='#{model}.discovery.kind === "ZooKeeper"')
             ignite-ui-ace-tabs.col-sm-6
                 .preview-panel(ng-init='mode = false')
                     .preview-legend

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.directive.js
new file mode 100644
index 0000000..42925a9
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './zookeeper.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeper', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
new file mode 100644
index 0000000..d99a7a7
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper.jade
@@ -0,0 +1,113 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Curator:
+            ignite-form-field-tooltip
+                | The Curator framework in use
+            ignite-form-field-java-class(
+                data-id='curator'
+                data-name='curator'
+                data-ng-model='#{model}.curator'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Connection string:
+            ignite-form-field-tooltip
+                | This property will be used when "IGNITE_ZK_CONNECTION_STRING" system property is not configured
+            ignite-form-field-input-text(
+                data-id='zkConnectionString'
+                data-name='zkConnectionString'
+                data-ng-model='#{model}.zkConnectionString'
+                data-placeholder='host:port[chroot][,host:port[chroot]]'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Retry policy:
+            ignite-form-field-tooltip
+                | Retry policy
+            ignite-form-field-dropdown(
+                data-id='retryPolicy'
+                data-name='retryPolicy'
+                data-options='[\
+                    {value: "ExponentialBackoff", label: "Exponential backoff"},\
+                    {value: "BoundedExponentialBackoff", label: "Bounded exponential backoff"},\
+                    {value: "UntilElapsed", label: "Until elapsed"},\
+                    {value: "NTimes", label: "Max number of times"},\
+                    {value: "OneTime", label: "Only once"},\
+                    {value: "Forever", label: "Always allowsRetry"},\
+                    {value: "Custom", label: "Custom"},\
+                    {value: undefined, label: "Default"}\
+                ]'
+                data-ng-model='#{model}.retryPolicy.kind'
+                data-multiple='false'
+            )
+    .details-row(ng-if='#{model}.retryPolicy.kind')
+        .col-sm-12.panel-details()
+            div(ng-switch='#{model}.retryPolicy.kind')
+                ignite-configuration-clusters-general-discovery-zookeeper-exponential(ng-switch-when='ExponentialBackoff')
+                ignite-configuration-clusters-general-discovery-zookeeper-bounded-exponential(ng-switch-when='BoundedExponentialBackoff')
+                ignite-configuration-clusters-general-discovery-zookeeper-until-elapsed(ng-switch-when='UntilElapsed')
+                ignite-configuration-clusters-general-discovery-zookeeper-n-times(ng-switch-when='NTimes')
+                ignite-configuration-clusters-general-discovery-zookeeper-one-time(ng-switch-when='OneTime')
+                ignite-configuration-clusters-general-discovery-zookeeper-forever(ng-switch-when='Forever')
+                ignite-configuration-clusters-general-discovery-zookeeper-custom(ng-switch-when='Custom')
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Base path:
+            ignite-form-field-tooltip
+                | Base path for service registration
+            ignite-form-field-input-text(
+                data-id='basePath'
+                data-name='basePath'
+                data-ng-model='#{model}.basePath'
+                data-placeholder='/services'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Service name:
+            ignite-form-field-tooltip
+                | Service name to use, as defined by Curator's ServiceDiscovery recipe#[br]
+                | In physical ZooKeeper terms, it represents the node under basePath, under which services will be registered
+            ignite-form-field-input-text(
+                data-id='serviceName'
+                data-name='serviceName'
+                data-ng-model='#{model}.serviceName'
+                data-placeholder='ignite'
+            )
+    .details-row
+        ignite-form-field.checkbox
+            ignite-form-field-input-checkbox(
+                data-id='allowDuplicateRegistrations'
+                data-name='allowDuplicateRegistrations'
+                data-ng-model='#{model}.allowDuplicateRegistrations'
+            )
+            | Allow duplicate registrations
+            ignite-form-field-tooltip
+                | Whether to register each node only once, or if duplicate registrations are allowed#[br]
+                | Nodes will attempt to register themselves, plus those they know about #[br]
+                | By default, duplicate registrations are not allowed, but you might want to set this property to
+                | #[b true] if you have multiple network interfaces or if you are facing troubles

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.directive.js
new file mode 100644
index 0000000..68e338b
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './bounded-exponential-backoff.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperBoundedExponential', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.jade
new file mode 100644
index 0000000..06eb790
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/bounded-exponential-backoff.jade
@@ -0,0 +1,57 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.BoundedExponentialBackoff';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Base Sleep Time:
+            ignite-form-field-tooltip
+                | Initial amount of time to wait between retries
+            ignite-form-field-input-number(
+                data-id='baseSleepTimeMs'
+                data-name='baseSleepTimeMs'
+                data-ng-model='#{model}.baseSleepTimeMs'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Max sleep time:
+            ignite-form-field-tooltip
+                | Max time in ms to sleep on each retry
+            ignite-form-field-input-number(
+                data-id='maxSleepTimeMs'
+                data-name='maxSleepTimeMs'
+                data-ng-model='#{model}.maxSleepTimeMs'
+                data-placeholder='Integer.MAX_VALUE'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Max retries:
+            ignite-form-field-tooltip
+                | Max number of times to retry
+            ignite-form-field-input-number(
+                data-id='maxRetries'
+                data-name='maxRetries'
+                data-ng-model='#{model}.maxRetries'
+                data-ng-required='true'
+                data-max='29'
+            )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.directive.js
new file mode 100644
index 0000000..dfd9b08
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './custom.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperCustom', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.jade
new file mode 100644
index 0000000..e5663a8
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/custom.jade
@@ -0,0 +1,30 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.Custom';
+
+.details-row
+    ignite-form-field
+        ignite-form-field-label
+            | Class name:
+        ignite-form-field-tooltip
+            | Custom retry policy implementation class name
+        ignite-form-field-java-class(
+            data-id='className'
+            data-name='className'
+            data-ng-model='#{model}.className'
+            data-required='true'
+        )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.directive.js
new file mode 100644
index 0000000..29c968c
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './exponential-backoff.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperExponential', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.jade
new file mode 100644
index 0000000..79bcfa1
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/exponential-backoff.jade
@@ -0,0 +1,56 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.ExponentialBackoff';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Base sleep time:
+            ignite-form-field-tooltip
+                | Initial amount of time to wait between retries
+            ignite-form-field-input-number(
+                data-id='baseSleepTimeMs'
+                data-name='baseSleepTimeMs'
+                data-ng-model='#{model}.baseSleepTimeMs'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Max retries:
+            ignite-form-field-tooltip
+                | Max number of times to retry
+            ignite-form-field-input-number(
+                data-id='maxRetries'
+                data-name='maxRetries'
+                data-ng-model='#{model}.maxRetries'
+                data-ng-required='true'
+                data-max='29'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Max sleep time:
+            ignite-form-field-tooltip
+                | Max time in ms to sleep on each retry
+            ignite-form-field-input-number(
+                data-id='maxSleepMs'
+                data-name='maxSleepMs'
+                data-ng-model='#{model}.maxSleepMs'
+                data-placeholder='Integer.MAX_VALUE'
+            )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.directive.js
new file mode 100644
index 0000000..ec39f66
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './forever.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperForever', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.jade
new file mode 100644
index 0000000..705fa2a
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/forever.jade
@@ -0,0 +1,30 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.Forever';
+
+.details-row
+    ignite-form-field
+        ignite-form-field-label
+            | Interval:
+        ignite-form-field-tooltip
+            | Time in ms between retry attempts
+        ignite-form-field-input-number(
+            data-id='retryIntervalMs'
+            data-name='retryIntervalMs'
+            data-ng-model='#{model}.retryIntervalMs'
+            data-ng-required='true'
+        )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.directive.js
new file mode 100644
index 0000000..ce83da4
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './n-times.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperNTimes', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.jade
new file mode 100644
index 0000000..0c44709
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/n-times.jade
@@ -0,0 +1,43 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.NTimes';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Retries:
+            ignite-form-field-tooltip
+                | Number of times to retry
+            ignite-form-field-input-number(
+                data-id='n'
+                data-name='n'
+                data-ng-model='#{model}.n'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Interval:
+            ignite-form-field-tooltip
+                | Time in ms between retry attempts
+            ignite-form-field-input-number(
+                data-id='sleepMsBetweenRetries'
+                data-name='sleepMsBetweenRetries'
+                data-ng-model='#{model}.sleepMsBetweenRetries'
+                data-ng-required='true'
+            )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.directive.js
new file mode 100644
index 0000000..7329cc2
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './one-time.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperOneTime', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.jade
new file mode 100644
index 0000000..24b3514
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/one-time.jade
@@ -0,0 +1,31 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.OneTime';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Interval:
+            ignite-form-field-tooltip
+                | Time in ms to retry attempt
+            ignite-form-field-input-number(
+                data-id='sleepMsBetweenRetry'
+                data-name='sleepMsBetweenRetry'
+                data-ng-model='#{model}.sleepMsBetweenRetry'
+                data-ng-required='true'
+            )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.directive.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.directive.js b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.directive.js
new file mode 100644
index 0000000..8997159
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.directive.js
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+import template from './until-elapsed.jade!';
+
+export default ['igniteConfigurationClustersGeneralDiscoveryZookeeperUntilElapsed', [() => {
+    return {
+        scope: true,
+        restrict: 'E',
+        template,
+        replace: true
+    };
+}]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.jade
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.jade b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.jade
new file mode 100644
index 0000000..c4e701e
--- /dev/null
+++ b/modules/control-center-web/src/main/js/app/modules/states/configuration/clusters/general/discovery/zookeeper/retrypolicy/until-elapsed.jade
@@ -0,0 +1,43 @@
+//-
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+- var model = 'backupItem.discovery.ZooKeeper.retryPolicy.UntilElapsed';
+
+div
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Total time:
+            ignite-form-field-tooltip
+                | Total time in ms for execution of retry attempt
+            ignite-form-field-input-number(
+                data-id='maxElapsedTimeMs'
+                data-name='maxElapsedTimeMs'
+                data-ng-model='#{model}.maxElapsedTimeMs'
+                data-ng-required='true'
+            )
+    .details-row
+        ignite-form-field
+            ignite-form-field-label
+                | Interval:
+            ignite-form-field-tooltip
+                | Time in ms between retry attempts
+            ignite-form-field-input-number(
+                data-id='sleepMsBetweenRetries'
+                data-name='sleepMsBetweenRetries'
+                data-ng-model='#{model}.sleepMsBetweenRetries'
+                data-ng-required='true'
+            )

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/controllers/clusters-controller.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/controllers/clusters-controller.js b/modules/control-center-web/src/main/js/controllers/clusters-controller.js
index 8f44788..7e49f81 100644
--- a/modules/control-center-web/src/main/js/controllers/clusters-controller.js
+++ b/modules/control-center-web/src/main/js/controllers/clusters-controller.js
@@ -65,10 +65,11 @@ consoleModule.controller('clustersController', function ($http, $timeout, $scope
             {value: 'Vm', label: 'static IPs'},
             {value: 'Multicast', label: 'multicast'},
             {value: 'S3', label: 'AWS S3'},
-            {value: 'Cloud', label: 'apache jclouds'},
-            {value: 'GoogleStorage', label: 'google cloud storage'},
+            {value: 'Cloud', label: 'Apache jclouds'},
+            {value: 'GoogleStorage', label: 'Google cloud storage'},
             {value: 'Jdbc', label: 'JDBC'},
-            {value: 'SharedFs', label: 'shared filesystem'}
+            {value: 'SharedFs', label: 'shared filesystem'},
+            {value: 'ZooKeeper', label: 'Apache ZooKeeper'}
         ];
 
         $scope.swapSpaceSpis = [

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-java.js b/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
index 32023b9..732fe51 100644
--- a/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-java.js
@@ -62,6 +62,18 @@ $generatorJava.setterName = function (propName, setterName) {
     return setterName ? setterName : $commonUtils.toJavaName('set', propName);
 };
 
+// Add constructor argument
+$generatorJava.constructorArg = function (obj, propName, notFirst, opt) {
+    var v = obj ? obj[propName] : undefined;
+
+    if ($commonUtils.isDefinedAndNotEmpty(v))
+        return (notFirst ? ', ' : '') + v;
+    else if (!opt)
+        return notFirst ? ', null' : 'null';
+    else
+        return '';
+};
+
 /**
  * Add variable declaration.
  *
@@ -525,6 +537,81 @@ $generatorJava.clusterGeneral = function (cluster, clientNearCfg, res) {
 
                 break;
 
+            case 'ZooKeeper':
+                var finderVar = 'ipFinder';
+
+                $generatorJava.declareVariable(res, 'ipFinder', 'org.apache.ignite.spi.discovery.tcp.ipfinder.zk.TcpDiscoveryZookeeperIpFinder');
+
+                if (d.ZooKeeper) {
+                    if ($commonUtils.isDefinedAndNotEmpty(d.ZooKeeper.curator))
+                        res.line(finderVar + '.setCurator(new ' + res.importClass(d.ZooKeeper.curator) + '());');
+
+                    $generatorJava.property(res, finderVar, d.ZooKeeper, 'zkConnectionString');
+
+                    if (d.ZooKeeper.retryPolicy && d.ZooKeeper.retryPolicy.kind) {
+                        var kind = d.ZooKeeper.retryPolicy.kind;
+                        var retryPolicy = d.ZooKeeper.retryPolicy[kind];
+
+                        switch (kind) {
+                            case 'ExponentialBackoff':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.ExponentialBackoffRetry') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'baseSleepTimeMs') +
+                                    $generatorJava.constructorArg(retryPolicy, 'maxRetries', true) +
+                                    $generatorJava.constructorArg(retryPolicy, 'maxSleepMs', true, true) + '));');
+
+                                break;
+
+                            case 'BoundedExponentialBackoff':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.BoundedExponentialBackoffRetry') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'baseSleepTimeMs') +
+                                    $generatorJava.constructorArg(retryPolicy, 'maxSleepTimeMs', true) +
+                                    $generatorJava.constructorArg(retryPolicy, 'maxRetries', true) + '));');
+
+                                break;
+
+                            case 'UntilElapsed':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.RetryUntilElapsed') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'maxElapsedTimeMs') +
+                                    $generatorJava.constructorArg(retryPolicy, 'sleepMsBetweenRetries', true) + '));');
+
+                                break;
+
+                            case 'NTimes':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.RetryNTimes') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'n') +
+                                    $generatorJava.constructorArg(retryPolicy, 'sleepMsBetweenRetries', true) + '));');
+
+                                break;
+
+                            case 'OneTime':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.RetryOneTime') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'sleepMsBetweenRetry') + '));');
+
+                                break;
+
+                            case 'Forever':
+                                res.line(finderVar + '.setRetryPolicy(new ' + res.importClass('org.apache.curator.retry.RetryForever') + '(' +
+                                    $generatorJava.constructorArg(retryPolicy, 'retryIntervalMs') + '));');
+
+                                break;
+
+                            case 'Custom':
+                                if (retryPolicy && $commonUtils.isDefinedAndNotEmpty(retryPolicy.className))
+                                    res.line(finderVar + '.setRetryPolicy(new ' + res.importClass(retryPolicy.className) + '());');
+
+                                break;
+                        }
+                    }
+
+                    $generatorJava.property(res, finderVar, d.ZooKeeper, 'basePath', null, null, '/services');
+                    $generatorJava.property(res, finderVar, d.ZooKeeper, 'serviceName', null, null, 'ignite');
+                    $generatorJava.property(res, finderVar, d.ZooKeeper, 'allowDuplicateRegistrations', null, null, false);
+                }
+
+                res.line('discovery.setIpFinder(ipFinder);');
+
+                break;
+
             default:
                 res.line('Unknown discovery kind: ' + d.kind);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js b/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
index 804b607..f7bcf92 100644
--- a/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-pom.js
@@ -176,6 +176,9 @@ $generatorPom.pom = function (cluster, igniteVersion, mvnRepositories, res) {
     addDependency('org.apache.ignite', 'ignite-indexing', igniteVersion);
     addDependency('org.apache.ignite', 'ignite-rest-http', igniteVersion);
 
+    if (cluster.discovery.kind === 'ZooKeeper')
+        addDependency('org.apache.ignite', 'ignite-zookeeper', igniteVersion);
+
     if (_.find(cluster.igfss, function (igfs) { return igfs.secondaryFileSystemEnabled; }))
         addDependency('org.apache.ignite', 'ignite-hadoop', igniteVersion);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js b/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
index 9fab39b..2d2c5c8 100644
--- a/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
+++ b/modules/control-center-web/src/main/js/helpers/generator/generator-xml.js
@@ -26,6 +26,19 @@ $generatorXml.escape = function (s) {
     return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
 };
 
+// Add constructor argument
+$generatorXml.constructorArg = function (res, ix, obj, propName, opt) {
+    var v = obj ? obj[propName] : undefined;
+
+    if ($commonUtils.isDefinedAndNotEmpty(v))
+        res.line('<constructor-arg ' + (ix >= 0 ? 'index="' + ix + '" ' : '') + 'value="' + v + '"/>');
+    else if (!opt) {
+        res.startBlock('<constructor-arg ' + (ix >= 0 ? 'index="' + ix + '"' : '') + '>');
+        res.line('<null/>');
+        res.endBlock('</constructor-arg>');
+    }
+};
+
 // Add XML element.
 $generatorXml.element = function (res, tag, attr1, val1, attr2, val2) {
     var elem = '<' + tag;
@@ -365,6 +378,95 @@ $generatorXml.clusterGeneral = function (cluster, res) {
 
                 break;
 
+            case 'ZooKeeper':
+                res.startBlock('<bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.zk.TcpDiscoveryZookeeperIpFinder">');
+
+                if (d.ZooKeeper) {
+                    if ($commonUtils.isDefinedAndNotEmpty(d.ZooKeeper.curator)) {
+                        res.startBlock('<property name="curator">');
+                        res.line('<bean class="' + d.ZooKeeper.curator + '"/>');
+                        res.endBlock('</property>');
+                    }
+
+                    $generatorXml.property(res, d.ZooKeeper, 'zkConnectionString');
+
+                    if (d.ZooKeeper.retryPolicy && d.ZooKeeper.retryPolicy.kind) {
+                        var kind = d.ZooKeeper.retryPolicy.kind;
+                        var retryPolicy = d.ZooKeeper.retryPolicy[kind];
+                        var customClassDefined = retryPolicy && $commonUtils.isDefinedAndNotEmpty(retryPolicy.className);
+
+                        if (kind !== 'Custom' || customClassDefined)
+                            res.startBlock('<property name="retryPolicy">');
+
+                        switch (kind) {
+                            case 'ExponentialBackoff':
+                                res.startBlock('<bean class="org.apache.curator.retry.ExponentialBackoffRetry">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'baseSleepTimeMs');
+                                $generatorXml.constructorArg(res, 1, retryPolicy, 'maxRetries');
+                                $generatorXml.constructorArg(res, 2, retryPolicy, 'maxSleepMs', true);
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'BoundedExponentialBackoff':
+                                res.startBlock('<bean class="org.apache.curator.retry.BoundedExponentialBackoffRetry">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'baseSleepTimeMs');
+                                $generatorXml.constructorArg(res, 1, retryPolicy, 'maxSleepTimeMs');
+                                $generatorXml.constructorArg(res, 2, retryPolicy, 'maxRetries');
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'UntilElapsed':
+                                res.startBlock('<bean class="org.apache.curator.retry.RetryUntilElapsed">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'maxElapsedTimeMs');
+                                $generatorXml.constructorArg(res, 1, retryPolicy, 'sleepMsBetweenRetries');
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'NTimes':
+                                res.startBlock('<bean class="org.apache.curator.retry.RetryNTimes">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'n');
+                                $generatorXml.constructorArg(res, 1, retryPolicy, 'sleepMsBetweenRetries');
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'OneTime':
+                                res.startBlock('<bean class="org.apache.curator.retry.RetryOneTime">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'sleepMsBetweenRetry');
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'Forever':
+                                res.startBlock('<bean class="org.apache.curator.retry.RetryForever">');
+                                $generatorXml.constructorArg(res, 0, retryPolicy, 'retryIntervalMs');
+                                res.endBlock('</bean>');
+
+                                break;
+
+                            case 'Custom':
+                                if (customClassDefined)
+                                    res.line('<bean class="' + retryPolicy.className + '"/>');
+
+                                break;
+                        }
+
+                        if (kind !== 'Custom' || customClassDefined)
+                            res.endBlock('</property>');
+                    }
+
+                    $generatorXml.property(res, d.ZooKeeper, 'basePath', null, '/services');
+                    $generatorXml.property(res, d.ZooKeeper, 'serviceName', null, 'ignite');
+                    $generatorXml.property(res, d.ZooKeeper, 'allowDuplicateRegistrations', null, false);
+                }
+
+                res.endBlock('</bean>');
+
+                break;
+
             default:
                 res.line('Unknown discovery kind: ' + d.kind);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/37bc9774/modules/control-center-web/src/main/js/serve/mongo.js
----------------------------------------------------------------------
diff --git a/modules/control-center-web/src/main/js/serve/mongo.js b/modules/control-center-web/src/main/js/serve/mongo.js
index cfb0040..46a9629 100644
--- a/modules/control-center-web/src/main/js/serve/mongo.js
+++ b/modules/control-center-web/src/main/js/serve/mongo.js
@@ -331,7 +331,7 @@ module.exports.factory = function(deepPopulatePlugin, passportMongo, settings, p
             authenticator: String,
             forceServerMode: Boolean,
             clientReconnectDisabled: Boolean,
-            kind: {type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs']},
+            kind: {type: String, enum: ['Vm', 'Multicast', 'S3', 'Cloud', 'GoogleStorage', 'Jdbc', 'SharedFs', 'ZooKeeper']},
             Vm: {
                 addresses: [String]
             },
@@ -366,6 +366,44 @@ module.exports.factory = function(deepPopulatePlugin, passportMongo, settings, p
             },
             SharedFs: {
                 path: String
+            },
+            ZooKeeper: {
+                curator: String,
+                zkConnectionString: String,
+                retryPolicy: {
+                    kind: {type: String, enum: ['ExponentialBackoff', 'BoundedExponentialBackoff', 'UntilElapsed',
+                        'NTimes', 'OneTime', 'Forever', 'Custom']},
+                    ExponentialBackoff: {
+                        baseSleepTimeMs: Number,
+                        maxRetries: Number,
+                        maxSleepMs: Number
+                    },
+                    BoundedExponentialBackoff: {
+                        baseSleepTimeMs: Number,
+                        maxSleepTimeMs: Number,
+                        maxRetries: Number
+                    },
+                    UntilElapsed: {
+                        maxElapsedTimeMs: Number,
+                        sleepMsBetweenRetries: Number
+                    },
+                    NTimes: {
+                        n: Number,
+                        sleepMsBetweenRetries: Number
+                    },
+                    OneTime: {
+                        sleepMsBetweenRetry: Number
+                    },
+                    Forever: {
+                        retryIntervalMs: Number
+                    },
+                    Custom: {
+                        className: String
+                    }
+                },
+                basePath: String,
+                serviceName: String,
+                allowDuplicateRegistrations: Boolean
             }
         },
         atomicConfiguration: {