From c25792965600baf821d0244682423ff841baffe1 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 9 Feb 2017 17:59:11 -0500 Subject: Adding oc_project to lib_openshift. --- roles/lib_openshift/src/class/oc_project.py | 180 ++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 roles/lib_openshift/src/class/oc_project.py (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_project.py b/roles/lib_openshift/src/class/oc_project.py new file mode 100644 index 000000000..e587570bb --- /dev/null +++ b/roles/lib_openshift/src/class/oc_project.py @@ -0,0 +1,180 @@ +# pylint: skip-file +# flake8: noqa + + +# pylint: disable=too-many-instance-attributes +class OCProject(OpenShiftCLI): + ''' Class to wrap the oc command line tools ''' + kind = 'namespace' + + def __init__(self, + config, + verbose=False): + ''' Constructor for OCProject ''' + super(OCProject, self).__init__(None, config.kubeconfig) + self.config = config + self._project = None + + @property + def project(self): + ''' property for project''' + if not self._project: + self.get() + return self._project + + @project.setter + def project(self, data): + ''' setter function for project propeorty''' + self._project = data + + def exists(self): + ''' return whether a project exists ''' + if self.project: + return True + + return False + + def get(self): + '''return project ''' + #result = self.openshift_cmd(['get', self.kind, self.config.name, '-o', 'json'], output=True, output_type='raw') + result = self._get(self.kind, self.config.name) + + if result['returncode'] == 0: + self.project = Project(content=result['results'][0]) + result['results'] = self.project.yaml_dict + + elif 'namespaces "%s" not found' % self.config.name in result['stderr']: + result = {'results': [], 'returncode': 0} + + return result + + def delete(self): + '''delete the object''' + return self._delete(self.kind, self.config.name) + + def create(self): + '''create a project ''' + cmd = ['new-project', self.config.name] + cmd.extend(self.config.to_option_list()) + + return self.openshift_cmd(cmd, oadm=True) + + def update(self): + '''update a project ''' + + self.project.update_annotation('display-name', self.config.config_options['display_name']['value']) + self.project.update_annotation('description', self.config.config_options['description']['value']) + + # work around for immutable project field + if self.config.config_options['node_selector']['value']: + self.project.update_annotation('node-selector', self.config.config_options['node_selector']['value']) + else: + self.project.update_annotation('node-selector', self.project.find_annotation('node-selector')) + + return self._replace_content(self.kind, self.config.namespace, self.project.yaml_dict) + + def needs_update(self): + ''' verify an update is needed ''' + result = self.project.find_annotation("display-name") + if result != self.config.config_options['display_name']['value']: + return True + + result = self.project.find_annotation("description") + if result != self.config.config_options['description']['value']: + return True + + result = self.project.find_annotation("node-selector") + if result != self.config.config_options['node_selector']['value']: + return True + + # Check rolebindings and policybindings + return False + + # pylint: disable=too-many-return-statements + @staticmethod + def run_ansible(params, check_mode): + '''run the idempotent ansible code''' + + pconfig = ProjectConfig(params['name'], + params['name'], + params['kubeconfig'], + {'admin': {'value': params['admin'], 'include': True}, + 'admin_role': {'value': params['admin_role'], 'include': True}, + 'description': {'value': params['description'], 'include': True}, + 'display_name': {'value': params['display_name'], 'include': True}, + 'node_selector': {'value': ','.join(params['node_selector']), 'include': True}, + }) + + oadm_project = OCProject(pconfig, verbose=params['debug']) + + state = params['state'] + + api_rval = oadm_project.get() + + ##### + # Get + ##### + if state == 'list': + exit_json(changed=False, results=api_rval['results'], state="list") + + ######## + # Delete + ######## + if state == 'absent': + if oadm_project.exists(): + + if check_mode: + return {'changed': True, 'msg': 'CHECK_MODE: Would have performed a delete.'} + + api_rval = oadm_project.delete() + + return {'changed': True, 'results': api_rval, 'state': state} + + return {'changed': False, 'state': state} + + if state == 'present': + ######## + # Create + ######## + if not oadm_project.exists(): + + if check_mode: + return {'changed': True, 'msg': 'CHECK_MODE: Would have performed a create.'} + + # Create it here + api_rval = oadm_project.create() + + # return the created object + api_rval = oadm_project.get() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + return {'changed': True, 'results': api_rval, 'state': state} + + ######## + # Update + ######## + if oadm_project.needs_update(): + + if check_mode: + return {'changed': True, 'msg': 'CHECK_MODE: Would have performed an update.'} + + api_rval = oadm_project.update() + + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + + # return the created object + api_rval = oadm_project.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, + 'changed': False, + 'msg': 'Unknown state passed. [%s]' % state} -- cgit v1.2.3 From e8f02e60daf2d158a0fa6f08ac7d3ed89f9c5317 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Thu, 9 Feb 2017 21:51:12 -0500 Subject: Adding integration test. Fixed issue with node_selector. --- roles/lib_openshift/src/class/oc_project.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_project.py b/roles/lib_openshift/src/class/oc_project.py index e587570bb..cf378ef6d 100644 --- a/roles/lib_openshift/src/class/oc_project.py +++ b/roles/lib_openshift/src/class/oc_project.py @@ -36,7 +36,6 @@ class OCProject(OpenShiftCLI): def get(self): '''return project ''' - #result = self.openshift_cmd(['get', self.kind, self.config.name, '-o', 'json'], output=True, output_type='raw') result = self._get(self.kind, self.config.name) if result['returncode'] == 0: @@ -90,11 +89,15 @@ class OCProject(OpenShiftCLI): # Check rolebindings and policybindings return False - # pylint: disable=too-many-return-statements + # pylint: disable=too-many-return-statements,too-many-branches @staticmethod def run_ansible(params, check_mode): '''run the idempotent ansible code''' + _ns = None + if params['node_selector'] is not None: + _ns = ','.join(params['node_selector']) + pconfig = ProjectConfig(params['name'], params['name'], params['kubeconfig'], @@ -102,7 +105,7 @@ class OCProject(OpenShiftCLI): 'admin_role': {'value': params['admin_role'], 'include': True}, 'description': {'value': params['description'], 'include': True}, 'display_name': {'value': params['display_name'], 'include': True}, - 'node_selector': {'value': ','.join(params['node_selector']), 'include': True}, + 'node_selector': {'value': _ns, 'include': True}, }) oadm_project = OCProject(pconfig, verbose=params['debug']) @@ -115,7 +118,7 @@ class OCProject(OpenShiftCLI): # Get ##### if state == 'list': - exit_json(changed=False, results=api_rval['results'], state="list") + return {'changed': False, 'results': api_rval['results'], 'state': state} ######## # Delete -- cgit v1.2.3 From 4d8df54bd8449a350e3eba59d9598b50d2e727ff Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Wed, 1 Mar 2017 11:04:50 -0500 Subject: Fixed docs. Added check for delete failures. Updated namespace to None. --- roles/lib_openshift/src/class/oc_project.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_project.py b/roles/lib_openshift/src/class/oc_project.py index cf378ef6d..642d85375 100644 --- a/roles/lib_openshift/src/class/oc_project.py +++ b/roles/lib_openshift/src/class/oc_project.py @@ -4,7 +4,7 @@ # pylint: disable=too-many-instance-attributes class OCProject(OpenShiftCLI): - ''' Class to wrap the oc command line tools ''' + ''' Project Class to manage project/namespace objects''' kind = 'namespace' def __init__(self, @@ -86,7 +86,6 @@ class OCProject(OpenShiftCLI): if result != self.config.config_options['node_selector']['value']: return True - # Check rolebindings and policybindings return False # pylint: disable=too-many-return-statements,too-many-branches @@ -131,6 +130,9 @@ class OCProject(OpenShiftCLI): api_rval = oadm_project.delete() + if api_rval['returncode'] != 0: + return {'failed': True, 'msg': api_rval} + return {'changed': True, 'results': api_rval, 'state': state} return {'changed': False, 'state': state} -- cgit v1.2.3 From ee3609784e12a8961c8167d6326427f5808a9263 Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Fri, 3 Mar 2017 10:25:56 -0500 Subject: Updating the namespace param to None. --- roles/lib_openshift/src/class/oc_project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_project.py b/roles/lib_openshift/src/class/oc_project.py index 642d85375..5b39b43fa 100644 --- a/roles/lib_openshift/src/class/oc_project.py +++ b/roles/lib_openshift/src/class/oc_project.py @@ -98,7 +98,7 @@ class OCProject(OpenShiftCLI): _ns = ','.join(params['node_selector']) pconfig = ProjectConfig(params['name'], - params['name'], + None, params['kubeconfig'], {'admin': {'value': params['admin'], 'include': True}, 'admin_role': {'value': params['admin_role'], 'include': True}, -- cgit v1.2.3 From c08768c051ae86a1c62feb878848acf0c653b82b Mon Sep 17 00:00:00 2001 From: Kenny Woodson Date: Fri, 3 Mar 2017 10:46:55 -0500 Subject: Fixed the none namespace. Fixed tests with latest loc_oc_binary call. --- roles/lib_openshift/src/class/oc_project.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'roles/lib_openshift/src/class') diff --git a/roles/lib_openshift/src/class/oc_project.py b/roles/lib_openshift/src/class/oc_project.py index 5b39b43fa..7e3984297 100644 --- a/roles/lib_openshift/src/class/oc_project.py +++ b/roles/lib_openshift/src/class/oc_project.py @@ -70,7 +70,7 @@ class OCProject(OpenShiftCLI): else: self.project.update_annotation('node-selector', self.project.find_annotation('node-selector')) - return self._replace_content(self.kind, self.config.namespace, self.project.yaml_dict) + return self._replace_content(self.kind, self.config.name, self.project.yaml_dict) def needs_update(self): ''' verify an update is needed ''' @@ -98,7 +98,7 @@ class OCProject(OpenShiftCLI): _ns = ','.join(params['node_selector']) pconfig = ProjectConfig(params['name'], - None, + 'None', params['kubeconfig'], {'admin': {'value': params['admin'], 'include': True}, 'admin_role': {'value': params['admin_role'], 'include': True}, -- cgit v1.2.3