Add tests to run cvp-func and cvp-sanity jobs

New pytest marks:
- run_cvp_func_smoke
- run_cvp_func_sanity

New SaltManager method:
- get_single_pillar() , to get a single value from
  a single minion

Minor changes to get_jenkins_job_stages.py and
run_jenkins_job.py, to call them with required
parameters.

Change-Id: Ia2dd039cc1a04ac6fb4cb2020f09df473f9c5104
Closes-Bug: PROD-21659
diff --git a/tcp_tests/utils/get_jenkins_job_stages.py b/tcp_tests/utils/get_jenkins_job_stages.py
index 883494f..b28e1d2 100755
--- a/tcp_tests/utils/get_jenkins_job_stages.py
+++ b/tcp_tests/utils/get_jenkins_job_stages.py
@@ -69,15 +69,15 @@
     return parser
 
 
-def get_deployment_result(opts):
+def get_deployment_result(host, username, password, job_name, build_number):
     """Get the pipeline job result from Jenkins
 
     Get all the stages resutls from the specified job,
     show error message if present.
     """
-    jenkins = client.JenkinsClient(host=opts.host,
-                                   username=opts.username,
-                                   password=opts.password)
+    jenkins = client.JenkinsClient(host=host,
+                                   username=username,
+                                   password=password)
 
     def get_stages(nodes, indent=0, show_status=True):
         res = []
@@ -90,15 +90,15 @@
                 res.append(msg)
 
             if node['status'] != 'SUCCESS':
-                wf = jenkins.get_workflow(opts.job_name, opts.build_number,
+                wf = jenkins.get_workflow(job_name, build_number,
                                           int(node['id']))
                 if wf is not None:
                     if 'stageFlowNodes' in wf:
                         res += get_stages(wf['stageFlowNodes'], indent + 2,
                                           show_status=False)
                     elif '_links' in wf and 'log' in wf['_links']:
-                        log = jenkins.get_workflow(opts.job_name,
-                                                   opts.build_number,
+                        log = jenkins.get_workflow(job_name,
+                                                   build_number,
                                                    int(node['id']),
                                                    mode='log')
                         if "text" in log:
@@ -109,8 +109,8 @@
         return res
 
     for _ in range(3):
-        wf = jenkins.get_workflow(opts.job_name, opts.build_number)
-        info = jenkins.build_info(opts.job_name, int(wf['id']))
+        wf = jenkins.get_workflow(job_name, build_number)
+        info = jenkins.build_info(job_name, int(wf['id']))
         if info.get('result'):
             break
         time.sleep(3)
@@ -120,7 +120,7 @@
     stages = get_stages(wf['stages'], 0)
     if not stages:
         msg = wf['status'] + ":\n\n"
-        stages = [msg + jenkins.get_build_output(opts.job_name, int(wf['id']))]
+        stages = [msg + jenkins.get_build_output(job_name, int(wf['id']))]
     return (build_description, stages)
 
 
@@ -133,7 +133,12 @@
         parser.print_help()
         return 10
     else:
-        (build_description, stages) = get_deployment_result(opts)
+        (build_description, stages) = get_deployment_result(
+            opts.host,
+            opts.username,
+            opts.password,
+            opts.job_name,
+            opts.build_number)
         print(build_description)
         print('\n'.join(stages))
 
diff --git a/tcp_tests/utils/run_jenkins_job.py b/tcp_tests/utils/run_jenkins_job.py
index acc2e9f..86a3703 100755
--- a/tcp_tests/utils/run_jenkins_job.py
+++ b/tcp_tests/utils/run_jenkins_job.py
@@ -97,10 +97,10 @@
     return parser
 
 
-def print_build_header(build, job_params, opts):
+def print_build_header(build, job_params, build_timeout):
     print('\n#############################################################')
     print('##### Building job [{0}] #{1} (timeout={2}) with the following '
-          'parameters:'.format(build[0], build[1], opts.build_timeout))
+          'parameters:'.format(build[0], build[1], build_timeout))
     print('##### ' + '\n##### '.join(
         [str(key) + ": " + str(val) for key, val in job_params.iteritems()]
     ))
@@ -114,41 +114,44 @@
     print('#############################################################\n')
 
 
-def run_job(opts):
+def run_job(host, username, password,
+            job_name, job_parameters=None, job_output_prefix='',
+            start_timeout=1800, build_timeout=3600 * 4, verbose=False):
 
     jenkins = JenkinsClient(
-        host=opts.host,
-        username=opts.username,
-        password=opts.password)
+        host=host,
+        username=username,
+        password=password)
 
-    job_params = jenkins.make_defults_params(opts.job_name)
-    job_params.update(opts.job_parameters)
+    job_params = jenkins.make_defults_params(job_name)
+    if job_parameters is not None:  # job_parameters = {}
+        job_params.update(job_parameters)
 
-    build = jenkins.run_build(opts.job_name,
+    build = jenkins.run_build(job_name,
                               job_params,
-                              verbose=opts.verbose,
-                              timeout=opts.start_timeout)
-    if opts.verbose:
-        print_build_header(build, job_params, opts)
+                              verbose=verbose,
+                              timeout=start_timeout)
+    if verbose:
+        print_build_header(build, job_params, build_timeout)
 
     try:
         jenkins.wait_end_of_build(
             name=build[0],
             build_id=build[1],
-            timeout=opts.build_timeout,
+            timeout=build_timeout,
             interval=1,
-            verbose=opts.verbose,
-            job_output_prefix=opts.job_output_prefix)
+            verbose=verbose,
+            job_output_prefix=job_output_prefix)
     except Exception as e:
         print(str(e))
         raise
 
     result = jenkins.build_info(name=build[0],
                                 build_id=build[1])['result']
-    if opts.verbose:
-        print_build_footer(build, result, opts.host)
+    if verbose:
+        print_build_footer(build, result, host)
 
-    return EXIT_CODES.get(result, 2)
+    return result
 
 
 def main(args=None):
@@ -160,8 +163,8 @@
         parser.print_help()
         return 10
     else:
-        exit_code = run_job(opts)
-        return exit_code
+        result = run_job(opts)
+        return EXIT_CODES.get(result, 2)
 
 
 if __name__ == "__main__":