installer.js 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  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. var stringUtils = require('utils/string_utils');
  20. var validator = require('utils/validator');
  21. App.InstallerController = App.WizardController.extend({
  22. name: 'installerController',
  23. isCheckInProgress: false,
  24. totalSteps: 11,
  25. content: Em.Object.create({
  26. cluster: null,
  27. installOptions: null,
  28. hosts: null,
  29. services: null,
  30. slaveComponentHosts: null,
  31. masterComponentHosts: null,
  32. serviceConfigProperties: null,
  33. advancedServiceConfig: null,
  34. configGroups: [],
  35. slaveGroupProperties: null,
  36. stacks: null,
  37. clients: [],
  38. /**
  39. * recommendations for host groups loaded from server
  40. */
  41. recommendations: null,
  42. /**
  43. * recommendationsHostGroups - current component assignment after 5 and 6 steps,
  44. * or adding hiveserver2 interactive on "configure services" page
  45. * (uses for host groups validation and to load recommended configs)
  46. */
  47. recommendationsHostGroups: null,
  48. controllerName: 'installerController'
  49. }),
  50. /**
  51. * Wizard properties in local storage, which should be cleaned right after wizard has been finished
  52. */
  53. dbPropertiesToClean: [
  54. 'service',
  55. 'hosts',
  56. 'masterComponentHosts',
  57. 'slaveComponentHosts',
  58. 'cluster',
  59. 'allHostNames',
  60. 'installOptions',
  61. 'allHostNamesPattern',
  62. 'serviceComponents',
  63. 'clientInfo',
  64. 'selectedServiceNames',
  65. 'serviceConfigGroups',
  66. 'serviceConfigProperties',
  67. 'fileNamesToUpdate',
  68. 'bootStatus',
  69. 'stacksVersions',
  70. 'currentStep',
  71. 'serviceInfo',
  72. 'hostInfo',
  73. 'recommendations',
  74. 'recommendationsHostGroups',
  75. 'recommendationsConfigs'
  76. ],
  77. init: function () {
  78. this._super();
  79. this.get('isStepDisabled').setEach('value', true);
  80. this.get('isStepDisabled').pushObject(Ember.Object.create({
  81. step: 0,
  82. value: true
  83. }));
  84. },
  85. /**
  86. * redefined connectOutlet method to avoid view loading by unauthorized user
  87. * @param view
  88. * @param content
  89. */
  90. connectOutlet: function (view, content) {
  91. if (App.db.getAuthenticated()) {
  92. this._super(view, content);
  93. }
  94. },
  95. getCluster: function () {
  96. return jQuery.extend({}, this.get('clusterStatusTemplate'));
  97. },
  98. getHosts: function () {
  99. return [];
  100. },
  101. /**
  102. * Remove host from model. Used at <code>Confirm hosts(step2)</code> step
  103. * @param hosts Array of hosts, which we want to delete
  104. */
  105. removeHosts: function (hosts) {
  106. var dbHosts = this.getDBProperty('hosts');
  107. hosts.forEach(function (_hostInfo) {
  108. var host = _hostInfo.name;
  109. delete dbHosts[host];
  110. });
  111. this.setDBProperty('hosts', dbHosts);
  112. },
  113. /**
  114. * Load confirmed hosts.
  115. * Will be used at <code>Assign Masters(step5)</code> step
  116. */
  117. loadConfirmedHosts: function () {
  118. this.set('content.hosts', this.getDBProperty('hosts') || {});
  119. },
  120. /**
  121. * Load services data. Will be used at <code>Select services(step4)</code> step
  122. */
  123. loadServices: function () {
  124. var dfd = $.Deferred();
  125. var self = this;
  126. var stackServices = App.StackService.find().mapProperty('serviceName');
  127. if (!(stackServices && !!stackServices.length && App.StackService.find().objectAt(0).get('stackVersion') == App.get('currentStackVersionNumber'))) {
  128. this.loadServiceComponents().complete(function () {
  129. self.set('content.services', App.StackService.find().forEach(function (item) {
  130. // user the service version from VersionDefinition
  131. item.set('serviceVersionDisplay', App.Stack.find().findProperty('isSelected', true).get('stackServices').findProperty('name', item.get('serviceName')).get('latestVersion'));
  132. }));
  133. dfd.resolve();
  134. });
  135. } else {
  136. dfd.resolve();
  137. }
  138. return dfd.promise();
  139. },
  140. /**
  141. * total set of hosts registered to cluster, analog of App.Host model,
  142. * used in Installer wizard until hosts are installed
  143. */
  144. allHosts: function () {
  145. var rawHosts = this.get('content.hosts');
  146. var masterComponents = this.get('content.masterComponentHosts');
  147. var slaveComponents = this.get('content.slaveComponentHosts');
  148. var hosts = [];
  149. masterComponents.forEach(function (component) {
  150. var host = rawHosts[component.hostName];
  151. if (host.hostComponents) {
  152. host.hostComponents.push(Em.Object.create({
  153. componentName: component.component,
  154. displayName: component.display_name
  155. }));
  156. } else {
  157. rawHosts[component.hostName].hostComponents = [
  158. Em.Object.create({
  159. componentName: component.component,
  160. displayName: component.display_name
  161. })
  162. ]
  163. }
  164. });
  165. slaveComponents.forEach(function (component) {
  166. component.hosts.forEach(function (rawHost) {
  167. var host = rawHosts[rawHost.hostName];
  168. if (host.hostComponents) {
  169. host.hostComponents.push(Em.Object.create({
  170. componentName: component.componentName,
  171. displayName: component.displayName
  172. }));
  173. } else {
  174. rawHosts[rawHost.hostName].hostComponents = [
  175. Em.Object.create({
  176. componentName: component.componentName,
  177. displayName: component.displayName
  178. })
  179. ]
  180. }
  181. });
  182. });
  183. for (var hostName in rawHosts) {
  184. var host = rawHosts[hostName];
  185. var disksOverallCapacity = 0;
  186. var diskFree = 0;
  187. host.disk_info.forEach(function (disk) {
  188. disksOverallCapacity += parseFloat(disk.size);
  189. diskFree += parseFloat(disk.available);
  190. });
  191. hosts.pushObject(Em.Object.create({
  192. id: host.name,
  193. ip: host.ip,
  194. osType: host.os_type,
  195. osArch: host.os_arch,
  196. hostName: host.name,
  197. publicHostName: host.name,
  198. cpu: host.cpu,
  199. memory: host.memory,
  200. diskInfo: host.disk_info,
  201. diskTotal: disksOverallCapacity / (1024 * 1024),
  202. diskFree: diskFree / (1024 * 1024),
  203. hostComponents: host.hostComponents || []
  204. }
  205. ))
  206. }
  207. return hosts;
  208. }.property('content.hosts'),
  209. stacks: [],
  210. /**
  211. * stack names used as auxiliary data to query stacks by name
  212. */
  213. stackNames: [],
  214. /**
  215. * Load stacks data from server or take exist data from in memory variable {{content.stacks}}
  216. * The series of API calls will be called When landing first time on Select Stacks page
  217. * or on hitting refresh post select stacks page in installer wizard
  218. */
  219. loadStacks: function () {
  220. var stacks = this.get('content.stacks');
  221. var dfd = $.Deferred();
  222. App.configsCollection.clearAll();
  223. App.Section.find().clear();
  224. App.SubSection.find().clear();
  225. App.SubSectionTab.find().clear();
  226. App.Tab.find().clear();
  227. this.set('stackConfigsLoaded', false);
  228. if (stacks && stacks.get('length')) {
  229. App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
  230. dfd.resolve(true);
  231. } else {
  232. App.ajax.send({
  233. name: 'wizard.stacks',
  234. sender: this,
  235. success: 'loadStacksSuccessCallback',
  236. error: 'loadStacksErrorCallback'
  237. }).complete(function () {
  238. dfd.resolve(false);
  239. });
  240. }
  241. return dfd.promise();
  242. },
  243. /**
  244. * Send queries to load versions for each stack
  245. */
  246. loadStacksSuccessCallback: function (data) {
  247. this.get('stacks').clear();
  248. this.set('stackNames', data.items.mapProperty('Stacks.stack_name'));
  249. },
  250. /**
  251. * onError callback for loading stacks data
  252. */
  253. loadStacksErrorCallback: function () {
  254. },
  255. /**
  256. * query every stack names from server
  257. * @return {Array}
  258. */
  259. loadStacksVersions: function () {
  260. var requests = [];
  261. this.get('stackNames').forEach(function (stackName) {
  262. requests.push(App.ajax.send({
  263. name: 'wizard.stacks_versions_definitions',
  264. sender: this,
  265. data: {
  266. stackName: stackName
  267. },
  268. success: 'loadStacksVersionsDefinitionsSuccessCallback',
  269. error: 'loadStacksVersionsErrorCallback'
  270. }));
  271. }, this);
  272. this.set('loadStacksRequestsCounter', requests.length);
  273. return requests;
  274. },
  275. /**
  276. * Counter for counting number of successful requests to load stack versions
  277. */
  278. loadStacksRequestsCounter: 0,
  279. /**
  280. * Parse loaded data and create array of stacks objects
  281. */
  282. loadStacksVersionsDefinitionsSuccessCallback: function (data) {
  283. var self = this;
  284. var stacks = App.db.getStacks();
  285. var repos = App.db.getRepos();
  286. var isStacksExistInDb = stacks && stacks.length;
  287. if (isStacksExistInDb) {
  288. stacks.forEach(function (_stack) {
  289. var stack = data.items.findProperty('VersionDefinition.repository_version', _stack.repository_version);
  290. if (stack) {
  291. stack.VersionDefinition.is_selected = _stack.is_selected;
  292. }
  293. }, this);
  294. }
  295. var versionDefinition = data.items[0];
  296. // to display repos panel, should map all available operating systems including empty ones
  297. this.getSupportedOSList(versionDefinition.VersionDefinition.stack_name, versionDefinition.VersionDefinition.stack_version).complete(function () {
  298. var existedOS = versionDefinition.operating_systems;
  299. var existedMap = {};
  300. existedOS.map(function (existedOS) {
  301. existedOS.isSelected = true;
  302. existedMap[existedOS.OperatingSystems.os_type] = existedOS;
  303. });
  304. self.get('allSupportedOS').forEach(function(supportedOS) {
  305. if(!existedMap[supportedOS.OperatingSystems.os_type]) {
  306. supportedOS.isSelected = false;
  307. supportedOS.repositories.forEach(function(repo) {
  308. repo.Repositories.base_url = '';
  309. });
  310. existedOS.push(supportedOS);
  311. }
  312. });
  313. App.stackMapper.map(data.items, "VersionDefinition");
  314. if (!self.decrementProperty('loadStacksRequestsCounter')) {
  315. var versionData = self.getSelectedRepoVersionData();
  316. if (versionData) {
  317. self.postVersionDefinitionFile(versionData.isXMLdata, versionData.data).done(function (versionInfo) {
  318. self.mergeChanges(repos, stacks);
  319. App.Stack.find().setEach('isSelected', false);
  320. App.Stack.find().findProperty('id', versionInfo.stackNameVersion + "-" + versionInfo.actualVersion).set('isSelected', true);
  321. self.setSelected(isStacksExistInDb);
  322. });
  323. } else {
  324. self.setSelected(isStacksExistInDb);
  325. }
  326. }
  327. });
  328. },
  329. mergeChanges: function (repos, stacks) {
  330. repos.forEach(function (repo) {
  331. App.Repository.find().findProperty('id', repo.id).set('baseUrl', repo.base_url);
  332. });
  333. stacks.forEach(function (_stack) {
  334. var stack = App.Stack.find().findProperty('id', _stack.id);
  335. if (stack) {
  336. stack.set('useRedhatSatellite', _stack.use_redhat_satellite);
  337. }
  338. });
  339. },
  340. setSelected: function (isStacksExistInDb) {
  341. if (!isStacksExistInDb) {
  342. var defaultStackVersion = App.Stack.find().findProperty('stackNameVersion', App.defaultStackVersion);
  343. if (defaultStackVersion) {
  344. defaultStackVersion.set('isSelected', true)
  345. } else {
  346. App.Stack.find().objectAt(0).set('isSelected', true);
  347. }
  348. }
  349. this.set('content.stacks', App.Stack.find());
  350. App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
  351. },
  352. /**
  353. * Get the the repo version (to install) info, this data will be POST
  354. * @method startDeploy
  355. */
  356. getSelectedRepoVersionData: function () {
  357. var vdfData = App.db.getLocalRepoVDFData();
  358. var selectedStack = App.Stack.find().findProperty('isSelected', true);
  359. var isXMLdata = false;
  360. var data = {};
  361. if (selectedStack && selectedStack.get('showAvailable')) {
  362. //meaning user selected a public repo
  363. data = {
  364. "VersionDefinition": {
  365. "available": selectedStack.get('id')
  366. }
  367. };
  368. isXMLdata = false;
  369. } else if (vdfData && validator.isValidURL(vdfData)) {
  370. // meaning user uploaded a VDF via entering URL
  371. data = {
  372. "VersionDefinition": {
  373. "version_url": vdfData
  374. }
  375. };
  376. isXMLdata = false;
  377. } else if (vdfData) {
  378. // meaning user uploaded a local VDF.xml file
  379. isXMLdata = true;
  380. data = vdfData;
  381. } else {
  382. return null;
  383. }
  384. return {
  385. isXMLdata: isXMLdata,
  386. data: data
  387. };
  388. },
  389. /**
  390. * onError callback for loading stacks data
  391. */
  392. loadStacksVersionsErrorCallback: function () {
  393. },
  394. /**
  395. * check server version and web client version
  396. */
  397. checkServerClientVersion: function () {
  398. var dfd = $.Deferred();
  399. var self = this;
  400. self.getServerVersion().done(function () {
  401. dfd.resolve();
  402. });
  403. return dfd.promise();
  404. },
  405. getServerVersion: function () {
  406. return App.ajax.send({
  407. name: 'ambari.service',
  408. sender: this,
  409. data: {
  410. fields: '?fields=RootServiceComponents/component_version,RootServiceComponents/properties/server.os_family&minimal_response=true'
  411. },
  412. success: 'getServerVersionSuccessCallback',
  413. error: 'getServerVersionErrorCallback'
  414. });
  415. },
  416. getServerVersionSuccessCallback: function (data) {
  417. var clientVersion = App.get('version');
  418. var serverVersion = (data.RootServiceComponents.component_version).toString();
  419. this.set('ambariServerVersion', serverVersion);
  420. if (clientVersion) {
  421. this.set('versionConflictAlertBody', Em.I18n.t('app.versionMismatchAlert.body').format(serverVersion, clientVersion));
  422. this.set('isServerClientVersionMismatch', clientVersion != serverVersion);
  423. } else {
  424. this.set('isServerClientVersionMismatch', false);
  425. }
  426. App.set('isManagedMySQLForHiveEnabled', App.config.isManagedMySQLForHiveAllowed(data.RootServiceComponents.properties['server.os_family']));
  427. },
  428. getServerVersionErrorCallback: function () {
  429. },
  430. /**
  431. * set stacks from server to content and local DB
  432. */
  433. setStacks: function () {
  434. var stacks = App.Stack.find() || [];
  435. Em.assert('Stack model is not populated', stacks.get('length'));
  436. App.db.setStacks(stacks.slice());
  437. this.set('content.stacks', stacks);
  438. var repos = App.Repository.find() || [];
  439. App.db.setRepos(repos.slice());
  440. },
  441. /**
  442. * Save data to model
  443. * @param stepController App.WizardStep4Controller
  444. */
  445. saveServices: function (stepController) {
  446. var selectedServiceNames = [];
  447. var installedServiceNames = [];
  448. stepController.filterProperty('isSelected').forEach(function (item) {
  449. selectedServiceNames.push(item.get('serviceName'));
  450. });
  451. stepController.filterProperty('isInstalled').forEach(function (item) {
  452. installedServiceNames.push(item.get('serviceName'));
  453. });
  454. this.set('content.services', App.StackService.find());
  455. this.set('content.selectedServiceNames', selectedServiceNames);
  456. this.set('content.installedServiceNames', installedServiceNames);
  457. this.setDBProperties({
  458. selectedServiceNames: selectedServiceNames,
  459. installedServiceNames: installedServiceNames
  460. });
  461. },
  462. /**
  463. * Save Master Component Hosts data to Main Controller
  464. * @param stepController App.WizardStep5Controller
  465. */
  466. saveMasterComponentHosts: function (stepController) {
  467. var obj = stepController.get('selectedServicesMasters'),
  468. hosts = this.getDBProperty('hosts');
  469. var masterComponentHosts = [];
  470. obj.forEach(function (_component) {
  471. masterComponentHosts.push({
  472. display_name: _component.get('display_name'),
  473. component: _component.get('component_name'),
  474. serviceId: _component.get('serviceId'),
  475. isInstalled: false,
  476. host_id: hosts[_component.get('selectedHost')].id
  477. });
  478. });
  479. this.setDBProperty('masterComponentHosts', masterComponentHosts);
  480. this.set('content.masterComponentHosts', masterComponentHosts);
  481. },
  482. /**
  483. * Load master component hosts data for using in required step controllers
  484. */
  485. loadMasterComponentHosts: function () {
  486. var props = this.getDBProperties(['masterComponentHosts', 'hosts']);
  487. var masterComponentHosts = props.masterComponentHosts,
  488. hosts = props.hosts || {},
  489. host_names = Em.keys(hosts);
  490. if (Em.isNone(masterComponentHosts)) {
  491. masterComponentHosts = [];
  492. }
  493. else {
  494. masterComponentHosts.forEach(function (component) {
  495. for (var i = 0; i < host_names.length; i++) {
  496. if (hosts[host_names[i]].id === component.host_id) {
  497. component.hostName = host_names[i];
  498. break;
  499. }
  500. }
  501. });
  502. }
  503. this.set("content.masterComponentHosts", masterComponentHosts);
  504. },
  505. loadCurrentHostGroups: function () {
  506. this.set("content.recommendationsHostGroups", this.getDBProperty('recommendationsHostGroups'));
  507. },
  508. loadRecommendationsConfigs: function () {
  509. App.router.set("wizardStep7Controller.recommendationsConfigs", this.getDBProperty('recommendationsConfigs'));
  510. },
  511. /**
  512. * Load master component hosts data for using in required step controllers
  513. */
  514. loadSlaveComponentHosts: function () {
  515. var props = this.getDBProperties(['slaveComponentHosts', 'hosts']);
  516. var slaveComponentHosts = props.slaveComponentHosts,
  517. hosts = props.hosts || {},
  518. host_names = Em.keys(hosts);
  519. if (!Em.isNone(slaveComponentHosts)) {
  520. slaveComponentHosts.forEach(function (component) {
  521. component.hosts.forEach(function (host) {
  522. for (var i = 0; i < host_names.length; i++) {
  523. if (hosts[host_names[i]].id === host.host_id) {
  524. host.hostName = host_names[i];
  525. break;
  526. }
  527. }
  528. });
  529. });
  530. }
  531. this.set("content.slaveComponentHosts", slaveComponentHosts);
  532. },
  533. /**
  534. * Load serviceConfigProperties to model
  535. */
  536. loadServiceConfigProperties: function () {
  537. var serviceConfigProperties = this.getDBProperty('serviceConfigProperties');
  538. this.set('content.serviceConfigProperties', serviceConfigProperties);
  539. },
  540. /**
  541. * Generate clients list for selected services and save it to model
  542. * @param stepController step4WizardController
  543. */
  544. saveClients: function (stepController) {
  545. var clients = [];
  546. stepController.get('content').filterProperty('isSelected', true).forEach(function (_service) {
  547. var client = _service.get('serviceComponents').filterProperty('isClient', true);
  548. client.forEach(function (clientComponent) {
  549. clients.pushObject({
  550. component_name: clientComponent.get('componentName'),
  551. display_name: clientComponent.get('displayName'),
  552. isInstalled: false
  553. });
  554. }, this);
  555. }, this);
  556. this.setDBProperty('clientInfo', clients);
  557. this.set('content.clients', clients);
  558. },
  559. /*
  560. * Post version definition file (.xml) to server, DRY_RUN = TRUE
  561. */
  562. postVersionDefinitionFile: function (isXMLdata, data) {
  563. var dfd = $.Deferred();
  564. var name = isXMLdata? 'wizard.step1.post_version_definition_file.xml' : 'wizard.step1.post_version_definition_file.url';
  565. App.ajax.send({
  566. name: name,
  567. sender: this,
  568. data: {
  569. dfd: dfd,
  570. data: data
  571. },
  572. success: 'postVersionDefinitionFileSuccessCallback',
  573. error: 'postVersionDefinitionFileErrorCallback'
  574. });
  575. return dfd.promise();
  576. },
  577. /**
  578. * onSuccess callback for postVersionDefinitionFile.
  579. */
  580. postVersionDefinitionFileSuccessCallback: function (_data, request, dataInfo) {
  581. if (_data.resources.length && _data.resources[0].VersionDefinition) {
  582. var data = _data.resources[0];
  583. var self = this;
  584. // load the data info to display for details and contents panel
  585. var response = {
  586. id : data.VersionDefinition.id,
  587. stackVersion : data.VersionDefinition.stack_version,
  588. stackName: data.VersionDefinition.stack_name,
  589. type: data.VersionDefinition.type,
  590. stackNameVersion: data.VersionDefinition.stack_name + '-' + data.VersionDefinition.stack_version, /// HDP-2.3
  591. actualVersion: data.VersionDefinition.repository_version, /// 2.3.4.0-3846
  592. version: data.VersionDefinition.release ? data.VersionDefinition.release.version: null, /// 2.3.4.0
  593. releaseNotes: data.VersionDefinition.release ? data.VersionDefinition.release.notes: null,
  594. displayName: data.VersionDefinition.release ? data.VersionDefinition.stack_name + '-' + data.VersionDefinition.release.version :
  595. data.VersionDefinition.stack_name + '-' + data.VersionDefinition.repository_version, //HDP-2.3.4.0
  596. repoVersionFullName : data.VersionDefinition.stack_name + '-' + data.VersionDefinition.repository_version,
  597. osList: data.operating_systems,
  598. updateObj: data
  599. };
  600. var services = [];
  601. data.VersionDefinition.services.forEach(function (service) {
  602. services.push({
  603. name: service.name,
  604. version: service.versions[0].version,
  605. components: service.versions[0].components
  606. });
  607. });
  608. response.services = services;
  609. // to display repos panel, should map all available operating systems including empty ones
  610. this.getSupportedOSList(response.stackName, response.stackVersion).complete(function () {
  611. var existedOS = data.operating_systems;
  612. var existedMap = {};
  613. existedOS.map(function (existedOS) {
  614. existedOS.isSelected = true;
  615. existedMap[existedOS.OperatingSystems.os_type] = existedOS;
  616. });
  617. self.get('allSupportedOS').forEach(function(supportedOS) {
  618. if(!existedMap[supportedOS.OperatingSystems.os_type]) {
  619. supportedOS.isSelected = false;
  620. supportedOS.repositories.forEach(function(repo) {
  621. repo.Repositories.base_url = '';
  622. });
  623. existedOS.push(supportedOS);
  624. }
  625. });
  626. App.stackMapper.map(_data.resources, "VersionDefinition");
  627. dataInfo.dfd.resolve(response);
  628. });
  629. }
  630. },
  631. /*
  632. * Post version definition file (.xml) to server in step 8
  633. */
  634. postVersionDefinitionFileStep8: function (isXMLdata, data) {
  635. var dfd = $.Deferred();
  636. var name = isXMLdata == true? 'wizard.step8.post_version_definition_file.xml' : 'wizard.step8.post_version_definition_file';
  637. App.ajax.send({
  638. name: name,
  639. sender: this,
  640. data: {
  641. dfd: dfd,
  642. data: data
  643. },
  644. success: 'postVersionDefinitionFileStep8SuccessCallback',
  645. error: 'postVersionDefinitionFileErrorCallback'
  646. });
  647. return dfd.promise();
  648. },
  649. /**
  650. * onSuccess callback for postVersionDefinitionFile.
  651. */
  652. postVersionDefinitionFileStep8SuccessCallback: function (response, request, data) {
  653. if (response.resources.length && response.resources[0].VersionDefinition) {
  654. data.dfd.resolve(
  655. {
  656. stackName: response.resources[0].VersionDefinition.stack_name,
  657. id: response.resources[0].VersionDefinition.id,
  658. stackVersion: response.resources[0].VersionDefinition.stack_version
  659. });
  660. }
  661. },
  662. /**
  663. * onError callback for postVersionDefinitionFile.
  664. */
  665. postVersionDefinitionFileErrorCallback: function (request, ajaxOptions, error, data, params) {
  666. params.dfd.reject(data);
  667. var header = Em.I18n.t('installer.step1.useLocalRepo.uploadFile.error.title');
  668. var body = "";
  669. if(request && request.responseText){
  670. try {
  671. var json = $.parseJSON(request.responseText);
  672. body = json.message;
  673. } catch (err) {}
  674. }
  675. App.showAlertPopup(header, body);
  676. },
  677. getSupportedOSList: function (stackName, stackVersion) {
  678. return App.ajax.send({
  679. name: 'wizard.step1.get_supported_os_types',
  680. sender: this,
  681. data: {
  682. stackName: stackName,
  683. stackVersion: stackVersion
  684. },
  685. success: 'getSupportedOSListSuccessCallback',
  686. error: 'getSupportedOSListErrorCallback'
  687. });
  688. },
  689. /**
  690. * onSuccess callback for getSupportedOSList.
  691. */
  692. getSupportedOSListSuccessCallback: function (response, request, data) {
  693. if (response.operating_systems) {
  694. this.set('allSupportedOS', response.operating_systems);
  695. }
  696. },
  697. /**
  698. * onError callback for getSupportedOSList
  699. */
  700. getSupportedOSListErrorCallback: function (request, ajaxOptions, error, data, params) {
  701. var header = Em.I18n.t('installer.step1.useLocalRepo.getSurpottedOs.error.title');
  702. var body = "";
  703. if(request && request.responseText){
  704. try {
  705. var json = $.parseJSON(request.responseText);
  706. body = json.message;
  707. } catch (err) {}
  708. }
  709. App.showAlertPopup(header, body);
  710. },
  711. updateRepoOSInfo: function (repoToUpdate, repo) {
  712. var deferred = $.Deferred();
  713. var repoVersion = this.prepareRepoForSaving(repo);
  714. App.ajax.send({
  715. name: 'admin.stack_versions.edit.repo',
  716. sender: this,
  717. data: {
  718. stackName: repoToUpdate.stackName,
  719. stackVersion: repoToUpdate.stackVersion,
  720. repoVersionId: repoToUpdate.id,
  721. repoVersion: repoVersion
  722. }
  723. }).success(function() {
  724. deferred.resolve([]);
  725. }).error(function() {
  726. deferred.resolve([]);
  727. });
  728. return deferred.promise();
  729. },
  730. /**
  731. * transform repo data into json for
  732. * saving changes to repository version
  733. * @param {Em.Object} repo
  734. * @returns {{operating_systems: Array}}
  735. */
  736. prepareRepoForSaving: function(repo) {
  737. var repoVersion = { "operating_systems": [] };
  738. var ambari_managed_repositories = !repo.get('useRedhatSatellite');
  739. repo.get('operatingSystems').forEach(function (os, k) {
  740. repoVersion.operating_systems.push({
  741. "OperatingSystems": {
  742. "os_type": os.get("osType"),
  743. "ambari_managed_repositories": ambari_managed_repositories
  744. },
  745. "repositories": []
  746. });
  747. os.get('repositories').forEach(function (repository) {
  748. repoVersion.operating_systems[k].repositories.push({
  749. "Repositories": {
  750. "base_url": repository.get('baseUrl'),
  751. "repo_id": repository.get('repoId'),
  752. "repo_name": repository.get('repoName')
  753. }
  754. });
  755. });
  756. });
  757. return repoVersion;
  758. },
  759. /**
  760. * Check validation of the customized local urls
  761. */
  762. checkRepoURL: function (wizardStep1Controller) {
  763. var selectedStack = this.get('content.stacks').findProperty('isSelected', true);
  764. selectedStack.set('reload', true);
  765. var nameVersionCombo = selectedStack.get('stackNameVersion');
  766. var stackName = nameVersionCombo.split('-')[0];
  767. var stackVersion = nameVersionCombo.split('-')[1];
  768. var dfd = $.Deferred();
  769. if (selectedStack && selectedStack.get('operatingSystems')) {
  770. this.set('validationCnt', selectedStack.get('repositories').filterProperty('isSelected').length);
  771. var verifyBaseUrl = !wizardStep1Controller.get('skipValidationChecked');
  772. selectedStack.get('operatingSystems').forEach(function (os) {
  773. if (os.get('isSelected')) {
  774. os.get('repositories').forEach(function (repo) {
  775. repo.setProperties({
  776. errorTitle: '',
  777. errorContent: '',
  778. validation: App.Repository.validation['INPROGRESS']
  779. });
  780. this.set('content.isCheckInProgress', true);
  781. App.ajax.send({
  782. name: 'wizard.advanced_repositories.valid_url',
  783. sender: this,
  784. data: {
  785. stackName: stackName,
  786. stackVersion: stackVersion,
  787. repoId: repo.get('repoId'),
  788. osType: os.get('osType'),
  789. osId: os.get('id'),
  790. dfd: dfd,
  791. data: {
  792. 'Repositories': {
  793. 'base_url': repo.get('baseUrl'),
  794. "verify_base_url": verifyBaseUrl
  795. }
  796. }
  797. },
  798. success: 'checkRepoURLSuccessCallback',
  799. error: 'checkRepoURLErrorCallback'
  800. });
  801. }, this);
  802. }
  803. }, this);
  804. }
  805. return dfd.promise();
  806. },
  807. /**
  808. * onSuccess callback for check Repo URL.
  809. */
  810. checkRepoURLSuccessCallback: function (response, request, data) {
  811. var selectedStack = this.get('content.stacks').findProperty('isSelected');
  812. if (selectedStack && selectedStack.get('operatingSystems')) {
  813. var os = selectedStack.get('operatingSystems').findProperty('id', data.osId);
  814. var repo = os.get('repositories').findProperty('repoId', data.repoId);
  815. if (repo) {
  816. repo.set('validation', App.Repository.validation['OK']);
  817. }
  818. }
  819. this.set('validationCnt', this.get('validationCnt') - 1);
  820. if (!this.get('validationCnt')) {
  821. this.set('content.isCheckInProgress', false);
  822. data.dfd.resolve();
  823. }
  824. },
  825. /**
  826. * onError callback for check Repo URL.
  827. */
  828. checkRepoURLErrorCallback: function (request, ajaxOptions, error, data, params) {
  829. var selectedStack = this.get('content.stacks').findProperty('isSelected', true);
  830. if (selectedStack && selectedStack.get('operatingSystems')) {
  831. var os = selectedStack.get('operatingSystems').findProperty('id', params.osId);
  832. var repo = os.get('repositories').findProperty('repoId', params.repoId);
  833. if (repo) {
  834. repo.setProperties({
  835. validation: App.Repository.validation['INVALID'],
  836. errorTitle: request.status + ":" + request.statusText,
  837. errorContent: $.parseJSON(request.responseText) ? $.parseJSON(request.responseText).message : ""
  838. });
  839. }
  840. }
  841. this.set('content.isCheckInProgress', false);
  842. params.dfd.reject();
  843. },
  844. loadMap: {
  845. '0': [
  846. {
  847. type: 'sync',
  848. callback: function () {
  849. this.load('cluster');
  850. }
  851. }
  852. ],
  853. '1': [
  854. {
  855. type: 'async',
  856. callback: function () {
  857. var dfd = $.Deferred();
  858. this.loadStacks().always(function() {
  859. App.router.get('clusterController').loadAmbariProperties().always(function() {
  860. dfd.resolve();
  861. });
  862. });
  863. return dfd.promise();
  864. }
  865. },
  866. {
  867. type: 'async',
  868. callback: function (stacksLoaded) {
  869. var dfd = $.Deferred();
  870. if (!stacksLoaded) {
  871. $.when.apply(this, this.loadStacksVersions()).done(function () {
  872. Em.run.later('sync', function() {
  873. dfd.resolve(stacksLoaded);
  874. }, 1000);
  875. });
  876. } else {
  877. dfd.resolve(stacksLoaded);
  878. }
  879. return dfd.promise();
  880. }
  881. }
  882. ],
  883. '2': [
  884. {
  885. type: 'sync',
  886. callback: function () {
  887. this.load('installOptions');
  888. }
  889. }
  890. ],
  891. '3': [
  892. {
  893. type: 'sync',
  894. callback: function () {
  895. this.loadConfirmedHosts();
  896. }
  897. }
  898. ],
  899. '4': [
  900. {
  901. type: 'async',
  902. callback: function () {
  903. return this.loadServices();
  904. }
  905. }
  906. ],
  907. '5': [
  908. {
  909. type: 'sync',
  910. callback: function () {
  911. this.setSkipSlavesStep(App.StackService.find().filterProperty('isSelected'), 6);
  912. this.loadMasterComponentHosts();
  913. this.loadConfirmedHosts();
  914. this.loadRecommendations();
  915. }
  916. }
  917. ],
  918. '6': [
  919. {
  920. type: 'sync',
  921. callback: function () {
  922. this.loadSlaveComponentHosts();
  923. this.loadClients();
  924. this.loadRecommendations();
  925. }
  926. }
  927. ],
  928. '7': [
  929. {
  930. type: 'async',
  931. callback: function () {
  932. this.loadServiceConfigGroups();
  933. this.loadServiceConfigProperties();
  934. this.loadCurrentHostGroups();
  935. this.loadRecommendationsConfigs();
  936. return this.loadConfigThemes();
  937. }
  938. }
  939. ]
  940. },
  941. /**
  942. * Clear all temporary data
  943. */
  944. finish: function () {
  945. this.setCurrentStep('0');
  946. this.clearStorageData();
  947. App.router.get('userSettingsController').postUserPref('show_bg', true);
  948. },
  949. /**
  950. * Save cluster provisioning state to the server
  951. * @param state cluster provisioning state
  952. */
  953. setClusterProvisioningState: function (state) {
  954. return App.ajax.send({
  955. name: 'cluster.save_provisioning_state',
  956. sender: this,
  957. data: {
  958. state: state
  959. }
  960. });
  961. },
  962. setStepsEnable: function () {
  963. for (var i = 0; i <= this.totalSteps; i++) {
  964. this.get('isStepDisabled').findProperty('step', i).set('value', i > this.get('currentStep'));
  965. }
  966. }.observes('currentStep'),
  967. setLowerStepsDisable: function (stepNo) {
  968. for (var i = 0; i < stepNo; i++) {
  969. var step = this.get('isStepDisabled').findProperty('step', i);
  970. step.set('value', true);
  971. }
  972. },
  973. /**
  974. * Compare jdk versions used for ambari and selected stack.
  975. * Validation check will fire only for non-custom jdk configuration.
  976. *
  977. * @param {Function} successCallback
  978. * @param {Function} failCallback
  979. */
  980. validateJDKVersion: function (successCallback, failCallback) {
  981. var selectedStack = App.Stack.find().findProperty('isSelected', true),
  982. currentJDKVersion = App.router.get('clusterController.ambariProperties')['java.version'],
  983. // use min as max, or max as min version, in case when some of them missed
  984. minJDKVersion = selectedStack.get('minJdkVersion') || selectedStack.get('maxJdkVersion'),
  985. maxJDKVersion = selectedStack.get('maxJdkVersion') || selectedStack.get('minJdkVersion'),
  986. t = Em.I18n.t,
  987. fCallback = failCallback || function() {},
  988. sCallback = successCallback || function() {};
  989. // Skip jdk check if min and max required version not set in stack definition.
  990. if (!minJDKVersion && !maxJDKVersion) {
  991. sCallback();
  992. return;
  993. }
  994. if (currentJDKVersion) {
  995. if (stringUtils.compareVersions(currentJDKVersion, minJDKVersion) < 0 ||
  996. stringUtils.compareVersions(maxJDKVersion, currentJDKVersion) < 0) {
  997. // checks and process only minor part for now
  998. var versionDistance = parseInt(maxJDKVersion.split('.')[1]) - parseInt(minJDKVersion.split('.')[1]);
  999. var versionsList = [minJDKVersion];
  1000. for (var i = 1; i < (versionDistance + 1); i++) {
  1001. versionsList.push("" + minJDKVersion.split('.')[0] + '.' + (+minJDKVersion.split('.')[1] + i));
  1002. }
  1003. var versionsString = stringUtils.getFormattedStringFromArray(versionsList, t('or'));
  1004. var popupBody = t('popup.jdkValidation.body').format(selectedStack.get('stackName') + ' ' + selectedStack.get('stackVersion'), versionsString, currentJDKVersion);
  1005. App.showConfirmationPopup(sCallback, popupBody, fCallback, t('popup.jdkValidation.header'), t('common.proceedAnyway'), true);
  1006. return;
  1007. }
  1008. }
  1009. sCallback();
  1010. }
  1011. });