Browse Source

AMBARI-17195. HiveServer2 Interactive UI Quicklink related issues (akovalenko)

Aleksandr Kovalenko 9 years ago
parent
commit
342d392b68

+ 9 - 0
ambari-web/app/controllers/global/cluster_controller.js

@@ -48,6 +48,11 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
    */
   isHostComponentMetricsLoaded: false,
 
+  /**
+   * This counter used as event trigger to notify that quick links should be changed.
+   */
+  quickLinksUpdateCounter: 0,
+
   /**
    * Ambari uses custom jdk.
    * @type {Boolean}
@@ -488,5 +493,9 @@ App.ClusterController = Em.Controller.extend(App.ReloadPopupMixin, {
       name: 'cluster.load_last_upgrade',
       sender: this
     });
+  },
+
+  triggerQuickLinksUpdate: function() {
+    this.incrementProperty('quickLinksUpdateCounter');
   }
 });

+ 10 - 1
ambari-web/app/mappers/components_state_mapper.js

@@ -164,8 +164,13 @@ App.componentsStateMapper = App.QuickDataMapper.create({
     var clients = [];
     var slaves = [];
     var masters = [];
+    var hasNewComponents = false;
 
     if (json.items) {
+      if (!App.isEmptyObject(Em.getWithDefault(App, 'cache.services', {}))) {
+        hasNewComponents = json.items.mapProperty('ServiceComponentInfo.total_count').reduce(Em.sum, 0) >
+          App.cache.services.mapProperty('host_components.length').reduce(Em.sum, 0);
+      }
       json.items.forEach(function (item) {
         var componentConfig = this.getComponentConfig(item.ServiceComponentInfo.component_name);
         var parsedItem = this.parseIt(item, componentConfig);
@@ -198,12 +203,16 @@ App.componentsStateMapper = App.QuickDataMapper.create({
             }
           }
         }
-      }, this)
+      }, this);
     }
     App.store.loadMany(this.clientModel, clients);
     App.store.loadMany(this.slaveModel, slaves);
     App.store.loadMany(this.masterModel, masters);
 
+    if (hasNewComponents) {
+      App.get('router.clusterController').triggerQuickLinksUpdate();
+    }
+
     console.timeEnd('App.componentsStateMapper execution time');
   }
 });

+ 10 - 2
ambari-web/app/mappers/service_metrics_mapper.js

@@ -180,6 +180,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       var hostComponents = [];
       var services = App.cache['services'];
       var previousComponentStatuses = App.cache['previousComponentStatuses'];
+      var lastKnownStatusesLength = Em.keys(previousComponentStatuses).length;
       var previousComponentPassiveStates = App.cache['previousComponentPassiveStates'];
       var result = [];
       var advancedHostComponents = [];
@@ -199,8 +200,8 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
         component.host_components.forEach(function (host_component) {
           var id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
           hostComponentIdsMap[id] = true;
-          previousComponentStatuses[host_component.id] = host_component.HostRoles.state;
-          previousComponentPassiveStates[host_component.id] = host_component.HostRoles.maintenance_state;
+          previousComponentStatuses[id] = host_component.HostRoles.state;
+          previousComponentPassiveStates[id] = host_component.HostRoles.maintenance_state;
           this.config3.ha_status = host_component.HostRoles.component_name == "HBASE_MASTER" ?
             'metrics.hbase.master.IsActiveMaster' : 'HostRoles.ha_state';
           var comp = this.parseIt(host_component, this.config3);
@@ -252,6 +253,13 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
 
       //load services to model
       App.store.loadMany(this.get('model'), result);
+
+      // check for new components
+      if (lastKnownStatusesLength > 0) {
+        if (lastKnownStatusesLength < Em.keys(App.cache.previousComponentStatuses).length) {
+          App.get('router.clusterController').triggerQuickLinksUpdate();
+        }
+      }
     }
     console.timeEnd('App.serviceMetricsMapper execution time');
   },

+ 2 - 3
ambari-web/app/mixins/common/configs/configs_saver.js

@@ -690,9 +690,8 @@ App.ConfigsSaverMixin = Em.Mixin.create({
       messageClass = 'alert alert-error';
       value = result.value;
     }
-    if(currentService){
-      App.QuickViewLinks.proto().set('content', currentService);
-      App.QuickViewLinks.proto().loadTags();
+    if (currentService){
+      App.get('router.clusterController').triggerQuickLinksUpdate();
     }
 
     //  update configs for service actions

+ 5 - 1
ambari-web/app/views/common/quick_view_link_view.js

@@ -109,7 +109,8 @@ App.QuickViewLinks = Em.View.extend({
     'App.currentStackVersionNumber',
     'App.singleNodeInstall',
     'App.router.clusterController.isServiceMetricsLoaded',
-    'App.router.clusterController.isHostComponentMetricsLoaded'
+    'App.router.clusterController.isHostComponentMetricsLoaded',
+    'App.router.clusterController.quickLinksUpdateCounter'
   ),
 
   /**
@@ -410,6 +411,9 @@ App.QuickViewLinks = Em.View.extend({
             protocol = this.setProtocol(configProperties, link.protocol);
           }
         }
+        if (componentName && !hostNameForComponent) {
+          return;
+        }
         var newItem = this.getHostLink(link, publicHostName, protocol, configProperties, response); //quicklink generated for the hbs template
         if (!Em.isNone(newItem)) {
           quickLinks.push(newItem);