From 1fb4452fd934d337dcd59b91895a2b4687a05b9f Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Thu, 19 Oct 2017 17:24:56 -0400 Subject: [PATCH 1/3] Handle _from -> from and vice versa in ansible helper --- openshift/ansiblegen/docstrings.py | 21 +++++++++++++++------ openshift/helper/ansible.py | 12 ++++++++++-- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/openshift/ansiblegen/docstrings.py b/openshift/ansiblegen/docstrings.py index f7b2c90e..0a974abd 100644 --- a/openshift/ansiblegen/docstrings.py +++ b/openshift/ansiblegen/docstrings.py @@ -129,8 +129,9 @@ def add_option(pname, pdict, descr=None): if pdict.get('type') and pdict.get('type') != 'str': doc_string['options'][pname]['type'] = pdict['type'] - for param_name in sorted([x for x, _ in self.helper.argspec.items()]): - param_dict = self.helper.argspec[param_name] + for raw_param_name in sorted([x for x, _ in self.helper.argspec.items()]): + param_name = self.remove_leading_underscore(raw_param_name) + param_dict = self.helper.argspec[raw_param_name] if param_name.endswith('params'): descr = [self.__params_descr(param_name)] add_option(param_name, param_dict, descr=descr) @@ -190,6 +191,13 @@ def return_block(self): self.__get_attributes(obj, doc_key=doc_string[obj_name]['contains']) return ruamel.yaml.dump(doc_string, Dumper=ruamel.yaml.RoundTripDumper, width=80) + def remove_leading_underscore(prop): + if prop.startswith('_'): + ret = prop[1:] + logger.debug("Trimmed {} to {}".format(prop, ret)) + return ret + return prop + def __get_attributes(self, obj, doc_key=None): """ Recursively inspect the attributes of a given obj @@ -200,10 +208,11 @@ def __get_attributes(self, obj, doc_key=None): """ model_class = type(obj) model_name = self.helper.get_base_model_name_snake(model_class.__name__) - for attribute in dir(model_class): - if isinstance(getattr(model_class, attribute), property): - kind = obj.swagger_types[attribute] - docs = inspect.getdoc(getattr(type(obj), attribute)) + for raw_attribute in dir(model_class): + attribute = self.remove_leading_underscore(raw_attribute) + if isinstance(getattr(model_class, raw_attribute), property): + kind = obj.swagger_types[raw_attribute] + docs = inspect.getdoc(getattr(type(obj), raw_attribute)) string_list = self.__doc_clean_up(docs.split('\n')) if kind in ('str', 'int', 'bool'): doc_key[attribute] = CommentedMap() diff --git a/openshift/helper/ansible.py b/openshift/helper/ansible.py index 4a1d2ec2..e5bc1fd1 100644 --- a/openshift/helper/ansible.py +++ b/openshift/helper/ansible.py @@ -14,6 +14,12 @@ # Attributes in argspec not needed by Ansible ARG_ATTRIBUTES_BLACKLIST = ('description', 'auth_option', 'property_path') +ARG_NAME_MAP = { + '_from': 'from' +} +ARG_NAME_MAP.update(dict([reversed(item) for item in ARG_NAME_MAP.items()])) + + logger = logging.getLogger(__name__) @@ -343,7 +349,8 @@ def __set_obj_attribute(self, obj, property_path, param_value, param_name): json.dumps(param_value))) while len(property_path) > 0: - prop_name = property_path.pop(0) + raw_prop_name = property_path.pop(0) + prop_name = ARG_NAME_MAP.get(raw_prop_name, raw_prop_name) prop_kind = obj.swagger_types[prop_name] if prop_kind in PRIMITIVES: try: @@ -613,7 +620,8 @@ def add_meta(prop_name, prop_prefix, prop_alt_prefix): prop_paths.append(prop_name) args[prop_prefix + prop_name]['property_path'] = prop_paths - for prop, prop_attributes in properties.items(): + for raw_prop, prop_attributes in properties.items(): + prop = ARG_NAME_MAP.get(raw_prop, raw_prop) logger.debug("Prop: {0} attributes: {1}".format(prop, str(prop_attributes))) if prop in ('api_version', 'status', 'kind', 'items') and not prefix: # Don't expose these properties From 401f222cbbd587a3ef4cf4318f41285878631cf3 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Thu, 19 Oct 2017 17:59:26 -0400 Subject: [PATCH 2/3] Update _from conversion to handle all python keywords --- openshift/ansiblegen/docstrings.py | 13 +++---------- openshift/helper/ansible.py | 15 ++++++--------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/openshift/ansiblegen/docstrings.py b/openshift/ansiblegen/docstrings.py index 0a974abd..c217e452 100644 --- a/openshift/ansiblegen/docstrings.py +++ b/openshift/ansiblegen/docstrings.py @@ -22,7 +22,7 @@ from .. import __k8s_client_version__ from ..client import models as openshift_models from ..helper.exceptions import KubernetesException -from ..helper.ansible import KubernetesAnsibleModuleHelper, OpenShiftAnsibleModuleHelper +from ..helper.ansible import KubernetesAnsibleModuleHelper, OpenShiftAnsibleModuleHelper, PYTHON_KEYWORD_MAPPING logger = logging.getLogger(__name__) @@ -130,7 +130,7 @@ def add_option(pname, pdict, descr=None): doc_string['options'][pname]['type'] = pdict['type'] for raw_param_name in sorted([x for x, _ in self.helper.argspec.items()]): - param_name = self.remove_leading_underscore(raw_param_name) + param_name = PYTHON_KEYWORD_MAPPING.get(raw_param_name, raw_param_name) param_dict = self.helper.argspec[raw_param_name] if param_name.endswith('params'): descr = [self.__params_descr(param_name)] @@ -191,13 +191,6 @@ def return_block(self): self.__get_attributes(obj, doc_key=doc_string[obj_name]['contains']) return ruamel.yaml.dump(doc_string, Dumper=ruamel.yaml.RoundTripDumper, width=80) - def remove_leading_underscore(prop): - if prop.startswith('_'): - ret = prop[1:] - logger.debug("Trimmed {} to {}".format(prop, ret)) - return ret - return prop - def __get_attributes(self, obj, doc_key=None): """ Recursively inspect the attributes of a given obj @@ -209,7 +202,7 @@ def __get_attributes(self, obj, doc_key=None): model_class = type(obj) model_name = self.helper.get_base_model_name_snake(model_class.__name__) for raw_attribute in dir(model_class): - attribute = self.remove_leading_underscore(raw_attribute) + attribute = PYTHON_KEYWORD_MAPPING.get(raw_attribute, raw_attribute) if isinstance(getattr(model_class, raw_attribute), property): kind = obj.swagger_types[raw_attribute] docs = inspect.getdoc(getattr(type(obj), raw_attribute)) diff --git a/openshift/helper/ansible.py b/openshift/helper/ansible.py index e5bc1fd1..a7756fd7 100644 --- a/openshift/helper/ansible.py +++ b/openshift/helper/ansible.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import -import base64 import copy import json +import base64 import logging +from keyword import kwlist import string_utils @@ -14,12 +15,8 @@ # Attributes in argspec not needed by Ansible ARG_ATTRIBUTES_BLACKLIST = ('description', 'auth_option', 'property_path') -ARG_NAME_MAP = { - '_from': 'from' -} -ARG_NAME_MAP.update(dict([reversed(item) for item in ARG_NAME_MAP.items()])) - - +PYTHON_KEYWORD_MAPPING = dict(zip(map('_{}'.format, kwlist), kwlist)) +PYTHON_KEYWORD_MAPPING.update(dict([reversed(item) for item in PYTHON_KEYWORD_MAPPING.items()])) logger = logging.getLogger(__name__) @@ -350,7 +347,7 @@ def __set_obj_attribute(self, obj, property_path, param_value, param_name): while len(property_path) > 0: raw_prop_name = property_path.pop(0) - prop_name = ARG_NAME_MAP.get(raw_prop_name, raw_prop_name) + prop_name = PYTHON_KEYWORD_MAPPING.get(raw_prop_name, raw_prop_name) prop_kind = obj.swagger_types[prop_name] if prop_kind in PRIMITIVES: try: @@ -621,7 +618,7 @@ def add_meta(prop_name, prop_prefix, prop_alt_prefix): args[prop_prefix + prop_name]['property_path'] = prop_paths for raw_prop, prop_attributes in properties.items(): - prop = ARG_NAME_MAP.get(raw_prop, raw_prop) + prop = PYTHON_KEYWORD_MAPPING.get(raw_prop, raw_prop) logger.debug("Prop: {0} attributes: {1}".format(prop, str(prop_attributes))) if prop in ('api_version', 'status', 'kind', 'items') and not prefix: # Don't expose these properties From 46df831bf67e3f4bb46c6c8a25781801ebbc13e8 Mon Sep 17 00:00:00 2001 From: Fabian von Feilitzsch Date: Thu, 19 Oct 2017 17:59:45 -0400 Subject: [PATCH 3/3] Add test for build config --- .../examples/openshift_v1_build_config.yml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 openshift/ansiblegen/examples/openshift_v1_build_config.yml diff --git a/openshift/ansiblegen/examples/openshift_v1_build_config.yml b/openshift/ansiblegen/examples/openshift_v1_build_config.yml new file mode 100644 index 00000000..b285c4e5 --- /dev/null +++ b/openshift/ansiblegen/examples/openshift_v1_build_config.yml @@ -0,0 +1,30 @@ +# v1_build_config.yml +# +--- +tasks: + +- create: + name: test + namespace: namespace + verify_ssl: False + labels: + app: test + output_to_kind: ImageStreamTag + output_to_name: test:latest + source_git_uri: "https://test.example.com/test.git" + source_secret_name: git + source_type: Git + strategy_source_strategy_from_kind: ImageStreamTag + strategy_source_strategy_from_name: nodejs:6 + strategy_source_strategy_from_namespace: openshift + strategy_type: Source + triggers: + - github: + secret: 8kdCwBdWpup5OydYqXCj + type: GitHub + - generic: + secret: wuve0D41bIFHPU_DzT5- + type: Generic + - type: ConfigChange + - image_change: {} + type: ImageChange