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

[ambari] branch branch-feature-AMBARI-14714-ui updated: [AMBARI-23006] upgrade admin (#471)

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

jonathanhurley 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 37a7f14  [AMBARI-23006] upgrade admin (#471)
37a7f14 is described below

commit 37a7f14afb5a8d1695a57975c36a2af0bf345be9
Author: Jason Golieb <j...@golieb.net>
AuthorDate: Thu Mar 1 13:23:18 2018 -0500

    [AMBARI-23006] upgrade admin (#471)
---
 .../main/admin/serviceGroups_controller.js         | 118 ++++++++++++---
 ambari-web/app/messages.js                         |  23 +--
 ambari-web/app/styles/application.less             | 168 ++++++++++++++++-----
 ambari-web/app/templates.js                        |   1 +
 ambari-web/app/templates/common/dashrow.hbs        |   2 +-
 .../app/templates/common/mpackComparison.hbs       |  39 +++++
 .../app/templates/main/admin/serviceGroups.hbs     |  16 +-
 .../{body.hbs => serviceGroupBody.hbs}             |   0
 .../{header.hbs => serviceGroupHeader.hbs}         |   0
 .../{menu.hbs => serviceGroupMenu.hbs}             |   0
 .../main/admin/serviceGroups/startUpgradePlan.hbs  |  18 +--
 .../{body.hbs => upgradeStatusBody.hbs}            |  44 +++---
 .../{body.hbs => upgradeStatusHeader.hbs}          |  36 ++---
 .../{menu.hbs => upgradeStatusMenu.hbs}            |   6 +-
 ambari-web/app/views.js                            |  11 +-
 ambari-web/app/views/common/dashrow_view.js        |   3 +
 .../main/admin/serviceGroups/serviceGroup_view.js  |   6 +-
 .../main/admin/serviceGroups/upgradeStatus_view.js |  73 +++++++++
 .../app/views/main/admin/serviceGroups_view.js     |  42 ++++--
 19 files changed, 456 insertions(+), 150 deletions(-)

diff --git a/ambari-web/app/controllers/main/admin/serviceGroups_controller.js b/ambari-web/app/controllers/main/admin/serviceGroups_controller.js
index 431b2c4..d4ff2ef 100644
--- a/ambari-web/app/controllers/main/admin/serviceGroups_controller.js
+++ b/ambari-web/app/controllers/main/admin/serviceGroups_controller.js
@@ -18,12 +18,6 @@
 
 var App = require('app');
 
-const VersionType = {
-  HOTFIX: 'hotfix',
-  PATCH: 'patch',
-  RELEASE: 'release'
-}  
-
 App.MainAdminServiceGroupsController = Em.Controller.extend(App.LocalStorage, {
   name: 'mainAdminServiceGroupsController',
 
@@ -162,24 +156,98 @@ App.MainAdminServiceGroupsController = Em.Controller.extend(App.LocalStorage, {
     }
   ],
 
-  // /**
-  //  * data to load from local storage
-  //  */
-  // dbPropsToLoad: [ ],
-
-  // init: function () {
-  //   this.initDBProperties();
-  // },
+  // upgrade: null,
+  upgrade: {
+    id: "upgrade-1",
+    currentStep: "prerequisites", //can be "prerequisites", "install", or "upgrade"
+    //currentStep: "install", //can be "prerequisites", "install", or "upgrade"
+    //currentStep: "upgrade", //can be "prerequisites", "install", or "upgrade"
+    history: [
+      {
+        name: "Event 1",
+        user: "Jason",
+        date: new Date(2018,1,1)
+      },
+      {
+        name: "Event 2",
+        user: "Jason",
+        date: new Date(2018,2,1)
+      },
+      {
+        name: "Event 3",
+        user: "Jason",
+        date: new Date(2017,3,1)
+      },
+      {
+        name: "Event 4",
+        user: "Jason",
+        date: new Date(2017,4,1)
+      },
+      {
+        name: "Event 5",
+        user: "Jason",
+        date: new Date(2017,5,1)
+      }
+    ],
+    mpacks: [
+      {
+        name: "Hortonworks Data Platform Core",
+        currentVersion: "2.6",
+        newVersion: "2.7",
+        services: [
+          {
+            name: "HDFS",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "Zookeeper",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "Zookeeper Client",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "MapReduce",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          }
+        ]
+      },
+      {
+        name: "Data Science and Machine Learning",
+        currentVersion: "2.1",
+        newVersion: "2.2",
+        services: [
+          {
+            name: "HDFS",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "Zookeeper",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "Zookeeper Client",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          },
+          {
+            name: "MapReduce",
+            currentVersion: "2.6",
+            newVersion: "3.0"
+          }
+        ]
+      }
+    ]
+  },
 
-  // /**
-  //  * restore data from localStorage
-  //  */
-  // initDBProperties: function () {
-  //   var props = this.getDBProperties(this.get('dbPropsToLoad'));
-  //   Em.keys(props).forEach(function (k) {
-  //     if (!Em.isNone(props[k])) {
-  //       this.set(k, props[k]);
-  //     }
-  //   }, this);
-  // },
+  createPlan: function () { },
+  editPlan: function () { },
+  discardPlan: function () {}
 });
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 057d9ba..d55cb46 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -90,6 +90,7 @@ Em.I18n.translations = {
   'common.access':'Access',
   'common.action':'Action',
   'common.actions': 'Actions',
+  'common.activity': 'Activity',
   'common.add': 'Add',
   'common.additional': 'Additional',
   'common.advanced': 'Advanced',
@@ -129,6 +130,7 @@ Em.I18n.translations = {
   'common.custom': 'Custom',
   'common.dataNode':'DataNode',
   'common.dataSet': 'Data Set',
+  'common.date': 'Date',
   'common.days': "Days",
   'common.decommission':'Decommission',
   'common.default':'Default',
@@ -235,7 +237,8 @@ Em.I18n.translations = {
   'common.noHostsFound': 'No Hosts found.',
   'common.na': 'n/a',
   'common.name':'Name',
-  'common.next':'Next',
+  'common.new': 'New',
+  'common.next': 'Next',
   'common.noData': 'No Data',
   'common.noLink': 'No Links',
   'common.notAvailable': 'Not Available',
@@ -1977,16 +1980,16 @@ Em.I18n.translations = {
   'admin.serviceGroups.removeOldVersions': "Remove Old Versions",
   'admin.serviceGroups.startUpgradePlan.title': "Upgrade Process",
   'admin.serviceGroups.startUpgradePlan.description': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris.",
-  'admin.serviceGroups.startUpgradePlan.step1Title': "Upgrade Plan",
-  'admin.serviceGroups.startUpgradePlan.step1Description': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
-  'admin.serviceGroups.startUpgradePlan.step2Title': "Prerequisites",
-  'admin.serviceGroups.startUpgradePlan.step2Description': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
-  'admin.serviceGroups.startUpgradePlan.step3Title': "Install",
-  'admin.serviceGroups.startUpgradePlan.step3Description': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
-  'admin.serviceGroups.startUpgradePlan.step4Title': "Upgrade",
-  'admin.serviceGroups.startUpgradePlan.step4Description': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
+  'admin.serviceGroups.upgradePlan': "Upgrade Plan",
+  'admin.serviceGroups.startUpgradePlan.upgradePlanDescription': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
+  'admin.serviceGroups.startUpgradePlan.prerequisitesDescription': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
+  'admin.serviceGroups.startUpgradePlan.installDescription': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
+  'admin.serviceGroups.startUpgradePlan.upgradeDescription': "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
   'admin.serviceGroups.startUpgradePlan.buttonLabel': 'Create Upgrade Plan',
-
+  'admin.serviceGroups.upgradeStatus.button.prerequisites': 'Review Prerequisites',
+  'admin.serviceGroups.upgradeStatus.button.install': 'Install Products',
+  'admin.serviceGroups.upgradeStatus.button.upgrade': 'Perform Upgrade',
+    
   'admin.stackUpgrade.downgrade.proceed': "Proceed with Downgrade",
   'admin.stackUpgrade.downgrade.body': "Are you sure you wish to abort the upgrade process and downgrade to <b>{0}</b>?",
   'admin.stackUpgrade.downgrade.retry.body': "Are you sure you wish to retry downgrade to <b>{0}</b>?",
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 5239708..2acfcba 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -2573,6 +2573,7 @@ a.abort-icon:hover {
   border-radius: 12px;
   border: none;
   outline: none;
+  white-space: nowrap;
   
   &:hover {
     background-color: #ccc;
@@ -2699,6 +2700,15 @@ td .no-data {
   }
 }
 
+.doc-icon {
+  padding-left: 5px;
+  &:after {
+    content: '\f02d';
+    font-family: 'FontAwesome';
+    color: #666;
+  }
+}
+
 .tooltip {
   font-family: 'Roboto';
   font-size: 10px;
@@ -2912,54 +2922,144 @@ td .no-data {
     margin-right: auto;
     color: #999;
   }
+}
 
-  ol {
-    display: flex;
-    justify-content: space-around;
-    margin: 40px auto;
-    counter-reset: items;
-    
-    li {
-      list-style-type: none;
-      width: 225px;
-      margin: 20px 15px;
-      margin-bottom: 0;
-      color: #999;
+.upgrade-steps {
+  display: flex;
+  justify-content: space-around;
+  margin: 40px auto;
+  counter-reset: items;
+  
+  li {
+    list-style-type: none;
+    width: 225px;
+    margin: 20px 15px;
+    margin-bottom: 0;
+    color: #999;
+    text-align: center;
+    border-color: #999;
+
+    h4 {
+      color: inherit;
+    }
+
+    &:before {
+      display: block;
+      position: relative;
+      left: 50%;
+      transform: translateX(-50%);
+      bottom: 20px;
+      height: 30px;
+      width: 30px;
+      counter-increment: items;
+      content: counter(items);
+      border-color: inherit;
+      border-width: 1px;
+      border-style: solid;
+      border-radius: 100%;
+      font-size: 20px;
+      line-height: 28px;
+    }
+
+    &:not(:last-child):after {
+      width: ~"calc(100% + 1px)";
+      height: 1px;
+      background-color: #999;
+      content: "";
+      position: relative;
+      display: block;
+      bottom: 138px;
+      left: 123px;
+    }
+
+    &.active {
+      color: #3fae2a;
+      border-color: #3fae2a;
+
+      &:before {
+        color: #fff;
+        background-color: #3fae2a;
+      }
+    }
+
+    &.complete {
+      color: #3fae2a;
+      border-color: #3fae2a;
 
       h4 {
         color: #333;
       }
 
       &:before {
-        display: block;
-        position: relative;
-        left: 50%;
-        transform: translateX(-50%);
-        bottom: 20px;
-        height: 30px;
-        width: 30px;
-        counter-increment: items;
-        content: counter(items);
-        border: #999 1px solid;
-        border-radius: 100%;
-        font-size: 20px;
-        line-height: 28px;
+        color: inherit;
+        font-family: "Glyphicons Halflings";
+        content: "\e013";
+        font-size: 18px;
       }
 
-      &:not(:last-child):after {
-        width: ~"calc(100% + 1px)";
-        height: 1px;
-        background-color: #999;
-        content: "";
-        position: relative;
-        display: block;
-        bottom: 138px;
-        left: 123px;
+      &:after {
+        background-color: #3fae2a;
       }
     }
   }
 }
 
+#upgrade-status {
+  .upgrade-steps {
+    margin: 0 -45px;
+    padding: 0;
+
+    li {
+      margin: 0 15px;
+
+      h4 {
+        margin-bottom: 0;
+      }
+
+      &:before {
+        bottom: 0;
+      }
+
+      &:not(:last-child):after {
+        bottom: 44px;
+        left: 127px;
+      }
+    }  
+  }
+}
+
+#upgrade-status-header {
+  display: flex;
+  align-items: center;
+
+  button {
+    width: 200px;
+  }
+}
+
+#upgrade-status-body {
+  margin: 0 -15px;
+  display: flex;
+  
+  > * {
+    //width: ~"calc(50% - 32px)";
+    margin: 0 15px;
+    //float: left;
+  }
+  
+  #plan-history {
+    flex: 2 1 60%;
+  }
+  
+  #plan-mpacks {
+    flex-grow: 1 1 40%;
+  }
+  
+  table {
+    background: inherit;
+  }
+}
+
 .btn-lg {
   text-transform: uppercase;
   outline: none;
diff --git a/ambari-web/app/templates.js b/ambari-web/app/templates.js
index b18cc73..8df1fdb 100644
--- a/ambari-web/app/templates.js
+++ b/ambari-web/app/templates.js
@@ -22,6 +22,7 @@
 
 require('templates/main/service/info/summary/base');
 require('templates/common/progress');
+require('templates/common/mpackComparison');
 require('templates/main/alerts/alert_instance/status');
 require("templates/main/service/widgets/create/step2_number");
 require("templates/main/service/widgets/create/step2_template");
diff --git a/ambari-web/app/templates/common/dashrow.hbs b/ambari-web/app/templates/common/dashrow.hbs
index 822a7c7..8071c49 100644
--- a/ambari-web/app/templates/common/dashrow.hbs
+++ b/ambari-web/app/templates/common/dashrow.hbs
@@ -44,7 +44,7 @@
       {{/if}}
       <button class="collapse-button" type="button" data-toggle="collapse" {{bindAttr data-target="view.collapseTarget" aria-controls="view.collapseId"}} aria-expanded="false"></button>
     </div>
-    <div {{bindAttr id="view.collapseId"}} class="panel-collapse collapse">
+    <div {{bindAttr id="view.collapseId" class=":panel-collapse :collapse view.collapsed::in"}}>
       <div class="panel-body">
         {{#if view.bodyClass}}
           {{view view.bodyClass}}
diff --git a/ambari-web/app/templates/common/mpackComparison.hbs b/ambari-web/app/templates/common/mpackComparison.hbs
new file mode 100644
index 0000000..4e95aee
--- /dev/null
+++ b/ambari-web/app/templates/common/mpackComparison.hbs
@@ -0,0 +1,39 @@
+{{!
+* 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.
+}}
+
+<div class="mpack-comparison">
+  <h4>{{mpack.name}} {{mpack.currentVersion}}&nbsp;<i class="icon-arrow-right"></i>&nbsp;<span class="new-version">{{mpack.newVersion}}</span><span class="doc-icon"></span></h4>
+  <table class="table">
+    <thead>
+      <tr>
+        <th>{{t common.service}}</th>
+        <th class="text-center">{{t common.current}}&nbsp;{{t common.version}}</th>
+        <th class="text-center">{{t common.new}}&nbsp;{{t common.version}}</th>
+      </tr>
+    </thead>
+    <tbody>
+      {{#each service in mpack.services}}
+        <tr>
+          <td><span class="capsule">{{service.name}}</span></td>          
+          <td class="text-center">{{service.currentVersion}}</td>
+          <td class="text-center"><span class="new-version">{{service.newVersion}}</span></td>
+        </tr>
+      {{/each}}
+    </tbody>
+  </table>
+</div>
\ No newline at end of file
diff --git a/ambari-web/app/templates/main/admin/serviceGroups.hbs b/ambari-web/app/templates/main/admin/serviceGroups.hbs
index 911a472..9bb4b97 100644
--- a/ambari-web/app/templates/main/admin/serviceGroups.hbs
+++ b/ambari-web/app/templates/main/admin/serviceGroups.hbs
@@ -32,7 +32,7 @@
       <div class="dropdown pull-right">
         <button class="btn btn-primary dropdown-toggle" type="button" id="actions-menu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">Actions&nbsp;<span class="caret"></span></button>
         <ul class="dropdown-menu" aria-labelledby="actions-menu">
-          <li><a href="#" {{action handleCreateUpgradePlan target="view"}}><i class="icon-arrow-up"></i>&nbsp;{{t admin.serviceGroups.createUpgradePlan}}</a></li>
+          <li><a href="#" {{bindAttr class="view.canCreatePlan::disabled"}} {{action handleCreateUpgradePlan target="view"}}><i class="icon-arrow-up"></i>&nbsp;{{t admin.serviceGroups.createUpgradePlan}}</a></li>
           <li><a href="#"><i class="icon-plus"></i>&nbsp;{{t admin.serviceGroups.addServiceGroup}}</a></li>
           <li><a href="#"><i class="icon-trash"></i>&nbsp;{{t admin.serviceGroups.removeOldVersions}}</a></li>
           <li><a href="#"><i class="icon-book"></i>&nbsp;{{t common.documentation}}</a></li>
@@ -45,9 +45,17 @@
     <div class="col-xs-12">
       <div class="tab-content">
         <div role="tabpanel" class="tab-pane active" id="mpacks">
-          {{#each serviceGroup in controller.serviceGroups}}
-          {{view App.ServiceGroupView serviceGroupBinding="serviceGroup"}}
-          {{/each}}
+          <div id="serviceGroups">
+            {{#each serviceGroup in controller.serviceGroups}}
+            {{view App.ServiceGroupView serviceGroupBinding="serviceGroup"}}
+            {{/each}}
+          </div>
+          {{#if controller.upgrade}}
+            <div id="upgrade-status">
+              <h3>{{t common.upgrade}}</h3>
+              {{view App.UpgradeStatusView upgradeBinding="controller.upgrade"}}
+            </div>
+          {{/if}}
         </div>
         <div role="tabpanel" class="tab-pane" id="history">
           <div class="panel panel-default">
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/body.hbs b/ambari-web/app/templates/main/admin/serviceGroups/serviceGroupBody.hbs
similarity index 100%
copy from ambari-web/app/templates/main/admin/serviceGroups/body.hbs
copy to ambari-web/app/templates/main/admin/serviceGroups/serviceGroupBody.hbs
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/header.hbs b/ambari-web/app/templates/main/admin/serviceGroups/serviceGroupHeader.hbs
similarity index 100%
rename from ambari-web/app/templates/main/admin/serviceGroups/header.hbs
rename to ambari-web/app/templates/main/admin/serviceGroups/serviceGroupHeader.hbs
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/menu.hbs b/ambari-web/app/templates/main/admin/serviceGroups/serviceGroupMenu.hbs
similarity index 100%
copy from ambari-web/app/templates/main/admin/serviceGroups/menu.hbs
copy to ambari-web/app/templates/main/admin/serviceGroups/serviceGroupMenu.hbs
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/startUpgradePlan.hbs b/ambari-web/app/templates/main/admin/serviceGroups/startUpgradePlan.hbs
index 3ccdf1e..7197982 100644
--- a/ambari-web/app/templates/main/admin/serviceGroups/startUpgradePlan.hbs
+++ b/ambari-web/app/templates/main/admin/serviceGroups/startUpgradePlan.hbs
@@ -20,22 +20,22 @@
 <div id="start-upgrade-plan">
   <h3>{{t admin.serviceGroups.startUpgradePlan.title}}</h3>
   <p id="description">{{t admin.serviceGroups.startUpgradePlan.description}}</p>
-  <ol>
+  <ol class="upgrade-steps">
     <li>
-      <h4>{{t admin.serviceGroups.startUpgradePlan.step1Title}}</h4>
-      <p>{{t admin.serviceGroups.startUpgradePlan.step1Description}}</p>
+      <h4>{{t admin.serviceGroups.upgradePlan}}</h4>
+      <p>{{t admin.serviceGroups.startUpgradePlan.upgradePlanDescription}}</p>
     </li>
     <li>
-      <h4>{{t admin.serviceGroups.startUpgradePlan.step2Title}}</h4>
-      <p>{{t admin.serviceGroups.startUpgradePlan.step2Description}}</p>
+      <h4>{{t common.prerequisites}}</h4>
+      <p>{{t admin.serviceGroups.startUpgradePlan.prerequisitesDescription}}</p>
     </li>
     <li>
-      <h4>{{t admin.serviceGroups.startUpgradePlan.step3Title}}</h4>
-      <p>{{t admin.serviceGroups.startUpgradePlan.step3Description}}</p>
+      <h4>{{t common.install}}</h4>
+      <p>{{t admin.serviceGroups.startUpgradePlan.installDescription}}</p>
     </li>
     <li>
-      <h4>{{t admin.serviceGroups.startUpgradePlan.step4Title}}</h4>
-      <p>{{t admin.serviceGroups.startUpgradePlan.step4Description}}</p>
+      <h4>{{t common.upgrade}}</h4>
+      <p>{{t admin.serviceGroups.startUpgradePlan.upgradeDescription}}</p>
     </li>
   </ol>
   <button type="button" class="btn-lg btn-primary" {{action createUpgradePlan target="view"}}>{{t admin.serviceGroups.startUpgradePlan.buttonLabel}}</button>
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/body.hbs b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusBody.hbs
similarity index 54%
copy from ambari-web/app/templates/main/admin/serviceGroups/body.hbs
copy to ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusBody.hbs
index ddb6c5c..a8a024d 100644
--- a/ambari-web/app/templates/main/admin/serviceGroups/body.hbs
+++ b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusBody.hbs
@@ -16,24 +16,30 @@
 * limitations under the License.
 }}
 
-<h4>{{t common.services}}</h4>
-<div>
-  <p>{{t common.installed}}:&nbsp;
-    {{#each service in view.installedServices}}
-    <button class="capsule capsule-selected">
-      {{service.name}}&nbsp;{{service.version}}&nbsp;<i class="icon icon-ok"></i>
-    </button>
+<div id="upgrade-status-body">
+  <div id="plan-history">
+    <table class="table">
+      <thead>
+        <tr>
+          <th>{{t common.activity}}</th>
+          <th>{{t common.user}}</th>
+          <th>{{t common.date}}</th>
+        </tr>
+      </thead>
+      <tbody>
+        {{#each event in view.history}}
+          <tr>
+            <td>{{event.name}}</td>
+            <td>{{event.user}}</td>
+            <td>{{formatDate event.date format="D MMM YYYY"}}</td>
+          </tr>
+        {{/each}}
+      </tbody>
+    </table>
+  </div>
+  <div id="plan-mpacks">
+    {{#each mpack in view.mpacks}}
+      {{template "templates/common/mpackComparison" mpackBinding="mpack"}}
     {{/each}}
-  </p>
-  <p>{{t common.others}}:&nbsp;
-    {{#each service in view.otherServices}}
-    <button class="capsule">
-      {{service.name}}&nbsp;{{service.version}}&nbsp;<i class="icon icon-plus"></i>
-    </button>
-    {{/each}}
-  </p>
-</div>
-<div>
-  <h4>{{t common.version}}&nbsp;{{t common.history}}</h4>
-  {{view App.Timeline eventsBinding="view.history"}}
+  </div>
 </div>
\ No newline at end of file
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/body.hbs b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusHeader.hbs
similarity index 54%
rename from ambari-web/app/templates/main/admin/serviceGroups/body.hbs
rename to ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusHeader.hbs
index ddb6c5c..87f10d6 100644
--- a/ambari-web/app/templates/main/admin/serviceGroups/body.hbs
+++ b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusHeader.hbs
@@ -16,24 +16,20 @@
 * limitations under the License.
 }}
 
-<h4>{{t common.services}}</h4>
-<div>
-  <p>{{t common.installed}}:&nbsp;
-    {{#each service in view.installedServices}}
-    <button class="capsule capsule-selected">
-      {{service.name}}&nbsp;{{service.version}}&nbsp;<i class="icon icon-ok"></i>
-    </button>
-    {{/each}}
-  </p>
-  <p>{{t common.others}}:&nbsp;
-    {{#each service in view.otherServices}}
-    <button class="capsule">
-      {{service.name}}&nbsp;{{service.version}}&nbsp;<i class="icon icon-plus"></i>
-    </button>
-    {{/each}}
-  </p>
-</div>
-<div>
-  <h4>{{t common.version}}&nbsp;{{t common.history}}</h4>
-  {{view App.Timeline eventsBinding="view.history"}}
+<div id="upgrade-status-header">
+  <ol class="upgrade-steps">
+    <li class="complete">
+      <h4>{{t admin.serviceGroups.upgradePlan}}</h4>
+    </li>
+    <li {{bindAttr class="view.isPrerequisitesActive:active view.isPrerequisitesComplete:complete"}}>
+      <h4>{{t common.prerequisites}}</h4>
+    </li>
+    <li {{bindAttr class="view.isInstallActive:active view.isInstallComplete:complete"}}>
+      <h4>{{t common.install}}</h4>
+    </li>
+    <li {{bindAttr class="view.isUpgradeActive:active"}}>
+      <h4>{{t common.upgrade}}</h4>
+    </li>
+  </ol>
+  <button class="btn btn-secondary" {{action handleNextStep target="view"}}>{{view.label}}</button>
 </div>
\ No newline at end of file
diff --git a/ambari-web/app/templates/main/admin/serviceGroups/menu.hbs b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusMenu.hbs
similarity index 66%
rename from ambari-web/app/templates/main/admin/serviceGroups/menu.hbs
rename to ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusMenu.hbs
index faa041d..ad9f9ba 100644
--- a/ambari-web/app/templates/main/admin/serviceGroups/menu.hbs
+++ b/ambari-web/app/templates/main/admin/serviceGroups/upgradeStatusMenu.hbs
@@ -17,8 +17,6 @@
 }}
 
 <ul class="dropdown-menu dropdown-menu-right">
-  <li><a href="#"><i class="icon-arrow-up"></i>&nbsp;{{t admin.serviceGroups.createUpgradePlan}}</a></li>
-  <li><a href="#"><i class="icon-plus"></i>&nbsp;{{t admin.serviceGroups.addServiceGroup}}</a></li>
-  <li><a href="#"><i class="icon-trash"></i>&nbsp;{{t admin.serviceGroups.removeOldVersions}}</a></li>
-  <li><a href="#"><i class="icon-book"></i>&nbsp;{{t common.documentation}}</a></li>
+  <li><a {{action handleEditPlan target="view"}} {{bindAttr class="view.canModifyPlan::disabled"}}><i class="icon-pencil"></i>&nbsp;{{t common.edit}}&nbsp;{{t admin.serviceGroups.upgradePlan}}</a></li>
+  <li><a {{action handleDiscardPlan target="view"}} {{bindAttr class="view.canModifyPlan::disabled"}}><i class="icon-trash"></i>&nbsp;{{t common.discard}}&nbsp;{{t admin.serviceGroups.upgradePlan}}</a></li>
 </ul>
\ No newline at end of file
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index f89133b..1aa9b443 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -100,29 +100,29 @@ require('views/common/configs/widgets/label_config_widget_view');
 require('views/common/configs/widgets/test_db_connection_widget_view');
 require('views/common/configs/widgets/overrides/config_widget_override_view');
 require('views/common/configs/service_config_layout_tab_view');
-require('views/common/dashrow_view');
 require('views/common/configs/service_config_layout_tab_compare_view');
+require('views/common/configs/controls_view');
+require('views/common/assign_master_components_view');
 require('views/common/filter_combobox');
 require('views/common/filter_combo_cleanable');
 require('views/common/pagination_view');
 require('views/common/table_view');
 require('views/common/progress_bar_view');
 require('views/common/controls_view');
-require('views/common/configs/controls_view');
+require('views/common/chosen_plugin');
+require('views/common/export_metrics_menu_view');
+require('views/common/dashrow_view');
 require('views/common/widget/graph_widget_view');
 require('views/common/widget/template_widget_view');
 require('views/common/widget/gauge_widget_view');
 require('views/common/widget/number_widget_view');
 require('views/common/widget/heatmap_widget_view');
-require('views/common/assign_master_components_view');
 require('views/common/helpers/format_date_view');
 require('views/common/helpers/format_word_break_view');
 require('views/common/helpers/format_null_view');
 require('views/common/helpers/format_role_view');
 require('views/common/helpers/pluralize_view');
 require('views/common/helpers/status_icon_view');
-require('views/common/chosen_plugin');
-require('views/common/export_metrics_menu_view');
 require('views/login');
 require('views/main');
 require('views/main/menu');
@@ -226,6 +226,7 @@ require('views/main/admin/highAvailability/rangerAdmin/step3_view');
 require('views/main/admin/highAvailability/rangerAdmin/step4_view');
 require('views/main/admin/serviceAccounts_view');
 require('views/main/admin/serviceGroups_view');
+require('views/main/admin/serviceGroups/upgradeStatus_view');
 require('views/main/admin/serviceGroups/serviceGroup_view');
 require('views/main/admin/stack_upgrade/upgrade_wizard_view');
 require('views/main/admin/stack_upgrade/upgrade_version_box_view');
diff --git a/ambari-web/app/views/common/dashrow_view.js b/ambari-web/app/views/common/dashrow_view.js
index 1fb602d..8354d77 100644
--- a/ambari-web/app/views/common/dashrow_view.js
+++ b/ambari-web/app/views/common/dashrow_view.js
@@ -42,6 +42,9 @@ App.DashRow = Ember.View.extend({
   
   //Define a property named headerClass which extends Ember.View to use an arbitrary Handlebars template as the header.
 
+  //specifies initial collapsed state
+  collapsed: true,
+
   //set this to provide an id for the collapsible part
   //so it can be targeted by the Bootstrap collapse plugin
   collapseId: null,
diff --git a/ambari-web/app/views/main/admin/serviceGroups/serviceGroup_view.js b/ambari-web/app/views/main/admin/serviceGroups/serviceGroup_view.js
index 5940392..b607cb8 100644
--- a/ambari-web/app/views/main/admin/serviceGroups/serviceGroup_view.js
+++ b/ambari-web/app/views/main/admin/serviceGroups/serviceGroup_view.js
@@ -25,17 +25,17 @@ App.ServiceGroupView = App.DashRow.extend({
   collapseId: Em.computed.alias('serviceGroup.id'),
 
   // menuClass: Em.View.extend({
-  //   templateName: require('templates/main/admin/serviceGroups/menu')
+  //   templateName: require('templates/main/admin/serviceGroups/serviceGroupMenu')
   // }),
 
   headerClass: Em.View.extend({
-    templateName: require('templates/main/admin/serviceGroups/header'),
+    templateName: require('templates/main/admin/serviceGroups/serviceGroupHeader'),
     name: Em.computed.alias('parentView.serviceGroup.name'),
     version: Em.computed.alias('parentView.serviceGroup.version'),
   }),
 
   bodyClass: Em.View.extend({
-    templateName: require('templates/main/admin/serviceGroups/body'),
+    templateName: require('templates/main/admin/serviceGroups/serviceGroupBody'),
     installedServices: Em.computed.alias('parentView.serviceGroup.installedServices'),
     otherServices: Em.computed.alias('parentView.serviceGroup.otherServices'),
     history: Em.computed.alias('parentView.serviceGroup.history')
diff --git a/ambari-web/app/views/main/admin/serviceGroups/upgradeStatus_view.js b/ambari-web/app/views/main/admin/serviceGroups/upgradeStatus_view.js
new file mode 100644
index 0000000..972ad19
--- /dev/null
+++ b/ambari-web/app/views/main/admin/serviceGroups/upgradeStatus_view.js
@@ -0,0 +1,73 @@
+/**
+ * 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');
+
+App.UpgradeStatusView = App.DashRow.extend({
+  //bound from template
+  upgrade: null,
+
+  collapsed: false,
+
+  collapseId: Em.computed.alias('upgrade.id'),
+
+  menuClass: Em.View.extend({
+    templateName: require('templates/main/admin/serviceGroups/upgradeStatusMenu'),
+    canModifyPlan: Em.computed.equal('parentView.upgrade.currentStep', 'prerequisites'),
+    handleEditPlan: function () {
+      if (this.get('canModifyPlan')) {
+        this.get('parentView.controller').editPlan();
+      };
+    },
+    handleDiscardPlan: function () {
+      if (this.get('canModifyPlan')) {
+        this.get('parentView.controller').discardPlan();
+      };
+    }
+  }),
+
+  headerClass: Em.View.extend({
+    templateName: require('templates/main/admin/serviceGroups/upgradeStatusHeader'),
+    isUpgradeActive: Em.computed.equal('parentView.upgrade.currentStep', 'upgrade'),
+    isInstallComplete: Em.computed.alias('isUpgradeActive'),
+    isInstallActive: Em.computed.equal('parentView.upgrade.currentStep', 'install'),
+    isPrerequisitesComplete: Em.computed.or('isInstallActive', 'isUpgradeActive'),
+    isPrerequisitesActive: Em.computed.equal('parentView.upgrade.currentStep', 'prerequisites'),
+    label: function () {
+      switch (this.get('parentView.upgrade.currentStep')) {
+        case 'prerequisites':
+          return Em.I18n.t('admin.serviceGroups.upgradeStatus.button.prerequisites');
+          break;
+        case 'install':
+          return Em.I18n.t('admin.serviceGroups.upgradeStatus.button.install');
+          break;
+        case 'upgrade':
+          return Em.I18n.t('admin.serviceGroups.upgradeStatus.button.upgrade');
+          break;
+      }
+    }.property('parentView.upgrade.currentStep'),
+    action: Em.computed.alias('parentView.upgrade.currentAction')
+  }),
+
+  bodyClass: Em.View.extend({
+    templateName: require('templates/main/admin/serviceGroups/upgradeStatusBody'),
+    history: Em.computed.alias('parentView.upgrade.history'),
+    mpacks: Em.computed.alias('parentView.upgrade.mpacks'),
+  })
+});
+
diff --git a/ambari-web/app/views/main/admin/serviceGroups_view.js b/ambari-web/app/views/main/admin/serviceGroups_view.js
index a2a06b7..0e8fd80 100644
--- a/ambari-web/app/views/main/admin/serviceGroups_view.js
+++ b/ambari-web/app/views/main/admin/serviceGroups_view.js
@@ -18,24 +18,34 @@
 
 var App = require('app');
 
-App.MainAdminServiceGroupsView = App.DashRow.extend({
+App.MainAdminServiceGroupsView = Ember.View.extend({
   templateName: require('templates/main/admin/serviceGroups'),
+  canCreatePlan: function () {
+    if (this.get('controller.upgrade')) {
+      return false;
+    }
 
+    return true;
+  }.property('controller.upgrade'),
   handleCreateUpgradePlan: function () {
-    App.ModalPopup.show({
-      modalWrapperClasses: [ "wide-modal" ],
-      showHeader: false,
-      showFooter: false,
-      bodyClass: Ember.View.extend({
-        templateName: require('templates/main/admin/serviceGroups/startUpgradePlan'),
-        close: function () {
-          this.get('parentView').hide();
-        },
-        createUpgradePlan: function () {
-          this.get('parentView').hide();
-          App.router.transitionTo();
-        }
-      })
-    });
+    const canCreatePlan = this.get('canCreatePlan');
+    
+    if (canCreatePlan) {
+      App.ModalPopup.show({
+        modalWrapperClasses: ["wide-modal"],
+        showHeader: false,
+        showFooter: false,
+        bodyClass: Ember.View.extend({
+          templateName: require('templates/main/admin/serviceGroups/startUpgradePlan'),
+          close: function () {
+            this.get('parentView').hide();
+          },
+          createUpgradePlan: function () {
+            this.get('parentView').hide();
+            App.router.transitionTo();
+          }
+        })
+      });
+    }  
   }
 });
\ No newline at end of file

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