You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2013/08/14 00:56:39 UTC

git commit: AMBARI-2856. NameNode HA Wizard: E2E integration for progress page after Create Checkpoint page. (Alexandr Kovalenko via yusaku)

Updated Branches:
  refs/heads/trunk d1299d1fe -> bb0c427b9


AMBARI-2856. NameNode HA Wizard: E2E integration for progress page after Create Checkpoint page. (Alexandr Kovalenko via yusaku)


Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/bb0c427b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/bb0c427b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/bb0c427b

Branch: refs/heads/trunk
Commit: bb0c427b9abf3d71839f582843f8e65eb907445c
Parents: d1299d1
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Tue Aug 13 15:55:58 2013 -0700
Committer: Yusaku Sako <yu...@hortonworks.com>
Committed: Tue Aug 13 15:55:58 2013 -0700

----------------------------------------------------------------------
 .../highAvailability/progress_controller.js     | 26 ++++--
 .../admin/highAvailability/step5_controller.js  | 93 +++++++++++++++++++-
 ambari-web/app/styles/application.less          |  6 ++
 .../main/admin/highAvailability/progress.hbs    |  6 ++
 ambari-web/app/utils/ajax.js                    | 53 ++++++++++-
 5 files changed, 175 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/bb0c427b/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
index d5a79d7..3bf3c94 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/progress_controller.js
@@ -39,6 +39,7 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
     this.set('isSubmitDisabled', true);
     this.set('tasks', []);
     this.set('logs', []);
+    this.set('currentRequestIds', []);
     var commands = this.get('commands');
     var currentStep = App.router.get('highAvailabilityWizardController.currentStep');
     for (var i = 0; i < commands.length; i++) {
@@ -46,7 +47,8 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
         title: Em.I18n.t('admin.highAvailability.wizard.step' + currentStep + '.task' + i + '.title'),
         status: 'PENDING',
         id: i,
-        command: commands[i]
+        command: commands[i],
+        showRetry: false
       }));
     }
   },
@@ -60,7 +62,13 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
   },
 
   showRetry: function (taskId) {
-    //show retry button for selected task
+    this.get('tasks').findProperty('id', taskId).set('showRetry', true);
+  },
+
+  retryTask: function () {
+    var task = this.get('tasks').findProperty('status', 'FAILED');
+    task.set('showRetry', false);
+    task.set('status', 'PENDING');
   },
 
   onTaskStatusChange: function () {
@@ -96,7 +104,10 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
     if (!(hostName instanceof Array)) {
       hostName = [hostName];
     }
+    var hostComponents = [];
     for (var i = 0; i < hostName.length; i++) {
+      hostComponents = App.HostComponent.find().filterProperty('componentName', componentName);
+      if (!hostComponents.length || !hostComponents.mapProperty('host.hostName').contains(hostName[i])) {
       App.ajax.send({
         name: 'admin.high_availability.create_component',
         sender: this,
@@ -108,16 +119,21 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
         success: 'onCreateComponent',
         error: 'onTaskError'
       });
+      } else {
+        var taskNum = hostName.length;
+        this.installComponent(componentName, hostName[i], taskNum);
+      }
     }
   },
 
   onCreateComponent: function () {
     var hostName = arguments[2].hostName;
     var componentName = arguments[2].componentName;
-    this.installComponent(componentName, hostName);
+    var taskNum = arguments[2].taskNum;
+    this.installComponent(componentName, hostName, taskNum);
   },
 
