service_mapper.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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. App.servicesMapper = App.QuickDataMapper.create({
  18. servicesSortOrder: [
  19. 'HDFS',
  20. 'MAPREDUCE',
  21. 'HBASE',
  22. 'HIVE',
  23. 'OOZIE',
  24. 'GANGLIA',
  25. 'NAGIOS',
  26. 'ZOOKEEPER',
  27. 'PIG',
  28. 'SQOOP'
  29. ],
  30. sortByOrder: function (sortOrder, array) {
  31. var sorted = [];
  32. for (var i = 0; i < sortOrder.length; i++)
  33. for (var j = 0; j < array.length; j++) {
  34. if (sortOrder[i] == array[j].id) {
  35. sorted.push(array[j]);
  36. }
  37. }
  38. return sorted;
  39. },
  40. model: App.Service,
  41. config: {
  42. id: 'ServiceInfo.service_name',
  43. service_name: 'ServiceInfo.service_name',
  44. work_status: 'ServiceInfo.state',
  45. $service_audit: [ 1, 2, 3 ],
  46. $alerts: [ 1, 2, 3 ],
  47. components_key: 'components',
  48. components_type: 'array',
  49. components: {
  50. item: 'ServiceComponentInfo.component_name'
  51. },
  52. host_components: 'host_components'
  53. },
  54. hdfsConfig: {
  55. version: 'nameNodeComponent.ServiceComponentInfo.Version',
  56. name_node_id: 'nameNodeComponent.host_components[0].HostRoles.host_name',
  57. sname_node_id: 'snameNodeComponent.host_components[0].HostRoles.host_name',
  58. data_nodes: 'data_nodes',
  59. name_node_start_time: 'nameNodeComponent.ServiceComponentInfo.StartTime',
  60. jvm_memory_heap_used: 'nameNodeComponent.host_components[0].metrics.jvm.memHeapUsedM',
  61. jvm_memory_heap_committed: 'nameNodeComponent.host_components[0].metrics.jvm.memHeapCommittedM',
  62. live_data_nodes: 'live_data_nodes',
  63. dead_data_nodes: 'dead_data_nodes',
  64. decommission_data_nodes: 'decommission_data_nodes',
  65. capacity_used: 'nameNodeComponent.ServiceComponentInfo.CapacityUsed',
  66. capacity_total: 'nameNodeComponent.ServiceComponentInfo.CapacityTotal',
  67. capacity_remaining: 'nameNodeComponent.ServiceComponentInfo.CapacityRemaining',
  68. dfs_total_blocks: 'nameNodeComponent.ServiceComponentInfo.BlocksTotal',
  69. dfs_corrupt_blocks: 'nameNodeComponent.ServiceComponentInfo.CorruptBlocks',
  70. dfs_missing_blocks: 'nameNodeComponent.ServiceComponentInfo.MissingBlocks',
  71. dfs_under_replicated_blocks: 'nameNodeComponent.ServiceComponentInfo.UnderReplicatedBlocks',
  72. dfs_total_files: 'nameNodeComponent.ServiceComponentInfo.TotalFiles',
  73. upgrade_status: 'nameNodeComponent.ServiceComponentInfo.UpgradeFinalized',
  74. safe_mode_status: 'nameNodeComponent.ServiceComponentInfo.Safemode'
  75. },
  76. mapReduceConfig: {
  77. version: 'jobTrackerComponent.ServiceComponentInfo.Version',
  78. job_tracker_id: 'jobTrackerComponent.host_components[0].HostRoles.host_name',
  79. task_trackers: 'task_trackers',
  80. job_tracker_start_time: 'jobTrackerComponent.ServiceComponentInfo.StartTime',
  81. job_tracker_heap_used: 'jobTrackerComponent.ServiceComponentInfo.HeapMemoryUsed',
  82. job_tracker_heap_max: 'jobTrackerComponent.ServiceComponentInfo.HeapMemoryMax',
  83. alive_trackers: 'alive_trackers',
  84. black_list_trackers: 'black_list_trackers',
  85. gray_list_trackers: 'gray_list_trackers',
  86. map_slots: 'map_slots',
  87. reduce_slots: 'reduce_slots',
  88. jobs_submitted: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.jobs_submitted',
  89. jobs_completed: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.jobs_completed',
  90. map_slots_occupied: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.occupied_map_slots',
  91. map_slots_reserved: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.reserved_map_slots',
  92. reduce_slots_occupied: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.occupied_reduce_slots',
  93. reduce_slots_reserved: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.reserved_reduce_slots',
  94. maps_running: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.running_maps',
  95. maps_waiting: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.waiting_maps',
  96. reduces_running: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.running_reduces',
  97. reduces_waiting: 'jobTrackerComponent.ServiceComponentInfo.jobtracker.waiting_reduces',
  98. trackers_decommissioned: 'jobTrackerComponent.host_components[0].metrics.mapred.jobtracker.trackers_decommissioned'
  99. },
  100. hbaseConfig: {
  101. version: 'masterComponent.ServiceComponentInfo.Version',
  102. master_id: 'masterComponent.host_components[0].HostRoles.host_name',
  103. region_servers: 'region_servers',
  104. master_start_time: 'masterComponent.ServiceComponentInfo.MasterStartTime',
  105. master_active_time: 'masterComponent.ServiceComponentInfo.MasterActiveTime',
  106. average_load: 'masterComponent.ServiceComponentInfo.AverageLoad',
  107. regions_in_transition: 'regions_in_transition',
  108. revision: 'masterComponent.ServiceComponentInfo.Revision',
  109. heap_memory_used: 'masterComponent.ServiceComponentInfo.HeapMemoryUsed',
  110. heap_memory_max: 'masterComponent.ServiceComponentInfo.HeapMemoryMax'
  111. },
  112. model2: App.Component,
  113. config2: {
  114. id: 'ServiceComponentInfo.component_name',
  115. component_name: 'ServiceComponentInfo.component_name',
  116. service_id: 'ServiceComponentInfo.service_name',
  117. // TODO - PROBLEM:
  118. // below statements are a problem for multiple
  119. // host_component components. Because it randomly
  120. // picks one of the hosts. Especially the host details
  121. // page must be careful because, it will randomly
  122. // pick a host.
  123. work_status: 'host_components[0].HostRoles.state',
  124. host_id: 'host_components[0].HostRoles.host_name'
  125. },
  126. model3: App.HostComponent,
  127. config3: {
  128. id: 'id',
  129. work_status: 'HostRoles.state',
  130. component_name: 'HostRoles.component_name',
  131. host_id: 'HostRoles.host_name',
  132. service_id: 'component[0].ServiceComponentInfo.service_name'
  133. },
  134. map: function (json) {
  135. if (!this.get('model')) {
  136. return;
  137. }
  138. if (json.items) {
  139. var result = [];
  140. json.items.forEach(function (item) {
  141. var finalConfig = jQuery.extend({}, this.config);
  142. var finalJson = [];
  143. item.host_components = [];
  144. if (this.get('model').find(item.ServiceInfo.service_name).get('isLoaded')) {
  145. this.update(item);
  146. return;
  147. }
  148. item.components.forEach(function (component) {
  149. component.host_components.forEach(function (host_component) {
  150. host_component.id = host_component.HostRoles.component_name + "_" + host_component.HostRoles.host_name;
  151. item.host_components.push(host_component.id);
  152. }, this)
  153. }, this);
  154. if (item && item.ServiceInfo && item.ServiceInfo.service_name == "HDFS") {
  155. // Change the JSON so that it is easy to map
  156. finalJson = this.hdfsMapper(item);
  157. result.push(finalJson);
  158. App.store.load(App.HDFSService, finalJson);
  159. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "MAPREDUCE") {
  160. finalJson = this.mapreduceMapper(item);
  161. result.push(finalJson);
  162. App.store.load(App.MapReduceService, finalJson);
  163. } else if (item && item.ServiceInfo && item.ServiceInfo.service_name == "HBASE") {
  164. finalJson = this.hbaseMapper(item);
  165. result.push(finalJson);
  166. App.store.load(App.HBaseService, finalJson);
  167. } else {
  168. result.push(this.parseIt(item, this.config));
  169. }
  170. }, this);
  171. result = this.sortByOrder(this.get('servicesSortOrder'), result);
  172. App.store.loadMany(this.get('model'), result);
  173. result = [];
  174. json.items.forEach(function (item) {
  175. item.components.forEach(function (component) {
  176. result.push(this.parseIt(component, this.config2));
  177. }, this)
  178. }, this);
  179. App.store.loadMany(this.get('model2'), result);
  180. result = [];
  181. json.items.forEach(function (item) {
  182. item.components.forEach(function (component) {
  183. component.host_components.forEach(function (host_component) {
  184. result.push(this.parseIt(host_component, this.config3));
  185. }, this)
  186. }, this)
  187. }, this);
  188. App.store.loadMany(this.get('model3'), result);
  189. }
  190. },
  191. update: function (service) {
  192. var finalJson;
  193. switch (service.ServiceInfo.service_name) {
  194. case 'HDFS':
  195. finalJson = this.hdfsMapper(service);
  196. App.HDFSService.find().map(function (e) {
  197. e.set("version", finalJson.version);
  198. e.set("nameNodeStartTime", finalJson.name_node_start_time);
  199. e.set("jvmMemoryHeapCommitted", finalJson.jvm_memory_heap_committed);
  200. e.set("jvmMemoryHeapUsed", finalJson.jvm_memory_heap_used);
  201. e.set("capacityUsed", finalJson.capacity_used);
  202. e.set("capacityTotal", finalJson.capacity_total);
  203. e.set("dfsTotalBlocks", finalJson.dfs_total_blocks);
  204. e.set("dfsCorruptBlocks", finalJson.dfs_corrupt_blocks);
  205. e.set("dfsMissingBlocks", finalJson.dfs_missing_blocks);
  206. e.set("dfsUnderReplicatedBlocks", finalJson.dfs_under_replicated_blocks);
  207. e.set("dfsTotalFiles", finalJson.dfs_total_files);
  208. e.set("upgradeStatus", finalJson.upgrade_status);
  209. e.set("safeModeStatus", finalJson.safe_mode_status);
  210. // Live data nodes
  211. var dataNodes = e.get('liveDataNodes');
  212. if (dataNodes) {
  213. dataNodes.clear();
  214. finalJson.live_data_nodes.forEach(function (ldn) {
  215. dataNodes.pushObject(App.Host.find(ldn));
  216. });
  217. }
  218. // Decommission data nodes
  219. dataNodes = e.get('decommissionDataNodes');
  220. if (dataNodes) {
  221. dataNodes.clear();
  222. finalJson.decommission_data_nodes.forEach(function (ldn) {
  223. dataNodes.pushObject(App.Host.find(ldn));
  224. });
  225. }
  226. // Dead data nodes
  227. dataNodes = e.get('deadDataNodes');
  228. if (dataNodes) {
  229. dataNodes.clear();
  230. finalJson.dead_data_nodes.forEach(function (ldn) {
  231. dataNodes.pushObject(App.Host.find(ldn));
  232. });
  233. }
  234. });
  235. break;
  236. case 'MAPREDUCE':
  237. finalJson = this.mapreduceMapper(service);
  238. App.MapReduceService.find().map(function (e) {
  239. e.set("version", finalJson.version);
  240. e.set("jobTrackerStartTime", finalJson.job_tracker_start_time);
  241. e.set("jobTrackerHeapUsed", finalJson.job_tracker_heap_used);
  242. e.set("jobTrackerHeapMax", finalJson.job_tracker_heap_max);
  243. e.set("mapSlots", finalJson.map_slots);
  244. e.set("reduceSlots", finalJson.reduce_slots);
  245. e.set("jobsSubmitted", finalJson.jobs_submitted);
  246. e.set("jobsCompleted", finalJson.jobs_completed);
  247. e.set("mapSlotsOccupied", finalJson.map_slots_occupied);
  248. e.set("mapSlotsReserved", finalJson.map_slots_reserved);
  249. e.set("reduceSlotsOccupied", finalJson.reduce_slots_occupied);
  250. e.set("reduceSlotsReserved", finalJson.reduce_slots_reserved);
  251. e.set("mapsRunning", finalJson.maps_running);
  252. e.set("mapsWaiting", finalJson.maps_waiting);
  253. e.set("reducesRunning", finalJson.reduces_running);
  254. e.set("reducesWaiting", finalJson.reduces_waiting);
  255. e.set("trackersDecommissioned", finalJson.trackers_decommissioned);
  256. })
  257. break;
  258. case 'HBASE':
  259. finalJson = this.hbaseMapper(service);
  260. App.HBaseService.find().map(function (e) {
  261. e.set("version", finalJson.version);
  262. e.set("masterStartTime", finalJson.master_start_time);
  263. e.set("masterActiveTime", finalJson.master_active_time);
  264. e.set("averageLoad", finalJson.average_load);
  265. e.set("regionsInTransition", finalJson.regions_in_transition);
  266. e.set("revision", finalJson.revision);
  267. e.set("heapMemoryUsed", finalJson.heap_memory_used);
  268. e.set("heapMemoryMax", finalJson.heap_memory_max);
  269. })
  270. break;
  271. default:
  272. this.otherMapper(service);
  273. }
  274. },
  275. otherMapper: function (item) {
  276. var result = [];
  277. if (App.Service.find(item.ServiceInfo.service_name).get("serviceName") == item.ServiceInfo.service_name) {
  278. //update other service
  279. }
  280. },
  281. hdfsMapper: function (item) {
  282. var result = [];
  283. var finalConfig = jQuery.extend({}, this.config);
  284. // Change the JSON so that it is easy to map
  285. var hdfsConfig = this.hdfsConfig;
  286. item.components.forEach(function (component) {
  287. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "NAMENODE") {
  288. item.nameNodeComponent = component;
  289. finalConfig = jQuery.extend(finalConfig, hdfsConfig);
  290. // Get the live, dead & decommission nodes from string json
  291. var liveNodesJson = App.parseJSON(component.ServiceComponentInfo.LiveNodes);
  292. var deadNodesJson = App.parseJSON(component.ServiceComponentInfo.DeadNodes);
  293. var decommissionNodesJson = App.parseJSON(component.ServiceComponentInfo.DecomNodes);
  294. item.live_data_nodes = [];
  295. item.dead_data_nodes = [];
  296. item.decommission_data_nodes = [];
  297. for (var ln in liveNodesJson) {
  298. item.live_data_nodes.push(ln);
  299. }
  300. for (var dn in deadNodesJson) {
  301. item.dead_data_nodes.push(dn);
  302. }
  303. for (var dcn in decommissionNodesJson) {
  304. item.decommission_data_nodes.push(dcn);
  305. }
  306. }
  307. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "SECONDARY_NAMENODE") {
  308. item.snameNodeComponent = component;
  309. }
  310. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "DATANODE") {
  311. if (!item.data_nodes) {
  312. item.data_nodes = [];
  313. }
  314. if (component.host_components) {
  315. component.host_components.forEach(function (hc) {
  316. item.data_nodes.push(hc.HostRoles.host_name);
  317. });
  318. }
  319. }
  320. });
  321. // Map
  322. var finalJson = this.parseIt(item, finalConfig);
  323. finalJson.quick_links = [1, 2, 3, 4];
  324. return finalJson;
  325. },
  326. mapreduceMapper: function (item) {
  327. // Change the JSON so that it is easy to map
  328. var result = [];
  329. var finalConfig = jQuery.extend({}, this.config);
  330. var mapReduceConfig = this.mapReduceConfig;
  331. item.components.forEach(function (component) {
  332. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "JOBTRACKER") {
  333. item.jobTrackerComponent = component;
  334. finalConfig = jQuery.extend(finalConfig, mapReduceConfig);
  335. // Get the live, gray & black nodes from string json
  336. item.map_slots = 0;
  337. item.reduce_slots = 0;
  338. var liveNodesJson = App.parseJSON(component.ServiceComponentInfo.AliveNodes);
  339. var grayNodesJson = App.parseJSON(component.ServiceComponentInfo.GrayListedNodes);
  340. var blackNodesJson = App.parseJSON(component.ServiceComponentInfo.BlackListedNodes);
  341. item.alive_trackers = [];
  342. item.gray_list_trackers = [];
  343. item.black_list_trackers = [];
  344. if (liveNodesJson != null) {
  345. liveNodesJson.forEach(function (nj) {
  346. item.alive_trackers.push(nj.hostname);
  347. if (nj.slots && nj.slots.map_slots)
  348. item.map_slots += nj.slots.map_slots;
  349. if (nj.slots && nj.slots.map_slots_used)
  350. item.map_slots_used += nj.slots.map_slots_used;
  351. if (nj.slots && nj.slots.reduce_slots)
  352. item.reduce_slots += nj.slots.reduce_slots;
  353. if (nj.slots && nj.slots.reduce_slots_used)
  354. item.reduce_slots_used += nj.slots.reduce_slots_used;
  355. });
  356. }
  357. if (grayNodesJson != null) {
  358. grayNodesJson.forEach(function (nj) {
  359. item.gray_list_trackers.push(nj.hostname);
  360. });
  361. }
  362. if (blackNodesJson != null) {
  363. blackNodesJson.forEach(function (nj) {
  364. item.black_list_trackers.push(nj.hostname);
  365. });
  366. }
  367. }
  368. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "TASKTRACKER") {
  369. if (!item.task_trackers) {
  370. item.task_trackers = [];
  371. }
  372. if (component.host_components) {
  373. component.host_components.forEach(function (hc) {
  374. item.task_trackers.push(hc.HostRoles.host_name);
  375. });
  376. }
  377. }
  378. });
  379. // Map
  380. finalJson = this.parseIt(item, finalConfig);
  381. finalJson.quick_links = [5, 6, 7, 8, 9, 10, 11, 12];
  382. return finalJson;
  383. },
  384. hbaseMapper: function (item) {
  385. // Change the JSON so that it is easy to map
  386. var result = [];
  387. var finalConfig = jQuery.extend({}, this.config);
  388. var hbaseConfig = this.hbaseConfig;
  389. item.components.forEach(function (component) {
  390. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HBASE_MASTER") {
  391. item.masterComponent = component;
  392. finalConfig = jQuery.extend(finalConfig, hbaseConfig);
  393. var regionsArray = App.parseJSON(component.ServiceComponentInfo.RegionsInTransition);
  394. item.regions_in_transition = regionsArray == null ? 0 : regionsArray.length;
  395. }
  396. if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HBASE_REGIONSERVER") {
  397. if (!item.region_servers) {
  398. item.region_servers = [];
  399. }
  400. if (component.host_components) {
  401. component.host_components.forEach(function (hc) {
  402. item.region_servers.push(hc.HostRoles.host_name);
  403. });
  404. }
  405. }
  406. });
  407. // Map
  408. finalJson = this.parseIt(item, finalConfig);
  409. finalJson.quick_links = [13, 14, 15, 16, 17, 18];
  410. return finalJson;
  411. },
  412. _update: function(model, json){
  413. var content = model.find();
  414. var addArray = [];
  415. for(var i in json){
  416. var item = json[i];
  417. var oldItem = content.findProperty('id', item.id);
  418. if(oldItem){
  419. for(var field in item){ ///<--
  420. if(field !== 'id'){
  421. oldItem.set(field, item[field]); //<--
  422. }
  423. }
  424. } else {
  425. addArray.push(item);
  426. }
  427. }
  428. App.store.loadMany(model, addArray);
  429. }
  430. });