oc_serviceaccount.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. return result
  30. def delete(self):
  31. '''delete the object'''
  32. return self._delete(self.kind, self.config.name)
  33. def create(self):
  34. '''create the object'''
  35. return self._create_from_content(self.config.name, self.config.data)
  36. def update(self):
  37. '''update the object'''
  38. # need to update the tls information and the service name
  39. for secret in self.config.secrets:
  40. result = self.service_account.find_secret(secret)
  41. if not result:
  42. self.service_account.add_secret(secret)
  43. for secret in self.config.image_pull_secrets:
  44. result = self.service_account.find_image_pull_secret(secret)
  45. if not result:
  46. self.service_account.add_image_pull_secret(secret)
  47. return self._replace_content(self.kind, self.config.name, self.config.data)
  48. def needs_update(self):
  49. ''' verify an update is needed '''
  50. # since creating an service account generates secrets and imagepullsecrets
  51. # check_def_equal will not work
  52. # Instead, verify all secrets passed are in the list
  53. for secret in self.config.secrets:
  54. result = self.service_account.find_secret(secret)
  55. if not result:
  56. return True
  57. for secret in self.config.image_pull_secrets:
  58. result = self.service_account.find_image_pull_secret(secret)
  59. if not result:
  60. return True
  61. return False
  62. @staticmethod
  63. # pylint: disable=too-many-return-statements,too-many-branches
  64. # TODO: This function should be refactored into its individual parts.
  65. def run_ansible(params, check_mode):
  66. '''run the ansible idempotent code'''
  67. rconfig = ServiceAccountConfig(params['name'],
  68. params['namespace'],
  69. params['kubeconfig'],
  70. params['secrets'],
  71. params['image_pull_secrets'],
  72. )
  73. oc_sa = OCServiceAccount(rconfig,
  74. verbose=params['debug'])
  75. state = params['state']
  76. api_rval = oc_sa.get()
  77. #####
  78. # Get
  79. #####
  80. if state == 'list':
  81. return {'changed': False, 'results': api_rval['results'], 'state': 'list'}
  82. ########
  83. # Delete
  84. ########
  85. if state == 'absent':
  86. if oc_sa.exists():
  87. if check_mode:
  88. return {'changed': True, 'msg': 'Would have performed a delete.'}
  89. api_rval = oc_sa.delete()
  90. return {'changed': True, 'results': api_rval, 'state': 'absent'}
  91. return {'changed': False, 'state': 'absent'}
  92. if state == 'present':
  93. ########
  94. # Create
  95. ########
  96. if not oc_sa.exists():
  97. if check_mode:
  98. return {'changed': True, 'msg': 'Would have performed a create.'}
  99. # Create it here
  100. api_rval = oc_sa.create()
  101. if api_rval['returncode'] != 0:
  102. return {'failed': True, 'msg': api_rval}
  103. # return the created object
  104. api_rval = oc_sa.get()
  105. if api_rval['returncode'] != 0:
  106. return {'failed': True, 'msg': api_rval}
  107. return {'changed': True, 'results': api_rval, 'state': 'present'}
  108. ########
  109. # Update
  110. ########
  111. if oc_sa.needs_update():
  112. api_rval = oc_sa.update()
  113. if api_rval['returncode'] != 0:
  114. return {'failed': True, 'msg': api_rval}
  115. # return the created object
  116. api_rval = oc_sa.get()
  117. if api_rval['returncode'] != 0:
  118. return {'failed': True, 'msg': api_rval}
  119. return {'changed': True, 'results': api_rval, 'state': 'present'}
  120. return {'changed': False, 'results': api_rval, 'state': 'present'}
  121. return {'failed': True,
  122. 'changed': False,
  123. 'msg': 'Unknown state passed. %s' % state,
  124. 'state': 'unknown'}