AMBARI-15724 Integrate Version Registration in Select Stack Page (zhewang)

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

Branch: refs/heads/trunk
Commit: 0b77adc2f79b4d2b9561bfb165dbc671c897834a
Parents: 3a5ae33
Author: Zhe (Joe) Wang <[email protected]>
Authored: Fri Apr 29 15:52:49 2016 -0700
Committer: Zhe (Joe) Wang <[email protected]>
Committed: Fri Apr 29 15:52:49 2016 -0700

----------------------------------------------------------------------
 .../stackVersions/StackVersionsCreateCtrl.js    | 159 ++++-
 .../stackVersions/StackVersionsEditCtrl.js      |  10 +
 .../ui/admin-web/app/scripts/i18n.config.js     |   4 +
 .../ui/admin-web/app/scripts/services/Stack.js  |  43 +-
 .../resources/ui/admin-web/app/styles/main.css  |  68 +-
 .../views/stackVersions/stackVersionPage.html   |  91 ++-
 .../wizard/stack/HDP_version_definitions.json   | 556 +++++++++++++++
 ambari-web/app/controllers/installer.js         | 344 +++++++++-
 .../main/admin/stack_and_upgrade_controller.js  |  40 +-
 .../controllers/main/service/add_controller.js  |   8 +-
 ambari-web/app/controllers/wizard.js            |  29 +
 .../app/controllers/wizard/step1_controller.js  |  85 ++-
 .../app/controllers/wizard/step8_controller.js  |  34 +-
 .../app/mappers/repository_version_mapper.js    |  13 +
 ambari-web/app/mappers/stack_mapper.js          |  53 +-
 ambari-web/app/messages.js                      |  32 +-
 ambari-web/app/models/stack.js                  |  51 +-
 .../models/stack_version/repository_version.js  |   1 +
 ambari-web/app/routes/add_service_routes.js     |   9 +-
 ambari-web/app/styles/application.less          | 155 +++++
 .../admin/stack_upgrade/edit_repositories.hbs   |   2 +-
 .../main/admin/stack_upgrade/services.hbs       |   2 +-
 .../main/admin/stack_upgrade/versions.hbs       |  10 +-
 ambari-web/app/templates/wizard/step1.hbs       | 259 ++++---
 ambari-web/app/templates/wizard/step4.hbs       |   2 +-
 ambari-web/app/utils/ajax/ajax.js               |  76 +++
 ambari-web/app/utils/db.js                      |  16 +
 .../main/admin/stack_upgrade/services_view.js   |  11 +-
 .../stack_upgrade/upgrade_version_box_view.js   |   2 +-
 ambari-web/app/views/wizard/step1_view.js       | 353 ++++++----
 ambari-web/test/controllers/installer_test.js   |  27 +-
 .../admin/stack_and_upgrade_controller_test.js  |   5 +-
 .../test/controllers/wizard/step8_test.js       |  47 +-
 ambari-web/test/mappers/stack_mapper_test.js    | 674 ++++++++++++++-----
 .../admin/stack_upgrade/services_view_test.js   |  25 +-
 ambari-web/test/views/wizard/step1_view_test.js | 311 +--------
 36 files changed, 2677 insertions(+), 930 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/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 5596a7f..e6748b8 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,14 +36,22 @@ angular.module('ambariAdminConsole')
     display_name: ''
   };
 
-  $scope.option1 = {
+  $scope.publicOption = {
     index: 1,
+    hasError: false
+  };
+  $scope.localOption = {
+    index: 2,
+    hasError: false
+  };
+  $scope.option1 = {
+    index: 3,
     displayName: $t('versions.uploadFile'),
     file: '',
     hasError: false
   };
   $scope.option2 = {
-    index: 2,
+    index: 4,
     displayName: $t('versions.enterURL'),
     url: $t('versions.defaultURL'),
     hasError: false
@@ -51,20 +59,42 @@ angular.module('ambariAdminConsole')
   $scope.selectedOption = {
     index: 1
   };
+  $scope.selectedLocalOption = {
+    index: 3
+  };
 
   /**
    * User can select ONLY one option to upload version definition file
    */
+  $scope.togglePublicLocalOptionSelect = function () {
+    $scope.option1.hasError = false;
+    $scope.option2.hasError = false;
+  };
   $scope.toggleOptionSelect = function () {
     $scope.option1.hasError = false;
     $scope.option2.hasError = false;
   };
+  $scope.togglePublicLocalOptionSelect = function () {
+    if ($scope.selectedOption.index == $scope.publicOption.index && 
$scope.selectedPublicRepoVersion) {
+      $scope.setVersionSelected($scope.selectedPublicRepoVersion);
+    }
+  };
   $scope.clearOptionsError = function () {
     $scope.option1.hasError = false;
     $scope.option2.hasError = false;
   };
   $scope.readInfoButtonDisabled = function () {
-    return $scope.option1.index == $scope.selectedOption.index ? 
!$scope.option1.file : !$scope.option2.url;
+    if ($scope.selectedOption.index == $scope.publicOption.index) return true;
+    return $scope.option1.index == $scope.selectedLocalOption.index ? 
!$scope.option1.file : !$scope.option2.url;
+  };
+  $scope.isAddOsButtonDisabled = function () {
+    var selectedCnt = 0;
+    angular.forEach($scope.osList, function (os) {
+      if (os.selected) {
+        selectedCnt ++;
+      }
+    });
+    return $scope.osList.length == selectedCnt;
   };
 
   $scope.allInfoCategoriesBlank = function () {
@@ -92,14 +122,14 @@ angular.module('ambariAdminConsole')
   $scope.readVersionInfo = function(){
     var data = {};
     var isXMLdata = false;
-    if ($scope.option2.index == $scope.selectedOption.index) {
+    if ($scope.option2.index == $scope.selectedLocalOption.index) {
       var url = $scope.option2.url;
       data = {
         "VersionDefinition": {
           "version_url": url
         }
       };
-    } else if ($scope.option1.index == $scope.selectedOption.index) {
+    } else if ($scope.option1.index == $scope.selectedLocalOption.index) {
       isXMLdata = true;
       // load from file browser
       data = $scope.option1.file;
@@ -109,34 +139,7 @@ angular.module('ambariAdminConsole')
       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 || 
$t('common.NA');
-            $scope.displayName = response.displayName || $t('common.NA');
-            $scope.version = response.version || $t('common.NA');
-            $scope.actualVersion = response.actualVersion || $t('common.NA');
-            $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();
+            $scope.setVersionSelected(response);
         });
       }
     })
@@ -233,7 +236,41 @@ angular.module('ambariAdminConsole')
         updateRepoUrl = true;
       }
     });
-    $scope.updateRepoVersions();
+    if ($scope.isPublicVersion) {
+      return Stack.validateBaseUrls($scope.skipValidation, $scope.osList, 
$scope.upgradeStack).then(function (invalidUrls) {
+        if (invalidUrls.length === 0) {
+          var data = {
+            "VersionDefinition": {
+              "available": $scope.id
+            }
+          };
+          var repoUpdate = {
+            operating_systems: $scope.updateObj.operating_systems
+          };
+          Stack.postVersionDefinitionFile(false, data).then(function 
(versionInfo) {
+            if (versionInfo.id && versionInfo.stackName && 
versionInfo.stackVersion) {
+              Stack.updateRepo(versionInfo.stackName, 
versionInfo.stackVersion, versionInfo.id, repoUpdate).then(function () {
+                Alert.success($t('versions.alerts.versionEdited', {
+                  stackName: $scope.upgradeStack.stack_name,
+                  versionName: $scope.actualVersion,
+                  displayName: $scope.displayName
+                }));
+                $location.path('/stackVersions');
+              }).catch(function (data) {
+                Alert.error($t('versions.alerts.versionUpdateError'), 
data.message);
+              });
+            }
+          })
+          .catch(function (data) {
+            Alert.error($t('versions.alerts.readVersionInfoError'), 
data.message);
+          });
+        } else {
+          Stack.highlightInvalidUrls(invalidUrls);
+        }
+      });
+    } else {
+      $scope.updateRepoVersions();
+    }
   };
 
   $scope.updateRepoVersions = function () {
@@ -247,8 +284,8 @@ angular.module('ambariAdminConsole')
           }));
           $location.path('/stackVersions');
         }).catch(function (data) {
-            Alert.error($t('versions.alerts.versionUpdateError'), 
data.message);
-          });
+          Alert.error($t('versions.alerts.versionUpdateError'), data.message);
+        });
       } else {
         Stack.highlightInvalidUrls(invalidUrls);
       }
