From 16cdf9cf363997df2ee9a026681ccb59117664f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Andr=C3=A9?= <m.andre@redhat.com>
Date: Thu, 11 Aug 2016 10:12:54 +0200
Subject: [PATCH] Allow running validation against different plans

This commit adds support for selecting plan (overcloud) against which
to run validations, configurable with the `plan` variable in relevant
mistral actions.

The `run-validation` wrapper now accept the plan name as a second
argument and pass it to Ansible dynamic inventory script via
TRIPLEO_PLAN_NAME variable. The default plan remains `overcloud`.

Change-Id: Icebf91360f387d7f558c2b5a6a5a4decb5a89093
---
 scripts/run-validation                           |  5 +++++
 tripleo_common/actions/validations.py            |  7 +++++--
 tripleo_common/tests/actions/test_validations.py | 13 +++++++++----
 tripleo_common/tests/utils/test_validations.py   |  6 ++++--
 tripleo_common/utils/validations.py              |  5 +++--
 workbooks/validations.yaml                       | 15 ++++++++++++---
 6 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/scripts/run-validation b/scripts/run-validation
index 35ef3b463..0c2d2c641 100755
--- a/scripts/run-validation
+++ b/scripts/run-validation
@@ -5,6 +5,7 @@ set -o pipefail
 
 VALIDATION_FILE=$1
 IDENTITY_FILE=$2
+PLAN_NAME=$3
 
 if [[ -z "$VALIDATION_FILE" ]]; then
     echo "Missing required validation file"
@@ -31,4 +32,8 @@ export ANSIBLE_PRIVATE_KEY_FILE=$IDENTITY_FILE
 
 export ANSIBLE_INVENTORY=$(which tripleo-ansible-inventory)
 
+# Environment variable is the easiest way to pass variables to an Ansible
+# dynamic inventory script
+export TRIPLEO_PLAN_NAME=${PLAN_NAME}
+
 ansible-playbook $VALIDATION_FILE
diff --git a/tripleo_common/actions/validations.py b/tripleo_common/actions/validations.py
index c5c88242f..aebb258e6 100644
--- a/tripleo_common/actions/validations.py
+++ b/tripleo_common/actions/validations.py
@@ -20,6 +20,7 @@ from mistral.workflow import utils as mistral_workflow_utils
 from oslo_concurrency.processutils import ProcessExecutionError
 
 from tripleo_common.actions import base
+from tripleo_common import constants
 from tripleo_common.utils import validations as utils
 
 
@@ -83,9 +84,10 @@ class ListGroupsAction(base.TripleOAction):
 
 class RunValidationAction(base.TripleOAction):
     """Run the given validation"""
-    def __init__(self, validation):
+    def __init__(self, validation, plan=constants.DEFAULT_CONTAINER_NAME):
         super(RunValidationAction, self).__init__()
         self.validation = validation
+        self.plan = plan
 
     def run(self):
         mc = self._get_workflow_client()
@@ -95,7 +97,8 @@ class RunValidationAction(base.TripleOAction):
             identity_file = utils.write_identity_file(private_key)
 
             stdout, stderr = utils.run_validation(self.validation,
-                                                  identity_file)
+                                                  identity_file,
+                                                  self.plan)
             return_value = {'stdout': stdout, 'stderr': stderr}
             mistral_result = (return_value, None)
         except ProcessExecutionError as e:
diff --git a/tripleo_common/tests/actions/test_validations.py b/tripleo_common/tests/actions/test_validations.py
index 72d1c2371..4ffc364ca 100644
--- a/tripleo_common/tests/actions/test_validations.py
+++ b/tripleo_common/tests/actions/test_validations.py
@@ -19,6 +19,7 @@ from mistral.workflow import utils as mistral_workflow_utils
 from oslo_concurrency.processutils import ProcessExecutionError
 
 from tripleo_common.actions import validations
+from tripleo_common import constants
 from tripleo_common.tests import base
 from tripleo_common.tests.utils import test_validations
 
@@ -119,8 +120,10 @@ class RunValidationActionTest(base.TestCase):
             error=None)
         self.assertEqual(expected, action.run())
         mock_write_identity_file.assert_called_once_with('shhhh')
-        mock_run_validation.assert_called_once_with('validation',
-                                                    'identity_file_path')
+        mock_run_validation.assert_called_once_with(
+            'validation',
+            'identity_file_path',
+            constants.DEFAULT_CONTAINER_NAME)
         mock_cleanup_identity_file.assert_called_once_with(
             'identity_file_path')
 
@@ -149,7 +152,9 @@ class RunValidationActionTest(base.TestCase):
             })
         self.assertEqual(expected, action.run())
         mock_write_identity_file.assert_called_once_with('shhhh')
-        mock_run_validation.assert_called_once_with('validation',
-                                                    'identity_file_path')
+        mock_run_validation.assert_called_once_with(
+            'validation',
+            'identity_file_path',
+            constants.DEFAULT_CONTAINER_NAME)
         mock_cleanup_identity_file.assert_called_once_with(
             'identity_file_path')
diff --git a/tripleo_common/tests/utils/test_validations.py b/tripleo_common/tests/utils/test_validations.py
index 789429a93..83d775f6d 100644
--- a/tripleo_common/tests/utils/test_validations.py
+++ b/tripleo_common/tests/utils/test_validations.py
@@ -193,7 +193,8 @@ class RunValidationTest(base.TestCase):
         mock_execute.return_value = 'output'
         mock_find_validation.return_value = 'validation_path'
 
