Pārlūkot izejas kodu

AMBARI-6296. Components list on 'Host details page' contains only filtered elements when filter is used (alexantonenko)

Alex Antonenko 11 gadi atpakaļ
vecāks
revīzija
a2918a8d7b

+ 1 - 0
ambari-web/app/controllers/main/host.js

@@ -28,6 +28,7 @@ App.MainHostController = Em.ArrayController.extend({
   clearFilters: null,
 
   filteredCount: 0,
+  filteringComplete: true,
   /**
    * flag responsible for updating status counters of hosts
    */

+ 45 - 35
ambari-web/app/mappers/hosts_mapper.js

@@ -64,49 +64,59 @@ App.hostsMapper = App.QuickDataMapper.create({
     host_name: 'host_name'
   },
   map: function (json, isAll) {
+    var self = this;
     console.time('App.hostsMapper execution time');
-    if (json.items) {
-      var hostsWithFullInfo = [];
-      var hostIds = {};
-      var components = [];
-      json.items.forEach(function (item, index) {
-        item.host_components = item.host_components || [];
-        item.host_components.forEach(function (host_component) {
-          host_component.id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
-          var component = this.parseIt(host_component, this.hostComponentConfig);
-          component.id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
-          component.host_id = item.Hosts.host_name;
-          component.host_name = item.Hosts.host_name;
-          components.push(component);
-        }, this);
-        item.critical_alerts_count = (item.alerts) ? item.alerts.summary.CRITICAL + item.alerts.summary.WARNING : 0;
-        item.cluster_id = App.get('clusterName');
-        item.index = index;
+    if (json.items.length) {
+      var hostNames = json.items.mapProperty('Hosts.host_name');
+      var realUrl = '/hosts?<parameters>fields=host_components/HostRoles/component_name,host_components/HostRoles/service_name,host_components/HostRoles/stale_configs,host_components/HostRoles/state,host_components/HostRoles/host_name,host_components/HostRoles/maintenance_state&minimal_response=true';
+      var hostsUrl = App.apiPrefix + '/clusters/' + App.get('clusterName') + realUrl.replace('<parameters>', 'Hosts/host_name.in(' + hostNames.join(',') + ')&');
 
+      $.getJSON(hostsUrl, function (jsonHostComponents) {
+        var hostsWithFullInfo = [];
+        var hostIds = {};
+        var components = [];
+        json.items.forEach(function (item, index) {
+          item.host_components = jsonHostComponents.items.findProperty('Hosts.host_name',item.Hosts.host_name).host_components || [];
+          item.host_components.forEach(function (host_component) {
+            host_component.id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
+            var component = self.parseIt(host_component, self.hostComponentConfig);
+            component.id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
+            component.host_id = item.Hosts.host_name;
+            component.host_name = item.Hosts.host_name;
+            components.push(component);
+          });
+          item.critical_alerts_count = (item.alerts) ? item.alerts.summary.CRITICAL + item.alerts.summary.WARNING : 0;
+          item.cluster_id = App.get('clusterName');
+          item.index = index;
 
-        var parsedItem = this.parseIt(item, this.config);
-        parsedItem.is_requested = !isAll;
+          var parsedItem = self.parseIt(item, self.config);
+          parsedItem.is_requested = !isAll;
 
-        hostIds[item.Hosts.host_name] = parsedItem;
+          hostIds[item.Hosts.host_name] = parsedItem;
 
-        hostsWithFullInfo.push(parsedItem);
-      }, this);
+          hostsWithFullInfo.push(parsedItem);
+        });
 
-      hostsWithFullInfo = hostsWithFullInfo.sortProperty('public_host_name');
+        hostsWithFullInfo = hostsWithFullInfo.sortProperty('public_host_name');
 
-      App.Host.find().forEach(function (host) {
-        if (isAll && host.get('isRequested')) {
-          hostIds[host.get('hostName')].is_requested = true;
-        } else if (!hostIds[host.get('hostName')]) {
-          host.set('isRequested', false);
-        }
+        App.Host.find().forEach(function (host) {
+          if (isAll && host.get('isRequested')) {
+            hostIds[host.get('hostName')].is_requested = true;
+          } else if (!hostIds[host.get('hostName')]) {
+            host.set('isRequested', false);
+          }
+        });
+        App.store.loadMany(App.HostComponent, components);
+        App.store.loadMany(App.Host, hostsWithFullInfo);
+        App.router.set('mainHostController.filteredCount', parseInt(json.itemTotal));
+        App.router.set('mainHostController.filteringComplete', true);
       });
-      App.store.loadMany(App.HostComponent, components);
-      App.store.loadMany(App.Host, hostsWithFullInfo);
-      var itemTotal = parseInt(json.itemTotal);
-      if (itemTotal) {
-        App.router.set('mainHostController.filteredCount', itemTotal);
-      }
+    }else{
+      App.Host.find().forEach(function (host) {
+        host.set('isRequested', false);
+      })
+      App.router.set('mainHostController.filteredCount', 0);
+      App.router.set('mainHostController.filteringComplete', true);
     }
     console.timeEnd('App.hostsMapper execution time');
   }

+ 1 - 0
ambari-web/app/mixins/common/tableServerProvider.js

@@ -52,6 +52,7 @@ App.TableServerProvider = Em.Mixin.create({
     if (!this.get('filteringComplete')) return false;
 
     this.set('filteringComplete', false);
+    this.set('controller.filteringComplete', false);
     var updaterMethodName = this.get('updater.tableUpdaterMap')[this.get('tableName')];
     this.get('updater')[updaterMethodName](function () {
       self.set('filteringComplete', true);

+ 1 - 1
ambari-web/app/templates/main/host.hbs

@@ -142,7 +142,7 @@
     </tbody>
   </table>
 
-  <div {{bindAttr class="view.filteringComplete:hidden :hosts-overlay"}}>
+  <div {{bindAttr class="controller.filteringComplete:hidden :hosts-overlay"}}>
     <div class="spinner"></div>
   </div>