stack_and_upgrade_controller_test.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  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/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. beforeEach(function () {
  241. sinon.stub(App, 'showClusterCheckPopup', Em.K);
  242. sinon.stub(controller, 'upgrade', Em.K);
  243. });
  244. afterEach(function () {
  245. App.showClusterCheckPopup.restore();
  246. controller.upgrade.restore();
  247. });
  248. it("shows popup", function () {
  249. var check = { items: [{
  250. UpgradeChecks: {
  251. "check": "Work-preserving RM/NM restart is enabled in YARN configs",
  252. "status": "FAIL",
  253. "reason": "FAIL",
  254. "failed_on": [],
  255. "check_type": "SERVICE"
  256. }
  257. }]};
  258. controller.runPreUpgradeCheckSuccess(check,null,{label: "name"});
  259. expect(controller.upgrade.called).to.be.false;
  260. expect(App.showClusterCheckPopup.called).to.be.true;
  261. });
  262. it("runs upgrade popup", function () {
  263. var check = { items: [{
  264. UpgradeChecks: {
  265. "check": "Work-preserving RM/NM restart is enabled in YARN configs",
  266. "status": "PASS",
  267. "reason": "OK",
  268. "failed_on": [],
  269. "check_type": "SERVICE"
  270. }
  271. }]};
  272. controller.runPreUpgradeCheckSuccess(check,null,{label: "name"});
  273. expect(controller.upgrade.called).to.be.true;
  274. expect(App.showClusterCheckPopup.called).to.be.false;
  275. });
  276. });
  277. describe("#initDBProperties()", function() {
  278. before(function () {
  279. sinon.stub(controller, 'getDBProperty', function (prop) {
  280. return prop;
  281. });
  282. });
  283. after(function () {
  284. controller.getDBProperty.restore();
  285. });
  286. it("set properties", function () {
  287. controller.set('wizardStorageProperties', ['prop1']);
  288. controller.initDBProperties();
  289. expect(controller.get('prop1')).to.equal('prop1');
  290. });
  291. });
  292. describe("#init()", function() {
  293. before(function () {
  294. sinon.stub(controller, 'initDBProperties', Em.K);
  295. });
  296. after(function () {
  297. controller.initDBProperties.restore();
  298. });
  299. it("call initDBProperties", function () {
  300. controller.init();
  301. expect(controller.initDBProperties.calledOnce).to.be.true;
  302. });
  303. });
  304. describe("#upgrade()", function() {
  305. before(function () {
  306. sinon.stub(App.ajax, 'send', Em.K);
  307. sinon.stub(controller, 'setDBProperty', Em.K);
  308. });
  309. after(function () {
  310. App.ajax.send.restore();
  311. controller.setDBProperty.restore();
  312. });
  313. it("make ajax call", function() {
  314. controller.set('currentVersion', {
  315. repository_version: '2.2'
  316. });
  317. controller.upgrade({
  318. value: '2.2',
  319. label: 'HDP-2.2'
  320. });
  321. expect(App.ajax.send.getCall(0).args[0].data).to.eql({"value": '2.2', "label": 'HDP-2.2'});
  322. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.upgrade.start');
  323. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  324. expect(App.ajax.send.getCall(0).args[0].success).to.eql('upgradeSuccessCallback');
  325. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  326. expect(controller.setDBProperty.calledWith('currentVersion', {
  327. repository_version: '2.2'
  328. })).to.be.true;
  329. });
  330. });
  331. describe("#upgradeSuccessCallback()", function() {
  332. before(function () {
  333. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  334. sinon.stub(controller, 'openUpgradeDialog', Em.K);
  335. sinon.stub(controller, 'setDBProperty', Em.K);
  336. sinon.stub(controller, 'load', Em.K);
  337. });
  338. after(function () {
  339. App.clusterStatus.setClusterStatus.restore();
  340. controller.openUpgradeDialog.restore();
  341. controller.setDBProperty.restore();
  342. controller.load.restore();
  343. });
  344. it("open upgrade dialog", function() {
  345. var data = {
  346. resources: [
  347. {
  348. Upgrade: {
  349. request_id: 1
  350. }
  351. }
  352. ]
  353. };
  354. controller.upgradeSuccessCallback(data, {}, {label: 'HDP-2.2.1', isDowngrade: true});
  355. expect(controller.setDBProperty.calledWith('upgradeId', 1)).to.be.true;
  356. expect(controller.setDBProperty.calledWith('upgradeVersion', 'HDP-2.2.1')).to.be.true;
  357. expect(controller.setDBProperty.calledWith('isDowngrade', true)).to.be.true;
  358. expect(controller.load.calledOnce).to.be.true;
  359. expect(controller.get('upgradeVersion')).to.equal('HDP-2.2.1');
  360. expect(controller.get('upgradeData')).to.be.null;
  361. expect(controller.get('isDowngrade')).to.be.true;
  362. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  363. expect(controller.openUpgradeDialog.calledOnce).to.be.true;
  364. });
  365. });
  366. describe("#updateUpgradeData()", function() {
  367. beforeEach(function () {
  368. sinon.stub(controller, 'initUpgradeData', Em.K);
  369. });
  370. afterEach(function () {
  371. controller.initUpgradeData.restore();
  372. });
  373. it("data loaded first time", function() {
  374. controller.set('upgradeData', null);
  375. controller.updateUpgradeData({});
  376. expect(controller.initUpgradeData.calledWith({})).to.be.true;
  377. });
  378. it("update loaded data", function() {
  379. var oldData = Em.Object.create({
  380. upgradeGroups: [
  381. Em.Object.create({
  382. group_id: 1,
  383. upgradeItems: [
  384. Em.Object.create({
  385. stage_id: 1
  386. })
  387. ]
  388. })
  389. ]
  390. });
  391. var newData = {
  392. Upgrade: {
  393. request_id: 1
  394. },
  395. upgrade_groups: [
  396. {
  397. UpgradeGroup: {
  398. group_id: 1,
  399. status: 'COMPLETED',
  400. progress_percent: 100,
  401. completed_task_count: 3
  402. },
  403. upgrade_items: [
  404. {
  405. UpgradeItem: {
  406. stage_id: 1,
  407. status: 'COMPLETED',
  408. progress_percent: 100
  409. }
  410. }
  411. ]
  412. }
  413. ]
  414. };
  415. controller.set('upgradeData', oldData);
  416. controller.updateUpgradeData(newData);
  417. expect(controller.get('upgradeData.upgradeGroups')[0].get('status')).to.equal('COMPLETED');
  418. expect(controller.get('upgradeData.upgradeGroups')[0].get('progress_percent')).to.equal(100);
  419. expect(controller.get('upgradeData.upgradeGroups')[0].get('completed_task_count')).to.equal(3);
  420. expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('status')).to.equal('COMPLETED');
  421. expect(controller.get('upgradeData.upgradeGroups')[0].get('upgradeItems')[0].get('progress_percent')).to.equal(100);
  422. });
  423. });
  424. describe("#initUpgradeData()", function() {
  425. it("", function() {
  426. var newData = {
  427. Upgrade: {
  428. request_id: 1
  429. },
  430. upgrade_groups: [
  431. {
  432. UpgradeGroup: {
  433. group_id: 1
  434. },
  435. upgrade_items: [
  436. {
  437. UpgradeItem: {
  438. stage_id: 1
  439. }
  440. },
  441. {
  442. UpgradeItem: {
  443. stage_id: 2
  444. }
  445. }
  446. ]
  447. },
  448. {
  449. UpgradeGroup: {
  450. group_id: 2
  451. },
  452. upgrade_items: []
  453. }
  454. ]
  455. };
  456. controller.initUpgradeData(newData);
  457. expect(controller.get('upgradeData.Upgrade.request_id')).to.equal(1);
  458. expect(controller.get('upgradeData.upgradeGroups')[0].get('group_id')).to.equal(2);
  459. expect(controller.get('upgradeData.upgradeGroups')[1].get('group_id')).to.equal(1);
  460. expect(controller.get('upgradeData.upgradeGroups')[1].get('upgradeItems')[0].get('stage_id')).to.equal(2);
  461. expect(controller.get('upgradeData.upgradeGroups')[1].get('upgradeItems')[1].get('stage_id')).to.equal(1);
  462. });
  463. });
  464. describe.skip("#finish()", function() {
  465. before(function () {
  466. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  467. sinon.stub(controller, 'setDBProperty', Em.K);
  468. });
  469. after(function () {
  470. App.clusterStatus.setClusterStatus.restore();
  471. controller.setDBProperty.restore();
  472. });
  473. it("upgradeState is not COMPLETED", function() {
  474. App.set('upgradeState', 'UPGRADING');
  475. controller.finish();
  476. expect(App.clusterStatus.setClusterStatus.called).to.be.false;
  477. });
  478. it("upgradeState is COMPLETED", function() {
  479. App.set('upgradeState', 'COMPLETED');
  480. controller.finish();
  481. expect(controller.setDBProperty.calledWith('upgradeId', undefined)).to.be.true;
  482. expect(controller.setDBProperty.calledWith('upgradeVersion', undefined)).to.be.true;
  483. expect(controller.setDBProperty.calledWith('upgradeState', 'INIT')).to.be.true;
  484. expect(controller.setDBProperty.calledWith('currentVersion', undefined)).to.be.true;
  485. expect(App.get('upgradeState')).to.equal('INIT');
  486. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  487. });
  488. });
  489. describe("#confirmDowngrade()", function() {
  490. before(function () {
  491. sinon.spy(App, 'showConfirmationPopup');
  492. sinon.stub(controller, 'downgrade', Em.K);
  493. });
  494. after(function () {
  495. App.showConfirmationPopup.restore();
  496. controller.downgrade.restore();
  497. });
  498. it("show confirmation popup", function() {
  499. controller.set('currentVersion', Em.Object.create({
  500. repository_version: '2.2',
  501. repository_name: 'HDP-2.2'
  502. }));
  503. var popup = controller.confirmDowngrade();
  504. expect(App.showConfirmationPopup.calledOnce).to.be.true;
  505. popup.onPrimary();
  506. expect(controller.downgrade.calledWith(Em.Object.create({
  507. repository_version: '2.2',
  508. repository_name: 'HDP-2.2'
  509. }))).to.be.true;
  510. });
  511. });
  512. describe("#confirmUpgrade()", function() {
  513. before(function () {
  514. sinon.spy(App, 'showConfirmationPopup');
  515. sinon.stub(controller, 'runPreUpgradeCheck', Em.K);
  516. });
  517. after(function () {
  518. App.showConfirmationPopup.restore();
  519. controller.runPreUpgradeCheck.restore();
  520. });
  521. it("show confirmation popup", function() {
  522. var version = Em.Object.create({displayName: 'HDP-2.2'});
  523. var popup = controller.confirmUpgrade(version);
  524. expect(App.showConfirmationPopup.calledOnce).to.be.true;
  525. popup.onPrimary();
  526. expect(controller.runPreUpgradeCheck.calledWith(version)).to.be.true;
  527. });
  528. });
  529. describe("#downgrade()", function() {
  530. before(function () {
  531. sinon.stub(App.ajax, 'send', Em.K);
  532. sinon.stub(controller, 'abortUpgrade');
  533. });
  534. after(function () {
  535. App.ajax.send.restore();
  536. controller.abortUpgrade.restore();
  537. });
  538. it("make ajax call", function() {
  539. controller.downgrade(Em.Object.create({
  540. repository_version: '2.2',
  541. repository_name: 'HDP-2.2'
  542. }), {context: 'context'});
  543. expect(controller.abortUpgrade.calledOnce).to.be.true;
  544. expect(App.ajax.send.getCall(0).args[0].data).to.eql({"value": '2.2', "label": 'HDP-2.2', isDowngrade: true});
  545. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.downgrade.start');
  546. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  547. expect(App.ajax.send.getCall(0).args[0].success).to.eql('upgradeSuccessCallback');
  548. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  549. });
  550. });
  551. describe("#installRepoVersionConfirmation()", function () {
  552. before(function () {
  553. sinon.stub(controller, 'installRepoVersion', Em.K);
  554. });
  555. after(function () {
  556. controller.installRepoVersion.restore();
  557. });
  558. it("show popup", function () {
  559. var repo = Em.Object.create({'displayName': 'HDP-2.2'});
  560. var popup = controller.installRepoVersionConfirmation(repo);
  561. popup.onPrimary();
  562. expect(controller.installRepoVersion.calledWith(repo)).to.be.true;
  563. });
  564. });
  565. describe("#installRepoVersion()", function () {
  566. before(function () {
  567. sinon.stub(App.ajax, 'send', Em.K);
  568. });
  569. after(function () {
  570. App.ajax.send.restore();
  571. });
  572. it("make ajax call", function () {
  573. var repo = Em.Object.create({
  574. stackVersionType: 'HDP',
  575. stackVersionNumber: '2.2',
  576. repositoryVersion: '2.2.1',
  577. repoId: 1
  578. });
  579. controller.installRepoVersion(repo);
  580. expect(App.ajax.send.calledOnce).to.be.true;
  581. });
  582. });
  583. describe("#installRepoVersionSuccess()", function() {
  584. var mock = {set: Em.K};
  585. before(function () {
  586. sinon.spy(mock, 'set');
  587. sinon.stub(App.db, 'set', Em.K);
  588. sinon.stub(App.clusterStatus, 'setClusterStatus', Em.K);
  589. sinon.stub(App.RepositoryVersion, 'find').returns(mock);
  590. });
  591. after(function () {
  592. mock.set.restore();
  593. App.db.set.restore();
  594. App.clusterStatus.setClusterStatus.restore();
  595. App.RepositoryVersion.find.restore();
  596. });
  597. it("", function() {
  598. controller.installRepoVersionSuccess({Requests: {id: 1}}, {}, {id: 1});
  599. expect(App.db.set.calledWith('repoVersionInstall', 'id', [1])).to.be.true;
  600. expect(App.clusterStatus.setClusterStatus.calledOnce).to.be.true;
  601. expect(App.RepositoryVersion.find.calledWith(1)).to.be.true;
  602. expect(mock.set.calledWith('defaultStatus', 'INSTALLING')).to.be.true; });
  603. });
  604. describe("#setUpgradeItemStatus()", function () {
  605. before(function () {
  606. sinon.stub(App.ajax, 'send', function () {
  607. return {
  608. done: function (callback) {
  609. callback();
  610. }
  611. }
  612. });
  613. });
  614. after(function () {
  615. App.ajax.send.restore();
  616. });
  617. it("", function () {
  618. var item = Em.Object.create({
  619. request_id: 1,
  620. stage_id: 1,
  621. group_id: 1
  622. });
  623. controller.setUpgradeItemStatus(item, 'PENDING');
  624. expect(App.ajax.send.getCall(0).args[0].data).to.eql({upgradeId: 1, itemId: 1, groupId: 1, status: 'PENDING'});
  625. expect(App.ajax.send.getCall(0).args[0].name).to.eql('admin.upgrade.upgradeItem.setState');
  626. expect(App.ajax.send.getCall(0).args[0].sender).to.eql(controller);
  627. expect(App.ajax.send.getCall(0).args[0].callback).to.be.called;
  628. expect(item.get('status')).to.equal('PENDING');
  629. });
  630. });
  631. describe("#prepareRepoForSaving()", function () {
  632. it("prepare date for saving", function () {
  633. var repo = Em.Object.create({
  634. operatingSystems: [
  635. Em.Object.create({
  636. osType: "redhat6",
  637. isDisabled: Ember.computed.not('isSelected'),
  638. repositories: [Em.Object.create({
  639. "baseUrl": "111121",
  640. "repoId": "HDP-2.2",
  641. "repoName": "HDP",
  642. hasError: false
  643. }),
  644. Em.Object.create({
  645. "baseUrl": "1",
  646. "repoId": "HDP-UTILS-1.1.0.20",
  647. "repoName": "HDP-UTILS",
  648. hasError: false
  649. })]
  650. })
  651. ]
  652. });
  653. var result = {
  654. "operating_systems": [
  655. {
  656. "OperatingSystems": {
  657. "os_type": "redhat6"
  658. },
  659. "repositories": [
  660. {
  661. "Repositories": {
  662. "base_url": "111121",
  663. "repo_id": "HDP-2.2",
  664. "repo_name": "HDP"
  665. }
  666. },
  667. {
  668. "Repositories": {
  669. "base_url": "1",
  670. "repo_id": "HDP-UTILS-1.1.0.20",
  671. "repo_name": "HDP-UTILS"
  672. }
  673. }
  674. ]
  675. }
  676. ]};
  677. expect(controller.prepareRepoForSaving(repo)).to.eql(result);
  678. });
  679. });
  680. describe("#saveRepoOS()", function() {
  681. before(function(){
  682. this.mock = sinon.stub(controller, 'validateRepoVersions');
  683. sinon.stub(controller, 'prepareRepoForSaving', Em.K);
  684. sinon.stub(App.ajax, 'send').returns({success: Em.K});
  685. });
  686. after(function(){
  687. this.mock.restore();
  688. controller.prepareRepoForSaving.restore();
  689. App.ajax.send.restore();
  690. });
  691. it("validation errors present", function() {
  692. this.mock.returns({
  693. done: function(callback) {callback([1]);}
  694. });
  695. controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
  696. expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
  697. expect(controller.prepareRepoForSaving.called).to.be.false;
  698. expect(App.ajax.send.called).to.be.false;
  699. });
  700. it("no validation errors", function() {
  701. this.mock.returns({
  702. done: function(callback) {callback([]);}
  703. });
  704. controller.saveRepoOS(Em.Object.create({repoVersionId: 1}), true);
  705. expect(controller.validateRepoVersions.calledWith(Em.Object.create({repoVersionId: 1}), true)).to.be.true;
  706. expect(controller.prepareRepoForSaving.calledWith(Em.Object.create({repoVersionId: 1}))).to.be.true;
  707. expect(App.ajax.send.calledOnce).to.be.true;
  708. });
  709. });
  710. describe("#validateRepoVersions()", function () {
  711. before(function () {
  712. sinon.stub(App.ajax, 'send').returns({success: Em.K, error: Em.K});
  713. });
  714. after(function () {
  715. App.ajax.send.restore();
  716. });
  717. it("skip validation", function () {
  718. controller.validateRepoVersions(Em.Object.create({repoVersionId: 1}), true);
  719. expect(App.ajax.send.called).to.be.false;
  720. });
  721. it("do validation", function () {
  722. var repo = Em.Object.create({
  723. repoVersionId: 1,
  724. operatingSystems: [
  725. Em.Object.create({
  726. isSelected: true,
  727. repositories: [
  728. Em.Object.create()
  729. ]
  730. })
  731. ]
  732. });
  733. controller.validateRepoVersions(repo, false);
  734. expect(App.ajax.send.calledOnce).to.be.true;
  735. });
  736. });
  737. describe("#showProgressPopup()", function () {
  738. var mock = {
  739. initPopup: Em.K
  740. };
  741. before(function () {
  742. sinon.stub(App.router, 'get').withArgs('highAvailabilityProgressPopupController').returns(mock);
  743. sinon.spy(mock, 'initPopup');
  744. });
  745. after(function () {
  746. App.router.get.restore();
  747. mock.initPopup.restore();
  748. });
  749. it("", function () {
  750. controller.showProgressPopup(Em.Object.create());
  751. expect(mock.initPopup.calledOnce).to.be.true;
  752. });
  753. });
  754. describe("#getUrl()", function() {
  755. beforeEach(function(){
  756. controller.reopen({
  757. realStackUrl: 'realStackUrl',
  758. realRepoUrl: 'realRepoUrl',
  759. realUpdateUrl: 'realUpdateUrl'
  760. });
  761. });
  762. it("full load is true, stack is null", function() {
  763. expect(controller.getUrl(null, true)).to.equal('realRepoUrl');
  764. });
  765. it("full load is true, stack is valid", function() {
  766. expect(controller.getUrl({}, true)).to.equal('realStackUrl');
  767. });
  768. it("full load is false, stack is valid", function() {
  769. expect(controller.getUrl({}, false)).to.equal('realUpdateUrl');
  770. });
  771. });
  772. describe("#loadStackVersionsToModel()", function () {
  773. before(function () {
  774. sinon.stub(App.HttpClient, 'get');
  775. });
  776. after(function () {
  777. App.HttpClient.get.restore();
  778. });
  779. it("", function () {
  780. controller.loadStackVersionsToModel();
  781. expect(App.HttpClient.get.calledOnce).to.be.true;
  782. });
  783. });
  784. describe("#loadRepoVersionsToModel()", function () {
  785. before(function () {
  786. sinon.stub(App.HttpClient, 'get');
  787. });
  788. after(function () {
  789. App.HttpClient.get.restore();
  790. });
  791. it("", function () {
  792. controller.loadRepoVersionsToModel();
  793. expect(App.HttpClient.get.calledOnce).to.be.true;
  794. });
  795. });
  796. describe('#currentVersionObserver()', function () {
  797. var cases = [
  798. {
  799. stackVersionType: 'HDP',
  800. repoVersion: '2.2.1.1.0-1',
  801. isStormMetricsSupported: false,
  802. title: 'HDP < 2.2.2'
  803. },
  804. {
  805. stackVersionType: 'HDP',
  806. repoVersion: '2.2.2.1.0-1',
  807. isStormMetricsSupported: true,
  808. title: 'HDP 2.2.2'
  809. },
  810. {
  811. stackVersionType: 'HDP',
  812. repoVersion: '2.2.3.1.0-1',
  813. isStormMetricsSupported: true,
  814. title: 'HDP > 2.2.2'
  815. },
  816. {
  817. stackVersionType: 'BIGTOP',
  818. repoVersion: '0.8.1.1.0-1',
  819. isStormMetricsSupported: true,
  820. title: 'not HDP'
  821. }
  822. ];
  823. afterEach(function () {
  824. App.RepositoryVersion.find.restore();
  825. });
  826. cases.forEach(function (item) {
  827. it(item.title, function () {
  828. sinon.stub(App.RepositoryVersion, 'find').returns([
  829. Em.Object.create({
  830. status: 'CURRENT',
  831. stackVersionType: item.stackVersionType
  832. })
  833. ]);
  834. controller.set('currentVersion', {
  835. repository_version: item.repoVersion
  836. });
  837. expect(App.get('isStormMetricsSupported')).to.equal(item.isStormMetricsSupported);
  838. });
  839. });
  840. });
  841. });