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:36 UTC

[49/50] [abbrv] ambari git commit: AMBARI-15147. Patch Upgrade: integrate API to POST new repo version when registering new version.(xiwang)

AMBARI-15147. Patch Upgrade: integrate API to  POST new repo version when registering new version.(xiwang)


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

Branch: refs/heads/trunk
Commit: a5b673dd18b5849792aace38f8e377f57f45b610
Parents: e5d580f
Author: Xi Wang <xi...@apache.org>
Authored: Thu Feb 18 11:27:10 2016 -0800
Committer: Xi Wang <xi...@apache.org>
Committed: Tue Feb 23 16:05:23 2016 -0800

----------------------------------------------------------------------
 .../stackVersions/StackVersionsCreateCtrl.js    | 175 +++++++++++++------
 .../ui/admin-web/app/scripts/i18n.config.js     |   1 +
 .../ui/admin-web/app/scripts/services/Stack.js  | 167 +++---------------
 .../views/stackVersions/stackVersionPage.html   |   8 +-
 .../app/mappers/repository_version_mapper.js    | 152 ++++++++++------
 ambari-web/app/styles/stack_versions.less       |  10 +-
 .../admin/stack_upgrade/upgrade_version_box.hbs |  10 +-
 .../stack_upgrade/upgrade_version_box_view.js   |   3 +
 .../upgrade_version_column_view.js              |   3 +
 9 files changed, 275 insertions(+), 254 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js
index 190670a..cf0ca2a 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js
@@ -36,7 +36,7 @@ angular.module('ambariAdminConsole')
   $scope.option1 = {
     index: 1,
     displayName: 'Upload Version Definition File',
-    url: 'files://',
+    file: null,
     hasError: false
   };
   $scope.option2 = {
@@ -45,7 +45,9 @@ angular.module('ambariAdminConsole')
     url: 'https://',
     hasError: false
   };
