hosts_mapper.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one or more
  3. * contributor license agreements. See the NOTICE file distributed with this
  4. * work for additional information regarding copyright ownership. The ASF
  5. * licenses this file to you under the Apache License, Version 2.0 (the
  6. * "License"); you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14. * License for the specific language governing permissions and limitations under
  15. * the License.
  16. */
  17. var App = require('app');
  18. var stringUtils = require('utils/string_utils');
  19. App.hostsMapper = App.QuickDataMapper.create({
  20. model: App.Host,
  21. config: {
  22. id: 'Hosts.host_name',
  23. host_name: 'Hosts.host_name',
  24. public_host_name: 'Hosts.public_host_name',
  25. cluster_id: 'cluster_id',// Hosts.cluster_name
  26. rack: 'Hosts.rack_info',
  27. host_components_key: 'host_components',
  28. host_components_type: 'array',
  29. host_components: {
  30. item: 'id'
  31. },
  32. alerts_summary: 'alerts_summary',
  33. critical_warning_alerts_count: 'critical_warning_alerts_count',
  34. cpu: 'Hosts.cpu_count',
  35. cpu_physical: 'Hosts.ph_cpu_count',
  36. memory: 'Hosts.total_mem',
  37. disk_info: 'Hosts.disk_info',
  38. disk_total: 'metrics.disk.disk_total',
  39. disk_free: 'metrics.disk.disk_free',
  40. health_status: 'Hosts.host_status',
  41. load_one: 'metrics.load.load_one',
  42. load_five: 'metrics.load.load_five',
  43. load_fifteen: 'metrics.load.load_fifteen',
  44. cpu_system: 'metrics.cpu.cpu_system',
  45. cpu_user: 'metrics.cpu.cpu_user',
  46. mem_total: 'metrics.memory.mem_total',
  47. mem_free: 'metrics.memory.mem_free',
  48. last_heart_beat_time: "Hosts.last_heartbeat_time",
  49. raw_last_heart_beat_time: "Hosts.last_heartbeat_time",
  50. os_arch: 'Hosts.os_arch',
  51. os_type: 'Hosts.os_type',
  52. ip: 'Hosts.ip',
  53. passive_state: 'Hosts.maintenance_state',
  54. index: 'index'
  55. },
  56. hostComponentConfig: {
  57. component_name: 'HostRoles.component_name',
  58. display_name: 'HostRoles.display_name',
  59. service_id: 'HostRoles.service_name',
  60. passive_state: 'HostRoles.maintenance_state',
  61. work_status: 'HostRoles.state',
  62. stale_configs: 'HostRoles.stale_configs',
  63. host_name: 'host_name',
  64. admin_state: 'HostRoles.desired_admin_state'
  65. },
  66. stackVersionConfig: {
  67. id: 'HostStackVersions.id',
  68. stack: 'HostStackVersions.stack',
  69. repo_id: 'repository_versions[0].RepositoryVersions.id',
  70. repo_version: 'repository_versions[0].RepositoryVersions.repository_version',
  71. display_name: 'repository_versions[0].RepositoryVersions.display_name',
  72. version: 'HostStackVersions.version',
  73. status: 'HostStackVersions.state',
  74. host_name: 'host_name',
  75. host_id: 'host_name',
  76. is_visible: 'is_visible'
  77. },
  78. hostComponentLogsConfig: {
  79. name: 'logging.name',
  80. service_name: 'HostRoles.service_name',
  81. host_name: 'HostRoles.host_name',
  82. log_file_names_type: 'array',
  83. log_file_names_key: 'logging.logs',
  84. log_file_names: {
  85. item: 'name'
  86. }
  87. },
  88. map: function (json, returnMapped) {
  89. returnMapped = !!returnMapped;
  90. console.time('App.hostsMapper execution time');
  91. if (json.items) {
  92. var hostsWithFullInfo = [];
  93. var hostIds = {};
  94. var components = [];
  95. var stackVersions = [];
  96. var componentsIdMap = {};
  97. var cacheServices = App.cache['services'];
  98. var currentServiceComponentsMap = App.get('componentConfigMapper').buildServiceComponentMap(cacheServices);
  99. var newHostComponentsMap = {};
  100. var selectedHosts = App.db.getSelectedHosts('mainHostController');
  101. var clusterName = App.get('clusterName');
  102. var advancedHostComponents = [];
  103. var hostComponentLogs = [];
  104. // Create a map for quick access on existing hosts
  105. var hosts = App.Host.find().toArray();
  106. var hostsMap = {};
  107. for (var p = 0; p < hosts.length; p++) {
  108. hostsMap[hosts[p].get('hostName')] = hosts[p];
  109. }
  110. // Use normal for loop instead of foreach to enhance performance
  111. for (var index = 0; index < json.items.length; index++) {
  112. var item = json.items[index];
  113. var notStartedComponents = [];
  114. var componentsInPassiveState = [];
  115. var componentsWithStaleConfigs = [];
  116. item.host_components = item.host_components || [];
  117. for (var i = 0; i < item.host_components.length; i++){
  118. var host_component = item.host_components[i];
  119. var id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
  120. var component = this.parseIt(host_component, this.hostComponentConfig);
  121. var serviceName = host_component.HostRoles.service_name;
  122. host_component.id = id;
  123. component.id = id;
  124. component.host_id = item.Hosts.host_name;
  125. component.host_name = item.Hosts.host_name;
  126. components.push(component);
  127. componentsIdMap[id] = component;
  128. if (!newHostComponentsMap[serviceName]) {
  129. newHostComponentsMap[serviceName] = [];
  130. }
  131. if (!currentServiceComponentsMap[serviceName]) {
  132. currentServiceComponentsMap[serviceName] = [];
  133. }
  134. if (!currentServiceComponentsMap[serviceName][id]) {
  135. newHostComponentsMap[serviceName].push(id);
  136. }
  137. if (App.serviceMetricsMapper.get('ADVANCED_COMPONENTS').contains(host_component.HostRoles.component_name)) {
  138. advancedHostComponents.push(id);
  139. }
  140. if (component.work_status !== App.HostComponentStatus.started) {
  141. notStartedComponents.push(id);
  142. }
  143. if (component.stale_configs) {
  144. componentsWithStaleConfigs.push(id);
  145. }
  146. if (component.passive_state !== 'OFF') {
  147. componentsInPassiveState.push(id);
  148. }
  149. if (host_component.hasOwnProperty('logging')) {
  150. var logParsed = this.parseIt(host_component, this.hostComponentLogsConfig);
  151. logParsed.id = logParsed.host_name + '_' + logParsed.name;
  152. logParsed.host_component_id = host_component.id;
  153. component.component_logs_id = logParsed.id;
  154. hostComponentLogs.push(logParsed);
  155. }
  156. }
  157. var currentVersion = item.stack_versions.findProperty('HostStackVersions.state', 'CURRENT');
  158. var currentVersionNumber = currentVersion && currentVersion.repository_versions
  159. ? Em.get(currentVersion.repository_versions[0], 'RepositoryVersions.repository_version') : '';
  160. for (var j = 0; j < item.stack_versions.length; j++) {
  161. var stackVersion = item.stack_versions[j];
  162. stackVersion.host_name = item.Hosts.host_name;
  163. stackVersion.is_visible = stringUtils.compareVersions(Em.get(stackVersion.repository_versions[0], 'RepositoryVersions.repository_version'), currentVersionNumber) >= 0
  164. || App.get('supports.displayOlderVersions') || !currentVersionNumber;
  165. stackVersions.push(this.parseIt(stackVersion, this.stackVersionConfig));
  166. }
  167. var alertsSummary = item.alerts_summary;
  168. item.critical_warning_alerts_count = alertsSummary ? (alertsSummary.CRITICAL || 0) + (alertsSummary.WARNING || 0) : 0;
  169. item.cluster_id = clusterName;
  170. var existingHost = hostsMap[item.Hosts.host_name];
  171. // There is no need to override existing index in host detail view since old model(already have indexes) will not be cleared.
  172. item.index = (existingHost && !json.itemTotal)? existingHost.get('index'): index;
  173. this.config = $.extend(this.config, {
  174. stack_versions_key: 'stack_versions',
  175. stack_versions_type: 'array',
  176. stack_versions: {
  177. item: 'HostStackVersions.id'
  178. }
  179. });
  180. var parsedItem = this.parseIt(item, this.config);
  181. parsedItem.last_heart_beat_time = App.dateTimeWithTimeZone(parsedItem.last_heart_beat_time);
  182. parsedItem.selected = selectedHosts.contains(parsedItem.host_name);
  183. parsedItem.not_started_components = notStartedComponents;
  184. parsedItem.components_in_passive_state = componentsInPassiveState;
  185. parsedItem.components_with_stale_configs = componentsWithStaleConfigs;
  186. hostIds[item.Hosts.host_name] = parsedItem;
  187. hostsWithFullInfo.push(parsedItem);
  188. }
  189. if(returnMapped){
  190. return hostsWithFullInfo;
  191. }
  192. for (var k = 0; k < advancedHostComponents.length; k++) {
  193. var key = advancedHostComponents[k];
  194. if (componentsIdMap[key]) componentsIdMap[key].display_name_advanced = App.HostComponent.find(key).get('displayNameAdvanced');
  195. }
  196. App.store.commit();
  197. App.store.loadMany(App.HostStackVersion, stackVersions);
  198. App.store.loadMany(App.HostComponentLog, hostComponentLogs);
  199. App.store.loadMany(App.HostComponent, components);
  200. //"itemTotal" present only for Hosts page request
  201. if (!Em.isNone(json.itemTotal)) {
  202. App.Host.find().clear();
  203. }
  204. App.store.loadMany(App.Host, hostsWithFullInfo);
  205. var itemTotal = parseInt(json.itemTotal);
  206. if (!isNaN(itemTotal)) {
  207. App.router.set('mainHostController.filteredCount', itemTotal);
  208. }
  209. //bind host-components with service records
  210. App.get('componentConfigMapper').addNewHostComponents(newHostComponentsMap, cacheServices);
  211. }
  212. console.timeEnd('App.hostsMapper execution time');
  213. },
  214. /**
  215. * set metric fields of hosts
  216. * @param {object} data
  217. */
  218. setMetrics: function (data) {
  219. var hosts = this.get('model').find();
  220. for (var i = 0; i < hosts.content.length; i++) {
  221. var host = hosts.objectAt(i);
  222. var hostMetrics = data.items.findProperty('Hosts.host_name', host.get('hostName'));
  223. host.setProperties({
  224. diskTotal: Em.get(hostMetrics, 'metrics.disk.disk_total'),
  225. diskFree: Em.get(hostMetrics, 'metrics.disk.disk_free'),
  226. loadOne: Em.get(hostMetrics, 'metrics.load.load_one')
  227. });
  228. }
  229. }
  230. });