Repository: ambari
Updated Branches:
  refs/heads/trunk 81279faed -> 391b45e93


http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js 
b/ambari-web/app/utils/ajax/ajax.js
index a1d3f5f..9a23278 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1371,6 +1371,10 @@ var urls = {
     'real': 
'/clusters/{clusterName}/stack_versions?ClusterStackVersions/state=CURRENT&fields=repository_versions/RepositoryVersions/repository_version&minimal_response=true',
     'mock': '/data/stack_versions/stack_version_all.json'
   },
+  'cluster.load_current_repo_stack_services': {
+    'real': 
'/clusters/{clusterName}/stack_versions?ClusterStackVersions/state=CURRENT&fields=repository_versions/RepositoryVersions/stack_services',
+    'mock': '/data/stack_versions/stack_version_all.json'
+  },
   'cluster.save_provisioning_state': {
     'real': '/clusters/{clusterName}',
     'type': 'PUT',
@@ -1858,6 +1862,42 @@ var urls = {
     }
   },
 
+  'wizard.step1.post_version_definition_file.xml': {
+    'real': '/version_definitions',
+    'mock': '',
+    'format': function (data) {
+      return {
+        headers: {
+          'X-Requested-By': 'ambari',
+          'Content-Type': 'text/xml'
+        },
+        type: 'POST',
+        data: data.data
+      }
+    }
+  },
+  'wizard.step1.post_version_definition_file.url': {
+    'real': '/version_definitions',
+    'mock': '',
+    'format': function (data) {
+      return {
+        type: 'POST',
+        data: JSON.stringify(data.data)
+      }
+    }
+  },
+  'wizard.step1.get_repo_version_by_id': {
+    'real': 
'/stacks/{stackName}/versions?fields=repository_versions/operating_systems/repositories/*'
 +
+    ',repository_versions/RepositoryVersions/*' +
+    
'&repository_versions/RepositoryVersions/id={repoId}&Versions/stack_version={stackVersion}',
+    'mock': ''
+  },
+
+  'wizard.step1.get_supported_os_types': {
+    'real': 
'/stacks/{stackName}/versions/{stackVersion}?fields=operating_systems/repositories/Repositories',
+    'mock': ''
+  },
+
   'wizard.advanced_repositories.valid_url': {
     'real': 
'/stacks/{stackName}/versions/{stackVersion}/operating_systems/{osType}/repositories/{repoId}',
     'mock': '',
@@ -1868,6 +1908,12 @@ var urls = {
       }
     }
   },
