blucon: Add argument '-p' for pulling latest tag 82/3382/2
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Wed, 22 Apr 2020 13:14:47 +0000 (15:14 +0200)
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Wed, 22 Apr 2020 14:07:12 +0000 (16:07 +0200)
If `--pull` or `-p` argument is passed to blucon, it will now run a
`docker pull` command prior to launching the testcases with `docker
run`.
This should prevent the testcases from using stale docker images if
already present on the machine.

JIRA: VAL-107

Change-Id: Id4b7947a0de7abf07f69812c6deef71919b9041a
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
bluval/blucon.py

index ee7f706..8072382 100644 (file)
@@ -29,6 +29,7 @@ import yaml
 from bluutil import BluvalError
 from bluutil import ShowStopperError
 
+_PULL = False
 _OPTIONAL_ALSO = False
 _SUBNET = ""
 
@@ -53,9 +54,25 @@ def get_volumes(layer):
     return volume_list
 
 
+def pull_docker(layer, tag):
+    """Pull docker image for given layer
+    """
+    cmd = ("docker pull akraino/validation:{0}-{1}"
+           .format(layer, tag))
+
+    args = [cmd]
+    try:
+        print('\nPulling image using {}'.format(args), flush=True)
+        subprocess.call(args, shell=True)
+    except OSError:
+        raise BluvalError(OSError)
+
+
 def invoke_docker(bluprint, layer, tag):
     """Start docker container for given layer
     """
+    if _PULL:
+        pull_docker(layer, tag)
     volume_list = get_volumes('common') + get_volumes(layer)
     cmd = ("docker run --rm" + volume_list + _SUBNET +
            " akraino/validation:{0}-{3}"
@@ -92,16 +109,22 @@ def invoke_dockers(yaml_loc, layer, blueprint_name, tag):
 @click.option('--network', '-n')
 @click.option('--tag', '-t')
 @click.option('--optional_also', '-o', is_flag=True)
-def main(blueprint, layer, network, tag, optional_also):
+@click.option('--pull', '-p', is_flag=True)
+# pylint: disable=too-many-arguments
+def main(blueprint, layer, network, tag, optional_also, pull):
     """Takes blueprint name and optional layer. Validates inputs and derives
     yaml location from blueprint name. Invokes validate on blueprint.
     """
+    global _PULL # pylint: disable=global-statement
     global _OPTIONAL_ALSO  # pylint: disable=global-statement
     global _SUBNET # pylint: disable=global-statement
     mypath = Path(__file__).absolute()
     yaml_loc = mypath.parents[0].joinpath('bluval-{}.yaml'.format(blueprint))
     if layer is not None:
         layer = layer.lower()
+    if pull:
+        _PULL = True
+        print("_PULL {}".format(_PULL))
     if optional_also:
         _OPTIONAL_ALSO = True
         print("_OPTIONAL_ALSO {}".format(_OPTIONAL_ALSO))