service.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. # pylint: skip-file
  2. # flake8: noqa
  3. # pylint: disable=too-many-instance-attributes
  4. class ServiceConfig(object):
  5. ''' Handle service options '''
  6. # pylint: disable=too-many-arguments
  7. def __init__(self,
  8. sname,
  9. namespace,
  10. ports,
  11. annotations=None,
  12. selector=None,
  13. labels=None,
  14. cluster_ip=None,
  15. portal_ip=None,
  16. session_affinity=None,
  17. service_type=None,
  18. external_ips=None):
  19. ''' constructor for handling service options '''
  20. self.name = sname
  21. self.namespace = namespace
  22. self.ports = ports
  23. self.annotations = annotations
  24. self.selector = selector
  25. self.labels = labels
  26. self.cluster_ip = cluster_ip
  27. self.portal_ip = portal_ip
  28. self.session_affinity = session_affinity
  29. self.service_type = service_type
  30. self.external_ips = external_ips
  31. self.data = {}
  32. self.create_dict()
  33. def create_dict(self):
  34. ''' instantiates a service dict '''
  35. self.data['apiVersion'] = 'v1'
  36. self.data['kind'] = 'Service'
  37. self.data['metadata'] = {}
  38. self.data['metadata']['name'] = self.name
  39. self.data['metadata']['namespace'] = self.namespace
  40. if self.labels:
  41. self.data['metadata']['labels'] = {}
  42. for lab, lab_value in self.labels.items():
  43. self.data['metadata']['labels'][lab] = lab_value
  44. if self.annotations:
  45. self.data['metadata']['annotations'] = self.annotations
  46. self.data['spec'] = {}
  47. if self.ports:
  48. self.data['spec']['ports'] = self.ports
  49. else:
  50. self.data['spec']['ports'] = []
  51. if self.selector:
  52. self.data['spec']['selector'] = self.selector
  53. self.data['spec']['sessionAffinity'] = self.session_affinity or 'None'
  54. if self.cluster_ip:
  55. self.data['spec']['clusterIP'] = self.cluster_ip
  56. if self.portal_ip:
  57. self.data['spec']['portalIP'] = self.portal_ip
  58. if self.service_type:
  59. self.data['spec']['type'] = self.service_type
  60. if self.external_ips:
  61. self.data['spec']['externalIPs'] = self.external_ips
  62. # pylint: disable=too-many-instance-attributes,too-many-public-methods
  63. class Service(Yedit):
  64. ''' Class to model the oc service object '''
  65. port_path = "spec.ports"
  66. portal_ip = "spec.portalIP"
  67. cluster_ip = "spec.clusterIP"
  68. selector_path = 'spec.selector'
  69. kind = 'Service'
  70. external_ips = "spec.externalIPs"
  71. def __init__(self, content):
  72. '''Service constructor'''
  73. super(Service, self).__init__(content=content)
  74. def get_ports(self):
  75. ''' get a list of ports '''
  76. return self.get(Service.port_path) or []
  77. def get_selector(self):
  78. ''' get the service selector'''
  79. return self.get(Service.selector_path) or {}
  80. def add_ports(self, inc_ports):
  81. ''' add a port object to the ports list '''
  82. if not isinstance(inc_ports, list):
  83. inc_ports = [inc_ports]
  84. ports = self.get_ports()
  85. if not ports:
  86. self.put(Service.port_path, inc_ports)
  87. else:
  88. ports.extend(inc_ports)
  89. return True
  90. def find_ports(self, inc_port):
  91. ''' find a specific port '''
  92. for port in self.get_ports():
  93. if port['port'] == inc_port['port']:
  94. return port
  95. return None
  96. def delete_ports(self, inc_ports):
  97. ''' remove a port from a service '''
  98. if not isinstance(inc_ports, list):
  99. inc_ports = [inc_ports]
  100. ports = self.get(Service.port_path) or []
  101. if not ports:
  102. return True
  103. removed = False
  104. for inc_port in inc_ports:
  105. port = self.find_ports(inc_port)
  106. if port:
  107. ports.remove(port)
  108. removed = True
  109. return removed
  110. def add_cluster_ip(self, sip):
  111. '''add cluster ip'''
  112. self.put(Service.cluster_ip, sip)
  113. def add_portal_ip(self, pip):
  114. '''add cluster ip'''
  115. self.put(Service.portal_ip, pip)
  116. def get_external_ips(self):
  117. ''' get a list of external_ips '''
  118. return self.get(Service.external_ips) or []
  119. def add_external_ips(self, inc_external_ips):
  120. ''' add an external_ip to the external_ips list '''
  121. if not isinstance(inc_external_ips, list):
  122. inc_external_ips = [inc_external_ips]
  123. external_ips = self.get_external_ips()
  124. if not external_ips:
  125. self.put(Service.external_ips, inc_external_ips)
  126. else:
  127. external_ips.extend(inc_external_ips)
  128. return True
  129. def find_external_ips(self, inc_external_ip):
  130. ''' find a specific external IP '''
  131. val = None
  132. try:
  133. idx = self.get_external_ips().index(inc_external_ip)
  134. val = self.get_external_ips()[idx]
  135. except ValueError:
  136. pass
  137. return val
  138. def delete_external_ips(self, inc_external_ips):
  139. ''' remove an external IP from a service '''
  140. if not isinstance(inc_external_ips, list):
  141. inc_external_ips = [inc_external_ips]
  142. external_ips = self.get(Service.external_ips) or []
  143. if not external_ips:
  144. return True
  145. removed = False
  146. for inc_external_ip in inc_external_ips:
  147. external_ip = self.find_external_ips(inc_external_ip)
  148. if external_ip:
  149. external_ips.remove(external_ip)
  150. removed = True
  151. return removed