Since we cannot properly plug a new VM into the distributed switch, we can at least report the provided pieces of information, so that XML editing still works even for VMs with such interfaces. https://bugzilla.redhat.com/show_bug.cgi?id=1988211 Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> --- src/vmx/vmx.c | 76 ++++++++++++++++++---- tests/vmx2xmldata/ethernet-vds.vmx | 11 ++++ tests/vmx2xmldata/ethernet-vds.xml | 24 +++++++ tests/vmx2xmltest.c | 1 + tests/xml2vmxdata/xml2vmx-ethernet-vds.vmx | 18 +++++ tests/xml2vmxdata/xml2vmx-ethernet-vds.xml | 15 +++++ tests/xml2vmxtest.c | 1 + 7 files changed, 133 insertions(+), 13 deletions(-) create mode 100644 tests/vmx2xmldata/ethernet-vds.vmx create mode 100644 tests/vmx2xmldata/ethernet-vds.xml create mode 100644 tests/xml2vmxdata/xml2vmx-ethernet-vds.vmx create mode 100644 tests/xml2vmxdata/xml2vmx-ethernet-vds.xml diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index b7b997e83540..9ad463658aa8 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2700,6 +2700,13 @@ virVMXParseEthernet(virConf *conf, int controller, virDomainNetDef **def) char networkName_name[48] = ""; char *networkName = NULL; + char switchId_name[48] = ""; + char *switchId = NULL; + + char portId_name[48] = ""; + char portgroupId_name[48] = ""; + char connectionId_name[48] = ""; + int netmodel = VIR_DOMAIN_NET_MODEL_UNKNOWN; if (def == NULL || *def != NULL) { @@ -2721,6 +2728,13 @@ virVMXParseEthernet(virConf *conf, int controller, virDomainNetDef **def) VMX_BUILD_NAME(networkName); VMX_BUILD_NAME(vnet); + g_snprintf(prefix, sizeof(prefix), "ethernet%d.dvs", controller); + + VMX_BUILD_NAME(switchId); + VMX_BUILD_NAME(portId); + VMX_BUILD_NAME(portgroupId); + VMX_BUILD_NAME(connectionId); + /* vmx:present */ if (virVMXGetConfigBoolean(conf, present_name, &present, false, true) < 0) return -1; @@ -2836,19 +2850,36 @@ virVMXParseEthernet(virConf *conf, int controller, virDomainNetDef **def) goto cleanup; } + if (virVMXGetConfigString(conf, switchId_name, &switchId, true) < 0) + goto cleanup; + /* Setup virDomainNetDef */ - if (connectionType == NULL && networkName == NULL) { - /* - * Having neither a connectionType nor a network name can mean two - * things: - * - * 1) there is no connection of that nic - * 2) the nic is connected to VMWare Distributed Switch - * - * But we do not see any difference between these and hence we report - * the closest thing to at least make virt-v2v and others work when they - * read the domain XML. - */ + if (switchId) { + (*def)->type = VIR_DOMAIN_NET_TYPE_VDS; + + if (virUUIDParse(switchId, (*def)->data.vds.switch_id) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Could not parse UUID from string '%s'"), + switchId); + goto cleanup; + } + + if (virVMXGetConfigString(conf, + portgroupId_name, + &(*def)->data.vds.portgroup_id, + false) < 0 || + virVMXGetConfigLong(conf, + portId_name, + &(*def)->data.vds.port_id, + 0, + false) < 0 || + virVMXGetConfigLong(conf, + connectionId_name, + &(*def)->data.vds.connection_id, + 0, + false) < 0) + goto cleanup; + } else if (connectionType == NULL && networkName == NULL) { (*def)->type = VIR_DOMAIN_NET_TYPE_DUMMY; } else if (connectionType == NULL || STRCASEEQ(connectionType, "bridged")) { (*def)->type = VIR_DOMAIN_NET_TYPE_BRIDGE; @@ -3962,6 +3993,26 @@ virVMXFormatEthernet(virDomainNetDef *def, int controller, case VIR_DOMAIN_NET_TYPE_DUMMY: break; + case VIR_DOMAIN_NET_TYPE_VDS: { + unsigned char *uuid = def->data.vds.switch_id; + + virBufferAsprintf(buffer, "ethernet%d.dvs.switchId = \"%02x %02x %02x %02x %02x " + "%02x %02x %02x-%02x %02x %02x %02x %02x %02x %02x %02x\"\n", + controller, uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], + uuid[5], uuid[6], uuid[7], uuid[8], uuid[9], uuid[10], + uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); + + virBufferAsprintf(buffer, "ethernet%d.dvs.portId = \"%lld\"\n", + controller, def->data.vds.port_id); + + virBufferAsprintf(buffer, "ethernet%d.dvs.", controller); + virBufferEscapeString(buffer, "portgroupId = \"%s\"\n", def->data.vds.portgroup_id); + + virBufferAsprintf(buffer, "ethernet%d.dvs.connectionId = \"%lld\"\n", + controller, def->data.vds.connection_id); + break; + } + case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_VHOSTUSER: case VIR_DOMAIN_NET_TYPE_SERVER: @@ -3973,7 +4024,6 @@ virVMXFormatEthernet(virDomainNetDef *def, int controller, case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_VDPA: - case VIR_DOMAIN_NET_TYPE_VDS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"), virDomainNetTypeToString(def->type)); return -1; diff --git a/tests/vmx2xmldata/ethernet-vds.vmx b/tests/vmx2xmldata/ethernet-vds.vmx new file mode 100644 index 000000000000..f68587bcf181 --- /dev/null +++ b/tests/vmx2xmldata/ethernet-vds.vmx @@ -0,0 +1,11 @@ +config.version = "8" +virtualHW.version = "4" +ethernet0.present = "true" +ethernet0.virtualDev = "e1000e" +ethernet0.addressType = "vpx" +ethernet0.generatedAddress = "00:50:56:87:65:43" +ethernet0.dvs.switchId = "50 34 26 b2 94 e9 3b 16-1d 68 87 bf ff 4a 54 40" +ethernet0.dvs.portId = "5" +ethernet0.dvs.portgroupId = "dvportgroup-1285" +ethernet0.dvs.connectionId = "408217997" +displayName = "test" diff --git a/tests/vmx2xmldata/ethernet-vds.xml b/tests/vmx2xmldata/ethernet-vds.xml new file mode 100644 index 000000000000..ab842b168c9b --- /dev/null +++ b/tests/vmx2xmldata/ethernet-vds.xml @@ -0,0 +1,24 @@ +<domain type='vmware'> + <name>test</name> + <uuid>00000000-0000-0000-0000-000000000000</uuid> + <memory unit='KiB'>32768</memory> + <currentMemory unit='KiB'>32768</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='i686'>hvm</type> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <interface type='vds'> + <mac address='00:50:56:87:65:43' type='generated'/> + <source switchid='503426b2-94e9-3b16-1d68-87bfff4a5440' portid='5' portgroupid='dvportgroup-1285' connectionid='408217997'/> + <model type='e1000e'/> + </interface> + <video> + <model type='vmvga' vram='4096' primary='yes'/> + </video> + </devices> +</domain> diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 3ab39148e0a4..07d7bf24c2b3 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -237,6 +237,7 @@ mymain(void) DO_TEST("ethernet-vpx"); DO_TEST("ethernet-other"); DO_TEST("ethernet-dummy"); + DO_TEST("ethernet-vds"); DO_TEST("serial-file"); DO_TEST("serial-device"); diff --git a/tests/xml2vmxdata/xml2vmx-ethernet-vds.vmx b/tests/xml2vmxdata/xml2vmx-ethernet-vds.vmx new file mode 100644 index 000000000000..bcc04bc21a6e --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-ethernet-vds.vmx @@ -0,0 +1,18 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +guestOS = "other" +uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15" +displayName = "ethernet-vpx" +memsize = "4" +numvcpus = "1" +floppy0.present = "false" +floppy1.present = "false" +ethernet0.present = "true" +ethernet0.virtualDev = "e1000e" +ethernet0.dvs.switchId = "50 34 26 b2 94 e9 3b 16-1d 68 87 bf ff 4a 54 40" +ethernet0.dvs.portId = "5" +ethernet0.dvs.portgroupId = "dvportgroup-1285" +ethernet0.dvs.connectionId = "408217997" +ethernet0.addressType = "vpx" +ethernet0.generatedAddress = "00:50:56:87:65:43" diff --git a/tests/xml2vmxdata/xml2vmx-ethernet-vds.xml b/tests/xml2vmxdata/xml2vmx-ethernet-vds.xml new file mode 100644 index 000000000000..69d44a62da1c --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-ethernet-vds.xml @@ -0,0 +1,15 @@ +<domain type='vmware'> + <name>ethernet-vpx</name> + <uuid>564d9bef-acd9-b4e0-c8f0-aea8b9103515</uuid> + <memory unit='KiB'>4096</memory> + <os> + <type>hvm</type> + </os> + <devices> + <interface type='vds'> + <mac address='00:50:56:87:65:43' type='generated'/> + <source switchid='503426b2-94e9-3b16-1d68-87bfff4a5440' portid='5' portgroupid='dvportgroup-1285' connectionid='408217997'/> + <model type='e1000e'/> + </interface> + </devices> +</domain> diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index 7723c1efabdd..c921c8a3b0eb 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -226,6 +226,7 @@ mymain(void) DO_TEST("ethernet-mac-type", "ethernet-mac-type", 4); DO_TEST("ethernet-dummy", "ethernet-dummy", 4); + DO_TEST("ethernet-vds", "ethernet-vds", 4); DO_TEST("serial-file", "serial-file", 4); DO_TEST("serial-device", "serial-device", 4); -- 2.37.2