-  $scope.selectedOption = 1;
+  $scope.selectedOption = {
+    index: 1
+  };
 
   /**
    * User can select ONLY one option to upload version definition file
@@ -59,64 +61,78 @@ angular.module('ambariAdminConsole')
     $scope.option2.hasError = false;
   };
   $scope.readInfoButtonDisabled = function () {
-    return $scope.option1.selected ? !$scope.option1.url : !$scope.option2.url;
+    return $scope.option1.index == $scope.selectedOption.index ? !$scope.option1.file : !$scope.option2.url;
   };
 
-  $scope.onFileSelect = function(){
-    return {
-      link: function($scope,el){
-        el.bind("change", function(e){
-          $scope.file = (e.srcElement || e.target).files[0];
-          $scope.getFile();
-        })
-      }
+  $scope.onFileSelect = function(e){
+    if (e.files && e.files.length == 1) {
+      var file = e.files[0];
+      var reader = new FileReader();
+      reader.onload = (function () {
+        return function (e) {
+          $scope.option1.file = e.target.result;
+        };
+      })(file);
+      reader.readAsText(file);
     }
   };
 
-//  $scope.uploadFile = function(){
-//    var file = $scope.myFile;
-//    console.log('file is ' );
-//    console.dir(file);
-//    var uploadUrl = "/fileUpload";
-//    fileUpload.uploadFileToUrl(file, uploadUrl);
-//  };
-
   /**
    * Load selected file to current page content
    */
   $scope.readVersionInfo = function(){
-    if ($scope.option2.selected) {
+    var data = {};
+    var isXMLdata = false;
+    if ($scope.option2.index == $scope.selectedOption.index) {
       var url = $scope.option2.url;
-    }
-    /// POST url first then get the version definition info
-    return Stack.getLatestRepo('HDP').then(function (response) {
-      $scope.id = response.id;
-      $scope.isPatch = response.type == 'PATCH';
-      $scope.stackNameVersion = response.stackNameVersion || 'n/a';
-      $scope.displayName = response.displayName || 'n/a';
-      $scope.version = response.version || 'n/a';
-      $scope.actualVersion = response.actualVersion || 'n/a';
-      $scope.upgradeStack = {
-        stack_name: response.stackName,
-        stack_version: response.stackVersion,
-        display_name: response.displayName
+      data = {
+        "VersionDefinition": {
+          "version_url": url
+        }
       };
-      $scope.services = response.services || [];
-      //save default values of repos to check if they were changed
-      $scope.defaulfOSRepos = {};
-      response.updateObj.operating_systems.forEach(function(os) {
-        $scope.defaulfOSRepos[os.OperatingSystems.os_type] = {
-          defaultBaseUrl: os.repositories[0].Repositories.base_url,
-          defaultUtilsUrl: os.repositories[1].Repositories.base_url
-        };
-      });
-      $scope.repoVersionFullName = response.repoVersionFullName;
-      angular.forEach(response.osList, function (os) {
-        os.selected = true;
-      });
-      $scope.osList = response.osList;
-      // load supported os type base on stack version
-      $scope.afterStackVersionRead();
+    } else if ($scope.option1.index == $scope.selectedOption.index) {
+      isXMLdata = true;
+      // load from file browser
+      data = $scope.option1.file;
+    }
+
+    return Stack.postVersionDefinitionFile(isXMLdata, data).then(function (versionInfo) {
+      if (versionInfo.id && versionInfo.stackName && versionInfo.stackVersion) {
+        Stack.getRepo(versionInfo.id, versionInfo.stackName, versionInfo.stackVersion)
+          .then(function (response) {
+            $scope.id = response.id;
+            $scope.isPatch = response.type == 'PATCH';
+            $scope.stackNameVersion = response.stackNameVersion || 'n/a';
+            $scope.displayName = response.displayName || 'n/a';
+            $scope.version = response.version || 'n/a';
+            $scope.actualVersion = response.actualVersion || 'n/a';
+            $scope.updateObj = response.updateObj;
+            $scope.upgradeStack = {
+              stack_name: response.stackName,
+              stack_version: response.stackVersion,
+              display_name: response.displayName
+            };
+            $scope.services = response.services || [];
+            //save default values of repos to check if they were changed
+            $scope.defaulfOSRepos = {};
+            response.updateObj.operating_systems.forEach(function(os) {
+              $scope.defaulfOSRepos[os.OperatingSystems.os_type] = {
+                defaultBaseUrl: os.repositories[0].Repositories.base_url,
+                defaultUtilsUrl: os.repositories[1].Repositories.base_url
+              };
+            });
+            $scope.repoVersionFullName = response.repoVersionFullName;
+            angular.forEach(response.osList, function (os) {
+              os.selected = true;
+            });
+            $scope.osList = response.osList;
+            // load supported os type base on stack version
+            $scope.afterStackVersionRead();
+        });
+      }
+    })
+    .catch(function (data) {
+      Alert.error($t('versions.alerts.readVersionInfoError'), data.message);
     });
   };
 
@@ -180,18 +196,41 @@ angular.module('ambariAdminConsole')
     return !enabled;
   }
 
+  $scope.defaulfOSRepos = {};
+
   $scope.save = function () {
+    $scope.editVersionDisabled = true;
+    delete $scope.updateObj.href;
+    $scope.updateObj.operating_systems = [];
+    var updateRepoUrl = false;
+    angular.forEach($scope.osList, function (os) {
+      var savedUrls = $scope.defaulfOSRepos[os.OperatingSystems.os_type];
+      if (os.selected) {
+        var currentRepos = os.repositories;
+        if (!savedUrls || currentRepos[0].Repositories.base_url != savedUrls.defaultBaseUrl
+          || currentRepos[1].Repositories.base_url != savedUrls.defaultUtilsUrl) {
+          updateRepoUrl = true;
+        }
+        $scope.updateObj.operating_systems.push(os);
+      } else if (savedUrls) {
+        updateRepoUrl = true;
+      }
+    });
+    $scope.updateRepoVersions();
+  };
+
+  $scope.updateRepoVersions = function () {
     return Stack.validateBaseUrls($scope.skipValidation, $scope.osList, $scope.upgradeStack).then(function (invalidUrls) {
       if (invalidUrls.length === 0) {
-        Stack.addRepo($scope.upgradeStack, $scope.actualVersion, $scope.osList)
-          .success(function () {
-            var versionName = $scope.upgradeStack.selected.stack_version + '.' + $scope.repoSubversion;
-            var stackName = $scope.upgradeStack.selected.stack_name;
-            Alert.success($t('versions.alerts.versionCreated', {stackName: stackName, versionName: versionName}));
-            $location.path('/stackVersions');
-          })
-          .error(function (data) {
-              Alert.error($t('versions.alerts.versionCreationError'), data.message);
+        Stack.updateRepo($scope.upgradeStack.stack_name, $scope.upgradeStack.stack_version, $scope.id, $scope.updateObj).then(function () {
+          Alert.success($t('versions.alerts.versionEdited', {
+            stackName: $scope.upgradeStack.stack_name,
+            versionName: $scope.actualVersion,
+            displayName: $scope.repoVersionFullName
+          }));
+          $location.path('/stackVersions');
+        }).catch(function (data) {
+            Alert.error($t('versions.alerts.versionUpdateError'), data.message);
           });
       } else {
         Stack.highlightInvalidUrls(invalidUrls);
@@ -199,6 +238,26 @@ angular.module('ambariAdminConsole')
     });
   };
 
+//
+//  $scope.save = function () {
+//    return Stack.validateBaseUrls($scope.skipValidation, $scope.osList, $scope.upgradeStack).then(function (invalidUrls) {
+//      if (invalidUrls.length === 0) {
+//        Stack.addRepo($scope.upgradeStack, $scope.actualVersion, $scope.osList)
+//          .success(function () {
+//            var versionName = $scope.upgradeStack.selected.stack_version + '.' + $scope.repoSubversion;
+//            var stackName = $scope.upgradeStack.selected.stack_name;
+//            Alert.success($t('versions.alerts.versionCreated', {stackName: stackName, versionName: versionName}));
+//            $location.path('/stackVersions');
+//          })
+//          .error(function (data) {
+//              Alert.error($t('versions.alerts.versionCreationError'), data.message);
+//          });
+//      } else {
+//        Stack.highlightInvalidUrls(invalidUrls);
+//      }
+//    });
+//  };
+
   $scope.cancel = function () {
     $scope.editVersionDisabled = true;
     $location.path('/stackVersions');

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
index 0dc10c1..ce0ff41 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
@@ -342,6 +342,7 @@ angular.module('ambariAdminConsole')
         'versionCreated': 'Created version <a href="#/stackVersions/{{stackName}}/{{versionName}}/edit">{{stackName}}-{{versionName}}</a>',
         'versionCreationError': 'Version creation error',
         'osListError': 'getSupportedOSList error',
+        'readVersionInfoError': 'Version Definition read error',
         'versionEdited': 'Edited version <a href="#/stackVersions/{{stackName}}/{{versionName}}/edit">{{displayName}}</a>',
         'versionUpdateError': 'Version update error',
         'versionDeleteError': 'Version delete error'

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js
index ae67c7e..4ba0fc1 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js
@@ -145,11 +145,21 @@ angular.module('ambariAdminConsole')
       return $http.post(Settings.baseUrl + url, payloadWrap);
     },
 
-    getRepo: function (repoVersion, stack_name) {
-      var url = Settings.baseUrl + '/stacks/' + stack_name + '/versions?' +
-      'fields=repository_versions/operating_systems/repositories/*' +
-      ',repository_versions/RepositoryVersions/display_name' +
-      '&repository_versions/RepositoryVersions/repository_version=' + repoVersion;
+    getRepo: function (repoVersion, stack_name, stack_version) {
+      if (stack_version) {
+        // get repo by stack version(2.3) and id (112)
+        var url = Settings.baseUrl + '/stacks/' + stack_name + '/versions?' +
+          'fields=repository_versions/operating_systems/repositories/*' +
+          ',repository_versions/RepositoryVersions/*' +
+          '&repository_versions/RepositoryVersions/id=' + repoVersion +
+          '&Versions/stack_version=' + stack_version;
+      } else {
+        // get repo by repoVersion (2.3.6.0-2345)
+        var url = Settings.baseUrl + '/stacks/' + stack_name + '/versions?' +
+          'fields=repository_versions/operating_systems/repositories/*' +
+          ',repository_versions/RepositoryVersions/*' +
+          '&repository_versions/RepositoryVersions/repository_version=' + repoVersion;
+      }
       var deferred = $q.defer();
       $http.get(url, {mock: 'version/version.json'})
       .success(function (data) {
@@ -186,140 +196,21 @@ angular.module('ambariAdminConsole')
       return deferred.promise;
     },
 
-    getLatestRepo: function (stack_name) {
-      var url = Settings.baseUrl + '/stacks/' + stack_name + '/versions?' +
-        'fields=repository_versions/operating_systems/repositories/*' +
-        ',repository_versions/RepositoryVersions/*';  // tbd
-      var deferred = $q.defer();
-      $http.get(url, {mock: 'version/version.json'})
-        .success(function (data) {
-          //data = data.items[0];
-          data = {
-            "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3",
-            "Versions" : {
-              "stack_name" : "HDP",
-              "stack_version" : "2.3"
-            },
-            "repository_versions" : [
-              {
-                "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/15",
-                "RepositoryVersions" : {
-                  "id" : 15,
-                  "repository_version" : "2.3.6.0-3509",
-                  "stack_name" : "HDP",
-                  "stack_version" : "2.3",
-                  "type": "PATCH",
-                  "release": {
-                    "stack_id": "HDP-2.3",
-                    "version": "2.3.6.0",
-                    "build": "3509",
-                    "compatible_with": "2.3.6.0-[1-9]",
-                    "release_notes": "http://someurl"
-                  },
-                  "services": [
-                    {
-                      "name": "HDFS",
-                      "display_name": "HDFS",
-                      "versions": [
-                        {
-                          "version": "2.1.1",
-                          "version_id": "10",
-                          "components": [ "NAMENODE"]
-                        }
-                      ]
-                    },
-                    {
-                      "name": "HIVE",
-                      "display_name": "Hive",
-                      "versions": [
-                        {
-                          "version": "1.2.1"
-                        }
-                      ]
-                    },
-                    {
-                      "name": "ZOOKEEPER",
-                      "display_name": "ZooKeeper",
-                      "versions": [
-                        {
-                          "version": "3.4.5"
-                        }
-                      ]
-                    }
-                  ]
-                },
-                "operating_systems" : [
-                  {
-                    "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/15/operating_systems/redhat6",
-                    "OperatingSystems" : {
-                      "os_type" : "redhat6",
-                      "repository_version_id" : 15,
-                      "stack_name" : "HDP",
-                      "stack_version" : "2.3"
-                    },
-                    "repositories" : [
-                      {
-                        "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/15/operating_systems/redhat6/repositories/HDP-2.3.6.0-3509",
-                        "Repositories" : {
-                          "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3509",
-                          "default_base_url" : "",
-                          "latest_base_url" : "",
-                          "mirrors_list" : "",
-                          "os_type" : "redhat6",
-                          "repo_id" : "HDP-2.3.6.0-3509",
-                          "repo_name" : "HDP",
-                          "repository_version_id" : 15,
-                          "stack_name" : "HDP",
-                          "stack_version" : "2.3"
-                        }
-                      },
-                      {
-                        "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/15/operating_systems/redhat6/repositories/HDP-UTILS-2.3.6.0-3509",
-                        "Repositories" : {
-                          "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
-                          "default_base_url" : "",
-                          "latest_base_url" : "",
-                          "mirrors_list" : "",
-                          "os_type" : "redhat6",
-                          "repo_id" : "HDP-UTILS-2.3.6.0-3509",
-                          "repo_name" : "HDP-UTILS",
-                          "repository_version_id" : 15,
-                          "stack_name" : "HDP",
-                          "stack_version" : "2.3"
-                        }
-                      }
-                    ]
-                  }
-                ]
-              }
-            ]
-          };
+    postVersionDefinitionFile: function (isXMLdata, data) {
+      var deferred = $q.defer(),
+        url = Settings.baseUrl + '/version_definitions',
+        configs = isXMLdata? { headers: {'Content-Type': 'text/xml'}} : null;
 
-          var response = {
-            id : data.repository_versions[0].RepositoryVersions.id,
-            stackVersion : data.Versions.stack_version,
-            stackName: data.Versions.stack_name,
-            type: data.repository_versions[0].RepositoryVersions.type,
-            stackNameVersion: data.Versions.stack_name + '-' + data.Versions.stack_version, /// HDP-2.3
-            actualVersion: data.repository_versions[0].RepositoryVersions.repository_version, /// 2.3.4.0-3846
-            version: data.repository_versions[0].RepositoryVersions.release ? data.repository_versions[0].RepositoryVersions.release.version: null, /// 2.3.4.0
-            releaseNotes: data.repository_versions[0].RepositoryVersions.release ? data.repository_versions[0].RepositoryVersions.release.release_notes: null,
-            displayName: data.repository_versions[0].RepositoryVersions.release ? data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.release.version :
-              data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.repository_version.split('-')[0], //HDP-2.3.4.0
-            repoVersionFullName : data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.repository_version,
-            osList: data.repository_versions[0].operating_systems,
-            updateObj: data.repository_versions[0]
-          };
-          var services = [];
-          angular.forEach(data.repository_versions[0].RepositoryVersions.services, function (service) {
-            services.push({
-              name: service.display_name,
-              version: service.versions[0].version,
-              components: service.versions[0].components
-            });
-          });
-          response.services = services;
-          deferred.resolve(response);
+      $http.post(url, data, configs)
+        .success(function (response) {
+          if (response.resources.length && response.resources[0].VersionDefinition) {
+            deferred.resolve(
+              {
+                stackName: response.resources[0].VersionDefinition.stack_name,
+                id: response.resources[0].VersionDefinition.id,
+                stackVersion: response.resources[0].VersionDefinition.stack_version
+              });
+          }
         })
         .error(function (data) {
           deferred.reject(data);

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/ambari-admin/src/main/resources/ui/admin-web/app/views/stackVersions/stackVersionPage.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/stackVersions/stackVersionPage.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/stackVersions/stackVersionPage.html
index 112ded8..b8d51b5 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/stackVersions/stackVersionPage.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/stackVersions/stackVersionPage.html
@@ -36,22 +36,22 @@
   <div class="clearfix register-version-options">
     <div class="col-sm-5 option-radio-button">
       <label class="option-label">
-        <input type="radio" ng-model="selectedOption" value="{{option1.index}}" ng-change="toggleOptionSelect()"> {{'versions.uploadFile' | translate}}
+        <input type="radio" ng-model="selectedOption.index" value="1" ng-change="toggleOptionSelect()"> {{'versions.uploadFile' | translate}}
       </label>
     </div>
     <div class="col-sm-7">
-      <input type="file" class="choose-file-input" ng-file-select="onFileSelect($files)"/>
+      <input type="file" class="choose-file-input" onchange="angular.element(this).scope().onFileSelect(this)"/>
     </div>
   </div>
   <div class="clearfix register-version-options border-bottom bottom-margin">
     <div class="col-sm-5 option-radio-button">
       <label class="option-label">
-        <input type="radio" ng-model="selectedOption" value="{{option2.index}}" ng-change="toggleOptionSelect()"> {{'versions.enterURL' | translate}}
+        <input type="radio" ng-model="selectedOption.index" value="2" ng-change="toggleOptionSelect()"> {{'versions.enterURL' | translate}}
       </label>
     </div>
     <div class="col-sm-7">
       <div class="form-group {{option2.name}}" ng-class="{'has-error': option2.url.hasError }">
-        <div class=""><input type="text" class="form-control" ng-model="option2.url" ng-change="clearOptionsError()" ng-disabled="!(selectedOption==2)"></div>
+        <div class=""><input type="text" class="form-control" ng-model="option2.url" ng-change="clearOptionsError()" ng-disabled="!(selectedOption.index==2)"></div>
       </div>
     </div>
     <div class="col-sm-12 read-info-button">

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/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 c937678..be85cd2 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -97,7 +97,6 @@ App.repoVersionMapper = App.QuickDataMapper.create({
     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",
@@ -105,55 +104,108 @@ App.repoVersionMapper = App.QuickDataMapper.create({
           "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 (item[repoVersionsKey].id  % 2 ) {
+          item[repoVersionsKey].type = "PATCH";
+          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"
+                }
+              ]
+            }
+          ];
+        } else {
+          item[repoVersionsKey].services = [
+            {
+              "name": "HDFS",
+              "display_name": "HDFS",
+              "versions": [
+                {
+                  "version": "2.1.1",
+                  "version_id": "10",
+                  "components": [ "NAMENODE"]
+                }
+              ]
+            },
+            {
+              "name": "wrong",
+              "display_name": "YARN",
+              "versions": [
+                {
+                  "version": "2.7.1.2.3"
+                }
+              ]
+            },
+            {
+              "name": "wrong",
+              "display_name": "ZooKeeper",
+              "versions": [
+                {
+                  "version": "3.4.6.2.3"
+                }
+              ]
+            },
+            {
+              "name": "MAPREDUCE2",
+              "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))) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/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 5490592..25f474e 100644
--- a/ambari-web/app/styles/stack_versions.less
+++ b/ambari-web/app/styles/stack_versions.less
@@ -172,7 +172,7 @@
     position: relative;
     background: none repeat scroll 0 0 #fff;
     border: 1px solid #d2d9dd;
-    height: 168px;
+    height: 190px;
     margin: 15px 15px 0 0;
     padding: 5px 0;
     a.not-active:hover {
@@ -245,6 +245,14 @@
       margin: 0 0px -18px 1px;
       padding: 1px;
     }
+    .patch-icon {
+      text-align: center;
+      color: #ff4500;
+      height: 20px;
+      font-size: 14px;
+      margin: 18px 0px -18px 1px;
+      padding: 1px;
+    }
     .hosts-section {
       margin-top: 16px;
       width: 100%;

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/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 84d7835..dcc6944 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,9 +27,13 @@
   </a>
 </p>
 <p class="repository-name">({{view.content.repositoryVersion}})</p>
-{{#if view.isPatch}}
-  <p class="patch-icon"></p>
-{{/if}}
+
+<p class="patch-icon">
+  {{#if view.isPatch}}
+    <i class="icon-umbrella"></i>&nbsp;{{t common.patch}}
+  {{/if}}
+</p>
+
 
 <div {{bindAttr class="view.stateElement.isInstalling:installing :align-center :state"}}>
   {{#if view.stateElement.isButton}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/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 1ea0c66..e0c0ae2 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
@@ -397,6 +397,9 @@ App.UpgradeVersionBoxView = Em.View.extend({
         secondary: Em.I18n.t('common.close'),
         onPrimary: function () {
           this.hide();
+          if ($('.version-box-popup .modal')) {
+            $('.version-box-popup .modal .modal-footer .btn-success').click();
+          }
           self.filterHostsByStack(displayName, status.id);
         }
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/a5b673dd/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
index d7e26e2..346c10c 100644
--- 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
@@ -86,6 +86,9 @@ App.UpgradeVersionColumnView = App.UpgradeVersionBoxView.extend({
     }
   },
 
+  /**
+   * on click handler for "show details" link
+   */
   openVersionBoxPopup: function (event) {
     var content = this.get('content');
     var parentView = this.get('parentView');