3a35b79a81
Specifying the values for environment variables is not necessary for docker, we can simply pass the names of the variables to whitelist for pass-through. This must be done at 'docker run' and may not (currently) be done via a Dockerfile (without baking the potentially sensitive values of the params into the image) Change-Id: I81f229acd33184e8bb2a15c48020e74a32d7ad6c
121 lines
4.7 KiB
Python
Executable File
121 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
#
|
|
# Copyright (c) 2014 Dell Computer, Inc. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
# This file creates and runs Tempest in a Docker Container
|
|
import commands
|
|
import logging
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
if __name__ == "__main__":
|
|
|
|
# Reference Information
|
|
DOCKER_FILE_SOURCE = os.path.join("scripts", "tcup")
|
|
DOCKER_FILE_URL = "https://raw.githubusercontent.com/stackforge/" \
|
|
"refstack/master/scripts/tcup/Dockerfile"
|
|
REFSTACK_API_ADDRESS = "http://refstack.org/replace_with_correct_url"
|
|
IGNORED_ENV_VARS = {"LS_COLORS", "HOME", "PATH", "PWD", "OLDPWD",
|
|
"LESSCLOSE", "SSH_CONNECTION"}
|
|
REQUIRED_ENV_VARS = {'OS_PASSWORD', 'OS_USERNAME', 'OS_AUTH_URL'}
|
|
|
|
# debugging?
|
|
debug = ((len(sys.argv) > 1 and sys.argv[1] == "--debug")
|
|
or os.environ.get("DEBUG"))
|
|
|
|
# Setup the logger
|
|
LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(message)s"
|
|
logger = logging.getLogger("TCUP")
|
|
console_log_handle = logging.StreamHandler()
|
|
console_log_handle.setFormatter(logging.Formatter(LOG_FORMAT))
|
|
logger.addHandler(console_log_handle)
|
|
if debug:
|
|
logger.setLevel(logging.DEBUG)
|
|
logger.info("Starting in DEBUG mode.")
|
|
else:
|
|
logger.setLevel(logging.INFO)
|
|
|
|
# Confirm you've sourced their openrc credentials already
|
|
for env_var in REQUIRED_ENV_VARS:
|
|
if not os.environ.get(env_var):
|
|
exp = 'Env Variable "%s" Missing: ' \
|
|
'You may need to "source openrc.sh".' % (env_var)
|
|
raise Exception(exp)
|
|
|
|
# build the container
|
|
logger.info("Downloading & Building TCUP Image...(may take a long time)")
|
|
if os.path.isfile(DOCKER_FILE_SOURCE + "/Dockerfile"):
|
|
docker_builder = DOCKER_FILE_SOURCE
|
|
else:
|
|
docker_builder = DOCKER_FILE_URL
|
|
logger.info("Executing: `docker build %s`" % (docker_builder))
|
|
build_output = commands.getoutput("docker build %s" % (docker_builder))
|
|
|
|
# provide friendly output progress message
|
|
search_for = "Successfully built ([0-9a-f]{12})"
|
|
try:
|
|
image = re.search(search_for, build_output).group(1)
|
|
except re.error:
|
|
exp = "ERROR building TCUP container. Details: %s" % (build_output)
|
|
raise Exception(exp)
|
|
logger.info("TCUP Built Docker Image ID: %s" % (image))
|
|
|
|
# collect environment variables to pass, we don't want all of them
|
|
user_env_vars = dict(os.environ)
|
|
for env_var in IGNORED_ENV_VARS:
|
|
user_env_vars.pop(env_var, None)
|
|
|
|
# test specific configuration
|
|
if not os.environ.get('TEST_ID'):
|
|
user_env_vars["test_id"] = "1000" # TODO: generated good value!
|
|
|
|
if not os.environ.get('API_SERVER_ADDRESS'):
|
|
user_env_vars["api_addr"] = REFSTACK_API_ADDRESS
|
|
|
|
# create the docker run command line
|
|
docker_run = "docker run -d -i"
|
|
for env_var in user_env_vars:
|
|
docker_run += ' -e "%s"' % (env_var,)
|
|
if debug:
|
|
docker_run += " -v `pwd`:/dev"
|
|
docker_run += ' -t %s' % (image)
|
|
if debug:
|
|
docker_run += " /bin/bash"
|
|
logger.info("Debug mode does not start tests! \
|
|
You must run `refstack/refstack/tools/execute_test.py \
|
|
--tempest-home /tempest` to complete processing")
|
|
else:
|
|
docker_run += " cd refstack; refstack/tools/execute_test.py" \
|
|
" --tempest-home /tempest" \
|
|
" --callback ${api_addr} ${test_id}"
|
|
if debug:
|
|
docker_run_log_output = docker_run
|
|
else:
|
|
# normally we redact the password
|
|
clear_password = "OS_PASSWORD=%s" % user_env_vars['OS_PASSWORD']
|
|
docker_run_log_output = docker_run.replace(clear_password,
|
|
"OS_PASSWORD=!REDACTED!")
|
|
logger.info("Executing: '%s'" % (docker_run_log_output))
|
|
|
|
# start the container and advise the user about how to attach
|
|
docker_output = commands.getoutput(docker_run)
|
|
logger.debug(docker_output)
|
|
logger.info("""You can monitor the TCUP results using the command
|
|
'docker attach %s'
|
|
(hint: you may need to press [enter])"""
|
|
% docker_output[0:12])
|