You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ak...@apache.org on 2014/02/11 15:31:19 UTC
git commit: AMBARI-4602. Mirroring: Manage Clusters Dialog
integration with API. (akovalenko)
Updated Branches:
refs/heads/trunk 557b132f1 -> 776a39ebd
AMBARI-4602. Mirroring: Manage Clusters Dialog integration with API. (akovalenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/776a39eb
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/776a39eb
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/776a39eb
Branch: refs/heads/trunk
Commit: 776a39ebda62d53ac0eea97201685be6b69b229e
Parents: 557b132
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Tue Feb 11 16:29:48 2014 +0200
Committer: Aleksandr Kovalenko <ak...@hortonworks.com>
Committed: Tue Feb 11 16:29:48 2014 +0200
----------------------------------------------------------------------
.../data/mirroring/cluster1_definition.xml | 15 ++
.../data/mirroring/cluster2_definition.xml | 15 ++
.../app/assets/data/mirroring/clusters.json | 12 ++
.../app/assets/data/mirroring/datasets.json | 16 --
ambari-web/app/assets/data/mirroring/feeds.json | 16 ++
ambari-web/app/controllers.js | 3 -
.../mirroring/manage_clusters_controller.js | 149 ++++++++++++-
.../main/mirroring/targetClusterController.js | 212 -------------------
.../testConnectionResults_controller.js | 155 --------------
.../main/mirroring/testConnection_controller.js | 23 --
.../controllers/main/mirroring_controller.js | 146 +++++++++++--
ambari-web/app/mappers/target_cluster_mapper.js | 39 +---
ambari-web/app/messages.js | 7 +-
ambari-web/app/models/target_cluster.js | 23 +-
.../main/mirroring/manage_clusters.hbs | 12 +-
.../templates/main/mirroring/testConnection.hbs | 57 -----
.../main/mirroring/testConnectionResults.hbs | 74 -------
ambari-web/app/utils/ajax.js | 68 ++++--
ambari-web/app/views.js | 3 -
.../main/mirroring/manage_clusters_view.js | 32 ++-
.../views/main/mirroring/targetClusterView.js | 28 ---
.../mirroring/testConnectionResults_view.js | 33 ---
.../views/main/mirroring/testConnection_view.js | 27 ---
ambari-web/app/views/main/mirroring_view.js | 2 +-
24 files changed, 427 insertions(+), 740 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/assets/data/mirroring/cluster1_definition.xml
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/cluster1_definition.xml b/ambari-web/app/assets/data/mirroring/cluster1_definition.xml
new file mode 100644
index 0000000..5084d23
--- /dev/null
+++ b/ambari-web/app/assets/data/mirroring/cluster1_definition.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<cluster name="cluster1" description="" colo="default" xmlns="uri:falcon:cluster:0.1">
+ <interfaces>
+ <interface type="readonly" endpoint="hftp://c6401.ambari.apache.org:50070" version="2.2.0.2.0.6.0-76"/>
+ <interface type="write" endpoint="hdfs://c6401.ambari.apache.org:8020" version="2.2.0.2.0.6.0-76"/>
+ <interface type="execute" endpoint="c6401.ambari.apache.org:8050" version="2.2.0.2.0.6.0-76"/>
+ <interface type="workflow" endpoint="http://c6401.ambari.apache.org:11000/oozie" version="3.1.4"/>
+ <interface type="messaging" endpoint="tcp://c6401.ambari.apache.org:61616?daemon=true" version="5.1.6"/>
+ </interfaces>
+ <locations>
+ <location name="staging" path="/projects/falcon/staging"/>
+ <location name="temp" path="/tmp"/>
+ <location name="working" path="/projects/falcon/working"/>
+ </locations>
+</cluster>
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/assets/data/mirroring/cluster2_definition.xml
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/cluster2_definition.xml b/ambari-web/app/assets/data/mirroring/cluster2_definition.xml
new file mode 100644
index 0000000..05ddf98
--- /dev/null
+++ b/ambari-web/app/assets/data/mirroring/cluster2_definition.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<cluster name="cluster2" description="" colo="default" xmlns="uri:falcon:cluster:0.1">
+ <interfaces>
+ <interface type="readonly" endpoint="hftp://c6401.ambari.apache.org:50070" version="2.2.0.2.0.6.0-76"/>
+ <interface type="write" endpoint="hdfs://c6401.ambari.apache.org:8020" version="2.2.0.2.0.6.0-76"/>
+ <interface type="execute" endpoint="c6401.ambari.apache.org:8050" version="2.2.0.2.0.6.0-76"/>
+ <interface type="workflow" endpoint="http://c6401.ambari.apache.org:11000/oozie" version="3.1.4"/>
+ <interface type="messaging" endpoint="tcp://c6401.ambari.apache.org:61616?daemon=true" version="5.1.6"/>
+ </interfaces>
+ <locations>
+ <location name="staging" path="/projects/falcon/staging"/>
+ <location name="temp" path="/tmp"/>
+ <location name="working" path="/projects/falcon/working"/>
+ </locations>
+</cluster>
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/assets/data/mirroring/clusters.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/clusters.json b/ambari-web/app/assets/data/mirroring/clusters.json
new file mode 100644
index 0000000..6d5aedf
--- /dev/null
+++ b/ambari-web/app/assets/data/mirroring/clusters.json
@@ -0,0 +1,12 @@
+{
+ "entity": [
+ {
+ "name": "cluster1",
+ "type": "feed"
+ },
+ {
+ "name": "cluster2",
+ "type": "feed"
+ }
+ ]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/assets/data/mirroring/datasets.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/datasets.json b/ambari-web/app/assets/data/mirroring/datasets.json
deleted file mode 100644
index 6b4dd90..0000000
--- a/ambari-web/app/assets/data/mirroring/datasets.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "entity": [
- {
- "name": "dataset1",
- "type": "feed"
- },
- {
- "name": "dataset2",
- "type": "feed"
- },
- {
- "name": "dataset3",
- "type": "feed"
- }
- ]
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/assets/data/mirroring/feeds.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/feeds.json b/ambari-web/app/assets/data/mirroring/feeds.json
new file mode 100644
index 0000000..6b4dd90
--- /dev/null
+++ b/ambari-web/app/assets/data/mirroring/feeds.json
@@ -0,0 +1,16 @@
+{
+ "entity": [
+ {
+ "name": "dataset1",
+ "type": "feed"
+ },
+ {
+ "name": "dataset2",
+ "type": "feed"
+ },
+ {
+ "name": "dataset3",
+ "type": "feed"
+ }
+ ]
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js
index c93c616..1ba10d4 100644
--- a/ambari-web/app/controllers.js
+++ b/ambari-web/app/controllers.js
@@ -116,9 +116,6 @@ require('controllers/main/mirroring_controller');
require('controllers/main/mirroring/edit_dataset_controller');
require('controllers/main/mirroring/datasets_controller');
require('controllers/main/mirroring/jobs_controller');
-require('controllers/main/mirroring/targetClusterController');
-require('controllers/main/mirroring/testConnection_controller');
-require('controllers/main/mirroring/testConnectionResults_controller');
require('controllers/main/mirroring/manage_clusters_controller');
require('controllers/wizard/slave_component_groups_controller');
require('controllers/wizard/step0_controller');
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers/main/mirroring/manage_clusters_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring/manage_clusters_controller.js b/ambari-web/app/controllers/main/mirroring/manage_clusters_controller.js
index 938c157..6930140 100644
--- a/ambari-web/app/controllers/main/mirroring/manage_clusters_controller.js
+++ b/ambari-web/app/controllers/main/mirroring/manage_clusters_controller.js
@@ -21,15 +21,60 @@ var App = require('app');
App.MainMirroringManageClustersController = Em.ArrayController.extend({
name: 'mainMirroringManageClustersController',
+ // link to popup object
+ popup: null,
+
clusters: [],
+ // array of original clusters to compare with changed ones
+ originalClusters: [],
+
+ queriesCount: 0,
+
+ // array of error messages
+ queryErrors: [],
+
+ isLoaded: function () {
+ return App.router.get('mainMirroringController.isLoaded');
+ }.property('App.router.mainMirroringController.isLoaded'),
+
+ onLoad: function () {
+ if (this.get('isLoaded')) {
+ var clusters = [];
+ var originalClusters = [];
+ App.TargetCluster.find().forEach(function (cluster) {
+ var newCluster = {
+ name: cluster.get('name'),
+ execute: cluster.get('execute'),
+ workflow: cluster.get('workflow'),
+ readonly: cluster.get('readonly'),
+ staging: cluster.get('staging'),
+ working: cluster.get('working'),
+ temp: cluster.get('temp')
+ };
+ clusters.push(Ember.Object.create(newCluster));
+ originalClusters.push(Ember.Object.create(newCluster));
+ }, this);
+ this.set('clusters', clusters);
+ this.set('originalClusters', originalClusters);
+ }
+ }.observes('isLoaded'),
+
selectedCluster: null,
addCluster: function () {
var self = this;
App.showPromptPopup(Em.I18n.t('mirroring.manageClusters.specifyName'),
function (clusterName) {
- self.get('clusters').pushObject(clusterName);
+ self.get('clusters').pushObject(Ember.Object.create({
+ name: clusterName,
+ execute: '',
+ workflow: '',
+ readonly: '',
+ staging: '',
+ working: '',
+ temp: ''
+ }));
}
);
},
@@ -38,6 +83,106 @@ App.MainMirroringManageClustersController = Em.ArrayController.extend({
var self = this;
App.showConfirmationPopup(function () {
self.set('clusters', self.get('clusters').without(self.get('selectedCluster')));
- })
+ });
+ },
+
+ save: function () {
+ // define clusters need to be deleted, modified or created
+ var clusters = this.get('clusters');
+ var originalClusters = this.get('originalClusters');
+ var originalClustersNames = originalClusters.mapProperty('name');
+ var clustersToModify = [];
+ var clustersToCreate = [];
+ clusters.forEach(function (cluster) {
+ var clusterName = cluster.get('name');
+ if (originalClustersNames.contains(clusterName)) {
+ if (JSON.stringify(cluster) !== JSON.stringify(originalClusters.findProperty('name', clusterName))) {
+ clustersToModify.push(clusterName);
+ }
+ originalClustersNames = originalClustersNames.without(clusterName);
+ } else {
+ clustersToCreate.push(clusterName);
+ }
+ }, this);
+ var clustersToDelete = originalClustersNames;
+ var queriesCount = clustersToCreate.length + clustersToDelete.length + clustersToModify.length;
+ this.set('queriesCount', queriesCount);
+
+ // send request to delete, modify or create cluster
+ if (queriesCount) {
+ this.get('queryErrors').clear();
+ clustersToDelete.forEach(function (cluster) {
+ App.ajax.send({
+ name: 'mirroring.delete_instance',
+ sender: this,
+ data: {
+ name: cluster,
+ type: 'cluster'
+ },
+ success: 'onQueryResponse',
+ error: 'onQueryResponse'
+ });
+ }, this);
+ clustersToCreate.forEach(function (cluster) {
+ App.ajax.send({
+ name: 'mirroring.submit_instance',
+ sender: this,
+ data: {
+ type: 'cluster',
+ instance: this.formatClusterXML(clusters.findProperty('name', cluster))
+ },
+ success: 'onQueryResponse',
+ error: 'onQueryResponse'
+ });
+ }, this);
+ clustersToModify.forEach(function (cluster) {
+ App.ajax.send({
+ name: 'mirroring.update_instance',
+ sender: this,
+ data: {
+ name: cluster,
+ type: 'cluster',
+ instance: this.formatClusterXML(clusters.findProperty('name', cluster))
+ },
+ success: 'onQueryResponse',
+ error: 'onQueryResponse'
+ });
+ }, this);
+ } else {
+ this.get('popup').hide();
+ }
+ },
+
+ // close popup after getting response from all queries or show popup with errors
+ onQueryResponse: function () {
+ var queryErrors = this.get('queryErrors');
+ if (arguments.length === 4) {
+ queryErrors.push(arguments[2]);
+ }
+ var queriesCount = this.get('queriesCount');
+ this.set('queriesCount', --queriesCount);
+ if (queriesCount < 1) {
+ if (queryErrors.length) {
+ App.showAlertPopup(Em.I18n.t('common.error'), Em.I18n.t('mirroring.manageClusters.error') + ': ' + queryErrors.join(', '));
+ } else {
+ this.get('popup').hide();
+ }
+ }
+ },
+
+ /**
+ * Return XML-formatted string made from cluster object
+ * @param {Object} cluster - object with cluster data
+ * @return {String}
+ */
+ formatClusterXML: function (cluster) {
+ return '<?xml version="1.0"?><cluster colo="default" description="" name="' + cluster.get('name') +
+ '" xmlns="uri:falcon:cluster:0.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><interfaces><interface type="readonly" endpoint="' + cluster.get('readonly') +
+ '" version="2.2.0.2.0.6.0-76" /><interface type="execute" endpoint="' + cluster.get('execute') +
+ '" version="2.2.0.2.0.6.0-76" /><interface type="workflow" endpoint="' + cluster.get('workflow') +
+ '" version="3.1.4" /></interfaces><locations><location name="staging" path="' + cluster.get('staging') +
+ '" /><location name="temp" path="' + cluster.get('temp') +
+ '" /><location name="working" path="' + cluster.get('working') +
+ '" /></locations></cluster>';
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers/main/mirroring/targetClusterController.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring/targetClusterController.js b/ambari-web/app/controllers/main/mirroring/targetClusterController.js
deleted file mode 100644
index f16e5e2..0000000
--- a/ambari-web/app/controllers/main/mirroring/targetClusterController.js
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * 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.
- */
-
-App.MainMirroringTargetClusterController = Ember.Controller.extend({
- name: 'mainMirroringTargetClusterController',
- model: Ember.Object.create({
- targetCluster: null,
- originalRecord: null,
- isPopupForEdit: false, // set the default to add scenario
- isNameNodeWebUrlError: function (key, value) {
- if (value) {
- return value;
- }
- var controller = App.router.get('mainMirroringTargetClusterController');
- return controller.checkNameNodeWebUrlErrors();
- }.property('targetCluster.nameNodeWebUrl', 'model.targetCluster.nameNodeWebUrl'),
- isNameNodeRpcUrlError: function (key, value) {
- if (value) {
- return value;
- }
- var controller = App.router.get('mainMirroringTargetClusterController');
- return controller.checkNameNodeRpcUrlErrors();
- }.property('targetCluster.nameNodeRpcUrl', 'model.targetCluster.nameNodeRpcUrl'),
-
- isOozieServerUrlError: function (key, value) {
- if (value) {
- return value;
- }
- var controller = App.router.get('mainMirroringTargetClusterController');
- return controller.checkOozieServerUrlErrors();
- }.property('targetCluster.oozieServerUrl', 'model.targetCluster.oozieServerUrl'),
-
- isClusterNameError: function (key, value) {
- if (value) {
- return value;
- }
- var controller = App.router.get('mainMirroringTargetClusterController');
- return controller.checkClusterNameErrors();
- }.property('targetCluster.clusterName', 'model.targetCluster.clusterName'),
-
- nameNodeWebUrlErrorMessage: null,
- nameNodeRpcUrlErrorMessage: null,
- oozieServerUrlErrorMessage: null,
- clusterNameErrorMessage: null
- }),
-
- isSubmitted1: null,
- isSubmitted2: null,
-
- validate1: function () {
- var isNameNodeWebUrlError = this.checkNameNodeWebUrlErrors();
- var isNameNodeRpcUrlError = this.checkNameNodeRpcUrlErrors();
- var isOozieServerUrlError = this.checkOozieServerUrlErrors();
-
- return !(isNameNodeWebUrlError || isNameNodeRpcUrlError || isOozieServerUrlError);
- },
-
- validate2: function () {
- return !this.checkClusterNameErrors();
- },
-
- checkNameNodeWebUrlErrors: function () {
- if (!this.get('isSubmitted1')){
- this.set('model.nameNodeWebUrlErrorMessage', "");
- return false;
- }
- var nameNodeWebUrl = this.get('model.targetCluster.nameNodeWebUrl');
- if (!nameNodeWebUrl || nameNodeWebUrl.trim() === "") {
- this.set('model.isNameNodeWebUrlError', true);
- this.set('model.nameNodeWebUrlErrorMessage', Em.I18n.t('mirroring.required.error'));
- return true;
- }
- else {
- this.set('model.nameNodeWebUrlErrorMessage', "");
- return false;
- }
-
- },
-
- checkNameNodeRpcUrlErrors: function () {
- if (!this.get('isSubmitted1')){
- this.set('model.nameNodeRpcUrlErrorMessage', "");
- return false;
- }
- var nameNodeRpcUrl = this.get('model.targetCluster.nameNodeRpcUrl');
- if (!nameNodeRpcUrl || nameNodeRpcUrl.trim() === "") {
- this.set('model.isNameNodeRpcUrlError', true);
- this.set('model.nameNodeRpcUrlErrorMessage', Em.I18n.t('mirroring.required.error'));
- return true;
- }
- else {
- this.set('model.nameNodeRpcUrlErrorMessage', "");
- return false;
- }
-
- },
-
- checkOozieServerUrlErrors: function () {
- if (!this.get('isSubmitted1')){
- this.set('model.oozieServerUrlErrorMessage', "");
- return false;
- }
- var oozieServerUrl = this.get('model.targetCluster.oozieServerUrl');
- if (!oozieServerUrl || oozieServerUrl.trim() === "") {
- this.set('model.isOozieServerUrlError', true);
- this.set('model.oozieServerUrlErrorMessage', Em.I18n.t('mirroring.required.error'));
- return true;
- }
- else {
- this.set('model.oozieServerUrlErrorMessage', "");
- return false;
- }
-
- },
-
- checkClusterNameErrors: function () {
- if (!this.get('isSubmitted1')){
- this.set('model.clusterNameErrorMessage', "");
- return false;
- }
- var clusterName = this.get('model.targetCluster.clusterName');
- if (!clusterName || clusterName.trim() === "") {
- this.set('model.isClusterNameError', true);
- this.set('model.clusterNameErrorMessage', Em.I18n.t('mirroring.required.error'));
- return true;
- }
- else {
- this.set('model.clusterNameErrorMessage', "");
- return false;
- }
-
- },
-
- setOriginalRecord: function (targetClusterRecord) {
- this.set('model.originalRecord', targetClusterRecord);
- },
-
- setTargetCluster: function (targetClusterRecord) {
- var targetCluster = Ember.Object.create({
- id: targetClusterRecord.get('id'),
- clusterName: targetClusterRecord.get('clusterName'),
- nameNodeWebUrl: targetClusterRecord.get('nameNodeWebUrl'),
- nameNodeRpcUrl: targetClusterRecord.get('nameNodeRpcUrl'),
- oozieServerUrl: targetClusterRecord.get('oozieServerUrl')
- });
-
- this.set('model.targetCluster', targetCluster);
- },
-
-
- createTargetCluster: function () {
- var targetCluster = Ember.Object.create({
- clusterName: null,
- nameNodeWebUrl: null,
- nameNodeRpcUrl: null,
- oozieServerUrl: null
- });
- this.set('model.targetCluster', targetCluster);
- return targetCluster;
-
- /* For future (but on record objects , not on pojos):
- targetCluster.on('didUpdate', function() {
- console.log("------Updated!");
- });
- targetCluster.on('didDelete', function() {
- console.log("------Deleted!");
- });
- targetCluster.on('didCreate', function() {
- console.log("------Created!");
- });
- */
-
- },
- getTargetCluster: function () {
- return this.get('content.targetCluster');
- },
-
- popup: null,
-
- /**
- * "Delete" button handler.
- * A DataSet
- */
- deleteTargetCluster: function () {
- var self = this;
- App.showConfirmationPopup(function () {
- var originalRecord = self.get('model.originalRecord');
- originalRecord.deleteRecord();
- originalRecord.get("transaction").commit();
- self.get('popup').hide();
- App.router.transitionTo('main.mirroring.index');
- });
- }
-
-
-
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers/main/mirroring/testConnectionResults_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring/testConnectionResults_controller.js b/ambari-web/app/controllers/main/mirroring/testConnectionResults_controller.js
deleted file mode 100644
index 9980488..0000000
--- a/ambari-web/app/controllers/main/mirroring/testConnectionResults_controller.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * 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.
- */
-
-App.TestConnectionResultsController = Ember.Controller.extend({
- name: 'testConnectionResultsController',
-
- connectStatuses: [
- Ember.Object.create({
- type: 'readonly',
- isConnectionSuccess: false
- }),
- Ember.Object.create({
- type: 'write',
- isConnectionSuccess: false
- }),
- Ember.Object.create({
- type: 'workflow',
- isConnectionSuccess: false
- })
-
- ],
-
- isNameNodeWebUIConnected: function () {
- var connectStatus = this.get('connectStatuses').findProperty('type', 'readonly');
- return connectStatus.get('isConnectionSuccess');
- }.property('connectStatuses.@each.isConnectionSuccess'),
-
- isNameNodeRpcConnected: function () {
- var connectStatus = this.get('connectStatuses').findProperty('type', 'write');
- return connectStatus.get('isConnectionSuccess');
- }.property('connectStatuses.@each.isConnectionSuccess'),
-
- isOozieServerConnected: function () {
- var connectStatus = this.get('connectStatuses').findProperty('type', 'workflow');
- return connectStatus.get('isConnectionSuccess');
- }.property('connectStatuses.@each.isConnectionSuccess'),
-
- isConnectionSuccessful: function () {
- return this.get('isNameNodeWebUIConnected') && this.get('isNameNodeRpcConnected') && this.get('isOozieServerConnected');
- }.property('isNameNodeWebUIConnected', 'isNameNodeRpcConnected', 'isOozieServerConnected'),
-
- shouldBeDisabled: function () {
- return !this.get('isConnectionSuccessful');
- }.property('isConnectionSuccessful'),
-
- mockDataPrefix: '/data/mirroring/poll/',
-
- tryConnecting: function () {
- var types = ["readonly", "write", "workflow"];
- var arrayOfPollData = ["testConnection_poll1", "testConnection_poll2", "testConnection_poll3", "testConnection_poll4"];
-
- var shouldContinuePolling = true;
-
- var poll_count = 0;
-
- var interval_id = 0;
-
- var self = this;
-
- var connect = function () {
- var method = 'GET';
- console.debug('poll_count : ' + poll_count);
- var url = self.get('mockDataPrefix') + arrayOfPollData[poll_count++] + ".json";
- $.ajax({
- type: method,
- url: url,
- async: true, // shd be chnaged to true
- data: null, // temporarily .this depends upon what the api is expecting.
- dataType: 'text',
- timeout: App.timeout,
- success: function (data) {
- var jsonData = jQuery.parseJSON(data);
- var connectStatuses = self.get('connectStatuses');
- jsonData.tasks.forEach(function (task) {
- var type = task.Tasks.type;
- var status = task.Tasks.status;
- var connectStatus = connectStatuses.findProperty("type", type);
- connectStatus.set('isConnectionSuccess', status === "SUCCESS");
- });
-
- var totalNum = connectStatuses.length;
- var succeededStatuses = connectStatuses.filterProperty("isConnectionSuccess", true);
- var succeededNum = succeededStatuses.length;
-
- if (totalNum == succeededNum) {
- clearInterval(interval_id);
- console.debug('Cleared function id ' + interval_id);
- }
- else {
- clearInterval(interval_id);
- console.debug('Cleared function id ' + interval_id + "totalNum : " + totalNum + ', succeededNum : ' + succeededNum);
- interval_id = setInterval(connect, 100);
- console.debug('Generated function id ' + interval_id);
- }
-
- }
- });
- };
-
- connect();
- },
-
- saveClusterName: function () {
- var targetCluster = this.get('content.targetCluster');
- var isEditing = this.get('content.isPopupForEdit');
- if (isEditing) {
- var targetClusterRecord = this.get('content.originalRecord');
- var targetClusterEdited = this.get('content.targetCluster');
-
- targetClusterRecord.set('id', targetClusterEdited.get('id'));
- targetClusterRecord.set('clusterName', targetClusterEdited.get('clusterName'));
- targetClusterRecord.set('nameNodeWebUrl', targetClusterEdited.get('nameNodeRpcUrl'));
- targetClusterRecord.set('nameNodeRpcUrl', targetClusterEdited.get('id'));
- targetClusterRecord.set('oozieServerUrl', targetClusterEdited.get('oozieServerUrl'));
-
-
- } else {
- var targetClusterRecord = App.TargetCluster.createRecord(targetCluster);
-
- // refresh main page model
- var mainMirroringController = App.router.get('mainMirroringController');
- mainMirroringController.notifyPropertyChange("targetClusters");
-
- // refresh add/edit dataset model
- var addDataSetController = App.router.get('mainMirroringEditDataSetController');
- var dataSet = addDataSetController.get('model.newDataSet');
- if (dataSet) // this may be undefined or null if we try to add cluster from main page. Hence the if check.
- dataSet.set('targetCluster', targetClusterRecord);
- }
-
- var popup = this.get('controllers.mainMirroringTargetClusterController.popup');
- popup.hide();
- }
-
-
-
-
-
-
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers/main/mirroring/testConnection_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring/testConnection_controller.js b/ambari-web/app/controllers/main/mirroring/testConnection_controller.js
deleted file mode 100644
index 6dd4074..0000000
--- a/ambari-web/app/controllers/main/mirroring/testConnection_controller.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * 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.
- */
-
-App.TestConnectionController = Ember.Controller.extend({
- name:'testConnectionController'
-
-
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/controllers/main/mirroring_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring_controller.js b/ambari-web/app/controllers/main/mirroring_controller.js
index f206db9..8d7595d 100644
--- a/ambari-web/app/controllers/main/mirroring_controller.js
+++ b/ambari-web/app/controllers/main/mirroring_controller.js
@@ -24,20 +24,44 @@ App.MainMirroringController = Em.ArrayController.extend({
datasetsData: [],
+ // formatted data for targetClusterMapper
+ clustersData: {},
+
+ // counter for datasets load queries
datasetCount: 0,
+ // counter for target cluster load queries
+ clusterCount: 0,
+
datasets: [],
- isLoaded: false,
+ isDatasetsLoaded: false,
- loadDatasets: function () {
- this.set('isLoaded', false);
+ isTargetClustersLoaded: false,
+
+ isLoaded: function () {
+ return this.get('isDatasetsLoaded') && this.get('isTargetClustersLoaded');
+ }.property('isDatasetsLoaded', 'isTargetClustersLoaded'),
+
+ loadData: function () {
+ this.set('isDatasetsLoaded', false);
+ this.set('isTargetClustersLoaded', false);
this.get('datasetsData').clear();
+ this.set('clustersData', {});
this.set('datasetCount', 0);
+ this.set('clusterCount', 0);
this.set('datasets', []);
+ this.loadDatasets();
+ this.loadClusters();
+ },
+
+ loadDatasets: function () {
App.ajax.send({
- name: 'mirroring.get_all_datasets',
+ name: 'mirroring.get_all_entities',
sender: this,
+ data: {
+ type: 'feed'
+ },
success: 'onLoadDatasetsListSuccess',
error: 'onLoadDatasetsListError'
});
@@ -48,10 +72,11 @@ App.MainMirroringController = Em.ArrayController.extend({
this.set('datasetCount', data.entity.length);
data.entity.mapProperty('name').forEach(function (dataset) {
App.ajax.send({
- name: 'mirroring.get_dataset_definition',
+ name: 'mirroring.get_definition',
sender: this,
data: {
- dataset: dataset
+ name: dataset,
+ type: 'feed'
},
success: 'onLoadDatasetDefinitionSuccess',
error: 'onLoadDatasetDefinitionError'
@@ -109,6 +134,7 @@ App.MainMirroringController = Em.ArrayController.extend({
onLoadDatasetInstancesSuccess: function (data, sender, opts) {
var datasetJobs = [];
+ var datasetsData = this.get('datasetsData');
data.instances.forEach(function (instance) {
datasetJobs.push({
dataset: opts.dataset,
@@ -118,26 +144,22 @@ App.MainMirroringController = Em.ArrayController.extend({
startTime: new Date(instance.startTime).getTime()
});
}, this);
- this.get('datasetsData').findProperty('name', opts.dataset).set('instances', datasetJobs);
+ datasetsData.findProperty('name', opts.dataset).set('instances', datasetJobs);
this.set('datasetCount', this.get('datasetCount') - 1);
var sortedDatasets = [];
if (this.get('datasetCount') < 1) {
- App.dataSetMapper.map(this.get('datasetsData'));
+ App.dataSetMapper.map(datasetsData);
sortedDatasets = App.Dataset.find().toArray().sort(function (a, b) {
if (a.get('name') < b.get('name')) return -1;
if (a.get('name') > b.get('name')) return 1;
return 0;
});
this.set('datasets', sortedDatasets);
- this.set('isLoaded', true);
+ this.set('isDatasetsLoaded', true);
var selectedDataset = this.get('selectedDataset');
if (!selectedDataset) {
this.set('selectedDataset', sortedDatasets[0]);
}
- var routerState = App.router.get('currentState.name');
- if (routerState === 'index') {
- App.router.send('gotoShowJobs');
- }
}
},
@@ -145,30 +167,110 @@ App.MainMirroringController = Em.ArrayController.extend({
console.error('Failed to load dataset instances.');
},
- targetClusters: function () {
- return App.TargetCluster.find();
- }.property(),
+ loadClusters: function () {
+ App.ajax.send({
+ name: 'mirroring.get_all_entities',
+ sender: this,
+ data: {
+ type: 'cluster'
+ },
+ success: 'onLoadClustersListSuccess',
+ error: 'onLoadClustersListError'
+ });
+ },
+
+ onLoadClustersListSuccess: function (data) {
+ if (data && data.entity) {
+ this.set('clusterCount', data.entity.length);
+ this.set('clustersData.items', [
+ {
+ name: App.get('clusterName'),
+ execute: App.HostComponent.find().findProperty('componentName', 'RESOURCEMANAGER').get('host.hostName') + ':8050',
+ readonly: 'hftp://' + App.HostComponent.find().findProperty('componentName', 'NAMENODE').get('host.hostName') + ':50070',
+ workflow: 'http://' + App.HostComponent.find().findProperty('componentName', 'OOZIE_SERVER').get('host.hostName') + ':11000/oozie',
+ staging: '',
+ working: '',
+ temp: ''
+ }
+ ]);
+ data.entity.mapProperty('name').forEach(function (cluster) {
+ App.ajax.send({
+ name: 'mirroring.get_definition',
+ sender: this,
+ data: {
+ name: cluster,
+ type: 'cluster'
+ },
+ success: 'onLoadClusterDefinitionSuccess',
+ error: 'onLoadClusterDefinitionError'
+ });
+ }, this);
+ } else {
+ this.onLoadClustersListError();
+ }
+ },
+
+ onLoadClustersListError: function () {
+ console.error('Failed to load clusters list.');
+ },
+
+ onLoadClusterDefinitionSuccess: function (data) {
+ var parsedData = misc.xmlToObject(data);
+ var clustersData = this.get('clustersData');
+ var interfaces = parsedData.cluster.interfaces.interface;
+ var locations = parsedData.cluster.locations.location;
+ var staging = locations.findProperty('@attributes.name', 'staging');
+ var working = locations.findProperty('@attributes.name', 'working');
+ var temp = locations.findProperty('@attributes.name', 'temp');
+ clustersData.items.push(
+ {
+ name: parsedData.cluster['@attributes'].name,
+ execute: interfaces.findProperty('@attributes.type', 'execute')['@attributes'].endpoint,
+ readonly: interfaces.findProperty('@attributes.type', 'readonly')['@attributes'].endpoint,
+ workflow: interfaces.findProperty('@attributes.type', 'workflow')['@attributes'].endpoint,
+ staging: staging && staging['@attributes'].path,
+ working: working && working['@attributes'].path,
+ temp: temp && temp['@attributes'].path
+ }
+ );
+ this.set('clusterCount', this.get('clusterCount') - 1);
+ if (this.get('clusterCount') < 1) {
+ App.targetClusterMapper.map(clustersData);
+ this.set('isTargetClustersLoaded', true);
+ }
+ },
+
+ onLoadClusterDefinitionError: function () {
+ console.error('Failed to load cluster definition.');
+ },
+
+ onDataLoad: function () {
+ if (this.get('isLoaded') && App.router.get('currentState.name') === 'index') {
+ App.router.send('gotoShowJobs');
+ }
+ }.observes('isLoaded'),
manageClusters: function () {
- App.ModalPopup.show({
+ var manageClustersController = App.router.get('mainMirroringManageClustersController');
+ var popup = App.ModalPopup.show({
header: Em.I18n.t('mirroring.dataset.manageClusters'),
bodyClass: App.MainMirroringManageClusterstView.extend({
- controllerBinding: 'App.router.mainMirroringManageClustersController'
+ controller: manageClustersController
}),
primary: Em.I18n.t('common.save'),
secondary: null,
onPrimary: function () {
- this.hide();
- App.router.send('gotoShowJobs');
+ manageClustersController.save();
},
- onClose: function () {
- this.hide();
+ hide: function () {
App.router.send('gotoShowJobs');
+ this._super();
},
didInsertElement: function () {
this._super();
this.fitHeight();
}
});
+ manageClustersController.set('popup', popup);
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/mappers/target_cluster_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/target_cluster_mapper.js b/ambari-web/app/mappers/target_cluster_mapper.js
index 64c377c..8967181 100644
--- a/ambari-web/app/mappers/target_cluster_mapper.js
+++ b/ambari-web/app/mappers/target_cluster_mapper.js
@@ -20,36 +20,13 @@
App.targetClusterMapper = App.QuickDataMapper.create({
model: App.TargetCluster,
config: {
- id: 'id',
- cluster_name: 'Clusters.name',
- name_node_web_url: 'name_node_web_url',
- name_node_rpc_url: 'name_node_rpc_url',
- oozie_server_url: 'oozie_server_url'
- },
- map: function (json) {
- if (!this.get('model')) {
- return;
- }
- if (json && json.items && json.items.length > 0) {
- var target_cluster_results = [];
- json.items.forEach(function (item) {
- try {
- item.name_node_web_url = (item.Clusters.interfaces.interface.findProperty("type", "readonly")).endpoint;
- item.name_node_rpc_url = (item.Clusters.interfaces.interface.findProperty("type", "write")).endpoint;
- item.oozie_server_url = (item.Clusters.interfaces.interface.findProperty("type","workflow")).endpoint;
- item.id = item.Clusters.name;
-
- var re = new RegExp(" ", "g");
- item.id = item.id.replace(re, "_");
-
-
- item = this.parseIt(item, this.config);
- target_cluster_results.push(item);
- } catch (ex) {
- console.error('Exception occurred: ' + ex);
- }
- }, this);
- App.store.loadMany(this.get('model'), target_cluster_results);
- }
+ id: 'name',
+ name: 'name',
+ execute: 'execute',
+ workflow: 'workflow',
+ readonly: 'readonly',
+ staging: 'staging',
+ working: 'working',
+ temp: 'temp'
}
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index b2756f8..e6d5437 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1798,12 +1798,7 @@ Em.I18n.translations = {
'mirroring.manageClusters.staging':'Staging',
'mirroring.manageClusters.working':'Working',
'mirroring.manageClusters.temp':'Temp',
-
- 'mirroring.targetcluster.nameNodeWebUrl':'NameNode Web UI',
- 'mirroring.targetcluster.nameNodeRpcUrl':'NameNode RPC',
- 'mirroring.targetcluster.oozieServerUrl':'Oozie Server',
- 'mirroring.targetcluster.addCluster':'Add Cluster',
- 'mirroring.targetcluster.enterClusterName':'Name of the Target Cluster',
+ 'mirroring.manageClusters.error' :'Error in saving changes',
'mirroring.table.noDatasets':'No datasets to display',
'mirroring.table.datasetStatus':'Status',
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/models/target_cluster.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/target_cluster.js b/ambari-web/app/models/target_cluster.js
index 6813e30..bda140b 100644
--- a/ambari-web/app/models/target_cluster.js
+++ b/ambari-web/app/models/target_cluster.js
@@ -20,20 +20,13 @@
var App = require('app');
App.TargetCluster = DS.Model.extend({
- id: DS.attr('string'),
- clusterName: DS.attr('string'),
- nameNodeWebUrl: DS.attr('string'),
- nameNodeRpcUrl: DS.attr('string'),
- oozieServerUrl: DS.attr('string')
+ name: DS.attr('string'),
+ execute: DS.attr('string'),
+ workflow: DS.attr('string'),
+ readonly: DS.attr('string'),
+ staging: DS.attr('string'),
+ working: DS.attr('string'),
+ temp: DS.attr('string')
});
-App.TargetCluster.FIXTURES = [/*
- {
- id: 1,
- cluster_name: 'cluster1',
- stack_name: 'HDP',
- hosts: [1, 2, 3, 4],
- racks: [1, 2, 3, 4, 5, 6],
- max_hosts_per_rack: 10
- }*/
-];
\ No newline at end of file
+App.TargetCluster.FIXTURES = [];
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/templates/main/mirroring/manage_clusters.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/mirroring/manage_clusters.hbs b/ambari-web/app/templates/main/mirroring/manage_clusters.hbs
index 06ee7c7..4186a54 100644
--- a/ambari-web/app/templates/main/mirroring/manage_clusters.hbs
+++ b/ambari-web/app/templates/main/mirroring/manage_clusters.hbs
@@ -30,15 +30,15 @@
<div style="margin-bottom: 15px">{{t mirroring.manageClusters.interfaces}}</div>
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.execute}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.execute"}}
</div>
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.readonly}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.readonly"}}
</div>
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.workflow}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.workflow"}}
</div>
</div>
<div class="accordion control-group" id="advanced-fields">
@@ -52,15 +52,15 @@
<div class="accordion-inner">
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.staging}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.staging"}}
</div>
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.working}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.working"}}
</div>
<div class="control-group">
<label class="control-label-manage-clusters">{{t mirroring.manageClusters.temp}}</label>
- {{view Ember.TextField class="span8"}}
+ {{view Ember.TextField class="span8" valueBinding="controller.selectedCluster.temp"}}
</div>
</div>
</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/templates/main/mirroring/testConnection.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/mirroring/testConnection.hbs b/ambari-web/app/templates/main/mirroring/testConnection.hbs
deleted file mode 100644
index 1ab9174..0000000
--- a/ambari-web/app/templates/main/mirroring/testConnection.hbs
+++ /dev/null
@@ -1,57 +0,0 @@
-{{!
-* 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.
-}}
-
-<form class="form-horizontal" autocomplete="off">
- <div class="add-cluster-1">
- <div class="add-cluster-1-1">
- <h4>Enter the URLs for the following</h4>
-
- <div {{bindAttr class=" :each-row content.isNameNodeWebUrlError:error"}}>
- {{t mirroring.targetcluster.nameNodeWebUrl}}
- </div>
- <div {{bindAttr class=" :each-row content.isNameNodeWebUrlError:error"}}>
- {{view Ember.TextField valueBinding="content.targetCluster.nameNodeWebUrl" class="span4" placeholder="http://[NameNode Web UI Server]:50070"}}
- <span class="help-inline">{{content.nameNodeWebUrlErrorMessage}}</span>
- </div>
-
- <div {{bindAttr class=" :each-row content.isNameNodeRpcUrlError:error"}}>
- {{t mirroring.targetcluster.nameNodeRpcUrl}}
- </div>
- <div {{bindAttr class=" :each-row content.isNameNodeRpcUrlError:error"}}>
- {{view Ember.TextField valueBinding="content.targetCluster.nameNodeRpcUrl" class="span4" placeholder="http://[NameNode RPC Server]:8020"}}
- <span class="help-inline">{{content.nameNodeRpcUrlErrorMessage}}</span>
- </div>
- <div {{bindAttr class=" :each-row content.isOozieServerUrlError:error"}}>
- {{t mirroring.targetcluster.oozieServerUrl}}
- </div>
- <div {{bindAttr class=" :each-row content.isOozieServerUrlError:error"}}>
- {{view Ember.TextField valueBinding="content.targetCluster.oozieServerUrl" class="span4" placeholder="http://[Oozie server]:11000"}}
- <span class="help-inline">{{content.oozieServerUrlErrorMessage}}</span>
- </div>
- </div>
- {{#if view.parentView.parentView.controller.model.isPopupForEdit}}
- <div class="add-cluster-1-3">
- <div class="each-row pull-right">
- <a {{action deleteTargetCluster target="view.parentView.parentView.controller"}}
- class="btn btn-danger">{{t common.delete}}</a>
- </div>
- </div>
- {{/if}}
-
- </div>
-</form>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/templates/main/mirroring/testConnectionResults.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/mirroring/testConnectionResults.hbs b/ambari-web/app/templates/main/mirroring/testConnectionResults.hbs
deleted file mode 100644
index fb2934e..0000000
--- a/ambari-web/app/templates/main/mirroring/testConnectionResults.hbs
+++ /dev/null
@@ -1,74 +0,0 @@
-{{!
-* 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.
-}}
-
-<form class="form-horizontal" autocomplete="off">
- <div class="add-cluster-2">
-
- <table>
- <tr>
- <td>NameNode Web UI..50070</td>
- <td>
- {{#if isNameNodeWebUIConnected}}
- <i class="icon-ok"></i>
- {{else}}
- Connecting...
- {{/if}}
- </td>
- </tr>
- <tr class="spacer">
- <td colspan="2"></td>
- </tr>
- <tr>
- <td>NameNode RPC..8020</td>
- <td>
- {{#if isNameNodeRpcConnected}}
- <i class="icon-ok"></i>
- {{else}}
- Connecting...
- {{/if}}
- </td>
- </tr>
- <tr class="spacer">
- <td colspan="2"></td>
- </tr>
- <tr>
- <td>Oozie server..11000</td>
- <td>
- {{#if isOozieServerConnected}}
- <i class="icon-ok"></i>
- {{else}}
- Connecting...
- {{/if}}
- </td>
- </tr>
- <tr class="spacer">
- <td colspan="2"></td>
- </tr>
- <tr {{bindAttr class="content.isClusterNameError:error"}}>
- <td>{{t mirroring.targetcluster.enterClusterName}}</td>
- <td>{{view Ember.TextField valueBinding="content.targetCluster.clusterName" disabledBinding="shouldBeDisabled" }}
- <span class="help-inline">{{content.clusterNameErrorMessage}}</span>
- </td>
- </tr>
- <tr class="spacer">
- <td colspan="2"></td>
- </tr>
- </table>
- </div>
-
-</form>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/utils/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js
index f08e317..d07063a 100644
--- a/ambari-web/app/utils/ajax.js
+++ b/ambari-web/app/utils/ajax.js
@@ -1438,14 +1438,14 @@ var urls = {
}
},
- 'mirroring.get_all_datasets': {
- 'real': 'falcon/entities/list/feed',
- 'mock': '/data/mirroring/datasets.json'
+ 'mirroring.get_all_entities': {
+ 'real': '/falcon/entities/list/{type}',
+ 'mock': '/data/mirroring/{type}s.json'
},
- 'mirroring.get_dataset_definition': {
- 'real': 'falcon/entities/definition/feed/{dataset}',
- 'mock': '/data/mirroring/{dataset}_definition.xml',
+ 'mirroring.get_definition': {
+ 'real': '/falcon/entities/definition/{type}/{name}',
+ 'mock': '/data/mirroring/{name}_definition.xml',
'format': function () {
return {
dataType: 'xml'
@@ -1454,10 +1454,53 @@ var urls = {
},
'mirroring.dataset.get_all_instances': {
- 'real': 'falcon/instance/status/feed/{dataset}',
+ 'real': '/falcon/instance/status/feed/{dataset}',
'mock': '/data/mirroring/{dataset}_instances.json'
},
+
+ 'mirroring.create_new_dataset': {
+ 'real': '/falcon/entities/submitAndSchedule/feed',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ contentType: 'text/xml',
+ data: data.dataset
+ }
+ }
+ },
+
+ 'mirroring.submit_instance': {
+ 'real': '/falcon/entities/submit/{type}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ contentType: 'text/xml',
+ data: data.instance
+ }
+ }
+ },
+
+ 'mirroring.update_instance': {
+ 'real': '/falcon/entities/update/{type}/{name}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ contentType: 'text/xml',
+ data: data.instance
+ }
+ }
+ },
+
+ 'mirroring.delete_instance': {
+ 'real': '/falcon/entities/delete/{type}/{name}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'type': 'DELETE'
+ },
+
'bulk_request.host_components': {
'real': '/clusters/{clusterName}/host_components',
'mock': '',
@@ -1561,17 +1604,6 @@ var urls = {
}
},
- 'mirroring.create_new_dataset': {
- 'real': '/falcon/entities/submitAndSchedule/feed',
- 'mock': '/data/mirroring/succeeded.json',
- 'type': 'POST',
- 'format': function (data) {
- return {
- contentType: 'text/xml',
- data: data.dataset
- }
- }
- },
'jobs.tezDag.NametoID': {
'real': '/proxy?url=http://{historyServerHostName}:8188/ws/v1/apptimeline/TEZ_DAG_ID?primaryFilter=dagName:{tezDagName}',
'mock': '/data/jobs/tezDag-name-to-id.json'
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index b9a8d3c..13330ed 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -224,9 +224,6 @@ require('views/main/mirroring_view');
require('views/main/mirroring/edit_dataset_view');
require('views/main/mirroring/datasets_view');
require('views/main/mirroring/jobs_view');
-require('views/main/mirroring/targetClusterView');
-require('views/main/mirroring/testConnection_view');
-require('views/main/mirroring/testConnectionResults_view');
require('views/main/mirroring/manage_clusters_view');
require('views/installer');
require('views/wizard/controls_view');
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views/main/mirroring/manage_clusters_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring/manage_clusters_view.js b/ambari-web/app/views/main/mirroring/manage_clusters_view.js
index 80c7a6c..29c1f91 100644
--- a/ambari-web/app/views/main/mirroring/manage_clusters_view.js
+++ b/ambari-web/app/views/main/mirroring/manage_clusters_view.js
@@ -26,10 +26,10 @@ App.MainMirroringManageClusterstView = Em.View.extend({
classNames: ['cluster-select'],
multiple: true,
content: function () {
- var clusters = this.get('controller.clusters').slice();
- clusters.unshift(App.get('clusterName'));
- return clusters;
- }.property('controller.clusters.@each', 'App.clusterName'),
+ return this.get('controller.clusters');
+ }.property('controller.clusters.@each'),
+
+ optionLabelPath: 'content.name',
onSelect: function () {
if (this.get('selection.length')) {
@@ -39,15 +39,31 @@ App.MainMirroringManageClusterstView = Em.View.extend({
this.set('selection', [this.get('controller.selectedCluster')]);
}
} else {
- this.set('controller.selectedCluster', null);
+ this.set('selection', [this.get('content')[0]]);
+ }
+ }.observes('selection'),
+
+ // set selected option in Cluster Select after adding or removing an option
+ onContentChange: function () {
+ if (this.get('controller.isLoaded')) {
+ var content = this.get('content');
+ if (content.length < this.get('element.options.length')) {
+ this.set('selection', [content[0]]);
+ } else {
+ this.set('selection', [content[content.length - 1]]);
+ }
}
- }.observes('selection')
+ }.observes('content.length', 'controller.isLoaded')
}),
removeDisabled: function () {
var selectedCluster = this.get('controller.selectedCluster');
- return !selectedCluster || selectedCluster === App.get('clusterName');
- }.property('controller.selectedCluster', 'App.clusterName')
+ return !selectedCluster || selectedCluster.get('name') === App.get('clusterName');
+ }.property('controller.selectedCluster', 'App.clusterName'),
+
+ didInsertElement: function () {
+ this.get('controller').onLoad();
+ }
});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views/main/mirroring/targetClusterView.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring/targetClusterView.js b/ambari-web/app/views/main/mirroring/targetClusterView.js
deleted file mode 100644
index 3033791..0000000
--- a/ambari-web/app/views/main/mirroring/targetClusterView.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * 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 App = require('app');
-var filters = require('views/common/filter_view');
-var sort = require('views/common/sort_view');
-var date = require('utils/date');
-
-App.MainMirroringAddTargetClusterView = Em.View.extend({
- name : 'mainMirroringAddTargetClusterView',
- templateName:require('templates/main/mirroring/addTargetCluster')
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views/main/mirroring/testConnectionResults_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring/testConnectionResults_view.js b/ambari-web/app/views/main/mirroring/testConnectionResults_view.js
deleted file mode 100644
index 572948c..0000000
--- a/ambari-web/app/views/main/mirroring/testConnectionResults_view.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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 App = require('app');
-var filters = require('views/common/filter_view');
-var sort = require('views/common/sort_view');
-var date = require('utils/date');
-
-App.TestConnectionResultsView = Em.View.extend({
- templateName: require('templates/main/mirroring/testConnectionResults'),
-
- name: 'testConnectionResultsView',
-
- didInsertElement: function () {
- var controller = this.get('controller');
- controller.tryConnecting();
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views/main/mirroring/testConnection_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring/testConnection_view.js b/ambari-web/app/views/main/mirroring/testConnection_view.js
deleted file mode 100644
index 7695871..0000000
--- a/ambari-web/app/views/main/mirroring/testConnection_view.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * 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 App = require('app');
-var filters = require('views/common/filter_view');
-var sort = require('views/common/sort_view');
-var date = require('utils/date');
-
-App.TestConnectionView = Em.View.extend({
- name : 'testConnectionView',
- templateName:require('templates/main/mirroring/testConnection')
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/776a39eb/ambari-web/app/views/main/mirroring_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring_view.js b/ambari-web/app/views/main/mirroring_view.js
index 8c465f0..8627593 100644
--- a/ambari-web/app/views/main/mirroring_view.js
+++ b/ambari-web/app/views/main/mirroring_view.js
@@ -24,6 +24,6 @@ App.MainMirroringView = Em.View.extend({
didInsertElement: function () {
var controller = this.get('controller');
- controller.loadDatasets();
+ controller.loadData();
}
});