Merge pull request #1179 from knarfS/fix_port_cmd

Fix port command
This commit is contained in:
Povilas Kanapickas 2025-04-14 18:05:53 +03:00 committed by GitHub
commit 342a39dcfe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 70 additions and 101 deletions

View File

@ -0,0 +1 @@
- Fix the port command for dynamic host ports.

View File

@ -15,7 +15,6 @@ import asyncio.subprocess
import getpass
import glob
import hashlib
import itertools
import json
import logging
import os
@ -3216,30 +3215,13 @@ async def compose_config(compose, args):
@cmd_run(podman_compose, "port", "Prints the public port for a port binding.")
async def compose_port(compose, args):
# TODO - deal with pod index
compose.assert_services(args.service)
containers = compose.container_names_by_service[args.service]
container_ports = list(
itertools.chain(*(compose.container_by_name[c]["ports"] for c in containers))
)
def _published_target(port_string):
published, target = port_string.split(":")[-2:]
return int(published), int(target)
select_udp = args.protocol == "udp"
published, target = None, None
for p in container_ports:
is_udp = p[-4:] == "/udp"
if select_udp and is_udp:
published, target = _published_target(p[-4:])
if not select_udp and not is_udp:
published, target = _published_target(p)
if target == args.private_port:
print(published)
return
output = await compose.podman.output([], "inspect", [containers[args.index - 1]])
inspect_json = json.loads(output.decode("utf-8"))
private_port = str(args.private_port) + "/" + args.protocol
host_port = inspect_json[0]["NetworkSettings"]["Ports"][private_port][0]["HostPort"]
print(host_port)
@cmd_run(podman_compose, "pause", "Pause all running containers")

View File

@ -1,35 +1,30 @@
version: "3"
services:
web1:
image: nopush/podman-compose-test
hostname: web1
command: ["dumb-init", "/bin/busybox", "httpd", "-f", "-h", "/var/www/html", "-p", "8001"]
working_dir: /var/www/html
ports:
- 8001:8001
volumes:
- ./test1.txt:/var/www/html/index.txt:ro,z
web2:
image: nopush/podman-compose-test
hostname: web2
command: ["dumb-init", "/bin/busybox", "httpd", "-f", "-h", "/var/www/html", "-p", "8002"]
working_dir: /var/www/html
ports:
- 8002:8002
- target: 8003
host_ip: 127.0.0.1
published: 8003
protocol: udp
- target: 8004
host_ip: 127.0.0.1
published: 8004
protocol: tcp
- target: 8005
published: 8005
- target: 8006
protocol: udp
- target: 8007
host_ip: 127.0.0.1
volumes:
- ./test2.txt:/var/www/html/index.txt:ro,z
web1:
image: nopush/podman-compose-test
hostname: web1
command: ["dumb-init", "sleep", "infinity"]
ports:
- 8000:8000
- 8001
web2:
image: nopush/podman-compose-test
hostname: web2
command: ["dumb-init", "sleep", "infinity"]
ports:
- 8002:8002
- target: 8003
host_ip: 127.0.0.1
published: 8003
protocol: udp
- target: 8004
host_ip: 127.0.0.1
published: 8004
protocol: tcp
- target: 8005
published: 8005
- target: 8006
protocol: udp
- target: 8007
host_ip: 127.0.0.1

View File

@ -1 +0,0 @@
test1

View File

@ -1 +0,0 @@
test2

View File

@ -1,12 +1,11 @@
# SPDX-License-Identifier: GPL-2.0
"""
test_podman_compose_up_down.py
test_podman_compose_ports.py
Tests the podman compose up and down commands used to create and remove services.
Tests the podman compose port command used to show the host port.
"""
# pylint: disable=redefined-outer-name
import os
import unittest
@ -35,51 +34,45 @@ class TestPodmanCompose(unittest.TestCase, RunSubprocessMixin):
"-f",
os.path.join(test_path(), "ports", "docker-compose.yml"),
"down",
"--volumes",
]
port_cmd = [
podman_compose_path(),
"-f",
os.path.join(test_path(), "ports", "docker-compose.yml"),
"port",
]
udp_arg = ["--protocol", "udp"]
tcp_arg = ["--protocol", "tcp"]
try:
self.run_subprocess_assert_returncode(up_cmd)
port = self.run_subprocess_assert_returncode(port_cmd + ["web1", "8000"])
self.assertEqual(port[0].decode().strip(), "8000")
port = self.run_subprocess_assert_returncode(port_cmd + ["web1", "8001"])
self.assertNotEqual(port[0].decode().strip(), "8001")
port = self.run_subprocess_assert_returncode(port_cmd + ["web2", "8002"])
self.assertEqual(port[0].decode().strip(), "8002")
port = self.run_subprocess_assert_returncode(port_cmd + udp_arg + ["web2", "8003"])
self.assertEqual(port[0].decode().strip(), "8003")
port = self.run_subprocess_assert_returncode(port_cmd + ["web2", "8004"])
self.assertEqual(port[0].decode().strip(), "8004")
port = self.run_subprocess_assert_returncode(port_cmd + tcp_arg + ["web2", "8005"])
self.assertEqual(port[0].decode().strip(), "8005")
port = self.run_subprocess_assert_returncode(port_cmd + udp_arg + ["web2", "8006"])
self.assertNotEqual(port[0].decode().strip(), "8006")
port = self.run_subprocess_assert_returncode(port_cmd + ["web2", "8007"])
self.assertNotEqual(port[0].decode().strip(), "8007")
finally:
self.run_subprocess_assert_returncode(down_cmd)
def test_down_with_orphans(self):
container_id, _ = self.run_subprocess_assert_returncode([
"podman",
"run",
"--rm",
"-d",
"nopush/podman-compose-test",
"dumb-init",
"/bin/busybox",
"httpd",
"-f",
"-h",
"/etc/",
"-p",
"8000",
])
down_cmd = [
"coverage",
"run",
podman_compose_path(),
"-f",
os.path.join(test_path(), "ports", "docker-compose.yml"),
"down",
"--volumes",
"--remove-orphans",
]
self.run_subprocess_assert_returncode(down_cmd)
self.run_subprocess_assert_returncode(
[
"podman",
"container",
"exists",
container_id.decode("utf-8"),
],
1,
)