installer.js 37 KB

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