stack_and_upgrade_controller_test.js 33 KB

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