oc_serviceaccount_secret.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. #!/usr/bin/env python2
  2. '''
  3. Unit tests for oc secret add
  4. '''
  5. # To run:
  6. # ./oc_serviceaccount_secret.py
  7. #
  8. # .
  9. # Ran 1 test in 0.002s
  10. #
  11. # OK
  12. import os
  13. import sys
  14. import unittest
  15. import mock
  16. # Removing invalid variable names for tests so that I can
  17. # keep them brief
  18. # pylint: disable=invalid-name,no-name-in-module
  19. # Disable import-error b/c our libraries aren't loaded in jenkins
  20. # pylint: disable=import-error,wrong-import-position
  21. # place class in our python path
  22. module_path = os.path.join('/'.join(os.path.realpath(__file__).split('/')[:-4]), 'library') # noqa: E501
  23. sys.path.insert(0, module_path)
  24. from oc_serviceaccount_secret import OCServiceAccountSecret # noqa: E402
  25. try:
  26. import ruamel.yaml as yaml # noqa: EF401
  27. YAML_TYPE = 'ruamel'
  28. except ImportError:
  29. YAML_TYPE = 'pyyaml'
  30. class OCServiceAccountSecretTest(unittest.TestCase):
  31. '''
  32. Test class for OCServiceAccountSecret
  33. '''
  34. def setUp(self):
  35. ''' setup method will create a file and set to known configuration '''
  36. pass
  37. @mock.patch('oc_serviceaccount_secret.Utils.create_tmpfile_copy')
  38. @mock.patch('oc_serviceaccount_secret.Yedit._write')
  39. @mock.patch('oc_serviceaccount_secret.OCServiceAccountSecret._run')
  40. def test_adding_a_secret_to_a_serviceaccount(self, mock_cmd, mock_write, mock_tmpfile_copy):
  41. ''' Testing adding a secret to a service account '''
  42. # Arrange
  43. # run_ansible input parameters
  44. params = {
  45. 'state': 'present',
  46. 'namespace': 'default',
  47. 'secret': 'newsecret',
  48. 'service_account': 'builder',
  49. 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
  50. 'debug': False,
  51. }
  52. oc_get_sa_before = '''{
  53. "apiVersion": "v1",
  54. "imagePullSecrets": [
  55. {
  56. "name": "builder-dockercfg-rsrua"
  57. }
  58. ],
  59. "kind": "ServiceAccount",
  60. "metadata": {
  61. "name": "builder",
  62. "namespace": "default",
  63. "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
  64. "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
  65. "resourceVersion": "302879",
  66. "creationTimestamp": "2017-02-05T17:02:00Z"
  67. },
  68. "secrets": [
  69. {
  70. "name": "builder-dockercfg-rsrua"
  71. },
  72. {
  73. "name": "builder-token-akqxi"
  74. }
  75. ]
  76. }
  77. '''
  78. oc_get_sa_after = '''{
  79. "apiVersion": "v1",
  80. "imagePullSecrets": [
  81. {
  82. "name": "builder-dockercfg-rsrua"
  83. }
  84. ],
  85. "kind": "ServiceAccount",
  86. "metadata": {
  87. "name": "builder",
  88. "namespace": "default",
  89. "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
  90. "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
  91. "resourceVersion": "302879",
  92. "creationTimestamp": "2017-02-05T17:02:00Z"
  93. },
  94. "secrets": [
  95. {
  96. "name": "builder-dockercfg-rsrua"
  97. },
  98. {
  99. "name": "builder-token-akqxi"
  100. },
  101. {
  102. "name": "newsecret"
  103. }
  104. ]
  105. }
  106. '''
  107. builder_ryaml_file = '''\
  108. secrets:
  109. - name: builder-dockercfg-rsrua
  110. - name: builder-token-akqxi
  111. - name: newsecret
  112. kind: ServiceAccount
  113. imagePullSecrets:
  114. - name: builder-dockercfg-rsrua
  115. apiVersion: v1
  116. metadata:
  117. name: builder
  118. namespace: default
  119. resourceVersion: '302879'
  120. creationTimestamp: '2017-02-05T17:02:00Z'
  121. selfLink: /api/v1/namespaces/default/serviceaccounts/builder
  122. uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
  123. '''
  124. builder_pyyaml_file = '''\
  125. apiVersion: v1
  126. imagePullSecrets:
  127. - name: builder-dockercfg-rsrua
  128. kind: ServiceAccount
  129. metadata:
  130. creationTimestamp: '2017-02-05T17:02:00Z'
  131. name: builder
  132. namespace: default
  133. resourceVersion: '302879'
  134. selfLink: /api/v1/namespaces/default/serviceaccounts/builder
  135. uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
  136. secrets:
  137. - name: builder-dockercfg-rsrua
  138. - name: builder-token-akqxi
  139. - name: newsecret
  140. '''
  141. # Return values of our mocked function call. These get returned once per call.
  142. mock_cmd.side_effect = [
  143. (0, oc_get_sa_before, ''), # First call to the mock
  144. (0, oc_get_sa_before, ''), # Second call to the mock
  145. (0, 'serviceaccount "builder" replaced', ''), # Third call to the mock
  146. (0, oc_get_sa_after, ''), # Fourth call to the mock
  147. ]
  148. mock_tmpfile_copy.side_effect = [
  149. '/tmp/mocked_kubeconfig',
  150. ]
  151. # Act
  152. results = OCServiceAccountSecret.run_ansible(params, False)
  153. # Assert
  154. self.assertTrue(results['changed'])
  155. self.assertEqual(results['results']['returncode'], 0)
  156. self.assertEqual(results['state'], 'present')
  157. # Making sure our mocks were called as we expected
  158. mock_cmd.assert_has_calls([
  159. mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
  160. mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
  161. mock.call(['oc', '-n', 'default', 'replace', '-f', mock.ANY], None),
  162. mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None)
  163. ])
  164. yaml_file = builder_pyyaml_file
  165. if YAML_TYPE == 'ruamel':
  166. yaml_file = builder_ryaml_file
  167. mock_write.assert_has_calls([
  168. mock.call(mock.ANY, yaml_file)
  169. ])
  170. @mock.patch('oc_serviceaccount_secret.Utils.create_tmpfile_copy')
  171. @mock.patch('oc_serviceaccount_secret.Yedit._write')
  172. @mock.patch('oc_serviceaccount_secret.OCServiceAccountSecret._run')
  173. def test_removing_a_secret_to_a_serviceaccount(self, mock_cmd, mock_write, mock_tmpfile_copy):
  174. ''' Testing removing a secret to a service account '''
  175. # Arrange
  176. # run_ansible input parameters
  177. params = {
  178. 'state': 'absent',
  179. 'namespace': 'default',
  180. 'secret': 'newsecret',
  181. 'service_account': 'builder',
  182. 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
  183. 'debug': False,
  184. }
  185. oc_get_sa_before = '''{
  186. "apiVersion": "v1",
  187. "imagePullSecrets": [
  188. {
  189. "name": "builder-dockercfg-rsrua"
  190. }
  191. ],
  192. "kind": "ServiceAccount",
  193. "metadata": {
  194. "name": "builder",
  195. "namespace": "default",
  196. "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
  197. "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
  198. "resourceVersion": "302879",
  199. "creationTimestamp": "2017-02-05T17:02:00Z"
  200. },
  201. "secrets": [
  202. {
  203. "name": "builder-dockercfg-rsrua"
  204. },
  205. {
  206. "name": "builder-token-akqxi"
  207. },
  208. {
  209. "name": "newsecret"
  210. }
  211. ]
  212. }
  213. '''
  214. builder_ryaml_file = '''\
  215. secrets:
  216. - name: builder-dockercfg-rsrua
  217. - name: builder-token-akqxi
  218. kind: ServiceAccount
  219. imagePullSecrets:
  220. - name: builder-dockercfg-rsrua
  221. apiVersion: v1
  222. metadata:
  223. name: builder
  224. namespace: default
  225. resourceVersion: '302879'
  226. creationTimestamp: '2017-02-05T17:02:00Z'
  227. selfLink: /api/v1/namespaces/default/serviceaccounts/builder
  228. uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
  229. '''
  230. builder_pyyaml_file = '''\
  231. apiVersion: v1
  232. imagePullSecrets:
  233. - name: builder-dockercfg-rsrua
  234. kind: ServiceAccount
  235. metadata:
  236. creationTimestamp: '2017-02-05T17:02:00Z'
  237. name: builder
  238. namespace: default
  239. resourceVersion: '302879'
  240. selfLink: /api/v1/namespaces/default/serviceaccounts/builder
  241. uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
  242. secrets:
  243. - name: builder-dockercfg-rsrua
  244. - name: builder-token-akqxi
  245. '''
  246. # Return values of our mocked function call. These get returned once per call.
  247. mock_cmd.side_effect = [
  248. (0, oc_get_sa_before, ''), # First call to the mock
  249. (0, oc_get_sa_before, ''), # Second call to the mock
  250. (0, 'serviceaccount "builder" replaced', ''), # Third call to the mock
  251. ]
  252. mock_tmpfile_copy.side_effect = [
  253. '/tmp/mocked_kubeconfig',
  254. ]
  255. # Act
  256. results = OCServiceAccountSecret.run_ansible(params, False)
  257. # Assert
  258. self.assertTrue(results['changed'])
  259. self.assertEqual(results['results']['returncode'], 0)
  260. self.assertEqual(results['state'], 'absent')
  261. # Making sure our mocks were called as we expected
  262. mock_cmd.assert_has_calls([
  263. mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
  264. mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
  265. mock.call(['oc', '-n', 'default', 'replace', '-f', mock.ANY], None),
  266. ])
  267. yaml_file = builder_pyyaml_file
  268. if YAML_TYPE == 'ruamel':
  269. yaml_file = builder_ryaml_file
  270. mock_write.assert_has_calls([
  271. mock.call(mock.ANY, yaml_file)
  272. ])
  273. def tearDown(self):
  274. '''TearDown method'''
  275. pass
  276. if __name__ == "__main__":
  277. unittest.main()