bluval engine refactoring
[validation.git] / bluval / bluval.py
index c0c16de..4a01a92 100644 (file)
 # See the License for the specific language governing permissions and        #
 # limitations under the License.                                             #
 ##############################################################################
-"""This module parses yaml file, reads sections, testcases and executes each
+"""This module parses yaml file, reads layers, testcases and executes each
 testcase
 """
 
 import subprocess
-import sys
+import click
 import yaml
 
 def run_testcase(testcase):
     """Runs a single testcase
     """
     show_stopper = testcase.get('show_stopper', False)
+    what = testcase.get('what')
+    results = "results/"+what
+    command = '{} {} {} {}'.format("robot", "-d", results, what)
 
     print('Executing testcase {}'.format(testcase['name']))
     print('          show_stopper {}'.format(show_stopper))
-    cmd = 'robot {}'.format(testcase['what'])
-    print('Invoking {}'.format(cmd))
+    print('Invoking {}'.format(command))
     try:
-        status = subprocess.call(cmd, shell=True)
+        status = subprocess.call(command, shell=True)
         if status != 0 and show_stopper:
             print('Show stopper testcase failed')
             return status
     except OSError:
-        print('Error while executing {}'.format(cmd))
+        print('Error while executing {}'.format(command))
         return -1
     return status
 
 
-def parse_yaml(testcase_loc):
-    """Parse yaml file and do tasks on each testcase
+def validate_layer(blueprint, layer):
+    """validates a layer by validating all testcases under that layer
     """
-    with open(testcase_loc) as testcase_file:
-        testcases = yaml.safe_load(testcase_file)
-    blueprint = testcases['blueprint']
-    for section in blueprint['sections']:
-        print('## Section {}'.format(section))
-        for testcase in blueprint[section]:
-            run_testcase(testcase)
+    print('## Layer {}'.format(layer))
+    for testcase in blueprint[layer]:
+        run_testcase(testcase)
+
+
+def validate_blueprint(yaml_loc, layer):
+    """Parse yaml file and validates given layer. If no layer given all layers
+    validated
+    """
+    with open(yaml_loc) as yaml_file:
+        yamldoc = yaml.safe_load(yaml_file)
+    blueprint = yamldoc['blueprint']
+    if layer is None:
+        for each_layer in blueprint['layers']:
+            validate_layer(blueprint, each_layer)
+    else:
+        validate_layer(blueprint, layer)
+
+
+@click.command()
+@click.argument('blueprint')
+@click.option('--layer', '-l')
+def main(blueprint, layer):
+    """Takes blueprint name and optional layer. Validates inputs and derives
+    yaml location from blueprint name. Invokes validate on blue print.
+    """
+    yaml_loc = 'bluval/bluval-{}.yaml'.format(blueprint)
+    layer = layer.lower()
+    validate_blueprint(yaml_loc, layer)
 
 
 if __name__ == "__main__":
-    if len(sys.argv) != 2:
-        print('usage: bluval.py <testcase.yaml>')
-        sys.exit(1)
-    parse_yaml(sys.argv[1])
+    # pylint: disable=no-value-for-parameter
+    main()