You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2016/02/24 16:08:14 UTC

[27/50] [abbrv] ambari git commit: AMBARI-14930. Admin Versions: display all existed stack versions in new format. (xiwang)

AMBARI-14930. Admin Versions: display all existed stack versions in new format. (xiwang)


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

Branch: refs/heads/trunk
Commit: 1e89d1d578d6ae38fe706e7e07eb0cde52429d92
Parents: 03bc226
Author: Xi Wang <xi...@apache.org>
Authored: Thu Feb 4 12:00:30 2016 -0800
Committer: Xi Wang <xi...@apache.org>
Committed: Thu Feb 11 15:37:49 2016 -0800

----------------------------------------------------------------------
 .../app/mappers/repository_version_mapper.js    |  91 +++++++++++++++
 ambari-web/app/messages.js                      |   5 +
 ambari-web/app/models.js                        |   1 +
 .../models/stack_version/repository_version.js  |   6 +-
 .../app/models/stack_version/service_simple.js  |  28 +++++
 ambari-web/app/styles/stack_versions.less       | 112 ++++++++++++++++++-
 .../admin/stack_upgrade/upgrade_version_box.hbs |   4 +
 .../stack_upgrade/upgrade_version_column.hbs    |  86 ++++++++++++++
 .../main/admin/stack_upgrade/versions.hbs       |  61 ++++++----
 ambari-web/app/utils/host_progress_popup.js     |   4 +-
 ambari-web/app/views.js                         |   1 +
 .../stack_upgrade/upgrade_version_box_view.js   |  17 ++-
 .../upgrade_version_column_view.js              | 106 ++++++++++++++++++
 .../main/admin/stack_upgrade/versions_view.js   |   5 +
 14 files changed, 495 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/mappers/repository_version_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/repository_version_mapper.js b/ambari-web/app/mappers/repository_version_mapper.js
