From 8237eebd0d24ed8577d8360bea220af70807d073 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Sun, 29 Jan 2017 14:21:29 -0500 Subject: Adding oc_service to lib_openshift. --- roles/lib_openshift/src/class/oc_service.py | 168 ++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 roles/lib_openshift/src/class/oc_service.py (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_service.py b/roles/lib_openshift/src/class/oc_service.py new file mode 100644 index 000000000..6871e00d1 --- /dev/null +++ b/roles/lib_openshift/src/class/oc_service.py @@ -0,0 +1,168 @@ +# pylint: skip-file +# flake8: noqa + + +# pylint: disable=too-many-instance-attributes +class OCService(OpenShiftCLI): + ''' Class to wrap the oc command line tools ''' + kind = 'service' + + # pylint allows 5 + # pylint: disable=too-many-arguments + def __init__(self, + sname, + namespace, + labels, + selector, + cluster_ip, + portal_ip, + ports, + session_affinity, + service_type, + kubeconfig='/etc/origin/master/admin.kubeconfig', + verbose=False): + ''' Constructor for OCVolume ''' + super(OCService, self).__init__(namespace, kubeconfig) + self.namespace = namespace + self.config = ServiceConfig(sname, namespace, ports, selector, labels, + cluster_ip, portal_ip, session_affinity, service_type) + self.user_svc = Service(content=self.config.data) + self.svc = None + + @property + def service(self): + ''' property function service''' + if not self.svc: + self.get() + return self.svc + + @service.setter + def service(self, data): + ''' setter function for yedit var ''' + self.svc = data + + def exists(self): + ''' return whether a volume exists ''' + if self.service: + return True + + return False + + def get(self): + '''return volume information ''' + result = self._get(self.kind, self.config.name) + if result['returncode'] == 0: + self.service = Service(content=result['results'][0]) + result['clusterip'] = self.service.get('spec.clusterIP') + elif 'services \"%s\" not found' % self.config.name in result['stderr']: + result['clusterip'] = '' + + return result + + def delete(self): + '''delete the object''' + return self._delete(self.kind, self.config.name) + + def create(self): + '''create a service ''' + return self._create_from_content(self.config.name, self.user_svc.yaml_dict) + + def update(self): + '''create a service ''' + # Need to copy over the portalIP and the serviceIP settings + + self.user_svc.add_cluster_ip(self.service.get('spec.clusterIP')) + self.user_svc.add_portal_ip(self.service.get('spec.portalIP')) + return self._replace_content(self.kind, self.config.name, self.user_svc.yaml_dict) + + def needs_update(self): + ''' verify an update is needed ''' + skip = ['clusterIP', 'portalIP'] + return not Utils.check_def_equal(self.user_svc.yaml_dict, self.service.yaml_dict, skip_keys=skip, debug=True) + + @staticmethod + def run_ansible(params, check_mode): + '''Run the idempotent ansible code''' + oc_svc = OCService(params['name'], + params['namespace'], + params['labels'], + params['selector'], + params['clusterip'], + params['portalip'], + params['ports'], + params['session_affinity'], + params['service_type']) + + state = params['state'] + + api_rval = oc_svc.get() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + ##### + # Get + ##### + if state == 'list': + return {'changed': False, 'results': api_rval, 'state': state} + + ######## + # Delete + ######## + if state == 'absent': + if oc_svc.exists(): + + if check_mode: + return {'changed': True, + 'msg': 'CHECK_MODE: Would have performed a delete.'} # noqa: E501 + + api_rval = oc_svc.delete() + + return {'changed': True, 'results': api_rval, 'state': state} + + return {'changed': False, 'state': state} + + if state == 'present': + ######## + # Create + ######## + if not oc_svc.exists(): + + if check_mode: + return {'changed': True, + 'msg': 'CHECK_MODE: Would have performed a create.'} # noqa: E501 + + # Create it here + api_rval = oc_svc.create() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + # return the created object + api_rval = oc_svc.get() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + return {'changed': True, 'results': api_rval, 'state': state} + + ######## + # Update + ######## + if oc_svc.needs_update(): + api_rval = oc_svc.update() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + # return the created object + api_rval = oc_svc.get() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + return {'changed': True, 'results': api_rval, 'state': state} + + return {'changed': False, 'results': api_rval, 'state': state} + + return {'failed': True, 'msg': 'UNKNOWN state passed. [%s]' % state} -- cgit v1.2.3 From a4cf9c4119623ad2023aefbe652a424cb567383c Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Mon, 30 Jan 2017 16:08:35 -0500 Subject: Adding unit test for oc_service. Added environment fix for non-standard oc installs. --- roles/lib_openshift/src/class/oc_service.py | 1 + 1 file changed, 1 insertion(+) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_service.py b/roles/lib_openshift/src/class/oc_service.py index 6871e00d1..1b92a45b2 100644 --- a/roles/lib_openshift/src/class/oc_service.py +++ b/roles/lib_openshift/src/class/oc_service.py @@ -56,6 +56,7 @@ class OCService(OpenShiftCLI): result['clusterip'] = self.service.get('spec.clusterIP') elif 'services \"%s\" not found' % self.config.name in result['stderr']: result['clusterip'] = '' + result['returncode'] = 0 return result -- cgit v1.2.3 From 7767df1e42e71f992b706e225e677b666a032141 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Mon, 30 Jan 2017 16:18:07 -0500 Subject: Fixing for tox tests. (flake8|pylint) --- roles/lib_openshift/src/class/oc_service.py | 1 + 1 file changed, 1 insertion(+) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_service.py b/roles/lib_openshift/src/class/oc_service.py index 1b92a45b2..4ebb732ad 100644 --- a/roles/lib_openshift/src/class/oc_service.py +++ b/roles/lib_openshift/src/class/oc_service.py @@ -81,6 +81,7 @@ class OCService(OpenShiftCLI): skip = ['clusterIP', 'portalIP'] return not Utils.check_def_equal(self.user_svc.yaml_dict, self.service.yaml_dict, skip_keys=skip, debug=True) + # pylint: disable=too-many-return-statements,too-many-branches @staticmethod def run_ansible(params, check_mode): '''Run the idempotent ansible code''' -- cgit v1.2.3 From 9ef0eb0e1e25b2f4cf6c3cc72d838edf1cfafdf5 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Tue, 31 Jan 2017 14:21:34 -0500 Subject: Fixing copy pasta comments. Fixed required in docs. --- roles/lib_openshift/src/class/oc_service.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_service.py b/roles/lib_openshift/src/class/oc_service.py index 4ebb732ad..d4cc83a59 100644 --- a/roles/lib_openshift/src/class/oc_service.py +++ b/roles/lib_openshift/src/class/oc_service.py @@ -38,18 +38,18 @@ class OCService(OpenShiftCLI): @service.setter def service(self, data): - ''' setter function for yedit var ''' + ''' setter function for service var ''' self.svc = data def exists(self): - ''' return whether a volume exists ''' + ''' return whether a service exists ''' if self.service: return True return False def get(self): - '''return volume information ''' + '''return service information ''' result = self._get(self.kind, self.config.name) if result['returncode'] == 0: self.service = Service(content=result['results'][0]) @@ -61,7 +61,7 @@ class OCService(OpenShiftCLI): return result def delete(self): - '''delete the object''' + '''delete the service''' return self._delete(self.kind, self.config.name) def create(self): -- cgit v1.2.3