You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by is...@apache.org on 2018/01/30 18:45:31 UTC

[ambari] branch branch-feature-AMBARI-14714-ui updated: [AMBARI-22804] Install Wizard final deployment of services from multiple mpacks (#199)

This is an automated email from the ASF dual-hosted git repository.

ishanbha pushed a commit to branch branch-feature-AMBARI-14714-ui
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714-ui by this push:
     new 9c930c4  [AMBARI-22804] Install Wizard final deployment of services from multiple mpacks (#199)
9c930c4 is described below

commit 9c930c499b074b990ddd833b3273e3616e2d3cbc
Author: Jason Golieb <j...@golieb.net>
AuthorDate: Tue Jan 30 13:45:29 2018 -0500

    [AMBARI-22804] Install Wizard final deployment of services from multiple mpacks (#199)
    
    * AMBARI-22802 Styling for install wizard
    
    * Install services from multiple mpacks. Service groups are created with names hard-coded to be <mpackId>-<mpackVersion>.
    
    * Fixed unit tests.
    
    * Moved style changes out of bootstrap-ambari.css
    
    * Additional style tweaks.
    
    * Additional style tweaks.
    
    * Restore line removed by wrong conflict resolution.
    
    * More style tweaks.
    
    * Moved tooltip activation to individual components.
    
    * Merge branch 'branch-feature-AMBARI-14714-ui' into AMBARI-22804_multi-mpack-deployment
---
 ambari-web/app/controllers/installer.js            |  7 +-
 .../wizard/downloadMpacks_controller.js            |  2 -
 .../controllers/wizard/selectMpacks_controller.js  |  2 +-
 .../app/controllers/wizard/step8_controller.js     | 90 ++++++++++++----------
 ambari-web/app/messages.js                         |  1 -
 ambari-web/app/models/repository.js                |  7 +-
 ambari-web/app/styles/application.less             | 16 ++--
 ambari-web/app/styles/bootstrap_overrides.less     |  1 +
 ambari-web/app/styles/wizard.less                  | 30 ++++----
 .../templates/common/assign_master_components.hbs  | 10 +--
 ambari-web/app/templates/wizard/downloadMpacks.hbs | 12 +--
 ambari-web/app/templates/wizard/selectMpacks.hbs   | 10 +--
 ambari-web/app/templates/wizard/step10.hbs         |  8 +-
 ambari-web/app/templates/wizard/step2.hbs          |  2 +-
 ambari-web/app/templates/wizard/step3.hbs          |  2 +-
 ambari-web/app/templates/wizard/step6.hbs          |  6 +-
 ambari-web/app/templates/wizard/step7.hbs          |  4 +-
 ambari-web/app/templates/wizard/step8.hbs          | 16 ++--
 ambari-web/app/templates/wizard/step9.hbs          |  4 +-
 ambari-web/app/templates/wizard/verifyProducts.hbs | 12 +--
 ambari-web/app/views/common/breadcrumbs_view.js    |  3 +
 ambari-web/test/controllers/wizard/step8_test.js   |  6 +-
 22 files changed, 135 insertions(+), 116 deletions(-)

diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js
index 2f56ab8..5712647 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -1523,11 +1523,8 @@ App.InstallerController = App.WizardController.extend(App.Persist, {
         this.set('content.clients', clients);
         this.save('clients');
 
-        //TODO: mpacks
-        // - for now, pull the stack from the single mpack that we can install
-        // - when we can support multiple mpacks, make this an array of selectedStacks (or just use the selectedServices array?) and add the repo data to it
-        const selectedService = selectedServices[0];
-        this.set('content.selectedStack', { name: selectedService.stackName, version: selectedService.stackVersion });
+        //TODO: mpacks - hard coding this for now. We need to get rid of the concept of "selected stack".
+        this.set('content.selectedStack', { name: "HDP", version: "3.0.0" });
         this.save('selectedStack');
       });
     });
diff --git a/ambari-web/app/controllers/wizard/downloadMpacks_controller.js b/ambari-web/app/controllers/wizard/downloadMpacks_controller.js
index c4de24d..1266e24 100644
--- a/ambari-web/app/controllers/wizard/downloadMpacks_controller.js
+++ b/ambari-web/app/controllers/wizard/downloadMpacks_controller.js
@@ -118,8 +118,6 @@ App.WizardDownloadMpacksController = App.WizardStepController.extend({
           )
         );
 
-        //TODO: mpacks
-        //var versionData = installerController.getSelectedRepoVersionData(); //This would be used to post a VDF xml for a local repo (I think), but do we still need to do this when we will just be using mpacks?
         $.when(...stackVersionsRegistered).always(() => { //this uses always() because the api call made by createMpackStackVersion will return a 500 error
                                                           //if the stack version has already been registered, but we want to proceed anyway
           App.router.send('next');
diff --git a/ambari-web/app/controllers/wizard/selectMpacks_controller.js b/ambari-web/app/controllers/wizard/selectMpacks_controller.js
index 38047f3..da37323 100644
--- a/ambari-web/app/controllers/wizard/selectMpacks_controller.js
+++ b/ambari-web/app/controllers/wizard/selectMpacks_controller.js
@@ -152,7 +152,7 @@ App.WizardSelectMpacksController = App.WizardStepController.extend({
     const mpacks = this.get('content.mpacks');
 
     if (mpacks) {
-      //TODO: mpacks - reinstate this if/when the test runner can handle it
+      //reinstate this if/when the test runner can handle for..of loops
       //for (let mpack of mpacks) {
       //if (mpack.get('name') === mpackName) {
       //  return mpack.get('versions')[0]; //TODO: mpacks - change this to the last item when sort order is fixed
diff --git a/ambari-web/app/controllers/wizard/step8_controller.js b/ambari-web/app/controllers/wizard/step8_controller.js
index 595bad0..1330bc3 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -156,7 +156,7 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi
   getSelectedStack: function() {
     const selectedStack = this.get('content.selectedStack');
     const stack = this.get('wizardController').getStack(selectedStack.name, selectedStack.version);
-    return stack;
+    return stack;    
   },
 
   installedServices: function() {
@@ -917,31 +917,12 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi
   },
 
   /**
-   * To Start deploy process
-   * @method startDeploy
-   */
-   //TODO: mpacks
-  startDeploy: function () {
-    const self = this;
-
-    if (!this.get('isInstaller')) {
-      this._startDeploy();
-    } else {
-      const selectedStack = this.getSelectedStack();
-      //skip this because we already updated the repo URLs if they were customized in the customProductRepos step's submit action
-      //this.get('wizardController').updateRepoOSInfo({ id: selectedStack.get('id'), stackName: selectedStack.get('stackName'), stackVersion: selectedStack.get('stackVersion') }, selectedStack).done(function() {
-        self._startDeploy();
-      //});
-    }
-  },
-
-  /**
    * Start deploy process
    * @method startDeploy
    */
-  _startDeploy: function () {
+  startDeploy: function () {
     this.createCluster();
-    this.createServiceGroup();
+    this.createServiceGroups();
     this.createSelectedServices();
     if (!this.get('isAddHost')) {
       if (this.get('isAddService')) {
@@ -983,7 +964,6 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi
    * Queued request
    * @method createCluster
    */
-   //TODO: mpacks
   createCluster: function () {
     if (!this.get('isInstaller')) return;
     const selectedStack = this.getSelectedStack()
@@ -1001,18 +981,45 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi
   },
 
   /**
-   * Creates the servcegroup
+   * Creates one service group per mpack.
+   * Skip if no mpacks were selected.
    * Queued request
    * @method createServiceGroup
    */
-  createServiceGroup: function () {
+  createServiceGroups: function () {
     if (!this.get('isInstaller')) return;
-    this.addRequestToAjaxQueue({
-      name: 'wizard.step8.create_service_group',
-      data: {
-        data: JSON.stringify({ "ServiceGroupInfo": { "cluster_name": App.get('clusterName') || App.clusterStatus.get('clusterName'), "service_group_name": App.get('defaultServiceGroupName') }})
-      }
-    });
+    
+    var data = this.createServiceGroupsData();
+    if (data) {
+      this.addRequestToAjaxQueue({
+        name: 'wizard.step8.create_service_group',
+        data: {
+          data: JSON.stringify(data)
+        }
+      });
+    } 
+  },
+
+  /**
+   * Format data for <code>createServiceGroups</code> request
+   * @returns {Object[]}
+   * @method createServiceGroupsData
+   */
+  createServiceGroupsData: function () {
+    const mpacks = this.get('selectedMpacks');
+    
+    if (mpacks) {
+      const serviceGroups = mpacks.map(mpack => ({
+          "ServiceGroupInfo": {
+            "service_group_name": `${mpack.name}-${mpack.version}`,
+          }
+        })
+      );
+
+      return serviceGroups;
+    }
+
+    return null;
   },
 
   /**
@@ -1037,15 +1044,20 @@ App.WizardStep8Controller = App.WizardStepController.extend(App.AddSecurityConfi
    * @returns {Object[]}
    * @method createSelectedServicesData
    */
-   //TODO: mpacks
   createSelectedServicesData: function () {
-    var selectedStack;
-    if (this.get('isInstaller')) {
-      selectedStack = this.getSelectedStack();
-    }
-    return this.get('selectedServices').map(service => selectedStack ?
-      {"ServiceInfo": { "service_name": service.get('serviceName'), "service_type": service.get('serviceName'), "service_group_name": App.get('defaultServiceGroupName'), "desired_repository_version_id": selectedStack.get('id') }} :
-      {"ServiceInfo": { "service_name": service.get('serviceName'), "service_type": service.get('serviceName'), "service_group_name": App.get('defaultServiceGroupName'), }});
+    const services = this.get('selectedServices');
+    const data = services.map(service => ({
+        "ServiceInfo": {
+          "service_name": service.get('serviceName'),
+          "service_type": service.get('serviceName'),
+          //TODO: mpacks - needs to be revisited when we are no longer hard coding service groups to be named 
+          //               for mpacks and when the concept of a "selected stack" is no longer a thing
+          "service_group_name": `${service.get('stackName')}-${service.get('stackVersion')}`,
+          "desired_stack": `${service.get('stackName')}-${service.get('stackVersion')}`,
+        }
+      })
+    );
+    return data;
   },
 
   /**
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 70705ce..bba8fe7 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -591,7 +591,6 @@ Em.I18n.translations = {
   'installer.header':'Cluster Install Wizard',
   'installer.navigation.warning.header':'Navigation Warning',
   'installer.navigation.warning':'If you make changes to a previous step you will lose any changes saved in subsequent steps.',
-  'installer.warning.changes.header':'Warning',
   'installer.warning.changes':'If you make changes to this step you will lose any changes saved in subsequent steps.',
   'installer.noHostsAssigned':'No host assigned',
   'installer.slaveComponentHosts.selectHosts':'select hosts for this group',
diff --git a/ambari-web/app/models/repository.js b/ambari-web/app/models/repository.js
index b501d62..f03976e 100644
--- a/ambari-web/app/models/repository.js
+++ b/ambari-web/app/models/repository.js
@@ -80,8 +80,11 @@ App.Repository = DS.Model.extend({
    * @type {boolean}
    */
   showRepo: function () {
-    const isGPLAccepted = App.router.get('clusterController.ambariProperties')['gpl.license.accepted'] === 'true';
-    return isGPLAccepted || !this.get('isGPL');
+    const ambariProperties = App.router.get('clusterController.ambariProperties');
+    if (ambariProperties && ambariProperties['gpl.license.accepted'] === true) {
+      return true;
+    }
+    return !this.get('isGPL');
   }.property('isGPL'),
 
   undo: Em.computed.notEqualProperties('baseUrl', 'baseUrlInit'),
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index e21dcb4..5f6beae 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -2825,12 +2825,13 @@ a.abort-icon:hover {
     font-style: normal;
   }
 }
+
 .display-flex {
-  display: flex;
-  display: -webkit-flex;
-  display: -moz-flex;
-  display: -ms-flex;
-  display: -o-flex;
+  display: flex !important;
+  display: -webkit-flex !important;
+  display: -moz-flex !important;
+  display: -ms-flex !important;
+  display: -o-flex !important;
   &.direction-row {
     flex-direction: row;
   }
@@ -2843,8 +2844,13 @@ a.abort-icon:hover {
   &.justify-center {
     justify-content: center;
   }
+  
+  .flex-fill {
+    flex: auto;
+  }
 }
 
+
 .no-data {
   position: absolute;
   color: #ccc;
diff --git a/ambari-web/app/styles/bootstrap_overrides.less b/ambari-web/app/styles/bootstrap_overrides.less
index 94309e9..905fc84 100644
--- a/ambari-web/app/styles/bootstrap_overrides.less
+++ b/ambari-web/app/styles/bootstrap_overrides.less
@@ -506,6 +506,7 @@ select.form-control {
   background-color: inherit;
 }
 .wizard .wizard-body .wizard-nav {
+  min-width: 250px;
   padding: 30px;
   background-color: #333;
   margin-bottom: 0;
diff --git a/ambari-web/app/styles/wizard.less b/ambari-web/app/styles/wizard.less
index 129c812..ad7fcb1 100644
--- a/ambari-web/app/styles/wizard.less
+++ b/ambari-web/app/styles/wizard.less
@@ -873,7 +873,7 @@
       }
       input[type="radio"]:checked + label:before {
         background: #fff;
-        border-width: 4px;
+        border-width: 3px;
         border-color: #1491c1;
       }
       input[type="radio"]:checked + label:after {
@@ -945,6 +945,7 @@
   .table.table-hover > tbody {
     > tr > td {
       vertical-align: middle;
+      line-height: 20px;
     }
   }
 }
@@ -954,6 +955,7 @@
   .table.table-hover > tbody {
     > tr > td {
       border-width: 0;
+      line-height: 20px;
     }
     > tr, > tr:hover > td {
       border-width: 0;
@@ -969,16 +971,11 @@
 
 #downloadMpacks,
 #verifyProductRepos {
-  .download-status {
-    .progress-wrapper {
-      padding:0px;
-      .progress {
-        height:8px;
-        margin:5px 5px 5px 0;
-        .progress-bar {
-          width:100%;
-        }
-      }
+  .progress {
+    width: 75%;
+    margin: 0;
+    .progress-bar {
+      width: 100%;
     }
   }
 }
@@ -995,12 +992,6 @@
     padding: 0;
     .wizard {
       border: none;
-      .wizard-nav {
-        width: 250px;
-      }
-      .wizard-content.col-md-9 {
-        width: calc(~"100% - 250px");
-      }
     }
   }
 }
@@ -1027,4 +1018,9 @@
   flex: auto;
   margin-right: 10px;
   text-align: left;
+}
+
+.dropdown-menu input[type="checkbox"]:checked + label:after,
+.table input[type="checkbox"]:checked + label:after {
+  line-height: 2;
 }
\ No newline at end of file
diff --git a/ambari-web/app/templates/common/assign_master_components.hbs b/ambari-web/app/templates/common/assign_master_components.hbs
index 49eaa10..399e36a 100644
--- a/ambari-web/app/templates/common/assign_master_components.hbs
+++ b/ambari-web/app/templates/common/assign_master_components.hbs
@@ -17,17 +17,17 @@
 }}
 <div id="assign-masters" class="wizard-content col-md-9">
 {{#if view.showTitle}}
-  <h4 class="step-header">{{view.title}}</h4>
+  <h4 class="step-title">{{view.title}}</h4>
 {{/if}}
-  <p class="step-description">
-    {{{view.alertMessage}}}
-  </p>
   {{#if isSaved}}
-  <div class="alert alert-warning" role="alert"><strong>{{t installer.warning.changes.header}}</strong> {{t installer.warning.changes}}</div>
+  <div class="alert alert-warning" role="alert"><strong>{{t common.warning}}:</strong> {{t installer.warning.changes}}</div>
   {{/if}}
 
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">
+        {{{view.alertMessage}}}
+      </p>
       {{#each msg in controller.generalErrorMessages}}
         <div class="alert alert-danger">{{msg}}</div>
       {{/each}}
diff --git a/ambari-web/app/templates/wizard/downloadMpacks.hbs b/ambari-web/app/templates/wizard/downloadMpacks.hbs
index fc84b68..0f46c28 100644
--- a/ambari-web/app/templates/wizard/downloadMpacks.hbs
+++ b/ambari-web/app/templates/wizard/downloadMpacks.hbs
@@ -39,10 +39,8 @@
               <td class="col-sm-6">{{mpack.displayName}}&nbsp;{{mpack.version}}</td>
               <td class="download-status col-sm-4">
                 {{#if mpack.inProgress}}
-                  <div class="progress-wrapper">
-                    <div class="progress">
-                      <div class="active progress-bar-striped progress-bar"}}></div>
-                    </div>
+                  <div class="progress">
+                    <div class="active progress-bar-striped progress-bar"></div>
                   </div>
                 {{else}}
                   {{#if mpack.succeeded}}
@@ -56,7 +54,11 @@
               </td>
               <td class="col-sm-2">
                 <span data-toggle="tooltip" data-placement="bottom" {{translateAttr title="common.retry"}}>
-                  <button type="button" class="icon-button retry-button" {{bindAttr disabled="mpack.succeeded"}} {{action retryDownload mpack target="controller"}}></button>
+                  {{#if mpack.failed}}
+                  <button type="button" class="icon-button retry-button" {{action retryDownload mpack target="controller"}}></button>
+                  {{else}}
+                  <button type="button" class="icon-button retry-button" disabled="disabled"></button>
+                  {{/if}}
                 </span>
               </td>
             </tr>
diff --git a/ambari-web/app/templates/wizard/selectMpacks.hbs b/ambari-web/app/templates/wizard/selectMpacks.hbs
index dd8536a..9a1bb7f 100644
--- a/ambari-web/app/templates/wizard/selectMpacks.hbs
+++ b/ambari-web/app/templates/wizard/selectMpacks.hbs
@@ -18,11 +18,11 @@
 <div id="select-mpacks" class="wizard-content col-md-9">
   <h4 class="step-title">{{t installer.selectMpacks.body.header}}</h4>
   {{#if isSaved}}
-  <div class="alert alert-warning" role="alert"><strong>{{t installer.warning.changes.header}}</strong> {{t installer.warning.changes}}</div>
+  <div class="alert alert-warning" role="alert"><strong>{{t common.warning}}:</strong> {{t installer.warning.changes}}</div>
   {{/if}}
   <div class="display-flex">
     <!-- Registry -->
-    <div id="registry" class="panel panel-default col-md-8">
+    <div id="registry" class="panel panel-default col-md-8 display-flex direction-col">
       <div class="panel-heading display-flex align-center">
         <div id="useCaseHeader">
         {{#if controller.content.advancedMode}}
@@ -51,7 +51,7 @@
         <span class="more-info" data-toggle="tooltip" data-placement="bottom" {{translateAttr title="installer.selectMpacks.basicModeHelp"}}></span>
         {{/if}}
       </div>
-      <div class="panel-body tab-content">
+      <div class="panel-body tab-content flex-fill">
         {{#if controller.content.advancedMode}}
         <div role="tabpanel" class="tab-pane active" id="mpacks">
           <div class="options-list">
@@ -91,9 +91,9 @@
       </div>
     </div>
     <!-- Selection -->
-    <div class="panel panel-default col-md-4 selected-list">
+    <div class="panel panel-default col-md-4 selected-list display-flex direction-col">
       <div class="panel-heading">{{t installer.selectMpacks.body.selected.header}}&nbsp;({{controller.selectedMpackVersions.length}})</div>
-      <div class="panel-body">
+      <div class="panel-body flex-fill">
         {{#if controller.hasSelectedMpackVersions}}
         {{#each mpackVersion in controller.selectedMpackVersions}}
           {{view App.WizardSelectedMpackVersionView mpackVersionBinding="mpackVersion"}}
diff --git a/ambari-web/app/templates/wizard/step10.hbs b/ambari-web/app/templates/wizard/step10.hbs
index 84e744d..a849cdb 100644
--- a/ambari-web/app/templates/wizard/step10.hbs
+++ b/ambari-web/app/templates/wizard/step10.hbs
@@ -16,17 +16,17 @@
 * limitations under the License.
 }}
 <div id="deploy-summary" class="wizard-content col-md-9">
-  <h4 class="step-header">{{t installer.step10.header}}</h4>
+  <h4 class="step-title">{{t installer.step10.header}}</h4>
   {{#if view.serviceRestartText}}
     <div id="step10-alert-message" class="step-description">
       {{{view.serviceRestartText}}}
     </div>
   {{/if}}
-  <p class="step-description">
-    {{t installer.step10.body}}
-  </p>
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">
+        {{t installer.step10.body}}
+      </p>
       <div id="step10-content" class="well pre-scrollable" {{QAAttr "summary"}}>
         <ul>
           {{#each item in clusterInfo}}
diff --git a/ambari-web/app/templates/wizard/step2.hbs b/ambari-web/app/templates/wizard/step2.hbs
index 7d523b9..aa5dd04 100644
--- a/ambari-web/app/templates/wizard/step2.hbs
+++ b/ambari-web/app/templates/wizard/step2.hbs
@@ -19,7 +19,7 @@
 <div id="installOptions" class="wizard-content col-md-9">
   <h4 class="step-title">{{t installer.step2.header}}</h4>
   {{#if isSaved}}
-    <div class="alert alert-warning" role="alert"><strong>{{t installer.warning.changes.header}}</strong> {{t installer.warning.changes}}</div>
+  <div class="alert alert-warning" role="alert"><strong>{{t common.warning}}:</strong> {{t installer.warning.changes}}</div>
   {{/if}}
 
   <div class="panel panel-default">
diff --git a/ambari-web/app/templates/wizard/step3.hbs b/ambari-web/app/templates/wizard/step3.hbs
index c60d811..0221d86 100644
--- a/ambari-web/app/templates/wizard/step3.hbs
+++ b/ambari-web/app/templates/wizard/step3.hbs
@@ -19,7 +19,7 @@
 <div id="confirm-hosts" class="wizard-content col-md-9">
   <h4 class="step-title">{{t installer.step3.header}}</h4>
   {{#if isSaved}}
-  <div class="alert alert-warning" role="alert"><strong>{{t installer.warning.changes.header}}</strong> {{t installer.warning.changes}}</div>
+  <div class="alert alert-warning" role="alert"><strong>{{t common.warning}}:</strong> {{t installer.warning.changes}}</div>
   {{/if}}
 
   <div class="panel panel-default">
diff --git a/ambari-web/app/templates/wizard/step6.hbs b/ambari-web/app/templates/wizard/step6.hbs
index 8d9e883..2e69e69 100644
--- a/ambari-web/app/templates/wizard/step6.hbs
+++ b/ambari-web/app/templates/wizard/step6.hbs
@@ -17,14 +17,14 @@
 }}
 
 <div id="step6" class="wizard-content col-md-9">
-  <h4 class="step-header" {{QAAttr "step-title"}}>{{t installer.step6.header}}</h4>
-  <p class="step-description">{{{view.label}}}</p>
+  <h4 class="step-title" {{QAAttr "step-title"}}>{{t installer.step6.header}}</h4>
   {{#if isSaved}}
-  <div class="alert alert-warning" role="alert"><strong>{{t installer.warning.changes.header}}</strong> {{t installer.warning.changes}}</div>
+  <div class="alert alert-warning" role="alert"><strong>{{t common.warning}}:</strong> {{t installer.warning.changes}}</div>
   {{/if}}
 
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">{{{view.label}}}</p>
       {{#if anyGeneralIssues}}
         <div class="alert alert-danger" {{QAAttr "error-message"}}>
           {{t installer.step6.validationSlavesAndClients.hasIssues}}
diff --git a/ambari-web/app/templates/wizard/step7.hbs b/ambari-web/app/templates/wizard/step7.hbs
index 649f5d9..60e36cb 100644
--- a/ambari-web/app/templates/wizard/step7.hbs
+++ b/ambari-web/app/templates/wizard/step7.hbs
@@ -17,11 +17,11 @@
 }}
 
 <div id="serviceConfig" class="wizard-content col-md-9" {{QAAttr "service-configs"}}>
-  <h4 class="step-header" {{QAAttr "step-title"}}>{{t installer.step7.header}}{{controller.finnalyLoaded}}</h4>
-  <p class="step-description">{{t installer.step7.body}}</p>
+  <h4 class="step-title" {{QAAttr "step-title"}}>{{t installer.step7.header}}{{controller.finnalyLoaded}}</h4>
 
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">{{t installer.step7.body}}</p>
       {{#if isConfigsLoaded}}
         {{view App.ServicesConfigView}}
       {{else}}
diff --git a/ambari-web/app/templates/wizard/step8.hbs b/ambari-web/app/templates/wizard/step8.hbs
index 7fc9ff1..035c37a 100644
--- a/ambari-web/app/templates/wizard/step8.hbs
+++ b/ambari-web/app/templates/wizard/step8.hbs
@@ -16,17 +16,17 @@
 * limitations under the License.
 }}
 <div id="deploy-review" class="wizard-content col-md-9">
-  <h4 class="step-header">{{t installer.step8.header}}</h4>
-  <p class="step-description">
-    {{t installer.step8.body}}
-    {{#if controller.isManualKerberos}}
-      <br/><br/>
-      {{t installer.step8.kerberors.warning}}
-    {{/if}}
-  </p>
+  <h4 class="step-title">{{t installer.step8.header}}</h4>
 
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">
+        {{t installer.step8.body}}
+        {{#if controller.isManualKerberos}}
+          <br/><br/>
+          {{t installer.step8.kerberors.warning}}
+        {{/if}}
+      </p>
       <div id="step8-content" class="well pre-scrollable" {{QAAttr "review-content"}}>
         <div id="step8-info">
           {{#each item in controller.clusterInfo}}
diff --git a/ambari-web/app/templates/wizard/step9.hbs b/ambari-web/app/templates/wizard/step9.hbs
index 155eb17..0f74396 100644
--- a/ambari-web/app/templates/wizard/step9.hbs
+++ b/ambari-web/app/templates/wizard/step9.hbs
@@ -17,11 +17,11 @@
 }}
 
 <div id="deploy" class="wizard-content col-md-9">
-  <h4 class="step-header">{{t installer.step9.header}}</h4>
-  <p class="step-description">{{t installer.step9.body}}</p>
+  <h4 class="step-title">{{t installer.step9.header}}</h4>
 
   <div class="panel panel-default">
     <div class="panel-body">
+      <p class="step-description">{{t installer.step9.body}}</p>
       <div class="row" {{QAAttr "overall-progress"}}>
         <div class="col-md-10">
           <div class="progress" {{QAAttr "progress-{status}"}}>
diff --git a/ambari-web/app/templates/wizard/verifyProducts.hbs b/ambari-web/app/templates/wizard/verifyProducts.hbs
index c973e33..a5a12ab 100644
--- a/ambari-web/app/templates/wizard/verifyProducts.hbs
+++ b/ambari-web/app/templates/wizard/verifyProducts.hbs
@@ -58,10 +58,8 @@
                     <td class="col-sm-3">{{repo.repoId}}</td>
                     <td class="download-status col-sm-3">
                       {{#if repo.inProgress}}
-                        <div class="progress-wrapper">
-                          <div class="progress">
-                            <div class="active progress-bar-striped progress-bar"}}></div>
-                          </div>
+                        <div class="progress">
+                          <div class="active progress-bar-striped progress-bar"}}></div>
                         </div>
                       {{else}}
                         {{#if repo.succeeded}}
@@ -75,7 +73,11 @@
                     </td>
                     <td class="col-sm-2">
                       <span data-toggle="tooltip" data-placement="bottom" {{translateAttr title="common.retry"}}>
-                        <button type="button" class="icon-button retry-button" {{bindAttr disabled="repo.succeeded"}} {{action retryVerifyRepo repo target="controller"}}></button>
+                        {{#if repo.failed}}
+                        <button type="button" class="icon-button retry-button" {{action retryVerifyRepo repo target="controller"}}></button>
+                        {{else}}
+                        <button type="button" class="icon-button retry-button" disabled="disabled"></button>
+                        {{/if}}
                       </span>
                     </td>
                   </tr>
diff --git a/ambari-web/app/views/common/breadcrumbs_view.js b/ambari-web/app/views/common/breadcrumbs_view.js
index 7c5ec4e..6c2cfda 100644
--- a/ambari-web/app/views/common/breadcrumbs_view.js
+++ b/ambari-web/app/views/common/breadcrumbs_view.js
@@ -203,6 +203,9 @@ App.BreadcrumbsView = Em.View.extend({
           if (!route && !disabled) {
             currentState.breadcrumbs.route = currentState.absoluteRoute(App.router).replace('/main/', '');
           }
+          if (typeof label === "function") {
+            currentState.breadcrumbs.label = label();
+          }
           items.pushObject(currentState.breadcrumbs);
         }
       }
diff --git a/ambari-web/test/controllers/wizard/step8_test.js b/ambari-web/test/controllers/wizard/step8_test.js
index c813746..0b69c6c 100644
--- a/ambari-web/test/controllers/wizard/step8_test.js
+++ b/ambari-web/test/controllers/wizard/step8_test.js
@@ -1992,9 +1992,9 @@ describe('App.WizardStep8Controller', function () {
 
   });
 
-  describe('#_startDeploy', function () {
+  describe('#startDeploy', function () {
 
-    var stubbedNames = ['createCluster', 'createServiceGroup', 'createSelectedServices', 'createConfigurations',
+    var stubbedNames = ['createCluster', 'createServiceGroups', 'createSelectedServices', 'createConfigurations',
         'applyConfigurationsToCluster', 'createComponents', 'registerHostsToCluster', 'createConfigurationGroups',
         'createMasterHostComponents', 'createSlaveAndClientsHostComponents', 'createAdditionalClientComponents',
         'createAdditionalHostComponents'],
@@ -2074,7 +2074,7 @@ describe('App.WizardStep8Controller', function () {
             return Em.get(this, key);
           });
           installerStep8Controller.set('content.controllerName', item.controllerName);
-          installerStep8Controller._startDeploy();
+          installerStep8Controller.startDeploy();
         });
 
         stubbedNames.forEach(function (name) {

-- 
To stop receiving notification emails like this one, please contact
ishanbha@apache.org.