mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +08:00
Fix network inspect compat API discrepancy
- containerInspect compat API expects field value PrefixLen
instead of PrefixLength for type Address for SecondaryIPAddresses
- Add tests for network part of containerInspect compat api
Closes: containers#14674
Signed-off-by: 🤓 Mostafa Emami <mustafaemami@gmail.com>
This commit is contained in:
@ -395,6 +395,15 @@ func LibpodToContainer(l *libpod.Container, sz bool) (*handlers.Container, error
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertSecondaryIPPrefixLen(input *define.InspectNetworkSettings, output *types.NetworkSettings) {
|
||||||
|
for index, ip := range input.SecondaryIPAddresses {
|
||||||
|
output.SecondaryIPAddresses[index].PrefixLen = ip.PrefixLength
|
||||||
|
}
|
||||||
|
for index, ip := range input.SecondaryIPv6Addresses {
|
||||||
|
output.SecondaryIPv6Addresses[index].PrefixLen = ip.PrefixLength
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON, error) {
|
func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON, error) {
|
||||||
_, imageName := l.Image()
|
_, imageName := l.Image()
|
||||||
inspect, err := l.Inspect(sz)
|
inspect, err := l.Inspect(sz)
|
||||||
@ -585,6 +594,9 @@ func LibpodToContainerJSON(l *libpod.Container, sz bool) (*types.ContainerJSON,
|
|||||||
if err := json.Unmarshal(n, &networkSettings); err != nil {
|
if err := json.Unmarshal(n, &networkSettings); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
convertSecondaryIPPrefixLen(inspect.NetworkSettings, &networkSettings)
|
||||||
|
|
||||||
// do not report null instead use an empty map
|
// do not report null instead use an empty map
|
||||||
if networkSettings.Networks == nil {
|
if networkSettings.Networks == nil {
|
||||||
networkSettings.Networks = map[string]*network.EndpointSettings{}
|
networkSettings.Networks = map[string]*network.EndpointSettings{}
|
||||||
|
@ -64,6 +64,10 @@ class APITestCase(unittest.TestCase):
|
|||||||
def uri(path):
|
def uri(path):
|
||||||
return APITestCase.PODMAN_URL + "/v2.0.0/libpod" + path
|
return APITestCase.PODMAN_URL + "/v2.0.0/libpod" + path
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def compat_uri(path):
|
||||||
|
return APITestCase.PODMAN_URL + "/v3.0.0/" + path
|
||||||
|
|
||||||
def resolve_container(self, path):
|
def resolve_container(self, path):
|
||||||
"""Find 'first' container and return 'Id' formatted into given URI path."""
|
"""Find 'first' container and return 'Id' formatted into given URI path."""
|
||||||
|
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
import multiprocessing
|
import multiprocessing
|
||||||
import queue
|
import queue
|
||||||
import random
|
import random
|
||||||
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
import os
|
||||||
import time
|
import time
|
||||||
from dateutil.parser import parse
|
from dateutil.parser import parse
|
||||||
|
|
||||||
@ -358,5 +360,50 @@ class ContainerTestCase(APITestCase):
|
|||||||
self.assertEqual(1000, out["HostConfig"]["Memory"])
|
self.assertEqual(1000, out["HostConfig"]["Memory"])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def execute_process(cmd):
|
||||||
|
return subprocess.run(
|
||||||
|
cmd,
|
||||||
|
shell=True,
|
||||||
|
check=True,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
)
|
||||||
|
|
||||||
|
def create_named_network_ns(network_ns_name):
|
||||||
|
execute_process(f"ip netns add {network_ns_name}")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip link add enp2s0 type veth peer name eth0")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip addr add 10.0.1.0/24 dev eth0")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip link set eth0 up")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip link add enp2s1 type veth peer name eth1")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip addr add 10.0.2.0/24 dev eth1")
|
||||||
|
execute_process(f"ip netns exec {network_ns_name} ip link set eth1 up")
|
||||||
|
|
||||||
|
def delete_named_network_ns(network_ns_name):
|
||||||
|
execute_process(f"ip netns delete {network_ns_name}")
|
||||||
|
|
||||||
|
class ContainerCompatibleAPITestCase(APITestCase):
|
||||||
|
def test_inspect_network(self):
|
||||||
|
if os.getuid() != 0:
|
||||||
|
self.skipTest("test needs to be executed as root!")
|
||||||
|
try:
|
||||||
|
network_ns_name = "test-compat-api"
|
||||||
|
create_named_network_ns(network_ns_name)
|
||||||
|
self.podman.run("rm", "--all", "--force", check=True)
|
||||||
|
self.podman.run("run", "--net", f"ns:/run/netns/{network_ns_name}", "-d", "alpine", "top", check=True)
|
||||||
|
|
||||||
|
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")))
|
||||||
|
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"])
|
||||||
|
finally:
|
||||||
|
delete_named_network_ns(network_ns_name)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Reference in New Issue
Block a user