@@ -291,4 +328,54 @@ angular.module('ambariAdminConsole')
     }
     return hasErrors;
   };
+
+
+  $scope.setVersionSelected = function (version) {
+    var response = version;
+    $scope.id = response.id;
+    $scope.isPatch = response.type == 'PATCH';
+    $scope.stackNameVersion = response.stackNameVersion || $t('common.NA');
+    $scope.displayName = response.displayName || $t('common.NA');
+    $scope.actualVersion = response.repositoryVersion || 
response.actualVersion || $t('common.NA');
+    $scope.isPublicVersion = response.showAvailable == true;
+    $scope.updateObj = response.updateObj;
+    $scope.upgradeStack = {
+      stack_name: response.stackName,
+      stack_version: response.stackVersion,
+      display_name: response.displayName || $t('common.NA')
+    };
+    $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();
+  };
+
+  $scope.selectRepoInList = function() {
+    $scope.selectedPublicRepoVersion = this.version;
+    $scope.setVersionSelected(this.version);
+  };
+
+  $scope.fetchPublicVersions = function () {
+    return Stack.allPublicStackVersions().then(function (versions) {
+      if (versions && versions.length) {
+        $scope.selectedPublicRepoVersion = versions[0];
+        $scope.setVersionSelected(versions[0]);
+        $scope.availableStackRepoList = versions.length == 1 ? [] : versions;
+      }
+    });
+  };
+
+  $scope.fetchPublicVersions();
 }]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
----------------------------------------------------------------------
diff --git 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
index 3da088b..8246c2b 100644
--- 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
+++ 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
@@ -236,6 +236,16 @@ angular.module('ambariAdminConsole')
     }
   };
 
+  $scope.isAddOsButtonDisabled = function () {
+    var selectedCnt = 0;
+    angular.forEach($scope.osList, function (os) {
+      if (os.selected) {
+        selectedCnt ++;
+      }
+    });
+    return $scope.osList.length == selectedCnt;
+  };
+
   $scope.hasNotDeletedRepo = function () {
     //check if any repository has been selected for deleting
     //if yes, drop down should be displayed

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/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 3e475d9..6a927b6 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
@@ -335,6 +335,10 @@ angular.module('ambariAdminConsole')
       'current': 'Current',
       'inUse': 'In Use',
       'installed': 'Installed',
+      'usePublic': "Use Public Repository",
+      'selectVersion': "Select Version",
+      'selectVersionEmpty': "No other repositories",
+      'useLocal': "Use Local Repository",
       'uploadFile': 'Upload Version Definition File',
       'enterURL': 'Version Definition File URL',
       'defaultURL': 'https://',

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/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 fd3a8ba..f406b1a 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
@@ -80,6 +80,44 @@ angular.module('ambariAdminConsole')
       return deferred.promise;
     },
 
+    allPublicStackVersions: function() {
+      var url = 
'/version_definitions?fields=operating_systems/repositories/Repositories/*,VersionDefinition/stack_services,VersionDefinition/repository_version'
 +
+        
'&VersionDefinition/show_available=true&VersionDefinition/stack_name=HDP';
+      var deferred = $q.defer();
+      $http.get(Settings.baseUrl + url, {mock: 'version/versions.json'})
+        .success(function (data) {
+          var versions = [];
+          angular.forEach(data.items, function(version) {
+            var versionObj = {
+              id: version.VersionDefinition.id,
+              stackName: version.VersionDefinition.stack_name,
+              stackVersion: version.VersionDefinition.stack_version,
+              stackNameVersion:  version.VersionDefinition.stack_name + '-' + 
version.VersionDefinition.stack_version,
+              displayName: version.VersionDefinition.stack_name + '-' + 
version.VersionDefinition.repository_version.split('-')[0], //HDP-2.3.4.0
+              displayNameFull: version.VersionDefinition.stack_name + '-' + 
version.VersionDefinition.repository_version, //HDP-2.3.4.0-23
+              repositoryVersion: version.VersionDefinition.repository_version,
+              showAvailable: version.VersionDefinition.show_available,
+              osList: version.operating_systems,
+              updateObj: version
+            };
+            var services = [];
+            angular.forEach(version.VersionDefinition.stack_services, function 
(service) {
+              services.push({
+                name: service.name,
+                version: service.versions[0]
+              });
+            });
+            versionObj.services = services;
+            versions.push(versionObj);
+          });
+          deferred.resolve(versions)
+        })
+        .error(function (data) {
+          deferred.reject(data);
+        });
+      return deferred.promise;
+    },
+
     allRepos: function (filter, pagination) {
       var versionFilter = filter.version;
       var url = 
'/stacks?fields=versions/repository_versions/RepositoryVersions';
@@ -183,11 +221,10 @@ angular.module('ambariAdminConsole')
           updateObj: data.repository_versions[0]
         };
         var services = [];
-        
angular.forEach(data.repository_versions[0].RepositoryVersions.services, 
function (service) {
+        
angular.forEach(data.repository_versions[0].RepositoryVersions.stack_services, 
function (service) {
           services.push({
             name: service.name,
-            version: service.versions[0].version,
-            components: service.versions[0].components
+            version: service.versions[0]
           });
         });
         response.services = services;

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css 
b/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
index b4e70f6..167e661 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
@@ -1451,43 +1451,73 @@ thead.view-permission-header > tr > th {
   color: white;
 }
 #upload-definition-file-panel {
-  background-color: #f9f9f9;
-  padding: 20px 10px 5px 10px;
+  padding: 5px 10px 5px 10px;
   margin-bottom: 15px;
 }
-#upload-definition-file-panel .introduction-info {
-  padding: 10px 10px 15px 15px;
-  font-size: 15px;
-  line-height: 1.7;
+
+#upload-definition-file-panel .option-radio {
+  padding: 15px 5px;
+  font-weight: bold;;
+}
+#upload-definition-file-panel .stack-version-selection {
+   padding-left: 25px;
+ }
+#upload-definition-file-panel .stack-version-selection .select-version-label {
+  padding-top: 4px;
+}
+#upload-definition-file-panel .stack-version-selection 
.select-version-label.disabled {
+  color: #999999;
+}
+#upload-definition-file-panel .dropdown-menu li a {
+  cursor: pointer;
+}
+.register-version-options {
+  padding-left: 25px;
 }
 .register-version-options .read-info-button {
   margin-top: 10px;
 }
-
 .register-version-options .option-radio-button {
   padding-top: 5px;
 }
-
+.register-version-options .option-radio-button label {
+  font-weight: normal;
+}
 .register-version-options .choose-file-input {
   padding-top: 6px;
   padding-bottom: 20px;
 }
