3 """Create two network namespaces and run ping between them."""
7 from testlib import external as ext, util, template, cmd
8 from testlib.log import log
9 from testlib.proc import Tinc, Script
10 from testlib.test import Test
11 from testlib.external import ping
14 util.require_command("ip", "netns", "list")
15 util.require_path("/dev/net/tun")
17 IP_FOO = "192.168.1.1"
18 IP_BAR = "192.168.1.2"
22 def init(ctx: Test) -> T.Tuple[Tinc, Tinc]:
23 """Initialize new test nodes."""
24 foo, bar = ctx.node(), ctx.node()
26 log.info("create network namespaces")
27 assert ext.netns_add(foo.name)
28 assert ext.netns_add(bar.name)
30 log.info("initialize two nodes")
41 foo.add_script(Script.TINC_UP, template.make_netns_config(foo.name, IP_FOO, MASK))
53 bar.add_script(Script.TINC_UP, template.make_netns_config(bar.name, IP_BAR, MASK))
55 cmd.exchange(foo, bar)
60 with Test("ns-ping") as context:
61 foo_node, bar_node = init(context)
64 log.info("waiting for nodes to come up")
65 bar_node[Script.TINC_UP].wait()
67 log.info("ping must not work when there is no connection")
68 assert not ping(IP_BAR, foo_node.name)
70 log.info("add script foo/host-up")
71 bar_node.add_script(foo_node.script_up)
73 log.info("add ConnectTo clause")
74 bar_node.cmd("add", "ConnectTo", foo_node.name)
76 log.info("bar waits for foo")
77 bar_node[foo_node.script_up].wait()
79 log.info("ping must work after connection is up")
80 assert ping(IP_BAR, foo_node.name)