Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support changing io.podman label domain namespace #1015

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions newsfragments/label_domain.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added support to change default resource label prefix from io.podman via --label-domain cli arg
48 changes: 34 additions & 14 deletions podman_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ async def assert_volume(compose, mount_dict):
log.debug("podman volume inspect %s || podman volume create %s", vol_name, vol_name)
# TODO: might move to using "volume list"
# podman volume list --format '{{.Name}}\t{{.MountPoint}}' \
# -f 'label=io.podman.compose.project=HERE'
# -f f"label={compose.label_domain}.compose.project=HERE"
try:
_ = (await compose.podman.output([], "volume", ["inspect", vol_name])).decode("utf-8")
except subprocess.CalledProcessError as e:
Expand All @@ -411,7 +411,7 @@ async def assert_volume(compose, mount_dict):
args = [
"create",
"--label",
f"io.podman.compose.project={compose.project_name}",
f"{compose.label_domain}.compose.project={compose.project_name}",
"--label",
f"com.docker.compose.project={compose.project_name}",
]
Expand Down Expand Up @@ -804,11 +804,11 @@ def norm_ports(ports_in):
return ports_out


def get_network_create_args(net_desc, proj_name, net_name):
def get_network_create_args(net_desc, proj_name, net_name, label_domain='io.podman'):
args = [
"create",
"--label",
f"io.podman.compose.project={proj_name}",
f"{label_domain}.compose.project={proj_name}",
"--label",
f"com.docker.compose.project={proj_name}",
]
Expand Down Expand Up @@ -871,7 +871,9 @@ async def assert_cnt_nets(compose, cnt):
except subprocess.CalledProcessError as e:
if is_ext:
raise RuntimeError(f"External network [{net_name}] does not exists") from e
args = get_network_create_args(net_desc, compose.project_name, net_name)
args = get_network_create_args(
net_desc, compose.project_name, net_name, compose.label_domain
)
await compose.podman.output([], "network", args)
await compose.podman.output([], "network", ["exists", net_name])

Expand Down Expand Up @@ -1461,7 +1463,7 @@ async def volume_ls(self):
"ls",
"--noheading",
"--filter",
f"label=io.podman.compose.project={self.compose.project_name}",
f"label={self.compose.label_domain}.compose.project={self.compose.project_name}",
"--format",
"{{.Name}}",
],
Expand Down Expand Up @@ -1677,6 +1679,7 @@ def __init__(self):
self.commands = {}
self.global_args = argparse.Namespace()
self.project_name = None
self.label_domain = None
self.dirname = None
self.pods = None
self.containers = []
Expand Down Expand Up @@ -1794,6 +1797,10 @@ def _parse_compose_file(self):
relative_files = files
filename = files[0]
project_name = args.project_name
label_domain = os.environ.get("COMPOSE_LABEL_DOMAIN", "io.podman")
if label_domain in args:
label_domain = args.label_domain

# no_ansi = args.no_ansi
# no_cleanup = args.no_cleanup
# dry_run = args.dry_run
Expand Down Expand Up @@ -1834,7 +1841,9 @@ def _parse_compose_file(self):
env_vars = norm_as_dict(args.env)
self.environ.update(env_vars)

compose = {}
compose = {
label_domain: label_domain,
}
# Iterate over files primitively to allow appending to files in-loop
files_iter = iter(files)

Expand Down Expand Up @@ -1895,6 +1904,7 @@ def _parse_compose_file(self):
raise RuntimeError(f"Project name [{dir_basename}] normalized to empty")

self.project_name = project_name
self.label_domain = label_domain
self.environ.update({"COMPOSE_PROJECT_NAME": self.project_name})

services = compose.get("services", None)
Expand Down Expand Up @@ -1941,9 +1951,9 @@ def _parse_compose_file(self):
# volumes: [...]
self.vols = compose.get("volumes", {})
podman_compose_labels = [
"io.podman.compose.config-hash=" + self.yaml_hash,
"io.podman.compose.project=" + project_name,
"io.podman.compose.version=" + __version__,
label_domain + ".compose.config-hash=" + self.yaml_hash,
label_domain + ".compose.project=" + project_name,
label_domain + ".compose.version=" + __version__,
f"PODMAN_SYSTEMD_UNIT=podman-compose@{project_name}.service",
"com.docker.compose.project=" + project_name,
"com.docker.compose.project.working_dir=" + dirname,
Expand Down Expand Up @@ -2119,6 +2129,12 @@ def _init_global_parser(parser):
type=str,
default=None,
)
parser.add_argument(
"--label-domain",
help="Specify an alternate root domain for resource labels (default: io.podman)",
type=str,
default="io.podman",
)
parser.add_argument(
"--podman-path",
help="Specify an alternate path to podman (default: use location in $PATH variable)",
Expand Down Expand Up @@ -2500,10 +2516,10 @@ async def compose_up(compose: PodmanCompose, args):
"ps",
[
"--filter",
f"label=io.podman.compose.project={compose.project_name}",
f"label={args.label_domain}.compose.project={compose.project_name}",
"-a",
"--format",
'{{ index .Labels "io.podman.compose.config-hash"}}',
'{{ index .Labels "' + args.label_domain + '.compose.config-hash"}}',
],
)
)
Expand Down Expand Up @@ -2648,7 +2664,7 @@ async def compose_down(compose, args):
"ps",
[
"--filter",
f"label=io.podman.compose.project={compose.project_name}",
f"label={args.label_domain}.compose.project={compose.project_name}",
"-a",
"--format",
"{{ .Names }}",
Expand Down Expand Up @@ -2682,7 +2698,11 @@ async def compose_down(compose, args):

@cmd_run(podman_compose, "ps", "show status of containers")
async def compose_ps(compose, args):
ps_args = ["-a", "--filter", f"label=io.podman.compose.project={compose.project_name}"]
ps_args = [
"-a",
"--filter",
f"label={args.label_domain}.compose.project={compose.project_name}",
]
if args.quiet is True:
ps_args.extend(["--format", "{{.ID}}"])
elif args.format:
Expand Down