-
 .register-version-form .details-panel .patch-icon {
   color: #ff4500;
 }
 .register-version-form .deregister-button {
-    margin-top: -23px;
+  margin-top: -23px;
 }
 .register-version-form .version-info {
-    padding-top: 7px;
-    margin-top: 0;
-    margin-bottom: 0;
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.register-version-form .details-panel .version-info-section {
+  margin-top: 10px;
+}
+.register-version-form .details-panel .version-contents-section {
+  max-height: 200px;
+  overflow: auto;
+  border: 1px solid #ddd;
+  padding: 8px 25px;
+  margin: 8px;
+}
+
+.register-version-form .details-panel .control-label {
+  text-align: left;
+  padding: 7px 2px;
+  font-weight: normal;
 }
 
-.register-version-form .contents-panel .version-contents-body {
-    max-height: 150px;
-    overflow: auto;
+.register-version-form .details-panel .version-info {
+  font-weight: bold;
+  padding: 7px 2px;
 }
 
 .register-version-form .repos-panel .remove-icon {
@@ -1504,6 +1534,12 @@ thead.view-permission-header > tr > th {
 .register-version-form .repos-panel .os-type-label {
   margin-top: 27px;;
 }
+.register-version-form .dropdown-menu li a {
+  cursor: pointer;
+}
+.register-version-form .repos-panel .checkbox {
+  margin: 0px 5px;
+}
 
 #stack-versions .no-version-alert {
   text-align: center;

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/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 8e9d3e2..26068a2 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
@@ -32,27 +32,56 @@
 </div>
 <hr>
 
+
+
 <div id="upload-definition-file-panel" ng-if="createController">
-  <div class="introduction-info hide-soft" ng-class="{'visible': 
allInfoCategoriesBlank()}" role="alert">{{'versions.introduction' | 
translate}}</div>
+
+  <div class="col-sm-12 option-radio clearfix">
+    <input type="radio" ng-model="selectedOption.index" value="1" 
ng-change="togglePublicLocalOptionSelect()">   {{'versions.usePublic' | 
translate}}
+  </div>
+
+  <div class="clearfix stack-version-selection">
+    <div class="col-sm-3 select-version-label" ng-class="{'disabled': 
selectedOption.index==2}">
+      {{'versions.selectVersion' | translate}}
+    </div>
+    <div class="col-sm-7 right-stack-info">
+      <div class="repo-list-button btn-group" dropdown>
+        <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" 
ng-disabled="(selectedOption.index==2)">{{selectedPublicRepoVersion.displayNameFull}}
 &nbsp;<span class="caret"></span></button>
+        <ul class="dropdown-menu available-repos-dropdown"  
ng-if="availableStackRepoList">
+          <li ng-repeat="version in availableStackRepoList" class="" 
ng-if="version.displayNameFull !== selectedPublicRepoVersion.displayNameFull">
+            <a 
ng-click="selectRepoInList()">{{version.displayNameFull}}</a></li>
+        </ul>
+        <ul class="dropdown-menu available-repos-dropdown"  
ng-if="!availableStackRepoList || availableStackRepoList.length == 0">
+          <li class="disabled"><a>{{'versions.selectVersionEmpty' | 
translate}}</a></li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <div class="col-sm-12 option-radio clearfix">
+    <input type="radio" ng-model="selectedOption.index" value="2" 
ng-change="togglePublicLocalOptionSelect()">   {{'versions.useLocal' | 
translate}}
+  </div>
+
   <div class="clearfix register-version-options">
     <div class="col-sm-5 option-radio-button">
       <label class="option-label">
-        <input type="radio" ng-model="selectedOption.index" value="1" 
ng-change="toggleOptionSelect()"> {{'versions.uploadFile' | translate}}
+        <input type="radio" ng-model="selectedLocalOption.index" value="3" 
ng-change="toggleOptionSelect()" ng-disabled="(selectedOption.index==1)"> 
{{'versions.uploadFile' | translate}}
       </label>
     </div>
     <div class="col-sm-7">
-      <input type="file" class="choose-file-input" ng-model="option1.file" 
onchange="angular.element(this).scope().onFileSelect(this)"/>
+      <input type="file" class="choose-file-input" ng-model="option1.file" 
ng-disabled="(selectedOption.index==1) || !(selectedLocalOption.index==3)"
+             onchange="angular.element(this).scope().onFileSelect(this)"/>
     </div>
   </div>
   <div class="clearfix register-version-options bottom-margin">
     <div class="col-sm-5 option-radio-button">
       <label class="option-label">
-        <input type="radio" ng-model="selectedOption.index" value="2" 
ng-change="toggleOptionSelect()"> {{'versions.enterURL' | translate}}
+        <input type="radio" ng-model="selectedLocalOption.index" value="4" 
ng-change="toggleOptionSelect()" ng-disabled="(selectedOption.index==1)"> 
{{'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.index==2)"></div>
+        <div class=""><input type="text" class="form-control" 
ng-model="option2.url" ng-change="clearOptionsError()" 
ng-disabled="(selectedOption.index==1) || 
!(selectedLocalOption.index==4)"></div>
       </div>
     </div>
     <div class="col-sm-12 read-info-button">
@@ -95,34 +124,26 @@
         </div>
     </div>
     <div class="panel-body">
-      <div class="clearfix">
-        <label class="control-label col-sm-3">{{'versions.details.stackName' | 
translate}}</label>
-        <div class="version-info col-sm-7">{{stackNameVersion}}</div>
-        <div class="col-sm-2 patch-icon" ng-if="isPatch"><span 
class="glyphicon glyphicon-tree-deciduous"></span>{{'versions.patch' | 
translate}}</div>
-      </div>
-      <div class="clearfix">
-        <label class="control-label col-sm-3">{{'versions.details.displayName' 
| translate}}</label>
-        <div class="version-info col-sm-9">{{displayName}}</div>
-      </div>
-      <div class="clearfix">
-        <label class="control-label col-sm-3">{{'versions.details.version' | 
translate}}</label>
-        <div class="version-info col-sm-9">{{version}}</div>
-      </div>
-      <div class="clearfix">
-        <label class="control-label 
col-sm-3">{{'versions.details.actualVersion' | translate}}</label>
-        <div class="version-info col-sm-9">{{actualVersion}}</div>
+      <div class="col-sm-5 version-info-section">
+        <div class="clearfix">
+          <label class="control-label col-sm-7">{{'versions.details.stackName' 
| translate}}</label>
+          <div class="version-info col-sm-3">{{stackNameVersion}}</div>
+          <div class="col-sm-2 patch-icon" ng-if="isPatch"><span 
class="glyphicon glyphicon-tree-deciduous"></span>{{'versions.patch' | 
translate}}</div>
+        </div>
+        <div class="clearfix">
+          <label class="control-label 
col-sm-7">{{'versions.details.displayName' | translate}}</label>
+          <div class="version-info col-sm-5">{{displayName}}</div>
+        </div>
+        <div class="clearfix">
+          <label class="control-label col-sm-7">{{'versions.details.version' | 
translate}}</label>
+          <div class="version-info col-sm-5">{{actualVersion}}</div>
+        </div>
       </div>
-    </div>
-  </div>
-  <div class="panel panel-default contents-panel">
-    <div class="panel-heading">
-      <h3 class="panel-title">{{'versions.contents.title' | translate}}</h3>
-    </div>
-    <div class="panel-body version-contents-body">
-      <div class="alert alert-info hide-soft" ng-class="{'visible' : !services 
|| !services.length}" role="alert">{{'versions.contents.empty' | 
translate}}</div>
-      <div class="clearfix" ng-repeat="service in services">
-        <label class="control-label col-sm-3">{{service.name}}</label>
-        <div class="version-info col-sm-9">{{service.version}}</div>
+      <div class="col-sm-6 version-contents-section">
+        <div class="alert alert-info hide-soft" ng-class="{'visible' : 
!services || !services.length}" role="alert">{{'versions.contents.empty' | 
translate}}</div>
+        <div class="clearfix" ng-repeat="service in services">
+          <div class="version-info col-sm-9">{{service.name}} 
({{service.version}})</div>
+        </div>
       </div>
     </div>
   </div>