index 0bb094f..c937678 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -21,6 +21,7 @@ App.repoVersionMapper = App.QuickDataMapper.create({
   modelRepoVersions: App.RepositoryVersion,
   modelOperatingSystems: App.OS,
   modelRepositories: App.Repository,
+  modelServices: App.ServiceSimple,
 
   modelRepoVersion: function (isCurrentStackOnly) {
     var repoVersionsKey = isCurrentStackOnly ? 'RepositoryVersions' : 'CompatibleRepositoryVersions';
@@ -28,10 +29,16 @@ App.repoVersionMapper = App.QuickDataMapper.create({
       id: repoVersionsKey + '.id',
       stack_version_id: repoVersionsKey + '.stackVersionId',
       display_name: repoVersionsKey + '.display_name',
+      type: repoVersionsKey + '.type',
       repository_version: repoVersionsKey + '.repository_version',
       upgrade_pack: repoVersionsKey + '.upgrade_pack',
       stack_version_type: repoVersionsKey + '.stack_name',
       stack_version_number: repoVersionsKey + '.stack_version',
+      services_key: 'services',
+      services_type: 'array',
+      services: {
+        item: 'id'
+      },
       operating_systems_key: 'operating_systems',
       operating_systems_type: 'array',
       operating_systems: {
@@ -53,6 +60,13 @@ App.repoVersionMapper = App.QuickDataMapper.create({
     }
   },
 
+  modelService: {
+    id: 'id',
+    name: 'name',
+    display_name: 'display_name',
+    latest_version: 'latest_version'
+  },
+
   modelRepository: {
     id: 'id',
     operating_system_id: 'Repositories.operating_system_id',
@@ -71,18 +85,81 @@ App.repoVersionMapper = App.QuickDataMapper.create({
     var modelRepoVersions = this.get('modelRepoVersions');
     var modelOperatingSystems = this.get('modelOperatingSystems');
     var modelRepositories = this.get('modelRepositories');
+    var modelServices = this.get('modelServices');
 
     var resultRepoVersion = [];
     var resultOS = [];
     var resultRepo = [];
+    var resultService = [];
 
     var repoVersionsKey = isCurrentStackOnly ? 'RepositoryVersions' : 'CompatibleRepositoryVersions';
 
     if (json && json.items) {
       json.items.forEach(function (item) {
+        ////////////// to test//////////////
+        item[repoVersionsKey].type = "PATCH";
+        item[repoVersionsKey].release = {
+          "stack_id": "HDP-2.2",
+          "version": "2.2.4.1",
+          "build": "885",
+          "compatible_with": "", /* regex */
+          "release_notes": "http://someurl"
+        };
+        item[repoVersionsKey].services = [
+          {
+            "name": "HDFS",
+            "display_name": "HDFS",
+            "versions": [
+              {
+                "version": "2.1.1",
+                "version_id": "10",
+                "components": [ "NAMENODE"]
+              }
+            ]
+          },
+          {
+            "name": "YARN",
+            "display_name": "YARN",
+            "versions": [
+              {
+                "version": "2.7.1.2.3"
+              }
+            ]
+          },
+          {
+            "name": "ZOOKEEPER",
+            "display_name": "ZooKeeper",
+            "versions": [
+              {
+                "version": "3.4.6.2.3"
+              }
+            ]
+          },
+          {
+            "name": "wrong",
+            "display_name": "MapReduce2",
+            "versions": [
+              {
+                "version": "2.7.1.2.3"
+              }
+            ]
+          },
+          {
+            "name": "AMBARI_METRICS",
+            "display_name": "Ambari Metrics",
+            "versions": [
+              {
+                "version": "0.1.0"
+              }
+            ]
+          }
+        ];
+        //////////////////////////////
+
         if (loadAll || (item[repoVersionsKey] && !App.StackVersion.find().someProperty('repositoryVersion.id', item[repoVersionsKey].id))) {
           var repo = item;
           var osArray = [];
+          var serviceArray = [];
           if (item.operating_systems) {
             item.operating_systems.forEach(function (os) {
               os.id = item[repoVersionsKey].repository_version + os.OperatingSystems.os_type;
@@ -101,7 +178,20 @@ App.repoVersionMapper = App.QuickDataMapper.create({
               resultOS.push(this.parseIt(os, this.get('modelOS')));
             }, this);
           }
+          if (item[repoVersionsKey].services) {
+            item[repoVersionsKey].services.forEach(function (service) {
+              var serviceObj = {
+                id: service.name,
+                name: service.name,
+                display_name: service.display_name,
+                latest_version: service.versions[0] ? service.versions[0].version : ''
+              };
+              serviceArray.pushObject(serviceObj);
+              resultService.push(this.parseIt(serviceObj, this.get('modelService')));
+            }, this);
+          }
           repo.operating_systems = osArray;
+          repo.services = serviceArray;
           resultRepoVersion.push(this.parseIt(repo, this.modelRepoVersion(isCurrentStackOnly)));
         }
       }, this);
@@ -109,6 +199,7 @@ App.repoVersionMapper = App.QuickDataMapper.create({
     App.store.commit();
     App.store.loadMany(modelRepositories, resultRepo);
     App.store.loadMany(modelOperatingSystems, resultOS);
+    App.store.loadMany(modelServices, resultService);
     App.store.loadMany(modelRepoVersions, resultRepoVersion);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 59877a5..8860915 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -207,7 +207,9 @@ Em.I18n.translations = {
   'common.stacks': 'Stacks',
   'common.stack': 'Stack',
   'common.reset': 'Reset',
+  'common.resume': 'Resume',
   'common.path': 'Path',
+  'common.patch': 'Patch',
   'common.package': 'Package',
   'common.proceed': 'Proceed',
   'common.proceedAnyway': 'Proceed Anyway',
@@ -1522,6 +1524,9 @@ Em.I18n.translations = {
   'admin.stackVersions.version.upgrade.upgradeOptions.EU.confirm.msg': 'You are about to perform an <b>Express Upgrade</b> from <b>{0}</b> to <b>{1}</b>. This will incur cluster downtime. Are you sure you want to proceed?',
   'admin.stackVersions.version.upgrade.upgradeOptions.RU.confirm.msg': 'You are about to perform a <b>Rolling Upgrade</b> from <b>{0}</b> to <b>{1}</b>. Are you sure you want to proceed?',
 
+  'admin.stackVersions.version.column.showDetails': "Show Details",
+  'admin.stackVersions.version.column.showDetails.title': "Version Details",
+
   'admin.stackVersions.hosts.popup.header.current': "Current",
   'admin.stackVersions.hosts.popup.header.installed': "Installed",
   'admin.stackVersions.hosts.popup.header.not_installed': "Not installed",

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/models.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models.js b/ambari-web/app/models.js
index 1f0a0ab..01fe689 100644
--- a/ambari-web/app/models.js
+++ b/ambari-web/app/models.js
@@ -28,6 +28,7 @@ require('models/stack');
 require('models/stack_version/version');
 require('models/stack_version/repository_version');
 require('models/stack_version/os');
+require('models/stack_version/service_simple');
 require('models/stack_version/repository');
 require('models/operating_system');
 require('models/repository');

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/models/stack_version/repository_version.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_version/repository_version.js b/ambari-web/app/models/stack_version/repository_version.js
index bea2d89..e02999f 100644
--- a/ambari-web/app/models/stack_version/repository_version.js
+++ b/ambari-web/app/models/stack_version/repository_version.js
@@ -20,13 +20,18 @@ var App = require('app');
 
 App.RepositoryVersion = DS.Model.extend({
   displayName: DS.attr('string'),
+  type: DS.attr('string'), // "PATCH" /* STANDARD, (future: SERVICE) */
   repositoryVersion: DS.attr('string'),
   upgradePack: DS.attr('string'),
   stackVersionType: DS.attr('string'),
   stackVersionNumber: DS.attr('string'),
   operatingSystems: DS.hasMany('App.OS'),
+  services: DS.hasMany('App.ServiceSimple'),
   stackVersion: DS.belongsTo('App.StackVersion'),
   stack: Em.computed.concat(' ', 'stackVersionType', 'stackVersionNumber'),
+  displayNameSimple: function() {
+    return this.get('stackVersionType') + '-' + this.get('repositoryVersion').split('-')[0];
+  }.property('stackVersionType', 'repositoryVersion'),
 
   /**
    * status used until corresponding stack version get created
@@ -105,4 +110,3 @@ App.RepositoryVersion = DS.Model.extend({
 });
 
 App.RepositoryVersion.FIXTURES = [];
-

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/models/stack_version/service_simple.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_version/service_simple.js b/ambari-web/app/models/stack_version/service_simple.js
new file mode 100644
index 0000000..3f4b36d
--- /dev/null
+++ b/ambari-web/app/models/stack_version/service_simple.js
@@ -0,0 +1,28 @@
+/**
+ * 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.ServiceSimple = DS.Model.extend({
+  id: DS.attr('string'),
+  name: DS.attr('string'),
+  displayName: DS.attr('string'),
+  latestVersion: DS.attr('string')
+});
+
+App.ServiceSimple.FIXTURES = [];
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/styles/stack_versions.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/stack_versions.less b/ambari-web/app/styles/stack_versions.less
index ab27a84..5490592 100644
--- a/ambari-web/app/styles/stack_versions.less
+++ b/ambari-web/app/styles/stack_versions.less
@@ -127,8 +127,43 @@
     }
   }
 }
+.version-box-popup {
+  .modal{
+    max-height: 563px;
+    max-width: 340px;
+    margin: -250px 0 0 -180px;
+  }
+  .version-box-in-popup.version-box {
+    max-width: 300px;
+    .hosts-section {
+      padding-bottom: 16px;
+    }
+  }
+}
 
-#stack-upgrade-page {
+#stack-upgrade-page,
+.version-box-popup {
+  .versions-slides {
+    overflow-x: scroll;
+    padding-bottom: 25px;
+    margin-left: 0px;
+    margin-top: 5px;
+    background-color: #f5f5f5;
+    border: 2px solid #f5f5f5;
+    border-left: none;
+    .versions-slides-bar {
+      min-width: 1000px;
+      max-width: 20000px;
+    }
+  }
+  .left-menu-table {
+    padding: 10px 1px;
+    margin-top: 87px;
+    td.service-display-name {
+      border: 2px solid #e4e4e4;
+      border-left: none;
+    }
+  }
   div.current-version-box {
     background: none repeat scroll 0 0 #e6f1f6;
     box-shadow: 0 8px 6px -6px black;
@@ -226,6 +261,81 @@
       font-size: 12px;
     }
   }
+  .version-column {
+    min-height: 500px;
+    width: 115px;
+    margin: 15px 7px 0px 7px;
+    .version-column-display-name {
+      color: #000;
+      text-align: center;
+      font-weight: 500;
+      font-size: 16px;
+      line-height: 18px;
+      padding: 5px 5px;
+      margin-bottom: 0px;
+    }
+    .version-column-show-details {
+      text-align: center;
+      font-size: 13px;
+      padding: 5px 5px;
+      border-bottom: 1px solid #e4e4e4;
+      margin-bottom: 0px;
+      a {
+        cursor: pointer;
+      }
+    }
+    .state {
+      margin: 5px 0px 15px 0px;
+      line-height: 20px;
+      .label-success {
+        line-height: 30px;
+      }
+      .btn.btn-primary:not(.dropdown-toggle) {
+        padding: 4px 5px;
+        min-width: 70px;
+      }
+      .open .dropdown-menu {
+        min-width: 90px;
+      }
+    }
+    .state.installing {
+      padding-bottom: 5px;
+      margin: 10px 0px;
+    }
+    .services-section {
+      width: 100%;
+      text-align: center;
+      padding-bottom: 4px;
+      .service-version-info {
+        margin-bottom: 16px;
+        span.label {
+          padding: 5px 15px;
+          background-color: #a3a3a3;
+          z-index: 100;
+          position: relative;
+        }
+      }
+      .line-separator{
+        height: 2px;
+        background: #e4e4e4;
+        position: relative;
+        top: -25px;
+        margin: 0px -15px 0px -15px;
+      }
+
+    }
+  }
+  div.current-version-box.version-column {
+    .services-section{
+      .service-version-info {
+        span.label {
+          background-color: #468847;
+        }
+      }
+    }
+
+
+  }
 }
 
 #stack-upgrade-dialog {

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
index 70a0738..84d7835 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_box.hbs
@@ -27,6 +27,10 @@
   </a>
 </p>
 <p class="repository-name">({{view.content.repositoryVersion}})</p>
+{{#if view.isPatch}}
+  <p class="patch-icon"></p>
+{{/if}}
+
 <div {{bindAttr class="view.stateElement.isInstalling:installing :align-center :state"}}>
   {{#if view.stateElement.isButton}}
     <button class="btn btn-primary"

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs
new file mode 100644
index 0000000..c343151
--- /dev/null
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/upgrade_version_column.hbs
@@ -0,0 +1,86 @@
+{{!
+* 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.
+}}
+
+{{#if view.isOutOfSync}}
+  <i class="icon-exclamation-sign out-of-sync-badge"></i>
+{{/if}}
+
+<p class="version-column-display-name">
+  <span>{{view.content.displayNameSimple}}</span>
+</p>
+
+<p class="version-column-show-details">
+  <a {{action openVersionBoxPopup target="view"}}>{{t admin.stackVersions.version.column.showDetails}}</a>
+</p>
+<div {{bindAttr class="view.stateElement.isInstalling:installing :align-center :state"}}>
+  {{#if view.stateElement.isButton}}
+    <button class="btn btn-primary"
+      {{action runAction target="view"}}
+      {{bindAttr disabled="view.stateElement.isDisabled"}}>
+      {{view.stateElement.text}}
+    </button>
+ {{/if}}
+  {{#if view.stateElement.isButtonGroup}}
+    <div class="btn-group">
+      <button class="btn btn-primary"
+        {{action runAction target="view"}}
+        {{bindAttr disabled="view.stateElement.isDisabled"}}>
+        {{view.stateElement.text}}
+      </button>
+      <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" {{bindAttr disabled="view.stateElement.isDisabled"}}>
+        <span class="caret"></span>
+      </button>
+      <ul class="dropdown-menu">
+        {{#each button in view.stateElement.buttons}}
+          <li {{bindAttr class="button.isDisabled:disabled"}}>
+            <a {{action runAction button.action target="view"}}>
+              {{button.text}}
+            </a>
+          </li>
+        {{/each}}
+      </ul>
+    </div>
+  {{/if}}
+  {{#if view.stateElement.isLabel}}
+      <span {{bindAttr class="view.stateElement.class"}}>{{view.stateElement.text}}</span>
+  {{/if}}
+  {{#if view.stateElement.isLink}}
+    {{#if view.stateElement.iconClass}}
+        <i {{bindAttr class="view.stateElement.iconClass"}}></i>
+    {{/if}}
+      <a href="#" {{action runAction target="view"}}>{{view.stateElement.text}}</a>
+    {{#if view.stateElement.isInstalling}}
+      {{view App.ProgressBarView
+          progressBinding="view.installProgress"
+          statusBinding="view.PROGRESS_STATUS"
+          }}
+    {{/if}}
+  {{/if}}
+  {{#if view.stateElement.isSpinner}}
+    {{view App.SpinnerView}}
+  {{/if}}
+</div>
+
+<div class="services-section">
+  {{#each service in view.services}}
+    <p class="service-version-info">
+       <span {{bindAttr class="service.isVersionInvisible:invisible :label"}}>{{service.latestVersion}}</span>
+    </p>
+    <div class="line-separator"></div>
+  {{/each}}
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
index b14e5bc..6e2b057 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/versions.hbs
@@ -16,23 +16,22 @@
 * limitations under the License.
 }}
 
-
-<div>
+<div id="versions-filter-section">
   <div class="btn-group display-inline-block">
     <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
       <span class="filters-label">{{t common.filter}}: </span>
-            <span>
-              {{view.selectedCategory.label}}
-              <span class="caret"></span>
-            </span>
+        <span>
+          {{view.selectedCategory.label}}
+          <span class="caret"></span>
+        </span>
     </a>
     <ul class="dropdown-menu">
       {{#each category in view.categories}}
-          <li>
-            <a {{action selectCategory category target="view"}} href="#">
-              {{category.label}}
-            </a>
-          </li>
+        <li>
+          <a {{action selectCategory category target="view"}} href="#">
+            {{category.label}}
+          </a>
+        </li>
       {{/each}}
     </ul>
   </div>
@@ -42,14 +41,32 @@
     </button>
   {{/isAuthorized}}
 </div>
-<div class="row-fluid">
-  {{#if isLoaded}}
-    {{#each version in view.repoVersions}}
-      {{#if version.isVisible}}
-        {{view App.UpgradeVersionBoxView contentBinding="version"}}
-      {{/if}}
-    {{/each}}
-  {{else}}
-    {{view App.SpinnerView}}
-  {{/if}}
-</div>
+<div id="versions-section" class="row-fluid">
+  <div class="span2 left-menu-table">
+    <table class="table">
+      <thead>
+        <tr><th>{{t common.default}}</th></tr>
+      </thead>
+      <tbody>
+        {{#each service in view.services}}
+          <tr>
+            <td class="service-display-name">{{service.displayName}}</td>
+          </tr>
+        {{/each}}
+      </tbody>
+    </table>
+  </div>
+  <div class="span10 versions-slides">
+    {{#if isLoaded}}
+      <div class="versions-slides-bar">
+        {{#each version in view.repoVersions}}
+          {{#if version.isVisible}}
+            {{view App.UpgradeVersionColumnView contentBinding="version"}}
+          {{/if}}
+        {{/each}}
+      </div>
+    {{else}}
+      {{view App.SpinnerView}}
+    {{/if}}
+  </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/utils/host_progress_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/host_progress_popup.js b/ambari-web/app/utils/host_progress_popup.js
index 726a96a..6dd4558 100644
--- a/ambari-web/app/utils/host_progress_popup.js
+++ b/ambari-web/app/utils/host_progress_popup.js
@@ -482,8 +482,8 @@ App.HostPopup = Em.Object.create({
       barColor: status[2],
       isInProgress: status[3],
       barWidth: "width:" + service.progress + "%;",
-      sourceRequestScheduleId: service.get('sourceRequestScheduleId'),
-      contextCommand: service.get('contextCommand')
+      sourceRequestScheduleId: service.sourceRequestScheduleId,
+      contextCommand: service.contextCommand
     });
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 2440086..4b6b857 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -181,6 +181,7 @@ require('views/main/admin/highAvailability/rangerAdmin/step4_view');
 require('views/main/admin/serviceAccounts_view');
 require('views/main/admin/stack_upgrade/upgrade_wizard_view');
 require('views/main/admin/stack_upgrade/upgrade_version_box_view');
+require('views/main/admin/stack_upgrade/upgrade_version_column_view');
 require('views/main/admin/stack_upgrade/upgrade_group_view');
 require('views/main/admin/stack_upgrade/upgrade_task_view');
 require('views/main/admin/stack_upgrade/services_view');

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
index f8dd4f2..c6a1960 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_box_view.js
@@ -171,18 +171,18 @@ App.UpgradeVersionBoxView = Em.View.extend({
         var isDisabled = !App.isAuthorized('CLUSTER.UPGRADE_DOWNGRADE_STACK') || this.get('controller.requestInProgress') || isInstalling;
         element.set('isButtonGroup', true);
         if (status === 'OUT_OF_SYNC') {
-          element.set('text', Em.I18n.t('admin.stackVersions.version.reinstall'));
+          element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'));
           element.set('action', 'installRepoVersionConfirmation');
           element.get('buttons').pushObject({
-            text: Em.I18n.t('admin.stackVersions.version.performUpgrade'),
+            text: this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade'),
             action: 'confirmUpgrade',
             isDisabled: isDisabled
           });
         } else {
-          element.set('text', Em.I18n.t('admin.stackVersions.version.performUpgrade'));
+          element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.upgrade') : Em.I18n.t('admin.stackVersions.version.performUpgrade'));
           element.set('action', 'confirmUpgrade');
           element.get('buttons').pushObject({
-            text: Em.I18n.t('admin.stackVersions.version.reinstall'),
+            text: this.get('isVersionColumnView') ? Em.I18n.t('common.reinstall') : Em.I18n.t('admin.stackVersions.version.reinstall'),
             action: 'installRepoVersionConfirmation',
             isDisabled: isDisabled
           });
@@ -217,7 +217,8 @@ App.UpgradeVersionBoxView = Em.View.extend({
     }
     else if (isAborted) {
       element.setProperties(statePropertiesMap['SUSPENDED']);
-      element.set('text', this.get('controller.isDowngrade') ? Em.I18n.t('admin.stackUpgrade.dialog.resume.downgrade') : Em.I18n.t('admin.stackUpgrade.dialog.resume'));
+      var text = this.get('controller.isDowngrade') ? Em.I18n.t('admin.stackUpgrade.dialog.resume.downgrade') : Em.I18n.t('admin.stackUpgrade.dialog.resume');
+      element.set('text', this.get('isVersionColumnView') ? Em.I18n.t('common.resume'): text);
       element.set('isDisabled', this.get('controller.requestInProgress'));
     }
     return element;
@@ -243,6 +244,10 @@ App.UpgradeVersionBoxView = Em.View.extend({
     }, 1000);
   },
 
+  isPatch: function() {
+    return this.get('content.type') == "PATCH";
+  }.property('content.type'),
+
   /**
    * run custom action of controller
    */
@@ -274,7 +279,7 @@ App.UpgradeVersionBoxView = Em.View.extend({
 
     return stackVersion; 
   },
-  
+
   /**
    * show popup with repositories to edit
    * @return {App.ModalPopup}

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js
new file mode 100644
index 0000000..d7e26e2
--- /dev/null
+++ b/ambari-web/app/views/main/admin/stack_upgrade/upgrade_version_column_view.js
@@ -0,0 +1,106 @@
+/**
+ * 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 stringUtils = require('utils/string_utils');
+
+App.UpgradeVersionColumnView = App.UpgradeVersionBoxView.extend({
+  templateName: require('templates/main/admin/stack_upgrade/upgrade_version_column'),
+  isVersionColumnView: true,
+  classNames: ['version-column'],
+
+  didInsertElement: function () {
+    App.tooltip($('.link-tooltip'), {title: Em.I18n.t('admin.stackVersions.version.linkTooltip')});
+    App.tooltip($('.out-of-sync-badge'), {title: Em.I18n.t('hosts.host.stackVersions.status.out_of_sync')});
+  },
+
+  services: function() {
+    var repoRecord = App.RepositoryVersion.find(this.get('content.id'));
+    var originalServices = repoRecord.get('services');
+    // sort the services in the order the same as service menu
+    var sorted = App.Service.find().map(function (service) {
+      var latestVersion = '';
+      if (originalServices.someProperty('name', service.get('serviceName'))){
+        latestVersion = originalServices.filterProperty('name', service.get('serviceName'))[0].get('latestVersion');
+      }
+      return Em.Object.create({
+        displayName: service.get('displayName'),
+        name: service.get('serviceName'),
+        latestVersion: latestVersion,
+        isVersionInvisible: latestVersion == false
+      });
+    });
+    return sorted;
+  }.property(),
+
+  /**
+   * map of properties which correspond to particular state of Upgrade version
+   * @type {object}
+   */
+  statePropertiesMap: {
+    'CURRENT': {
+      isLabel: true,
+      text: Em.I18n.t('common.current'),
+      class: 'label label-success'
+    },
+    'INIT': {
+      isButton: true,
+      text: Em.I18n.t('common.install'),
+      action: 'installRepoVersionConfirmation'
+    },
+    'LOADING': {
+      isSpinner: true,
+      class: 'spinner'
+    },
+    'INSTALLING': {
+      iconClass: 'icon-cog',
+      isLink: true,
+      text: Em.I18n.t('hosts.host.stackVersions.status.installing'),
+      action: 'showProgressPopup'
+    },
+    'INSTALLED': {
+      iconClass: 'icon-ok',
+      isLink: true,
+      text: Em.I18n.t('common.installed'),
+      action: null
+    },
+    'SUSPENDED': {
+      isButton: true,
+      text: Em.I18n.t('admin.stackUpgrade.dialog.resume'),
+      action: 'resumeUpgrade'
+    }
+  },
+
+  openVersionBoxPopup: function (event) {
+    var content = this.get('content');
+    var parentView = this.get('parentView');
+
+    return App.ModalPopup.show({
+      classNames: ['version-box-popup'],
+      bodyClass: App.UpgradeVersionBoxView.extend({
+        classNames: ['version-box-in-popup'],
+        content: content,
+        parentView: parentView
+      }),
+      header: Em.I18n.t('admin.stackVersions.version.column.showDetails.title'),
+      primary: Em.I18n.t('common.dismiss'),
+      secondary: null
+    });
+  }
+});
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/1e89d1d5/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js b/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
index d535300..6b20247 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/versions_view.js
@@ -31,6 +31,11 @@ App.MainAdminStackVersionsView = Em.View.extend({
   updateTimer: null,
 
   /**
+   * @type {Array}
+   */
+  services: App.Service.find(),
+
+  /**
    * Not Installed = the version is not installed or out of sync
    * Upgrade Ready = the version is installed and ready for upgrade
    * Current = the version currently being used