stack_and_upgrade_controller_test.js 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  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('controllers/main/admin/stack_and_upgrade_controller');
  20. require('utils/string_utils');
  21. describe('App.MainAdminStackAndUpgradeController', function() {
  22. var controller = App.MainAdminStackAndUpgradeController.create({
  23. getDBProperty: Em.K,
  24. setDBProperty: Em.K
  25. });
  26. describe("#realRepoUrl", function() {
  27. before(function () {
  28. this.mock = sinon.stub(App, 'get');
  29. });
  30. after(function () {
  31. this.mock.restore();
  32. });
  33. it("", function() {
  34. this.mock.withArgs('apiPrefix').returns('apiPrefix');
  35. this.mock.withArgs('stackVersionURL').returns('stackVersionURL');
  36. controller.propertyDidChange('realRepoUrl');
  37. expect(controller.get('realRepoUrl')).to.equal('apiPrefixstackVersionURL/compatible_repository_versions?fields=*,operating_systems/*,operating_systems/repositories/*');
  38. });
  39. });
  40. describe("#realStackUrl", function() {
  41. before(function () {
  42. this.mock = sinon.stub(App, 'get');
  43. });
  44. after(function () {
  45. this.mock.restore();
  46. });
  47. it("", function() {
  48. this.mock.withArgs('apiPrefix').returns('apiPrefix');
  49. this.mock.withArgs('clusterName').returns('clusterName');
  50. controller.propertyDidChange('realStackUrl');
  51. expect(controller.get('realStackUrl')).to.equal('apiPrefix/clusters/clusterName/stack_versions?fields=*,repository_versions/*,repository_versions/operating_systems/repositories/*');
  52. });
  53. });
  54. describe("#realUpdateUrl", function() {
  55. before(function () {
  56. this.mock = sinon.stub(App, 'get');
  57. });
  58. after(function () {
  59. this.mock.restore();
  60. });
  61. it("", function() {
  62. this.mock.withArgs('apiPrefix').returns('apiPrefix');
  63. this.mock.withArgs('clusterName').returns('clusterName');
  64. controller.propertyDidChange('realUpdateUrl');
  65. expect(controller.get('realUpdateUrl')).to.equal('apiPrefix/clusters/clusterName/stack_versions?fields=ClusterStackVersions/*');
  66. });
  67. });
  68. describe("#load()", function() {
  69. before(function(){
  70. sinon.stub(controller, 'loadUpgradeData').returns({
  71. done: function(callback) {callback();}
  72. });
  73. sinon.stub(controller, 'loadStackVersionsToModel').returns({
  74. done: function(callback) {callback();}
  75. });
  76. sinon.stub(controller, 'loadRepoVersionsToModel').returns({
  77. done: function(callback) {callback();}
  78. });
  79. sinon.stub(App.StackVersion, 'find').returns([Em.Object.create({
  80. state: 'CURRENT',
  81. repositoryVersion: {
  82. repositoryVersion: '2.2',
  83. displayName: 'HDP-2.2'
  84. }
  85. })]);
  86. });
  87. after(function(){
  88. controller.loadUpgradeData.restore();
  89. controller.loadStackVersionsToModel.restore();
  90. controller.loadRepoVersionsToModel.restore();
  91. App.StackVersion.find.restore();
  92. });
  93. it("", function() {
  94. controller.load();
  95. expect(controller.loadUpgradeData.calledWith(true)).to.be.true;
  96. expect(controller.loadStackVersionsToModel.calledWith(true)).to.be.true;
  97. expect(controller.loadRepoVersionsToModel.calledOnce).to.be.true;
  98. expect(controller.get('currentVersion')).to.eql({
  99. "repository_version": "2.2",
  100. "repository_name": "HDP-2.2"
  101. });
  102. });
  103. });
  104. describe("#loadUpgradeData()", function() {
  105. beforeEach(function () {
  106. sinon.stub(App.ajax, 'send').returns({
  107. then: Em.K
  108. });
  109. });
  110. afterEach(function () {
  111. App.ajax.send.restore();
  112. });
  113. it("get entire data", function() {
  114. controller.set('upgradeId', 1);
  115. controller.loadUpgradeData();
  116. expect(App.ajax.send.getCall(0).args[0]).to.eql({
  117. name: 'admin.upgrade.data',
  118. sender: controller,
  119. data: {
  120. id: 1
  121. },
  122. success: 'loadUpgradeDataSuccessCallback'
  123. })
  124. });
  125. it("get only state", function() {
  126. controller.set('upgradeId', 1);
  127. controller.loadUpgradeData(true);
  128. expect(App.ajax.send.getCall(0).args[0]).to.eql({
  129. name: 'admin.upgrade.state',
  130. sender: controller,
  131. data: {
  132. id: 1
  133. },
  134. success: 'loadUpgradeDataSuccessCallback'
  135. })
  136. });
  137. it("upgrade id is null", function() {
  138. controller.set('upgradeId', null);
  139. controller.loadUpgradeData();
  140. expect(App.ajax.send.called).to.be.false;
  141. });
  142. });
  143. describe("#loadUpgradeDataSuccessCallback()", function() {
  144. beforeEach(function () {
  145. sinon.stub(controller, 'updateUpgradeData', Em.K);
  146. sinon.stub(controller, 'setDBProperty', Em.K);
  147. });
  148. afterEach(function () {
  149. controller.updateUpgradeData.restore();
  150. controller.setDBProperty.restore();
  151. });
  152. it("correct data", function() {
  153. var data = {
  154. "Upgrade": {
  155. "request_status": "UPGRADED"
  156. },
  157. "upgrade_groups": [
  158. {
  159. "UpgradeGroup": {
  160. "id": 1
  161. },
  162. "upgrade_items": []
  163. }
  164. ]};
  165. controller.loadUpgradeDataSuccessCallback(data);
  166. expect(App.get('upgradeState')).to.equal('UPGRADED');
  167. expect(controller.updateUpgradeData.calledOnce).to.be.true;
  168. expect(controller.setDBProperty.calledWith('upgradeState', 'UPGRADED')).to.be.true;
  169. });
  170. it("data is null", function() {
  171. var data = null;
  172. controller.loadUpgradeDataSuccessCallback(data);
  173. expect(controller.updateUpgradeData.called).to.be.false;
  174. expect(controller.setDBProperty.called).to.be.false;
  175. });
  176. });
  177. describe("#getUpgradeItem()", function() {
  178. beforeEach(function () {
  179. sinon.stub(App.ajax, 'send', Em.K);
  180. });
  181. afterEach(function () {
  182. App.ajax.send.restore();
  183. });
  184. it("", function() {
  185. var item = Em.Object.create({
  186. request_id: 1,
  187. group_id: 2,
  188. stage_id: 3
  189. });
  190. controller.getUpgradeItem(item);
  191. expect(App.ajax.send.getCall(0).args[0]).to.eql({
  192. name: 'admin.upgrade.upgrade_item',
  193. sender: controller,
  194. data: {
  195. upgradeId: 1,
  196. groupId: 2,
  197. stageId: 3
  198. },
  199. success: 'getUpgradeItemSuccessCallback'
  200. });
  201. });
  202. });
  203. describe("#openUpgradeDialog()", function () {
  204. before(function () {
  205. sinon.stub(App.router, 'transitionTo', Em.K);
  206. });
  207. after(function () {
  208. App.router.transitionTo.restore();
  209. });
  210. it("should open dialog", function () {
  211. controller.openUpgradeDialog();
  212. expect(App.router.transitionTo.calledWith('admin.stackUpgrade')).to.be.true;
  213. });
  214. });
  215. describe("#runPreUpgradeCheck()", function() {
  216. before(function () {
  217. sinon.stub(App.ajax, 'send', Em.K);
  218. });
  219. after(function () {
  220. App.ajax.send.restore();
  221. });
  222. it("make ajax call", function() {
  223. controller.runPreUpgradeCheck(Em.Object.create({
  224. repositoryVersion: '2.2',
  225. displayName: 'HDP-2.2'
  226. }));
  227. expect(App.ajax.send.getCall(0).args[0]).to.eql({
  228. name: "admin.rolling_upgrade.pre_upgrade_check",
  229. sender: controller,
  230. data: {
  231. value: '2.2',
  232. label: 'HDP-2.2'
  233. },
  234. success: "runPreUpgradeCheckSuccess",
  235. error: "runPreUpgradeCheckError"
  236. });
  237. });
  238. });
  239. describe("#runPreUpgradeCheckSuccess()", function () {
  240. var cases = [
  241. {
  242. check: {
  243. "check": "Work-preserving RM/NM restart is enabled in YARN configs",
  244. "status": "FAIL",
  245. "reason": "FAIL",
  246. "failed_on": [],
  247. "check_type": "SERVICE"
  248. },
  249. showClusterCheckPopupCalledCount: 1,
  250. upgradeCalledCount: 0,
  251. title: 'popup is displayed if fails are present'
  252. },
  253. {
  254. check: {
  255. "check": "Configuration Merge Check",
  256. "status": "WARNING",
  257. "reason": "Conflict",
  258. "failed_on": [],
  259. "failed_detail": [
  260. {
  261. type: 't0',
  262. property: 'p0',
  263. current: 'c0',
  264. new_stack_value: 'n0',
  265. result_value: 'n0'
  266. },
  267. {
  268. type: 't1',
  269. property: 'p1',
  270. current: 'c1',
  271. new_stack_value: null,
  272. result_value: 'c1'
  273. },
  274. {
  275. type: 't2',
  276. property: 'p2',
  277. current: 'c2',
  278. new_stack_value: null,
  279. result_value: null
  280. }
  281. ],
  282. "check_type": "CLUSTER",
  283. "id": "CONFIG_MERGE"
  284. },
  285. showClusterCheckPopupCalledCount: 1,
  286. upgradeCalledCount: 0,
  287. configs: [
  288. {
  289. type: 't0',
  290. name: 'p0',
  291. currentValue: 'c0',
  292. recommendedValue: 'n0',
  293. resultingValue: 'n0',
  294. isDeprecated: false,
  295. willBeRemoved: false
  296. },
  297. {
  298. type: 't1',
  299. name: 'p1',
  300. currentValue: 'c1',
  301. recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
  302. resultingValue: 'c1',
  303. isDeprecated: true,
  304. willBeRemoved: false
  305. },
  306. {
  307. type: 't2',
  308. name: 'p2',
  309. currentValue: 'c2',
  310. recommendedValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.deprecated'),
  311. resultingValue: Em.I18n.t('popup.clusterCheck.Upgrade.configsMerge.willBeRemoved'),
  312. isDeprecated: true,
  313. willBeRemoved: true
  314. }
  315. ],
  316. title: 'popup is displayed if warnings are present; configs merge conflicts'
  317. },
  318. {
  319. check: {
  320. "check": "Work-preserving RM/NM restart is enabled in YARN configs",
  321. "status": "PASS",
  322. "reason": "OK",
  323. "failed_on": [],
  324. "check_type": "SERVICE"
  325. },
  326. showClusterCheckPopupCalledCount: 0,
  327. upgradeCalledCount: 1,
  328. title: 'upgrade is started if fails and warnings are absent'
  329. }
  330. ];
  331. beforeEach(function () {
  332. sinon.stub(App, 'showClusterCheckPopup', Em.K);
  333. sinon.stub(controller, 'upgrade', Em.K);
  334. });
  335. afterEach(function () {
  336. App.showClusterCheckPopup.restore();
  337. controller.upgrade.restore();
  338. });
  339. cases.forEach(function (item) {
  340. it(item.title, function () {
  341. controller.runPreUpgradeCheckSuccess(
  342. {
  343. items: [
  344. {
  345. UpgradeChecks: item.check
  346. }
  347. ]
  348. }, null, {
  349. label: 'name'
  350. }
  351. );
  352. expect(controller.upgrade.callCount).to.equal(item.upgradeCalledCount);
  353. expect(App.showClusterCheckPopup.callCount).to.equal(item.showClusterCheckPopupCalledCount);
  354. if (item.check.id == 'CONFIG_MERGE') {
  355. expect(App.showClusterCheckPopup.firstCall.args[7]).to.eql(item.configs);
  356. }
  357. });
  358. });
  359. });
  360. describe("#initDBProperties()", function() {
  361. before(function () {
  362. sinon.stub(controller, 'getDBProperty', function (prop) {
  363. return prop;
  364. });
  365. });
  366. after(function () {
  367. controller.getDBProperty.restore();
  368. });
  369. it("set properties", function () {
  370. controller.set('wizardStorageProperties', ['prop1']);
  371. controller.initDBProperties();
  372. expect(controller.get('prop1')).to.equal('prop1');
  373. });
  374. });
  375. describe("#init()", function() {
  376. before(function () {
  377. sinon.stub(controller, 'initDBProperties', Em.K);
  378. });
  379. after(function () {
  380. controller.initDBProperties.restore();
  381. });
  382. it("call initDBProperties", function () {
  383. controller.init();
  384. expect(controller.initDBProperties.calledOnce).to.be.true;
  385. });
  386. });
  387. describe("#upgrade()", function() {
  388. before(function () {
  389. sinon.stub(App.ajax, 'send', Em.K);
  390. sinon.stub(controller, 'setDBProperty', Em.K);
  391. });
  392. after(function () {
  393. App.ajax.send.restore();
  394. controller.setDBProperty.restore();
  395. });
  396. it("make ajax call", function() {
  397. controller.set('currentVersion', {
  398. repository_version: '2.2'
  399. });
  400. controller.upgrade({
  401. value: '2.2',
  402. label: 'HDP-2.2'
  403. });
  404. expect(App.ajax.send.getCall(0).args[0].data).to.eql({"value": '2.2', "label": 'HDP-2.2'});
  405. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.upgrade.start');
  406. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  407. expect(App.ajax.send.getCall(0).args[0].success).to.eql('upgradeSuccessCallback');
  408. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  409. expect(controller.setDBProperty.calledWith('currentVersion', {
  410. repository_version: '2.2'
  411. })).to.be.true;
  412. });
  413. });
  414. describe("#upgradeSuccessCallback()", function() {
  415. before(function () {
  416. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  417. sinon.stub(controller, 'openUpgradeDialog', Em.K);
  418. sinon.stub(controller, 'setDBProperty', Em.K);
  419. sinon.stub(controller, 'load', Em.K);
  420. });
  421. after(function () {
  422. App.clusterStatus.setClusterStatus.restore();
  423. controller.openUpgradeDialog.restore();
  424. controller.setDBProperty.restore();
  425. controller.load.restore();
  426. });
  427. it("open upgrade dialog", function() {
  428. var data = {
  429. resources: [
  430. {
  431. Upgrade: {
  432. request_id: 1
  433. }
  434. }
  435. ]
  436. };
  437. controller.upgradeSuccessCallback(data, {}, {label: 'HDP-2.2.1', isDowngrade: true});
  438. expect(controller.setDBProperty.calledWith('upgradeId', 1)).to.be.true;
  439. expect(controller.setDBProperty.calledWith('upgradeVersion', 'HDP-2.2.1')).to.be.true;
  440. expect(controller.setDBProperty.calledWith('isDowngrade', true)).to.be.true;
  441. expect(controller.load.calledOnce).to.be.true;
  442. expect(controller.get('upgradeVersion')).to.equal('HDP-2.2.1');
  443. expect(controller.get('upgradeData')).to.be.null;
  444. expect(controller.get('isDowngrade')).to.be.true;
  445. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  446. expect(controller.openUpgradeDialog.calledOnce).to.be.true;
  447. });
  448. });
  449. describe("#updateUpgradeData()", function() {
  450. beforeEach(function () {
  451. sinon.stub(controller, 'initUpgradeData', Em.K);
  452. });
  453. afterEach(function () {
  454. controller.initUpgradeData.restore();
  455. });
  456. it("data loaded first time", function() {
  457. controller.set('upgradeData', null);
  458. controller.updateUpgradeData({});
  459. expect(controller.initUpgradeData.calledWith({})).to.be.true;
  460. });
  461. it("update loaded data", function() {
  462. var oldData = Em.Object.create({
  463. upgradeGroups: [
  464. Em.Object.create({
  465. group_id: 1,
  466. upgradeItems: [
  467. Em.Object.create({
  468. stage_id: 1
  469. })
  470. ]
  471. })
  472. ]
  473. });
  474. var newData = {
  475. Upgrade: {
  476. request_id: 1
  477. },
  478. upgrade_groups: [
  479. {
  480. UpgradeGroup: {
  481. group_id: 1,
  482. status: 'COMPLETED',
  483. progress_percent: 100,
  484. completed_task_count: 3
  485. },
  486. upgrade_items: [
  487. {
  488. UpgradeItem: {
  489. stage_id: 1,
  490. status: 'COMPLETED',
  491. progress_percent: 100
  492. }
  493. }
  494. ]
  495. }
  496. ]
  497. };
  498. controller.set('upgradeData', oldData);
  499. controller.updateUpgradeData(newData);
  500. expect(controller.get('upgradeData.upgradeGroups')[0].get('status')).to.equal('COMPLETED');
  501. expect(controller.get('upgradeData.upgradeGroups')[0].get('progress_percent')).to.equal(100);
  502. expect(controller.get('upgradeData.upgradeGroups')[0].get('completed_task_count')).to.equal(3);
  503. expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('status')).to.equal('COMPLETED');
  504. expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('progress_percent')).to.equal(100);
  505. });
  506. });
  507. describe("#initUpgradeData()", function() {
  508. it("", function() {
  509. var newData = {
  510. Upgrade: {
  511. request_id: 1
  512. },
  513. upgrade_groups: [
  514. {
  515. UpgradeGroup: {
  516. group_id: 1
  517. },
  518. upgrade_items: [
  519. {
  520. UpgradeItem: {
  521. stage_id: 1
  522. }
  523. },
  524. {
  525. UpgradeItem: {
  526. stage_id: 2
  527. }
  528. }
  529. ]
  530. },
  531. {
  532. UpgradeGroup: {
  533. group_id: 2
  534. },
  535. upgrade_items: []
  536. }
  537. ]
  538. };
  539. controller.initUpgradeData(newData);
  540. expect(controller.get('upgradeData.Upgrade.request_id')).to.equal(1);
  541. expect(controller.get('upgradeData.upgradeGroups')[0].get('group_id')).to.equal(2);
  542. expect(controller.get('upgradeData.upgradeGroups')[1].get('group_id')).to.equal(1);
  543. expect(controller.get('upgradeData.upgradeGroups')[1].get('upgradeItems')[0].get('stage_id')).to.equal(2);
  544. expect(controller.get('upgradeData.upgradeGroups')[1].get('upgradeItems')[1].get('stage_id')).to.equal(1);
  545. });
  546. });
  547. describe.skip("#finish()", function() {
  548. before(function () {
  549. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  550. sinon.stub(controller, 'setDBProperty', Em.K);
  551. });
  552. after(function () {
  553. App.clusterStatus.setClusterStatus.restore();
  554. controller.setDBProperty.restore();
  555. });
  556. it("upgradeState is not COMPLETED", function() {
  557. App.set('upgradeState', 'UPGRADING');
  558. controller.finish();
  559. expect(App.clusterStatus.setClusterStatus.called).to.be.false;
  560. });
  561. it("upgradeState is COMPLETED", function() {
  562. App.set('upgradeState', 'COMPLETED');
  563. controller.finish();
  564. expect(controller.setDBProperty.calledWith('upgradeId', undefined)).to.be.true;
  565. expect(controller.setDBProperty.calledWith('upgradeVersion', undefined)).to.be.true;
  566. expect(controller.setDBProperty.calledWith('upgradeState', 'INIT')).to.be.true;
  567. expect(controller.setDBProperty.calledWith('currentVersion', undefined)).to.be.true;
  568. expect(App.get('upgradeState')).to.equal('INIT');
  569. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  570. });
  571. });
  572. describe("#confirmDowngrade()", function() {
  573. before(function () {
  574. sinon.spy(App, 'showConfirmationPopup');
  575. sinon.stub(controller, 'downgrade', Em.K);
  576. });
  577. after(function () {
  578. App.showConfirmationPopup.restore();
  579. controller.downgrade.restore();
  580. });
  581. it("show confirmation popup", function() {
  582. controller.set('currentVersion', Em.Object.create({
  583. repository_version: '2.2',
  584. repository_name: 'HDP-2.2'
  585. }));
  586. var popup = controller.confirmDowngrade();
  587. expect(App.showConfirmationPopup.calledOnce).to.be.true;
  588. popup.onPrimary();
  589. expect(controller.downgrade.calledWith(Em.Object.create({
  590. repository_version: '2.2',
  591. repository_name: 'HDP-2.2'
  592. }))).to.be.true;
  593. });
  594. });
  595. describe("#confirmUpgrade()", function() {
  596. before(function () {
  597. sinon.spy(App, 'showConfirmationPopup');
  598. sinon.stub(controller, 'runPreUpgradeCheck', Em.K);
  599. });
  600. after(function () {
  601. App.showConfirmationPopup.restore();
  602. controller.runPreUpgradeCheck.restore();
  603. });
  604. it("show confirmation popup", function() {
  605. var version = Em.Object.create({displayName: 'HDP-2.2'});
  606. var popup = controller.confirmUpgrade(version);
  607. expect(App.showConfirmationPopup.calledOnce).to.be.true;
  608. popup.onPrimary();
  609. expect(controller.runPreUpgradeCheck.calledWith(version)).to.be.true;
  610. });
  611. });
  612. describe("#downgrade()", function() {
  613. before(function () {
  614. sinon.stub(App.ajax, 'send', Em.K);
  615. sinon.stub(controller, 'abortUpgrade');
  616. sinon.stub(App.RepositoryVersion, 'find').returns([
  617. Em.Object.create({
  618. displayName: 'HDP-2.3',
  619. repositoryVersion: '2.3'
  620. })
  621. ]);
  622. });
  623. after(function () {
  624. App.ajax.send.restore();
  625. controller.abortUpgrade.restore();
  626. App.RepositoryVersion.find.restore();
  627. });
  628. it("make ajax call", function() {
  629. controller.set('upgradeVersion', 'HDP-2.3');
  630. controller.downgrade(Em.Object.create({
  631. repository_version: '2.2',
  632. repository_name: 'HDP-2.2'
  633. }), {context: 'context'});
  634. expect(controller.abortUpgrade.calledOnce).to.be.true;
  635. expect(App.ajax.send.getCall(0).args[0].data).to.eql({
  636. value: '2.2',
  637. label: 'HDP-2.2',
  638. from: '2.3',
  639. isDowngrade: true
  640. });
  641. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.downgrade.start');
  642. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  643. expect(App.ajax.send.getCall(0).args[0].success).to.eql('upgradeSuccessCallback');
  644. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  645. });
  646. });
  647. describe("#installRepoVersionConfirmation()", function () {
  648. before(function () {
  649. sinon.stub(controller, 'installRepoVersion', Em.K);
  650. });
  651. after(function () {
  652. controller.installRepoVersion.restore();
  653. });
  654. it("show popup", function () {
  655. var repo = Em.Object.create({'displayName': 'HDP-2.2'});
  656. var popup = controller.installRepoVersionConfirmation(repo);
  657. popup.onPrimary();
  658. expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
  659. });
  660. });
  661. describe("#installRepoVersion()", function () {
  662. before(function () {
  663. sinon.stub(App.ajax, 'send', Em.K);
  664. });
  665. after(function () {
  666. App.ajax.send.restore();
  667. });
  668. it("make ajax call", function () {
  669. var repo = Em.Object.create({
  670. stackVersionType: 'HDP',
  671. stackVersionNumber: '2.2',
  672. repositoryVersion: '2.2.1',
  673. repoId: 1
  674. });
  675. controller.installRepoVersion(repo);
  676. expect(App.ajax.send.calledOnce).to.be.true;
  677. });
  678. });
  679. describe("#installRepoVersionSuccess()", function() {
  680. var mock = Em.Object.create({
  681. id: 1,
  682. defaultStatus: 'INIT',
  683. stackVersion: {}
  684. });
  685. before(function () {
  686. sinon.spy(mock, 'set');
  687. sinon.stub(App.db, 'set', Em.K);
  688. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  689. sinon.stub(App.RepositoryVersion, 'find').returns(mock);
  690. });
  691. after(function () {
  692. App.db.set.restore();
  693. App.clusterStatus.setClusterStatus.restore();
  694. App.RepositoryVersion.find.restore();
  695. });
  696. it("", function() {
  697. controller.installRepoVersionSuccess({Requests: {id: 1}}, {}, {id: 1});
  698. expect(App.db.set.calledWith('repoVersionInstall', 'id', [1])).to.be.true;
  699. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  700. expect(App.RepositoryVersion.find.calledWith(1)).to.be.true;
  701. expect(App.RepositoryVersion.find(1).get('defaultStatus')).to.equal('INSTALLING');
  702. expect(App.RepositoryVersion.find(1).get('stackVersion.state')).to.equal('INSTALLING');
  703. });
  704. });
  705. describe("#setUpgradeItemStatus()", function () {
  706. before(function () {
  707. sinon.stub(App.ajax, 'send', function () {
  708. return {
  709. done: function (callback) {
  710. callback();
  711. }
  712. }
  713. });
  714. });
  715. after(function () {
  716. App.ajax.send.restore();
  717. });
  718. it("", function () {
  719. var item = Em.Object.create({
  720. request_id: 1,
  721. stage_id: 1,
  722. group_id: 1
  723. });
  724. controller.setUpgradeItemStatus(item, 'PENDING');
  725. expect(App.ajax.send.getCall(0).args[0].data).to.eql({upgradeId: 1, itemId: 1, groupId: 1, status: 'PENDING'});
  726. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.upgrade.upgradeItem.setState');
  727. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  728. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  729. expect(item.get('status')).to.equal('PENDING');
  730. });
  731. });
  732. describe("#prepareRepoForSaving()", function () {
  733. it("prepare date for saving", function () {
  734. var repo = Em.Object.create({
  735. operatingSystems: [
  736. Em.Object.create({
  737. osType: "redhat6",
  738. isDisabled: Ember.computed.not('isSelected'),
  739. repositories: [Em.Object.create({
  740. "baseUrl": "111121",
  741. "repoId": "HDP-2.2",
  742. "repoName": "HDP",
  743. hasError: false
  744. }),
  745. Em.Object.create({
  746. "baseUrl": "1",
  747. "repoId": "HDP-UTILS-1.1.0.20",
  748. "repoName": "HDP-UTILS",
  749. hasError: false
  750. })]
  751. })
  752. ]
  753. });
  754. var result = {
  755. "operating_systems": [
  756. {
  757. "OperatingSystems": {
  758. "os_type": "redhat6"
  759. },
  760. "repositories": [
  761. {
  762. "Repositories": {
  763. "base_url": "111121",
  764. "repo_id": "HDP-2.2",
  765. "repo_name": "HDP"
  766. }
  767. },
  768. {
  769. "Repositories": {
  770. "base_url": "1",
  771. "repo_id": "HDP-UTILS-1.1.0.20",
  772. "repo_name": "HDP-UTILS"
  773. }
  774. }
  775. ]
  776. }
  777. ]};
  778. expect(controller.prepareRepoForSaving(repo)).to.eql(result);
  779. });
  780. });
  781. describe("#getStackVersionNumber()", function(){
  782. it("get stack version number", function(){
  783. var repo = Em.Object.create({
  784. "stackVersionType": 'HDP',
  785. "stackVersion": '2.3',
  786. "repositoryVersion": '2.2.1'
  787. });
  788. var stackVersion = controller.getStackVersionNumber(repo);
  789. expect(stackVersion).to.equal('2.3');
  790. });
  791. it("get default stack version number", function(){
  792. App.set('currentStackVersion', '1.2.3');
  793. var repo = Em.Object.create({
  794. "stackVersionType": 'HDP',
  795. "repositoryVersion": '2.2.1'
  796. });
  797. var stackVersion = controller.getStackVersionNumber(repo);
  798. expect(stackVersion).to.equal('1.2.3');
  799. });
  800. });
  801. describe("#saveRepoOS()", function() {
  802. before(function(){
  803. this.mock = sinon.stub(controller, 'validateRepoVersions');
  804. sinon.stub(controller, 'prepareRepoForSaving', Em.K);
  805. sinon.stub(App.ajax, 'send').returns({success: Em.K});
  806. });
  807. after(function(){
  808. this.mock.restore();
  809. controller.prepareRepoForSaving.restore();
  810. App.ajax.send.restore();
  811. });
  812. it("validation errors present", function() {
  813. this.mock.returns({
  814. done: function(callback) {callback([1]);}
  815. });
  816. controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
  817. expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
  818. expect(controller.prepareRepoForSaving.called).to.be.false;
  819. expect(App.ajax.send.called).to.be.false;
  820. });
  821. it("no validation errors", function() {
  822. this.mock.returns({
  823. done: function(callback) {callback([]);}
  824. });
  825. controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
  826. expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
  827. expect(controller.prepareRepoForSaving.calledWith(Em.Object.create({repoVersionId: 1}))).to.be.true;
  828. expect(App.ajax.send.calledOnce).to.be.true;
  829. });
  830. });
  831. describe("#validateRepoVersions()", function () {
  832. before(function () {
  833. sinon.stub(App.ajax, 'send').returns({success: Em.K, error: Em.K});
  834. });
  835. after(function () {
  836. App.ajax.send.restore();
  837. });
  838. it("skip validation", function () {
  839. controller.validateRepoVersions(Em.Object.create({repoVersionId: 1}), true);
  840. expect(App.ajax.send.called).to.be.false;
  841. });
  842. it("do validation", function () {
  843. var repo = Em.Object.create({
  844. repoVersionId: 1,
  845. operatingSystems: [
  846. Em.Object.create({
  847. isSelected: true,
  848. repositories: [
  849. Em.Object.create()
  850. ]
  851. })
  852. ]
  853. });
  854. controller.validateRepoVersions(repo, false);
  855. expect(App.ajax.send.calledOnce).to.be.true;
  856. });
  857. });
  858. describe("#showProgressPopup()", function () {
  859. var mock = {
  860. initPopup: Em.K
  861. };
  862. before(function () {
  863. sinon.stub(App.router, 'get').withArgs('highAvailabilityProgressPopupController').returns(mock);
  864. sinon.spy(mock, 'initPopup');
  865. });
  866. after(function () {
  867. App.router.get.restore();
  868. mock.initPopup.restore();
  869. });
  870. it("", function () {
  871. controller.showProgressPopup(Em.Object.create());
  872. expect(mock.initPopup.calledOnce).to.be.true;
  873. });
  874. });
  875. describe("#getUrl()", function() {
  876. beforeEach(function(){
  877. controller.reopen({
  878. realStackUrl: 'realStackUrl',
  879. realRepoUrl: 'realRepoUrl',
  880. realUpdateUrl: 'realUpdateUrl'
  881. });
  882. });
  883. it("full load is true, stack is null", function() {
  884. expect(controller.getUrl(null, true)).to.equal('realRepoUrl');
  885. });
  886. it("full load is true, stack is valid", function() {
  887. expect(controller.getUrl({}, true)).to.equal('realStackUrl');
  888. });
  889. it("full load is false, stack is valid", function() {
  890. expect(controller.getUrl({}, false)).to.equal('realUpdateUrl');
  891. });
  892. });
  893. describe("#loadStackVersionsToModel()", function () {
  894. before(function () {
  895. sinon.stub(App.HttpClient, 'get');
  896. });
  897. after(function () {
  898. App.HttpClient.get.restore();
  899. });
  900. it("", function () {
  901. controller.loadStackVersionsToModel();
  902. expect(App.HttpClient.get.calledOnce).to.be.true;
  903. });
  904. });
  905. describe("#loadRepoVersionsToModel()", function () {
  906. before(function () {
  907. sinon.stub(App.HttpClient, 'get');
  908. });
  909. after(function () {
  910. App.HttpClient.get.restore();
  911. });
  912. it("", function () {
  913. controller.loadRepoVersionsToModel();
  914. expect(App.HttpClient.get.calledOnce).to.be.true;
  915. });
  916. });
  917. describe('#currentVersionObserver()', function () {
  918. var cases = [
  919. {
  920. stackVersionType: 'HDP',
  921. repoVersion: '2.2.1.1.0-1',
  922. isStormMetricsSupported: false,
  923. title: 'HDP < 2.2.2'
  924. },
  925. {
  926. stackVersionType: 'HDP',
  927. repoVersion: '2.2.2.1.0-1',
  928. isStormMetricsSupported: true,
  929. title: 'HDP 2.2.2'
  930. },
  931. {
  932. stackVersionType: 'HDP',
  933. repoVersion: '2.2.3.1.0-1',
  934. isStormMetricsSupported: true,
  935. title: 'HDP > 2.2.2'
  936. },
  937. {
  938. stackVersionType: 'BIGTOP',
  939. repoVersion: '0.8.1.1.0-1',
  940. isStormMetricsSupported: true,
  941. title: 'not HDP'
  942. }
  943. ];
  944. afterEach(function () {
  945. App.RepositoryVersion.find.restore();
  946. });
  947. cases.forEach(function (item) {
  948. it(item.title, function () {
  949. sinon.stub(App.RepositoryVersion, 'find').returns([
  950. Em.Object.create({
  951. status: 'CURRENT',
  952. stackVersionType: item.stackVersionType
  953. })
  954. ]);
  955. controller.set('currentVersion', {
  956. repository_version: item.repoVersion
  957. });
  958. expect(App.get('isStormMetricsSupported')).to.equal(item.isStormMetricsSupported);
  959. });
  960. });
  961. });
  962. });