step3_controller.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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. App.NameNodeFederationWizardStep3Controller = Em.Controller.extend(App.BlueprintMixin, {
  20. name: "nameNodeFederationWizardStep3Controller",
  21. selectedService: null,
  22. stepConfigs: [],
  23. serverConfigData: {},
  24. once: false,
  25. isLoaded: false,
  26. isConfigsLoaded: false,
  27. versionLoaded: true,
  28. hideDependenciesInfoBar: true,
  29. /**
  30. * Map of sites and properties to delete
  31. * @type Object
  32. */
  33. configsToRemove: {
  34. 'hdfs-site': ['dfs.namenode.shared.edits.dir', 'dfs.journalnode.edits.dir']
  35. },
  36. clearStep: function () {
  37. this.get('stepConfigs').clear();
  38. this.set('serverConfigData', {});
  39. this.set('isConfigsLoaded', false);
  40. this.set('isLoaded', false);
  41. },
  42. loadStep: function () {
  43. this.clearStep();
  44. this.loadConfigsTags();
  45. },
  46. loadConfigsTags: function () {
  47. return App.ajax.send({
  48. name: 'config.tags',
  49. sender: this,
  50. success: 'onLoadConfigsTags'
  51. });
  52. },
  53. onLoadConfigsTags: function (data) {
  54. var servicesModel = App.Service.find();
  55. var urlParams = '(type=hdfs-site&tag=' + data.Clusters.desired_configs['hdfs-site'].tag + ')';
  56. if (servicesModel.someProperty('serviceName', 'RANGER')) {
  57. urlParams += '|(type=core-site&tag=' + data.Clusters.desired_configs['core-site'].tag + ')' +
  58. '|(type=ranger-tagsync-site&tag=' + data.Clusters.desired_configs['ranger-tagsync-site'].tag + ')' +
  59. '|(type=ranger-hdfs-security&tag=' + data.Clusters.desired_configs['ranger-hdfs-security'].tag + ')'
  60. }
  61. if (servicesModel.someProperty('serviceName', 'ACCUMULO')) {
  62. urlParams += '|(type=accumulo-site&tag=' + data.Clusters.desired_configs['accumulo-site'].tag + ')';
  63. }
  64. App.ajax.send({
  65. name: 'admin.get.all_configurations',
  66. sender: this,
  67. data: {
  68. urlParams: urlParams
  69. },
  70. success: 'onLoadConfigs'
  71. });
  72. },
  73. onLoadConfigs: function (data) {
  74. this.set('serverConfigData', data);
  75. this.set('isConfigsLoaded', true);
  76. },
  77. onLoad: function () {
  78. if (this.get('isConfigsLoaded') && App.router.get('clusterController.isHDFSNameSpacesLoaded')) {
  79. var federationConfig = $.extend(true, {}, require('data/configs/wizards/federation_properties').federationConfig);
  80. if (App.get('hasNameNodeFederation')) {
  81. federationConfig.configs = federationConfig.configs.rejectProperty('firstRun');
  82. }
  83. federationConfig.configs = this.tweakServiceConfigs(federationConfig.configs);
  84. this.removeConfigs(this.get('configsToRemove'), this.get('serverConfigData'));
  85. this.renderServiceConfigs(federationConfig);
  86. this.set('isLoaded', true);
  87. }
  88. }.observes('isConfigsLoaded', 'App.router.clusterController.isHDFSNameSpacesLoaded'),
  89. prepareDependencies: function () {
  90. var ret = {};
  91. var configsFromServer = this.get('serverConfigData.items');
  92. var journalNodes = App.HostComponent.find().filterProperty('componentName', 'JOURNALNODE');
  93. var nameNodes = this.get('content.masterComponentHosts').filterProperty('component', 'NAMENODE');
  94. var hdfsSiteConfigs = configsFromServer.findProperty('type', 'hdfs-site').properties;
  95. var nameServices = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name');
  96. ret.nameServicesList = nameServices.join(',');
  97. ret.nameservice1 = nameServices[0];
  98. ret.newNameservice = this.get('content.nameServiceId');
  99. ret.namenode1 = hdfsSiteConfigs['dfs.namenode.rpc-address.' + ret.nameservice1 + '.nn1'].split(':')[0];
  100. ret.namenode2 = hdfsSiteConfigs['dfs.namenode.rpc-address.' + ret.nameservice1 + '.nn2'].split(':')[0];
  101. ret.newNameNode1Index = 'nn' + (nameNodes.length - 1);
  102. ret.newNameNode2Index = 'nn' + nameNodes.length;
  103. ret.newNameNode1 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[0];
  104. ret.newNameNode2 = nameNodes.filterProperty('isInstalled', false).mapProperty('hostName')[1];
  105. ret.journalnodes = journalNodes.map(function (c) {
  106. return c.get('hostName') + ':8485'
  107. }).join(';');
  108. ret.clustername = App.get('clusterName');
  109. var dfsHttpA = hdfsSiteConfigs['dfs.namenode.http-address'];
  110. ret.nnHttpPort = dfsHttpA ? dfsHttpA.split(':')[1] : 50070;
  111. var dfsHttpsA = hdfsSiteConfigs['dfs.namenode.https-address'];
  112. ret.nnHttpsPort = dfsHttpsA ? dfsHttpsA.split(':')[1] : 50470;
  113. var dfsRpcA = hdfsSiteConfigs['dfs.namenode.rpc-address'];
  114. ret.nnRpcPort = dfsRpcA ? dfsRpcA.split(':')[1] : 8020;
  115. ret.journalnode_edits_dir = hdfsSiteConfigs['dfs.journalnode.edits.dir'];
  116. return ret;
  117. },
  118. tweakServiceConfigs: function (configs) {
  119. var servicesModel = App.Service.find();
  120. var dependencies = this.prepareDependencies();
  121. var nameServices = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name');
  122. nameServices.push(dependencies.newNameservice);
  123. var result = [];
  124. var configsToRemove = [];
  125. var hdfsSiteConfigs = this.get('serverConfigData').items.findProperty('type', 'hdfs-site').properties;
  126. var wizardController = App.router.get(this.get('content.controllerName'));
  127. if (!hdfsSiteConfigs['dfs.namenode.servicerpc-address.' + dependencies.nameservice1 + '.nn1'] && !hdfsSiteConfigs['dfs.namenode.servicerpc-address.' + dependencies.nameservice1 + '.nn2']) {
  128. configsToRemove = configsToRemove.concat([
  129. 'dfs.namenode.servicerpc-address.{{nameservice1}}.nn1',
  130. 'dfs.namenode.servicerpc-address.{{nameservice1}}.nn2',
  131. 'dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode1Index}}',
  132. 'dfs.namenode.servicerpc-address.{{newNameservice}}.{{newNameNode2Index}}'
  133. ]);
  134. }
  135. if (servicesModel.someProperty('serviceName', 'RANGER')) {
  136. var hdfsRangerConfigs = this.get('serverConfigData').items.findProperty('type', 'ranger-hdfs-security').properties;
  137. var reponamePrefix = hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] === '{{repo_name}}' ? dependencies.clustername + '_hadoop_' : hdfsRangerConfigs['ranger.plugin.hdfs.service.name'] + '_';
  138. var coreSiteConfigs = this.get('serverConfigData').items.findProperty('type', 'core-site').properties;
  139. var defaultFSNS = coreSiteConfigs['fs.defaultFS'].split('hdfs://')[1];
  140. nameServices.forEach(function (nameService) {
  141. configs.push(this.createRangerServiceProperty(nameService, reponamePrefix, "ranger.tagsync.atlas.hdfs.instance." + App.get('clusterName') + ".nameservice." + nameService + ".ranger.service"));
  142. configs.push(this.createRangerServiceProperty(defaultFSNS, reponamePrefix, "ranger.tagsync.atlas.hdfs.instance." + App.get('clusterName') + ".ranger.service"));
  143. }, this);
  144. }
  145. if (servicesModel.someProperty('serviceName', 'ACCUMULO')) {
  146. var hdfsNameSpacesModel = App.HDFSService.find().objectAt(0).get('masterComponentGroups');
  147. var newNameSpace = this.get('content.nameServiceId');
  148. var volumesValue = nameServices.map(function (ns) {
  149. return 'hdfs://' + ns + '/apps/accumulo/data';
  150. }).join();
  151. var replacementsValue = nameServices.map(function (ns) {
  152. var hostName;
  153. if (ns === newNameSpace) {
  154. var hostNames = this.get('content.masterComponentHosts').filter(function (hc) {
  155. return hc.component === 'NAMENODE' && !hc.isInstalled;
  156. }).mapProperty('hostName');
  157. hostName = hostNames[0];
  158. } else {
  159. var nameSpaceObject = hdfsNameSpacesModel.findProperty('name', ns);
  160. hostName = nameSpaceObject && nameSpaceObject.hosts[0];
  161. }
  162. return 'hdfs://' + hostName + ':8020/apps/accumulo/data hdfs://' + ns + '/apps/accumulo/data';
  163. }, this).join();
  164. configs.push({
  165. name: 'instance.volumes',
  166. displayName: 'instance.volumes',
  167. isReconfigurable: false,
  168. value: volumesValue,
  169. recommendedValue: volumesValue,
  170. category: 'ACCUMULO',
  171. filename: 'accumulo-site',
  172. serviceName: 'MISC'
  173. }, {
  174. name: 'instance.volumes.replacements',
  175. displayName: 'instance.volumes.replacements',
  176. isReconfigurable: false,
  177. value: replacementsValue,
  178. recommendedValue: replacementsValue,
  179. category: 'ACCUMULO',
  180. filename: 'accumulo-site',
  181. serviceName: 'MISC'
  182. });
  183. }
  184. configs.forEach(function (config) {
  185. if (!configsToRemove.contains(config.name)) {
  186. config.isOverridable = false;
  187. config.name = wizardController.replaceDependencies(config.name, dependencies);
  188. config.displayName = wizardController.replaceDependencies(config.displayName, dependencies);
  189. config.value = wizardController.replaceDependencies(config.value, dependencies);
  190. config.recommendedValue = wizardController.replaceDependencies(config.recommendedValue, dependencies);
  191. result.push(config);
  192. }
  193. }, this);
  194. return result;
  195. },
  196. createRangerServiceProperty: function (nameservice, reponamePrefix, propertyName) {
  197. return {
  198. "name": propertyName,
  199. "displayName": propertyName,
  200. "isReconfigurable": false,
  201. "recommendedValue": reponamePrefix + nameservice,
  202. "value": reponamePrefix + nameservice,
  203. "category": "RANGER",
  204. "filename": "ranger-tagsync-site",
  205. "serviceName": 'MISC'
  206. };
  207. },
  208. removeConfigs: function (configsToRemove, configs) {
  209. Em.keys(configsToRemove).forEach(function (site) {
  210. var siteConfigs = configs.items.findProperty('type', site);
  211. if (siteConfigs) {
  212. configsToRemove[site].forEach(function (property) {
  213. delete siteConfigs.properties[property];
  214. });
  215. }
  216. });
  217. return configs;
  218. },
  219. renderServiceConfigs: function (_serviceConfig) {
  220. var serviceConfig = App.ServiceConfig.create({
  221. serviceName: _serviceConfig.serviceName,
  222. displayName: _serviceConfig.displayName,
  223. configCategories: [],
  224. showConfig: true,
  225. configs: []
  226. });
  227. _serviceConfig.configCategories.forEach(function (_configCategory) {
  228. if (App.Service.find().someProperty('serviceName', _configCategory.name)) {
  229. serviceConfig.configCategories.pushObject(_configCategory);
  230. }
  231. }, this);
  232. this.loadComponentConfigs(_serviceConfig, serviceConfig);
  233. this.get('stepConfigs').pushObject(serviceConfig);
  234. this.set('selectedService', this.get('stepConfigs').objectAt(0));
  235. this.set('once', true);
  236. },
  237. /**
  238. * Load child components to service config object
  239. * @param _componentConfig
  240. * @param componentConfig
  241. */
  242. loadComponentConfigs: function (_componentConfig, componentConfig) {
  243. _componentConfig.configs.forEach(function (_serviceConfigProperty) {
  244. var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty);
  245. componentConfig.configs.pushObject(serviceConfigProperty);
  246. serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable'));
  247. }, this);
  248. },
  249. isNextDisabled: function () {
  250. return !this.get('isLoaded') || (this.get('isLoaded') && this.get('selectedService.configs').someProperty('isValid', false));
  251. }.property('selectedService.configs.@each.isValid', 'isLoaded')
  252. });