Browse Source

Merge pull request #3107 from kwoodson/generate_tox_test

Adding tox tests for generated module code.
Jason DeTiberus 8 years ago
parent
commit
f185fa6ce6
5 changed files with 100 additions and 25 deletions
  1. 19 11
      roles/lib_openshift/src/generate.py
  2. 6 0
      roles/lib_utils/library/yedit.py
  3. 20 12
      roles/lib_utils/src/generate.py
  4. 53 1
      setup.py
  5. 2 1
      tox.ini

+ 19 - 11
roles/lib_openshift/src/generate.py

@@ -10,6 +10,7 @@ import six
 
 OPENSHIFT_ANSIBLE_PATH = os.path.dirname(os.path.realpath(__file__))
 OPENSHIFT_ANSIBLE_SOURCES_PATH = os.path.join(OPENSHIFT_ANSIBLE_PATH, 'sources.yml')  # noqa: E501
+LIBRARY = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/')
 
 
 class GenerateAnsibleException(Exception):
@@ -42,22 +43,29 @@ def generate(parts):
     return data
 
 
-def main():
-    ''' combine the necessary files to create the ansible module '''
-    args = parse_args()
+def get_sources():
+    '''return the path to the generate sources'''
+    return yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read())
 
-    library = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/')
-    sources = yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read())
 
-    for fname, parts in sources.items():
+def verify():
+    '''verify if the generated code matches the library code'''
+    for fname, parts in get_sources().items():
         data = generate(parts)
-        fname = os.path.join(library, fname)
-        if args.verify:
-            if not open(fname).read() == data.getvalue():
-                raise GenerateAnsibleException('Generated content does not match for %s' % fname)
+        fname = os.path.join(LIBRARY, fname)
+        if not open(fname).read() == data.getvalue():
+            raise GenerateAnsibleException('Generated content does not match for %s' % fname)
+
 
-            continue
+def main():
+    ''' combine the necessary files to create the ansible module '''
+    args = parse_args()
+    if args.verify:
+        verify()
 
+    for fname, parts in get_sources().items():
+        data = generate(parts)
+        fname = os.path.join(LIBRARY, fname)
         with open(fname, 'w') as afd:
             afd.seek(0)
             afd.write(data.getvalue())

+ 6 - 0
roles/lib_utils/library/yedit.py

@@ -134,6 +134,12 @@ options:
     required: false
     default: true
     aliases: []
+  separator:
+    description:
+    - The separator being used when parsing strings.
+    required: false
+    default: '.'
+    aliases: []
 author:
 - "Kenny Woodson <kwoodson@redhat.com>"
 extends_documentation_fragment: []

+ 20 - 12
roles/lib_utils/src/generate.py

@@ -5,11 +5,12 @@
 
 import argparse
 import os
-import six
 import yaml
+import six
 
 OPENSHIFT_ANSIBLE_PATH = os.path.dirname(os.path.realpath(__file__))
 OPENSHIFT_ANSIBLE_SOURCES_PATH = os.path.join(OPENSHIFT_ANSIBLE_PATH, 'sources.yml')  # noqa: E501
+LIBRARY = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/')
 
 
 class GenerateAnsibleException(Exception):
@@ -42,22 +43,29 @@ def generate(parts):
     return data
 
 
-def main():
-    ''' combine the necessary files to create the ansible module '''
-    args = parse_args()
+def get_sources():
+    '''return the path to the generate sources'''
+    return yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read())
 
-    library = os.path.join(OPENSHIFT_ANSIBLE_PATH, '..', 'library/')
-    sources = yaml.load(open(OPENSHIFT_ANSIBLE_SOURCES_PATH).read())
 
-    for fname, parts in sources.items():
+def verify():
+    '''verify if the generated code matches the library code'''
+    for fname, parts in get_sources().items():
         data = generate(parts)
-        fname = os.path.join(library, fname)
-        if args.verify:
-            if not open(fname).read() == data.getvalue():
-                raise GenerateAnsibleException('Generated content does not match for %s' % fname)
+        fname = os.path.join(LIBRARY, fname)
+        if not open(fname).read() == data.getvalue():
+            raise GenerateAnsibleException('Generated content does not match for %s' % fname)
 
-            continue
 
+def main():
+    ''' combine the necessary files to create the ansible module '''
+    args = parse_args()
+    if args.verify:
+        verify()
+
+    for fname, parts in get_sources().items():
+        data = generate(parts)
+        fname = os.path.join(LIBRARY, fname)
         with open(fname, 'w') as afd:
             afd.seek(0)
             afd.write(data.getvalue())

+ 53 - 1
setup.py

@@ -6,7 +6,7 @@ from __future__ import print_function
 import os
 import fnmatch
 import re
-
+import sys
 import yaml
 
 # Always prefer setuptools over distutils
@@ -146,6 +146,57 @@ class OpenShiftAnsiblePylint(PylintCommand):
         return func(*func_args, **func_kwargs)
 
 
+class OpenShiftAnsibleGenerateValidation(Command):
+    ''' Command to run generated module validation'''
+    description = "Run generated module validation"
+    user_options = []
+
+    def initialize_options(self):
+        ''' initialize_options '''
+        pass
+
+    def finalize_options(self):
+        ''' finalize_options '''
+        pass
+
+    # self isn't used but I believe is required when it is called.
+    # pylint: disable=no-self-use
+    def run(self):
+        ''' run command '''
+        # find the files that call generate
+        generate_files = find_files('roles',
+                                    ['inventory',
+                                     'test',
+                                     'playbooks',
+                                     'utils'],
+                                    None,
+                                    'generate.py$')
+
+        if len(generate_files) < 1:
+            print('Did not find any code generation.  Please verify module code generation.')  # noqa: E501
+            raise SystemExit(1)
+
+        errors = False
+        for gen in generate_files:
+            print('Checking generated module code: {0}'.format(gen))
+            try:
+                sys.path.insert(0, os.path.dirname(gen))
+                # we are importing dynamically.  This isn't in
+                # the python path.
+                # pylint: disable=import-error
+                import generate
+                generate.verify()
+            except generate.GenerateAnsibleException as gae:
+                print(gae.args)
+                errors = True
+
+        if errors:
+            print('Found errors while generating module code.')
+            raise SystemExit(1)
+
+        print('\nAll generate scripts passed.\n')
+
+
 class UnsupportedCommand(Command):
     ''' Basic Command to override unsupported commands '''
     user_options = []
@@ -188,6 +239,7 @@ setup(
         'sdist': UnsupportedCommand,
         'lint': OpenShiftAnsiblePylint,
         'yamllint': OpenShiftAnsibleYamlLint,
+        'generate_validation': OpenShiftAnsibleGenerateValidation,
     },
     packages=[],
 )

+ 2 - 1
tox.ini

@@ -1,7 +1,7 @@
 [tox]
 minversion=2.3.1
 envlist =
-    py{27,35}-ansible22-{pylint,unit,flake8,yamllint}
+    py{27,35}-ansible22-{pylint,unit,flake8,yamllint,generate_validation}
 skipsdist=True
 skip_missing_interpreters=True
 
@@ -16,3 +16,4 @@ commands =
     pylint: python setup.py lint
     yamllint: python setup.py yamllint
     unit: nosetests
+    generate_validation: python setup.py generate_validation