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:
🤓 Mostafa Emami
2022-06-21 07:30:34 +02:00
parent fe8e536328
commit ee05bc0318
3 changed files with 63 additions and 0 deletions

View File

@ -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{}

View File

@ -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."""

View File

@ -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()