addSeccurityConfigs_test.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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. var stackDescriptorData = require('test/mock_data_setup/stack_descriptors');
  20. var stackDescriptor = stackDescriptorData.artifact_data;
  21. require('mixins/wizard/addSecurityConfigs');
  22. describe('App.AddSecurityConfigs', function () {
  23. var controller = Em.Object.extend(App.AddSecurityConfigs,{}).create({
  24. content: {},
  25. enableSubmit: function () {
  26. this._super();
  27. }
  28. });
  29. describe('#createServicesStackDescriptorConfigs', function() {
  30. var result = controller.createServicesStackDescriptorConfigs(stackDescriptorData);
  31. var propertyValidationTests = [
  32. {
  33. property: 'spnego_keytab',
  34. e: [
  35. { key: 'value', value: '${keytab_dir}/spnego.service.keytab' },
  36. { key: 'serviceName', value: 'Cluster' }
  37. ]
  38. },
  39. // principal name inherited from /spnego with predefined value
  40. {
  41. property: 'oozie.authentication.kerberos.principal',
  42. e: [
  43. { key: 'value', value: 'HTTP/${host}@${realm}' },
  44. { key: 'isEditable', value: true }
  45. ]
  46. },
  47. // keytab inherited from /spnego without predefined file value
  48. {
  49. property: 'oozie.authentication.kerberos.keytab',
  50. e: [
  51. { key: 'value', value: null },
  52. { key: 'isEditable', value: false },
  53. { key: 'referenceProperty', value: 'spnego:keytab' },
  54. { key: 'observesValueFrom', value: 'spnego_keytab' }
  55. ]
  56. }
  57. ];
  58. propertyValidationTests.forEach(function(test) {
  59. it('property {0} should be created'.format(test.property), function() {
  60. expect(result.findProperty('name', test.property)).to.be.ok;
  61. });
  62. test.e.forEach(function(expected) {
  63. it('property `{0}` should have `{1}` with value `{2}`'.format(test.property, expected.key, expected.value), function() {
  64. expect(result.findProperty('name', test.property)).to.have.deep.property(expected.key, expected.value);
  65. });
  66. });
  67. });
  68. });
  69. describe('#expandKerberosStackDescriptorProps', function() {
  70. var serviceName = 'Cluster';
  71. var result = controller.expandKerberosStackDescriptorProps(stackDescriptor.properties, serviceName);
  72. var testCases = [
  73. {
  74. property: 'realm',
  75. e: [
  76. { key: 'isEditable', value: false },
  77. { key: 'serviceName', value: 'Cluster' }
  78. ]
  79. },
  80. {
  81. property: 'keytab_dir',
  82. e: [
  83. { key: 'isEditable', value: true },
  84. { key: 'serviceName', value: 'Cluster' }
  85. ]
  86. }
  87. ];
  88. testCases.forEach(function(test) {
  89. it('property {0} should be created'.format(test.property), function() {
  90. expect(result.findProperty('name', test.property)).to.be.ok;
  91. });
  92. test.e.forEach(function(expected) {
  93. it('property `{0}` should have `{1}` with value `{2}`'.format(test.property, expected.key, expected.value), function() {
  94. expect(result.findProperty('name', test.property)).to.have.deep.property(expected.key, expected.value);
  95. });
  96. });
  97. });
  98. });
  99. describe('#createConfigsByIdentity', function() {
  100. var identitiesData = stackDescriptor.services[0].components[0].identities;
  101. var tests = [
  102. {
  103. property: 'dfs.namenode.kerberos.principal',
  104. e: [
  105. { key: 'value', value: 'nn/_HOST@${realm}' }
  106. ]
  107. },
  108. {
  109. property: 'dfs.web.authentication.kerberos.principal',
  110. e: [
  111. { key: 'referenceProperty', value: 'spnego:principal' },
  112. { key: 'isEditable', value: false }
  113. ]
  114. }
  115. ];
  116. var properties = controller.createConfigsByIdentities(identitiesData, 'HDFS');
  117. tests.forEach(function(test) {
  118. it('property {0} should be created'.format(test.property), function() {
  119. expect(properties.findProperty('name', test.property)).to.be.ok;
  120. });
  121. test.e.forEach(function(expected) {
  122. it('property `{0}` should have `{1}` with value `{2}`'.format(test.property, expected.key, expected.value), function() {
  123. expect(properties.findProperty('name', test.property)).to.have.deep.property(expected.key, expected.value);
  124. });
  125. });
  126. });
  127. });
  128. describe('#parseIdentityObject', function() {
  129. var testCases = [
  130. {
  131. identity: stackDescriptor.services[0].components[0].identities[0],
  132. tests: [
  133. {
  134. property: 'dfs.namenode.kerberos.principal',
  135. e: [
  136. { key: 'filename', value: 'hdfs-site' }
  137. ]
  138. },
  139. {
  140. property: 'dfs.namenode.keytab.file',
  141. e: [
  142. { key: 'value', value: '${keytab_dir}/nn.service.keytab' }
  143. ]
  144. }
  145. ]
  146. },
  147. {
  148. identity: stackDescriptor.services[0].components[0].identities[1],
  149. tests: [
  150. {
  151. property: 'dfs.namenode.kerberos.https.principal',
  152. e: [
  153. { key: 'filename', value: 'hdfs-site' }
  154. ]
  155. }
  156. ]
  157. },
  158. {
  159. identity: stackDescriptor.identities[0],
  160. tests: [
  161. {
  162. property: 'spnego_principal',
  163. e: [
  164. { key: 'displayName', value: 'Spnego Principal' },
  165. { key: 'filename', value: 'cluster-env' }
  166. ]
  167. }
  168. ]
  169. },
  170. {
  171. identity: stackDescriptor.identities[0],
  172. tests: [
  173. {
  174. property: 'spnego_keytab',
  175. e: [
  176. { key: 'displayName', value: 'Spnego Keytab' },
  177. { key: 'filename', value: 'cluster-env' }
  178. ]
  179. }
  180. ]
  181. }
  182. ];
  183. testCases.forEach(function(testCase) {
  184. testCase.tests.forEach(function(test) {
  185. var result = controller.parseIdentityObject(testCase.identity);
  186. it('property `{0}` should be present'.format(test.property), function() {
  187. expect(result.findProperty('name', test.property)).to.be.ok;
  188. });
  189. test.e.forEach(function(expected) {
  190. it('property `{0}` should have `{1}` with value `{2}`'.format(test.property, expected.key, expected.value), function() {
  191. expect(result.findProperty('name', test.property)).to.have.deep.property(expected.key, expected.value);
  192. });
  193. });
  194. });
  195. });
  196. });
  197. describe('#processConfigReferences', function() {
  198. var generateProperty = function(name, reference) {
  199. return Em.Object.create({ name: name, referenceProperty: reference});
  200. };
  201. var descriptor = {
  202. identities: [
  203. { name: 'spnego', principal: { value: 'spnego_value' }, keytab: { file: 'spnego_file'} },
  204. { name: 'hdfs',
  205. principal: { value: 'hdfs_value', configuration: "hadoop-env/hdfs_user_principal_name" },
  206. keytab: { file: 'hdfs_file', configuration: "hadoop-env/hdfs_user_keytab"} }
  207. ],
  208. services: [
  209. {
  210. name: 'SERVICE',
  211. identities: [
  212. { name: '/spnego' },
  213. { name: '/hdfs' }
  214. ]
  215. },
  216. {
  217. name: 'SERVICE2',
  218. components: [
  219. {
  220. name: 'COMPONENT',
  221. identities: [
  222. {
  223. name: 'component_prop1',
  224. keytab: { configuration: 'service2-site/component.keytab' },
  225. principal: { configuration: null }
  226. },
  227. {
  228. name: 'component_prop2',
  229. keytab: { configuration: 'service2-site/component2.keytab' },
  230. principal: { configuration: 'service2-site/component2.principal' }
  231. }
  232. ]
  233. }
  234. ]
  235. }
  236. ]
  237. };
  238. var configs = Em.A([
  239. generateProperty('spnego_inherited_keytab', 'spnego:keytab'),
  240. generateProperty('spnego_inherited_principal', 'spnego:principal'),
  241. generateProperty('hdfs_inherited_keytab', 'hdfs:keytab'),
  242. generateProperty('hdfs_inherited_principal', 'hdfs:principal'),
  243. generateProperty('component_prop1_inherited_principal', 'component_prop1:principal'),
  244. generateProperty('component_prop1_inherited_keytab', 'component_prop1:keytab'),
  245. generateProperty('component_prop2_inherited_keytab', 'component_prop2:keytab'),
  246. generateProperty('component_prop2_inherited_principal', 'component_prop2:principal')
  247. ]);
  248. var tests = [
  249. { name: 'spnego_inherited_keytab', e: 'spnego_keytab' },
  250. { name: 'spnego_inherited_principal', e: 'spnego_principal' },
  251. { name: 'hdfs_inherited_keytab', e: 'hdfs_user_keytab' },
  252. { name: 'hdfs_inherited_principal', e: 'hdfs_user_principal_name' },
  253. { name: 'component_prop1_inherited_keytab', e: 'component.keytab' },
  254. { name: 'component_prop1_inherited_principal', e: 'component_prop1_principal' },
  255. { name: 'component_prop2_inherited_keytab', e: 'component2.keytab' },
  256. { name: 'component_prop2_inherited_principal', e: 'component2.principal' }
  257. ];
  258. before(function() {
  259. controller.processConfigReferences(descriptor, configs);
  260. });
  261. tests.forEach(function(test) {
  262. it('`{0}` should observe value from `{1}` property'.format(test.name, test.e), function() {
  263. expect(configs.findProperty('name', test.name).get('observesValueFrom')).to.be.eql(test.e);
  264. });
  265. });
  266. });
  267. });