From b1898ac36a115763e07f3eaf103f8bb5606d0e82 Mon Sep 17 00:00:00 2001
From: Russell Teague <rteague@redhat.com>
Date: Mon, 17 Apr 2017 13:30:21 -0400
Subject: Add Ansible syntax checks to tox

---
 setup.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 tox.ini  |  2 +-
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/setup.py b/setup.py
index 2ad26110b..c6a132ae2 100644
--- a/setup.py
+++ b/setup.py
@@ -7,6 +7,7 @@ import os
 import fnmatch
 import re
 import sys
+import subprocess
 import yaml
 
 # Always prefer setuptools over distutils
@@ -199,6 +200,52 @@ class OpenShiftAnsibleGenerateValidation(Command):
         print('\nAll generate scripts passed.\n')
 
 
+class OpenShiftAnsibleSyntaxCheck(Command):
+    ''' Command to run Ansible syntax check'''
+    description = "Run Ansible syntax check"
+    user_options = []
+
+    # Colors
+    FAIL = '\033[91m'  # Red
+    ENDC = '\033[0m'  # Reset
+
+    def initialize_options(self):
+        ''' initialize_options '''
+        pass
+
+    def finalize_options(self):
+        ''' finalize_options '''
+        pass
+
+    def run(self):
+        ''' run command '''
+
+        has_errors = False
+
+        for yaml_file in find_files(
+                os.path.join(os.getcwd(), 'playbooks', 'byo'),
+                None, None, r'\.ya?ml$'):
+            with open(yaml_file, 'r') as contents:
+                for line in contents:
+                    # initialize_groups.yml is used to identify entry point playbooks
+                    if re.search(r'initialize_groups\.yml', line):
+                        print('-' * 60)
+                        print('Syntax checking playbook: %s' % yaml_file)
+                        try:
+                            subprocess.check_output(
+                                ['ansible-playbook', '-i localhost,',
+                                 '--syntax-check', yaml_file]
+                            )
+                        except subprocess.CalledProcessError as cpe:
+                            print('{}Execution failed: {}{}'.format(
+                                self.FAIL, cpe, self.ENDC))
+                            has_errors = True
+                        # Break for loop, no need to continue looping lines
+                        break
+        if has_errors:
+            raise SystemExit(1)
+
+
 class UnsupportedCommand(Command):
     ''' Basic Command to override unsupported commands '''
     user_options = []
@@ -242,6 +289,7 @@ setup(
         'lint': OpenShiftAnsiblePylint,
         'yamllint': OpenShiftAnsibleYamlLint,
         'generate_validation': OpenShiftAnsibleGenerateValidation,
+        'ansible_syntax': OpenShiftAnsibleSyntaxCheck,
     },
     packages=[],
 )
diff --git a/tox.ini b/tox.ini
index 1b02234e5..8678ff463 100644
--- a/tox.ini
+++ b/tox.ini
@@ -21,4 +21,4 @@ commands =
     yamllint: python setup.py yamllint
     generate_validation: python setup.py generate_validation
     # TODO(rhcarvalho): check syntax of other important entrypoint playbooks
-    ansible_syntax: ansible-playbook --syntax-check playbooks/byo/config.yml
+    ansible_syntax: python setup.py ansible_syntax
-- 
cgit v1.2.3