summary_test.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  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('models/host');
  20. require('models/service');
  21. require('models/host_component');
  22. require('mappers/server_data_mapper');
  23. require('views/main/host/summary');
  24. var mainHostSummaryView;
  25. var extendedMainHostSummaryView = App.MainHostSummaryView.extend({content: {}, addToolTip: function(){}, installedServices: []});
  26. describe('App.MainHostSummaryView', function() {
  27. beforeEach(function() {
  28. mainHostSummaryView = extendedMainHostSummaryView.create({});
  29. });
  30. describe('#sortedComponents', function() {
  31. var tests = Em.A([
  32. {
  33. content: Em.Object.create({
  34. hostComponents: Em.A([
  35. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  36. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  37. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  38. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D'})
  39. ])
  40. }),
  41. m: 'List of masters, slaves and clients',
  42. e: ['A', 'C', 'B']
  43. },
  44. {
  45. content: Em.Object.create({
  46. hostComponents: Em.A([
  47. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  48. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  49. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  50. Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'})
  51. ])
  52. }),
  53. m: 'List of masters and slaves',
  54. e: ['A', 'C', 'D', 'B']
  55. },
  56. {
  57. content: Em.Object.create({
  58. hostComponents: Em.A([
  59. Em.Object.create({isMaster: true, isSlave: false, componentName: 'B'}),
  60. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  61. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  62. Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'})
  63. ])
  64. }),
  65. m: 'List of masters',
  66. e: ['B', 'A', 'C', 'D']
  67. },
  68. {
  69. content: Em.Object.create({
  70. hostComponents: Em.A([
  71. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  72. Em.Object.create({isMaster: false, isSlave: true, componentName: 'A'}),
  73. Em.Object.create({isMaster: false, isSlave: true, componentName: 'C'}),
  74. Em.Object.create({isMaster: false, isSlave: true, componentName: 'D'})
  75. ])
  76. }),
  77. m: 'List of slaves',
  78. e: ['B', 'A', 'C', 'D']
  79. },
  80. {
  81. content: Em.Object.create({
  82. hostComponents: Em.A([])
  83. }),
  84. m: 'Empty list',
  85. e: []
  86. },
  87. {
  88. content: Em.Object.create({
  89. hostComponents: Em.A([
  90. Em.Object.create({isMaster: false, isSlave: false, componentName: 'B'}),
  91. Em.Object.create({isMaster: false, isSlave: false, componentName: 'A'}),
  92. Em.Object.create({isMaster: false, isSlave: false, componentName: 'C'}),
  93. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D'})
  94. ])
  95. }),
  96. m: 'List of clients',
  97. e: []
  98. }
  99. ]);
  100. tests.forEach(function(test) {
  101. it(test.m, function() {
  102. test.content.get('hostComponents').forEach(function(component) {
  103. component.set('id', component.get('componentName'));
  104. });
  105. mainHostSummaryView.set('sortedComponents', []);
  106. mainHostSummaryView.set('content', test.content);
  107. mainHostSummaryView.sortedComponentsFormatter();
  108. expect(mainHostSummaryView.get('sortedComponents').mapProperty('componentName')).to.eql(test.e);
  109. });
  110. });
  111. });
  112. describe('#clients', function() {
  113. var tests = Em.A([
  114. {
  115. content: Em.Object.create({
  116. hostComponents: Em.A([
  117. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  118. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  119. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  120. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D'})
  121. ])
  122. }),
  123. m: 'List of masters, slaves and clients',
  124. e: ['D']
  125. },
  126. {
  127. content: Em.Object.create({
  128. hostComponents: Em.A([
  129. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  130. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  131. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  132. Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'})
  133. ])
  134. }),
  135. m: 'List of masters and slaves',
  136. e: []
  137. },
  138. {
  139. content: Em.Object.create({
  140. hostComponents: Em.A([
  141. Em.Object.create({isMaster: true, isSlave: false, componentName: 'B'}),
  142. Em.Object.create({isMaster: true, isSlave: false, componentName: 'A'}),
  143. Em.Object.create({isMaster: true, isSlave: false, componentName: 'C'}),
  144. Em.Object.create({isMaster: true, isSlave: false, componentName: 'D'})
  145. ])
  146. }),
  147. m: 'List of masters',
  148. e: []
  149. },
  150. {
  151. content: Em.Object.create({
  152. hostComponents: Em.A([
  153. Em.Object.create({isMaster: false, isSlave: true, componentName: 'B'}),
  154. Em.Object.create({isMaster: false, isSlave: true, componentName: 'A'}),
  155. Em.Object.create({isMaster: false, isSlave: true, componentName: 'C'}),
  156. Em.Object.create({isMaster: false, isSlave: true, componentName: 'D'})
  157. ])
  158. }),
  159. m: 'List of slaves',
  160. e: []
  161. },
  162. {
  163. content: Em.Object.create({
  164. hostComponents: Em.A([])
  165. }),
  166. m: 'Empty list',
  167. e: []
  168. },
  169. {
  170. content: Em.Object.create({
  171. hostComponents: Em.A([
  172. Em.Object.create({isMaster: false, isSlave: false, componentName: 'B'}),
  173. Em.Object.create({isMaster: false, isSlave: false, componentName: 'A'}),
  174. Em.Object.create({isMaster: false, isSlave: false, componentName: 'C'}),
  175. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D'})
  176. ])
  177. }),
  178. m: 'List of clients',
  179. e: ['B', 'A', 'C', 'D']
  180. }
  181. ]);
  182. tests.forEach(function(test) {
  183. it(test.m, function() {
  184. mainHostSummaryView.set('content', test.content);
  185. expect(mainHostSummaryView.get('clients').mapProperty('componentName')).to.eql(test.e);
  186. });
  187. });
  188. });
  189. describe('#areClientWithStaleConfigs', function() {
  190. var tests = Em.A([
  191. {
  192. content: Em.Object.create({
  193. hostComponents: Em.A([
  194. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D', staleConfigs: true}),
  195. Em.Object.create({isMaster: false, isSlave: false, componentName: 'C', staleConfigs: false})
  196. ])
  197. }),
  198. m: 'Some clients with stale configs',
  199. e: true
  200. },
  201. {
  202. content: Em.Object.create({
  203. hostComponents: Em.A([
  204. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D', staleConfigs: false}),
  205. Em.Object.create({isMaster: false, isSlave: false, componentName: 'C', staleConfigs: false})
  206. ])
  207. }),
  208. m: 'No clients with stale configs',
  209. e: false
  210. },
  211. {
  212. content: Em.Object.create({
  213. hostComponents: Em.A([
  214. Em.Object.create({isMaster: false, isSlave: false, componentName: 'D', staleConfigs: true}),
  215. Em.Object.create({isMaster: false, isSlave: false, componentName: 'C', staleConfigs: true})
  216. ])
  217. }),
  218. m: 'All clients with stale configs',
  219. e: true
  220. },
  221. {
  222. content: Em.Object.create({
  223. hostComponents: Em.A([])
  224. }),
  225. m: 'Empty list',
  226. e: false
  227. }
  228. ]);
  229. tests.forEach(function(test) {
  230. it(test.m, function() {
  231. mainHostSummaryView.set('content', test.content);
  232. expect(mainHostSummaryView.get('areClientWithStaleConfigs')).to.equal(test.e);
  233. });
  234. });
  235. });
  236. describe('#isAddComponent', function() {
  237. var tests = Em.A([
  238. {content: {healthClass: 'health-status-DEAD-YELLOW', hostComponents: Em.A([])}, e: false},
  239. {content: {healthClass: 'OTHER_VALUE', hostComponents: Em.A([])}, e: true}
  240. ]);
  241. tests.forEach(function(test) {
  242. it(test.content.healthClass, function() {
  243. mainHostSummaryView.set('content', test.content);
  244. expect(mainHostSummaryView.get('isAddComponent')).to.equal(test.e);
  245. });
  246. });
  247. });
  248. describe('#installableClientComponents', function() {
  249. it('delete host not supported', function() {
  250. App.set('supports.deleteHost', false);
  251. expect(mainHostSummaryView.get('installableClientComponents')).to.eql([]);
  252. App.set('supports.deleteHost', true);
  253. });
  254. var tests = Em.A([
  255. {
  256. content: Em.Object.create({
  257. hostComponents: Em.A([])
  258. }),
  259. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  260. e: ['HDFS_CLIENT', 'YARN_CLIENT', 'MAPREDUCE2_CLIENT'],
  261. m: 'no one client installed'
  262. },
  263. {
  264. content: Em.Object.create({
  265. hostComponents: Em.A([
  266. Em.Object.create({
  267. componentName: 'HDFS_CLIENT'
  268. })
  269. ])
  270. }),
  271. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  272. e: ['YARN_CLIENT', 'MAPREDUCE2_CLIENT'],
  273. m: 'some clients are already installed'
  274. },
  275. {
  276. content: Em.Object.create({
  277. hostComponents: Em.A([
  278. Em.Object.create({
  279. componentName: 'HDFS_CLIENT'
  280. }),
  281. Em.Object.create({
  282. componentName: 'YARN_CLIENT'
  283. }),
  284. Em.Object.create({
  285. componentName: 'MAPREDUCE2_CLIENT'
  286. })
  287. ])
  288. }),
  289. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  290. e: [],
  291. m: 'all clients are already installed'
  292. }
  293. ]);
  294. tests.forEach(function(test) {
  295. it(test.m, function() {
  296. mainHostSummaryView.set('content', test.content);
  297. mainHostSummaryView.set('installedServices', test.services);
  298. expect(mainHostSummaryView.get('installableClientComponents')).to.include.members(test.e);
  299. expect(test.e).to.include.members(mainHostSummaryView.get('installableClientComponents'));
  300. });
  301. });
  302. });
  303. describe('#addableComponents', function() {
  304. var tests = Em.A([
  305. {
  306. content: Em.Object.create({
  307. hostComponents: Em.A([])
  308. }),
  309. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  310. e: ['DATANODE', 'NODEMANAGER', 'CLIENTS'],
  311. m: 'no components on host (impossible IRL, but should be tested)'
  312. },
  313. {
  314. content: Em.Object.create({
  315. hostComponents: Em.A([
  316. Em.Object.create({
  317. componentName: 'HDFS_CLIENT'
  318. }),
  319. Em.Object.create({
  320. componentName: 'DATANODE'
  321. })
  322. ])
  323. }),
  324. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  325. e: ['NODEMANAGER', 'CLIENTS'],
  326. m: 'some components are already installed'
  327. },
  328. {
  329. content: Em.Object.create({
  330. hostComponents: Em.A([
  331. Em.Object.create({
  332. componentName: 'HDFS_CLIENT'
  333. }),
  334. Em.Object.create({
  335. componentName: 'YARN_CLIENT'
  336. }),
  337. Em.Object.create({
  338. componentName: 'MAPREDUCE2_CLIENT'
  339. }),
  340. Em.Object.create({
  341. componentName: 'NODEMANAGER'
  342. })
  343. ])
  344. }),
  345. services: ['HDFS', 'YARN', 'MAPREDUCE2'],
  346. e: ['DATANODE'],
  347. m: 'all clients and some other components are already installed'
  348. }
  349. ]);
  350. tests.forEach(function(test) {
  351. it(test.m, function() {
  352. mainHostSummaryView.set('content', test.content);
  353. mainHostSummaryView.set('installedServices', test.services);
  354. expect(mainHostSummaryView.get('addableComponents').mapProperty('componentName')).to.include.members(test.e);
  355. expect(test.e).to.include.members(mainHostSummaryView.get('addableComponents').mapProperty('componentName'));
  356. });
  357. });
  358. });
  359. });