Browse Source

AMBARI-8653 UI integration with the BE - install repo versions on hosts from admin tab. (ababiichuk)

aBabiichuk 10 năm trước cách đây
mục cha
commit
59fa68e77e

+ 430 - 49
ambari-web/app/assets/data/stack_versions/stack_version_all.json

@@ -1,66 +1,447 @@
 {
-  "items" : [
+  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions?fields=*,repository_versions/*,repository_versions/operatingSystems/*",
+  "items": [
     {
-      "ClusterStackVersions" : {
-        "cluster_name" : "c1",
-        "id" : 1,
-        "stack" : "HDP",
-        "state" : "CURRENT",
-        "version" : "2.2",
-        "host_states" : {
-          "CURRENT" : [
-            "dev01.hortonworks.com"
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/1",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 1,
+        "repository_version": 1,
+        "stack": "HDP",
+        "state": "CURRENT",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [
+            "ab3test-4.c.pramod-thangali.internal"
           ],
-          "INSTALLED" : [ ],
-          "INSTALLING" : [ ],
-          "INSTALL_FAILED" : [ ],
-          "UPGRADED" : [ ],
-          "UPGRADE_FAILED" : [ ],
-          "UPGRADING" : [ ]
+          "INSTALLED": [],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
         }
       },
-      "repository_versions" : [
+      "repository_versions": [
         {
-          "RepositoryVersions" : {
-            "display_name" : "HDP-2.2",
-            "id" : 1,
-            "repository_version" : "2.2",
-            "stack_name" : "HDP",
-            "stack_version" : "2.2",
-            "upgrade_pack" : ""
-          }
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/1/repository_versions/1",
+          "RepositoryVersions": {
+            "display_name": "HDP-2.2",
+            "id": 1,
+            "repository_version": "2.2",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": ""
+          },
+          "operating_systems": []
         }
       ]
     },
     {
-      "ClusterStackVersions" : {
-        "cluster_name" : "c1",
-        "id" : 2,
-        "stack" : "HDP",
-        "state" : "INSTALLED",
-        "version" : "2.2",
-        "host_states" : {
-          "CURRENT" : [ ],
-          "INSTALLED" : [
-            "dev01.hortonworks.com"
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/2",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 2,
+        "repository_version": 2,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
           ],
-          "INSTALLING" : [ ],
-          "INSTALL_FAILED" : [ ],
-          "UPGRADED" : [ ],
-          "UPGRADE_FAILED" : [ ],
-          "UPGRADING" : [ ]
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
         }
       },
-      "repository_versions" : [
+      "repository_versions": [
         {
-          "RepositoryVersions" : {
-            "display_name" : "HDP-2.2.0.1-885",
-            "id" : 3,
-            "repository_version" : "2.2.0.1-885",
-            "stack_name" : "HDP",
-            "stack_version" : "2.2",
-            "upgrade_pack" : "upgrade-2.2"
-          }
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/2/repository_versions/2",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.0",
+            "id": 2,
+            "repository_version": "2.2.0.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/2/repository_versions/2/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 2,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/2/repository_versions/2/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 2,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/2/repository_versions/2/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 2,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/3",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 3,
+        "repository_version": 3,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
+          ],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
+        }
+      },
+      "repository_versions": [
+        {
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/3/repository_versions/3",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.1",
+            "id": 3,
+            "repository_version": "2.2.1.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/3/repository_versions/3/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 3,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/3/repository_versions/3/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 3,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/3/repository_versions/3/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 3,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/4",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 4,
+        "repository_version": 4,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
+          ],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
+        }
+      },
+      "repository_versions": [
+        {
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/4/repository_versions/4",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.2",
+            "id": 4,
+            "repository_version": "2.2.2.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/4/repository_versions/4/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 4,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/4/repository_versions/4/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 4,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/4/repository_versions/4/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 4,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/5",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 5,
+        "repository_version": 5,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
+          ],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
+        }
+      },
+      "repository_versions": [
+        {
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/5/repository_versions/5",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.3",
+            "id": 5,
+            "repository_version": "2.2.3.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/5/repository_versions/5/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 5,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/5/repository_versions/5/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 5,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/5/repository_versions/5/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 5,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/6",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 6,
+        "repository_version": 6,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
+          ],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
+        }
+      },
+      "repository_versions": [
+        {
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/6/repository_versions/6",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.4",
+            "id": 6,
+            "repository_version": "2.2.4.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/6/repository_versions/6/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 6,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/6/repository_versions/6/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 6,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/6/repository_versions/6/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 6,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/7",
+      "ClusterStackVersions": {
+        "cluster_name": "1",
+        "id": 7,
+        "repository_version": 7,
+        "stack": "HDP",
+        "state": "INSTALLED",
+        "version": "2.2",
+        "host_states": {
+          "CURRENT": [],
+          "INSTALLED": [
+            "ab3test-4.c.pramod-thangali.internal"
+          ],
+          "INSTALLING": [],
+          "INSTALL_FAILED": [],
+          "UPGRADED": [],
+          "UPGRADE_FAILED": [],
+          "UPGRADING": []
+        }
+      },
+      "repository_versions": [
+        {
+          "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/7/repository_versions/7",
+          "RepositoryVersions": {
+            "display_name": "HDP 2.2.5",
+            "id": 7,
+            "repository_version": "2.2.5.1-885",
+            "stack_name": "HDP",
+            "stack_version": "2.2",
+            "upgrade_pack": "upgrade-2.2"
+          },
+          "operating_systems": [
+            {
+              "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/7/repository_versions/7/operating_systems/redhat6",
+              "OperatingSystems": {
+                "os_type": "redhat6",
+                "repository_version_id": 7,
+                "stack_name": "HDP",
+                "stack_version": "2.2"
+              },
+              "repositories": [
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/7/repository_versions/7/operating_systems/redhat6/repositories/HDP-2.2",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-2.2",
+                    "repository_version_id": 7,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                },
+                {
+                  "href": "http://162.216.149.241:8080/api/v1/clusters/1/stack_versions/7/repository_versions/7/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+                  "Repositories": {
+                    "os_type": "redhat6",
+                    "repo_id": "HDP-UTILS-1.1.0.20",
+                    "repository_version_id": 7,
+                    "stack_name": "HDP",
+                    "stack_version": "2.2"
+                  }
+                }
+              ]
+            }
+          ]
         }
       ]
     }

+ 51 - 8
ambari-web/app/controllers/main/admin/stack_versions/repo_versions_controller.js

@@ -24,14 +24,31 @@ App.RepoVersionsController = Em.ArrayController.extend({
   content: function () {
     return App.RepositoryVersion.find().filterProperty('stackVersion', null);
   }.property('dataIsLoaded'),
+
+  /**
+   * true if content is loaded to model
+   * @type {Boolean}
+   */
   dataIsLoaded: false,
+
+  /**
+   * path to the mock json
+   * @type {String}
+   */
   mockUrl: '/data/stack_versions/repo_versions_all.json',
+
+  /**
+   * api to get RepoVersions
+   * @type {String}
+   */
   realUrl: function () {
     return App.get('apiPrefix') + App.get('stackVersionURL') + '/repository_versions?fields=*,operatingSystems/*,operatingSystems/repositories/*';
   }.property('App.stackVersionURL'),
+
   /**
    * load all data components required by repo version table
    * @return {*}
+   * @method load()
    */
   load: function () {
     this.set('dataIsLoaded', false);
@@ -47,12 +64,14 @@ App.RepoVersionsController = Em.ArrayController.extend({
   /**
    * get repo versions from server and push it to model
    * @return {*}
+   * @params {Boolean} isUpdate - if true loads part of data that need to be updated
+   * @method loadRepoVersionsToModel()
    */
-  loadRepoVersionsToModel: function (isUpdate) {
+  loadRepoVersionsToModel: function () {
     var dfd = $.Deferred();
     var self = this;
     App.get('router.mainStackVersionsController').loadStackVersionsToModel().done(function () {
-      App.HttpClient.get(self.getUrl(isUpdate), App.repoVersionMapper, {
+      App.HttpClient.get(self.getUrl(), App.repoVersionMapper, {
         complete: function () {
           dfd.resolve();
         }
@@ -62,11 +81,23 @@ App.RepoVersionsController = Em.ArrayController.extend({
     return dfd.promise();
   },
 
-  getUrl: function (isUpdate) {
-    return App.get('testMode') ? this.get('mockUrl') :
-      isUpdate ? this.get('realUpdateUrl') : this.get('realUrl');
+  /**
+   * returns api url to get repositoryVersion
+   * or mock json if testmode is on
+   * @returns {String}
+   * @method getUrl
+   */
+  getUrl: function () {
+    return App.get('testMode') ? this.get('mockUrl') : this.get('realUrl');
   },
 
+  /**
+   * sends request to install repoVersion to the cluster
+   * and create clusterStackVersion resourse
+   * @param event
+   * @return {$.ajax}
+   * @method installRepoVersion
+   */
   installRepoVersion: function (event) {
     var repo = event.context;
     var data = {
@@ -77,7 +108,7 @@ App.RepoVersionsController = Em.ArrayController.extend({
       },
       id: repo.get('id')
     };
-    App.ajax.send({
+    return App.ajax.send({
       name: 'admin.stack_version.install.repo_version',
       sender: this,
       data: data,
@@ -85,8 +116,20 @@ App.RepoVersionsController = Em.ArrayController.extend({
     });
   },
 
+  /**
+   * success callback for <code>installRepoVersion()<code>
+   * saves request id to the db, and redirect user to the just
+   * created clusterStackVersion.
+   * @param data
+   * @param opt
+   * @param params
+   * @method installStackVersionSuccess
+   */
   installStackVersionSuccess: function (data, opt, params) {
-    var stackVersion = App.StackVersion.find().findProperty('repositoryVersion.id', params.id);
-    App.router.transitionTo('main.admin.adminStackVersions.version', stackVersion);
+    App.db.set('stackUpgrade', 'id', [data.Requests.id]);
+    App.get('router.mainStackVersionsController').loadStackVersionsToModel().done(function() {
+      var stackVersion = App.StackVersion.find().findProperty('repositoryVersion.id', params.id);
+      App.router.transitionTo('main.admin.adminStackVersions.version', stackVersion);
+    });
   }
 });

+ 10 - 54
ambari-web/app/controllers/main/admin/stack_versions/stack_version_details_controller.js

@@ -23,63 +23,39 @@ App.MainStackVersionsDetailsController = Em.Controller.extend({
 
   content: null,
 
+  /**
+   * amount of all hosts installed on cluster
+   * @type {Number}
+   */
   totalHostCount: function() {
     return App.get('allHostNames.length');
   }.property('App.allHostNames.length'),
 
-
-  notInstalledHostsCount: function() {
-    return this.get('content.state') == 'INIT' ? this.get('totalHostCount.length') : 0;
-  }.property('content.state', 'totalHostCount.length'),
-
-  noInitHosts: function() {
-    return this.get('notInstalledHostsCount.length') == 0;
-  }.property('notInstalledHostsCount.length'),
   /**
    * true if stack version install is in progress
-   * {Boolean}
+   * @type {Boolean}
    */
   installInProgress: function() {
     return this.get('content.state') == "INSTALLING";
   }.property('content.state'),
 
-  /**
-   * true if stack version upgrade is in progress
-   * {Boolean}
-   */
-  upgradeInProgress: function() {
-    return this.get('content.state') == "UPGRADING";
-  }.property('content.state'),
-
   /**
    * true if repo version is installed on all hosts but not upgraded
-   * {Boolean}
+   * @type {Boolean}
    */
   installedNotUpgraded: function() {
-    return this.get("allInstalled") && !this.get("allUpgraded") ;
-  }.property("allInstalled", "allUpgraded"),
-
-  allInstalled: function() {
-    return this.get('content.installedHosts.length') == this.get('totalHostCount') ||
-      this.get('content.currentHosts.length') == this.get('totalHostCount');
-  }.property('content.installedHosts.length', 'content.currentHosts.length'),
+    return this.get('content.state') == "INSTALLED";
+  }.property('content.state'),
 
-  allUpgraded: function() {
-    return this.get('content.upgradedHosts.length') == this.get('totalHostCount') ||
-      this.get('content.currentHosts.length') == this.get('totalHostCount');
-  }.property('content.upgradedHosts.length', 'content.currentHosts.length'),
 
   /**
    * depending on state run or install repo request
    * or show the installation process popup
-   * @param event
    * @method installStackVersion
    */
-  installStackVersion: function(event) {
+  installStackVersion: function() {
     if (this.get('installInProgress')) {
       this.showProgressPopup();
-    } else if (!this.get('allInstalled')) {
-      this.doInstallStackVersion(event.context);
     }
   },
 
@@ -91,26 +67,6 @@ App.MainStackVersionsDetailsController = Em.Controller.extend({
     var popupTitle = Em.I18n.t('admin.stackVersions.datails.install.hosts.popup.title').format(this.get('content.repositoryVersion.displayName'));
     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) {
-    //TODO add correct request
-    return null;
-    /*return App.ajax.send({
-      name: 'admin.stack_version.install.repo_version',
-      data: data,
-      success: 'installStackVersionSuccess'
-    })*/
-  },
-
-  installStackVersionSuccess: function(data) {
-    App.db.set('stackUpgrade', 'id', [data.id]);
+    hostProgressPopupController.initPopup(popupTitle, requestIds, this);
   }
 });

+ 38 - 1
ambari-web/app/controllers/main/admin/stack_versions/stack_versions_controller.js

@@ -25,17 +25,32 @@ App.MainStackVersionsController = Em.ArrayController.extend({
   timeoutRef: null,
   isPolling: false,
   dataIsLoaded: false,
+
+  /**
+   *  path to the mock json
+   * @type {String}
+   */
   mockUrl: '/data/stack_versions/stack_version_all.json',
+
+  /**
+   * api to get ClusterStackVersions with repository_versions (use to init data load)
+   * @type {String}
+   */
   realUrl: function () {
     return App.apiPrefix + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=*,repository_versions/*,repository_versions/operatingSystems/repositories/*';
   }.property('App.clusterName'),
+
+  /**
+   * api to get ClusterStackVersions without repository_versions (use to update data)
+   * @type {String}
+   */
   realUpdateUrl: function () {
     return App.apiPrefix + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=ClusterStackVersions/*';
-    //TODO return App.apiPrefix + '/clusters/' + App.get('clusterName') + '/stack_versions?fields=ClusterStackVersions/state,ClusterStackVersions/host_states&minimal_response=true';
   }.property('App.clusterName'),
 
   /**
    * request latest data from server and update content
+   * @method doPolling
    */
   doPolling: function () {
     var self = this;
@@ -51,6 +66,7 @@ App.MainStackVersionsController = Em.ArrayController.extend({
   /**
    * load all data components required by stack version table
    * @return {*}
+   * @method load
    */
   load: function () {
     var dfd = $.Deferred();
@@ -65,6 +81,7 @@ App.MainStackVersionsController = Em.ArrayController.extend({
   /**
    * get stack versions from server and push it to model
    * @return {*}
+   * @method loadStackVersionsToModel
    */
   loadStackVersionsToModel: function (isUpdate) {
     var dfd = $.Deferred();
@@ -77,11 +94,25 @@ App.MainStackVersionsController = Em.ArrayController.extend({
     return dfd.promise();
   },
 
+  /**
+   * returns api url to get clusteStackVersion wirh repositoryVersion
+   * or just clustrerStackVersion if only updates are requested
+   * or mock json if testmode is on
+   * @param isUpdate true if data needs to be updated
+   * @returns {String}
+   * @method getUrl
+   */
   getUrl: function (isUpdate) {
     return App.get('testMode') ? this.get('mockUrl') :
       isUpdate ? this.get('realUpdateUrl') : this.get('realUrl');
   },
 
+  /**
+   * goes to the hosts page with content filtered by repo_version_name and repo_version_state
+   * @param version
+   * @param state
+   * @method filterHostsByStack
+   */
   filterHostsByStack: function (version, state) {
     if (!version || !state)
       return;
@@ -90,6 +121,12 @@ App.MainStackVersionsController = Em.ArrayController.extend({
     App.router.transitionTo('hosts.index');
   },
 
+  /**
+   * shows popup with listed hosts wich has current state of hostStackVersion
+   * @param event
+   * @returns {*|void}
+   * @method showHosts
+   */
   showHosts: function(event) {
     var self = this;
     var status = event.currentTarget.title.toCapital();

+ 1 - 1
ambari-web/app/mappers/stack_version_mapper.js

@@ -46,9 +46,9 @@ App.stackVersionMapper = App.QuickDataMapper.create({
         stack.repository_version_id = item.ClusterStackVersions.repository_version;
         if (item.repository_versions && item.repository_versions[0]) {
           item.repository_versions[0].RepositoryVersions.stackVersionId = item.ClusterStackVersions.id;
-          resultStack.push(this.parseIt(stack, this.get('modelStack')));
           App.repoVersionMapper.map({"items": item.repository_versions }, true);
         }
+        resultStack.push(this.parseIt(stack, this.get('modelStack')));
       }, this);
     }
     App.store.commit();

+ 4 - 0
ambari-web/app/models/stack_version/version.js

@@ -42,6 +42,10 @@ App.StackVersion = DS.Model.extend({
 
   noCurrentHosts: function() {
     return this.get('currentHosts.length') == 0;
+  }.property('currentHosts.length'),
+
+  noInstallFailedHosts: function() {
+    return this.get('installFailedHosts.length') == 0;
   }.property('currentHosts.length')
 });
 

+ 1 - 1
ambari-web/app/styles/application.less

@@ -5031,7 +5031,7 @@ ul.inline li {
     td:first-child + td + td {
       width: 20%;
       word-wrap: break-word;
-      input.filter-input-width{
+      select.filter-input-width{
         width: 75%;
       }
     }

+ 2 - 2
ambari-web/app/templates/main/admin/stack_versions/stack_version_details.hbs

@@ -46,8 +46,8 @@
             <div class="span3">{{t admin.stackVersions.datails.not.installed.on}}</div>
             <div {{bindAttr class="noInitHosts:not-active-link :span6"}}>
               <a href="#" title='current' class="not-installed-hosts-count"
-                {{action showHosts content.repositoryVersion.displayName content.notInstalledHosts target="App.router.mainStackVersionsController"}}>
-                {{notInstalledHostsCount}}/{{totalHostCount}}
+                {{action showHosts content.repositoryVersion.displayName content.noInstallFailedHosts target="App.router.mainStackVersionsController"}}>
+                {{content.installFailedHosts.length}}/{{totalHostCount}}
               </a>
             </div>
           </div>

+ 5 - 0
ambari-web/app/views/common/filter_view.js

@@ -581,6 +581,11 @@ module.exports = {
           return origin == compareValue;
         };
         break;
+      case 'os':
+        return function (origin, compareValue) {
+          return origin.getEach('osType').contains(compareValue)
+        };
+        break;
       case 'range':
         return function (origin, compareValue) {
           if (compareValue[1] && compareValue[0]) {

+ 19 - 4
ambari-web/app/views/main/admin/stack_versions/repo_version_view.js

@@ -62,8 +62,9 @@ App.RepoVersionsView = App.TableView.extend({
   }),
   osSort: sort.fieldView.extend({
     column: 3,
-    name: 'operatingSystems',
-    displayName: Em.I18n.t('admin.stackVersions.table.header.os')
+    name: 'operatingSystems.length',
+    displayName: Em.I18n.t('admin.stackVersions.table.header.os'),
+    type: 'number'
   }),
 
   repoNameFilterView: filters.createSelectView({
@@ -96,11 +97,25 @@ App.RepoVersionsView = App.TableView.extend({
     }
   }),
 
-  osFilterView: filters.createTextView({
+  osFilterView: filters.createSelectView({
     column: 3,
     fieldType: 'filter-input-width',
+    content: function () {
+      var names = App.OS.find().mapProperty('osType').uniq();
+      return [
+        {
+          value: '',
+          label: Em.I18n.t('common.all')
+        }
+      ].concat(names.map(function (name) {
+          return {
+            value: name,
+            label: name
+          }
+        }));
+    }.property('App.router.mainStackVersionsController.dataIsLoaded'),
     onChangeValue: function () {
-      this.get('parentView').updateFilter(this.get('column'), this.get('value'), 'string');
+      this.get('parentView').updateFilter(this.get('column'), this.get('value'), 'os');
     }
   }),
 

+ 5 - 4
ambari-web/app/views/main/admin/stack_versions/stack_version_details_view.js

@@ -27,7 +27,7 @@ App.MainStackVersionsDetailsView = Em.View.extend({
   }.property('controller.content'),
   /**
    * text on install buttons
-   * {String}
+   * @type {String}
    */
   stackTextStatus: function() {
     var self = this;
@@ -39,20 +39,22 @@ App.MainStackVersionsDetailsView = Em.View.extend({
       case 'INSTALLED':
         return Em.I18n.t('admin.stackVersions.datails.hosts.btn.nothing');
         break;
+      //TODO remove INIT case if it would not be user
       case 'INIT':
         return Em.I18n.t('admin.stackVersions.datails.hosts.btn.install').format(self.get('totalHostCount') - self.get('content.installedHosts.length'));
         break;
       default:
         return self.get('content.state') && self.get('content.state').toCapital();
     }
-  }.property('content.state', 'content.notInstalledHostStacks.length'),
+  }.property('content.state'),
 
   /**
    * class on install buttons
-   * {String}
+   * @type {String}
    */
   statusClass: function() {
     switch (this.get('content.state')) {
+      //TODO remove INSTALL case if it would not be user
       case 'INSTALL':
         return 'btn-success';
         break;
@@ -70,7 +72,6 @@ App.MainStackVersionsDetailsView = Em.View.extend({
     App.get('router.mainStackVersionsController').doPolling();
   },
 
-
   willDestroyElement: function () {
     App.get('router.mainStackVersionsController').set('isPolling', false);
     clearTimeout(App.get('router.mainStackVersionsController.timeoutRef'));

+ 20 - 6
ambari-web/app/views/main/admin/stack_versions/stack_version_view.js

@@ -29,7 +29,7 @@ App.MainStackVersionsView = App.TableView.extend({
 
   /**
    * return filtered number of all content number information displayed on the page footer bar
-   * @returns {String}
+   * @type {String}
    */
   filteredContentInfo: function () {
     return this.t('tableView.filters.filteredConfigVersionInfo').format(this.get('filteredCount'), this.get('content.length'));
@@ -65,8 +65,9 @@ App.MainStackVersionsView = App.TableView.extend({
   }),
   osSort: sort.fieldView.extend({
     column: 3,
-    name: 'repositoryVersionoperatingSystems',
-    displayName: Em.I18n.t('admin.stackVersions.table.header.os')
+    name: 'repositoryVersion.operatingSystems.length',
+    displayName: Em.I18n.t('admin.stackVersions.table.header.os'),
+    type: 'number'
   }),
   installedSort: sort.fieldView.extend({
     column: 4,
@@ -111,11 +112,25 @@ App.MainStackVersionsView = App.TableView.extend({
     }
   }),
 
-  osFilterView: filters.createTextView({
+  osFilterView: filters.createSelectView({
     column: 3,
     fieldType: 'filter-input-width',
+    content: function () {
+      var names = App.OS.find().mapProperty('osType').uniq();
+      return [
+        {
+          value: '',
+          label: Em.I18n.t('common.all')
+        }
+      ].concat(names.map(function (name) {
+          return {
+            value: name,
+            label: name
+          }
+        }));
+    }.property('App.router.mainStackVersionsController.dataIsLoaded'),
     onChangeValue: function () {
-      this.get('parentView').updateFilter(this.get('column'), this.get('value'), 'string');
+      this.get('parentView').updateFilter(this.get('column'), this.get('value'), 'os');
     }
   }),
 
@@ -141,7 +156,6 @@ App.MainStackVersionsView = App.TableView.extend({
     this.get('controller').doPolling();
   },
 
-
   willDestroyElement: function () {
     this.set('controller.isPolling', false);
     clearTimeout(this.get('controller.timeoutRef'));

+ 27 - 2
ambari-web/test/controllers/main/admin/stack_version/repo_versions_controller_test.js

@@ -50,7 +50,7 @@ describe('App.RepoVersionsController', function () {
   });
 
   describe('#load', function () {
-    it('', function () {
+    it('loads data by running loadRepoVersionsToModel', function () {
       sinon.stub(repoVersionsController, 'loadRepoVersionsToModel').returns({done: Em.K});
       repoVersionsController.load();
       expect(repoVersionsController.loadRepoVersionsToModel.calledOnce).to.be.true;
@@ -58,7 +58,7 @@ describe('App.RepoVersionsController', function () {
     });
   });
   describe('#loadRepoVersionsToModel()', function () {
-    it('', function () {
+    it('loads data to model', function () {
       sinon.stub(App.HttpClient, 'get', Em.K);
       sinon.stub(repoVersionsController, 'getUrl', Em.K);
       sinon.stub(App.get('router.mainStackVersionsController'), 'loadStackVersionsToModel', function() { return $.Deferred().resolve()});
@@ -75,5 +75,30 @@ describe('App.RepoVersionsController', function () {
     });
   });
 
+  describe('#installStackVersionSuccess()', function () {
+    it('success callback for install stack version', function () {
+      var repoId = "1";
+      var requestId = "2";
+      var stackVersion = {repositoryVersion: {id: repoId}};
+      sinon.stub(App.db, 'set', Em.K);
+      sinon.stub(App.get('router.mainStackVersionsController'), 'loadStackVersionsToModel', function() { return $.Deferred().resolve()});
+      sinon.stub(App.router, 'transitionTo', Em.K);
+      sinon.stub(App.StackVersion, 'find', function() {
+        return [stackVersion];
+      });
+
+      repoVersionsController.installStackVersionSuccess({Requests: {id: requestId}}, null, {id: repoId});
+      expect(App.db.set.calledWith('stackUpgrade', 'id', [requestId])).to.be.true;
+      expect(App.get('router.mainStackVersionsController').loadStackVersionsToModel.calledOnce).to.be.true;
+      expect(App.StackVersion.find.calledOnce).to.be.true;
+      expect(App.router.transitionTo.calledWith('main.admin.adminStackVersions.version', stackVersion)).to.be.true;
+
+      App.db.set.restore();
+      App.get('router.mainStackVersionsController').loadStackVersionsToModel.restore();
+      App.router.transitionTo.restore();
+      App.StackVersion.find.restore();
+    });
+  });
+
 
 });

+ 1 - 32
ambari-web/test/controllers/main/admin/stack_version/stack_version_details_controller_test.js

@@ -30,31 +30,14 @@ describe('App.MainStackVersionsDetailsController', function () {
   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;
     });
   });
 
@@ -72,21 +55,7 @@ describe('App.MainStackVersionsDetailsController', function () {
       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;
-    });
-  });
-/** TODO after implementing correct api
-  describe('#doInstallStackVersion', function () {
-    beforeEach(function() {
-      sinon.stub(App.ajax, 'send', Em.K);
-    });
-    afterEach(function() {
-      App.ajax.send.restore();
-    });
-    it("runs initPopup", function() {
-      mainStackVersionsDetailsController.doInstallStackVersion(Em.Object.create({version: "1"}));
-      expect(App.ajax.send.calledOnce).to.be.true;
+      expect(App.router.get('highAvailabilityProgressPopupController').initPopup.calledWith(popupTitle, requestIds, mainStackVersionsDetailsController)).to.be.true;
     });
   });
-*/
 });

+ 55 - 0
ambari-web/test/controllers/main/admin/stack_version/stack_versions_controller_test.js

@@ -0,0 +1,55 @@
+/**
+ * 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_versions_controller');
+var controller;
+
+describe('App.MainStackVersionsController', function () {
+
+  beforeEach(function () {
+    controller = App.MainStackVersionsController.create();
+  });
+
+  describe('#load()', function () {
+    it('loads data to model by running loadStackVersionsToModel', function () {
+      sinon.stub(controller, 'loadStackVersionsToModel').returns({done: Em.K});
+
+      controller.load();
+      expect(controller.loadStackVersionsToModel.calledOnce).to.be.true;
+
+      controller.loadConfigVersionsToModel.restore();
+    });
+  });
+
+  describe('#loadStackVersionsToModel()', function () {
+    it('loads data to model', function () {
+      sinon.stub(App.HttpClient, 'get', Em.K);
+      sinon.stub(controller, 'getUrl', Em.K);
+
+      controller.loadConfigVersionsToModel();
+      expect(App.HttpClient.get.calledOnce).to.be.true;
+      expect(controller.getUrl.calledWith([1])).to.be.true;
+
+
+      controller.getUrl.restore();
+      App.HttpClient.get.restore();
+    });
+  });
+});