You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2014/11/18 13:20:59 UTC

ambari git commit: AMBARI-8364 Create mocks for installing repo versions per on hosts. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 70c640772 -> 03b45ee1d


AMBARI-8364 Create mocks for installing repo versions per on hosts. (ababiichuk)


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

Branch: refs/heads/trunk
Commit: 03b45ee1dbbadcf1960be3656234f6a1920aa1d6
Parents: 70c6407
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Tue Nov 18 13:56:51 2014 +0200
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Tue Nov 18 14:21:00 2014 +0200

----------------------------------------------------------------------
 .../host_upgrade_tasks.json                     |  52 +++++++++
 .../data/stack_versions/stack_version_all.json  |  18 ++--
 ambari-web/app/assets/test/tests.js             |   1 +
 .../stack_version_details_controller.js         | 107 ++++++++++++++++++-
 .../stack_versions/stack_versions_controller.js |  28 ++---
 ambari-web/app/mappers/stack_version_mapper.js  |  12 ++-
 ambari-web/app/messages.js                      |   2 +
 ambari-web/app/models/stack_version/version.js  |  62 ++++++++++-
 ambari-web/app/styles/application.less          |  19 ++--
 .../stack_versions/stack_version_details.hbs    |  10 +-
 .../admin/stack_versions/stack_versions.hbs     |  18 ++--
 ambari-web/app/utils/ajax/ajax.js               |  16 ++-
 .../stack_version_details_view.js               |  44 ++------
 .../stack_version_details_controller_test.js    |  95 ++++++++++++++++
 .../stack_version/stack_version_details_test.js |  49 +--------
 15 files changed, 404 insertions(+), 129 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/assets/data/background_operations/host_upgrade_tasks.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/background_operations/host_upgrade_tasks.json b/ambari-web/app/assets/data/background_operations/host_upgrade_tasks.json
new file mode 100644
index 0000000..79f1ec3
--- /dev/null
+++ b/ambari-web/app/assets/data/background_operations/host_upgrade_tasks.json
@@ -0,0 +1,52 @@
+{
+  "Requests" : {
+    "aborted_task_count" : 0,
+    "cluster_name" : "tdk",
+    "completed_task_count" : 6,
+    "create_time" : 1414268004421,
+    "end_time" : 1414268130964,
+    "exclusive" : false,
+    "failed_task_count" : 0,
+    "id" : 12,
+    "inputs" : null,
+    "operation_level" : null,
+    "progress_percent" : 100.0,
+    "queued_task_count" : 0,
+    "request_context" : "Upgrade Hosts",
+    "request_schedule" : null,
+    "request_status" : "IN_PROGRESS",
+    "resource_filters" : [ ],
+    "start_time" : 1414268004446,
+    "task_count" : 6,
+    "timed_out_task_count" : 0,
+    "type" : "INTERNAL_REQUEST"
+  },
+  "tasks" : [
+    {
+      "Tasks" : {
+        "command" : "INSTALL REPO",
+        "command_detail" : "DATANODE UPGRADE",
+        "end_time" : 1414268113552,
+        "exit_code" : 0,
+        "host_name" : "dev01.hortonworks.com",
+        "id" : 18,
+        "role" : "DATANODE",
+        "start_time" : 1414268004452,
+        "status" : "COMPLETED"
+      }
+    },
+    {
+      "Tasks" : {
+        "command" : "INSTALL REPO",
+        "command_detail" : "SECONDARY_NAMENODE UPGRADE",
+        "end_time" : 1414268127338,
+        "exit_code" : 0,
+        "host_name" : "dev01.hortonworks.com",
+        "id" : 21,
+        "role" : "SECONDARY_NAMENODE",
+        "start_time" : 1414268004453,
+        "status" : "IN_PROGRESS"
+      }
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/assets/data/stack_versions/stack_version_all.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/stack_versions/stack_version_all.json b/ambari-web/app/assets/data/stack_versions/stack_version_all.json
index 15e1415..59b05f7 100644
--- a/ambari-web/app/assets/data/stack_versions/stack_version_all.json
+++ b/ambari-web/app/assets/data/stack_versions/stack_version_all.json
@@ -3,7 +3,7 @@
     {
       "StackVersion": {
         "name": "HDP 2.2.0.1",
-        "version": "HDP-2.2.2",
+        "version": "2.2.0.1-885",
         "installed_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "current_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "repositories": [
@@ -27,8 +27,8 @@
     },
     {
       "StackVersion": {
-        "name": "HDP 2.2.0.2",
-        "version": "HDP-2.2.3",
+        "name": "HDP 2.2.1.1",
+        "version": "2.2.1.1-885",
         "installed_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "current_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "repositories": [
@@ -52,8 +52,8 @@
     },
     {
       "StackVersion": {
-        "name": "HDP 2.2.0.0",
-        "version": "2.2.0.1",
+        "name": "HDP 2.2.2.0",
+        "version": "2.2.2.1-885",
         "installed_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "current_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com"],
         "repositories": [
@@ -92,10 +92,10 @@
     },
     {
       "StackVersion": {
-        "name": "HDP 2.2.0.1",
-        "version": "2.2.0.2",
-        "installed_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com", "dev03.hortonworks.com"],
-        "current_hosts": ["dev01.hortonworks.com", "dev02.hortonworks.com", "dev03.hortonworks.com"],
+        "name": "HDP 2.3.0.1",
+        "version": "2.3.0.1-885",
+        "installed_hosts": [],
+        "current_hosts": [],
         "repositories": [
           {
             "os": "redhat6",

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index 194a806..485355f 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -50,6 +50,7 @@ var files = ['test/init_model_test',
   'test/controllers/main/alerts/definitions_details_controller_test',
   'test/controllers/main/alerts/alert_instances_controller_test',
   'test/controllers/main/admin/stack_and_upgrade_test',
+  'test/controllers/main/admin/stack_version/stack_version_details_controller_test',
   'test/controllers/main/admin/serviceAccounts_controller_test',
   'test/controllers/main/admin/highAvailability_controller_test',
   'test/controllers/main/admin/highAvailability/progress_controller_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js b/ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js
index 365b171..1f3c90c 100644
--- a/ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js
@@ -27,7 +27,110 @@ App.MainStackVersionsDetailsController = Em.Controller.extend({
     return App.get('allHostNames.length');
   }.property('App.allHostNames.length'),
 
-  //TODO method that will perform stack upgrade on host
-  installStackVersion: Em.K
+  /**
+   * true if install stack version is in progress at least on 1 host
+   * {Boolean}
+   */
+  installInProgress: function() {
+    return this.get('content.upgradingHostStacks.length');
+  }.property('content.upgradingHostStacks.length'),
 
+  /**
+   * true if repo version is installed on all hosts
+   * {Boolean}
+   */
+  allInstalled: function() {
+    return this.get('content.notInstalledHostStacks.length') == 0;
+  }.property('content.notInstalledHostStacks.length'),
+
+  /**
+   * depending on state run or install repo request
+   * or show the installation process popup
+   * @param event
+   * @method installStackVersion
+   */
+  installStackVersion: function(event) {
+    if (this.get('installInProgress')) {
+      this.showProgressPopup();
+    } else if (!this.get('allInstalled')) {
+      this.doInstallStackVersion(event.context);
+    }
+  },
+
+  /**
+   * opens a popup with installations state per host
+   * @method showProgressPopup
+   */
+  showProgressPopup: function() {
+    var popupTitle = Em.I18n.t('admin.stackVersions.datails.install.hosts.popup.title').format(this.get('content.version'));
+    var requestIds = App.get('testMode') ? [1] : App.db.get('stackUpgrade', 'id');
+    var hostProgressPopupController = App.router.get('highAvailabilityProgressPopupController');
+    hostProgressPopupController.initPopup(popupTitle, requestIds, this, true);
+  },
+
+  /**
+   * runs request to install repo version
+   * @param stackVersion
+   * @returns {*|$.ajax}
+   * @method doInstallStackVersion
+   */
+  doInstallStackVersion: function(stackVersion) {
+    var services = App.Service.find();
+    var data = this.generateDataForInstall(stackVersion, services);
+    return App.ajax.send({
+      name: 'admin.stack_version.install.repo_version',
+      data: data,
+      success: 'installStackVersionSuccess'
+    })
+  },
+
+  /**
+   * generates the request data for installing repoversions
+   * @param {Ember.object} stackVersion
+   * @param {Array} services - array of service objects
+   * @returns {JSON}
+   * {
+   *  RequestInfo:
+   *   {
+   *     context: string,
+   *     action: string,
+   *     parameters:
+   *       {
+   *         name: string,
+   *         name_list: string,
+   *         base_url_list: string,
+   *         packages: string
+   *       }
+   *    },
+   *  Requests/resource_filters: [{hosts:string}]
+   * }
+   */
+  generateDataForInstall: function(stackVersion, services) {
+    var hostNames = stackVersion.get('hostStackVersions').mapProperty('host.hostName');
+    var base_urls = stackVersion.get('operatingSystems').map(function(os) {
+      return os.get('repositories').mapProperty('baseurl').join(",");
+    });
+    var serviceNames = services.mapProperty('serviceName');
+    return {
+      "RequestInfo": {
+        "context":"Install Repo Version" + stackVersion.get('version'),
+        "action":"ru_install_repo",
+        "parameters": {
+          "name": stackVersion.get('version'),
+          "name_list": stackVersion.get('name'),
+          "base_url_list": base_urls.join(","),
+          "packages": serviceNames.join(",")
+        }
+      },
+      "Requests/resource_filters": [
+        {
+          "hosts": hostNames.join(",")
+        }
+      ]
+    };
+  },
+
+  installStackVersionSuccess: function(data) {
+    App.db.set('stackUpgrade', 'id', [data.id]);
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js b/ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js
index 8cae2e6..a2dd28f 100644
--- a/ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js
@@ -73,19 +73,21 @@ App.MainStackVersionsController = Em.ArrayController.extend({
     var status = event.currentTarget.title.toCapital();
     var version = event.contexts[0];
     var hosts = event.contexts[1];
-    return App.ModalPopup.show({
-      bodyClass: Ember.View.extend({
-        title: Em.I18n.t('admin.stackVersions.hosts.popup.title').format(version, status, hosts.length),
-        template: Em.Handlebars.compile('<h4>{{view.title}}</h4><span class="limited-height-2">'+ hosts.join('<br/>') + '</span>')
-      }),
-      header: Em.I18n.t('admin.stackVersions.hosts.popup.header').format(status),
-      primary: Em.I18n.t('admin.stackVersions.hosts.popup.primary'),
-      secondary: Em.I18n.t('common.close'),
-      onPrimary: function() {
-        this.hide();
-        self.filterHostsByStack(version, status);
-      }
-    });
+    if (hosts.length) {
+      return App.ModalPopup.show({
+        bodyClass: Ember.View.extend({
+          title: Em.I18n.t('admin.stackVersions.hosts.popup.title').format(version, status, hosts.length),
+          template: Em.Handlebars.compile('<h4>{{view.title}}</h4><span class="limited-height-2">'+ hosts.join('<br/>') + '</span>')
+        }),
+        header: Em.I18n.t('admin.stackVersions.hosts.popup.header').format(status),
+        primary: Em.I18n.t('admin.stackVersions.hosts.popup.primary'),
+        secondary: Em.I18n.t('common.close'),
+        onPrimary: function() {
+          this.hide();
+          self.filterHostsByStack(version, status);
+        }
+      });
+    }
   }
 
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/mappers/stack_version_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_version_mapper.js b/ambari-web/app/mappers/stack_version_mapper.js
index b07865e..b0e34ea 100644
--- a/ambari-web/app/mappers/stack_version_mapper.js
+++ b/ambari-web/app/mappers/stack_version_mapper.js
@@ -31,6 +31,11 @@ App.stackVersionMapper = App.QuickDataMapper.create({
     operating_systems: {
       item: 'id'
     },
+    host_stack_versions_key: 'host_stack_versions',
+    host_stack_versions_type: 'array',
+    host_stack_versions: {
+      item: 'id'
+    },
     installed_hosts: 'installed_hosts',
     current_hosts: 'current_hosts'
   },
@@ -67,6 +72,7 @@ App.stackVersionMapper = App.QuickDataMapper.create({
         var stack = item.StackVersion;
         stack.id = item.StackVersion.name + item.StackVersion.version;
         var osArray = [];
+        var hostStackVersions = [];
 
         if (Em.get(item, 'StackVersion.repositories')) {
           item.StackVersion.repositories.forEach(function (os) {
@@ -88,7 +94,11 @@ App.stackVersionMapper = App.QuickDataMapper.create({
             osArray.pushObject(os);
           }, this);
         }
-
+        //TODO change loading form current api
+        App.HostStackVersion.find().filterProperty('version', item.StackVersion.version).forEach(function(hv) {
+          hostStackVersions.push({id: hv.get('id')});
+        });
+        stack.host_stack_versions = hostStackVersions;
         stack.operating_systems = osArray;
         resultStack.push(this.parseIt(stack, this.get('modelStack')));
       }, this);

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 0a849e6..ea16bef 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1197,6 +1197,8 @@ Em.I18n.translations = {
   'admin.stackVersions.datails.hosts.btn.installing': "Installing...",
   'admin.stackVersions.datails.hosts.btn.nothing': "Nothing to Install",
   'admin.stackVersions.datails.hosts.btn.na': "Status not available",
+  'admin.stackVersions.datails.install.hosts.popup.title': "Install {0} version",
+
   'admin.stackVersions.hosts.popup.header': "Version Status: {0}",
   'admin.stackVersions.hosts.popup.title': "{0} Version is {1} on {2} hosts:",
   'admin.stackVersions.hosts.popup.primary': "Go to Hosts",

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/models/stack_version/version.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_version/version.js b/ambari-web/app/models/stack_version/version.js
index fb0d4f7..c602fcb 100644
--- a/ambari-web/app/models/stack_version/version.js
+++ b/ambari-web/app/models/stack_version/version.js
@@ -24,7 +24,67 @@ App.StackVersion = DS.Model.extend({
   version: DS.attr('string'),
   installedHosts: DS.attr('array'),
   currentHosts: DS.attr('array'),
-  operatingSystems: DS.hasMany('App.OS')
+  operatingSystems: DS.hasMany('App.OS'),
+  hostStackVersions: DS.hasMany('App.HostStackVersion'),
+
+  setStatusHosts: function(){
+    Em.run.once(this, 'updateStatus');
+  }.observes('hostStackVersions.@each.status'),
+
+  updateStatus: function() {
+    var current = [];
+    var installed = [];
+    var upgradeFailed = [];
+    var upgrading = [];
+    var init = [];
+    var notInstalled = [];
+    this.get('hostStackVersions').forEach(function(hv) {
+      switch(hv.get('status')) {
+        case 'CURRENT':
+          current.push(hv);
+        case 'INSTALLED':
+          installed.push(hv);
+          break;
+        case 'INIT':
+          init.push(hv);
+          notInstalled.push(hv);
+          break;
+        case 'UPGRADE_FAILED':
+          upgradeFailed.push(hv);
+          notInstalled.push(hv);
+          break;
+        case 'UPGRADING':
+          upgrading.push(hv);
+          break;
+      }
+    });
+    this.set('currentHostStacks', current);
+    this.set('installedHostStacks', installed);
+    this.set('notInstalledHostStacks', notInstalled);
+    this.set('upgradeFailedHostStacks', upgradeFailed);
+    this.set('initHostStacks', init);
+    this.set('upgradingHostStacks', upgrading);
+  },
+
+  currentHostStacks: [],
+
+  installedHostStacks: [],
+
+  upgradeFailedHostStacks: [],
+
+  upgradingHostStacks: [],
+
+  initHostStacks: [],
+
+  notInstalledHostStacks: [],
+
+  noInstalledHosts:  function() {
+    return this.get('installedHosts.length') == 0;
+  }.property('installedHosts.length'),
+
+  noCurrentHosts: function() {
+    return this.get('currentHosts.length') == 0;
+  }.property('currentHosts.length')
 });
 
 App.StackVersion.FIXTURES = [];

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 8f27d1b..d223fa4 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -939,15 +939,6 @@ h1 {
       i {
         font-size: 20px;
       }
-      .not-active-link{
-        color: #999;
-        a{
-          text-decoration: none;
-          pointer-events: none;
-          color: #999;
-          cursor: default;
-        }
-      }
       .active-link{
         a{
           pointer-events: auto;
@@ -4993,6 +4984,16 @@ ul.inline li {
   }
 }
 
+.not-active-link{
+  color: #999;
+  a{
+    text-decoration: none;
+    pointer-events: none;
+    color: #999;
+    cursor: default;
+  }
+}
+
 #stack_versions {
   .table {
     thead {

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs b/ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs
index 065bea3..10e3080 100644
--- a/ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs
+++ b/ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs
@@ -44,15 +44,15 @@
         <div class="span8">
           <div class="row-fluid">
             <div class="span3">{{t admin.stackVersions.datails.installed.on}}</div>
-            <div class="span6">
-              <a href="#" title='installed' {{action showHosts controller.content.version controller.content.currentHosts target="App.router.mainStackVersionsController"}}>
+            <div class="span6" {{bindAttr class="controller.content.noInstalledHosts:not-active-link"}}>
+              <a href="#" title='installed' {{action showHosts controller.content.version controller.content.installedHosts target="App.router.mainStackVersionsController"}}>
                 <span>{{content.installedHosts.length}}/{{totalHostCount}}</span>
               </a>
             </div>
           </div>
           <div class="row-fluid">
             <div class="span3">{{t admin.stackVersions.datails.current.on}}</div>
-            <div class="span6">
+            <div class="span6" {{bindAttr class="controller.content.noCurrentHosts:not-active-link"}}>
               <a href="#" title='current' {{action showHosts controller.content.version controller.content.currentHosts target="App.router.mainStackVersionsController"}}>
                 <span>{{content.currentHosts.length}}/{{totalHostCount}}</span>
               </a>
@@ -60,8 +60,8 @@
           </div>
         </div>
         <div class="span4">
-          <a {{bindAttr class="view.statusClass :btn :stack-status-button"}} {{action installStackVersion target="controller"}}>
-            <i {{bindAttr class="view.installInProgress:icon-cog"}}>&nbsp;</i>{{view.stackTextStatus}}
+          <a {{bindAttr class="view.statusClass :btn :stack-status-button"}} {{action installStackVersion content target="controller"}}>
+            <i {{bindAttr class="installInProgress:icon-cog"}}>&nbsp;</i>{{view.stackTextStatus}}
           </a>
         </div>
       </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/templates/main/admin/stack_versions/stack_versions.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_versions/stack_versions.hbs b/ambari-web/app/templates/main/admin/stack_versions/stack_versions.hbs
index 017b0f7..4b282d1 100644
--- a/ambari-web/app/templates/main/admin/stack_versions/stack_versions.hbs
+++ b/ambari-web/app/templates/main/admin/stack_versions/stack_versions.hbs
@@ -56,14 +56,20 @@
               </div>
             </td>
             <td>
-              <a href="#" title='installed' {{action showHosts view.content.version view.content.installedHosts target="controller"}}>
-                <span>{{view.content.installedHosts.length}}</span>
-              </a>
+              <span  {{bindAttr class="view.content.noInstalledHosts:not-active-link"}}>
+                <a href="#"
+                  title='installed' {{action showHosts view.content.version view.content.installedHosts target="controller"}}>
+                  <span>{{view.content.installedHosts.length}}</span>
+                </a>
+              </span>
             </td>
             <td>
-              <a href="#" title='current' {{action showHosts view.content.version view.content.currentHosts target="controller"}}>
-                <span>{{view.content.currentHosts.length}}</span>
-              </a>
+              <span {{bindAttr class="view.content.noCurrentHosts:not-active-link"}}>
+                <a href="#"
+                  title='current' {{action showHosts view.content.version view.content.currentHosts target="controller"}}>
+                  <span>{{view.content.currentHosts.length}}</span>
+                </a>
+              </span>
             </td>
           {{/view}}
         {{/each}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/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 4c577b1..1db65cd 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1083,7 +1083,7 @@ var urls = {
   },
   'admin.high_availability.polling': {
     'real': '/clusters/{clusterName}/requests/{requestId}?fields=tasks/*,Requests/*',
-    'mock': ''
+    'mock': '/data/background_operations/host_upgrade_tasks.json'
   },
   'admin.high_availability.getNnCheckPointStatus': {
     'real': '/clusters/{clusterName}/hosts/{hostName}/host_components/NAMENODE',
@@ -1244,6 +1244,20 @@ var urls = {
     'real': '/clusters/{clusterName}/stack_versions',
     'mock': '/data/stack_versions/stack_version_all.json'
   },
+  'admin.stack_version.install.repo_version': {
+    'type': 'POST',
+    'real': 'clusters/{clusterName}/requests',
+    'format': function(data) {
+      return {
+        type: 'POST',
+        dataType: 'text',
+        data: data.data
+      }
+    },
+    'mock': ''
+  },
+
+
   'wizard.advanced_repositories.valid_url': {
     'real': '/stacks/{stackName}/versions/{stackVersion}/operating_systems/{osType}/repositories/{repoId}',
     'mock': '',

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js b/ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js
index 9889fc8..b8eae2b 100644
--- a/ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js
+++ b/ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js
@@ -21,45 +21,20 @@ var App = require('app');
 App.MainStackVersionsDetailsView = Em.View.extend({
 
   templateName: require('templates/main/admin/stack_versions/stack_version_details'),
-  /**
-   * list of hostsStackVersions objects for current config version
-   * {Array}
-   */
-  hostStackVersions: function() {
-    return App.HostStackVersion.find().filterProperty('version', this.get('controller.content.version'));
-  }.property('controller.content.version'),
-
-  /**
-   * list of hosts on which this stack version is not installed
-   * {Array}
-   */
-  notInstalledHosts: function() {
-    return this.get('hostStackVersions').filterProperty('installEnabled');
-  }.property('hostStackVersions'),
-
-  /**
-   * true if install stack version is in progress at least on 1 host
-   * {Boolean}
-   */
-  installInProgress: function() {
-    return this.get('hostStackVersions').someProperty('status', 'INSTALLING');
-  }.property('hostStackVersions'),
 
   /**
    * installation status of stack version on hosts
    * {String}
    */
   status: function() {
-    if (this.get('installInProgress'))  {
+    if (this.get('controller.installInProgress'))  {
       return 'INSTALLING'
-    } else if (this.get('notInstalledHosts.length') == 0) {
+    } else if (this.get('controller.allInstalled')) {
       return 'ALL_INSTALLED';
-    } else if (this.get('notInstalledHosts.length') > 0) {
-      return 'INSTALL';
     } else {
-      return 'UNDEFINED';
+      return 'INSTALL';
     }
-  }.property('notInstalledHosts.length'),
+  }.property('controller.installInProgress', 'controller.allInstalled'),
 
   /**
    * text on install buttons
@@ -67,20 +42,17 @@ App.MainStackVersionsDetailsView = Em.View.extend({
    */
   stackTextStatus: function() {
     switch(this.get('status')) {
-      case 'INSTALL':
-        return Em.I18n.t('admin.stackVersions.datails.hosts.btn.install').format(this.get('notInstalledHosts.length'));
-        break;
       case 'INSTALLING':
         return Em.I18n.t('admin.stackVersions.datails.hosts.btn.installing');
         break;
       case 'ALL_INSTALLED':
         return Em.I18n.t('admin.stackVersions.datails.hosts.btn.nothing');
         break;
-      default:
-        return Em.I18n.t('admin.stackVersions.datails.hosts.btn.na');
+      case 'INSTALL':
+        return Em.I18n.t('admin.stackVersions.datails.hosts.btn.install').format(this.get('controller.content.notInstalledHostStacks.length'));
         break;
     }
-  }.property('status', 'notInstalledHosts'),
+  }.property('status', 'controller.content.notInstalledHostStacks.length'),
 
   /**
    * class on install buttons
@@ -92,7 +64,7 @@ App.MainStackVersionsDetailsView = Em.View.extend({
         return 'btn-success';
         break;
       case 'INSTALLING':
-        return 'btn-primary disabled';
+        return 'btn-primary';
         break;
       default:
         return 'disabled';

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/test/controllers/main/admin/stack_version/stack_version_details_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/admin/stack_version/stack_version_details_controller_test.js b/ambari-web/test/controllers/main/admin/stack_version/stack_version_details_controller_test.js
new file mode 100644
index 0000000..0333546
--- /dev/null
+++ b/ambari-web/test/controllers/main/admin/stack_version/stack_version_details_controller_test.js
@@ -0,0 +1,95 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+var App = require('app');
+require('controllers/main/admin/stack_versions/stack_version_details_controller');
+var mainStackVersionsDetailsController;
+
+describe('App.MainStackVersionsDetailsController', function () {
+
+  beforeEach(function () {
+    mainStackVersionsDetailsController = App.MainStackVersionsDetailsController.create();
+  });
+
+  describe('#installStackVersion', function () {
+    beforeEach(function() {
+      sinon.stub(mainStackVersionsDetailsController, 'showProgressPopup', Em.K);
+      sinon.stub(mainStackVersionsDetailsController, 'doInstallStackVersion', Em.K);
+    });
+    afterEach(function() {
+      mainStackVersionsDetailsController.showProgressPopup.restore();
+      mainStackVersionsDetailsController.doInstallStackVersion.restore();
+    });
+    it("shows installing proggress", function() {
+      mainStackVersionsDetailsController.reopen({'installInProgress': true});
+      mainStackVersionsDetailsController.installStackVersion({});
+      expect(mainStackVersionsDetailsController.showProgressPopup.calledOnce).to.be.true;
+      expect(mainStackVersionsDetailsController.doInstallStackVersion.calledOnce).to.be.false;
+    });
+    it("runs install stack version", function() {
+      mainStackVersionsDetailsController.reopen({'installInProgress': false});
+      mainStackVersionsDetailsController.reopen({'allInstalled': false});
+      mainStackVersionsDetailsController.installStackVersion({});
+      expect(mainStackVersionsDetailsController.showProgressPopup.calledOnce).to.be.false;
+      expect(mainStackVersionsDetailsController.doInstallStackVersion.calledOnce).to.be.true;
+    });
+    it("doesn't do anything", function() {
+      mainStackVersionsDetailsController.reopen({'installInProgress': false});
+      mainStackVersionsDetailsController.reopen({'allInstalled': true});
+      mainStackVersionsDetailsController.installStackVersion({});
+      expect(mainStackVersionsDetailsController.showProgressPopup.calledOnce).to.be.false;
+      expect(mainStackVersionsDetailsController.doInstallStackVersion.calledOnce).to.be.false;
+    });
+  });
+
+  describe('#showProgressPopup', function () {
+    beforeEach(function() {
+      sinon.stub(App.router.get('highAvailabilityProgressPopupController'), 'initPopup', Em.K);
+      App.set('testMode', true);
+    });
+    afterEach(function() {
+      App.router.get('highAvailabilityProgressPopupController').initPopup.restore();
+      App.set('testMode', false);
+    });
+    it("runs initPopup", function() {
+      mainStackVersionsDetailsController.reopen({'content': { 'version': "v1"}});
+      var popupTitle = Em.I18n.t('admin.stackVersions.datails.install.hosts.popup.title').format("v1");
+      var requestIds =[1];
+      mainStackVersionsDetailsController.showProgressPopup();
+      expect(App.router.get('highAvailabilityProgressPopupController').initPopup.calledWith(popupTitle, requestIds, mainStackVersionsDetailsController, true)).to.be.true;
+    });
+  });
+
+  describe('#doInstallStackVersion', function () {
+    beforeEach(function() {
+      sinon.stub(App.ajax, 'send', Em.K);
+      sinon.stub(mainStackVersionsDetailsController, 'generateDataForInstall', Em.K);
+    });
+    afterEach(function() {
+      App.ajax.send.restore();
+      mainStackVersionsDetailsController.generateDataForInstall.restore();
+    });
+    it("runs initPopup", function() {
+      mainStackVersionsDetailsController.doInstallStackVersion({});
+      expect(mainStackVersionsDetailsController.generateDataForInstall.calledOnce).to.be.true;
+      expect(App.ajax.send.calledOnce).to.be.true;
+    });
+  });
+
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/03b45ee1/ambari-web/test/views/main/admin/stack_version/stack_version_details_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/main/admin/stack_version/stack_version_details_test.js b/ambari-web/test/views/main/admin/stack_version/stack_version_details_test.js
index 3710733..8cf6253 100644
--- a/ambari-web/test/views/main/admin/stack_version/stack_version_details_test.js
+++ b/ambari-web/test/views/main/admin/stack_version/stack_version_details_test.js
@@ -22,54 +22,11 @@ require('views/main/admin/stack_versions/stack_version_view');
 var mainStackVersionsDetailsView;
 
 describe('App.MainStackVersionsDetailsView', function () {
-  var hostStackVersions = [
-    {
-      installEnabled: true,
-      status: "INIT"
-    },
-    {
-      installEnabled: true,
-      status: "INSTALL_FAILED"
-    },
-    {
-      installEnabled: false,
-      status: "INSTALLED"
-    }
-  ];
-  beforeEach(function () {
-    mainStackVersionsDetailsView = App.MainStackVersionsDetailsView.create({hostStackVersions: hostStackVersions});
-  });
-
-  describe('#notInstalledHosts', function () {
-    it("list on host without current config version", function() {
-      var notInstalled = [
-        {
-          installEnabled: true,
-          status: "INIT"
-        },
-        {
-          installEnabled: true,
-          status: "INSTALL_FAILED"
-        }
-      ];
-      expect(mainStackVersionsDetailsView.get('notInstalledHosts')).to.eql(notInstalled);
-    });
-  });
 
-  describe('#installInProgress', function () {
-    it("stack version install is not in progress", function() {
-      expect(mainStackVersionsDetailsView.get('installInProgress')).to.be.false;
-    });
-    it("stack version install is in progress", function() {
-      mainStackVersionsDetailsView.get('hostStackVersions').pushObject({
-        installEnabled: false,
-        status: "INSTALLING"
-      });
-      expect(mainStackVersionsDetailsView.get('installInProgress')).to.be.true;
-    });
+  beforeEach(function () {
+    mainStackVersionsDetailsView = App.MainStackVersionsDetailsView.create();
   });
 
-
   describe('#statusClass', function () {
     var tests = [
       {
@@ -82,7 +39,7 @@ describe('App.MainStackVersionsDetailsView', function () {
       },
       {
         status: "INSTALLING",
-        buttonClass: 'btn-primary disabled'
+        buttonClass: 'btn-primary'
       }
     ].forEach(function(t) {
       it("status is " + t.status + " class is " + t.buttonClass, function() {