update_controller_test.js 14 KB

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