salt/tools/container.py
2025-02-18 18:31:03 -07:00

108 lines
2.9 KiB
Python

import os
from ptscripts import Context, command_group
cmd = command_group(name="container", help="Container Commands", description=__doc__)
def has_network(ctx, name):
p = ctx.run("docker", "network", "ls", capture=True)
return name in p.stdout.decode()
def create_network(ctx, name):
p = ctx.run(
"docker",
"network",
"create",
"-o",
"com.docker.network.driver.mtu=1500",
"--ipv6",
"--subnet",
"2001:db8::/64",
name,
)
if p.returncode != 0:
raise RuntimeError(f"docker network create returned {p.returncode}")
@cmd.command(
name="create",
arguments={
"image": {"help": "Name the container image to use."},
"name": {"help": "Name the container being created.", "default": ""},
},
)
def create(ctx: Context, image: str, name: str = ""):
onci = "GITHUB_WORKFLOW" in os.environ
workdir = "/salt"
home = "/root"
network = "ip6net"
if not onci and not has_network(ctx, network):
ctx.info(f"Creating docker network: {network}")
create_network(ctx, network)
if onci:
workdir = "/__w/salt/salt"
home = "/github/home"
env = {
"HOME": home,
"SKIP_REQUIREMENTS_INSTALL": "1",
"PRINT_TEST_SELECTION": "0",
"PRINT_TEST_PLAN_ONLY": "0",
"PRINT_SYSTEM_INFO": "0",
"RERUN_FAILURES": "0",
"SKIP_INITIAL_ONEDIR_FAILURES": "1",
"SKIP_INITIAL_GH_ACTIONS_FAILURES": "1",
"RAISE_DEPRECATIONS_RUNTIME_ERRORS": "1",
"LANG": "en_US.UTF-8",
"SHELL": "/bin/bash",
}
for var in [
"PIP_INDEX_URL",
"PIP_EXTRA_INDEX_URL",
"PIP_TRUSTED_HOST",
"PIP_DISABLE_PIP_VERSION_CHECK",
"SALT_TRANSPORT",
# Are both of these really needed?
"GITHUB_ACTIONS",
"GITHUB_ACTIONS_PIPELINE",
"CI",
"SKIP_CODE_COVERAGE",
"COVERAGE_CONTEXT",
"RERUN_FAILURES",
"COLUMNS",
]:
if var in os.environ:
env[var] = os.environ[var]
cmd = [
"/usr/bin/docker",
"create",
f"--name={name}",
"--privileged",
f"--workdir={workdir}",
"-v",
"/tmp/:/var/lib/docker",
]
for key in env:
cmd.extend(["-e", f"{key}={env[key]}"])
if onci:
cmd.extend(["-v", "/home/runner/work:/__w"])
else:
cmd.extend(["-v", f"{os.getcwd()}:/salt"])
cmd.extend(["--network", network])
if name:
cmd.extend(["--name", name])
cmd.extend(
[
"--entrypoint",
"/usr/lib/systemd/systemd",
image,
"--systemd",
"--unit",
"rescue.target",
],
)
ctx.info(f"command is: {cmd}")
ret = ctx.run(*cmd, capture=True, check=False)
if ret.returncode != 0:
ctx.warn(ret.stderr.decode())