@@ -164,14 +185,14 @@
         </div>
       </div>
         <div class="btn-group pull-right" dropdown>
-          <button class="btn dropdown-toggle">
+          <button class="btn dropdown-toggle" 
ng-disabled="isAddOsButtonDisabled()">
             <span class="glyphicon glyphicon-plus"></span> {{'common.add' | 
translate: '{term: constants.os}'}} &nbsp;<span class="caret"></span></button>
           <ul class="dropdown-menu" ng-class="{'hidden': hasNotDeletedRepo()}">
             <li ng-repeat="os in osList"><a ng-if="os.selected==false" 
ng-click="addOS()">{{os.OperatingSystems.os_type}}</a></li>
           </ul>
         </div>
       <div class="clearfix">
-        <div class="col-sm-12" id="skip-validation">
+        <div class="col-sm-9" id="skip-validation">
           <div class="checkbox">
             <label>
               <input type="checkbox" ng-model="skipValidation" 
ng-change="clearErrors()">
@@ -179,7 +200,7 @@
             </label>
           </div>
         </div>
-        <div class="col-sm-12" id="use-redhat">
+        <div class="col-sm-9" id="use-redhat">
           <div class="checkbox">
             <label>
               <input type="checkbox" ng-model="useRedhatSatellite" 
ng-change="clearErrors()">

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json 
b/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
new file mode 100644
index 0000000..fde11e2
--- /dev/null
+++ b/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
@@ -0,0 +1,556 @@
+{
+  "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/version_definitions?fields=operating_systems/repositories/Repositories/*,VersionDefinition/stack_services&show_available=true&VersionDefinition/stack_name=HDP";,
+  "items" : [
+    {
+      "VersionDefinition" : {
+        "id" : 1,
+        "show_available": true,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "repository_version" : "2.3.4.0-3396",
+        "type" : "STANDARD",
+        "version_url" : 
"file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3396.xml",
+        "release" : {
+          "build" : "3396",
+          "compatible_with" : "2.3.[0-3].0",
+          "notes" : "http://example.com";,
+          "version" : "2.3.4.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis 
of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2.3396"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3.3396"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3.3396"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7";,
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6";,
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+    {
+      "VersionDefinition" : {
+        "id" : 2,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "show_available": true,
+        "repository_version" : "2.3.4.0-3397",
+        "type" : "STANDARD",
+        "version_url" : 
"file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3397.xml",
+        "release" : {
+          "build" : "3397",
+          "compatible_with" : "2.3.[0-3].0",
+          "notes" : "http://example.com";,
+          "version" : "2.3.4.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis 
of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-3397"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-3397"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7";,
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6";,
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+    {
+      "VersionDefinition" : {
+        "id" : 5,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "show_available": true,
+        "repository_version" : "2.3.6.0-3646",
+        "type" : "STANDARD",
+        "version_url" : 
"file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3646.xml",
+        "release" : {
+          "build" : "3646",
+          "compatible_with" : "2.3.[0-6].0",
+          "notes" : "http://example.com";,
+          "version" : "2.3.6.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis 
of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-3646"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-3646"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7";,
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6";,
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6";,
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+
+    {
+      "VersionDefinition" : {
+        "id" : 3,
+        "stack_name" : "HDP",
+        "stack_version" : "2.4",
+        "show_available": true,
+        "repository_version" : "2.4.0.0-169",
+        "type" : "STANDARD",
+        "version_url" : 
"file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_169.xml",
+        "release" : {
+          "build" : "169",
+          "compatible_with" : "2.4.[0-3].0",
+          "notes" : "http://example.com";,
+          "version" : "2.4.0.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis 
of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-169"
+            ]
+          },
+          {
+            "name" : "MAPREDUCE2",
+            "display_name" : "MapReduce2",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Slider",
+            "display_name" : "Slider",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Pig",
+            "display_name" : "Pig",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Sqoop",
+            "display_name" : "Sqoop",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7";,
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.4"
+          },
+          "repositories" : [
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.4",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.4"
+              }
+            },
+            {
+              "href" : 
"http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20";,
+              "Repositories" : {
+                "base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "default_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "latest_base_url" : 
"http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7";,
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.4"
+              }
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/installer.js 
b/ambari-web/app/controllers/installer.js
index 73f9801..39a7812 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -19,6 +19,7 @@
 
 var App = require('app');
 var stringUtils = require('utils/string_utils');
+var validator = require('utils/validator');
 
 App.InstallerController = App.WizardController.extend({
 
@@ -139,7 +140,10 @@ App.InstallerController = App.WizardController.extend({
     var stackServices = App.StackService.find().mapProperty('serviceName');
     if (!(stackServices && !!stackServices.length && 
App.StackService.find().objectAt(0).get('stackVersion') == 
App.get('currentStackVersionNumber'))) {
       this.loadServiceComponents().complete(function () {
-        self.set('content.services', App.StackService.find());
+        self.set('content.services', App.StackService.find().forEach(function 
(item) {
+          // user the service version from VersionDefinition
+          item.set('serviceVersionDisplay', 
App.Stack.find().findProperty('isSelected', 
true).get('stackServices').findProperty('name', 
item.get('serviceName')).get('latestVersion'));
+        }));
         dfd.resolve();
       });
     } else {
@@ -241,7 +245,7 @@ App.InstallerController = App.WizardController.extend({
     App.Tab.find().clear();
     this.set('stackConfigsLoaded', false);
     if (stacks && stacks.get('length')) {
-      App.set('currentStackVersion', 
App.Stack.find().findProperty('isSelected').get('id'));
+      App.set('currentStackVersion', 
App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
       dfd.resolve(true);
     } else {
       App.ajax.send({
@@ -278,12 +282,12 @@ App.InstallerController = App.WizardController.extend({
     var requests = [];
     this.get('stackNames').forEach(function (stackName) {
       requests.push(App.ajax.send({
-        name: 'wizard.stacks_versions',
+        name: 'wizard.stacks_versions_definitions',
         sender: this,
         data: {
           stackName: stackName
         },
-        success: 'loadStacksVersionsSuccessCallback',
+        success: 'loadStacksVersionsDefinitionsSuccessCallback',
         error: 'loadStacksVersionsErrorCallback'
       }));
     }, this);
@@ -299,30 +303,111 @@ App.InstallerController = App.WizardController.extend({
   /**
    * Parse loaded data and create array of stacks objects
    */
-  loadStacksVersionsSuccessCallback: function (data) {
+  loadStacksVersionsDefinitionsSuccessCallback: function (data) {
+    var self = this;
     var stacks = App.db.getStacks();
+    var repos = App.db.getRepos();
     var isStacksExistInDb = stacks && stacks.length;
     if (isStacksExistInDb) {
       stacks.forEach(function (_stack) {
-        var stack = data.items.filterProperty('Versions.stack_name', 
_stack.stack_name).findProperty('Versions.stack_version', _stack.stack_version);
+        var stack = 
data.items.findProperty('VersionDefinition.repository_version', 
_stack.repository_version);
         if (stack) {
-          stack.Versions.is_selected = _stack.is_selected;
+          stack.VersionDefinition.is_selected = _stack.is_selected;
         }
       }, this);
     }
-    App.stackMapper.map(data);
-    if (!this.decrementProperty('loadStacksRequestsCounter')) {
-      if (!isStacksExistInDb) {
-        var defaultStackVersion = App.Stack.find().findProperty('id', 
App.defaultStackVersion);
-        if (defaultStackVersion) {
-          defaultStackVersion.set('isSelected', true)
+
+    var versionDefinition = data.items[0];
+    // to display repos panel, should map all available operating systems 
including empty ones
+    this.getSupportedOSList(versionDefinition.VersionDefinition.stack_name, 
versionDefinition.VersionDefinition.stack_version).complete(function () {
+      var existedOS = versionDefinition.operating_systems;
+      var existedMap = {};
+      existedOS.map(function (existedOS) {
+        existedOS.isSelected = true;
+        existedMap[existedOS.OperatingSystems.os_type] = existedOS;
+      });
+      self.get('allSupportedOS').forEach(function(supportedOS) {
+        if(!existedMap[supportedOS.OperatingSystems.os_type]) {
+          supportedOS.isSelected = false;
+          supportedOS.repositories.forEach(function(repo) {
+            repo.Repositories.base_url = '';
+          });
+          existedOS.push(supportedOS);
+        }
+      });
+      App.stackMapper.map(data.items, "VersionDefinition");
+      if (!self.decrementProperty('loadStacksRequestsCounter')) {
+
+        var versionData = self.getSelectedRepoVersionData();
+        if (versionData) {
+          self.postVersionDefinitionFile(versionData.isXMLdata, 
versionData.data).done(function (versionInfo) {
+            self.mergeChanges(repos);
+            App.Stack.find().setEach('isSelected', false);
+            App.Stack.find().findProperty('id', versionInfo.stackNameVersion + 
"-" + versionInfo.actualVersion).set('isSelected', true);
+            self.setSelected(isStacksExistInDb);
+          });
         } else {
-          App.Stack.find().objectAt(0).set('isSelected', true);
+          self.setSelected(isStacksExistInDb);
         }
       }
-      this.set('content.stacks', App.Stack.find());
-      App.set('currentStackVersion', 
App.Stack.find().findProperty('isSelected').get('id'));
+    });
+  },
+
+  mergeChanges: function (repos) {
+    repos.forEach(function (repo) {
+      App.Repository.find().findProperty('id', repo.id).set('baseUrl', 
repo.base_url);
+    });
+  },
+
+  setSelected: function (isStacksExistInDb) {
+    if (!isStacksExistInDb) {
+      var defaultStackVersion = 
App.Stack.find().findProperty('stackNameVersion', App.defaultStackVersion);
+      if (defaultStackVersion) {
+        defaultStackVersion.set('isSelected', true)
+      } else {
+        App.Stack.find().objectAt(0).set('isSelected', true);
+      }
     }
+    this.set('content.stacks', App.Stack.find());
+    App.set('currentStackVersion', 
App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
+  },
+
+  /**
+   * Get the the repo version (to install) info, this data will be POST
+   * @method startDeploy
+   */
+  getSelectedRepoVersionData: function () {
+    var vdfData = App.db.getLocalRepoVDFData();
+    var selectedStack = App.Stack.find().findProperty('isSelected', true);
+    var isXMLdata = false;
+    var data = {};
+    if (selectedStack && selectedStack.get('showAvailable')) {
+      //meaning user selected a public repo
+      data = {
+        "VersionDefinition": {
+          "available": selectedStack.get('id')
+        }
+      };
+      isXMLdata = false;
+    } else if (vdfData && validator.isValidURL(vdfData)) {
+      // meaning user uploaded a VDF via entering URL
+      data = {
+        "VersionDefinition": {
+          "version_url": vdfData
+        }
+      };
+      isXMLdata = false;
+    } else if (vdfData) {
+      // meaning user uploaded a local VDF.xml file
+      isXMLdata = true;
+      data = vdfData;
+    } else {
+      return null;
+    }
+    return {
+      isXMLdata: isXMLdata,
+      data: data
+    };
   },
 
   /**
@@ -372,10 +457,13 @@ App.InstallerController = App.WizardController.extend({
    * set stacks from server to content and local DB
    */
   setStacks: function () {
-    var result = App.Stack.find() || [];
-    Em.assert('Stack model is not populated', result.get('length'));
-    App.db.setStacks(result.slice());
-    this.set('content.stacks', result);
+    var stacks = App.Stack.find() || [];
+    Em.assert('Stack model is not populated', stacks.get('length'));
+    App.db.setStacks(stacks.slice());
+    this.set('content.stacks', stacks);
+
+    var repos = App.Repository.find() || [];
+    App.db.setRepos(repos.slice());
   },
 
   /**
@@ -405,7 +493,6 @@ App.InstallerController = App.WizardController.extend({
    * @param stepController App.WizardStep5Controller
    */
   saveMasterComponentHosts: function (stepController) {
-
     var obj = stepController.get('selectedServicesMasters'),
       hosts = this.getDBProperty('hosts');
 
@@ -506,13 +593,222 @@ App.InstallerController = App.WizardController.extend({
     this.set('content.clients', clients);
   },
 
+  /*
+   * Post version definition file (.xml) to server, DRY_RUN = TRUE
+   */
+  postVersionDefinitionFile: function (isXMLdata, data) {
+    var dfd = $.Deferred();
+    var name = isXMLdata? 'wizard.step1.post_version_definition_file.xml' : 
'wizard.step1.post_version_definition_file.url';
+
+    App.ajax.send({
+      name: name,
+      sender: this,
+      data: {
+        dfd: dfd,
+        data: data
+      },
+      success: 'postVersionDefinitionFileSuccessCallback',
+      error: 'postVersionDefinitionFileErrorCallback'
+    });
+    return dfd.promise();
+  },
+
+  /**
+   * onSuccess callback for postVersionDefinitionFile.
+   */
+  postVersionDefinitionFileSuccessCallback: function (_data, request, 
dataInfo) {
+    if (_data.resources.length && _data.resources[0].VersionDefinition) {
+      var data = _data.resources[0];
+      var self = this;
+      // load the data info to display for details and contents panel
+      var response = {
+        id : data.VersionDefinition.id,
+        stackVersion : data.VersionDefinition.stack_version,
+        stackName: data.VersionDefinition.stack_name,
+        type: data.VersionDefinition.type,
+        stackNameVersion: data.VersionDefinition.stack_name + '-' + 
data.VersionDefinition.stack_version, /// HDP-2.3
+        actualVersion: data.VersionDefinition.repository_version, /// 
2.3.4.0-3846
+        version: data.VersionDefinition.release ? 
data.VersionDefinition.release.version: null, /// 2.3.4.0
+        releaseNotes: data.VersionDefinition.release ? 
data.VersionDefinition.release.notes: null,
+        displayName: data.VersionDefinition.release ? 
data.VersionDefinition.stack_name + '-' + 
data.VersionDefinition.release.version :
+        data.VersionDefinition.stack_name + '-' + 
data.VersionDefinition.repository_version, //HDP-2.3.4.0
+        repoVersionFullName : data.VersionDefinition.stack_name + '-' + 
data.VersionDefinition.repository_version,
+        osList: data.operating_systems,
+        updateObj: data
+      };
+      var services = [];
+      data.VersionDefinition.services.forEach(function (service) {
+        services.push({
+          name: service.name,
+          version: service.versions[0].version,
+          components: service.versions[0].components
+        });
+      });
+      response.services = services;
+
+      // to display repos panel, should map all available operating systems 
including empty ones
+      this.getSupportedOSList(response.stackName, 
response.stackVersion).complete(function () {
+        var existedOS = data.operating_systems;
+        var existedMap = {};
+        existedOS.map(function (existedOS) {
+          existedOS.isSelected = true;
+          existedMap[existedOS.OperatingSystems.os_type] = existedOS;
+        });
+        self.get('allSupportedOS').forEach(function(supportedOS) {
+          if(!existedMap[supportedOS.OperatingSystems.os_type]) {
+            supportedOS.isSelected = false;
+            supportedOS.repositories.forEach(function(repo) {
+              repo.Repositories.base_url = '';
+            });
+            existedOS.push(supportedOS);
+          }
+        });
+        App.stackMapper.map(_data.resources, "VersionDefinition");
+        dataInfo.dfd.resolve(response);
+      });
+    }
+  },
+
+  /*
+   * Post version definition file (.xml) to server in step 8
+   */
+  postVersionDefinitionFileStep8: function (isXMLdata, data) {
+    var dfd = $.Deferred();
+    var name = isXMLdata == true? 
'wizard.step8.post_version_definition_file.xml' : 
'wizard.step8.post_version_definition_file';
+    App.ajax.send({
+      name: name,
+      sender: this,
+      data: {
+        dfd: dfd,
+        data: data
+      },
+      success: 'postVersionDefinitionFileStep8SuccessCallback',
+      error: 'postVersionDefinitionFileErrorCallback'
+    });
+    return dfd.promise();
+  },
+  /**
+   * onSuccess callback for postVersionDefinitionFile.
+   */
+  postVersionDefinitionFileStep8SuccessCallback: function (response, request, 
data) {
+    if (response.resources.length && response.resources[0].VersionDefinition) {
+      data.dfd.resolve(
+        {
+          stackName: response.resources[0].VersionDefinition.stack_name,
+          id: response.resources[0].VersionDefinition.id,
+          stackVersion: response.resources[0].VersionDefinition.stack_version
+        });
+    }
+  },
+
+  /**
+   * onError callback for postVersionDefinitionFile.
+   */
+  postVersionDefinitionFileErrorCallback: function (request, ajaxOptions, 
error, data, params) {
+    params.dfd.reject(data);
+    var header = 
Em.I18n.t('installer.step1.useLocalRepo.uploadFile.error.title');
+    var body = "";
+    if(request && request.responseText){
+      try {
+        var json = $.parseJSON(request.responseText);
+        body = json.message;
+      } catch (err) {}
+    }
+    App.showAlertPopup(header, body);
+  },
+
+  getSupportedOSList: function (stackName, stackVersion) {
+    return  App.ajax.send({
+      name: 'wizard.step1.get_supported_os_types',
+      sender: this,
+      data: {
+        stackName: stackName,
+        stackVersion: stackVersion
+      },
+      success: 'getSupportedOSListSuccessCallback',
+      error: 'getSupportedOSListErrorCallback'
+    });
+  },
+
+  /**
+   * onSuccess callback for getSupportedOSList.
+   */
+  getSupportedOSListSuccessCallback: function (response, request, data) {
+    if (response.operating_systems) {
+      this.set('allSupportedOS', response.operating_systems);
+    }
+  },
+
+  /**
+   * onError callback for getSupportedOSList
+   */
+  getSupportedOSListErrorCallback: function (request, ajaxOptions, error, 
data, params) {
+    var header = 
Em.I18n.t('installer.step1.useLocalRepo.getSurpottedOs.error.title');
+    var body = "";
+    if(request && request.responseText){
+      try {
+        var json = $.parseJSON(request.responseText);
+        body = json.message;
+      } catch (err) {}
+    }
+    App.showAlertPopup(header, body);
+  },
+
+  updateRepoOSInfo: function (repoToUpdate, repo) {
+    var deferred = $.Deferred();
+    var repoVersion = this.prepareRepoForSaving(repo);
+    App.ajax.send({
+      name: 'admin.stack_versions.edit.repo',
+      sender: this,
+      data: {
+        stackName: repoToUpdate.stackName,
+        stackVersion: repoToUpdate.stackVersion,
+        repoVersionId: repoToUpdate.id,
+        repoVersion: repoVersion
+      }
+    }).success(function() {
+      deferred.resolve([]);
+    }).error(function() {
+      deferred.resolve([]);
+    });
+    return deferred.promise();
+  },
+
+  /**
+   * transform repo data into json for
+   * saving changes to repository version
+   * @param {Em.Object} repo
+   * @returns {{operating_systems: Array}}
+   */
+  prepareRepoForSaving: function(repo) {
+    var repoVersion = { "operating_systems": [] };
+    repo.get('operatingSystems').forEach(function (os, k) {
+      repoVersion.operating_systems.push({
+        "OperatingSystems": {
+          "os_type": os.get("osType")
+        },
+        "repositories": []
+      });
+      os.get('repositories').forEach(function (repository) {
+        repoVersion.operating_systems[k].repositories.push({
+          "Repositories": {
+            "base_url": repository.get('baseUrl'),
+            "repo_id": repository.get('repoId'),
+            "repo_name": repository.get('repoName')
+          }
+        });
+      });
+    });
+    return repoVersion;
+  },
+
   /**
    * Check validation of the customized local urls
    */
   checkRepoURL: function (wizardStep1Controller) {
     var selectedStack = this.get('content.stacks').findProperty('isSelected', 
true);
     selectedStack.set('reload', true);
-    var nameVersionCombo = selectedStack.get('id');
+    var nameVersionCombo = selectedStack.get('stackNameVersion');
     var stackName = nameVersionCombo.split('-')[0];
     var stackVersion = nameVersionCombo.split('-')[1];
     var dfd = $.Deferred();
@@ -624,7 +920,9 @@ App.InstallerController = App.WizardController.extend({
 
           if (!stacksLoaded) {
             $.when.apply(this, this.loadStacksVersions()).done(function () {
-              dfd.resolve(stacksLoaded);
+              Em.run.later('sync', function() {
+                dfd.resolve(stacksLoaded);
+              }, 1000);
             });
           } else {
             dfd.resolve(stacksLoaded);

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js 
b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index a056d3b..cdc2aa7 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -231,7 +231,7 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
    */
   realStackUrl: function () {
     return App.get('apiPrefix') + '/clusters/' + App.get('clusterName') +
-      
'/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/repositories/*';
+      
'/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/OperatingSystems/*,repository_versions/operating_systems/repositories/*';
   }.property('App.clusterName'),
 
   /**
@@ -1325,11 +1325,12 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
    */
   prepareRepoForSaving: function(repo) {
     var repoVersion = { "operating_systems": [] };
-
+    var ambari_managed_repositories = !repo.get('useRedhatSatellite');
     repo.get('operatingSystems').forEach(function (os, k) {
       repoVersion.operating_systems.push({
         "OperatingSystems": {
-          "os_type": os.get("osType")
+          "os_type": os.get("osType"),
+          "ambari_managed_repositories": ambari_managed_repositories
         },
         "repositories": []
       });
@@ -1794,5 +1795,36 @@ App.MainAdminStackAndUpgradeController = 
Em.Controller.extend(App.LocalStorage,
     newWindow = window.open();
     newWindow.document.write(output);
     newWindow.focus();
-  }
+  },
+
+  /**
+   * load version for services to display on Choose Servoces page
+   * should load from VersionDefinition endpoint
+   */
+  loadServiceVersionFromVersionDefinitions: function () {
+    return App.ajax.send({
+      name: 'cluster.load_current_repo_stack_services',
+      sender: this,
+      data: {
+        clusterName: App.clusterName
+      },
+      success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
+      error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
+    });
+  },
+
+  serviceVersionsMap: {},
+  loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) 
{
+    var rv = jsonData.items[0].repository_versions[0].RepositoryVersions;
+    var map = this.get('serviceVersionsMap');
+    if (rv) {
+      rv.stack_services.forEach(function (item) {
+        map[item.name] = item.versions[0];
+      });
+    }
+  },
+
+  loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, 
ajaxOptions, error) {
+  },
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/main/service/add_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/add_controller.js 
b/ambari-web/app/controllers/main/service/add_controller.js
index 73abd59..a4fa9b7 100644
--- a/ambari-web/app/controllers/main/service/add_controller.js
+++ b/ambari-web/app/controllers/main/service/add_controller.js
@@ -192,7 +192,13 @@ App.AddServiceController = 
App.WizardController.extend(App.AddSecurityConfigs, {
       
this.setSkipSlavesStep(App.StackService.find().filterProperty('isSelected').filterProperty('isInstalled',
 false), 3);
     }
     this.set('serviceToInstall', null);
-    this.set('content.services', App.StackService.find());
+    var self = this;
+    this.loadServiceVersionFromVersionDefinitions().complete(function () {
+      self.set('content.services', App.StackService.find().forEach(function 
(item) {
+        // user the service version from VersionDefinition
+        Ember.set(item, 'serviceVersionDisplay', 
self.get('serviceVersionsMap')[item.get('serviceName')]);
+      }));
+    });
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js 
b/ambari-web/app/controllers/wizard.js
index 2aacf28..64ee3dd 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -678,6 +678,35 @@ App.WizardController = 
Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
   },
 
   /**
+   * load version for services to display on Choose Servoces page
+   * should load from VersionDefinition endpoint
+   */
+  loadServiceVersionFromVersionDefinitions: function () {
+    return App.ajax.send({
+      name: 'cluster.load_current_repo_stack_services',
+      sender: this,
+      data: {
+        clusterName: App.clusterName
+      },
+      success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
+      error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
+      });
+  },
+
+  serviceVersionsMap: {},
+  loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) 
{
+    var rv = jsonData.items[0].repository_versions[0].RepositoryVersions;
+    var map = this.get('serviceVersionsMap');
+    if (rv) {
+      rv.stack_services.forEach(function (item) {
+        map[item.name] = item.versions[0];
+      });
+    }
+  },
+  loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, 
ajaxOptions, error) {
+  },
+
+  /**
    * Load config groups from local DB
    */
   loadServiceConfigGroups: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/wizard/step1_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step1_controller.js 
b/ambari-web/app/controllers/wizard/step1_controller.js
index c357bf4..86117c8 100644
--- a/ambari-web/app/controllers/wizard/step1_controller.js
+++ b/ambari-web/app/controllers/wizard/step1_controller.js
@@ -31,7 +31,90 @@ App.WizardStep1Controller = Em.Controller.extend({
 
   selectedStack: function() {
     return App.Stack.find().findProperty('isSelected');
-  }.property('[email protected]')
+  }.property('[email protected]'),
 
+  optionsToSelect: {
+    'usePublicRepo': {
+      index: 0,
+      isSelected: true
+    },
+    'useLocalRepo': {
+      index: 1,
+      isSelected: false,
+      'uploadFile': {
+        index: 0,
+        name: 'uploadFile',
+        file: '',
+        hasError: false,
+        isSelected: true
+      },
+      'enterUrl': {
+        index: 1,
+        name: 'enterUrl',
+        url: 'http://',
+        hasError: false,
+        isSelected: false
+      }
+    }
+  },
 
+  /**
+   * Used to set version definition file from FileUploader
+   * @method setVDFFile
+   * @param {string} vdf
+   */
+  setVDFFile: function (vdf) {
+    this.set("optionsToSelect.useLocalRepo.uploadFile.file", vdf);
+  },
+
+  /**
+   * Load selected file to current page content
+   */
+  readVersionInfo: function(){
+    var data = {};
+    var isXMLdata = false;
+    if (this.get("optionsToSelect.usePublicRepo.isSelected")) return;
+    if (this.get("optionsToSelect.useLocalRepo.isSelected") && 
this.get("optionsToSelect.useLocalRepo.enterUrl.isSelected")) {
+      var url = this.get("optionsToSelect.useLocalRepo.enterUrl.url");
+      data = {
+        "VersionDefinition": {
+          "version_url": url
+        }
+      };
+      App.db.setLocalRepoVDFData(url);
+    } else if (this.get("optionsToSelect.useLocalRepo.uploadFile.isSelected")) 
{
+      isXMLdata = true;
+      // load from file browser
+      data = this.get("optionsToSelect.useLocalRepo.uploadFile.file");
+      App.db.setLocalRepoVDFData(data);
+    }
+    var installerController = App.router.get('installerController');
+    var self = this;
+    installerController.postVersionDefinitionFile(isXMLdata, 
data).done(function (response) {
+      self.set('latestSelectedLocalRepoId', response.stackNameVersion + "-" + 
response.actualVersion);
+      // load successfully, so make this local stack repo as selectedStack
+      self.get('content.stacks').setEach('isSelected', false);
+      self.get('content.stacks').findProperty('id', response.stackNameVersion 
+ "-" + response.actualVersion).set('isSelected', true);
+      Ember.run.next(function () {
+        $("[rel=skip-validation-tooltip]").tooltip({ placement: 'right'});
+        $("[rel=use-redhat-tooltip]").tooltip({ placement: 'right'});
+      });
+    });
+  },
+
+  /**
+   * On click handler for removing OS
+   */
+  removeOS: function(event) {
+    var osToRemove = event.context;
+    Em.set(osToRemove, 'isSelected', false);
+  },
+
+  /**
+   * On click handler for adding new OS
+   */
+  addOS: function(event) {
+    var osToAdd = event.context;
+    Em.set(osToAdd, 'isSelected', true);
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/controllers/wizard/step8_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step8_controller.js 
b/ambari-web/app/controllers/wizard/step8_controller.js
index a5eb949..11ff7ed 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -18,6 +18,7 @@
 
 var App = require('app');
 var stringUtils = require('utils/string_utils');
+var validator = require('utils/validator');
 
 App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, 
App.wizardDeployProgressControllerMixin, App.ConfigOverridable, 
App.ConfigsSaverMixin, {
 
@@ -827,11 +828,38 @@ App.WizardStep8Controller = 
Em.Controller.extend(App.AddSecurityConfigs, App.wiz
       this.addRequestToAjaxQueue(ajaxOpts);
     }
   },
+
   /**
-   * Start deploy process
+   * To Start deploy process
    * @method startDeploy
    */
   startDeploy: function () {
+    if (this.get('content.controllerName') !== 'installerController') {
+      this._startDeploy();
+    } else {
+      var installerController = App.router.get('installerController');
+      var versionData = installerController.getSelectedRepoVersionData();
+      if (versionData) {
+        var self = this;
+        
installerController.postVersionDefinitionFileStep8(versionData.isXMLdata, 
versionData.data).done(function (versionInfo) {
+          if (versionInfo.id && versionInfo.stackName && 
versionInfo.stackVersion) {
+            var selectedStack = App.Stack.find().findProperty('isSelected', 
true);
+            installerController.updateRepoOSInfo(versionInfo, 
selectedStack).done(function() {
+              self._startDeploy();
+            });
+          }
+        });
+      } else {
+        this._startDeploy();
+      }
+    }
+  },
+
+  /**
+   * Start deploy process
+   * @method startDeploy
+   */
+  _startDeploy: function () {
     this.createCluster();
     this.createSelectedServices();
     if (this.get('content.controllerName') !== 'addHostController') {
@@ -877,10 +905,11 @@ App.WizardStep8Controller = 
Em.Controller.extend(App.AddSecurityConfigs, App.wiz
   createCluster: function () {
     if (this.get('content.controllerName') !== 'installerController') return;
     var stackVersion = (this.get('content.installOptions.localRepo')) ? 
App.currentStackVersion.replace(/(-\d+(\.\d)*)/ig, "Local$&") : 
App.currentStackVersion;
+    var selectedStack = App.Stack.find().findProperty('isSelected', true);
     this.addRequestToAjaxQueue({
       name: 'wizard.step8.create_cluster',
       data: {
-        data: JSON.stringify({ "Clusters": {"version": stackVersion }})
+        data: JSON.stringify({ "Clusters": {"version": stackVersion, 
"repository_version": selectedStack.get('repositoryVersion')}})
       },
       success: 'createClusterSuccess'
     });
@@ -1274,7 +1303,6 @@ App.WizardStep8Controller = 
Em.Controller.extend(App.AddSecurityConfigs, App.wiz
     var masterHosts = this.get('content.masterComponentHosts');
 
     // add all components with cardinality == ALL of selected services
-
     var registeredHosts = this.getRegisteredHosts();
     var notInstalledHosts = registeredHosts.filterProperty('isInstalled', 
false);
     this.get('content.services').filterProperty('isSelected').forEach(function 
(service) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/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 67cfe64..04b9d73 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -34,6 +34,7 @@ App.repoVersionMapper = App.QuickDataMapper.create({
       upgrade_pack: repoVersionsKey + '.upgrade_pack',
       stack_version_type: repoVersionsKey + '.stack_name',
       stack_version_number: repoVersionsKey + '.stack_version',
+      use_redhat_satellite: 'use_redhat_satellite',
       services_key: 'services',
       services_type: 'array',
       services: {
@@ -128,7 +129,19 @@ App.repoVersionMapper = App.QuickDataMapper.create({
               serviceArray.pushObject(serviceObj);
               resultService.push(this.parseIt(serviceObj, 
this.get('modelService')));
             }, this);
+          } else if (item[repoVersionsKey].stack_services) {
+            item[repoVersionsKey].stack_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]: ''
+              };
+              serviceArray.pushObject(serviceObj);
+              resultService.push(this.parseIt(serviceObj, 
this.get('modelService')));
+            }, this);
           }
+          repo.use_redhat_satellite = 
item.operating_systems[0].OperatingSystems.ambari_managed_repositories === 
false;
           repo.operating_systems = osArray;
           repo.services = serviceArray;
           resultRepoVersion.push(this.parseIt(repo, 
this.modelRepoVersion(isCurrentStackOnly)));

http://git-wip-us.apache.org/repos/asf/ambari/blob/0b77adc2/ambari-web/app/mappers/stack_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_mapper.js 
b/ambari-web/app/mappers/stack_mapper.js
index 75245e0..4f73612 100644
--- a/ambari-web/app/mappers/stack_mapper.js
+++ b/ambari-web/app/mappers/stack_mapper.js
@@ -21,11 +21,15 @@ App.stackMapper = App.QuickDataMapper.create({
   modelStack: App.Stack,
   modelOS: App.OperatingSystem,
   modelRepo: App.Repository,
+  modelServices: App.ServiceSimple,
   
   configStack: {
     id: 'id',
     stack_name: 'stack_name',
     stack_version: 'stack_version',
+    show_available: 'show_available',
+    type: 'type',
+    repository_version: 'repository_version',
     active: 'active',
     parent_stack_version: 'parent_stack_version',
     min_upgrade_version: 'min_upgrade_version',
@@ -33,6 +37,11 @@ App.stackMapper = App.QuickDataMapper.create({
     max_jdk_version: 'max_jdk',
     is_selected: 'is_selected',
     config_types: 'config_types',
+    stack_services_key: 'stack_services',
+    stack_services_type: 'array',
+    stack_services: {
+      item: 'id'
+    },
     operating_systems_key: 'operating_systems',
     operating_systems_type: 'array',
     operating_systems: {
@@ -46,12 +55,20 @@ App.stackMapper = App.QuickDataMapper.create({
     stack_name: 'stack_name',
     stack_version: 'stack_version',
     stack_id: 'stack_id',
+    is_selected: 'is_selected',
     repositories_key: 'repositories',
     repositories_type: 'array',
     repositories: {
       item: 'id'
     }
   },
+
+  configService: {
+    id: 'id',
+    name: 'name',
+    display_name: 'display_name',
+    latest_version: 'latest_version'
+  },
   
   configRepository: {
     id: 'id',
@@ -67,42 +84,59 @@ App.stackMapper = App.QuickDataMapper.create({
     operating_system_id: 'os_id'
   },
   
-  map: function(json) {
+  map: function(json, key) {
     var modelStack = this.get('modelStack');
     var modelOS = this.get('modelOS');
     var modelRepo = this.get('modelRepo');
+    var modelServices = this.get('modelServices');
     var resultStack = [];
     var resultOS = [];
     var resultRepo = [];
+    var resultServices = [];
 
-    var stackVersions = json.items.filterProperty('Versions.active');
-    
stackVersions.sortProperty('Versions.stack_version').reverse().forEach(function(item)
 {
-      var stack = item.Versions;
+    var stackVersions = json;
+    var propertiesKey = key;
+    stackVersions.sortProperty(key + 
'.stack_version').reverse().forEach(function(item) {
+      var stack = item[key];
       var operatingSystemsArray = [];
+      var servicesArray = [];
 
-      stack.id = stack.stack_name + "-" + stack.stack_version;
+      stack.id = stack.stack_name + "-" + stack.stack_version + "-" + 
stack.repository_version; //HDP-2.5-2.5.0.0
 
       item.operating_systems.forEach(function(ops) {
         var operatingSystems = ops.OperatingSystems;
 
         var repositoriesArray = [];
         ops.repositories.forEach(function(repo) {
-          repo.Repositories.id = [repo.Repositories.stack_name, 
repo.Repositories.stack_version, repo.Repositories.os_type, 
repo.Repositories.repo_id].join('-');
-          repo.Repositories.os_id = [repo.Repositories.stack_name, 
repo.Repositories.stack_version, repo.Repositories.os_type].join('-');
+          repo.Repositories.id = [stack.id, repo.Repositories.os_type, 
repo.Repositories.repo_id].join('-');
+          repo.Repositories.os_id = [stack.id, 
repo.Repositories.os_type].join('-');
+          if (!repo.Repositories.latest_base_url)  
repo.Repositories.latest_base_url = repo.Repositories.base_url;
           resultRepo.push(this.parseIt(repo.Repositories, 
this.get('configRepository')));
           repositoriesArray.pushObject(repo.Repositories);
         }, this);
 
 
-        operatingSystems.id = operatingSystems.stack_name + "-" + 
operatingSystems.stack_version + "-" + operatingSystems.os_type;
+        operatingSystems.id = stack.id + "-" + operatingSystems.os_type;
         operatingSystems.stack_id = operatingSystems.stack_name + "-" + 
operatingSystems.stack_version;
         operatingSystems.repositories = repositoriesArray;
+        operatingSystems.is_selected = (ops.isSelected == true || 
ops.isSelected == undefined);
         resultOS.push(this.parseIt(operatingSystems, this.get('configOS')));
         operatingSystemsArray.pushObject(operatingSystems);
         
       }, this);
-      
 
+      stack.stack_services.forEach(function(service) {
+        var serviceObj = {
+          id: service.name + '-' + stack.id,
+          name: service.name,
+          display_name: service.display_name,
+          latest_version: service.versions? service.versions[0] : ''
+        };
+        resultServices.push(this.parseIt(serviceObj, 
this.get('configService')));
+        servicesArray.pushObject(serviceObj);
+      }, this);
+
+      stack.stack_services = servicesArray;
       stack.operating_systems = operatingSystemsArray;
       resultStack.push(this.parseIt(stack, this.get('configStack')));
       
@@ -111,6 +145,7 @@ App.stackMapper = App.QuickDataMapper.create({
     App.store.commit();
     App.store.loadMany(modelRepo, resultRepo);
     App.store.loadMany(modelOS, resultOS);
+    App.store.loadMany(modelServices, resultServices);
     App.store.loadMany(modelStack, resultStack);
   }
 });

Reply via email to