Add tools to run jenkins jobs and remote commands

- ./tcp_tests/utils/create_devops_env.py
  Creates a fuel-devops enviromnet with VMs in disabled
  state, to generate networks and addresses for inventory.
  Required parameters:
    export ENV_NAME=test
    export LAB_CONFIG_NAME=<template directory with underlay.yml>
    export MANAGER=devops
  Other parameters may be required for the underlay.yml

  CLI example:
    export PYTHONPATH=$(pwd)
    python ./tcp_tests/utils/create_devops_env.py

- ./tcp_tests/utils/run_jenkins_job.py
  Run a jenkins job with parameters, wait for completion,
  print the console output to stdout while waiting.
  Required parameters:
    export JENKINS_URL=http://host:port/
    export JENKINS_USER=admin
    export JENKINS_PASS=admin
  CLI example:

    JOB_PARAMETERS="{
      \"SALT_MASTER_URL\": \"${SALTAPI_URL}\",
      \"STACK_INSTALL\": \"core,cicd\"
    }"
    JOB_PREFIX="[ {job_name} #{build_number}:cicd {time} ] "

    python ./tcp_tests/utils/run_jenkins_job.py \
        --verbose \
        --job-name=deploy_openstack \
        --job-parameters="$JOB_PARAMETERS" \
        --job-output-prefix="$JOB_PREFIX"

- ./tcp_tests/utils/get_param.py
  Get a single parameter from the salt pillar.
  Useful to get addresses and other scalar values.
  Required parameters are the same as for 'pepper' CLI:
    export SALTAPI_URL=http://${SALT_MASTER_IP}:6969/
    export SALTAPI_USER='salt'
    export SALTAPI_PASS='icecream12345!'
    export SALTAPI_EAUTH='pam'
  CLI example:
  export JENKINS_HOST=$(./tcp_tests/utils/get_param.py \
    -C 'I@docker:client:stack:jenkins' \
    pillar.get jenkins:client:master:host)

- ./tcp_tests/utils/run_template_commands.py
  Run remote commands from the ./tcp_tests/templates/
  No environment varialbes are required, but may be
  useful to provide the INI config from some completed
  deployment.
  CLI example:

    export TESTS_CONFIGS=$(pwd)/test_salt_deployed.ini
    ./tcp_tests/utils/run_template_commands.py \
        ./tcp_tests/templates/<lab_name>/common_services.yaml

- some env files for sourcing to get access to different APIs.
  This will simplify using the scripts above.

    . ./tcp_tests/utils/env_salt          # salt-api access
    . ./tcp_tests/utils/env_jenkins_day01 # jenkins on salt-master
    . ./tcp_tests/utils/env_jenkins_cicd  # jenkins on cicd
    . ./tcp_tests/utils/env_k8s           # k8s api access

- fixed UnderlayManager.sudo_check_call() to remove
  deprecation warning.

Improvements to JenkisClient:
- Add JenkinsWrapper class to workaround the bug
  https://bugs.launchpad.net/python-jenkins/+bug/1775047
  which is happened to CICD Jenkins behind the haproxy
- improved waiting for start of the job in run_build()
- new argument 'interval' in wait_end_of_build(), to set
  the polling interval while waiting the job
- new argument 'job_output_prefix' in wait_end_of_build(),
  which allows to set the prefix to each line of the console
  output of the job; with some pre-defined template keys.
- improved printing the job output in case of non-unicode characters

Change-Id: Ie7d1324d8247e55ba9c0f0492ca39fc176ff4935
diff --git a/tcp_tests/utils/env_jenkins_day01 b/tcp_tests/utils/env_jenkins_day01
new file mode 100755
index 0000000..c084a52
--- /dev/null
+++ b/tcp_tests/utils/env_jenkins_day01
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+# Source file to set access credentials to Jenkins API on salt-master node (day01 deployment steps)
+# Requires:
+#  - ENV_NAME
+# Example usage:
+# $> . ./tcp_tests/utils/env_salt
+# $> . ./tcp_tests/utils/env_jenkins_day01
+# $> ./tcp_tests/utils/run_jenkins_job.py --verbose --job-name=deploy_openstack --job-parameters="{... json ...}"
+
+CURRENT_DIR=$(dirname $(readlink -f "${BASH_SOURCE[0]}"))
+export PYTHONPATH=${CURRENT_DIR}/../..
+
+SALT_MASTER_IP=${SALT_MASTER_IP:-$(for node in $(dos.py slave-ip-list --address-pool-name admin-pool01 ${ENV_NAME}); do echo $node|grep cfg01|cut -d',' -f2; done)}
+
+if [ -z "$SALT_MASTER_IP" ]; then
+    echo "SALT_MASTER_IP not found in the environment '${ENV_NAME}'"
+    unset JENKINS_URL
+    unset JENKINS_USER
+    unset JENKINS_PASS
+    unset JENKINS_START_TIMEOUT
+    unset JENKINS_BUILD_TIMEOUT
+else
+    # For run_jenkins_job.py
+    export JENKINS_URL=http://${SALT_MASTER_IP}:8081
+    export JENKINS_USER=admin
+    export JENKINS_PASS=r00tme
+    export JENKINS_START_TIMEOUT=60
+    export JENKINS_BUILD_TIMEOUT=1800
+fi
+
+echo "export JENKINS_URL='$JENKINS_URL'  # Jenkins API URL"
+echo "export JENKINS_USER='${JENKINS_USER}'  # Jenkins API username"
+echo "export JENKINS_PASS='${JENKINS_PASS}'  # Jenkins API password or token"
+echo "export JENKINS_START_TIMEOUT='${JENKINS_START_TIMEOUT}'  # Timeout waiting for job in queue to start building"
+echo "export JENKINS_BUILD_TIMEOUT='${JENKINS_BUILD_TIMEOUT}'  # Timeout waiting for building job to complete"