update_controller_test.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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('utils/updater');
  20. require('controllers/global/update_controller');
  21. describe('App.UpdateController', function () {
  22. var controller = App.UpdateController.create({
  23. clusterName: '',
  24. location: '',
  25. updateServiceMetric: function(){}
  26. });
  27. App.TestAliases.testAsComputedAlias(App.UpdateController.create(), 'clusterName', 'App.router.clusterController.clusterName', 'string');
  28. App.TestAliases.testAsComputedAnd(App.UpdateController.create(), 'updateAlertInstances', ['isWorking', '!App.router.mainAlertInstancesController.isUpdating']);
  29. describe('#getUrl()', function () {
  30. beforeEach(function () {
  31. sinon.stub(App, 'get').withArgs('testMode').returns(false);
  32. });
  33. afterEach(function () {
  34. App.get.restore();
  35. });
  36. it('testMode = false', function () {
  37. expect(controller.getUrl('test', '/real')).to.equal('/api/v1/clusters//real');
  38. });
  39. it('testMode = false (2)', function () {
  40. controller.set('clusterName', 'mycluster');
  41. expect(controller.getUrl('test', '/real')).to.equal('/api/v1/clusters/mycluster/real');
  42. });
  43. });
  44. describe('#updateAll()', function () {
  45. beforeEach(function () {
  46. sinon.stub(App.updater, 'run', Em.K);
  47. });
  48. afterEach(function () {
  49. App.updater.run.restore();
  50. });
  51. it('isWorking = false', function () {
  52. controller.set('isWorking', false);
  53. expect(App.updater.run.called).to.equal(false);
  54. });
  55. it('isWorking = true', function () {
  56. controller.set('isWorking', true);
  57. expect(App.updater.run.callCount).to.equal(12);
  58. });
  59. });
  60. describe('#getConditionalFields()', function () {
  61. var testCases = [
  62. {
  63. title: 'No services exist',
  64. services: [],
  65. result: ['metrics/1']
  66. },
  67. {
  68. title: 'HDFS service',
  69. services: [
  70. {
  71. ServiceInfo: {
  72. service_name: 'HDFS'
  73. }
  74. }
  75. ],
  76. result: ['metrics/1']
  77. },
  78. {
  79. title: 'FLUME service',
  80. services: [
  81. {
  82. ServiceInfo: {
  83. service_name: 'FLUME'
  84. }
  85. }
  86. ],
  87. result: ['metrics/1', "host_components/processes/HostComponentProcess"]
  88. },
  89. {
  90. title: 'YARN service',
  91. services: [
  92. {
  93. ServiceInfo: {
  94. service_name: 'YARN'
  95. }
  96. }
  97. ],
  98. result: ['metrics/1', "host_components/metrics/yarn/Queue," +
  99. "host_components/metrics/yarn/ClusterMetrics/NumActiveNMs," +
  100. "host_components/metrics/yarn/ClusterMetrics/NumLostNMs," +
  101. "host_components/metrics/yarn/ClusterMetrics/NumUnhealthyNMs," +
  102. "host_components/metrics/yarn/ClusterMetrics/NumRebootedNMs," +
  103. "host_components/metrics/yarn/ClusterMetrics/NumDecommissionedNMs"]
  104. },
  105. {
  106. title: 'HBASE service',
  107. services: [
  108. {
  109. ServiceInfo: {
  110. service_name: 'HBASE'
  111. }
  112. }
  113. ],
  114. result: ['metrics/1', "host_components/metrics/hbase/master/IsActiveMaster," +
  115. "host_components/metrics/hbase/master/MasterStartTime," +
  116. "host_components/metrics/hbase/master/MasterActiveTime," +
  117. "host_components/metrics/hbase/master/AverageLoad," +
  118. "host_components/metrics/master/AssignmentManger/ritCount"]
  119. },
  120. {
  121. title: 'STORM service',
  122. services: [
  123. {
  124. ServiceInfo: {
  125. service_name: 'STORM'
  126. }
  127. }
  128. ],
  129. result: ['metrics/1', "metrics/api/v1/cluster/summary," +
  130. "metrics/api/v1/topology/summary," +
  131. "metrics/api/v1/nimbus/summary"]
  132. }
  133. ];
  134. var testCasesByStackVersion = [
  135. {
  136. title: 'STORM service stack 2.1',
  137. services: [
  138. {
  139. ServiceInfo: {
  140. service_name: 'STORM'
  141. }
  142. }
  143. ],
  144. stackVersionNumber: '2.1',
  145. result: ['metrics/1', "metrics/api/cluster/summary"]
  146. },
  147. {
  148. title: 'STORM service stack 2.2',
  149. services: [
  150. {
  151. ServiceInfo: {
  152. service_name: 'STORM'
  153. }
  154. }
  155. ],
  156. stackVersionNumber: '2.2',
  157. result: ['metrics/1', "metrics/api/v1/cluster/summary,metrics/api/v1/topology/summary"]
  158. },
  159. {
  160. title: 'STORM service stack 2.3',
  161. services: [
  162. {
  163. ServiceInfo: {
  164. service_name: 'STORM'
  165. }
  166. }
  167. ],
  168. stackVersionNumber: '2.3',
  169. result: ['metrics/1', "metrics/api/v1/cluster/summary,metrics/api/v1/topology/summary,metrics/api/v1/nimbus/summary"]
  170. }
  171. ];
  172. beforeEach(function () {
  173. this.mock = sinon.stub(App, 'get');
  174. controller.set('serviceComponentMetrics', ['metrics/1']);
  175. });
  176. afterEach(function () {
  177. this.mock.restore();
  178. });
  179. testCases.forEach(function (test) {
  180. it(test.title, function () {
  181. App.cache['services'] = test.services;
  182. this.mock.withArgs('router.clusterController.isServiceMetricsLoaded').returns(true);
  183. expect(controller.getConditionalFields()).to.eql(test.result);
  184. });
  185. });
  186. testCasesByStackVersion.forEach(function (test) {
  187. it(test.title, function () {
  188. App.cache['services'] = test.services;
  189. this.mock.withArgs('currentStackVersionNumber').returns(test.stackVersionNumber);
  190. this.mock.withArgs('router.clusterController.isServiceMetricsLoaded').returns(true);
  191. expect(controller.getConditionalFields()).to.eql(test.result);
  192. });
  193. });
  194. it('FLUME service, first load', function () {
  195. App.cache['services'] = [
  196. {
  197. ServiceInfo: {
  198. service_name: 'FLUME'
  199. }
  200. }
  201. ];
  202. this.mock.withArgs('router.clusterController.isServiceMetricsLoaded').returns(false);
  203. expect(controller.getConditionalFields()).to.eql(["host_components/processes/HostComponentProcess"]);
  204. });
  205. });
  206. describe("#getComplexUrl()", function () {
  207. beforeEach(function () {
  208. sinon.stub(App, 'get').returns('mock');
  209. sinon.stub(controller, 'computeParameters').returns('params');
  210. });
  211. afterEach(function () {
  212. App.get.restore();
  213. controller.computeParameters.restore();
  214. });
  215. it("queryParams is empty", function () {
  216. expect(controller.getComplexUrl('<parameters>')).to.equal('mock/clusters/mock');
  217. });
  218. it("queryParams is present", function () {
  219. var queryParams = [
  220. {
  221. type: "EQUAL",
  222. key: "key",
  223. value: "value"
  224. }
  225. ];
  226. expect(controller.getComplexUrl('<parameters>', queryParams)).to.equal('mock/clusters/mockparams&');
  227. });
  228. });
  229. describe("#addParamsToHostsUrl()", function () {
  230. beforeEach(function () {
  231. sinon.stub(App, 'get').returns('mock');
  232. sinon.stub(controller, 'computeParameters').returns('params');
  233. });
  234. afterEach(function () {
  235. App.get.restore();
  236. controller.computeParameters.restore();
  237. });
  238. it("valid params are added", function () {
  239. expect(controller.addParamsToHostsUrl([], [], 'url')).to.equal('mock/clusters/mockurl&params&params');
  240. });
  241. });
  242. describe("#loadHostsMetric()", function () {
  243. beforeEach(function () {
  244. this.mock = sinon.stub(App.Service, 'find');
  245. sinon.stub(controller, 'computeParameters');
  246. sinon.stub(controller, 'addParamsToHostsUrl');
  247. sinon.stub(App.ajax, 'send');
  248. });
  249. afterEach(function () {
  250. App.Service.find.restore();
  251. controller.computeParameters.restore();
  252. controller.addParamsToHostsUrl.restore();
  253. App.ajax.send.restore();
  254. });
  255. it("AMBARI_METRICS is not started", function () {
  256. this.mock.returns(Em.Object.create({isStarted: false}));
  257. expect(controller.loadHostsMetric([])).to.be.null;
  258. expect(App.ajax.send.called).to.be.false;
  259. });
  260. it("AMBARI_METRICS is started", function () {
  261. this.mock.returns(Em.Object.create({isStarted: true}));
  262. expect(controller.loadHostsMetric([])).to.be.object;
  263. expect(App.ajax.send.calledOnce).to.be.true;
  264. });
  265. });
  266. describe("#loadHostsMetricSuccessCallback()", function () {
  267. beforeEach(function () {
  268. sinon.stub(App.hostsMapper, 'setMetrics');
  269. });
  270. afterEach(function () {
  271. App.hostsMapper.setMetrics.restore();
  272. });
  273. it("setMetrics called with valid arguments", function () {
  274. controller.loadHostsMetricSuccessCallback({});
  275. expect(App.hostsMapper.setMetrics.calledWith({})).to.be.true;
  276. });
  277. });
  278. describe('#updateUpgradeState()', function () {
  279. var cases = [
  280. {
  281. currentStateName: 'versions',
  282. parentStateName: 'stackAndUpgrade',
  283. wizardIsNotFinished: true,
  284. isLoadUpgradeDataPending: true,
  285. loadUpgradeDataCallCount: 0,
  286. callbackCallCount: 1,
  287. title: 'stack versions page'
  288. },
  289. {
  290. currentStateName: 'stackUpgrade',
  291. parentStateName: 'admin',
  292. wizardIsNotFinished: true,
  293. isLoadUpgradeDataPending: true,
  294. loadUpgradeDataCallCount: 0,
  295. callbackCallCount: 1,
  296. title: 'upgrade popup open'
  297. },
  298. {
  299. currentStateName: 'versions',
  300. parentStateName: 'admin',
  301. wizardIsNotFinished: true,
  302. isLoadUpgradeDataPending: false,
  303. loadUpgradeDataCallCount: 1,
  304. callbackCallCount: 0,
  305. title: 'another page with \'versions\' name'
  306. },
  307. {
  308. currentStateName: 'versions',
  309. parentStateName: 'admin',
  310. wizardIsNotFinished: false,
  311. isLoadUpgradeDataPending: false,
  312. loadUpgradeDataCallCount: 0,
  313. callbackCallCount: 1,
  314. title: 'another page with \'versions\' name, upgrade finished'
  315. },
  316. {
  317. currentStateName: 'versions',
  318. parentStateName: 'admin',
  319. wizardIsNotFinished: true,
  320. isLoadUpgradeDataPending: true,
  321. loadUpgradeDataCallCount: 0,
  322. callbackCallCount: 1,
  323. title: 'another page with \'versions\' name, another update upgrade request not completed'
  324. },
  325. {
  326. currentStateName: 'services',
  327. parentStateName: 'stackAndUpgrade',
  328. wizardIsNotFinished: true,
  329. isLoadUpgradeDataPending: false,
  330. loadUpgradeDataCallCount: 1,
  331. callbackCallCount: 0,
  332. title: 'another page from \'Stack and Versions\' section'
  333. },
  334. {
  335. currentStateName: 'services',
  336. parentStateName: 'stackAndUpgrade',
  337. wizardIsNotFinished: false,
  338. isLoadUpgradeDataPending: false,
  339. loadUpgradeDataCallCount: 0,
  340. callbackCallCount: 1,
  341. title: 'another page from \'Stack and Versions\' section, upgrade finished'
  342. },
  343. {
  344. currentStateName: 'services',
  345. parentStateName: 'stackAndUpgrade',
  346. wizardIsNotFinished: true,
  347. isLoadUpgradeDataPending: true,
  348. loadUpgradeDataCallCount: 0,
  349. callbackCallCount: 1,
  350. title: 'another page from \'Stack and Versions\' section, another update upgrade request not completed'
  351. },
  352. {
  353. currentStateName: 'widgets',
  354. parentStateName: 'dashboard',
  355. wizardIsNotFinished: true,
  356. isLoadUpgradeDataPending: false,
  357. loadUpgradeDataCallCount: 1,
  358. callbackCallCount: 0,
  359. title: 'not \'Stack and Versions\' section'
  360. },
  361. {
  362. currentStateName: 'widgets',
  363. parentStateName: 'dashboard',
  364. wizardIsNotFinished: false,
  365. isLoadUpgradeDataPending: false,
  366. loadUpgradeDataCallCount: 0,
  367. callbackCallCount: 1,
  368. title: 'not \'Stack and Versions\' section, upgrade finished'
  369. },
  370. {
  371. currentStateName: 'widgets',
  372. parentStateName: 'dashboard',
  373. wizardIsNotFinished: true,
  374. isLoadUpgradeDataPending: true,
  375. loadUpgradeDataCallCount: 0,
  376. callbackCallCount: 1,
  377. title: 'not \'Stack and Versions\' section, another update upgrade request not completed'
  378. }
  379. ],
  380. mock = {
  381. callback: Em.K,
  382. loadUpgradeData: function () {
  383. return {
  384. done: Em.K
  385. };
  386. }
  387. },
  388. mainAdminStackAndUpgradeController = App.get('router.mainAdminStackAndUpgradeController'),
  389. appGetMock;
  390. beforeEach(function () {
  391. sinon.spy(mock, 'callback');
  392. sinon.spy(mock, 'loadUpgradeData');
  393. appGetMock = sinon.stub(App, 'get');
  394. });
  395. afterEach(function () {
  396. mock.callback.restore();
  397. mock.loadUpgradeData.restore();
  398. App.get.restore();
  399. appGetMock.restore();
  400. });
  401. cases.forEach(function (item) {
  402. it(item.title, function () {
  403. appGetMock.withArgs('router.mainAdminStackAndUpgradeController').returns(Em.Object.create({
  404. loadUpgradeData: mock.loadUpgradeData,
  405. isLoadUpgradeDataPending: item.isLoadUpgradeDataPending
  406. })).withArgs('wizardIsNotFinished').returns(item.wizardIsNotFinished)
  407. .withArgs('router.currentState.name').returns(item.currentStateName)
  408. .withArgs('router.currentState.parentState.name').returns(item.parentStateName);;
  409. controller.updateUpgradeState(mock.callback);
  410. expect(mock.loadUpgradeData.callCount).to.equal(item.loadUpgradeDataCallCount);
  411. expect(mock.callback.callCount).to.equal(item.callbackCallCount);
  412. });
  413. });
  414. });
  415. });