123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- #!/usr/bin/env python2
- '''
- Unit tests for oc secret add
- '''
- # To run:
- # ./oc_serviceaccount_secret.py
- #
- # .
- # Ran 1 test in 0.002s
- #
- # OK
- import os
- import sys
- import unittest
- import mock
- # Removing invalid variable names for tests so that I can
- # keep them brief
- # pylint: disable=invalid-name,no-name-in-module
- # Disable import-error b/c our libraries aren't loaded in jenkins
- # pylint: disable=import-error,wrong-import-position
- # place class in our python path
- module_path = os.path.join('/'.join(os.path.realpath(__file__).split('/')[:-4]), 'library') # noqa: E501
- sys.path.insert(0, module_path)
- from oc_serviceaccount_secret import OCServiceAccountSecret # noqa: E402
- try:
- import ruamel.yaml as yaml # noqa: EF401
- YAML_TYPE = 'ruamel'
- except ImportError:
- YAML_TYPE = 'pyyaml'
- class OCServiceAccountSecretTest(unittest.TestCase):
- '''
- Test class for OCServiceAccountSecret
- '''
- def setUp(self):
- ''' setup method will create a file and set to known configuration '''
- pass
- @mock.patch('oc_serviceaccount_secret.Utils.create_tmpfile_copy')
- @mock.patch('oc_serviceaccount_secret.Yedit._write')
- @mock.patch('oc_serviceaccount_secret.OCServiceAccountSecret._run')
- def test_adding_a_secret_to_a_serviceaccount(self, mock_cmd, mock_write, mock_tmpfile_copy):
- ''' Testing adding a secret to a service account '''
- # Arrange
- # run_ansible input parameters
- params = {
- 'state': 'present',
- 'namespace': 'default',
- 'secret': 'newsecret',
- 'service_account': 'builder',
- 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
- 'debug': False,
- }
- oc_get_sa_before = '''{
- "apiVersion": "v1",
- "imagePullSecrets": [
- {
- "name": "builder-dockercfg-rsrua"
- }
- ],
- "kind": "ServiceAccount",
- "metadata": {
- "name": "builder",
- "namespace": "default",
- "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
- "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
- "resourceVersion": "302879",
- "creationTimestamp": "2017-02-05T17:02:00Z"
- },
- "secrets": [
- {
- "name": "builder-dockercfg-rsrua"
- },
- {
- "name": "builder-token-akqxi"
- }
- ]
- }
- '''
- oc_get_sa_after = '''{
- "apiVersion": "v1",
- "imagePullSecrets": [
- {
- "name": "builder-dockercfg-rsrua"
- }
- ],
- "kind": "ServiceAccount",
- "metadata": {
- "name": "builder",
- "namespace": "default",
- "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
- "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
- "resourceVersion": "302879",
- "creationTimestamp": "2017-02-05T17:02:00Z"
- },
- "secrets": [
- {
- "name": "builder-dockercfg-rsrua"
- },
- {
- "name": "builder-token-akqxi"
- },
- {
- "name": "newsecret"
- }
- ]
- }
- '''
- builder_ryaml_file = '''\
- secrets:
- - name: builder-dockercfg-rsrua
- - name: builder-token-akqxi
- - name: newsecret
- kind: ServiceAccount
- imagePullSecrets:
- - name: builder-dockercfg-rsrua
- apiVersion: v1
- metadata:
- name: builder
- namespace: default
- resourceVersion: '302879'
- creationTimestamp: '2017-02-05T17:02:00Z'
- selfLink: /api/v1/namespaces/default/serviceaccounts/builder
- uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
- '''
- builder_pyyaml_file = '''\
- apiVersion: v1
- imagePullSecrets:
- - name: builder-dockercfg-rsrua
- kind: ServiceAccount
- metadata:
- creationTimestamp: '2017-02-05T17:02:00Z'
- name: builder
- namespace: default
- resourceVersion: '302879'
- selfLink: /api/v1/namespaces/default/serviceaccounts/builder
- uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
- secrets:
- - name: builder-dockercfg-rsrua
- - name: builder-token-akqxi
- - name: newsecret
- '''
- # Return values of our mocked function call. These get returned once per call.
- mock_cmd.side_effect = [
- (0, oc_get_sa_before, ''), # First call to the mock
- (0, oc_get_sa_before, ''), # Second call to the mock
- (0, 'serviceaccount "builder" replaced', ''), # Third call to the mock
- (0, oc_get_sa_after, ''), # Fourth call to the mock
- ]
- mock_tmpfile_copy.side_effect = [
- '/tmp/mocked_kubeconfig',
- ]
- # Act
- results = OCServiceAccountSecret.run_ansible(params, False)
- # Assert
- self.assertTrue(results['changed'])
- self.assertEqual(results['results']['returncode'], 0)
- self.assertEqual(results['state'], 'present')
- # Making sure our mocks were called as we expected
- mock_cmd.assert_has_calls([
- mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
- mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
- mock.call(['oc', '-n', 'default', 'replace', '-f', mock.ANY], None),
- mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None)
- ])
- yaml_file = builder_pyyaml_file
- if YAML_TYPE == 'ruamel':
- yaml_file = builder_ryaml_file
- mock_write.assert_has_calls([
- mock.call(mock.ANY, yaml_file)
- ])
- @mock.patch('oc_serviceaccount_secret.Utils.create_tmpfile_copy')
- @mock.patch('oc_serviceaccount_secret.Yedit._write')
- @mock.patch('oc_serviceaccount_secret.OCServiceAccountSecret._run')
- def test_removing_a_secret_to_a_serviceaccount(self, mock_cmd, mock_write, mock_tmpfile_copy):
- ''' Testing removing a secret to a service account '''
- # Arrange
- # run_ansible input parameters
- params = {
- 'state': 'absent',
- 'namespace': 'default',
- 'secret': 'newsecret',
- 'service_account': 'builder',
- 'kubeconfig': '/etc/origin/master/admin.kubeconfig',
- 'debug': False,
- }
- oc_get_sa_before = '''{
- "apiVersion": "v1",
- "imagePullSecrets": [
- {
- "name": "builder-dockercfg-rsrua"
- }
- ],
- "kind": "ServiceAccount",
- "metadata": {
- "name": "builder",
- "namespace": "default",
- "selfLink": "/api/v1/namespaces/default/serviceaccounts/builder",
- "uid": "cf47bca7-ebc4-11e6-b041-0ed9df7abc38",
- "resourceVersion": "302879",
- "creationTimestamp": "2017-02-05T17:02:00Z"
- },
- "secrets": [
- {
- "name": "builder-dockercfg-rsrua"
- },
- {
- "name": "builder-token-akqxi"
- },
- {
- "name": "newsecret"
- }
- ]
- }
- '''
- builder_ryaml_file = '''\
- secrets:
- - name: builder-dockercfg-rsrua
- - name: builder-token-akqxi
- kind: ServiceAccount
- imagePullSecrets:
- - name: builder-dockercfg-rsrua
- apiVersion: v1
- metadata:
- name: builder
- namespace: default
- resourceVersion: '302879'
- creationTimestamp: '2017-02-05T17:02:00Z'
- selfLink: /api/v1/namespaces/default/serviceaccounts/builder
- uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
- '''
- builder_pyyaml_file = '''\
- apiVersion: v1
- imagePullSecrets:
- - name: builder-dockercfg-rsrua
- kind: ServiceAccount
- metadata:
- creationTimestamp: '2017-02-05T17:02:00Z'
- name: builder
- namespace: default
- resourceVersion: '302879'
- selfLink: /api/v1/namespaces/default/serviceaccounts/builder
- uid: cf47bca7-ebc4-11e6-b041-0ed9df7abc38
- secrets:
- - name: builder-dockercfg-rsrua
- - name: builder-token-akqxi
- '''
- # Return values of our mocked function call. These get returned once per call.
- mock_cmd.side_effect = [
- (0, oc_get_sa_before, ''), # First call to the mock
- (0, oc_get_sa_before, ''), # Second call to the mock
- (0, 'serviceaccount "builder" replaced', ''), # Third call to the mock
- ]
- mock_tmpfile_copy.side_effect = [
- '/tmp/mocked_kubeconfig',
- ]
- # Act
- results = OCServiceAccountSecret.run_ansible(params, False)
- # Assert
- self.assertTrue(results['changed'])
- self.assertEqual(results['results']['returncode'], 0)
- self.assertEqual(results['state'], 'absent')
- # Making sure our mocks were called as we expected
- mock_cmd.assert_has_calls([
- mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
- mock.call(['oc', '-n', 'default', 'get', 'sa', 'builder', '-o', 'json'], None),
- mock.call(['oc', '-n', 'default', 'replace', '-f', mock.ANY], None),
- ])
- yaml_file = builder_pyyaml_file
- if YAML_TYPE == 'ruamel':
- yaml_file = builder_ryaml_file
- mock_write.assert_has_calls([
- mock.call(mock.ANY, yaml_file)
- ])
- def tearDown(self):
- '''TearDown method'''
- pass
- if __name__ == "__main__":
- unittest.main()
|