stack_and_upgrade_controller_test.js 27 KB

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