From 612c7b71b45f78d4089886d9fe6c169e1c8bafa6 Mon Sep 17 00:00:00 2001 From: Marek Simek Date: Mon, 25 May 2026 12:25:28 +0200 Subject: [PATCH] api: Deprecate response fields from GET /containers/{id}/json The Docker API 1.44 deprecates the fields HairpinMode, LinkLocalIPv6Address, LinkLocalIPv6PrefixLen, SecondaryIPAddresses, SecondaryIPv6Addresses available in NetworkSettings when calling GET /containers/{id}/json and will be removed in a future release. You should instead look for the default network in NetworkSettings.Networks. The fields are removed in 1.52. Version gate SecondaryIPAddresses, SecondaryIPv6Addresses in the handler and update test. HairpinMode, LinkLocalIPv6Address, LinkLocalIPv6PrefixLen are not returned by the compat endpoint as the response is serialized to the moby/moby/api structure missing these fields. Fixes: https://redhat.atlassian.net/browse/RUN-3323 Signed-off-by: Marek Simek --- pkg/api/handlers/compat/containers.go | 6 ++++++ test/apiv2/python/rest_api/test_v2_0_0_container.py | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pkg/api/handlers/compat/containers.go b/pkg/api/handlers/compat/containers.go index 8568a93e57..78249974d8 100644 --- a/pkg/api/handlers/compat/containers.go +++ b/pkg/api/handlers/compat/containers.go @@ -212,6 +212,12 @@ func GetContainer(w http.ResponseWriter, r *http.Request) { utils.InternalServerError(w, err) return } + if _, err := utils.SupportedVersion(r, ">=1.52.0"); err == nil || errors.Is(err, apiutil.ErrVersionNotGiven) { + if api.NetworkSettings != nil { + api.NetworkSettings.SecondaryIPAddresses = nil + api.NetworkSettings.SecondaryIPv6Addresses = nil + } + } utils.WriteResponse(w, http.StatusOK, api) } diff --git a/test/apiv2/python/rest_api/test_v2_0_0_container.py b/test/apiv2/python/rest_api/test_v2_0_0_container.py index 3c24298f4c..868fd264a3 100644 --- a/test/apiv2/python/rest_api/test_v2_0_0_container.py +++ b/test/apiv2/python/rest_api/test_v2_0_0_container.py @@ -535,13 +535,22 @@ class ContainerCompatibleAPITestCase(APITestCase): r = requests.post(self.uri(self.resolve_container("/containers/{}/start"))) self.assertIn(r.status_code, (204, 304), r.text) - r = requests.get(self.compat_uri(self.resolve_container("/containers/{}/json"))) + container_uri = self.resolve_container("/containers/{}/json") + + # SecondaryIPAddresses present for API < v1.52 + r = requests.get(self.podman_url + "/v1.44/" + container_uri) self.assertEqual(r.status_code, 200, r.text) self.assertId(r.content) out = r.json() - self.assertEqual("10.0.2.0", out["NetworkSettings"]["SecondaryIPAddresses"][0]["Addr"]) self.assertEqual(24, out["NetworkSettings"]["SecondaryIPAddresses"][0]["PrefixLen"]) + + # SecondaryIPAddresses removed for API >= v1.52 + r = requests.get(self.podman_url + "/v1.52/" + container_uri) + self.assertEqual(r.status_code, 200, r.text) + self.assertId(r.content) + out = r.json() + self.assertIsNone(out["NetworkSettings"].get("SecondaryIPAddresses")) finally: delete_named_network_ns(network_ns_name)