pvc.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. # pylint: skip-file
  2. # flake8: noqa
  3. # pylint: disable=too-many-instance-attributes
  4. class PersistentVolumeClaimConfig(object):
  5. ''' Handle pvc options '''
  6. # pylint: disable=too-many-arguments
  7. def __init__(self,
  8. sname,
  9. namespace,
  10. kubeconfig,
  11. access_modes=None,
  12. vol_capacity='1G',
  13. selector=None,
  14. storage_class_name=None):
  15. ''' constructor for handling pvc options '''
  16. self.kubeconfig = kubeconfig
  17. self.name = sname
  18. self.namespace = namespace
  19. self.access_modes = access_modes
  20. self.vol_capacity = vol_capacity
  21. self.data = {}
  22. self.selector = selector
  23. self.storage_class_name = storage_class_name
  24. self.create_dict()
  25. def create_dict(self):
  26. ''' return a service as a dict '''
  27. # version
  28. self.data['apiVersion'] = 'v1'
  29. # kind
  30. self.data['kind'] = 'PersistentVolumeClaim'
  31. # metadata
  32. self.data['metadata'] = {}
  33. self.data['metadata']['name'] = self.name
  34. # spec
  35. self.data['spec'] = {}
  36. self.data['spec']['accessModes'] = ['ReadWriteOnce']
  37. if self.access_modes:
  38. self.data['spec']['accessModes'] = self.access_modes
  39. if self.selector:
  40. self.data['spec']['selector'] = {'matchLabels': self.selector}
  41. # storage capacity
  42. self.data['spec']['resources'] = {}
  43. self.data['spec']['resources']['requests'] = {}
  44. self.data['spec']['resources']['requests']['storage'] = self.vol_capacity
  45. if self.storage_class_name:
  46. self.data['spec']['storageClassName'] = self.storage_class_name
  47. # pylint: disable=too-many-instance-attributes,too-many-public-methods
  48. class PersistentVolumeClaim(Yedit):
  49. ''' Class to wrap the oc command line tools '''
  50. access_modes_path = "spec.accessModes"
  51. volume_capacity_path = "spec.requests.storage"
  52. volume_name_path = "spec.volumeName"
  53. bound_path = "status.phase"
  54. kind = 'PersistentVolumeClaim'
  55. selector_path = "spec.selector.matchLabels"
  56. storage_class_name_path = "spec.storageClassName"
  57. def __init__(self, content):
  58. '''PersistentVolumeClaim constructor'''
  59. super(PersistentVolumeClaim, self).__init__(content=content)
  60. self._access_modes = None
  61. self._volume_capacity = None
  62. self._volume_name = None
  63. self._selector = None
  64. self._storage_class_name = None
  65. @property
  66. def storage_class_name(self):
  67. ''' storage_class_name property '''
  68. if self._storage_class_name is None:
  69. self._storage_class_name = self.get_storage_class_name()
  70. return self._storage_class_name
  71. @storage_class_name.setter
  72. def storage_class_name(self, data):
  73. ''' storage_class_name property setter'''
  74. self._storage_class_name = data
  75. @property
  76. def volume_name(self):
  77. ''' volume_name property '''
  78. if self._volume_name is None:
  79. self._volume_name = self.get_volume_name()
  80. return self._volume_name
  81. @volume_name.setter
  82. def volume_name(self, data):
  83. ''' volume_name property setter'''
  84. self._volume_name = data
  85. @property
  86. def selector(self):
  87. ''' selector property '''
  88. if self._selector is None:
  89. self._selector = self.get_selector()
  90. if not isinstance(self._selector, dict):
  91. self._selector = dict(self._selector)
  92. return self._selector
  93. @selector.setter
  94. def selector(self, data):
  95. ''' selector property setter'''
  96. if not isinstance(data, dict):
  97. data = dict(data)
  98. self._selector = data
  99. @property
  100. def access_modes(self):
  101. ''' access_modes property '''
  102. if self._access_modes is None:
  103. self._access_modes = self.get_access_modes()
  104. if not isinstance(self._access_modes, list):
  105. self._access_modes = list(self._access_modes)
  106. return self._access_modes
  107. @access_modes.setter
  108. def access_modes(self, data):
  109. ''' access_modes property setter'''
  110. if not isinstance(data, list):
  111. data = list(data)
  112. self._access_modes = data
  113. @property
  114. def volume_capacity(self):
  115. ''' volume_capacity property '''
  116. if self._volume_capacity is None:
  117. self._volume_capacity = self.get_volume_capacity()
  118. return self._volume_capacity
  119. @volume_capacity.setter
  120. def volume_capacity(self, data):
  121. ''' volume_capacity property setter'''
  122. self._volume_capacity = data
  123. def get_storage_class_name(self):
  124. '''get storage_class_name'''
  125. return self.get(PersistentVolumeClaim.storage_class_name_path) or []
  126. def get_selector(self):
  127. '''get selector'''
  128. return self.get(PersistentVolumeClaim.selector_path) or []
  129. def get_access_modes(self):
  130. '''get access_modes'''
  131. return self.get(PersistentVolumeClaim.access_modes_path) or []
  132. def get_volume_capacity(self):
  133. '''get volume_capacity'''
  134. return self.get(PersistentVolumeClaim.volume_capacity_path) or []
  135. def get_volume_name(self):
  136. '''get volume_name'''
  137. return self.get(PersistentVolumeClaim.volume_name_path) or []
  138. def is_bound(self):
  139. '''return whether volume is bound'''
  140. return self.get(PersistentVolumeClaim.bound_path) or []
  141. #### ADD #####
  142. def add_access_mode(self, inc_mode):
  143. ''' add an access_mode'''
  144. if self.access_modes:
  145. self.access_modes.append(inc_mode)
  146. else:
  147. self.put(PersistentVolumeClaim.access_modes_path, [inc_mode])
  148. return True
  149. #### /ADD #####
  150. #### Remove #####
  151. def remove_access_mode(self, inc_mode):
  152. ''' remove an access_mode'''
  153. try:
  154. self.access_modes.remove(inc_mode)
  155. except ValueError as _:
  156. return False
  157. return True
  158. #### /REMOVE #####
  159. #### UPDATE #####
  160. def update_access_mode(self, inc_mode):
  161. ''' update an access_mode'''
  162. try:
  163. index = self.access_modes.index(inc_mode)
  164. except ValueError as _:
  165. return self.add_access_mode(inc_mode)
  166. self.access_modes[index] = inc_mode
  167. return True
  168. #### /UPDATE #####
  169. #### FIND ####
  170. def find_access_mode(self, inc_mode):
  171. ''' find a user '''
  172. index = None
  173. try:
  174. index = self.access_modes.index(inc_mode)
  175. except ValueError as _:
  176. return index
  177. return index