installer_test.js 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. var App = require('app');
  19. require('models/cluster');
  20. require('controllers/wizard');
  21. require('controllers/installer');
  22. describe('App.InstallerController', function () {
  23. var installerController = App.InstallerController.create();
  24. after(function () {
  25. installerController.destroy();
  26. });
  27. describe('#init', function () {
  28. var c;
  29. beforeEach(function () {
  30. c = App.InstallerController.create({});
  31. });
  32. it('all steps are disabled by default', function () {
  33. expect(c.get('isStepDisabled.length')).to.be.above(0);
  34. expect(c.get('isStepDisabled').everyProperty('value', true)).to.be.ok;
  35. });
  36. });
  37. describe('#loadStacksVersionsSuccessCallback', function() {
  38. beforeEach(function () {
  39. sinon.stub(App.store, 'commit', Em.K);
  40. });
  41. afterEach(function () {
  42. App.store.commit.restore();
  43. });
  44. it ('Correct data', function() {
  45. installerController.set('loadStacksRequestsCounter', 1);
  46. installerController.loadStacksVersionsSuccessCallback(require('test/stack'));
  47. expect(installerController.get('content.stacks.length')).to.equal(2);
  48. expect(installerController.get('content.stacks').everyProperty('isSelected')).to.be.false;
  49. expect(installerController.get('content.stacks').mapProperty('id')).to.eql(['HDP-2.1','HDP-1.3']);
  50. });
  51. });
  52. describe('#getCluster', function() {
  53. it ('Should return merged clusterStatusTemplate', function() {
  54. installerController.set('clusterStatusTemplate', {
  55. name: 'template'
  56. });
  57. expect(installerController.getCluster()).to.eql({
  58. name: 'template'
  59. });
  60. });
  61. });
  62. describe('#getHosts', function() {
  63. it ('Should return empty array', function() {
  64. expect(installerController.getHosts()).to.eql([]);
  65. });
  66. });
  67. describe('#loadServices', function() {
  68. it ('Should resolve nothing', function() {
  69. var res = installerController.loadServices();
  70. res.then(function(data){
  71. expect(data).to.be.undefined;
  72. });
  73. });
  74. });
  75. describe('#checkRepoURL', function() {
  76. var stacks = Em.A([
  77. Em.Object.create({
  78. isSelected: false
  79. }),
  80. Em.Object.create({
  81. isSelected: true,
  82. reload: false,
  83. id: 'nn-cc',
  84. repositories: Em.A([
  85. Em.Object.create({
  86. isSelected: true
  87. })
  88. ]),
  89. operatingSystems: Em.A([
  90. Em.Object.create({
  91. isSelected: true,
  92. repositories: Em.A([
  93. Em.Object.create({
  94. errorTitle: '1',
  95. errorContent: '1',
  96. validation: ''
  97. })
  98. ])
  99. })
  100. ])
  101. })
  102. ]);
  103. var wizard = Em.Object.create({
  104. skipValidationChecked: true
  105. });
  106. it ('Should reload installed stacks', function() {
  107. installerController.set('content.stacks', stacks);
  108. installerController.checkRepoURL(wizard);
  109. var expected = [
  110. {
  111. "isSelected": false
  112. },
  113. {
  114. "isSelected": true,
  115. "reload": true,
  116. "id": "nn-cc",
  117. "repositories": [
  118. {
  119. "isSelected": true
  120. }
  121. ],
  122. "operatingSystems": [
  123. {
  124. "isSelected": true,
  125. "repositories": [
  126. {
  127. "errorTitle": "",
  128. "errorContent": "",
  129. "validation": "icon-repeat"
  130. }
  131. ]
  132. }
  133. ]
  134. }
  135. ];
  136. var res = JSON.parse(JSON.stringify(installerController.get('content.stacks')));
  137. expect(res).to.be.eql(expected);
  138. });
  139. });
  140. describe('#checkRepoURLSuccessCallback', function() {
  141. var stacks = Em.A([
  142. Em.Object.create({
  143. isSelected: false
  144. }),
  145. Em.Object.create({
  146. isSelected: true,
  147. reload: false,
  148. id: 'nn-cc',
  149. repositories: Em.A([
  150. Em.Object.create({
  151. repoId: 11,
  152. isSelected: true
  153. })
  154. ]),
  155. operatingSystems: Em.A([
  156. Em.Object.create({
  157. isSelected: true,
  158. id: 1,
  159. repositories: Em.A([
  160. Em.Object.create({
  161. repoId: 11,
  162. errorTitle: '1',
  163. errorContent: '1',
  164. validation: ''
  165. })
  166. ])
  167. })
  168. ])
  169. })
  170. ]);
  171. var resolve = false;
  172. var data = {
  173. osId: 1,
  174. repoId: 11,
  175. dfd: {
  176. resolve: function() {
  177. resolve = true;
  178. }
  179. }
  180. };
  181. it ('Should check stacks for sucess', function() {
  182. installerController.set('content.stacks', stacks);
  183. installerController.checkRepoURLSuccessCallback(null,null,data);
  184. var expected = [
  185. {
  186. "isSelected": false
  187. },
  188. {
  189. "isSelected": true,
  190. "reload": false,
  191. "id": "nn-cc",
  192. "repositories": [
  193. {
  194. "repoId": 11,
  195. "isSelected": true
  196. }
  197. ],
  198. "operatingSystems": [
  199. {
  200. "isSelected": true,
  201. "id": 1,
  202. "repositories": [
  203. {
  204. "repoId": 11,
  205. "errorTitle": "1",
  206. "errorContent": "1",
  207. "validation": "icon-ok"
  208. }
  209. ]
  210. }
  211. ]
  212. }
  213. ];
  214. var res = JSON.parse(JSON.stringify(installerController.get('content.stacks')));
  215. expect(resolve).to.be.true;
  216. expect(res).to.be.eql(expected);
  217. });
  218. });
  219. describe('#checkRepoURLErrorCallback', function() {
  220. var stacks = Em.A([
  221. Em.Object.create({
  222. isSelected: false
  223. }),
  224. Em.Object.create({
  225. isSelected: true,
  226. reload: false,
  227. id: 'nn-cc',
  228. repositories: Em.A([
  229. Em.Object.create({
  230. repoId: 11,
  231. isSelected: true
  232. })
  233. ]),
  234. operatingSystems: Em.A([
  235. Em.Object.create({
  236. isSelected: true,
  237. id: 1,
  238. repositories: Em.A([
  239. Em.Object.create({
  240. repoId: 11,
  241. errorTitle: '1',
  242. errorContent: '1',
  243. validation: ''
  244. })
  245. ])
  246. })
  247. ])
  248. })
  249. ]);
  250. var resolve = false;
  251. var data = {
  252. osId: 1,
  253. repoId: 11,
  254. dfd: {
  255. reject: function() {
  256. resolve = true;
  257. }
  258. }
  259. };
  260. it ('Should check stacks for error', function() {
  261. var req = {
  262. status: 500,
  263. statusText: 'error'
  264. };
  265. installerController.set('content.stacks', stacks);
  266. installerController.checkRepoURLErrorCallback(req,{},{},{},data);
  267. var expected = [
  268. {
  269. "isSelected": false
  270. },
  271. {
  272. "isSelected": true,
  273. "reload": false,
  274. "id": "nn-cc",
  275. "repositories": [
  276. {
  277. "repoId": 11,
  278. "isSelected": true
  279. }
  280. ],
  281. "operatingSystems": [
  282. {
  283. "isSelected": true,
  284. "id": 1,
  285. "repositories": [
  286. {
  287. "repoId": 11,
  288. "errorTitle": "500:error",
  289. "errorContent": "",
  290. "validation": "icon-exclamation-sign"
  291. }
  292. ]
  293. }
  294. ]
  295. }
  296. ];
  297. var res = JSON.parse(JSON.stringify(installerController.get('content.stacks')));
  298. expect(resolve).to.be.true;
  299. expect(res).to.be.eql(expected);
  300. });
  301. });
  302. describe('#loadStacks', function() {
  303. it ('Should resolve promise with true', function() {
  304. installerController.set('content.stacks', Em.Object.create({
  305. length: 2
  306. }));
  307. var res = installerController.loadStacks();
  308. res.then(function(data){
  309. expect(data).to.be.true;
  310. });
  311. });
  312. it ('Should resolve promise with false', function() {
  313. installerController.set('content.stacks', null);
  314. var res = installerController.loadStacks();
  315. res.then(function(data){
  316. expect(data).to.be.false;
  317. });
  318. });
  319. });
  320. describe('#setLowerStepsDisable', function() {
  321. beforeEach(function () {
  322. var steps = Em.A([
  323. Em.Object.create({
  324. step: 0,
  325. value: false
  326. }),
  327. Em.Object.create({
  328. step: 1,
  329. value: false
  330. }),
  331. Em.Object.create({
  332. step: 2,
  333. value: false
  334. }),
  335. Em.Object.create({
  336. step: 3,
  337. value: false
  338. }),
  339. Em.Object.create({
  340. step: 4,
  341. value: false
  342. })
  343. ]);
  344. installerController.set('isStepDisabled', steps);
  345. installerController.setLowerStepsDisable(3);
  346. });
  347. it ('Should disable lower steps', function() {
  348. var expected = [
  349. {
  350. "step": 0,
  351. "value": true
  352. },
  353. {
  354. "step": 1,
  355. "value": true
  356. },
  357. {
  358. "step": 2,
  359. "value": true
  360. },
  361. {
  362. "step": 3,
  363. "value": false
  364. },
  365. {
  366. "step": 4,
  367. "value": false
  368. }
  369. ];
  370. var res = JSON.parse(JSON.stringify(installerController.get('isStepDisabled')));
  371. expect(res).to.eql(expected);
  372. });
  373. });
  374. describe('#setStepsEnable', function() {
  375. beforeEach(function () {
  376. var steps = Em.A([
  377. Em.Object.create({
  378. step: 0,
  379. value: false
  380. }),
  381. Em.Object.create({
  382. step: 1,
  383. value: false
  384. }),
  385. Em.Object.create({
  386. step: 2,
  387. value: false
  388. }),
  389. Em.Object.create({
  390. step: 3,
  391. value: false
  392. }),
  393. Em.Object.create({
  394. step: 4,
  395. value: false
  396. })
  397. ]);
  398. installerController.set('isStepDisabled', steps);
  399. installerController.totalSteps = steps.length - 1;
  400. installerController.set('currentStep',2);
  401. });
  402. it ('Should enable next steps', function() {
  403. var expected = [
  404. {
  405. "step": 0,
  406. "value": false
  407. },
  408. {
  409. "step": 1,
  410. "value": true
  411. },
  412. {
  413. "step": 2,
  414. "value": true
  415. },
  416. {
  417. "step": 3,
  418. "value": true
  419. },
  420. {
  421. "step": 4,
  422. "value": true
  423. }
  424. ];
  425. var res = JSON.parse(JSON.stringify(installerController.get('isStepDisabled')));
  426. expect(res).to.eql(expected);
  427. });
  428. });
  429. describe('#loadMap', function() {
  430. describe('Should load cluster', function() {
  431. var loadCluster = false;
  432. var checker = {
  433. load: function() {
  434. loadCluster = true;
  435. }
  436. };
  437. beforeEach(function () {
  438. installerController.loadMap['0'][0].callback.call(checker);
  439. });
  440. it('cluster info is loaded', function () {
  441. expect(loadCluster).to.be.true;
  442. });
  443. });
  444. describe('Should load stacks', function() {
  445. var loadStacks = false;
  446. var checker = {
  447. loadStacks: function() {
  448. return {
  449. always: function() {
  450. loadStacks = true;
  451. }
  452. };
  453. }
  454. };
  455. beforeEach(function () {
  456. installerController.loadMap['1'][0].callback.call(checker);
  457. });
  458. it('stack info is loaded', function () {
  459. expect(loadStacks).to.be.true;
  460. });
  461. });
  462. describe ('Should load stacks async', function() {
  463. var loadStacksVersions = false;
  464. var checker = {
  465. loadStacksVersions: function() {
  466. loadStacksVersions = true;
  467. }
  468. };
  469. it('stack versions are loaded', function () {
  470. installerController.loadMap['1'][1].callback.call(checker, true).then(function(data){
  471. expect(data).to.be.true;
  472. });
  473. expect(loadStacksVersions).to.be.false;
  474. });
  475. });
  476. describe('Should load installOptions', function() {
  477. var installOptions = false;
  478. var checker = {
  479. load: function() {
  480. installOptions = true;
  481. }
  482. };
  483. beforeEach(function () {
  484. installerController.loadMap['2'][0].callback.call(checker);
  485. });
  486. it('install option are loaded', function () {
  487. expect(installOptions).to.be.true;
  488. });
  489. });
  490. describe('Should load loadConfirmedHosts', function() {
  491. var loadConfirmedHosts = false;
  492. var checker = {
  493. loadConfirmedHosts: function() {
  494. loadConfirmedHosts = true;
  495. }
  496. };
  497. beforeEach(function () {
  498. installerController.loadMap['3'][0].callback.call(checker);
  499. });
  500. it('confirmed hosts are loaded', function () {
  501. expect(loadConfirmedHosts).to.be.true;
  502. });
  503. });
  504. describe('Should load loadServices', function() {
  505. var loadServices = false;
  506. var checker = {
  507. loadServices: function() {
  508. loadServices = true;
  509. }
  510. };
  511. beforeEach(function () {
  512. installerController.loadMap['4'][0].callback.call(checker);
  513. });
  514. it('services are loaded', function () {
  515. expect(loadServices).to.be.true;
  516. });
  517. });
  518. describe('Should load loadServices (2)', function() {
  519. var setSkipSlavesStep = false;
  520. var loadMasterComponentHosts = false;
  521. var loadConfirmedHosts = false;
  522. var loadRecommendations = false;
  523. var checker = {
  524. setSkipSlavesStep: function() {
  525. setSkipSlavesStep = true;
  526. },
  527. loadMasterComponentHosts: function() {
  528. loadMasterComponentHosts = true;
  529. },
  530. loadConfirmedHosts: function() {
  531. loadConfirmedHosts = true;
  532. },
  533. loadRecommendations: function() {
  534. loadRecommendations = true;
  535. }
  536. };
  537. beforeEach(function () {
  538. installerController.loadMap['5'][0].callback.call(checker);
  539. });
  540. it('confirmed hosts are loaded', function() {
  541. expect(loadConfirmedHosts).to.be.true;
  542. });
  543. it('`skipSlavesStep` is loaded', function() {
  544. expect(setSkipSlavesStep).to.be.true;
  545. });
  546. it('master components hosts are loaded', function() {
  547. expect(loadMasterComponentHosts).to.be.true;
  548. });
  549. it('recommendations are loaded', function() {
  550. expect(loadRecommendations).to.be.true;
  551. });
  552. });
  553. describe ('Should load serviceConfigGroups', function() {
  554. var loadServiceConfigGroups = false;
  555. var loadServiceConfigProperties = false;
  556. var loadCurrentHostGroups = false;
  557. var loadRecommendationsConfigs = false;
  558. var loadConfigThemes = false;
  559. var checker = {
  560. loadServiceConfigGroups: function() {
  561. loadServiceConfigGroups = true;
  562. },
  563. loadServiceConfigProperties: function() {
  564. loadServiceConfigProperties = true;
  565. },
  566. loadCurrentHostGroups: function() {
  567. loadCurrentHostGroups = true;
  568. },
  569. loadRecommendationsConfigs: function() {
  570. loadRecommendationsConfigs = true;
  571. },
  572. loadConfigThemes: function() {
  573. loadConfigThemes = true;
  574. }
  575. };
  576. beforeEach(function () {
  577. installerController.loadMap['7'][0].callback.call(checker);
  578. });
  579. it('config groups are loaded', function () {
  580. expect(loadServiceConfigGroups).to.be.true;
  581. });
  582. it('config properties are loaded', function () {
  583. expect(loadServiceConfigProperties).to.be.true;
  584. });
  585. it('current host groups are loaded', function () {
  586. expect(loadCurrentHostGroups).to.be.true;
  587. });
  588. it('recommendations are loaded', function () {
  589. expect(loadRecommendationsConfigs).to.be.true;
  590. });
  591. it('config themes are loaded', function () {
  592. expect(loadConfigThemes).to.be.true;
  593. });
  594. });
  595. describe('Should load clients', function() {
  596. var loadSlaveComponentHosts = false;
  597. var loadClients = false;
  598. var loadRecommendations = false;
  599. var checker = {
  600. loadSlaveComponentHosts: function() {
  601. loadSlaveComponentHosts = true;
  602. },
  603. loadClients: function() {
  604. loadClients = true;
  605. },
  606. loadRecommendations: function() {
  607. loadRecommendations = true;
  608. }
  609. };
  610. beforeEach(function () {
  611. installerController.loadMap['6'][0].callback.call(checker);
  612. });
  613. it('slave components hosts are loaded', function () {
  614. expect(loadSlaveComponentHosts).to.be.true;
  615. });
  616. it('clients are loaded', function () {
  617. expect(loadClients).to.be.true;
  618. });
  619. it('recommendations are loaded', function () {
  620. expect(loadRecommendations).to.be.true;
  621. });
  622. });
  623. });
  624. describe('#removeHosts', function() {
  625. var hostsDb = {
  626. 'h1': {},
  627. 'h2': {},
  628. 'h3': {},
  629. 'h4': {}
  630. };
  631. beforeEach(function () {
  632. sinon.stub(installerController, 'getDBProperty').returns(hostsDb);
  633. });
  634. afterEach(function () {
  635. installerController.getDBProperty.restore();
  636. });
  637. it ('Should remove hosts from the list', function() {
  638. var hosts = Em.A([
  639. {
  640. name: 'h1'
  641. },
  642. {
  643. name: 'h2'
  644. },
  645. {
  646. name: 'h3'
  647. }
  648. ]);
  649. installerController.removeHosts(hosts);
  650. expect(hostsDb).to.eql({
  651. 'h4': {}
  652. });
  653. });
  654. });
  655. describe('#allHosts', function() {
  656. it ('Should return hosts', function() {
  657. var hosts = {
  658. 'h1': {
  659. disk_info: Em.A([{
  660. available: 1,
  661. size: 10
  662. }]),
  663. hostComponents: Em.A([])
  664. }
  665. };
  666. var masterComponentHosts = Em.A([
  667. {
  668. hostName: 'h1',
  669. component: 'component',
  670. display_name: 'n1'
  671. }
  672. ]);
  673. var slaveComponentHosts = Em.A([
  674. {
  675. hosts: Em.A([
  676. {
  677. hostName: 'h1'
  678. }
  679. ])
  680. }
  681. ]);
  682. installerController.set('content.hosts', hosts);
  683. installerController.set('content.masterComponentHosts', masterComponentHosts);
  684. installerController.set('content.slaveComponentHosts', slaveComponentHosts);
  685. var res = JSON.parse(JSON.stringify(installerController.get('allHosts')));
  686. expect(res).to.eql([
  687. {
  688. "diskInfo": [
  689. {
  690. "available": 1,
  691. "size": 10
  692. }
  693. ],
  694. "diskTotal": 0.0000095367431640625,
  695. "diskFree": 9.5367431640625e-7,
  696. "hostComponents": [
  697. {
  698. "componentName": "component",
  699. "displayName": "n1"
  700. },
  701. {}
  702. ]
  703. }
  704. ]);
  705. });
  706. });
  707. describe('#loadServiceConfigProperties', function() {
  708. beforeEach(function () {
  709. sinon.stub(installerController, 'getDBProperty').returns({
  710. value: 2
  711. });
  712. });
  713. afterEach(function () {
  714. installerController.getDBProperty.restore();
  715. });
  716. it ('Should load service config property', function() {
  717. installerController.loadServiceConfigProperties();
  718. expect(installerController.get('content.serviceConfigProperties')).to.eql({
  719. "value": 2
  720. });
  721. });
  722. });
  723. describe('#saveServices', function() {
  724. it ('Should return correct names', function() {
  725. var stepController = Em.A([
  726. Em.Object.create({
  727. isInstalled: true,
  728. isSelected: true,
  729. serviceName: 'i1'
  730. }),
  731. Em.Object.create({
  732. isInstalled: false,
  733. isSelected: true,
  734. serviceName: 'i2'
  735. }),
  736. Em.Object.create({
  737. isInstalled: true,
  738. isSelected: false,
  739. serviceName: 'i3'
  740. })
  741. ]);
  742. installerController.saveServices(stepController);
  743. expect(installerController.get('content.selectedServiceNames')).to.eql(['i1','i2']);
  744. expect(installerController.get('content.installedServiceNames')).to.eql(['i1','i3']);
  745. });
  746. });
  747. describe('#saveClients', function() {
  748. var stepController;
  749. beforeEach(function () {
  750. stepController = Em.Object.create({
  751. content: Em.A([
  752. Em.Object.create({
  753. isInstalled: true,
  754. isSelected: true,
  755. serviceName: 'i1',
  756. serviceComponents: Em.A([
  757. Em.Object.create({
  758. isClient: true,
  759. componentName: 'name',
  760. displayName: 'dname'
  761. })
  762. ])
  763. }),
  764. Em.Object.create({
  765. isInstalled: false,
  766. isSelected: true,
  767. serviceName: 'i2',
  768. serviceComponents: Em.A([
  769. Em.Object.create({
  770. isClient: false
  771. })
  772. ])
  773. }),
  774. Em.Object.create({
  775. isInstalled: true,
  776. isSelected: false,
  777. serviceName: 'i3',
  778. serviceComponents: Em.A([
  779. Em.Object.create({
  780. isClient: false
  781. })
  782. ])
  783. })
  784. ])
  785. });
  786. });
  787. it ('Should return correct clients names', function() {
  788. installerController.saveClients(stepController);
  789. var res = JSON.parse(JSON.stringify(installerController.get('content.clients')));
  790. expect(res).to.eql([
  791. {
  792. "component_name": "name",
  793. "display_name": "dname",
  794. "isInstalled": false
  795. }
  796. ]);
  797. });
  798. });
  799. describe('#saveMasterComponentHosts', function() {
  800. beforeEach(function () {
  801. sinon.stub(installerController, 'getDBProperty').returns({
  802. 'h1': {
  803. id: 11
  804. },
  805. 'h3': {
  806. id: 13
  807. },
  808. 'h2': {
  809. id: 12
  810. }
  811. });
  812. });
  813. afterEach(function () {
  814. installerController.getDBProperty.restore();
  815. });
  816. it ('Should return hosts', function() {
  817. var stepController = Em.Object.create({
  818. selectedServicesMasters: Em.A([
  819. Em.Object.create({
  820. display_name: 'n1',
  821. component_name: 'c1',
  822. serviceId: 1,
  823. selectedHost: 'h1'
  824. })
  825. ])
  826. });
  827. installerController.saveMasterComponentHosts(stepController);
  828. expect(installerController.get('content.masterComponentHosts')).to.eql([
  829. {
  830. "display_name": "n1",
  831. "component": "c1",
  832. "serviceId": 1,
  833. "isInstalled": false,
  834. "host_id": 11
  835. }
  836. ]);
  837. });
  838. });
  839. describe('#loadConfirmedHosts', function() {
  840. beforeEach(function () {
  841. sinon.stub(installerController, 'getDBProperty').returns({
  842. 'h1': {
  843. id: 11
  844. },
  845. 'h3': {
  846. id: 13
  847. },
  848. 'h2': {
  849. id: 12
  850. }
  851. });
  852. });
  853. afterEach(function () {
  854. installerController.getDBProperty.restore();
  855. });
  856. it ('Should load hosts from db', function() {
  857. installerController.loadConfirmedHosts();
  858. expect(installerController.get('content.hosts')).to.eql({
  859. 'h1': {
  860. id: 11
  861. },
  862. 'h3': {
  863. id: 13
  864. },
  865. 'h2': {
  866. id: 12
  867. }
  868. });
  869. });
  870. });
  871. describe('#loadMasterComponentHosts', function() {
  872. beforeEach(function () {
  873. sinon.stub(installerController, 'getDBProperties', function() {
  874. return {
  875. masterComponentHosts: Em.A([
  876. {
  877. hostName: '',
  878. host_id: 11
  879. }
  880. ]),
  881. hosts: {
  882. 'h1': {
  883. id: 11
  884. },
  885. 'h3': {
  886. id: 13
  887. },
  888. 'h2': {
  889. id: 12
  890. }
  891. }
  892. }
  893. });
  894. });
  895. afterEach(function () {
  896. installerController.getDBProperties.restore();
  897. });
  898. it ('Should load hosts', function() {
  899. installerController.loadMasterComponentHosts();
  900. expect(installerController.get('content.masterComponentHosts')).to.eql([
  901. {
  902. "hostName": "h1",
  903. "host_id": 11
  904. }
  905. ]);
  906. });
  907. });
  908. describe('#loadSlaveComponentHosts', function() {
  909. beforeEach(function () {
  910. sinon.stub(installerController, 'getDBProperties', function() {
  911. return {
  912. hosts: {
  913. 'h1': {
  914. id: 11
  915. },
  916. 'h3': {
  917. id: 13
  918. },
  919. 'h2': {
  920. id: 12
  921. }
  922. },
  923. slaveComponentHosts: Em.A([
  924. {
  925. hosts: Em.A([
  926. {
  927. hostName: '',
  928. host_id: 11
  929. }
  930. ])
  931. }
  932. ])
  933. };
  934. });
  935. });
  936. afterEach(function () {
  937. installerController.getDBProperties.restore();
  938. });
  939. it ('Should load slave hosts', function() {
  940. installerController.loadSlaveComponentHosts();
  941. expect(installerController.get('content.slaveComponentHosts')).to.eql([
  942. {
  943. "hosts": [
  944. {
  945. "hostName": "h1",
  946. "host_id": 11
  947. }
  948. ]
  949. }
  950. ]);
  951. });
  952. });
  953. describe('#getServerVersionSuccessCallback', function () {
  954. var cases = [
  955. {
  956. osFamily: 'redhat5',
  957. expected: false
  958. },
  959. {
  960. osFamily: 'redhat6',
  961. expected: true
  962. },
  963. {
  964. osFamily: 'suse11',
  965. expected: false
  966. }
  967. ],
  968. title = 'App.isManagedMySQLForHiveEnabled should be {0} for {1}';
  969. cases.forEach(function (item) {
  970. it(title.format(item.expected, item.osFamily), function () {
  971. installerController.getServerVersionSuccessCallback({
  972. 'RootServiceComponents': {
  973. 'component_version': '',
  974. 'properties': {
  975. 'server.os_family': item.osFamily
  976. }
  977. }
  978. });
  979. expect(App.get('isManagedMySQLForHiveEnabled')).to.equal(item.expected);
  980. });
  981. });
  982. });
  983. describe('#validateJDKVersion', function() {
  984. var tests = [
  985. {
  986. isCustomJDK: false,
  987. ambariProperties: {
  988. 'java.version': '1.8'
  989. },
  990. successCallbackCalled: false,
  991. popupCalled: true,
  992. stacks: [Em.Object.create({
  993. minJdkVersion: '1.6',
  994. maxJdkVersion: '1.7',
  995. isSelected: true
  996. })],
  997. m: 'JDK 1.8, stack supports 1.6-1.7 popup should be displayed'
  998. },
  999. {
  1000. isCustomJDK: false,
  1001. ambariProperties: {
  1002. 'java.version': '1.8'
  1003. },
  1004. successCallbackCalled: true,
  1005. popupCalled: false,
  1006. stacks: [Em.Object.create({
  1007. minJdkVersion: '1.6',
  1008. maxJdkVersion: '1.8',
  1009. isSelected: true
  1010. })],
  1011. m: 'JDK 1.8, stack supports 1.7-1.8 procceed installation without warning'
  1012. },
  1013. {
  1014. isCustomJDK: false,
  1015. ambariProperties: {
  1016. 'java.version': '1.5'
  1017. },
  1018. successCallbackCalled: false,
  1019. popupCalled: true,
  1020. stacks: [Em.Object.create({
  1021. minJdkVersion: '1.6',
  1022. maxJdkVersion: '1.8',
  1023. isSelected: true
  1024. })],
  1025. m: 'JDK 1.5, stack supports 1.6-1.8, popup should be displayed'
  1026. },
  1027. {
  1028. isCustomJDK: false,
  1029. ambariProperties: {
  1030. 'java.version': '1.5'
  1031. },
  1032. successCallbackCalled: true,
  1033. popupCalled: false,
  1034. stacks: [Em.Object.create({
  1035. minJdkVersion: null,
  1036. maxJdkVersion: null,
  1037. isSelected: true
  1038. })],
  1039. m: 'JDK 1.5, stack supports max and min are null, procceed installation without warning'
  1040. },
  1041. {
  1042. isCustomJDK: false,
  1043. ambariProperties: {
  1044. 'java.version': '1.5'
  1045. },
  1046. successCallbackCalled: true,
  1047. popupCalled: false,
  1048. stacks: [Em.Object.create({
  1049. minJdkVersion: '1.5',
  1050. maxJdkVersion: null,
  1051. isSelected: true
  1052. })],
  1053. m: 'JDK 1.5, stack supports max is missed and min is 1.5, procceed installation without warning'
  1054. },
  1055. {
  1056. isCustomJDK: false,
  1057. ambariProperties: {
  1058. 'java.version': '1.6'
  1059. },
  1060. successCallbackCalled: false,
  1061. popupCalled: true,
  1062. stacks: [Em.Object.create({
  1063. minJdkVersion: '1.5',
  1064. maxJdkVersion: null,
  1065. isSelected: true
  1066. })],
  1067. m: 'JDK 1.6, stack supports max is missed and min is 1.5, popup should be displayed'
  1068. },
  1069. {
  1070. isCustomJDK: false,
  1071. ambariProperties: {
  1072. 'java.version': '1.5'
  1073. },
  1074. successCallbackCalled: true,
  1075. popupCalled: false,
  1076. stacks: [Em.Object.create({
  1077. minJdkVersion: null,
  1078. maxJdkVersion: '1.5',
  1079. isSelected: true
  1080. })],
  1081. m: 'JDK 1.5, stack supports max 1.5 and min is missed, procceed installation without warning'
  1082. },
  1083. {
  1084. isCustomJDK: false,
  1085. ambariProperties: {
  1086. 'java.version': '1.5'
  1087. },
  1088. successCallbackCalled: false,
  1089. popupCalled: true,
  1090. stacks: [Em.Object.create({
  1091. minJdkVersion: null,
  1092. maxJdkVersion: '1.8',
  1093. isSelected: true
  1094. })],
  1095. m: 'JDK 1.5, stack supports max 1.8 and min is missed, popup should be displayed'
  1096. },
  1097. {
  1098. isCustomJDK: false,
  1099. ambariProperties: {
  1100. 'java.version': '1.8'
  1101. },
  1102. successCallbackCalled: true,
  1103. popupCalled: false,
  1104. stacks: [Em.Object.create({
  1105. isSelected: true
  1106. })],
  1107. m: 'JDK 1.8, min, max jdk missed in stack definition, procceed installation without warning'
  1108. },
  1109. {
  1110. isCustomJDK: true,
  1111. ambariProperties: {
  1112. 'java.version': '1.8'
  1113. },
  1114. successCallbackCalled: true,
  1115. popupCalled: false,
  1116. stacks: [Em.Object.create({
  1117. minJdkVersion: '1.6',
  1118. maxJdkVersion: '1.8',
  1119. isSelected: true
  1120. })],
  1121. m: 'JDK 1.8, custom jdk location used, procceed installation without warning'
  1122. }
  1123. ];
  1124. tests.forEach(function(test) {
  1125. describe(test.m, function() {
  1126. var successCallback;
  1127. beforeEach(function () {
  1128. sinon.stub(App.Stack, 'find').returns(test.stacks);
  1129. sinon.stub(App.router, 'get').withArgs('clusterController.isCustomJDK').returns(test.isCustomJDK)
  1130. .withArgs('clusterController.ambariProperties').returns(test.ambariProperties);
  1131. sinon.stub(App, 'showConfirmationPopup', Em.K);
  1132. successCallback = sinon.spy();
  1133. installerController.validateJDKVersion(successCallback);
  1134. });
  1135. afterEach(function () {
  1136. App.router.get.restore();
  1137. App.Stack.find.restore();
  1138. App.showConfirmationPopup.restore();
  1139. });
  1140. it('successCallback is ' + (test.successCallbackCalled ? '' : 'not') + ' called', function () {
  1141. expect(successCallback.called).to.be.equal(test.successCallbackCalled);
  1142. });
  1143. it('App.showConfirmationPopup. is ' + (test.popupCalled ? '' : 'not') + ' called', function () {
  1144. expect(App.showConfirmationPopup.called).to.be.equal(test.popupCalled);
  1145. });
  1146. });
  1147. });
  1148. });
  1149. });