Laszlo Ersek
2022-Apr-10 13:49 UTC
[Libguestfs] [v2v PATCH] convert: warn about "--mac" options that don't match any source NICs
Just before we call "Networks.map", collect all "--mac" references (from "options.network_map" and "options.static_ips"), and check each against the list of MACs available on the source ("source.s_nics"). Collect and report unresolved references. The algorithm added here has quadratic time complexity, kind of undoing the sophistication of the "Networks.t" type -- but I don't think we expect a huge number of NICs / MACs. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1685809 Signed-off-by: Laszlo Ersek <lersek at redhat.com> --- lib/networks.mli | 3 +++ convert/convert.ml | 19 +++++++++++++++++++ lib/networks.ml | 2 ++ 3 files changed, 24 insertions(+) diff --git a/lib/networks.mli b/lib/networks.mli index 8800e21cbcf0..d1a62bf0cf2e 100644 --- a/lib/networks.mli +++ b/lib/networks.mli @@ -55,3 +55,6 @@ val map : t -> Types.source_nic -> Types.source_nic MAC address mappings take precedence, followed by network and bridge mappings if no MAC address mapping for the NIC can be found. *) + +val macs : t -> string list +(** Return all MAC addresses for which address mappings have been added. *) diff --git a/convert/convert.ml b/convert/convert.ml index 87fca7252ba3..1e3db6b99780 100644 --- a/convert/convert.ml +++ b/convert/convert.ml @@ -47,6 +47,25 @@ type mpstat = { } let rec convert dir options source + let nic_macs = List.filter_map + (fun { s_mac } -> + match s_mac with + | None -> None + | Some mac -> Some (String.lowercase_ascii mac)) + source.s_nics + and mac_refs1 = Networks.macs options.network_map + and mac_refs2 = List.map + (fun { if_mac_addr } -> String.lowercase_ascii if_mac_addr) + options.static_ips in + let unresolved_mac_refs + List.filter (fun mac_ref -> not (List.mem mac_ref nic_macs)) + (mac_refs1 @ mac_refs2) in + if unresolved_mac_refs <> [] then ( + let mac_list = String.concat ", " unresolved_mac_refs in + warning (f_"The following --mac addresses do not match any NICs from the \ + source: %s") mac_list + ); + let target_nics = List.map (Networks.map options.network_map) source.s_nics in message (f_"Opening the source"); diff --git a/lib/networks.ml b/lib/networks.ml index 93250fe40ab0..52646166e496 100644 --- a/lib/networks.ml +++ b/lib/networks.ml @@ -103,3 +103,5 @@ let add_default_bridge t o if t.default_bridge <> None then error (f_"duplicate -b/--bridge parameter. Only one default mapping is allowed."); t.default_bridge <- Some o + +let macs t = StringMap.keys t.macs -- 2.19.1.3.g30247aa5d201
Richard W.M. Jones
2022-Apr-11 08:13 UTC
[Libguestfs] [v2v PATCH] convert: warn about "--mac" options that don't match any source NICs
On Sun, Apr 10, 2022 at 03:49:51PM +0200, Laszlo Ersek wrote:> Just before we call "Networks.map", collect all "--mac" references (from > "options.network_map" and "options.static_ips"), and check each against > the list of MACs available on the source ("source.s_nics"). Collect and > report unresolved references. > > The algorithm added here has quadratic time complexity, kind of undoing > the sophistication of the "Networks.t" type -- but I don't think we expect > a huge number of NICs / MACs. > > Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1685809 > Signed-off-by: Laszlo Ersek <lersek at redhat.com>Looking at this properly, I think the whole bug is dubious to me. If the user specified a --mac option then we should probably assume they know more about the source or target than we do. Or maybe they are adding a group of --mac command line parameters to every virt-v2v invocation, which each apply to a subset of the guests being converted. Personally I would be inclined close this one as NOTABUG, but as it's just a warning (and has no effect on anything) I guess it's OK. Be nice if it wasn't quadratic though. I was looking at /usr/lib64/ocaml/map.mli to see if there's any operation we can use to intersect the map keys with a List or Set, but I cannot see anything ... Lukewarm ACK. Rich.> lib/networks.mli | 3 +++ > convert/convert.ml | 19 +++++++++++++++++++ > lib/networks.ml | 2 ++ > 3 files changed, 24 insertions(+) > > diff --git a/lib/networks.mli b/lib/networks.mli > index 8800e21cbcf0..d1a62bf0cf2e 100644 > --- a/lib/networks.mli > +++ b/lib/networks.mli > @@ -55,3 +55,6 @@ val map : t -> Types.source_nic -> Types.source_nic > MAC address mappings take precedence, followed by network > and bridge mappings if no MAC address mapping for the NIC can > be found. *) > + > +val macs : t -> string list > +(** Return all MAC addresses for which address mappings have been added. *) > diff --git a/convert/convert.ml b/convert/convert.ml > index 87fca7252ba3..1e3db6b99780 100644 > --- a/convert/convert.ml > +++ b/convert/convert.ml > @@ -47,6 +47,25 @@ type mpstat = { > } > > let rec convert dir options source > + let nic_macs = List.filter_map > + (fun { s_mac } -> > + match s_mac with > + | None -> None > + | Some mac -> Some (String.lowercase_ascii mac)) > + source.s_nics > + and mac_refs1 = Networks.macs options.network_map > + and mac_refs2 = List.map > + (fun { if_mac_addr } -> String.lowercase_ascii if_mac_addr) > + options.static_ips in > + let unresolved_mac_refs > + List.filter (fun mac_ref -> not (List.mem mac_ref nic_macs)) > + (mac_refs1 @ mac_refs2) in > + if unresolved_mac_refs <> [] then ( > + let mac_list = String.concat ", " unresolved_mac_refs in > + warning (f_"The following --mac addresses do not match any NICs from the \ > + source: %s") mac_list > + ); > + > let target_nics = List.map (Networks.map options.network_map) source.s_nics in > > message (f_"Opening the source"); > diff --git a/lib/networks.ml b/lib/networks.ml > index 93250fe40ab0..52646166e496 100644 > --- a/lib/networks.ml > +++ b/lib/networks.ml > @@ -103,3 +103,5 @@ let add_default_bridge t o > if t.default_bridge <> None then > error (f_"duplicate -b/--bridge parameter. Only one default mapping is allowed."); > t.default_bridge <- Some o > + > +let macs t = StringMap.keys t.macs > -- > 2.19.1.3.g30247aa5d201 > > _______________________________________________ > Libguestfs mailing list > Libguestfs at redhat.com > https://listman.redhat.com/mailman/listinfo/libguestfs-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org