diff --git a/newsfragments/label_domain.feature b/newsfragments/label_domain.feature new file mode 100644 index 00000000..1797fda4 --- /dev/null +++ b/newsfragments/label_domain.feature @@ -0,0 +1 @@ +Added support to change default resource label prefix from io.podman via --label-domain cli arg diff --git a/podman_compose.py b/podman_compose.py index df914c7d..a3a9d0a3 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -402,7 +402,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: @@ -412,7 +412,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}", ] @@ -799,11 +799,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}", ] @@ -866,7 +866,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]) @@ -1454,7 +1456,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}}", ], @@ -1670,6 +1672,7 @@ def __init__(self): self.commands = {} self.global_args = None self.project_name = None + self.label_domain = None self.dirname = None self.pods = None self.containers = None @@ -1787,6 +1790,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 @@ -1827,7 +1834,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) @@ -1888,6 +1897,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) @@ -1932,9 +1942,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, @@ -2109,6 +2119,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)", @@ -2492,10 +2508,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"}}', ], ) ) @@ -2640,7 +2656,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 }}", @@ -2674,7 +2690,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: