http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/modules/agent/components/cluster-login/service.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/agent/components/cluster-login/service.js
 
b/modules/web-console/frontend/app/modules/agent/components/cluster-login/service.js
new file mode 100644
index 0000000..a066bcf
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/agent/components/cluster-login/service.js
@@ -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.
+ */
+
+import _ from 'lodash';
+
+import {ClusterSecrets} from '../../types/ClusterSecrets';
+import {CancellationError} from 'app/errors/CancellationError';
+
+export default class ClusterLoginService {
+    static $inject = ['$modal', '$q'];
+
+    constructor($modal, $q) {
+        this.$modal = $modal;
+        this.$q = $q;
+    }
+
+    /**
+     * @param {ClusterSecrets} baseSecrets
+     * @return {ng.IDifferend<ClusterSecrets>}
+     */
+    askCredentials(baseSecrets) {
+        const deferred = this.$q.defer();
+
+        const modal = this.$modal({
+            template: `
+                <cluster-login
+                    secrets='$ctrl.secrets'
+                    on-login='$ctrl.onLogin()'
+                    on-hide='$ctrl.onHide()'
+                ></cluster-login>
+            `,
+            controller: [function() {
+                this.secrets = _.clone(baseSecrets);
+
+                this.onLogin = () => {
+                    deferred.resolve(this.secrets);
+                };
+
+                this.onHide = () => {
+                    deferred.reject(new CancellationError());
+                };
+            }],
+            controllerAs: '$ctrl',
+            backdrop: 'static',
+            show: true
+        });
+
+        return modal.$promise
+            .then(() => deferred.promise)
+            .finally(modal.hide);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/modules/agent/components/cluster-login/template.pug
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/agent/components/cluster-login/template.pug
 
b/modules/web-console/frontend/app/modules/agent/components/cluster-login/template.pug
new file mode 100644
index 0000000..d1bfe18
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/agent/components/cluster-login/template.pug
@@ -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.
+
+include /app/helpers/jade/mixins
+
+.modal.modal--ignite.theme--ignite(tabindex='-1' role='dialog')
+    .modal-dialog
+       -var form = '$ctrl.form'
+
+       form.modal-content(name=form novalidate ng-submit='$ctrl.login()')
+            .modal-header
+                h4.modal-title
+                    i.icon-confirm
+                    span Enter cluster credentials
+                button.close(type='button' aria-label='Close' 
ng-click='$ctrl.onHide()')
+                    svg(ignite-icon="cross")
+            .modal-body
+                .row
+                    .col-50
+                        +form-field__text({
+                            label: 'User:',
+                            model: '$ctrl.secrets.user',
+                            name: '"user"',
+                            placeholder: 'Input user',
+                            required: true
+                        })(
+                            ng-model-options='{allowInvalid: true}'
+                            autocomplete='node-user'
+                            ignite-auto-focus
+                        )
+                    .col-50
+                        +form-field__password({
+                            label: 'Password:',
+                            model: '$ctrl.secrets.password',
+                            name: '"password"',
+                            placeholder: 'Input password',
+                            required: true
+                        })(
+                            autocomplete='node-password'
+                        )
+            .modal-footer
+                
button#btn-cancel.btn-ignite.btn-ignite--link-success(type='button' 
ng-click='$ctrl.onHide()') Cancel
+                button#btn-login.btn-ignite.btn-ignite--success Login

http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/modules/agent/types/Cluster.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/agent/types/Cluster.js 
b/modules/web-console/frontend/app/modules/agent/types/Cluster.js
new file mode 100644
index 0000000..dd05405
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/agent/types/Cluster.js
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+class Cluster {
+    /** @type {String} */
+    id;
+
+    /** @type {String} */
+    name;
+
+    /** @type {Boolean} */
+    connected = true;
+
+    /** @type {Boolean} */
+    secured;
+
+    constructor({id, name, secured = false}) {
+        this.id = id;
+        this.name = name;
+        this.secured = secured;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/modules/agent/types/ClusterSecrets.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/agent/types/ClusterSecrets.js 
b/modules/web-console/frontend/app/modules/agent/types/ClusterSecrets.js
new file mode 100644
index 0000000..edff351
--- /dev/null
+++ b/modules/web-console/frontend/app/modules/agent/types/ClusterSecrets.js
@@ -0,0 +1,61 @@
+/*
+ * 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 {nonEmpty} from 'app/utils/lodashMixins';
+
+export class ClusterSecrets {
+    /** @type {String} */
+    user;
+
+    /** @type {String} */
+    password;
+
+    /** @type {String} */
+    sessionToken;
+
+    constructor() {
+        this.user = 'ignite';
+    }
+
+    hasCredentials() {
+        return nonEmpty(this.user) && nonEmpty(this.password);
+    }
+
+    resetCredentials() {
+        this.resetSessionToken();
+
+        this.password = null;
+    }
+
+    resetSessionToken() {
+        this.sessionToken = null;
+    }
+
+    /**
+     * @return {{sessionToken: String}|{'user': String, 'password': String}}
+     */
+    getCredentials() {
+        const { sessionToken } = this;
+
+        if (sessionToken)
+            return { sessionToken };
+
+        const { user, password } = this;
+
+        return { user, password };
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/modules/agent/types/ClusterSecretsManager.js
----------------------------------------------------------------------
diff --git 
a/modules/web-console/frontend/app/modules/agent/types/ClusterSecretsManager.js 
b/modules/web-console/frontend/app/modules/agent/types/ClusterSecretsManager.js
new file mode 100644
index 0000000..f5bd5ac
--- /dev/null
+++ 
b/modules/web-console/frontend/app/modules/agent/types/ClusterSecretsManager.js
@@ -0,0 +1,70 @@
+/*
+ * 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 {ClusterSecrets} from './ClusterSecrets';
+
+export class ClusterSecretsManager {
+    /** @type {Map<String, ClusterSecrets>} */
+    memoryCache = new Map();
+
+    /**
+     * @param {String} clusterId
+     * @private
+     */
+    _has(clusterId) {
+        return this.memoryCache.has(clusterId);
+    }
+
+    /**
+     * @param {String} clusterId
+     * @private
+     */
+    _get(clusterId) {
+        return this.memoryCache.get(clusterId);
+    }
+
+    /**
+     * @param {String} clusterId
+     */
+    get(clusterId) {
+        if (this._has(clusterId))
+            return this._get(clusterId);
+
+        const secrets = new ClusterSecrets();
+
+        this.put(clusterId, secrets);
+
+        return secrets;
+    }
+
+    /**
+     * @param {String} clusterId
+     * @param {ClusterSecrets} secrets
+     */
+    put(clusterId, secrets) {
+        this.memoryCache.set(clusterId, secrets);
+    }
+
+    /**
+     * @param {String} clusterId
+     */
+    reset(clusterId) {
+        const secrets = this._get(clusterId);
+
+        secrets && secrets.resetCredentials();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/523a871b/modules/web-console/frontend/app/utils/SimpleWorkerPool.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/utils/SimpleWorkerPool.js 
b/modules/web-console/frontend/app/utils/SimpleWorkerPool.js
index 495a4d2..8e7aab7 100644
--- a/modules/web-console/frontend/app/utils/SimpleWorkerPool.js
+++ b/modules/web-console/frontend/app/utils/SimpleWorkerPool.js
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import _ from 'lodash';
+
 import {Observable} from 'rxjs/Observable';
 import {Subject} from 'rxjs/Subject';
 import 'rxjs/add/observable/race';

Reply via email to