[libvirt] [PATCH 2/2] vmx: Better Workstation vmx handling
Matthias Bolte
matthias.bolte at googlemail.com
Wed Feb 22 10:32:57 UTC 2012
2012/2/22 Jean-Baptiste Rouault <jean-baptiste.rouault at diateam.net>:
> This patch adds support for vmx files with empty networkName
> values (which is the case for vmx generated by Workstation).
>
> It also adds support for vmx containing NATed network interfaces.
> ---
> src/vmx/vmx.c | 29 ++++++++++++++++++-----------
> 1 files changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 823d5df..3cc3b10 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -2418,12 +2418,20 @@ virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def)
> }
>
> /* vmx:networkName -> def:data.bridge.brname */
> - if ((connectionType == NULL ||
> - STRCASEEQ(connectionType, "bridged") ||
> - STRCASEEQ(connectionType, "custom")) &&
> - virVMXGetConfigString(conf, networkName_name, &networkName,
> - false) < 0) {
> - goto cleanup;
> + if (connectionType == NULL ||
> + STRCASEEQ(connectionType, "bridged") ||
> + STRCASEEQ(connectionType, "custom")) {
> + if (virVMXGetConfigString(conf, networkName_name, &networkName,
> + true) < 0)
> + goto cleanup;
When networkName is NULL then there was no ethernet0.networkName entry
in the VMX file at all. Setting it to an empty string here will result
in an ethernet0.networkName = "" entry in the VMX file when the domain
XML config is reformatted to VMX again.
I'm not sure that this is correct. In general, a missing VMX entry
means that the hypervisor should use the default value for this entry,
but explicitly giving it an empty value will probably result in
different behavior.
As VIR_DOMAIN_NET_TYPE_BRIDGE requires a bridge name networkName
cannot be NULL. So we need a special string to indicate that
ethernet0.networkName is missing. This could be an empty string. To do
this virVMXFormatEthernet needs to be changed to not add an
ethernet0.networkName entry when def->data.bridge.brname is an empty
string.
A minor problem with this approach is that parsing and reformatting
and VMX file with ethernet0.networkName = "" will result in removing
this entry as "" is used as special value now.
> + if (networkName == NULL) {
> + networkName = strdup("");
> + if (networkName == NULL) {
> + virReportOOMError();
> + goto cleanup;
> + }
> + }
> }
>
> /* vmx:vnet -> def:data.ifname */
> @@ -2447,11 +2455,10 @@ virVMXParseEthernet(virConfPtr conf, int controller, virDomainNetDefPtr *def)
> connectionType, connectionType_name);
> goto cleanup;
> } else if (STRCASEEQ(connectionType, "nat")) {
> - /* FIXME */
> - VMX_ERROR(VIR_ERR_INTERNAL_ERROR,
> - _("No yet handled value '%s' for VMX entry '%s'"),
> - connectionType, connectionType_name);
> - goto cleanup;
> + (*def)->type = VIR_DOMAIN_NET_TYPE_USER;
> + (*def)->model = virtualDev;
> +
> + virtualDev = NULL;
> } else if (STRCASEEQ(connectionType, "custom")) {
> (*def)->type = VIR_DOMAIN_NET_TYPE_BRIDGE;
> (*def)->model = virtualDev;
You're missing the counterpart in virVMXFormatEthernet to handle
VIR_DOMAIN_NET_TYPE_USER.
And this needs extra testcases in the vmx2xml and xml2vmx tests to
cover this additions to the VMX parser before I can ACK it.
A good start but it needs a v2.
--
Matthias Bolte
http://photron.blogspot.com
More information about the libvir-list
mailing list