stack_service.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. var App = require('app');
  19. require('utils/helper');
  20. require('models/service_config');
  21. /**
  22. * This model loads all services supported by the stack
  23. * The model maps to the http://hostname:8080/api/v1/stacks/HDP/versions/${versionNumber}/services?fields=StackServices/*,serviceComponents/*
  24. * @type {*}
  25. */
  26. App.StackService = DS.Model.extend({
  27. serviceName: DS.attr('string'),
  28. displayName: DS.attr('string'),
  29. comments: DS.attr('string'),
  30. configTypes: DS.attr('object'),
  31. serviceVersion: DS.attr('string'),
  32. serviceCheckSupported: DS.attr('boolean'),
  33. stackName: DS.attr('string'),
  34. stackVersion: DS.attr('string'),
  35. isSelected: DS.attr('boolean', {defaultValue: true}),
  36. isInstalled: DS.attr('boolean', {defaultValue: false}),
  37. isInstallable: DS.attr('boolean', {defaultValue: true}),
  38. stack: DS.belongsTo('App.Stack'),
  39. serviceComponents: DS.hasMany('App.StackServiceComponent'),
  40. configs: DS.attr('array'),
  41. requiredServices: DS.attr('array'),
  42. // Is the service a distributed filesystem
  43. isDFS: function () {
  44. var dfsServices = ['HDFS', 'GLUSTERFS'];
  45. return dfsServices.contains(this.get('serviceName'));
  46. }.property('serviceName'),
  47. // Primary DFS. used if there is more than one DFS in a stack.
  48. // Only one service in the stack should be tagged as primary DFS.
  49. isPrimaryDFS: function () {
  50. return this.get('serviceName') === 'HDFS';
  51. }.property('serviceName'),
  52. configTypesRendered: function () {
  53. var configTypes = this.get('configTypes');
  54. var renderedConfigTypes = $.extend(true, {}, configTypes);
  55. if (this.get('serviceName') == 'FALCON') {
  56. delete renderedConfigTypes['oozie-site'];
  57. }
  58. return renderedConfigTypes
  59. }.property('serviceName', 'configTypes'),
  60. displayNameOnSelectServicePage: function () {
  61. var displayName = this.get('displayName');
  62. console.info("displayName = " + displayName);
  63. var services = this.get('coSelectedServices').slice();
  64. var serviceDisplayNames = services.map(function (item) {
  65. return App.format.role(item);
  66. }, this);
  67. if (!!serviceDisplayNames.length) {
  68. serviceDisplayNames.unshift(displayName);
  69. displayName = serviceDisplayNames.join(" + ");
  70. }
  71. return displayName;
  72. }.property('coSelectedServices', 'serviceName'),
  73. isHiddenOnSelectServicePage: function () {
  74. var hiddenServices = ['MAPREDUCE2'];
  75. return hiddenServices.contains(this.get('serviceName')) || !this.get('isInstallable') || this.get('doNotShowAndInstall');
  76. }.property('serviceName', 'isInstallable'),
  77. doNotShowAndInstall: function () {
  78. var skipServices = [];
  79. if(!App.supports.installGanglia) {
  80. skipServices.push('GANGLIA');
  81. }
  82. if(App.router.get('clusterInstallCompleted') != true){
  83. skipServices.push('RANGER');
  84. }
  85. return skipServices.contains(this.get('serviceName'));
  86. }.property('serviceName'),
  87. // Is the service required for monitoring of other hadoop ecosystem services
  88. isMonitoringService: function () {
  89. var services = ['NAGIOS', 'GANGLIA'];
  90. return services.contains(this.get('serviceName'));
  91. }.property('serviceName'),
  92. // Is the service required for reporting host metrics
  93. isHostMetricsService: function () {
  94. var services = ['GANGLIA'];
  95. return services.contains(this.get('serviceName'));
  96. }.property('serviceName'),
  97. // Is the service required for reporting hadoop service metrics
  98. isServiceMetricsService: function () {
  99. var services = ['GANGLIA'];
  100. return services.contains(this.get('serviceName'));
  101. }.property('serviceName'),
  102. // Is the service required for reporting aleerts
  103. isAlertingService: function () {
  104. var services = ['NAGIOS'];
  105. return services.contains(this.get('serviceName'));
  106. }.property('serviceName'),
  107. coSelectedServices: function () {
  108. var coSelectedServices = App.StackService.coSelected[this.get('serviceName')];
  109. if (!!coSelectedServices) {
  110. return coSelectedServices;
  111. } else {
  112. return [];
  113. }
  114. }.property('serviceName'),
  115. hasClient: function () {
  116. var serviceComponents = this.get('serviceComponents');
  117. return serviceComponents.someProperty('isClient');
  118. }.property('serviceName'),
  119. hasMaster: function () {
  120. var serviceComponents = this.get('serviceComponents');
  121. return serviceComponents.someProperty('isMaster');
  122. }.property('serviceName'),
  123. hasSlave: function () {
  124. var serviceComponents = this.get('serviceComponents');
  125. return serviceComponents.someProperty('isSlave');
  126. }.property('serviceName'),
  127. hasNonMastersWithCustomAssignment: function () {
  128. var serviceComponents = this.get('serviceComponents');
  129. return serviceComponents.rejectProperty('isMaster').rejectProperty('cardinality', 'ALL').length > 0;
  130. }.property('serviceName'),
  131. isClientOnlyService: function () {
  132. var serviceComponents = this.get('serviceComponents');
  133. return serviceComponents.everyProperty('isClient');
  134. }.property('serviceName'),
  135. isNoConfigTypes: function () {
  136. var configTypes = this.get('configTypes');
  137. return !(configTypes && !!Object.keys(configTypes).length);
  138. }.property('configTypes'),
  139. customReviewHandler: function () {
  140. return App.StackService.reviewPageHandlers[this.get('serviceName')];
  141. }.property('serviceName'),
  142. /**
  143. * configCategories are fetched from App.StackService.configCategories.
  144. * Also configCategories that does not match any serviceComponent of a service and not included in the permissible default pattern are omitted
  145. */
  146. configCategories: function () {
  147. var configCategories = [];
  148. var configTypes = this.get('configTypes');
  149. var serviceComponents = this.get('serviceComponents');
  150. if (configTypes && Object.keys(configTypes).length) {
  151. var pattern = ["General", "CapacityScheduler", "FaultTolerance", "Isolation", "Performance", "KDC", "Kadmin",
  152. "^Advanced", "Env$", "^Custom", "Falcon - Oozie integration", "FalconStartupSite", "FalconRuntimeSite", "MetricCollector", "RepositoryConfigs", "Settings$"];
  153. configCategories = App.StackService.configCategories.call(this).filter(function (_configCategory) {
  154. var serviceComponentName = _configCategory.get('name');
  155. var isServiceComponent = serviceComponents.someProperty('componentName', serviceComponentName);
  156. if (isServiceComponent) return isServiceComponent;
  157. var result = false;
  158. pattern.forEach(function (_pattern) {
  159. var regex = new RegExp(_pattern);
  160. if (regex.test(serviceComponentName)) result = true;
  161. });
  162. return result;
  163. });
  164. }
  165. return configCategories;
  166. }.property('serviceName', 'configTypes', 'serviceComponents')
  167. });
  168. App.StackService.FIXTURES = [];
  169. App.StackService.displayOrder = [
  170. 'HDFS',
  171. 'GLUSTERFS',
  172. 'MAPREDUCE2',
  173. 'YARN',
  174. 'TEZ',
  175. 'NAGIOS',
  176. 'GANGLIA',
  177. 'HIVE',
  178. 'HBASE',
  179. 'PIG',
  180. 'SQOOP',
  181. 'OOZIE',
  182. 'ZOOKEEPER',
  183. 'FALCON',
  184. 'STORM',
  185. 'FLUME'
  186. ];
  187. //@TODO: Write unit test for no two keys in the object should have any intersecting elements in their values
  188. App.StackService.coSelected = {
  189. 'YARN': ['MAPREDUCE2']
  190. };
  191. App.StackService.reviewPageHandlers = {
  192. 'HIVE': {
  193. 'Database': 'loadHiveDbValue'
  194. },
  195. 'NAGIOS': {
  196. 'Administrator': 'loadNagiosAdminValue'
  197. },
  198. 'OOZIE': {
  199. 'Database': 'loadOozieDbValue'
  200. }
  201. };
  202. App.StackService.RangerAgents = ['HDFS','HBASE','HIVE','KNOX','STORM'];
  203. App.StackService.configCategories = function () {
  204. var serviceConfigCategories = [];
  205. switch (this.get('serviceName')) {
  206. case 'HDFS':
  207. serviceConfigCategories.pushObjects([
  208. App.ServiceConfigCategory.create({ name: 'NAMENODE', displayName: 'NameNode'}),
  209. App.ServiceConfigCategory.create({ name: 'SECONDARY_NAMENODE', displayName: 'Secondary NameNode'}),
  210. App.ServiceConfigCategory.create({ name: 'DATANODE', displayName: 'DataNode'}),
  211. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  212. ]);
  213. break;
  214. case 'GLUSTERFS':
  215. serviceConfigCategories.pushObjects([
  216. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  217. ]);
  218. break;
  219. case 'YARN':
  220. serviceConfigCategories.pushObjects([
  221. App.ServiceConfigCategory.create({ name: 'RESOURCEMANAGER', displayName: 'Resource Manager'}),
  222. App.ServiceConfigCategory.create({ name: 'NODEMANAGER', displayName: 'Node Manager'}),
  223. App.ServiceConfigCategory.create({ name: 'APP_TIMELINE_SERVER', displayName: 'Application Timeline Server'}),
  224. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
  225. App.ServiceConfigCategory.create({ name: 'FaultTolerance', displayName: 'Fault Tolerance'}),
  226. App.ServiceConfigCategory.create({ name: 'Isolation', displayName: 'Isolation'}),
  227. App.ServiceConfigCategory.create({ name: 'CapacityScheduler', displayName: 'Scheduler', siteFileName: 'capacity-scheduler.xml'})
  228. ]);
  229. break;
  230. case 'MAPREDUCE2':
  231. serviceConfigCategories.pushObjects([
  232. App.ServiceConfigCategory.create({ name: 'HISTORYSERVER', displayName: 'History Server'}),
  233. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  234. ]);
  235. break;
  236. case 'HIVE':
  237. serviceConfigCategories.pushObjects([
  238. App.ServiceConfigCategory.create({ name: 'HIVE_METASTORE', displayName: 'Hive Metastore'}),
  239. App.ServiceConfigCategory.create({ name: 'WEBHCAT_SERVER', displayName: 'WebHCat Server'}),
  240. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
  241. App.ServiceConfigCategory.create({ name: 'Performance', displayName: 'Performance'}),
  242. App.ServiceConfigCategory.create({ name: 'GrantSettings', displayName: 'Grant/Revoke Settings'})
  243. ]);
  244. break;
  245. case 'HBASE':
  246. serviceConfigCategories.pushObjects([
  247. App.ServiceConfigCategory.create({ name: 'HBASE_MASTER', displayName: 'HBase Master'}),
  248. App.ServiceConfigCategory.create({ name: 'HBASE_REGIONSERVER', displayName: 'RegionServer'}),
  249. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
  250. App.ServiceConfigCategory.create({ name: 'GrantSettings', displayName: 'Grant/Revoke Settings'})
  251. ]);
  252. break;
  253. case 'ZOOKEEPER':
  254. serviceConfigCategories.pushObjects([
  255. App.ServiceConfigCategory.create({ name: 'ZOOKEEPER_SERVER', displayName: 'ZooKeeper Server'})
  256. ]);
  257. break;
  258. case 'OOZIE':
  259. serviceConfigCategories.pushObjects([
  260. App.ServiceConfigCategory.create({ name: 'OOZIE_SERVER', displayName: 'Oozie Server'})
  261. ]);
  262. break;
  263. case 'FALCON':
  264. serviceConfigCategories.pushObjects([
  265. App.ServiceConfigCategory.create({ name: 'FALCON_SERVER', displayName: 'Falcon Server'}),
  266. App.ServiceConfigCategory.create({ name: 'Falcon - Oozie integration', displayName: 'Falcon - Oozie integration'}),
  267. App.ServiceConfigCategory.create({ name: 'FalconStartupSite', displayName: 'Falcon startup.properties'}),
  268. App.ServiceConfigCategory.create({ name: 'FalconRuntimeSite', displayName: 'Falcon runtime.properties'}),
  269. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  270. ]);
  271. break;
  272. case 'STORM':
  273. serviceConfigCategories.pushObjects([
  274. App.ServiceConfigCategory.create({ name: 'NIMBUS', displayName: 'Nimbus'}),
  275. App.ServiceConfigCategory.create({ name: 'SUPERVISOR', displayName: 'Supervisor'}),
  276. App.ServiceConfigCategory.create({ name: 'STORM_UI_SERVER', displayName: 'Storm UI Server'}),
  277. App.ServiceConfigCategory.create({ name: 'STORM_REST_API', displayName: 'Storm REST API Server'}),
  278. App.ServiceConfigCategory.create({ name: 'DRPC_SERVER', displayName: 'DRPC Server'}),
  279. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  280. ]);
  281. break;
  282. case 'TEZ':
  283. serviceConfigCategories.pushObjects([
  284. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  285. ]);
  286. break;
  287. case 'FLUME':
  288. serviceConfigCategories.pushObjects([
  289. App.ServiceConfigCategory.create({ name: 'FLUME_HANDLER', displayName: 'flume.conf', siteFileName: 'flume-conf', canAddProperty: false})
  290. ]);
  291. break;
  292. case 'KNOX':
  293. serviceConfigCategories.pushObjects([
  294. App.ServiceConfigCategory.create({ name: 'KNOX_GATEWAY', displayName: 'Knox Gateway'})
  295. ]);
  296. break;
  297. case 'KAFKA':
  298. serviceConfigCategories.pushObjects([
  299. App.ServiceConfigCategory.create({ name: 'KAFKA_BROKER', displayName: 'Kafka Broker'})
  300. ]);
  301. break;
  302. case 'KERBEROS':
  303. serviceConfigCategories.pushObjects([
  304. App.ServiceConfigCategory.create({ name: 'KDC', displayName: 'KDC'}),
  305. App.ServiceConfigCategory.create({ name: 'Kadmin', displayName: 'Kadmin'}),
  306. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  307. ]);
  308. break;
  309. case 'AMS':
  310. serviceConfigCategories.pushObjects([
  311. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
  312. App.ServiceConfigCategory.create({ name: 'MetricCollector', displayName: 'Metric Collector'})
  313. ]);
  314. break;
  315. case 'RANGER':
  316. serviceConfigCategories.pushObjects([
  317. App.ServiceConfigCategory.create({ name: 'AdminSettings', displayName: 'Admin Settings'}),
  318. App.ServiceConfigCategory.create({ name: 'DBSettings', displayName: 'DB Settings'}),
  319. App.ServiceConfigCategory.create({ name: 'RangerSettings', displayName: 'Ranger Settings'}),
  320. App.ServiceConfigCategory.create({ name: 'UnixAuthenticationSettings', displayName: 'Unix Authentication Settings'}),
  321. App.ServiceConfigCategory.create({ name: 'ADSettings', displayName: 'AD Settings'}),
  322. App.ServiceConfigCategory.create({ name: 'LDAPSettings', displayName: 'LDAP Settings'})
  323. ]);
  324. break;
  325. case 'PIG':
  326. break;
  327. case 'SQOOP':
  328. break;
  329. default:
  330. serviceConfigCategories.pushObjects([
  331. App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'})
  332. ]);
  333. }
  334. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}));
  335. if (App.StackService.RangerAgents.contains(this.get('serviceName'))) {
  336. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'RangerSettings', displayName: 'Ranger Settings'}));
  337. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'HDFSAuditSettings', displayName: 'HDFS Audit Settings'}));
  338. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'RepositoryConfigs', displayName: 'Ranger plugin repository and policy users'}));
  339. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'SSLRangerSettings', displayName: 'SSL Settings'}));
  340. }
  341. var configTypes = Object.keys(this.get('configTypes'));
  342. //Falcon has dependency on oozie-site but oozie-site advanced/custom section should not be shown on Falcon page
  343. if (this.get('serviceName') !== 'OOZIE') {
  344. configTypes = configTypes.without('oozie-site');
  345. }
  346. // Add Advanced section for every configType to all the services
  347. configTypes.forEach(function (type) {
  348. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({
  349. name: 'Advanced ' + type,
  350. displayName: Em.I18n.t('common.advanced') + " " + type,
  351. canAddProperty: false
  352. }));
  353. }, this);
  354. // Add custom section for every configType to all the services
  355. configTypes.forEach(function (type) {
  356. var configTypesWithNoCustomSection = ['capacity-scheduler','mapred-queue-acls','flume-conf', 'pig-properties','topology','users-ldif'];
  357. if (type.endsWith('-env') || type.endsWith('-log4j') || configTypesWithNoCustomSection.contains(type)) {
  358. return;
  359. }
  360. serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({
  361. name: 'Custom ' + type,
  362. displayName: Em.I18n.t('common.custom') + " " + type,
  363. siteFileName: type + '.xml',
  364. canAddProperty: true
  365. }));
  366. }, this);
  367. return serviceConfigCategories;
  368. };