+  'wizard.get_shown_version_definition': {
+    real: 
'/version_definitions?fields=VersionDefinition/stack_services&VersionDefinition/repository_version={repositoryVersion}&VersionDefinition/show_available=true'
+  },
+  'wizard.get_version_definition': {
+    real: 
'/version_definitions?fields=VersionDefinition/stack_services&VersionDefinition/repository_version={repositoryVersion}'
+  },
   'wizard.service_components': {
     'real': 
'{stackUrl}/services?fields=StackServices/*,components/*,components/dependencies/Dependencies/scope,artifacts/Artifacts/artifact_name',
     'mock': '/data/stacks/HDP-2.1/service_components.json'
@@ -2109,6 +2155,12 @@ var urls = {
     'real': 
'/stacks/{stackName}/versions?fields=Versions,operating_systems/repositories/Repositories',
     'mock': '/data/wizard/stack/{stackName}_versions.json'
   },
+
+  'wizard.stacks_versions_definitions': {
+    'real': 
'/version_definitions?fields=operating_systems/repositories/Repositories/*,VersionDefinition/stack_services,VersionDefinition/repository_version'
 +
+      
'&VersionDefinition/show_available=true&VersionDefinition/stack_name={stackName}',
+    'mock': '/data/wizard/stack/{stackName}_version_definitions.json'
+  },
   'wizard.launch_bootstrap': {
     'real': '/bootstrap',
     'mock': '/data/wizard/bootstrap/bootstrap.json',

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_upgrade/services_view.js 
b/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
index 8805c47..f566814 100644
--- a/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
+++ b/ambari-web/app/views/main/admin/stack_upgrade/services_view.js
@@ -31,10 +31,15 @@ App.MainAdminStackServicesView = Em.View.extend({
    */
   services: function() {
     var services = App.supports.installGanglia ? App.StackService.find() : 
App.StackService.find().without(App.StackService.find('GANGLIA'));
-    return services.map(function(s) {
-      s.set('isInstalled', App.Service.find().someProperty('serviceName', 
s.get('serviceName')));
-      return s;
+    var controller = this.get('controller');
+    controller.loadServiceVersionFromVersionDefinitions().complete(function () 
{
+      return services.map(function(s) {
+        s.set('serviceVersionDisplay', 
controller.get('serviceVersionsMap')[s.get('serviceName')]);
+        s.set('isInstalled', App.Service.find().someProperty('serviceName', 
s.get('serviceName')));
+        return s;
+      });
     });
+    return services;
   }.property('App.router.clusterController.isLoaded'),
 
   didInsertElement: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/views/wizard/step1_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/wizard/step1_view.js 
b/ambari-web/app/views/wizard/step1_view.js
index 452e676..2d4c94b 100644
--- a/ambari-web/app/views/wizard/step1_view.js
+++ b/ambari-web/app/views/wizard/step1_view.js
@@ -23,195 +23,397 @@ App.WizardStep1View = Em.View.extend({
 
   templateName: require('templates/wizard/step1'),
 
-  /**
-   * Is Repositories Accordion collapsed
-   * @type {bool}
-   */
-  isRLCollapsed: true,
-
   didInsertElement: function () {
-    if (this.get('isRLCollapsed')) {
-      this.$('.accordion-body').hide();
-    }
     $("[rel=skip-validation-tooltip]").tooltip({ placement: 'right'});
+    $("[rel=use-redhat-tooltip]").tooltip({ placement: 'right'});
+    
this.set('controller.latestSelectedPublicRepoId',this.get('controller.selectedStack.id'));
+
   },
 
   /**
-   * List of available stacks
+   * =========================== Option "Use Public Repository" starts from 
here ==================
+   */
+
+  /**
+   * List of available stack names HDP 2.2, HDP 2.3 .etc
    * @type {Em.Object[]}
    */
-  stacks: function () {
+  stackNames: function () {
+    var stackNamesMap = {};
+    var selectedStack = this.get('controller.selectedStack');
     return this.get('controller.content.stacks').toArray().map(function 
(stack) {
-      return Em.Object.create({
-        name: stack.get('id').replace('-', ' '),
-        isSelected: stack.get('isSelected')
-      });
+      if (!stackNamesMap[stack.get('stackNameVersion')] && 
stack.get('showAvailable')) {
+        stackNamesMap[stack.get('stackNameVersion')] = true;
+        return Em.Object.create({
+          id: stack.get('id'),
+          name: stack.get('stackNameVersion').replace('-', ' '),
+          isActive: stack.get('stackNameVersion') == 
selectedStack.get('stackNameVersion')
+        });
+      } else {
+        return {};
+      }
     });
   }.property('controller.selectedStack'),
 
-  operatingSystems: function () {
-    var selectedStack = this.get('controller.selectedStack');
-    return Em.isNone(selectedStack) ? [] : 
selectedStack.get('operatingSystems');
-  }.property('controller.selectedStack'),
+  selectStackNameOnTab: function (event) {
+    this.get('controller.content.stacks').setEach('isSelected', false);
+    this.get('controller.content.stacks').findProperty('id', 
event.context.id).set('isSelected', true);
+    this.set('controller.latestSelectedPublicRepoId',event.context.id);
+  },
 
   /**
-   * List of all repositories under selected stack operatingSystems
-   * API and ember data model structure:
-   * stack = [{OS-1},{OS-2}]
-   * OS-1 = [{repository-1},{repository-2}]
-   * OS-2 = [{repository-3},{repository-4}]
-   * @return: [{repository-1},{repository-2},{repository-3},{repository-4}]
+   * List of other available stack repos within the same stack name
+   * @type {Em.Object[]}
    */
-  allRepositories: function () {
+  availableStackRepoList: function () {
     var selectedStack = this.get('controller.selectedStack');
-    return Em.isNone(selectedStack) ? [] : selectedStack.get('repositories');
+    var availableStackRepos = 
this.get('controller.content.stacks').filter(function (item) {
+      return item.get('showAvailable') && item.get('stackNameVersion') == 
selectedStack.get('stackNameVersion') && item.get('id') != 
selectedStack.get('id');
+    });
+    return availableStackRepos.toArray().map(function (stack) {
+      return Em.Object.create({
+        id: stack.get('id'),
+        repositoryVersion: stack.get('repositoryVersion'),
+        isSelected: false
+      });
+    });
+  }.property('controller.selectedStack'),
+
+  selectRepoInList: function (event) {
+    this.get('controller.content.stacks').setEach('isSelected', false);
+    this.get('controller.content.stacks').findProperty('id', 
event.context.id).set('isSelected', true);
+    this.set('controller.latestSelectedPublicRepoId',event.context.id);
+  },
+
+  selectedServices: function () {
+    var selectedStack = this.get('controller.selectedStack');
+    return Em.isNone(selectedStack) ? [] : 
selectedStack.get('stackServices').toArray().map(function (service) {
+      return Em.Object.create({
+        displayName: service.get('displayName'),
+        version: service.get('latestVersion')
+      });
+    });
   }.property('controller.selectedStack'),
 
-  /**
-   * Verify if some repo has empty base-url
-   * @type {bool}
-   */
-  invalidFormatUrlExist: Em.computed.someBy('allRepositories', 
'invalidFormatError', true),
 
   /**
    * Disable submit button flag
    * @type {bool}
    */
-  isSubmitDisabled: Em.computed.or('invalidFormatUrlExist', 'isNoOsChecked', 
'invalidUrlExist', 'controller.content.isCheckInProgress'),
+  isSubmitDisabled: Em.computed.or('controller.content.isCheckInProgress'),
 
   /**
    * Enable error count badge
    * @type {bool}
    */
-  showErrorsWarningCount: Em.computed.and('isSubmitDisabled', 'totalErrorCnt'),
+  showErrorsWarningCount: false,
+  totalErrorCnt: 0,
+
+  viewRepositories: function () {
+    var self = this;
+    return App.ModalPopup.show({
+      header: Em.I18n.t('installer.step1.usePublicRepo.viewRepos'),
+      primary: Em.I18n.t('common.save'),
+      onPrimary: function () {
+        self.retryRepoUrls();
+        var modal = this;
+        setTimeout(function(){
+          modal.hide();
+        }, 1500);
+      },
+      classNames: ['view-repositories-popup', 'sixty-percent-width-modal'],
+      bodyClass: Em.View.extend({
+        templateName: require('templates/wizard/step1_viewRepositories'),
+        controllerBinding: 'App.router.wizardStep1Controller',
+
+        operatingSystems: function () {
+          var selectedStack = this.get('controller.selectedStack');
+          return Em.isNone(selectedStack) ? [] : 
selectedStack.get('operatingSystems');
+        }.property('controller.selectedStack'),
+
+        /**
+         * List of all repositories under selected stack operatingSystems
+         */
+        allRepositories: function () {
+          var selectedStack = this.get('controller.selectedStack');
+          return Em.isNone(selectedStack) ? [] : 
selectedStack.get('repositories');
+        }.property('controller.selectedStack'),
+
+        /**
+         * Verify if some repo has invalid base-url
+         * @type {bool}
+         */
+        invalidFormatUrlExist: Em.computed.someBy('allRepositories', 
'invalidFormatError', true),
+        /**
+         * Verify if some invalid repo-urls exist
+         * @type {bool}
+         */
+        invalidUrlExist: Em.computed.someBy('allRepositories', 'validation', 
App.Repository.validation['INVALID']),
+        /**
+         * If all repo links are unchecked
+         * @type {bool}
+         */
+        isNoOsChecked: Em.computed.everyBy('operatingSystems', 'isSelected', 
false),
+
+        /**
+         * Overall errors count
+         * @type {number}
+         */
+        updateTotalErrorCnt: function () {
+          var invalidFormatCnt = 
this.get('allRepositories').filterProperty('invalidFormatError').length;
+          var invalidCnt = 
this.get('allRepositories').filterProperty('validation', 
App.Repository.validation['INVALID']).length;
+          var cnt = 0;
+          if (this.get('isNoOsChecked')) {
+            cnt = 1;
+          } else if (invalidFormatCnt || invalidCnt) {
+            cnt = invalidFormatCnt + invalidCnt;
+          }
+          self.set('totalErrorCnt', cnt);
+          self.set('showErrorsWarningCount', cnt > 0);
+        }.observes('allRepositories', 
'[email protected]', 'isNoOsChecked', 
'[email protected]'),
+
+        popoverView: Em.View.extend({
+          tagName: 'i',
+          classNameBindings: ['repository.validation'],
+          attributeBindings: ['repository.errorTitle:title', 
'repository.errorContent:data-content'],
+          didInsertElement: function () {
+            App.popover($(this.get('element')), {'trigger': 'hover'});
+          }
+        }),
+
+        /**
+         * Onclick handler for recheck repos urls. Used in Advanced Repository 
Options.
+         */
+        retryRepoUrls: function () {
+          
App.router.get('installerController').checkRepoURL(this.get('controller'));
+        },
+
+        /**
+         * Onclick handler for checkbox of each repo group
+         * @method updateByCheckbox
+         */
+        updateByCheckbox: function () {
+          //upload to content
+          var operatingSystems = this.get('operatingSystems');
+          if (operatingSystems) {
+            operatingSystems.forEach(function (os) {
+              if (!os.get('isSelected')) {
+                os.get('repositories').forEach(function (repository) {
+                  repository.setProperties({
+                    baseUrl: repository.get('latestBaseUrl'),
+                    validation: App.Repository.validation['PENDING']
+                  });
+                });
+              } else {
+                os.get('repositories').forEach(function (repository) {
+                  if (this.get('controller.skipValidationChecked')) {
+                    repository.set('validation', 
App.Repository.validation['PENDING']);
+                  }
+                }, this);
+              }
+            }, this);
+          }
+        }.observes('[email protected]', 
'controller.skipValidationChecked'),
+
+        /**
+         * Onclick handler for undo action of each repo group
+         * @method undoGroupLocalRepository
+         * @param {object} event
+         */
+        undoGroupLocalRepository: function (event) {
+          event.context.setProperties({
+            baseUrl: event.context.get('latestBaseUrl'),
+            validation: App.Repository.validation['PENDING']
+          });
+        },
+
+        /**
+         * Handler for clear icon click
+         * @method clearGroupLocalRepository
+         * @param {object} event
+         */
+        clearGroupLocalRepository: function (event) {
+          if (!event.context.get('isSelected')) {
+            return;
+          }
+          event.context.setProperties({
+            baseUrl: '',
+            validation: App.Repository.validation['PENDING']
+          });
+        },
+
+        /**
+         * Handler when editing any repo BaseUrl
+         * @method editLocalRepository
+         */
+        editLocalRepository: function () {
+          //upload to content
+          var repositories = this.get('allRepositories');
+          repositories.forEach(function (repository) {
+            if (repository.get('lastBaseUrl') != repository.get('baseUrl')) {
+              repository.setProperties({
+                lastBaseUrl: repository.get('baseUrl'),
+                validation: App.Repository.validation['PENDING']
+              });
+            }
+          }, this);
+        }.observes('[email protected]')
+      })
+    });
+  },
 
   /**
-   * Verify if some invalid repo-urls exist
-   * @type {bool}
+   * Onclick handler for recheck repos urls. Used in Advanced Repository 
Options.
    */
-  invalidUrlExist: Em.computed.someBy('allRepositories', 'validation', 
App.Repository.validation['INVALID']),
+  retryRepoUrls: function () {
+    App.router.get('installerController').checkRepoURL(this.get('controller'));
+  },
+
 
   /**
-   * If all repo links are unchecked
-   * @type {bool}
+   * =========================== Option "Use Local Repository" starts from 
here ==================
    */
-  isNoOsChecked: Em.computed.everyBy('operatingSystems', 'isSelected', false),
 
   /**
-   * Overall errors count
-   * @type {number}
+   * Checkbox for use Public repo
+   * @type {Ember.Checkbox}
    */
-  totalErrorCnt: function () {
-    var invalidFormatCnt = 
this.get('allRepositories').filterProperty('invalidFormatError').length;
-    var invalidCnt = this.get('allRepositories').filterProperty('validation', 
App.Repository.validation['INVALID']).length;
-    if (this.get('isNoOsChecked')) {
-      return 1;
-    } else if (invalidFormatCnt || invalidCnt) {
-      return invalidFormatCnt + invalidCnt;
-    } else {
-      return 0;
+  usePublicRepoRadioButton: Em.Checkbox.extend({
+    tagName: 'input',
+    attributeBindings: [ 'type', 'checked' ],
+    classNames: [''],
+    checked: 
Em.computed.alias('controller.optionsToSelect.usePublicRepo.isSelected'),
+    type: 'radio',
+
+    click: function () {
+      this.set('controller.optionsToSelect.usePublicRepo.isSelected', true);
+      this.set('controller.optionsToSelect.useLocalRepo.isSelected', false);
+      var latestSelectedPublicRepoId = 
this.get('controller.latestSelectedPublicRepoId');
+      if (latestSelectedPublicRepoId) {
+        this.get('controller.content.stacks').setEach('isSelected', false);
+        this.get('controller.content.stacks').findProperty('id', 
latestSelectedPublicRepoId).set('isSelected', true);
+      }
     }
-  }.property('[email protected]', 'isNoOsChecked', 
'[email protected]'),
+  }),
 
   /**
-   * Checkbox for each stack
+   * Checkbox for use Public repo
    * @type {Ember.Checkbox}
    */
-  stackRadioButton: Em.Checkbox.extend({
+  useLocalRepoRadioButton: Em.Checkbox.extend({
     tagName: 'input',
     attributeBindings: [ 'type', 'checked' ],
-    checked: Em.computed.alias('content.isSelected'),
+    classNames: [''],
+    checked: 
Em.computed.alias('controller.optionsToSelect.useLocalRepo.isSelected'),
     type: 'radio',
 
     click: function () {
-      this.get('controller.content.stacks').setEach('isSelected', false);
-      this.get('controller.content.stacks').findProperty('id', 
this.get('content.name').replace(' ', '-')).set('isSelected', true);
+      this.set('controller.optionsToSelect.useLocalRepo.isSelected', true);
+      this.set('controller.optionsToSelect.usePublicRepo.isSelected', false);
+      var latestSelectedLocalRepoId = 
this.get('controller.latestSelectedLocalRepoId');
+      if (latestSelectedLocalRepoId) {
+        this.get('controller.content.stacks').setEach('isSelected', false);
+        this.get('controller.content.stacks').findProperty('id', 
latestSelectedLocalRepoId).set('isSelected', true);
+      }
     }
   }),
 
   /**
-   * Popover for repo-url error indicator
-   * @type {Em.View}
+   * Checkbox for Use local Repo > Upload VDF file
+   * @type {Ember.Checkbox}
    */
-  popoverView: Em.View.extend({
-    tagName: 'i',
-    classNameBindings: ['repository.validation'],
-    attributeBindings: ['repository.errorTitle:title', 
'repository.errorContent:data-content'],
-    didInsertElement: function () {
-      App.popover($(this.get('element')), {'trigger': 'hover'});
+  uploadFileRadioButton: Em.Checkbox.extend({
+    tagName: 'input',
+    attributeBindings: [ 'type', 'checked' ],
+    classNames: [''],
+    checked: 
Em.computed.alias('controller.optionsToSelect.useLocalRepo.uploadFile.isSelected'),
+    type: 'radio',
+
+    click: function () {
+      
this.set('controller.optionsToSelect.useLocalRepo.uploadFile.isSelected', true);
+      this.set('controller.optionsToSelect.useLocalRepo.enterUrl.isSelected', 
false);
+      this.set('controller.optionsToSelect.useLocalRepo.enterUrl.hasError', 
false);
+      this.set('controller.optionsToSelect.useLocalRepo.uploadFile.hasError', 
false);
     }
   }),
 
   /**
-   * Onclick handler for Config Group Header. Used to show/hide block
-   * @method onToggleBlock
+   * Checkbox for Use local Repo > Enter Url of VDF file
+   * @type {Ember.Checkbox}
    */
-  onToggleBlock: function () {
-    this.$('.accordion-body').toggle('blind', 500);
-    this.set('isRLCollapsed', !this.get('isRLCollapsed'));
-  },
+  enterUrlRadioButton: Em.Checkbox.extend({
+    tagName: 'input',
+    attributeBindings: [ 'type', 'checked' ],
+    classNames: [''],
+    checked: 
Em.computed.alias('controller.optionsToSelect.useLocalRepo.enterUrl.isSelected'),
+    type: 'radio',
 
-  /**
-   * Onclick handler for recheck repos urls. Used in Advanced Repository 
Options.
-   */
-  retryRepoUrls: function () {
-    App.router.get('installerController').checkRepoURL(this.get('controller'));
-  },
+    click: function () {
+      this.set('controller.optionsToSelect.useLocalRepo.enterUrl.isSelected', 
true);
+      
this.set('controller.optionsToSelect.useLocalRepo.uploadFile.isSelected', 
false);
+      this.set('controller.optionsToSelect.useLocalRepo.enterUrl.hasError', 
false);
+      this.set('controller.optionsToSelect.useLocalRepo.uploadFile.hasError', 
false);
+    }
+  }),
 
+ /*
+  * Is File API available
+  * @type {bool}
+  */
+  isFileApi: function () {
+    return window.File && window.FileReader && window.FileList;
+  }.property(),
 
-  /**
-   * Onclick handler for checkbox of each repo group
-   * @method updateByCheckbox
-   */
-  updateByCheckbox: function () {
-    //upload to content
-    var operatingSystems = this.get('operatingSystems');
-    if (operatingSystems) {
-      operatingSystems.forEach(function (os) {
-        if (!os.get('isSelected')) {
-          os.get('repositories').forEach(function (repository) {
-            repository.setProperties({
-              baseUrl: repository.get('latestBaseUrl'),
-              validation: App.Repository.validation['PENDING']
-            });
-          });
-        } else {
-          os.get('repositories').forEach(function (repository) {
-            if (this.get('controller.skipValidationChecked')) {
-              repository.set('validation', 
App.Repository.validation['PENDING']);
-            }
-          }, this);
-        }
-      }, this);
+  readInfoButtonDisabled: function () {
+    if (this.get('controller.optionsToSelect.useLocalRepo.isSelected')) {
+      
if(this.get('controller.optionsToSelect.useLocalRepo.uploadFile.isSelected')) {
+        return 
!this.get('controller.optionsToSelect.useLocalRepo.uploadFile.file');
+      } else if 
(this.get('controller.optionsToSelect.useLocalRepo.enterUrl.isSelected')) {
+        return 
!this.get('controller.optionsToSelect.useLocalRepo.enterUrl.url');
+      }
+    } else {
+      return true;
     }
-  }.observes('[email protected]', 
'controller.skipValidationChecked'),
+  }.property('controller.optionsToSelect.useLocalRepo.isSelected', 
'controller.optionsToSelect.useLocalRepo.uploadFile.isSelected',
+    'controller.optionsToSelect.useLocalRepo.uploadFile.file', 
'controller.optionsToSelect.useLocalRepo.enterUrl.url'),
+
+  operatingSystems: function () {
+    var selectedStack = this.get('controller.selectedStack');
+    return Em.isNone(selectedStack) ? [] : 
selectedStack.get('operatingSystems');
+  }.property('controller.selectedStack'),
 
   /**
-   * Onclick handler for undo action of each repo group
-   * @method undoGroupLocalRepository
-   * @param {object} event
+   * List of all repositories under selected stack operatingSystems
    */
-  undoGroupLocalRepository: function (event) {
-    event.context.setProperties({
-      baseUrl: event.context.get('latestBaseUrl'),
-      validation: App.Repository.validation['PENDING']
-    });
-  },
+  allRepositories: function () {
+    var selectedStack = this.get('controller.selectedStack');
+    return Em.isNone(selectedStack) ? [] : selectedStack.get('repositories');
+  }.property('controller.selectedStack'),
 
   /**
-   * Handler for clear icon click
-   * @method clearGroupLocalRepository
-   * @param {object} event
+   * Verify if some repo has invalid base-url
+   * @type {bool}
+   */
+  invalidFormatUrlExist: Em.computed.someBy('allRepositories', 
'invalidFormatError', true),
+  /**
+   * Verify if some invalid repo-urls exist
+   * @type {bool}
+   */
+  invalidUrlExist: Em.computed.someBy('allRepositories', 'validation', 
App.Repository.validation['INVALID']),
+  /**
+   * If all repo links are unchecked
+   * @type {bool}
    */
-  clearGroupLocalRepository: function (event) {
-    if (!event.context.get('isSelected')) {
-      return;
+  isNoOsChecked: Em.computed.everyBy('operatingSystems', 'isSelected', false),
+
+  popoverView: Em.View.extend({
+    tagName: 'i',
+    classNameBindings: ['repository.validation'],
+    attributeBindings: ['repository.errorTitle:title', 
'repository.errorContent:data-content'],
+    didInsertElement: function () {
+      App.popover($(this.get('element')), {'trigger': 'hover'});
     }
-    event.context.setProperties({
-      baseUrl: '',
-      validation: App.Repository.validation['PENDING']
-    });
-  },
+  }),
 
   /**
    * Handler when editing any repo BaseUrl
@@ -231,3 +433,27 @@ App.WizardStep1View = Em.View.extend({
   }.observes('[email protected]')
 
 });
+
+
+App.VersionDefinitionFileUploader = Em.View.extend({
+  template: Em.Handlebars.compile('<input type="file" {{bindAttr 
disabled="view.disabled"}} />'),
+
+  classNames: ['vdf-input-indentation'],
+
+  change: function (e) {
+    var self = this;
+    if (e.target.files && e.target.files.length == 1) {
+      var file = e.target.files[0];
+      var reader = new FileReader();
+
+      reader.onload = (function () {
+        return function (e) {
+          ////$('#sshKey').html(e.target.result);
+          self.get("controller").setVDFFile(e.target.result);
+        };
+      })(file);
+      reader.readAsText(file);
+    }
+  }
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/test/controllers/installer_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/installer_test.js 
b/ambari-web/test/controllers/installer_test.js
index 353129b..85f5613 100644
--- a/ambari-web/test/controllers/installer_test.js
+++ b/ambari-web/test/controllers/installer_test.js
@@ -41,7 +41,7 @@ describe('App.InstallerController', function () {
     });
   });
 
-  describe('#loadStacksVersionsSuccessCallback', function() {
+  describe('#loadStacksVersionsDefinitionsSuccessCallback', function() {
     beforeEach(function () {
       sinon.stub(App.store, 'commit', Em.K);
     });
@@ -50,10 +50,6 @@ describe('App.InstallerController', function () {
     });
     it ('Correct data', function() {
       installerController.set('loadStacksRequestsCounter', 1);
-      
installerController.loadStacksVersionsSuccessCallback(require('test/stack'));
-      expect(installerController.get('content.stacks.length')).to.equal(2);
-      
expect(installerController.get('content.stacks').everyProperty('isSelected')).to.be.false;
-      
expect(installerController.get('content.stacks').mapProperty('id')).to.eql(['HDP-2.1','HDP-1.3']);
     });
   });
 
@@ -92,6 +88,7 @@ describe('App.InstallerController', function () {
         isSelected: true,
         reload: false,
         id: 'nn-cc',
+        stackNameVersion: 'nn-cc',
         repositories: Em.A([
           Em.Object.create({
             isSelected: true
@@ -127,6 +124,7 @@ describe('App.InstallerController', function () {
           "isSelected": true,
           "reload": true,
           "id": "nn-cc",
+          "stackNameVersion": 'nn-cc',
           "repositories": [
             {
               "isSelected": true
@@ -323,25 +321,6 @@ describe('App.InstallerController', function () {
     });
   });
 
-  describe('#loadStacks', function() {
-    it ('Should resolve promise with true', function() {
-      installerController.set('content.stacks', Em.Object.create({
-        length: 2
-      }));
-      var res = installerController.loadStacks();
-      res.then(function(data){
-        expect(data).to.be.true;
-      });
-    });
-    it ('Should resolve promise with false', function() {
-      installerController.set('content.stacks', null);
-      var res = installerController.loadStacks();
-      res.then(function(data){
-        expect(data).to.be.false;
-      });
-    });
-  });
-
   describe('#setLowerStepsDisable', function() {
 
     beforeEach(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/test/mappers/stack_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/stack_mapper_test.js 
b/ambari-web/test/mappers/stack_mapper_test.js
index 0bc0f3c..d5b7a19 100644
--- a/ambari-web/test/mappers/stack_mapper_test.js
+++ b/ambari-web/test/mappers/stack_mapper_test.js
@@ -22,256 +22,583 @@ require('mappers/stack_mapper');
 require('models/stack');
 require('models/operating_system');
 require('models/repository');
+require('models/stack_version/service_simple');
 
 describe('App.stackMapper', function () {
        describe("#map", function() {
-    
     var testData = {
-        items: [{
-          "Versions" : {
-            "active" : true,
-            "min_upgrade_version" : null,
-            "parent_stack_version" : "1.3.3",
-            "stack_name" : "HDP",
-            "stack_version" : "1.3"
+      "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"
           },
-          "operating_systems" : [
+          "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"
+              ]
+            },
             {
-              "OperatingSystems" : {
-                "os_type" : "redhat5",
-                "stack_name" : "HDP",
-                "stack_version" : "1.3"
+              "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"
+                }
               },
-              "repositories" : [
-                {
-                   "Repositories" : {
-                    "base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/1.x/updates/1.3.7.0";,
-                    "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/1.x/updates/1.3.7.0";,
-                    "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/1.x/updates/1.3.8.0";,
-                    "mirrors_list" : null,
-                    "os_type" : "redhat5",
-                    "repo_id" : "HDP-1.3",
-                    "repo_name" : "HDP",
-                    "stack_name" : "HDP",
-                    "stack_version" : "1.3"
-                  }
-                },{
-                  "Repositories" : {
-                    "base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos5";,
-                    "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos5";,
-                    "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos5";,
-                    "mirrors_list" : null,
-                    "os_type" : "redhat5",
-                    "repo_id" : "HDP-UTILS-1.1.0.16",
-                    "repo_name" : "HDP-UTILS",
-                    "stack_name" : "HDP",
-                    "stack_version" : "1.3"
-                  }
-                }]
-            },{
-              "OperatingSystems" : {
-                "os_type" : "redhat6",
-                "stack_name" : "HDP",
-                "stack_version" : "1.3"
-              }, "repositories" : [
-                  {
-                    "Repositories" : {
-                      "base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/1.x/updates/1.3.7.0";,
-                      "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/1.x/updates/1.3.7.0";,
-                      "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/1.x/updates/1.3.8.0";,
-                      "mirrors_list" : null,
-                      "os_type" : "redhat6",
-                      "repo_id" : "HDP-1.3",
-                      "repo_name" : "HDP",
-                      "stack_name" : "HDP",
-                      "stack_version" : "1.3"
-                    }
-                  },
-                  {
-                    "Repositories" : {
-                      "base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos6";,
-                      "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos6";,
-                      "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.16/repos/centos6";,
-                      "mirrors_list" : null,
-                      "os_type" : "redhat6",
-                      "repo_id" : "HDP-UTILS-1.1.0.16",
-                      "repo_name" : "HDP-UTILS",
-                      "stack_name" : "HDP",
-                      "stack_version" : "1.3"
-                    }
-                  }
-                ]
-            }]
-      },{
-        "Versions" : {
-          "active" : false,
-          "min_upgrade_version" : null,
-          "parent_stack_version" : null,
+              {
+                "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.0.6"
+          "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" : "redhat5",
+              "os_type" : "debian7",
+              "repository_version_id" : 1,
               "stack_name" : "HDP",
-              "stack_version" : "2.0.6"
+              "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://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "mirrors_list" : null,
-                  "os_type" : "redhat5",
-                  "repo_id" : "HDP-2.0.6",
+                  "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.0.6"
+                  "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://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "mirrors_list" : null,
-                  "os_type" : "redhat5",
-                  "repo_id" : "HDP-UTILS-1.1.0.17",
+                  "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.0.6"
+                  "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.0.6"
+              "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://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "mirrors_list" : null,
+                  "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.0.6",
+                  "repo_id" : "HDP-2.3",
                   "repo_name" : "HDP",
+                  "repository_version_id" : 1,
                   "stack_name" : "HDP",
-                  "stack_version" : "2.0.6"
+                  "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://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "mirrors_list" : null,
+                  "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.17",
+                  "repo_id" : "HDP-UTILS-1.1.0.20",
                   "repo_name" : "HDP-UTILS",
+                  "repository_version_id" : 1,
                   "stack_name" : "HDP",
-                  "stack_version" : "2.0.6"
+                  "stack_version" : "2.3"
                 }
-              }]
-          }]
-      },{
-        "Versions" : {
-          "active" : true,
-          "min_upgrade_version" : null,
-          "parent_stack_version" : null,
+              }
+            ]
+          }
+        ]
+      },
+
+      {
+        "VersionDefinition" : {
+          "id" : 5,
           "stack_name" : "HDP",
-          "stack_version" : "2.1"
+          "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" : "redhat5",
+              "os_type" : "debian7",
+              "repository_version_id" : 1,
               "stack_name" : "HDP",
-              "stack_version" : "2.1"
+              "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://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos5/2.x/updates/2.0.6.1";,
-                  "mirrors_list" : null,
-                  "os_type" : "redhat5",
-                  "repo_id" : "HDP-2.1",
+                  "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.1"
+                  "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://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos5";,
-                  "mirrors_list" : null,
-                  "os_type" : "redhat5",
-                  "repo_id" : "HDP-UTILS-1.1.0.17",
+                  "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.1"
+                  "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.1"
+              "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://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.1";,
-                  "mirrors_list" : null,
+                  "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.1",
+                  "repo_id" : "HDP-2.3",
                   "repo_name" : "HDP",
+                  "repository_version_id" : 1,
                   "stack_name" : "HDP",
-                  "stack_version" : "2.1"
+                  "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://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "default_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "latest_base_url" : 
"http://public-repo-1.hortonworks.com/HDP-UTILS-1.1.0.17/repos/centos6";,
-                  "mirrors_list" : null,
+                  "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.17",
+                  "repo_id" : "HDP-UTILS-1.1.0.20",
                   "repo_name" : "HDP-UTILS",
+                  "repository_version_id" : 1,
                   "stack_name" : "HDP",
-                  "stack_version" : "2.1"
+                  "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"
+                }
+              }
+            ]
+          }
+        ]
+      }
+    ]
+    };
     beforeEach(function () {
       App.resetDsStoreTypeMap(App.Repository);
       App.resetDsStoreTypeMap(App.OperatingSystem);
       App.resetDsStoreTypeMap(App.Stack);
+      App.resetDsStoreTypeMap(App.ServiceSimple);
       sinon.stub(App.store, 'commit', Em.K);
-      App.stackMapper.map(testData);
+      App.stackMapper.map(testData.items, "VersionDefinition");
     });
     afterEach(function(){
       App.store.commit.restore();
     });
 
-    it ('should map active Stack data', function() {
-      expect(App.Stack.find().get('length')).to.equal(2);
+    it ('should map all Stack data', function() {
+      expect(App.Stack.find().get('length')).to.equal(4);
     });
 
-    it ('all stacks are active', function() {
-      expect(App.Stack.find().everyProperty('active')).to.equal(true);
+    it ('all stacks are showAvailable', function() {
+      expect(App.Stack.find().everyProperty('showAvailable')).to.equal(true);
     });
 
     it ('no one stack is selected', function() {
@@ -279,23 +606,34 @@ describe('App.stackMapper', function () {
     });
 
     it ('stack ids are valid', function() {
-      expect(App.Stack.find().mapProperty('id')).to.eql(['HDP-2.1','HDP-1.3']);
+      expect(App.Stack.find().mapProperty('id')).to.eql(
+        ['HDP-2.4.0.0-169','HDP-2.3.6.0-3646', 'HDP-2.3.4.0-3397', 
'HDP-2.3.4.0-3396']);
     });
 
-    it ('4 OSes are mapped', function() {
-      expect(App.OperatingSystem.find().get('length')).to.equal(4);
+    it ('7 OSes are mapped', function() {
+      expect(App.OperatingSystem.find().get('length')).to.equal(7);
     });
 
     it ('OSes have valid ids', function() {
-      
expect(App.OperatingSystem.find().mapProperty('id')).to.eql(['HDP-2.1-redhat5', 
'HDP-2.1-redhat6', 'HDP-1.3-redhat5', 'HDP-1.3-redhat6']);
+      expect(App.OperatingSystem.find().mapProperty('id')).to.eql(
+        ['HDP-2.4.0.0-169-debian7', 'HDP-2.3.6.0-3646-debian7', 
'HDP-2.3.6.0-3646-redhat6', 'HDP-2.3.4.0-3397-debian7',
+        'HDP-2.3.4.0-3397-redhat6', 'HDP-2.3.4.0-3396-debian7', 
'HDP-2.3.4.0-3396-redhat6']);
     });
-    
-    it ('8 repositories are mapped', function() {
-      expect(App.Repository.find().get('length')).to.equal(8);
+
+    it ('14 repositories are mapped', function() {
+      expect(App.Repository.find().get('length')).to.equal(14);
     });
 
     it ('Repositories ids are valid', function() {
-      
expect(App.Repository.find().mapProperty('id')).to.eql(["HDP-2.1-redhat5-HDP-2.1",
 "HDP-2.1-redhat5-HDP-UTILS-1.1.0.17", "HDP-2.1-redhat6-HDP-2.1", 
"HDP-2.1-redhat6-HDP-UTILS-1.1.0.17", "HDP-1.3-redhat5-HDP-1.3", 
"HDP-1.3-redhat5-HDP-UTILS-1.1.0.16", "HDP-1.3-redhat6-HDP-1.3", 
"HDP-1.3-redhat6-HDP-UTILS-1.1.0.16"]);
+      expect(App.Repository.find().mapProperty('id')).to.eql(
+        ['HDP-2.4.0.0-169-debian7-HDP-2.4', 
'HDP-2.4.0.0-169-debian7-HDP-UTILS-1.1.0.20',
+          'HDP-2.3.6.0-3646-debian7-HDP-2.3', 
'HDP-2.3.6.0-3646-debian7-HDP-UTILS-1.1.0.20',
+          
'HDP-2.3.6.0-3646-redhat6-HDP-2.3','HDP-2.3.6.0-3646-redhat6-HDP-UTILS-1.1.0.20',
+          
'HDP-2.3.4.0-3397-debian7-HDP-2.3','HDP-2.3.4.0-3397-debian7-HDP-UTILS-1.1.0.20',
+          'HDP-2.3.4.0-3397-redhat6-HDP-2.3', 
'HDP-2.3.4.0-3397-redhat6-HDP-UTILS-1.1.0.20',
+          'HDP-2.3.4.0-3396-debian7-HDP-2.3', 
'HDP-2.3.4.0-3396-debian7-HDP-UTILS-1.1.0.20',
+          'HDP-2.3.4.0-3396-redhat6-HDP-2.3', 
'HDP-2.3.4.0-3396-redhat6-HDP-UTILS-1.1.0.20'
+        ]);
     });
   });
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/test/views/main/admin/stack_upgrade/services_view_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/views/main/admin/stack_upgrade/services_view_test.js 
b/ambari-web/test/views/main/admin/stack_upgrade/services_view_test.js
index 9a42c42..70d182c 100644
--- a/ambari-web/test/views/main/admin/stack_upgrade/services_view_test.js
+++ b/ambari-web/test/views/main/admin/stack_upgrade/services_view_test.js
@@ -1,4 +1,4 @@
-/**
+ /**
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -23,29 +23,6 @@ require('views/main/admin/stack_upgrade/services_view');
 describe('App.MainAdminStackServicesView', function () {
   var view = App.MainAdminStackServicesView.create();
 
-  describe("#services", function () {
-    before(function () {
-      sinon.stub(App.StackService, 'find').returns([
-        Em.Object.create({serviceName: 'S1', isInstalled: false}),
-        Em.Object.create({serviceName: 'S2', isInstalled: false})
-      ]);
-      sinon.stub(App.Service, 'find').returns([
-        Em.Object.create({serviceName: 'S1'})
-      ]);
-    });
-    after(function () {
-      App.StackService.find.restore();
-      App.Service.find.restore();
-    });
-    it("`isInstalled`-flag depends on App.Service", function () {
-      view.propertyDidChange('services');
-      expect(view.get('services')).to.eql([
-        Em.Object.create({serviceName: 'S1', isInstalled: true}),
-        Em.Object.create({serviceName: 'S2', isInstalled: false})
-      ]);
-    });
-  });
-
   describe("#goToAddService()" , function() {
     var mock = Em.Object.create({
         checkAndStartKerberosWizard: Em.K,

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/test/views/wizard/step1_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/wizard/step1_view_test.js 
b/ambari-web/test/views/wizard/step1_view_test.js
index 0dacad8..2665c21 100644
--- a/ambari-web/test/views/wizard/step1_view_test.js
+++ b/ambari-web/test/views/wizard/step1_view_test.js
@@ -28,20 +28,18 @@ function getView() {
 
 describe('App.WizardStep1View', function () {
 
-  App.TestAliases.testAsComputedAnd(getView(), 'showErrorsWarningCount', 
['isSubmitDisabled', 'totalErrorCnt']);
-
   describe('#operatingSystems', function () {
     beforeEach(function () {
       sinon.stub(App.Stack, 'find', function () {
         return [
           Ember.Object.create({
-            id: 'HDP-1.3',
+            id: 'HDP-1.3-1234',
             stackName: 'HDP',
             stackVersion: '1.3',
             active: true,
             operatingSystems: [
               Ember.Object.create({
-                id: 'HDP-1.3-redhat5',
+                id: 'HDP-1.3-1234-redhat5',
                 osType: 'redhat5',
                 isSelected: false,
                 repositories: [
@@ -56,7 +54,7 @@ describe('App.WizardStep1View', function () {
                 ]
               }),
               Ember.Object.create({
-                id: 'HDP-1.3-redhat6',
+                id: 'HDP-1.3-1234-redhat6',
                 osType: 'redhat6',
                 isSelected: false,
                 repositories: [
@@ -154,25 +152,9 @@ describe('App.WizardStep1View', function () {
       App.Stack.find.restore();
     });
 
-    it('should create empty array if there is no stacks', function () {
-      controller = App.WizardStep1Controller.create({
-        content: {
-          stacks: []
-        },
-        selectedStack: []
-      });
-      view = App.WizardStep1View.create();
-      view.reopen({
-        controller: controller
-      });
-      expect(view.get('allRepositories.length')).to.equal(0);
-      expect(view.get('operatingSystems.length')).to.equal(0);
-    });
-
     describe('should create repo groups from repo list', function () {
 
       var repositories;
-
       beforeEach(function () {
         controller = App.WizardStep1Controller.create({
           content: {
@@ -184,7 +166,6 @@ describe('App.WizardStep1View', function () {
         view.set('$', function () {
           return Em.Object.create({hide: Em.K, toggle: Em.K});
         });
-
         repositories = view.get('allRepositories');
       });
 
@@ -242,28 +223,15 @@ describe('App.WizardStep1View', function () {
 
   App.TestAliases.testAsComputedEveryBy(getView(), 'isNoOsChecked', 
'operatingSystems', 'isSelected', false);
 
-  App.TestAliases.testAsComputedOr(getView(), 'isSubmitDisabled', 
['invalidFormatUrlExist', 'isNoOsChecked', 'invalidUrlExist', 
'controller.content.isCheckInProgress']);
-
-  describe('#stacks', function () {
+  App.TestAliases.testAsComputedOr(getView(), 'isSubmitDisabled', 
['controller.content.isCheckInProgress']);
 
+  describe('#stackNames', function () {
     var tests = Em.A([
       {
-        m: 'Stack with 2 HDP',
-        stacks: [
-          Em.Object.create({isSelected: true, id: 'HDP-2.0.1'}),
-          Em.Object.create({isSelected: false, id: 'HDP-1.3.3'})
-        ],
-        e: {
-          names: ['HDP 2.0.1', 'HDP 1.3.3'],
-          selected: [true, false]
-        }
-      },
-      {
         m: 'No HDP',
         stacks: [],
         e: {
-          names: [],
-          selected: []
+          names: []
         }
       }
     ]);
@@ -271,9 +239,8 @@ describe('App.WizardStep1View', function () {
     tests.forEach(function (test) {
       it(test.m, function () {
         view.set('controller.content.stacks', test.stacks);
-        var stacks = view.get('stacks');
+        var stacks = view.get('stackNames');
         expect(stacks.mapProperty('name')).to.eql(test.e.names);
-        expect(stacks.mapProperty('isSelected')).to.eql(test.e.selected);
       });
     });
 
@@ -283,255 +250,6 @@ describe('App.WizardStep1View', function () {
 
   App.TestAliases.testAsComputedSomeBy(getView(), 'invalidFormatUrlExist', 
'allRepositories', 'invalidFormatError', true);
 
-  describe('#totalErrorCnt', function () {
-    var tests = Em.A([
-      {
-        allRepositories: [
-          {}
-        ],
-        m: 'isNoOsChecked',
-        isNoOsChecked: true,
-        e: 1
-      },
-      {
-        allRepositories: [
-          {'invalidFormatError': true},
-          {'invalidFormatError': true}
-        ],
-        isNoOsChecked: false,
-        m: 'two with empty-error',
-        e: 2
-      },
-      {
-        allRepositories: [
-          {'validation': 'icon-exclamation-sign'},
-          {'validation': 'icon-exclamation-sign'}
-        ],
-        isNoOsChecked: false,
-        m: 'two with validation="icon-exclamation-sign"',
-        e: 2
-      },
-      {
-        allRepositories: [
-          {'invalidFormatError': true, 'validation': 'icon-exclamation-sign'},
-          {'invalidFormatError': true, 'validation': 'icon-exclamation-sign'}
-        ],
-        isNoOsChecked: false,
-        m: 'two with empty-error, two with validation="icon-exclamation-sign"',
-        e: 4
-      },
-      {
-        allRepositories: [
-          {}
-        ],
-        isNoOsChecked: false,
-        m: 'no errors/warnings etc',
-        e: 0
-      }
-    ]);
-    tests.forEach(function (test) {
-      it(test.m, function () {
-        view = App.WizardStep1View.create();
-        view.reopen({
-          isNoOsChecked: test.isNoOsChecked,
-          allRepositories: test.allRepositories
-        });
-        expect(view.get('totalErrorCnt')).to.equal(test.e);
-      });
-    });
-  });
-
-  describe('#didInsertElement', function () {
-
-    beforeEach(function () {
-      sinon.stub($.fn, 'tooltip', Em.K);
-    });
-
-    afterEach(function () {
-      $.fn.tooltip.restore();
-    });
-
-    it('should create tooltip', function () {
-      view.set('isRLCollapsed', false);
-      view.didInsertElement();
-      expect($.fn.tooltip.calledOnce).to.equal(true);
-    });
-  });
-
-  describe('#stackRadioButton', function () {
-
-    var v;
-    beforeEach(function () {
-      v = view.get('stackRadioButton').create({
-        content: Em.Object.create({
-          name: ''
-        }),
-        controller: Em.Object.create({
-          content: Em.Object.create({
-            stacks: []
-          })
-        })
-      });
-    });
-
-    describe('#isSelected', function () {
-      it('should be equal content.isSelected', function () {
-        v.set('content.isSelected', true);
-        expect(v.get('checked')).to.equal(true);
-        v.set('content.isSelected', false);
-        expect(v.get('checked')).to.equal(false);
-      });
-    });
-
-    describe('#click', function () {
-      it('should select proper stack', function () {
-        v.set('controller.content.stacks', Em.A([Em.Object.create({id: 
'n-1'}), Em.Object.create({id: 'n-2'}), Em.Object.create({id: 'n-3'})]));
-        v.set('content.name', 'n 2');
-        v.click();
-        
expect(v.get('controller.content.stacks').getEach('isSelected')).to.eql([false, 
true, false]);
-      });
-    });
-
-  });
-
-  describe('#popoverView', function () {
-
-    var v;
-    beforeEach(function () {
-      v = view.get('popoverView').create();
-      sinon.stub(App, 'popover', Em.K);
-      view = App.WizardStep1View.create({'controller': controller});
-      view.set('$', function () {
-        return Em.Object.create({hide: Em.K, toggle: Em.K});
-      });
-    });
-
-    afterEach(function () {
-      App.popover.restore();
-    });
-
-    describe('#didInsertElement', function () {
-      it('should create popover', function () {
-        v.didInsertElement();
-        expect(App.popover.calledOnce).to.equal(true);
-      });
-    });
-
-  });
-
-  describe('#onToggleBlock', function () {
-
-    it('should toggle isRLCollapsed', function () {
-      view.set('isRLCollapsed', true);
-      view.onToggleBlock();
-      expect(view.get('isRLCollapsed')).to.equal(false);
-      view.onToggleBlock();
-      expect(view.get('isRLCollapsed')).to.equal(true);
-    });
-  });
-
-  describe('#updateByCheckbox', function () {
-
-    var operatingSystems = [
-      Em.Object.create({
-        name: 'redhat5',
-        isSelected: false,
-        repositories: [Em.Object.create({
-          id: 'id',
-          osType: 'redhat5',
-          baseUrl: 'baseUrl',
-          latestBaseUrl: 'latestBaseUrl',
-          validation: '',
-          isSelected: false
-        })
-        ]
-      })
-    ];
-
-    var ctrl = {
-      content: {
-        stacks: [
-          Em.Object.create({
-            isSelected: true,
-            operatingSystems: [
-              Em.Object.create({
-                id: 'id',
-                osType: 'redhat5',
-                baseUrl: 'baseUrl',
-                latestBaseUrl: 'latestBaseUrl',
-                validation: '',
-                isSelected: false
-              })
-            ]
-          })
-        ]
-      },
-      selectedStack: Em.Object.create({
-        isSelected: true,
-        operatingSystems: [
-          Em.Object.create({
-            id: 'id',
-            osType: 'redhat5',
-            baseUrl: 'baseUrl',
-            latestBaseUrl: 'latestBaseUrl',
-            validation: '',
-            isSelected: true
-          })
-        ]
-      }),
-      skipValidationChecked: true
-    };
-
-    it('target group isn\'t isSelected', function () {
-      view.reopen({
-        operatingSystems: operatingSystems,
-        controller: ctrl
-      });
-      view.updateByCheckbox();
-      var targetGroup = 
view.get('operatingSystems.firstObject.repositories.firstObject');
-      expect(targetGroup.get('baseUrl')).to.equal('latestBaseUrl');
-      expect(targetGroup.get('latestBaseUrl')).to.equal('latestBaseUrl');
-      expect(targetGroup.get('validation')).to.be.empty;
-
-    });
-
-    it('target group is isSelected, skipValidationisSelected = true', function 
() {
-      ctrl.content.stacks[0].operatingSystems[0].selected = true;
-      operatingSystems[0].set('isSelected', true);
-      view.reopen({
-        operatingSystems: operatingSystems,
-        controller: ctrl
-      });
-      view.updateByCheckbox();
-      var targetGroup = 
view.get('operatingSystems.firstObject.repositories.firstObject');
-      expect(targetGroup.get('validation')).to.be.empty;
-    });
-  });
-
-  describe('#clearGroupLocalRepository', function () {
-    var context = {'group-number': 0, id: 'HDP-redhat5', repoId: 
'HDP-redhat5', baseUrl: 'baseUrl', validation: 'validation'};
-    it('should empty base url and validation', function () {
-      var event = {context: Em.Object.create(context, {isSelected: true})};
-      view.clearGroupLocalRepository(event);
-      expect(event.context.get('baseUrl')).to.be.empty;
-      expect(event.context.get('validation')).to.be.empty;
-    });
-    it('should do nothing if corresponding OS is not selected', function () {
-      var event = {context: Em.Object.create(context, {isSelected: false})};
-      view.clearGroupLocalRepository(event);
-      expect(event.context.get('baseUrl')).to.equal('baseUrl');
-      expect(event.context.get('validation')).to.equal('validation');
-    });
-  });
-
-  describe('#undoGroupLocalRepository', function () {
-    it('should reset base url and validation', function () {
-      var event = {context: Em.Object.create({'group-number': 0, id: 
'HDP-redhat5', repoId: 'HDP-redhat5', latestBaseUrl: 'latestBaseUrl', 
validation: 'validation'})};
-      view.undoGroupLocalRepository(event);
-      
expect(event.context.get('baseUrl')).to.equal(event.context.get('latestBaseUrl'));
-      expect(event.context.get('validation')).to.be.empty;
-    });
-  });
 
   describe('#editLocalRepository', function () {
 

Reply via email to