background_operations_test.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  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('config');
  20. require('utils/updater');
  21. require('utils/ajax/ajax');
  22. require('models/host_component');
  23. require('controllers/global/background_operations_controller');
  24. require('views/common/modal_popup');
  25. require('utils/host_progress_popup');
  26. describe('App.BackgroundOperationsController', function () {
  27. var controller = App.BackgroundOperationsController.create();
  28. describe('#getQueryParams', function () {
  29. /**
  30. * Predefined data
  31. *
  32. */
  33. App.set('clusterName', 'testName');
  34. App.bgOperationsUpdateInterval = 100;
  35. var tests = Em.A([
  36. {
  37. levelInfo: Em.Object.create({
  38. name: 'REQUESTS_LIST',
  39. requestId: null,
  40. taskId: null,
  41. sync: false
  42. }),
  43. e: {
  44. name: 'background_operations.get_most_recent',
  45. successCallback: 'callBackForMostRecent',
  46. data: {}
  47. },
  48. response: {items: []},
  49. m: '"Get Most Recent"'
  50. },
  51. {
  52. levelInfo: Em.Object.create({
  53. name: 'TASK_DETAILS',
  54. requestId: 1,
  55. taskId: 1,
  56. sync: false
  57. }),
  58. e: {
  59. name: 'background_operations.get_by_task',
  60. successCallback: 'callBackFilteredByTask',
  61. data: {
  62. taskId: 1,
  63. requestId: 1,
  64. sync: false
  65. }
  66. },
  67. response: {items: {Tasks: {request_id: 0}}},
  68. m: '"Filtered By task"'
  69. },
  70. {
  71. levelInfo: Em.Object.create({
  72. name: 'TASKS_LIST',
  73. requestId: 1,
  74. taskId: 1,
  75. sync: false
  76. }),
  77. e: {
  78. name: 'background_operations.get_by_request',
  79. successCallback: 'callBackFilteredByRequest',
  80. data: {
  81. requestId: 1,
  82. sync: false
  83. }
  84. },
  85. response: {items: {Requests: {id: 0}}},
  86. m: '"Filtered By Request (TASKS_LIST)"'
  87. },
  88. {
  89. levelInfo: Em.Object.create({
  90. name: 'HOSTS_LIST',
  91. requestId: 1,
  92. taskId: 1,
  93. sync: false
  94. }),
  95. e: {
  96. name: 'background_operations.get_by_request',
  97. successCallback: 'callBackFilteredByRequest',
  98. data: {
  99. requestId: 1,
  100. sync: false
  101. }
  102. },
  103. response: {items: {Requests: {id: 0}}},
  104. m: '"Filtered By Request (HOSTS_LIST)"'
  105. }
  106. ]);
  107. beforeEach(function () {
  108. App.testMode = false;
  109. });
  110. afterEach(function () {
  111. App.testMode = true;
  112. });
  113. tests.forEach(function (test) {
  114. it(test.m, function () {
  115. controller.set('levelInfo', test.levelInfo);
  116. var r = controller.getQueryParams();
  117. expect(r.name).to.equal(test.e.name);
  118. expect(r.successCallback).to.equal(test.e.successCallback);
  119. expect(r.data).to.eql(test.e.data);
  120. });
  121. });
  122. });
  123. describe('#startPolling()', function () {
  124. beforeEach(function () {
  125. sinon.spy(App.updater, 'run');
  126. sinon.spy(controller, 'requestMostRecent');
  127. });
  128. afterEach(function () {
  129. App.updater.run.restore();
  130. controller.requestMostRecent.restore();
  131. });
  132. it('isWorking = false', function () {
  133. controller.set('isWorking', false);
  134. expect(App.updater.run.calledOnce).to.equal(false);
  135. expect(controller.requestMostRecent.calledOnce).to.equal(false);
  136. });
  137. it('isWorking = true', function () {
  138. controller.set('isWorking', true);
  139. expect(App.updater.run.calledOnce).to.equal(true);
  140. expect(controller.requestMostRecent.calledOnce).to.equal(true);
  141. });
  142. });
  143. describe('#callBackForMostRecent()', function () {
  144. it('No requests exists', function () {
  145. var data = {
  146. items: []
  147. };
  148. controller.callBackForMostRecent(data);
  149. expect(controller.get("allOperationsCount")).to.equal(0);
  150. expect(controller.get("services.length")).to.equal(0);
  151. });
  152. it('One non-running request', function () {
  153. var data = {
  154. items: [
  155. {
  156. Requests: {
  157. id: 1,
  158. request_context: '',
  159. task_count: 0,
  160. aborted_task_count: 0,
  161. completed_task_count: 0,
  162. failed_task_count: 0,
  163. timed_out_task_count: 0,
  164. queued_task_count: 0
  165. }
  166. }
  167. ]
  168. };
  169. controller.callBackForMostRecent(data);
  170. expect(controller.get("allOperationsCount")).to.equal(0);
  171. expect(controller.get("services").mapProperty('id')).to.eql([1]);
  172. });
  173. it('One running request', function () {
  174. var data = {
  175. items: [
  176. {
  177. Requests: {
  178. id: 1,
  179. request_context: '',
  180. task_count: 1,
  181. aborted_task_count: 0,
  182. completed_task_count: 0,
  183. failed_task_count: 0,
  184. timed_out_task_count: 0,
  185. queued_task_count: 0
  186. }
  187. }
  188. ]
  189. };
  190. controller.callBackForMostRecent(data);
  191. expect(controller.get("allOperationsCount")).to.equal(1);
  192. expect(controller.get("services").mapProperty('id')).to.eql([1]);
  193. });
  194. it('Two requests in order', function () {
  195. var data = {
  196. items: [
  197. {
  198. Requests: {
  199. id: 1,
  200. request_context: ''
  201. }
  202. },
  203. {
  204. Requests: {
  205. id: 2,
  206. request_context: ''
  207. }
  208. }
  209. ]
  210. };
  211. controller.callBackForMostRecent(data);
  212. expect(controller.get("allOperationsCount")).to.equal(0);
  213. expect(controller.get("services").mapProperty('id')).to.eql([2, 1]);
  214. });
  215. });
  216. describe('#removeOldRequests()', function () {
  217. var testCases = [
  218. {
  219. title: 'No requests exist',
  220. content: {
  221. currentRequestIds: [],
  222. services: []
  223. },
  224. result: []
  225. },
  226. {
  227. title: 'One current request',
  228. content: {
  229. currentRequestIds: [1],
  230. services: [
  231. {id: 1}
  232. ]
  233. },
  234. result: [
  235. {id: 1}
  236. ]
  237. },
  238. {
  239. title: 'One old request',
  240. content: {
  241. currentRequestIds: [2],
  242. services: [
  243. {id: 1}
  244. ]
  245. },
  246. result: []
  247. },
  248. {
  249. title: 'One old request and one is current',
  250. content: {
  251. currentRequestIds: [2],
  252. services: [
  253. {id: 1},
  254. {id: 2}
  255. ]
  256. },
  257. result: [
  258. {id: 2}
  259. ]
  260. }
  261. ];
  262. testCases.forEach(function (test) {
  263. it(test.title, function () {
  264. controller.set('services', test.content.services);
  265. controller.removeOldRequests(test.content.currentRequestIds);
  266. expect(controller.get('services')).to.eql(test.result);
  267. });
  268. });
  269. });
  270. describe('#isRequestRunning()', function () {
  271. var testCases = [
  272. {
  273. title: 'Counters are missing',
  274. request: {
  275. Requests: {}
  276. },
  277. result: false
  278. },
  279. {
  280. title: 'Request has zero tasks',
  281. request: {
  282. Requests: {
  283. task_count: 0,
  284. aborted_task_count: 0,
  285. completed_task_count: 0,
  286. failed_task_count: 0,
  287. timed_out_task_count: 0,
  288. queued_task_count: 0
  289. }
  290. },
  291. result: false
  292. },
  293. {
  294. title: 'One task in running status',
  295. request: {
  296. Requests: {
  297. task_count: 1,
  298. aborted_task_count: 0,
  299. completed_task_count: 0,
  300. failed_task_count: 0,
  301. timed_out_task_count: 0,
  302. queued_task_count: 0
  303. }
  304. },
  305. result: true
  306. },
  307. {
  308. title: 'One task in queued status',
  309. request: {
  310. Requests: {
  311. task_count: 1,
  312. aborted_task_count: 0,
  313. completed_task_count: 0,
  314. failed_task_count: 0,
  315. timed_out_task_count: 0,
  316. queued_task_count: 1
  317. }
  318. },
  319. result: true
  320. },
  321. {
  322. title: 'One task in aborted status',
  323. request: {
  324. Requests: {
  325. task_count: 1,
  326. aborted_task_count: 1,
  327. completed_task_count: 0,
  328. failed_task_count: 0,
  329. timed_out_task_count: 0,
  330. queued_task_count: 0
  331. }
  332. },
  333. result: false
  334. },
  335. {
  336. title: 'One task in completed status',
  337. request: {
  338. Requests: {
  339. task_count: 1,
  340. aborted_task_count: 0,
  341. completed_task_count: 1,
  342. failed_task_count: 0,
  343. timed_out_task_count: 0,
  344. queued_task_count: 0
  345. }
  346. },
  347. result: false
  348. },
  349. {
  350. title: 'One task in failed status',
  351. request: {
  352. Requests: {
  353. task_count: 1,
  354. aborted_task_count: 0,
  355. completed_task_count: 0,
  356. failed_task_count: 1,
  357. timed_out_task_count: 0,
  358. queued_task_count: 0
  359. }
  360. },
  361. result: false
  362. },
  363. {
  364. title: 'One task in timed out status',
  365. request: {
  366. Requests: {
  367. task_count: 1,
  368. aborted_task_count: 0,
  369. completed_task_count: 0,
  370. failed_task_count: 0,
  371. timed_out_task_count: 1,
  372. queued_task_count: 0
  373. }
  374. },
  375. result: false
  376. },
  377. {
  378. title: 'One task in timed out status and the second one in running',
  379. request: {
  380. Requests: {
  381. task_count: 2,
  382. aborted_task_count: 0,
  383. completed_task_count: 0,
  384. failed_task_count: 0,
  385. timed_out_task_count: 1,
  386. queued_task_count: 0
  387. }
  388. },
  389. result: true
  390. },
  391. {
  392. title: 'One task in each status',
  393. request: {
  394. Requests: {
  395. task_count: 5,
  396. aborted_task_count: 1,
  397. completed_task_count: 1,
  398. failed_task_count: 1,
  399. timed_out_task_count: 1,
  400. queued_task_count: 1
  401. }
  402. },
  403. result: true
  404. },
  405. {
  406. title: 'One task in each status except queued',
  407. request: {
  408. Requests: {
  409. task_count: 5,
  410. aborted_task_count: 1,
  411. completed_task_count: 1,
  412. failed_task_count: 1,
  413. timed_out_task_count: 1,
  414. queued_task_count: 0
  415. }
  416. },
  417. result: true
  418. },
  419. {
  420. title: 'No tasks in running status',
  421. request: {
  422. Requests: {
  423. task_count: 4,
  424. aborted_task_count: 1,
  425. completed_task_count: 1,
  426. failed_task_count: 1,
  427. timed_out_task_count: 1,
  428. queued_task_count: 0
  429. }
  430. },
  431. result: false
  432. }
  433. ];
  434. testCases.forEach(function (test) {
  435. it(test.title, function () {
  436. expect(controller.isRequestRunning(test.request)).to.eql(test.result);
  437. });
  438. });
  439. });
  440. describe('#isOneHost()', function () {
  441. var testCases = [
  442. {
  443. title: 'inputs is null',
  444. inputs: null,
  445. result: false
  446. },
  447. {
  448. title: 'inputs is "null"',
  449. inputs: 'null',
  450. result: false
  451. },
  452. {
  453. title: 'inputs is empty object',
  454. inputs: '{}',
  455. result: false
  456. },
  457. {
  458. title: 'included_hosts is empty',
  459. inputs: '{"included_hosts": ""}',
  460. result: false
  461. },
  462. {
  463. title: 'included_hosts contain one host',
  464. inputs: '{"included_hosts": "host1"}',
  465. result: true
  466. },
  467. {
  468. title: 'included_hosts contain two hosts',
  469. inputs: '{"included_hosts": "host1,host2"}',
  470. result: false
  471. }
  472. ];
  473. testCases.forEach(function (test) {
  474. it(test.title, function () {
  475. expect(controller.isOneHost(test.inputs)).to.eql(test.result);
  476. });
  477. });
  478. });
  479. describe('#assignScheduleId()', function () {
  480. var testCases = [
  481. {
  482. title: 'isOneHost is false',
  483. content: {
  484. request: {
  485. Requests: {
  486. request_schedule: {
  487. schedule_id: 1
  488. },
  489. inputs: null
  490. }
  491. },
  492. requestParams: ''
  493. },
  494. result: 1
  495. },
  496. {
  497. title: 'isOneHost is true and requestContext is empty',
  498. content: {
  499. request: {
  500. Requests: {
  501. request_schedule: {
  502. schedule_id: 1
  503. },
  504. inputs: '{"included_hosts": "host1"}'
  505. }
  506. },
  507. requestParams: {
  508. requestContext: ''
  509. }
  510. },
  511. result: 1
  512. },
  513. {
  514. title: 'isOneHost is true and requestContext contains "Recommission"',
  515. content: {
  516. request: {
  517. Requests: {
  518. request_schedule: {
  519. schedule_id: 1
  520. },
  521. inputs: '{"included_hosts": "host1"}'
  522. }
  523. },
  524. requestParams: {
  525. requestContext: 'Recommission'
  526. }
  527. },
  528. result: null
  529. }
  530. ];
  531. testCases.forEach(function (test) {
  532. it(test.title, function () {
  533. controller.assignScheduleId(test.content.request, test.content.requestParams);
  534. expect(test.content.request.Requests.request_schedule.schedule_id).to.equal(test.result);
  535. });
  536. });
  537. });
  538. describe('#callBackFilteredByRequest()', function () {
  539. it('request haven\'t tasks and isRunning false', function () {
  540. var data = {
  541. Requests: {id: 1},
  542. tasks: []
  543. };
  544. var request = Em.Object.create({
  545. id: 1,
  546. previousTaskStatusMap: {},
  547. isRunning: false,
  548. progress: 0,
  549. status:''
  550. });
  551. controller.set('services', [request]);
  552. controller.callBackFilteredByRequest(data);
  553. expect(request.get('previousTaskStatusMap')).to.eql({});
  554. expect(request.get('hostsMap')).to.eql({});
  555. expect(request.get('isRunning')).to.equal(false);
  556. });
  557. it('request haven\'t tasks and isRunning true', function () {
  558. var data = {
  559. Requests: {id: 1},
  560. tasks: []
  561. };
  562. var request = Em.Object.create({
  563. id: 1,
  564. previousTaskStatusMap: {},
  565. isRunning: true,
  566. progress: 0,
  567. status:''
  568. });
  569. controller.set('services', [request]);
  570. controller.callBackFilteredByRequest(data);
  571. expect(request.get('previousTaskStatusMap')).to.eql({});
  572. expect(request.get('hostsMap')).to.eql({});
  573. expect(request.get('isRunning')).to.equal(true);
  574. });
  575. it('request has one completed task', function () {
  576. var data = {
  577. Requests: {id: 1},
  578. tasks: [
  579. {
  580. Tasks: {
  581. id: 1,
  582. host_name: 'host1',
  583. status: 'COMPLETED'
  584. }
  585. }
  586. ]
  587. };
  588. var request = Em.Object.create({
  589. id: 1,
  590. previousTaskStatusMap: {},
  591. isRunning: true,
  592. progress: 100,
  593. status:''
  594. });
  595. controller.set('services', [request]);
  596. controller.callBackFilteredByRequest(data);
  597. expect(request.get('previousTaskStatusMap')).to.eql({"1": "COMPLETED"});
  598. expect(request.get('hostsMap')['host1'].logTasks.length).to.equal(1);
  599. expect(request.get('isRunning')).to.equal(false);
  600. });
  601. it('request has one completed task and one running task', function () {
  602. var data = {
  603. Requests: {id: 1},
  604. tasks: [
  605. {
  606. Tasks: {
  607. id: 1,
  608. host_name: 'host1',
  609. status: 'COMPLETED'
  610. }
  611. },
  612. {
  613. Tasks: {
  614. id: 2,
  615. host_name: 'host1',
  616. status: 'IN_PROGRESS'
  617. }
  618. }
  619. ]
  620. };
  621. var request = Em.Object.create({
  622. id: 1,
  623. previousTaskStatusMap: {},
  624. isRunning: true,
  625. progress: 100,
  626. status:''
  627. });
  628. controller.set('services', [request]);
  629. controller.callBackFilteredByRequest(data);
  630. expect(request.get('previousTaskStatusMap')).to.eql({"1": "COMPLETED", "2": "IN_PROGRESS"});
  631. expect(request.get('hostsMap')['host1'].logTasks.length).to.equal(2);
  632. expect(request.get('isRunning')).to.equal(true);
  633. });
  634. });
  635. });