oc_serviceaccount.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. # pylint: skip-file
  2. # flake8: noqa
  3. # pylint: disable=too-many-instance-attributes
  4. class OCServiceAccount(OpenShiftCLI):
  5. ''' Class to wrap the oc command line tools '''
  6. kind = 'sa'
  7. # pylint allows 5
  8. # pylint: disable=too-many-arguments
  9. def __init__(self,
  10. config,
  11. verbose=False):
  12. ''' Constructor for OCVolume '''
  13. super(OCServiceAccount, self).__init__(config.namespace, kubeconfig=config.kubeconfig, verbose=verbose)
  14. self.config = config
  15. self.service_account = None
  16. def exists(self):
  17. ''' return whether a volume exists '''
  18. if self.service_account:
  19. return True
  20. return False
  21. def get(self):
  22. '''return volume information '''
  23. result = self._get(self.kind, self.config.name)
  24. if result['returncode'] == 0:
  25. self.service_account = ServiceAccount(content=result['results'][0])
  26. elif '\"%s\" not found' % self.config.name in result['stderr']:
  27. result['returncode'] = 0
  28. result['results'] = [{}]
  29. elif 'namespaces \"%s\" not found' % self.config.namespace in result['stderr']:
  30. result['returncode'] = 0
  31. result['results'] = [{}]
  32. return result
  33. def delete(self):
  34. '''delete the object'''
  35. return self._delete(self.kind, self.config.name)
  36. def create(self):
  37. '''create the object'''
  38. return self._create_from_content(self.config.name, self.config.data)
  39. def update(self):
  40. '''update the object'''
  41. # need to update the tls information and the service name
  42. for secret in self.config.secrets:
  43. result = self.service_account.find_secret(secret)
  44. if not result:
  45. self.service_account.add_secret(secret)
  46. for secret in self.config.image_pull_secrets:
  47. result = self.service_account.find_image_pull_secret(secret)
  48. if not result:
  49. self.service_account.add_image_pull_secret(secret)
  50. return self._replace_content(self.kind, self.config.name, self.config.data)
  51. def needs_update(self):
  52. ''' verify an update is needed '''
  53. # since creating an service account generates secrets and imagepullsecrets
  54. # check_def_equal will not work
  55. # Instead, verify all secrets passed are in the list
  56. for secret in self.config.secrets:
  57. result = self.service_account.find_secret(secret)
  58. if not result:
  59. return True
  60. for secret in self.config.image_pull_secrets:
  61. result = self.service_account.find_image_pull_secret(secret)
  62. if not result:
  63. return True
  64. return False
  65. @staticmethod
  66. # pylint: disable=too-many-return-statements,too-many-branches
  67. # TODO: This function should be refactored into its individual parts.
  68. def run_ansible(params, check_mode):
  69. '''run the oc_serviceaccount module'''
  70. rconfig = ServiceAccountConfig(params['name'],
  71. params['namespace'],
  72. params['kubeconfig'],
  73. params['secrets'],
  74. params['image_pull_secrets'],
  75. )
  76. oc_sa = OCServiceAccount(rconfig,
  77. verbose=params['debug'])
  78. state = params['state']
  79. api_rval = oc_sa.get()
  80. #####
  81. # Get
  82. #####
  83. if state == 'list':
  84. return {'changed': False, 'results': api_rval['results'], 'state': 'list'}
  85. ########
  86. # Delete
  87. ########
  88. if state == 'absent':
  89. if oc_sa.exists():
  90. if check_mode:
  91. return {'changed': True, 'msg': 'Would have performed a delete.'}
  92. api_rval = oc_sa.delete()
  93. return {'changed': True, 'results': api_rval, 'state': 'absent'}
  94. return {'changed': False, 'state': 'absent'}
  95. if state == 'present':
  96. ########
  97. # Create
  98. ########
  99. if not oc_sa.exists():
  100. if check_mode:
  101. return {'changed': True, 'msg': 'Would have performed a create.'}
  102. # Create it here
  103. api_rval = oc_sa.create()
  104. if api_rval['returncode'] != 0:
  105. return {'failed': True, 'msg': api_rval}
  106. # return the created object
  107. api_rval = oc_sa.get()
  108. if api_rval['returncode'] != 0:
  109. return {'failed': True, 'msg': api_rval}
  110. return {'changed': True, 'results': api_rval, 'state': 'present'}
  111. ########
  112. # Update
  113. ########
  114. if oc_sa.needs_update():
  115. api_rval = oc_sa.update()
  116. if api_rval['returncode'] != 0:
  117. return {'failed': True, 'msg': api_rval}
  118. # return the created object
  119. api_rval = oc_sa.get()
  120. if api_rval['returncode'] != 0:
  121. return {'failed': True, 'msg': api_rval}
  122. return {'changed': True, 'results': api_rval, 'state': 'present'}
  123. return {'changed': False, 'results': api_rval, 'state': 'present'}
  124. return {'failed': True,
  125. 'changed': False,
  126. 'msg': 'Unknown state passed. %s' % state,
  127. 'state': 'unknown'}