Use multiple AWS regions in ansible-test. (#20429)
* Move ansible-test EnvironmentConfig to util. * Use multiple AWS regions in ansible-test.
This commit is contained in:
parent
5a48c7ac7a
commit
4ba9f63afe
6 changed files with 108 additions and 63 deletions
|
@ -19,17 +19,22 @@ from lib.util import (
|
|||
ApplicationError,
|
||||
run_command,
|
||||
make_dirs,
|
||||
CommonConfig,
|
||||
EnvironmentConfig,
|
||||
display,
|
||||
is_shippable,
|
||||
)
|
||||
|
||||
AWS_ENDPOINTS = {
|
||||
'us-east-1': 'https://14blg63h2i.execute-api.us-east-1.amazonaws.com',
|
||||
'us-east-2': 'https://g5xynwbk96.execute-api.us-east-2.amazonaws.com',
|
||||
}
|
||||
|
||||
|
||||
class AnsibleCoreCI(object):
|
||||
"""Client for Ansible Core CI services."""
|
||||
def __init__(self, args, platform, version, stage='prod', persist=True, name=None):
|
||||
"""
|
||||
:type args: CommonConfig
|
||||
:type args: EnvironmentConfig
|
||||
:type platform: str
|
||||
:type version: str
|
||||
:type stage: str
|
||||
|
@ -44,6 +49,7 @@ class AnsibleCoreCI(object):
|
|||
self.connection = None
|
||||
self.instance_id = None
|
||||
self.name = name if name else '%s-%s' % (self.platform, self.version)
|
||||
self.ci_key = os.path.expanduser('~/.ansible-core-ci.key')
|
||||
|
||||
aws_platforms = (
|
||||
'windows',
|
||||
|
@ -58,7 +64,22 @@ class AnsibleCoreCI(object):
|
|||
)
|
||||
|
||||
if self.platform in aws_platforms:
|
||||
self.endpoint = 'https://14blg63h2i.execute-api.us-east-1.amazonaws.com'
|
||||
if args.remote_aws_region:
|
||||
# permit command-line override of region selection
|
||||
region = args.remote_aws_region
|
||||
# use a dedicated CI key when overriding the region selection
|
||||
self.ci_key += '.%s' % args.remote_aws_region
|
||||
elif is_shippable():
|
||||
# split Shippable jobs across multiple regions to maximize use of launch credits
|
||||
if self.platform == 'freebsd':
|
||||
region = 'us-east-2'
|
||||
else:
|
||||
region = 'us-east-1'
|
||||
else:
|
||||
# send all non-Shippable jobs to us-east-1 to reduce api key maintenance
|
||||
region = 'us-east-1'
|
||||
|
||||
self.endpoint = AWS_ENDPOINTS[region]
|
||||
|
||||
if self.platform == 'windows':
|
||||
self.ssh_key = None
|
||||
|
@ -117,7 +138,7 @@ class AnsibleCoreCI(object):
|
|||
|
||||
def start_remote(self):
|
||||
"""Start instance for remote development/testing."""
|
||||
with open(os.path.expanduser('~/.ansible-core-ci.key'), 'r') as key_fd:
|
||||
with open(self.ci_key, 'r') as key_fd:
|
||||
auth_key = key_fd.read().strip()
|
||||
|
||||
self._start(dict(
|
||||
|
@ -347,7 +368,7 @@ class SshKey(object):
|
|||
"""Container for SSH key used to connect to remote instances."""
|
||||
def __init__(self, args):
|
||||
"""
|
||||
:type args: CommonConfig
|
||||
:type args: EnvironmentConfig
|
||||
"""
|
||||
tmp = os.path.expanduser('~/.ansible/test/')
|
||||
|
||||
|
|
|
@ -5,9 +5,21 @@ from __future__ import absolute_import, print_function
|
|||
import os
|
||||
import re
|
||||
|
||||
from lib.target import walk_module_targets
|
||||
from lib.util import display, ApplicationError, run_command
|
||||
from lib.executor import EnvironmentConfig, Delegate, install_command_requirements
|
||||
from lib.target import (
|
||||
walk_module_targets,
|
||||
)
|
||||
|
||||
from lib.util import (
|
||||
display,
|
||||
ApplicationError,
|
||||
EnvironmentConfig,
|
||||
run_command,
|
||||
)
|
||||
|
||||
from lib.executor import (
|
||||
Delegate,
|
||||
install_command_requirements,
|
||||
)
|
||||
|
||||
COVERAGE_DIR = 'test/results/coverage'
|
||||
COVERAGE_FILE = os.path.join(COVERAGE_DIR, 'coverage')
|
||||
|
|
|
@ -11,7 +11,6 @@ import lib.thread
|
|||
|
||||
from lib.executor import (
|
||||
SUPPORTED_PYTHON_VERSIONS,
|
||||
EnvironmentConfig,
|
||||
IntegrationConfig,
|
||||
SubprocessError,
|
||||
ShellConfig,
|
||||
|
@ -29,6 +28,7 @@ from lib.manage_ci import (
|
|||
|
||||
from lib.util import (
|
||||
ApplicationError,
|
||||
EnvironmentConfig,
|
||||
run_command,
|
||||
common_environment,
|
||||
display,
|
||||
|
|
|
@ -5,7 +5,6 @@ from __future__ import absolute_import, print_function
|
|||
import glob
|
||||
import os
|
||||
import tempfile
|
||||
import sys
|
||||
import time
|
||||
import textwrap
|
||||
import functools
|
||||
|
@ -31,6 +30,7 @@ from lib.manage_ci import (
|
|||
|
||||
from lib.util import (
|
||||
CommonConfig,
|
||||
EnvironmentConfig,
|
||||
ApplicationWarning,
|
||||
ApplicationError,
|
||||
SubprocessError,
|
||||
|
@ -1037,17 +1037,6 @@ def detect_changes_local(args):
|
|||
return sorted(names)
|
||||
|
||||
|
||||
def docker_qualify_image(name):
|
||||
"""
|
||||
:type name: str
|
||||
:rtype: str
|
||||
"""
|
||||
if not name or any((c in name) for c in ('/', ':')):
|
||||
return name
|
||||
|
||||
return 'ansible/ansible:%s' % name
|
||||
|
||||
|
||||
def get_integration_filter(args, targets):
|
||||
"""
|
||||
:type args: IntegrationConfig
|
||||
|
@ -1192,48 +1181,6 @@ class SanityFunc(SanityTest):
|
|||
self.intercept = intercept
|
||||
|
||||
|
||||
class EnvironmentConfig(CommonConfig):
|
||||
"""Configuration common to all commands which execute in an environment."""
|
||||
def __init__(self, args, command):
|
||||
"""
|
||||
:type args: any
|
||||
"""
|
||||
super(EnvironmentConfig, self).__init__(args)
|
||||
|
||||
self.command = command
|
||||
|
||||
self.local = args.local is True
|
||||
|
||||
if args.tox is True or args.tox is False or args.tox is None:
|
||||
self.tox = args.tox is True
|
||||
self.tox_args = 0
|
||||
self.python = args.python if 'python' in args else None # type: str
|
||||
else:
|
||||
self.tox = True
|
||||
self.tox_args = 1
|
||||
self.python = args.tox # type: str
|
||||
|
||||
self.docker = docker_qualify_image(args.docker) # type: str
|
||||
self.remote = args.remote # type: str
|
||||
|
||||
self.docker_privileged = args.docker_privileged if 'docker_privileged' in args else False # type: bool
|
||||
self.docker_util = docker_qualify_image(args.docker_util if 'docker_util' in args else '') # type: str
|
||||
self.docker_pull = args.docker_pull if 'docker_pull' in args else False # type: bool
|
||||
|
||||
self.tox_sitepackages = args.tox_sitepackages # type: bool
|
||||
|
||||
self.remote_stage = args.remote_stage # type: str
|
||||
|
||||
self.requirements = args.requirements # type: bool
|
||||
|
||||
self.python_version = self.python or '.'.join(str(i) for i in sys.version_info[:2])
|
||||
|
||||
self.delegate = self.tox or self.docker or self.remote
|
||||
|
||||
if self.delegate:
|
||||
self.requirements = True
|
||||
|
||||
|
||||
class TestConfig(EnvironmentConfig):
|
||||
"""Configuration common to all test commands."""
|
||||
def __init__(self, args, command):
|
||||
|
|
|
@ -413,4 +413,58 @@ class CommonConfig(object):
|
|||
self.verbosity = args.verbosity # type: int
|
||||
|
||||
|
||||
class EnvironmentConfig(CommonConfig):
|
||||
"""Configuration common to all commands which execute in an environment."""
|
||||
def __init__(self, args, command):
|
||||
"""
|
||||
:type args: any
|
||||
"""
|
||||
super(EnvironmentConfig, self).__init__(args)
|
||||
|
||||
self.command = command
|
||||
|
||||
self.local = args.local is True
|
||||
|
||||
if args.tox is True or args.tox is False or args.tox is None:
|
||||
self.tox = args.tox is True
|
||||
self.tox_args = 0
|
||||
self.python = args.python if 'python' in args else None # type: str
|
||||
else:
|
||||
self.tox = True
|
||||
self.tox_args = 1
|
||||
self.python = args.tox # type: str
|
||||
|
||||
self.docker = docker_qualify_image(args.docker) # type: str
|
||||
self.remote = args.remote # type: str
|
||||
|
||||
self.docker_privileged = args.docker_privileged if 'docker_privileged' in args else False # type: bool
|
||||
self.docker_util = docker_qualify_image(args.docker_util if 'docker_util' in args else '') # type: str
|
||||
self.docker_pull = args.docker_pull if 'docker_pull' in args else False # type: bool
|
||||
|
||||
self.tox_sitepackages = args.tox_sitepackages # type: bool
|
||||
|
||||
self.remote_stage = args.remote_stage # type: str
|
||||
self.remote_aws_region = args.remote_aws_region # type: str
|
||||
|
||||
self.requirements = args.requirements # type: bool
|
||||
|
||||
self.python_version = self.python or '.'.join(str(i) for i in sys.version_info[:2])
|
||||
|
||||
self.delegate = self.tox or self.docker or self.remote
|
||||
|
||||
if self.delegate:
|
||||
self.requirements = True
|
||||
|
||||
|
||||
def docker_qualify_image(name):
|
||||
"""
|
||||
:type name: str
|
||||
:rtype: str
|
||||
"""
|
||||
if not name or any((c in name) for c in ('/', ':')):
|
||||
return name
|
||||
|
||||
return 'ansible/ansible:%s' % name
|
||||
|
||||
|
||||
display = Display() # pylint: disable=locally-disabled, invalid-name
|
||||
|
|
|
@ -51,6 +51,10 @@ from lib.target import (
|
|||
walk_sanity_targets,
|
||||
)
|
||||
|
||||
from lib.core_ci import (
|
||||
AWS_ENDPOINTS,
|
||||
)
|
||||
|
||||
import lib.cover
|
||||
|
||||
|
||||
|
@ -409,6 +413,7 @@ def add_environments(parser, tox_version=False, tox_only=False):
|
|||
docker=None,
|
||||
remote=None,
|
||||
remote_stage=None,
|
||||
remote_aws_region=None,
|
||||
)
|
||||
|
||||
return
|
||||
|
@ -433,6 +438,12 @@ def add_environments(parser, tox_version=False, tox_only=False):
|
|||
choices=['prod', 'dev'],
|
||||
default='prod')
|
||||
|
||||
remote.add_argument('--remote-aws-region',
|
||||
metavar='REGION',
|
||||
help='remote aws region to use: %(choices)s (default: auto)',
|
||||
choices=sorted(AWS_ENDPOINTS),
|
||||
default=None)
|
||||
|
||||
|
||||
def add_extra_docker_options(parser, integration=True):
|
||||
"""
|
||||
|
|
Loading…
Reference in a new issue