-  installComponent: function (componentName, hostName) {
+  installComponent: function (componentName, hostName, taskNum) {
     if (!(hostName instanceof Array)) {
       hostName = [hostName];
     }
@@ -129,7 +145,7 @@ App.HighAvailabilityProgressPageController = Em.Controller.extend({
           hostName: hostName[i],
           componentName: componentName,
           displayName: App.format.role(componentName),
-          taskNum: hostName.length
+          taskNum: taskNum || hostName.length
         },
         success: 'startPolling',
         error: 'onTaskError'

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/bb0c427b/ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js b/ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js
index ffb4fe1..1e3c212 100644
--- a/ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js
+++ b/ambari-web/app/controllers/main/admin/highAvailability/step5_controller.js
@@ -37,6 +37,15 @@ App.HighAvailabilityWizardStep5Controller = App.HighAvailabilityProgressPageCont
   },
 
   installJournalNodes: function () {
+    App.ajax.send({
+      name: 'admin.high_availability.create_journalnode',
+      sender: this,
+      success: 'onJournalNodeCreate',
+      error: 'onJournalNodeCreate'
+    });
+  },
+
+  onJournalNodeCreate: function () {
     var hostNames = this.get('content.masterComponentHosts').filterProperty('component', 'JOURNALNODE').mapProperty('hostName');
     this.createComponent('JOURNALNODE', hostNames);
   },
@@ -61,8 +70,90 @@ App.HighAvailabilityWizardStep5Controller = App.HighAvailabilityProgressPageCont
   },
 
   reconfigureHDFS: function () {
+    this.loadConfigsTags();
+  },
+
+  loadConfigsTags: function () {
+    App.ajax.send({
+      name: 'config.tags',
+      sender: this,
+      success: 'onLoadConfigsTags',
+      error: 'onTaskError'
+    });
+  },
+
+  onLoadConfigsTags: function (data) {
+    var hdfsSiteTag = data.Clusters.desired_configs['hdfs-site'].tag;
+    var coreSiteTag = data.Clusters.desired_configs['core-site'].tag;
+    App.ajax.send({
+      name: 'admin.high_availability.load_configs',
+      sender: this,
+      data: {
+        hdfsSiteTag: hdfsSiteTag,
+        coreSiteTag: coreSiteTag
+      },
+      success: 'onLoadConfigs',
+      error: 'onTaskError'
+    });
+  },
+
+  onLoadConfigs: function (data) {
+    var hdfsSiteProperties = data.items.findProperty('type', 'hdfs-site').properties;
+    var coreSiteProperties = data.items.findProperty('type', 'core-site').properties;
+
+    var currentNameNodeHost = this.get('content.masterComponentHosts').findProperty('isCurNameNode').hostName;
+    var newNameNodeHost = this.get('content.masterComponentHosts').findProperty('isAddNameNode').hostName;
+    var journalNodeHosts = this.get('content.masterComponentHosts').filterProperty('component', 'JOURNALNODE').mapProperty('hostName');
+    var zooKeeperHosts = this.get('content.masterComponentHosts').filterProperty('component', 'ZOOKEEPER_SERVER').mapProperty('hostName');
+
+    //hdfs-site configs changes
+    hdfsSiteProperties['dfs.nameservices'] = 'mycluster';
+    hdfsSiteProperties['dfs.ha.namenodes.mycluster'] = 'nn1,nn2';
+    hdfsSiteProperties['dfs.namenode.rpc-address.mycluster.nn1'] = currentNameNodeHost + ':8020';
+    hdfsSiteProperties['dfs.namenode.rpc-address.mycluster.nn2'] = newNameNodeHost + ':8020';
+    hdfsSiteProperties['dfs.namenode.http-address.mycluster.nn1'] = currentNameNodeHost + ':50070';
+    hdfsSiteProperties['dfs.namenode.http-address.mycluster.nn2'] = newNameNodeHost + ':50070';
+    hdfsSiteProperties['dfs.namenode.shared.edits.dir'] = 'qjournal://' + journalNodeHosts[0] + ':8485:' + journalNodeHosts[1] + ':8485:' + journalNodeHosts[2] + ':8485:/mycluster';
+    hdfsSiteProperties['dfs.client.failover.proxy.provider.mycluster'] = 'org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider';
+    hdfsSiteProperties['dfs.ha.fencing.methods'] = 'shell(/bin/true)';
+    hdfsSiteProperties['dfs.journalnode.edits.dir'] = '/grid/0/hdfs/journal';
+    hdfsSiteProperties['dfs.ha.automatic-failover.enabled'] = 'true';
+
+    //core-site configs changes
+    coreSiteProperties['ha.zookeeper.quorum'] = zooKeeperHosts[0] + ':2181,' + zooKeeperHosts[1] + ':2181,' + zooKeeperHosts[2] + ':2181';
+    coreSiteProperties['fs.defaultFS'] = 'hdfs://mycluster';
+    this.set('configsSaved', false);
+    App.ajax.send({
+      name: 'admin.high_availability.save_configs',
+      sender: this,
+      data: {
+        siteName: 'hdfs-site',
+        properties: hdfsSiteProperties
+      },
+      success: 'installHDFSClients',
+      error: 'onTaskError'
+    });
+    App.ajax.send({
+      name: 'admin.high_availability.save_configs',
+      sender: this,
+      data: {
+        siteName: 'core-site',
+        properties: coreSiteProperties
+      },
+      success: 'installHDFSClients',
+      error: 'onTaskError'
+    });
+  },
+
+  configsSaved: false,
+
+  installHDFSClients: function () {
+    if (!this.get('configsSaved')) {
+      this.set('configsSaved', true);
+      return;
+    }
     var hostNames = this.get('content.masterComponentHosts').filterProperty('component', 'NAMENODE').mapProperty('hostName');
-    this.installComponent('HDFS_CLIENT', hostNames);
+    this.createComponent('HDFS_CLIENT', hostNames);
   }
 });
 

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/bb0c427b/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 27441ec..90dbd5b 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -456,6 +456,12 @@ h1 {
     .row {
       margin-left: 0;
     }
+    .retry {
+      margin-left: 15px;
+      i {
+        font-size: 14px;
+      }
+    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/bb0c427b/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/highAvailability/progress.hbs b/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
index 5858c58..48c8f02 100644
--- a/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
+++ b/ambari-web/app/templates/main/admin/highAvailability/progress.hbs
@@ -24,6 +24,12 @@
   <div class="item">
     <i {{bindAttr class="view.icon view.iconColor"}}></i>
     <a href="javascript:void(0)">{{task.title}}</a>
+    {{#if task.showRetry}}
+    <a {{action retryTask target="controller"}} class="btn btn-primary retry">
+      <i class="icon-repeat icon-white"></i>
+      {{t common.retry}}
+    </a>
+    {{/if}}
   </div>
   <div {{bindAttr class="view.showProgressBar::hide :row :span12" }}>
     <div class="progress-bar span4">

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/bb0c427b/ambari-web/app/utils/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js
index 3e6d42c..5f55d9c 100644
--- a/ambari-web/app/utils/ajax.js
+++ b/ambari-web/app/utils/ajax.js
@@ -565,6 +565,7 @@ var urls = {
   },
   'admin.high_availability.stop_all_services': {
     'real': '/clusters/{clusterName}/services?ServiceInfo/state=STARTED',
+    'mock': '',
     'format': function (data, opt) {
       return {
         type: 'PUT',
@@ -583,6 +584,7 @@ var urls = {
   },
   'admin.high_availability.start_all_services': {
     'real': '/clusters/{clusterName}/services?ServiceInfo/state=INSTALLED',
+    'mock': '',
     'format': function (data, opt) {
       return {
         type: 'PUT',
@@ -622,8 +624,27 @@ var urls = {
       }
     }
   },
+  'admin.high_availability.create_journalnode': {
+    'real': '/clusters/{clusterName}/services?ServiceInfo/service_name=HDFS',
+    'mock': '',
+    'type': 'POST',
+    'format': function (data) {
+      return {
+        data: JSON.stringify({
+          "components": [
+            {
+              "ServiceComponentInfo": {
+                "component_name": "JOURNALNODE"
+              }
+            }
+          ]
+        })
+      }
+    }
+  },
   'admin.high_availability.install_component': {
     'real': '/clusters/{clusterName}/hosts/{hostName}/host_components/{componentName}',
+    'mock': '',
     'type': 'PUT',
     'format': function (data) {
       return {
@@ -641,16 +662,17 @@ var urls = {
     }
   },
   'admin.high_availability.start_component': {
-    'real': '/clusters/{clusterName}/services/{serviceName}',
+    'real': '/clusters/{clusterName}/hosts/{hostName}/host_components/{componentName}',
+    'mock': '',
     'type': 'PUT',
     'format': function (data) {
       return {
         data: JSON.stringify({
           RequestInfo: {
-            "context": "Start service " + data.displayName
+            "context": "Start " + data.displayName
           },
           Body: {
-            ServiceInfo: {
+            "HostRoles": {
               "state": "STARTED"
             }
           }
@@ -660,6 +682,7 @@ var urls = {
   },
   'admin.high_availability.maintenance_mode': {
     'real': '/clusters/{clusterName}/hosts/{hostName}/host_components/{componentName}',
+    'mock': '',
     'type': 'PUT',
     'format': function () {
       return {
@@ -671,6 +694,30 @@ var urls = {
       }
     }
   },
+  'admin.high_availability.load_configs': {
+    'real': '/clusters/{clusterName}/configurations?(type=core-site&tag={coreSiteTag})|(type=hdfs-site&tag={hdfsSiteTag})',
+    'mock': '',
+    'type': 'GET'
+  },
+  'admin.high_availability.save_configs': {
+    'real': '/clusters/{clusterName}',
+    'mock': '',
+    'type': 'PUT',
+    'format': function (data) {
+      return {
+        async: false,
+        data: JSON.stringify({
+          Clusters: {
+            desired_config: {
+              "type": data.siteName,
+              "tag": 'version' + (new Date).getTime(),
+              "properties": data.properties
+            }
+          }
+        })
+      }
+    }
+  },
   'admin.security.cluster_configs': {
     'real': '/clusters/{clusterName}',
     'format': function (data, opt) {