oc_obj.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. # pylint: skip-file
  2. # flake8: noqa
  3. # pylint: disable=too-many-instance-attributes
  4. class OCObject(OpenShiftCLI):
  5. ''' Class to wrap the oc command line tools '''
  6. # pylint allows 5. we need 6
  7. # pylint: disable=too-many-arguments
  8. def __init__(self,
  9. kind,
  10. namespace,
  11. rname=None,
  12. selector=None,
  13. kubeconfig='/etc/origin/master/admin.kubeconfig',
  14. verbose=False,
  15. all_namespaces=False):
  16. ''' Constructor for OpenshiftOC '''
  17. super(OCObject, self).__init__(namespace, kubeconfig,
  18. all_namespaces=all_namespaces)
  19. self.kind = kind
  20. self.namespace = namespace
  21. self.name = rname
  22. self.selector = selector
  23. self.kubeconfig = kubeconfig
  24. self.verbose = verbose
  25. def get(self):
  26. '''return a kind by name '''
  27. results = self._get(self.kind, rname=self.name, selector=self.selector)
  28. if results['returncode'] != 0 and 'stderr' in results and \
  29. '\"%s\" not found' % self.name in results['stderr']:
  30. results['returncode'] = 0
  31. return results
  32. def delete(self):
  33. '''return all pods '''
  34. return self._delete(self.kind, self.name)
  35. def create(self, files=None, content=None):
  36. '''
  37. Create a config
  38. NOTE: This creates the first file OR the first conent.
  39. TODO: Handle all files and content passed in
  40. '''
  41. if files:
  42. return self._create(files[0])
  43. content['data'] = yaml.dump(content['data'])
  44. content_file = Utils.create_tmp_files_from_contents(content)[0]
  45. return self._create(content_file['path'])
  46. # pylint: disable=too-many-function-args
  47. def update(self, files=None, content=None, force=False):
  48. '''update a current openshift object
  49. This receives a list of file names or content
  50. and takes the first and calls replace.
  51. TODO: take an entire list
  52. '''
  53. if files:
  54. return self._replace(files[0], force)
  55. if content and 'data' in content:
  56. content = content['data']
  57. return self.update_content(content, force)
  58. def update_content(self, content, force=False):
  59. '''update an object through using the content param'''
  60. return self._replace_content(self.kind, self.name, content, force=force)
  61. def needs_update(self, files=None, content=None, content_type='yaml'):
  62. ''' check to see if we need to update '''
  63. objects = self.get()
  64. if objects['returncode'] != 0:
  65. return objects
  66. # pylint: disable=no-member
  67. data = None
  68. if files:
  69. data = Utils.get_resource_file(files[0], content_type)
  70. elif content and 'data' in content:
  71. data = content['data']
  72. else:
  73. data = content
  74. # if equal then no need. So not equal is True
  75. return not Utils.check_def_equal(data, objects['results'][0], skip_keys=None, debug=False)
  76. # pylint: disable=too-many-return-statements,too-many-branches
  77. @staticmethod
  78. def run_ansible(params, check_mode=False):
  79. '''perform the ansible idempotent code'''
  80. ocobj = OCObject(params['kind'],
  81. params['namespace'],
  82. params['name'],
  83. params['selector'],
  84. kubeconfig=params['kubeconfig'],
  85. verbose=params['debug'],
  86. all_namespaces=params['all_namespaces'])
  87. state = params['state']
  88. api_rval = ocobj.get()
  89. #####
  90. # Get
  91. #####
  92. if state == 'list':
  93. return {'changed': False, 'results': api_rval, 'state': 'list'}
  94. if not params['name']:
  95. return {'failed': True, 'msg': 'Please specify a name when state is absent|present.'} # noqa: E501
  96. ########
  97. # Delete
  98. ########
  99. if state == 'absent':
  100. if not Utils.exists(api_rval['results'], params['name']):
  101. return {'changed': False, 'state': 'absent'}
  102. if check_mode:
  103. return {'changed': True, 'msg': 'CHECK_MODE: Would have performed a delete'}
  104. api_rval = ocobj.delete()
  105. return {'changed': True, 'results': api_rval, 'state': 'absent'}
  106. if state == 'present':
  107. ########
  108. # Create
  109. ########
  110. if not Utils.exists(api_rval['results'], params['name']):
  111. if check_mode:
  112. return {'changed': True, 'msg': 'CHECK_MODE: Would have performed a create'}
  113. # Create it here
  114. api_rval = ocobj.create(params['files'], params['content'])
  115. if api_rval['returncode'] != 0:
  116. return {'failed': True, 'msg': api_rval}
  117. # return the created object
  118. api_rval = ocobj.get()
  119. if api_rval['returncode'] != 0:
  120. return {'failed': True, 'msg': api_rval}
  121. # Remove files
  122. if params['files'] and params['delete_after']:
  123. Utils.cleanup(params['files'])
  124. return {'changed': True, 'results': api_rval, 'state': "present"}
  125. ########
  126. # Update
  127. ########
  128. # if a file path is passed, use it.
  129. update = ocobj.needs_update(params['files'], params['content'])
  130. if not isinstance(update, bool):
  131. return {'failed': True, 'msg': update}
  132. # No changes
  133. if not update:
  134. if params['files'] and params['delete_after']:
  135. Utils.cleanup(params['files'])
  136. return {'changed': False, 'results': api_rval['results'][0], 'state': "present"}
  137. if check_mode:
  138. return {'changed': True, 'msg': 'CHECK_MODE: Would have performed an update.'}
  139. api_rval = ocobj.update(params['files'],
  140. params['content'],
  141. params['force'])
  142. if api_rval['returncode'] != 0:
  143. return {'failed': True, 'msg': api_rval}
  144. # return the created object
  145. api_rval = ocobj.get()
  146. if api_rval['returncode'] != 0:
  147. return {'failed': True, 'msg': api_rval}
  148. return {'changed': True, 'results': api_rval, 'state': "present"}