cli: add --network passt,portForward=8080:80 convenience syntax

Roughly mirroring `podman run -p` syntax. Examples:

--network passt,portForward=8080:80
--network passt,portForward0=7000-8000/udp,portForward1=127.0.0.1:2222:22

Resolves: https://github.com/virt-manager/virt-manager/issues/751

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2024-11-16 15:26:28 -05:00 committed by Pavel Hrdina
parent 2f8f0e8151
commit 17f171cdb7
4 changed files with 94 additions and 0 deletions

View File

@ -1341,6 +1341,20 @@ Some example suboptions:
For ``HOSTDEV`` format, see ``--hostdev`` documentation
``portForward=[ADDRESS:]HOSTPORT[:GUESTPORT][/PROTO]``
Simpler option for specifying port forwarding with
``--network passt`` networks. Roughly matches ``podman run -p``
syntax. HOSTPORT can be a represented as a range like ``7000-8000``, but
GUESTPORT can only be a single port. If GUESTPORT is not provided, host
and guest ports are assumed to match.
Examples:
.. code-block::
--network passt,portForward=8080:80 \
--network passt,portForward0=7000-8000/udp,portForward1=127.0.0.1:2222:22 \
GRAPHICS OPTIONS
================

View File

@ -632,6 +632,44 @@
<range start="2022" to="22"/>
</portForward>
</interface>
<interface type="user">
<backend type="passt"/>
<mac address="00:11:22:33:44:55"/>
<model type="virtio"/>
<portForward proto="tcp">
<range start="8080" to="80"/>
</portForward>
</interface>
<interface type="user">
<backend type="passt"/>
<mac address="00:11:22:33:44:55"/>
<model type="virtio"/>
<portForward proto="tcp">
<range start="8080"/>
</portForward>
</interface>
<interface type="user">
<backend type="passt"/>
<mac address="00:11:22:33:44:55"/>
<model type="virtio"/>
<portForward proto="udp">
<range start="7000" end="8000"/>
</portForward>
<portForward proto="tcp" address="127.0.0.1">
<range start="2222" to="22"/>
</portForward>
</interface>
<interface type="user">
<backend type="passt"/>
<mac address="00:11:22:33:44:55"/>
<model type="virtio"/>
<portForward proto="tcp" address="2001:db8:ac10:fd01::1:10">
<range start="3000" end="4000" to="30"/>
</portForward>
<portForward proto="tcp" address="127.0.0.1">
<range start="5000" end="6000" to="5"/>
</portForward>
</interface>
<interface type="hostdev">
<mac address="00:11:22:33:44:55"/>
<model type="virtio"/>

View File

@ -653,6 +653,10 @@ source.reservations.managed=no,source.reservations.source.type=unix,source.reser
--network user,address.type=ccw,address.cssid=0xfe,address.ssid=0,address.devno=01,boot.order=15,boot.loadparm=SYSTEM1
--network model=vmxnet3
--network backend.type=passt,backend.logFile=/tmp/foo.log,portForward0.proto=tcp,portForward0.address=192.168.10.10,portForward0.dev=eth0,portForward0.range0.start=4000,portForward0.range0.end=5000,portForward0.range0.to=10000,portForward0.range0.exclude=no,portForward0.range1.start=6000,portForward1.proto=tcp,portForward1.range0.start=2022,portForward1.range0.to=22
--network passt,portForward=8080:80
--network passt,portForward=8080
--network passt,portForward0=7000-8000/udp,portForward1=127.0.0.1:2222:22
--network passt,portForward0=2001:db8:ac10:fd01::1:10:3000-4000:30,portForward1=127.0.0.1:5000-6000:5
--network type=hostdev,source.address.type=pci,source.address.domain=0x0,source.address.bus=0x00,source.address.slot=0x07,source.address.function=0x0
--network hostdev=pci_0000_00_09_0
--network hostdev=0:0:4.0

View File

@ -3888,6 +3888,9 @@ class ParserNetwork(VirtCLIParser):
def set_type_cb(self, inst, val, virtarg):
if val == "default":
inst.set_default_source()
elif val == "passt":
inst.type = "user"
inst.backend.type = "passt"
else:
inst.type = val
@ -3919,6 +3922,38 @@ class ParserNetwork(VirtCLIParser):
cb = self._make_find_inst_cb(cliarg, list_propname)
return cb(inst, *args, **kwargs)
def set_port_forward_pretty(self, inst, val, _virtarg):
if "/" in val:
val, proto = val.rsplit("/", 1)
else:
proto = "tcp"
if ":" in val:
val, port_to = val.rsplit(":", 1)
else:
port_to = None
if ":" in val:
host, val = val.rsplit(":", 1)
else:
host = None
if "-" in val:
port_start, port_end = val.rsplit("-", 1)
else:
port_start = val
port_end = None
if not inst.range:
inst.range.add_new()
rangeobj = inst.range[0]
inst.proto = proto
inst.address = host
rangeobj.start = port_start
rangeobj.end = port_end
rangeobj.to = port_to
def set_hostdev_cb(self, inst, val, virtarg):
val = _lookupNodedevFromString(inst.conn, val)
inst.set_from_nodedev(val)
@ -3996,6 +4031,9 @@ class ParserNetwork(VirtCLIParser):
find_inst_cb=cls.range_find_inst_cb)
cls.add_arg("portForward[0-9]*.range[0-9]*.exclude", "exclude",
is_onoff=True, find_inst_cb=cls.range_find_inst_cb)
cls.add_arg("portForward[0-9]*", None, lookup_cb=None,
cb=cls.set_port_forward_pretty,
find_inst_cb=cls.portForward_find_inst_cb)
######################