hosts_mapper.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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. os_arch: 'Hosts.os_arch',
  50. os_type: 'Hosts.os_type',
  51. ip: 'Hosts.ip',
  52. passive_state: 'Hosts.maintenance_state',
  53. index: 'index'
  54. },
  55. hostComponentConfig: {
  56. component_name: 'HostRoles.component_name',
  57. service_id: 'HostRoles.service_name',
  58. passive_state: 'HostRoles.maintenance_state',
  59. work_status: 'HostRoles.state',
  60. stale_configs: 'HostRoles.stale_configs',
  61. host_name: 'host_name',
  62. admin_state: 'HostRoles.desired_admin_state'
  63. },
  64. stackVersionConfig: {
  65. id: 'HostStackVersions.id',
  66. stack: 'HostStackVersions.stack',
  67. repo_id: 'repository_versions[0].RepositoryVersions.id',
  68. repo_version: 'repository_versions[0].RepositoryVersions.repository_version',
  69. display_name: 'repository_versions[0].RepositoryVersions.display_name',
  70. version: 'HostStackVersions.version',
  71. status: 'HostStackVersions.state',
  72. host_name: 'host_name',
  73. host_id: 'host_name',
  74. is_visible: 'is_visible'
  75. },
  76. map: function (json, returnMapped) {
  77. returnMapped = !!returnMapped;
  78. console.time('App.hostsMapper execution time');
  79. if (json.items) {
  80. var hostsWithFullInfo = [];
  81. var hostIds = {};
  82. var components = [];
  83. var stackVersions = [];
  84. var componentsIdMap = {};
  85. var cacheServices = App.cache['services'];
  86. var currentServiceComponentsMap = App.get('componentConfigMapper').buildServiceComponentMap(cacheServices);
  87. var newHostComponentsMap = {};
  88. var selectedHosts = App.db.getSelectedHosts('mainHostController');
  89. var stackUpgradeSupport = App.get('supports.stackUpgrade');
  90. var clusterName = App.get('clusterName');
  91. var advancedHostComponents = [];
  92. // Create a map for quick access on existing hosts
  93. var hosts = App.Host.find().toArray();
  94. var hostsMap = {};
  95. for (var p = 0; p < hosts.length; p++) {
  96. hostsMap[hosts[p].get('hostName')] = hosts[p];
  97. }
  98. // Use normal for loop instead of foreach to enhance performance
  99. for (var index = 0; index < json.items.length; index++) {
  100. var item = json.items[index];
  101. var notStartedComponents = [];
  102. var componentsInPassiveState = [];
  103. var componentsWithStaleConfigs = [];
  104. item.host_components = item.host_components || [];
  105. for (var i = 0; i < item.host_components.length; i++){
  106. var host_component = item.host_components[i];
  107. var id = host_component.HostRoles.component_name + "_" + item.Hosts.host_name;
  108. var component = this.parseIt(host_component, this.hostComponentConfig);
  109. var serviceName = host_component.HostRoles.service_name;
  110. host_component.id = id;
  111. component.id = id;
  112. component.host_id = item.Hosts.host_name;
  113. component.host_name = item.Hosts.host_name;
  114. components.push(component);
  115. componentsIdMap[id] = component;
  116. if (!newHostComponentsMap[serviceName]) {
  117. newHostComponentsMap[serviceName] = [];
  118. }
  119. if (!currentServiceComponentsMap[serviceName]) {
  120. currentServiceComponentsMap[serviceName] = [];
  121. }
  122. if (!currentServiceComponentsMap[serviceName][id]) {
  123. newHostComponentsMap[serviceName].push(id);
  124. }
  125. if (App.serviceMetricsMapper.get('ADVANCED_COMPONENTS').contains(host_component.HostRoles.component_name)) {
  126. advancedHostComponents.push(id);
  127. }
  128. if (component.work_status !== App.HostComponentStatus.started) {
  129. notStartedComponents.push(id);
  130. }
  131. if (component.stale_configs) {
  132. componentsWithStaleConfigs.push(id);
  133. }
  134. if (component.passive_state !== 'OFF') {
  135. componentsInPassiveState.push(id);
  136. }
  137. }
  138. if (stackUpgradeSupport) {
  139. var currentVersion = item.stack_versions.findProperty('HostStackVersions.state', 'CURRENT');
  140. var currentVersionNumber = currentVersion && currentVersion.repository_versions
  141. ? Em.get(currentVersion.repository_versions[0], 'RepositoryVersions.repository_version') : '';
  142. for (var j = 0; j < item.stack_versions.length; j++) {
  143. var stackVersion = item.stack_versions[j];
  144. stackVersion.host_name = item.Hosts.host_name;
  145. stackVersion.is_visible = stringUtils.compareVersions(Em.get(stackVersion.repository_versions[0], 'RepositoryVersions.repository_version'), currentVersionNumber) >= 0
  146. || App.get('supports.displayOlderVersions') || !currentVersionNumber;
  147. stackVersions.push(this.parseIt(stackVersion, this.stackVersionConfig));
  148. }
  149. }
  150. var alertsSummary = item.alerts_summary;
  151. item.critical_warning_alerts_count = alertsSummary ? (alertsSummary.CRITICAL || 0) + (alertsSummary.WARNING || 0) : 0;
  152. item.cluster_id = clusterName;
  153. var existingHost = hostsMap[component.host_name];
  154. // There is no need to override existing index in host detail view since old model(already have indexes) will not be cleared.
  155. item.index = (existingHost && !json.itemTotal)? existingHost.get('index'): index;
  156. if (stackUpgradeSupport) {
  157. this.config = $.extend(this.config, {
  158. stack_versions_key: 'stack_versions',
  159. stack_versions_type: 'array',
  160. stack_versions: {
  161. item: 'HostStackVersions.id'
  162. }
  163. })
  164. }
  165. var parsedItem = this.parseIt(item, this.config);
  166. parsedItem.is_requested = true;
  167. parsedItem.selected = selectedHosts.contains(parsedItem.host_name);
  168. parsedItem.not_started_components = notStartedComponents;
  169. parsedItem.components_in_passive_state = componentsInPassiveState;
  170. parsedItem.components_with_stale_configs = componentsWithStaleConfigs;
  171. hostIds[item.Hosts.host_name] = parsedItem;
  172. hostsWithFullInfo.push(parsedItem);
  173. }
  174. if(returnMapped){
  175. return hostsWithFullInfo;
  176. }
  177. for (var k = 0; k < advancedHostComponents.length; k++) {
  178. var key = advancedHostComponents[k];
  179. if (componentsIdMap[key]) componentsIdMap[key].display_name_advanced = App.HostComponent.find(key).get('displayNameAdvanced');
  180. }
  181. App.store.commit();
  182. if (stackUpgradeSupport) {
  183. App.store.loadMany(App.HostStackVersion, stackVersions);
  184. }
  185. App.store.loadMany(App.HostComponent, components);
  186. //"itemTotal" present only for Hosts page request
  187. if (!Em.isNone(json.itemTotal)) {
  188. App.Host.find().clear();
  189. }
  190. App.store.loadMany(App.Host, hostsWithFullInfo);
  191. var itemTotal = parseInt(json.itemTotal);
  192. if (!isNaN(itemTotal)) {
  193. App.router.set('mainHostController.filteredCount', itemTotal);
  194. }
  195. //bind host-components with service records
  196. App.get('componentConfigMapper').addNewHostComponents(newHostComponentsMap, cacheServices);
  197. }
  198. console.timeEnd('App.hostsMapper execution time');
  199. },
  200. /**
  201. * set metric fields of hosts
  202. * @param {object} data
  203. */
  204. setMetrics: function (data) {
  205. var hosts = this.get('model').find();
  206. for (var i = 0; i < hosts.length; i++) {
  207. var host = hosts[i];
  208. if (host.get('isRequested')) {
  209. var hostMetrics = data.items.findProperty('Hosts.host_name', host.get('hostName'));
  210. host.setProperties({
  211. diskTotal: Em.get(hostMetrics, 'metrics.disk.disk_total'),
  212. diskFree: Em.get(hostMetrics, 'metrics.disk.disk_free'),
  213. loadOne: Em.get(hostMetrics, 'metrics.load.load_one')
  214. });
  215. }
  216. }
  217. }
  218. });