Merge pull request #14673 from idleroamer/fix-network-inspect-main

Fix network inspect compat API discrepancy
This commit is contained in:
openshift-ci[bot] 2022-07-07 11:55:30 +00:00 committed by GitHub
commit 48c8923248
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 0 deletions

View File

@ -397,6 +397,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)
@ -587,6 +596,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()