-        result = validations.run_validation('validation', 'identity_file')
+        result = validations.run_validation('validation', 'identity_file',
+                                            'plan')
         self.assertEqual('output', result)
         mock_execute.assert_called_once_with(
             '/usr/bin/sudo', '-u', 'validations',
@@ -203,6 +204,7 @@ class RunValidationTest(base.TestCase):
             'OS_TENANT_NAME=project_name',
             '/usr/bin/run-validation',
             'validation_path',
-            'identity_file'
+            'identity_file',
+            'plan'
         )
         mock_find_validation.assert_called_once_with('validation')
diff --git a/tripleo_common/utils/validations.py b/tripleo_common/utils/validations.py
index af7e8aaeb..fa16f9253 100644
--- a/tripleo_common/utils/validations.py
+++ b/tripleo_common/utils/validations.py
@@ -77,7 +77,7 @@ def find_validation(validation):
     return '{}/{}.yaml'.format(constants.DEFAULT_VALIDATIONS_PATH, validation)
 
 
-def run_validation(validation, identity_file):
+def run_validation(validation, identity_file, plan):
     ctx = context.ctx()
     return processutils.execute(
         '/usr/bin/sudo', '-u', 'validations',
@@ -87,7 +87,8 @@ def run_validation(validation, identity_file):
         'OS_TENANT_NAME={}'.format(ctx.project_name),
         '/usr/bin/run-validation',
         find_validation(validation),
-        identity_file
+        identity_file,
+        plan
     )
 
 
diff --git a/workbooks/validations.yaml b/workbooks/validations.yaml
index c03b88e69..22a20cbd8 100644
--- a/workbooks/validations.yaml
+++ b/workbooks/validations.yaml
@@ -9,6 +9,7 @@ workflows:
     type: direct
     input:
       - validation_name
+      - plan: overcloud
       - queue_name: tripleo
 
     tasks:
@@ -23,13 +24,14 @@ workflows:
               type: tripleo.validations.v1.run_validation
               payload:
                 validation_name: <% $.validation_name %>
+                plan: <% $.plan %>
                 status: RUNNING
                 execution: <% execution() %>
 
       run_validation:
         on-success: send_message
         on-error: set_status_failed
-        action: tripleo.validations.run_validation validation=<% $.validation_name %>
+        action: tripleo.validations.run_validation validation=<% $.validation_name %> plan=<% $.plan %>
         publish:
           status: SUCCESS
           stdout: <% task(run_validation).result.stdout %>
@@ -51,6 +53,7 @@ workflows:
               type: tripleo.validations.v1.run_validation
               payload:
                 validation_name: <% $.validation_name %>
+                plan: <% $.plan %>
                 status: <% $.get('status', 'SUCCESS') %>
                 stdout: <% $.stdout %>
                 stderr: <% $.stderr %>
@@ -60,6 +63,7 @@ workflows:
     type: direct
     input:
       - validation_names: []
+      - plan: overcloud
       - queue_name: tripleo
 
     tasks:
@@ -74,13 +78,14 @@ workflows:
               type: tripleo.validations.v1.run_validations
               payload:
                 validation_names: <% $.validation_names %>
+                plan: <% $.plan %>
                 status: RUNNING
                 execution: <% execution() %>
 
       run_validations:
         on-success: send_message
         on-error: set_status_failed
-        workflow: tripleo.validations.v1.run_validation validation_name=<% $.validation %> queue_name=<% $.queue_name %>
+        workflow: tripleo.validations.v1.run_validation validation_name=<% $.validation %> plan=<% $.plan %> queue_name=<% $.queue_name %>
         with-items: validation in <% $.validation_names %>
         publish:
           status: SUCCESS
@@ -99,6 +104,7 @@ workflows:
               type: tripleo.validations.v1.run_validations
               payload:
                 validation_names: <% $.validation_names %>
+                plan: <% $.plan %>
                 status: <% $.get('status', 'SUCCESS') %>
                 execution: <% execution() %>
 
@@ -106,6 +112,7 @@ workflows:
     type: direct
     input:
       - group_names: []
+      - plan: overcloud
       - queue_name: tripleo
 
     tasks:
@@ -127,13 +134,14 @@ workflows:
               payload:
                 group_names: <% $.group_names %>
                 validation_names: <% $.validations.id %>
+                plan: <% $.plan %>
                 status: RUNNING
                 execution: <% execution() %>
 
       run_validation_group:
         on-success: send_message
         on-error: set_status_failed
-        workflow: tripleo.validations.v1.run_validation validation_name=<% $.validation %> queue_name=<% $.queue_name %>
+        workflow: tripleo.validations.v1.run_validation validation_name=<% $.validation %> plan=<% $.plan %> queue_name=<% $.queue_name %>
         with-items: validation in <% $.validations.id %>
         publish:
           status: SUCCESS
@@ -153,6 +161,7 @@ workflows:
               payload:
                 group_names: <% $.group_names %>
                 validation_names: <% $.validations.id %>
+                plan: <% $.plan %>
                 status: <% $.get('status', 'SUCCESS') %>
                 execution: <% execution() %>