[PATCH 3/7] hyperv: remove support for multiple API versions from the WMI generator

Matt Coleman mcoleman at datto.com
Mon Nov 9 08:43:09 UTC 2020


All Msvm_* classes are assumed to be V2, now.

Signed-off-by: Matt Coleman <matt at datto.com>
---
 scripts/hyperv_wmi_generator.py       | 267 +++++---------------------
 src/hyperv/hyperv_driver.c            | 106 +++++-----
 src/hyperv/hyperv_wmi.c               |  49 ++---
 src/hyperv/hyperv_wmi.h               |  16 +-
 src/hyperv/hyperv_wmi_classes.h       |   5 -
 src/hyperv/hyperv_wmi_generator.input |  20 +-
 6 files changed, 125 insertions(+), 338 deletions(-)

diff --git a/scripts/hyperv_wmi_generator.py b/scripts/hyperv_wmi_generator.py
index ac03cf526f..03cac2992e 100755
--- a/scripts/hyperv_wmi_generator.py
+++ b/scripts/hyperv_wmi_generator.py
@@ -25,57 +25,22 @@ import os
 import os.path
 
 separator = "/*" + ("*" * 50) + "*\n"
-wmi_version_separator = "/"
 wmi_classes_by_name = {}
 
 
 class WmiClass:
-    """Represents WMI class and provides methods to generate C code.
-
-    This class holds one or more instances of WmiClassVersion because with the
-    Windows 2012 release, Microsoft introduced "v2" version of Msvm_* family of
-    classes that need different URI for making wsman requests and also have
-    some additional/changed properties (though many of the properties are the
-    same as in "v1". Therefore, this class makes sure that C code is generated
-    for each of them while avoiding name conflicts, identifies common members,
-    and defined *_WmiInfo structs holding info about each version so the driver
-    code can make the right choices based on which Hyper-V host it's connected
-    to.
-    """
-
-    def __init__(self, name, versions=None):
-        self.name = name
-        self.versions = versions if versions else list()
-        self.common = None
-
-    def prepare(self):
-        """Prepares the class for code generation
+    """Represents WMI class and provides methods to generate C code."""
 
-        Makes sure that "versioned" classes are sorted by version, identifies
-        common properties and ensures that they are aligned by name and
-        type in each version
-        """
-        # sort versioned classes by version in case input file did not have them
-        # in order
-        self.versions = sorted(self.versions, key=lambda cls: cls.version or "")
-
-        # if there's more than one version make sure first one has name suffixed
-        # because we'll generate "common" member and will be the "base" name
-        if len(self.versions) > 1:
-            first = self.versions[0]
-            if first.version is None:
-                first.version = "v1"
-            first.name = "%s_%s" % (first.name, first.version)
-
-        # finally, identify common members in all versions and make sure they
-        # are in the same order - to ensure C struct member alignment
-        self._align_property_members()
+    def __init__(self, name, properties, uri_info):
+        self.name = name
+        self.properties = properties
+        self.uri_info = uri_info
 
     def generate_classes_header(self):
         """Generate C header code and return it as string
 
         Declares:
-          <class_name>_Data - used as one of hypervObject->data members
+          <class_name>_Data - used as hypervObject->data
           <class_name>_TypeInfo - used as wsman XmlSerializerInfo
           <class_name> - "inherits" hypervObject struct
         """
@@ -103,30 +68,28 @@ class WmiClass:
         """Returns a C code string defining wsman data structs
 
         Defines:
-          <class_name>_Data structs
-          <class_name>_WmiInfo - list holding metadata (e.g. request URIs) for
-                                 each known version of WMI class.
+          <class_name>_Data struct
+          <class_name>_WmiInfo - list holding metadata (e.g. request URIs) for the WMI class
         """
 
         source = separator
         source += " * %s\n" % self.name
         source += " */\n"
 
-        for cls in self.versions:
-            source += "SER_START_ITEMS(%s_Data)\n" % cls.name
+        source += "SER_START_ITEMS(%s_Data)\n" % self.name
 
-            for property in cls.properties:
-                source += property.generate_classes_source(cls.name)
+        for property in self.properties:
+            source += property.generate_classes_source(self.name)
 
-            source += "SER_END_ITEMS(%s_Data);\n\n" % cls.name
+        source += "SER_END_ITEMS(%s_Data);\n\n" % self.name
 
-            # also generate typemap data while we're here
-            source += "hypervCimType %s_Typemap[] = {\n" % cls.name
+        # also generate typemap data while we're here
+        source += "hypervCimType %s_Typemap[] = {\n" % self.name
 
-            for property in cls.properties:
-                source += property.generate_typemap()
-            source += '    { "", "", 0 },\n'  # null terminated
-            source += '};\n\n'
+        for property in self.properties:
+            source += property.generate_typemap()
+        source += '    { "", "", 0 },\n'  # null terminated
+        source += '};\n\n'
 
         source += self._define_WmiInfo_struct()
         source += "\n\n"
@@ -134,45 +97,29 @@ class WmiClass:
         return source
 
     def generate_classes_typedef(self):
-        """Returns C string for typdefs"""
+        """Returns C string for typedefs"""
 
         typedef = "typedef struct _%s %s;\n" % (self.name, self.name)
-
-        if self.common is not None:
-            typedef += "typedef struct _%s_Data %s_Data;\n" % (self.name, self.name)
-
-        for cls in self.versions:
-            typedef += "typedef struct _%s_Data %s_Data;\n" % (cls.name, cls.name)
+        typedef += "typedef struct _%s_Data %s_Data;\n" % (self.name, self.name)
 
         return typedef
 
     def _declare_data_structs(self):
         """Returns string C code declaring data structs.
 
-        The *_Data structs are members of hypervObject data union. Each one has
+        The *_Data structs are used as hypervObject->data. Each one has
         corresponding *_TypeInfo that is used for wsman unserialization of
-        response XML into the *_Data structs. If there's a "common" member, it
-        won't have corresponding *_TypeInfo because this is a special case only
-        used to provide a common "view" of v1, v2 etc members
+        response XML into the *_Data structs.
         """
 
-        header = ""
-        if self.common is not None:
-            header += "struct _%s_Data {\n" % self.name
-            for property in self.common:
-                header += property.generate_classes_header()
-            header += "};\n\n"
-
-        # Declare actual data struct for each versions
-        for cls in self.versions:
-            header += "#define %s_RESOURCE_URI \\\n" % cls.name.upper()
-            header += "    \"%s\"\n" % cls.uri_info.resourceUri
-            header += "\n"
-            header += "struct _%s_Data {\n" % cls.name
-            for property in cls.properties:
-                header += property.generate_classes_header()
-            header += "};\n\n"
-            header += "SER_DECLARE_TYPE(%s_Data);\n" % cls.name
+        header = "#define %s_RESOURCE_URI \\\n" % self.name.upper()
+        header += "    \"%s\"\n" % self.uri_info.resourceUri
+        header += "\n"
+        header += "struct _%s_Data {\n" % self.name
+        for property in self.properties:
+            header += property.generate_classes_header()
+        header += "};\n\n"
+        header += "SER_DECLARE_TYPE(%s_Data);\n" % self.name
 
         return header
 
@@ -181,19 +128,7 @@ class WmiClass:
 
         header = "\n/* must match hypervObject */\n"
         header += "struct _%s {\n" % self.name
-        header += "    union {\n"
-
-        # if there's common use it as "common" else first and only version is
-        # the "common" member
-        if self.common is not None:
-            header += "        %s_Data *common;\n" % self.name
-        else:
-            header += "        %s_Data *common;\n" % self.versions[0].name
-
-        for cls in self.versions:
-            header += "        %s_Data *%s;\n" % (cls.name, cls.version)
-
-        header += "    } data;\n"
+        header += "    %s_Data *data;\n" % self.name
         header += "    hypervWmiClassInfoPtr info;\n"
         header += "    %s *next;\n" % self.name
         header += "};\n"
@@ -205,127 +140,41 @@ class WmiClass:
     def _define_WmiInfo_struct(self):
         """Return string for C code defining *_WmiInfo struct
 
-        Those structs hold info with meta-data needed to make wsman requests for
-        each version of WMI class
+        This struct holds info with meta-data needed to make wsman requests for the WMI class.
         """
 
         source = "hypervWmiClassInfoListPtr %s_WmiInfo = &(hypervWmiClassInfoList) {\n" % self.name
-        source += "    .count = %d,\n" % len(self.versions)
+        source += "    .count = 1,\n"
         source += "    .objs = (hypervWmiClassInfoPtr []) {\n"
 
-        for cls in self.versions:
-            source += "        &(hypervWmiClassInfo) {\n"
-            source += "            .name = %s_CLASSNAME,\n" % self.name.upper()
-            if cls.version is not None:
-                source += "            .version = \"%s\",\n" % cls.version
-            else:
-                source += "            .version = NULL,\n"
-            source += "            .rootUri = %s,\n" % cls.uri_info.rootUri
-            source += "            .resourceUri = %s_RESOURCE_URI,\n" % cls.name.upper()
-            source += "            .serializerInfo = %s_Data_TypeInfo,\n" % cls.name
-            source += "            .propertyInfo = %s_Typemap\n" % cls.name
-            source += "        },\n"
+        source += "        &(hypervWmiClassInfo) {\n"
+        source += "            .name = %s_CLASSNAME,\n" % self.name.upper()
+        source += "            .rootUri = %s,\n" % self.uri_info.rootUri
+        source += "            .resourceUri = %s_RESOURCE_URI,\n" % self.name.upper()
+        source += "            .serializerInfo = %s_Data_TypeInfo,\n" % self.name
+        source += "            .propertyInfo = %s_Typemap\n" % self.name
+        source += "        },\n"
 
         source += "    }\n"
         source += "};\n"
 
         return source
 
-    def _align_property_members(self):
-        """Identifies common properties in all class versions.
-
-        Makes sure that properties in all versions are ordered with common
-        members first and that they are in the same order. This makes the
-        generated C structs memory aligned and safe to access via the "common"
-        struct that "shares" members with v1, v2 etc.
-        """
-
-        num_classes = len(self.versions)
-        common = {}
-        property_info = {}
-
-        if num_classes < 2:
-            return
-
-        # count property occurrences in all class versions
-        for cls in self.versions:
-            for prop in cls.properties:
-                # consdered same if matches by name AND type
-                key = "%s_%s_%s" % (prop.name, prop.type, prop.is_array)
-
-                if key in property_info:
-                    property_info[key][1] += 1
-                else:
-                    property_info[key] = [prop, 1]
-
-        # isolate those that are common for all and keep track of their positions
-        pos = 0
-        for key in sorted(property_info):
-            info = property_info[key]
-            # exists in all class versions
-            if info[1] == num_classes:
-                common[info[0].name] = [info[0], pos]
-                pos += 1
-
-        # alter each version's property list so that common members are first
-        # and in the same order as in the common dictionary
-        for cls in self.versions:
-            index = 0
-            count = len(cls.properties)
-
-            while index < count:
-                prop = cls.properties[index]
-
-                # it's a "common" property
-                if prop.name in common:
-                    pos = common[prop.name][1]
-
-                    # move to the same position as in "common" dictionary
-                    if index != pos:
-                        tmp = cls.properties[pos]
-                        cls.properties[pos] = prop
-                        cls.properties[index] = tmp
-                    else:
-                        index += 1
-                else:
-                    index += 1
-
-        # finally, get common properties as list sorted by position in dictionary
-        tmp = sorted(common.values(), key=lambda x: x[1])
-        self.common = []
-        for x in tmp:
-            self.common.append(x[0])
-
 
 class ClassUriInfo:
     """Prepares URI information needed for wsman requests."""
 
-    def __init__(self, wmi_name, version):
-        self.rootUri = "ROOT_CIMV2"
-        self.resourceUri = None
-        baseUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2"
-
+    def __init__(self, wmi_name):
         if wmi_name.startswith("Msvm_"):
-            baseUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization"
-            self.rootUri = "ROOT_VIRTUALIZATION"
-
-            if version == "v2":
-                baseUri += "/v2"
-                self.rootUri = "ROOT_VIRTUALIZATION_V2"
+            self.rootUri = "ROOT_VIRTUALIZATION_V2"
+            baseUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/v2"
+        else:
+            self.rootUri = "ROOT_CIMV2"
+            baseUri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2"
 
         self.resourceUri = "%s/%s" % (baseUri, wmi_name)
 
 
-class WmiClassVersion:
-    """Represents specific version of WMI class."""
-
-    def __init__(self, name, version, properties, uri_info):
-        self.name = name
-        self.version = version
-        self.properties = properties
-        self.uri_info = uri_info
-
-
 class Property:
     typemap = {
         "boolean": "BOOL",
@@ -391,15 +240,11 @@ def parse_class(block, number):
     assert header_items[0] == "class"
 
     name = header_items[1]
-    properties = []
-    version = None
-    wmi_name = name
-    ns_separator = name.find(wmi_version_separator)
 
-    if ns_separator != -1:
-        version = name[:ns_separator]
-        wmi_name = name[ns_separator + 1:]
-        name = "%s_%s" % (wmi_name, version)
+    if name in wmi_classes_by_name:
+        report_error("class '%s' has already been defined" % name)
+
+    properties = []
 
     for line in block[1:]:
         # expected format: <type> <name>
@@ -414,16 +259,9 @@ def parse_class(block, number):
         else:
             is_array = False
 
-        properties.append(Property(type=items[0], name=items[1],
-                                   is_array=is_array))
-
-    cls = WmiClassVersion(name=name, version=version, properties=properties,
-                          uri_info=ClassUriInfo(wmi_name, version))
+        properties.append(Property(type=items[0], name=items[1], is_array=is_array))
 
-    if wmi_name in wmi_classes_by_name:
-        wmi_classes_by_name[wmi_name].versions.append(cls)
-    else:
-        wmi_classes_by_name[wmi_name] = WmiClass(wmi_name, [cls])
+    wmi_classes_by_name[name] = WmiClass(name, properties, ClassUriInfo(name))
 
 
 def main():
@@ -478,7 +316,6 @@ def main():
 
     for name in names:
         cls = wmi_classes_by_name[name]
-        cls.prepare()
 
         classes_typedef.write(cls.generate_classes_typedef())
         classes_header.write(cls.generate_classes_header())
diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c
index 11f177ae30..b789ef58e8 100644
--- a/src/hyperv/hyperv_driver.c
+++ b/src/hyperv/hyperv_driver.c
@@ -192,7 +192,7 @@ hypervRequestStateChange(virDomainPtr domain, int state)
     if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
         goto cleanup;
 
-    if (computerSystem->data.common->EnabledState != MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED) {
+    if (computerSystem->data->EnabledState != MSVM_COMPUTERSYSTEM_ENABLEDSTATE_ENABLED) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Domain is not active"));
         goto cleanup;
     }
@@ -239,10 +239,10 @@ hypervLookupHostSystemBiosUuid(hypervPrivate *priv, unsigned char *uuid)
     if (hypervGetWmiClass(Win32_ComputerSystemProduct, &computerSystem) < 0)
         goto cleanup;
 
-    if (virUUIDParse(computerSystem->data.common->UUID, uuid) < 0) {
+    if (virUUIDParse(computerSystem->data->UUID, uuid) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not parse UUID from string '%s'"),
-                       computerSystem->data.common->UUID);
+                       computerSystem->data->UUID);
         goto cleanup;
     }
     result = 0;
@@ -443,11 +443,10 @@ hypervConnectGetVersion(virConnectPtr conn, unsigned long *version)
         goto cleanup;
     }
 
-    if (hypervParseVersionString(os->data.common->Version,
-                                 &major, &minor, &micro) < 0) {
+    if (hypervParseVersionString(os->data->Version, &major, &minor, &micro) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not parse version from '%s'"),
-                       os->data.common->Version);
+                       os->data->Version);
         goto cleanup;
     }
 
@@ -471,7 +470,7 @@ hypervConnectGetVersion(virConnectPtr conn, unsigned long *version)
     if (major > 99 || minor > 99 || micro > 999999) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not produce packed version number from '%s'"),
-                       os->data.common->Version);
+                       os->data->Version);
         goto cleanup;
     }
 
@@ -496,7 +495,7 @@ hypervConnectGetHostname(virConnectPtr conn)
     if (hypervGetPhysicalSystemList(priv, &computerSystem) < 0)
         goto cleanup;
 
-    hostname = g_strdup(computerSystem->data.common->DNSHostName);
+    hostname = g_strdup(computerSystem->data->DNSHostName);
 
  cleanup:
     hypervFreeObject(priv, (hypervObject *)computerSystem);
@@ -537,7 +536,7 @@ hypervConnectGetMaxVcpus(virConnectPtr conn, const char *type G_GNUC_UNUSED)
         goto cleanup;
     }
 
-    result = processorSettingData->data.common->VirtualQuantity;
+    result = processorSettingData->data->VirtualQuantity;
 
  cleanup:
     hypervFreeObject(priv, (hypervObject *)processorSettingData);
@@ -561,13 +560,12 @@ hypervNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info)
     if (hypervGetPhysicalSystemList(priv, &computerSystem) < 0)
         goto cleanup;
 
-    if (hypervGetProcessorsByName(priv, computerSystem->data.common->Name,
-                                  &processorList) < 0) {
+    if (hypervGetProcessorsByName(priv, computerSystem->data->Name, &processorList) < 0) {
         goto cleanup;
     }
 
     /* Strip the string to fit more relevant information in 32 chars */
-    tmp = processorList->data.common->Name;
+    tmp = processorList->data->Name;
 
     while (*tmp != '\0') {
         if (STRPREFIX(tmp, "  ")) {
@@ -589,15 +587,15 @@ hypervNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info)
     }
 
     /* Fill struct */
-    if (virStrcpyStatic(info->model, processorList->data.common->Name) < 0) {
+    if (virStrcpyStatic(info->model, processorList->data->Name) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("CPU model %s too long for destination"),
-                       processorList->data.common->Name);
+                       processorList->data->Name);
         goto cleanup;
     }
 
-    info->memory = computerSystem->data.common->TotalPhysicalMemory / 1024; /* byte to kilobyte */
-    info->mhz = processorList->data.common->MaxClockSpeed;
+    info->memory = computerSystem->data->TotalPhysicalMemory / 1024; /* byte to kilobyte */
+    info->mhz = processorList->data->MaxClockSpeed;
     info->nodes = 1;
     info->sockets = 0;
 
@@ -606,8 +604,8 @@ hypervNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info)
         ++info->sockets;
     }
 
-    info->cores = processorList->data.common->NumberOfCores;
-    info->threads = processorList->data.common->NumberOfLogicalProcessors / info->cores;
+    info->cores = processorList->data->NumberOfCores;
+    info->threads = processorList->data->NumberOfLogicalProcessors / info->cores;
     info->cpus = info->sockets * info->cores;
 
     result = 0;
@@ -637,7 +635,7 @@ hypervConnectListDomains(virConnectPtr conn, int *ids, int maxids)
 
     for (computerSystem = computerSystemList; computerSystem != NULL;
          computerSystem = computerSystem->next) {
-        ids[count++] = computerSystem->data.common->ProcessID;
+        ids[count++] = computerSystem->data->ProcessID;
 
         if (count >= maxids)
             break;
@@ -755,7 +753,7 @@ hypervDomainResume(virDomainPtr domain)
     if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
         return -1;
 
-    if (computerSystem->data.common->EnabledState != MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE) {
+    if (computerSystem->data->EnabledState != MSVM_COMPUTERSYSTEM_REQUESTEDSTATE_QUIESCE) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                        _("Domain is not paused"));
         goto cleanup;
@@ -810,7 +808,7 @@ hypervDomainShutdownFlags(virDomainPtr domain, unsigned int flags)
 
     selector = g_strdup_printf("CreationClassName=\"Msvm_ShutdownComponent\"&DeviceID=\"%s\"&"
                                "SystemCreationClassName=\"Msvm_ComputerSystem\"&SystemName=\"%s\"",
-                               shutdown->data.common->DeviceID, uuid);
+                               shutdown->data->DeviceID, uuid);
 
     params = hypervCreateInvokeParamsList("InitiateShutdown", selector,
                                           Msvm_ShutdownComponent_WmiInfo);
@@ -931,20 +929,20 @@ hypervDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
         goto cleanup;
 
     if (hypervGetProcessorSD(priv,
-                             virtualSystemSettingData->data.common->InstanceID,
+                             virtualSystemSettingData->data->InstanceID,
                              &processorSettingData) < 0)
         goto cleanup;
 
     if (hypervGetMemorySD(priv,
-                          virtualSystemSettingData->data.common->InstanceID,
+                          virtualSystemSettingData->data->InstanceID,
                           &memorySettingData) < 0)
         goto cleanup;
 
     /* Fill struct */
     info->state = hypervMsvmComputerSystemEnabledStateToDomainState(computerSystem);
-    info->maxMem = memorySettingData->data.common->Limit * 1024; /* megabyte to kilobyte */
-    info->memory = memorySettingData->data.common->VirtualQuantity * 1024; /* megabyte to kilobyte */
-    info->nrVirtCpu = processorSettingData->data.common->VirtualQuantity;
+    info->maxMem = memorySettingData->data->Limit * 1024; /* megabyte to kilobyte */
+    info->memory = memorySettingData->data->VirtualQuantity * 1024; /* megabyte to kilobyte */
+    info->nrVirtCpu = processorSettingData->data->VirtualQuantity;
     info->cpuTime = 0;
 
     result = 0;
@@ -1014,12 +1012,12 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
         goto cleanup;
 
     if (hypervGetProcessorSD(priv,
-                             virtualSystemSettingData->data.common->InstanceID,
+                             virtualSystemSettingData->data->InstanceID,
                              &processorSettingData) < 0)
         goto cleanup;
 
     if (hypervGetMemorySD(priv,
-                          virtualSystemSettingData->data.common->InstanceID,
+                          virtualSystemSettingData->data->InstanceID,
                           &memorySettingData) < 0)
         goto cleanup;
 
@@ -1027,27 +1025,27 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
     def->virtType = VIR_DOMAIN_VIRT_HYPERV;
 
     if (hypervIsMsvmComputerSystemActive(computerSystem, NULL)) {
-        def->id = computerSystem->data.common->ProcessID;
+        def->id = computerSystem->data->ProcessID;
     } else {
         def->id = -1;
     }
 
-    if (virUUIDParse(computerSystem->data.common->Name, def->uuid) < 0) {
+    if (virUUIDParse(computerSystem->data->Name, def->uuid) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not parse UUID from string '%s'"),
-                       computerSystem->data.common->Name);
+                       computerSystem->data->Name);
         return NULL;
     }
 
-    def->name = g_strdup(computerSystem->data.common->ElementName);
+    def->name = g_strdup(computerSystem->data->ElementName);
 
-    if (virtualSystemSettingData->data.v2->Notes.data) {
-        char **notes = (char **)virtualSystemSettingData->data.v2->Notes.data;
+    if (virtualSystemSettingData->data->Notes.data) {
+        char **notes = (char **)virtualSystemSettingData->data->Notes.data;
         g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
         size_t i = 0;
 
         /* in practice Notes has 1 element */
-        for (i = 0; i < virtualSystemSettingData->data.v2->Notes.count; i++) {
+        for (i = 0; i < virtualSystemSettingData->data->Notes.count; i++) {
             /* but if there's more than 1, separate by double new line */
             if (virBufferUse(&buf) > 0)
                 virBufferAddLit(&buf, "\n\n");
@@ -1060,17 +1058,14 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
     }
 
     /* mebibytes to kibibytes */
-    def->mem.max_memory = memorySettingData->data.common->Limit * 1024;
-    def->mem.cur_balloon = memorySettingData->data.common->VirtualQuantity * 1024;
-    virDomainDefSetMemoryTotal(def, memorySettingData->data.common->VirtualQuantity * 1024);
+    def->mem.max_memory = memorySettingData->data->Limit * 1024;
+    def->mem.cur_balloon = memorySettingData->data->VirtualQuantity * 1024;
+    virDomainDefSetMemoryTotal(def, memorySettingData->data->VirtualQuantity * 1024);
 
-    if (virDomainDefSetVcpusMax(def,
-                                processorSettingData->data.common->VirtualQuantity,
-                                NULL) < 0)
+    if (virDomainDefSetVcpusMax(def, processorSettingData->data->VirtualQuantity, NULL) < 0)
         goto cleanup;
 
-    if (virDomainDefSetVcpus(def,
-                             processorSettingData->data.common->VirtualQuantity) < 0)
+    if (virDomainDefSetVcpus(def, processorSettingData->data->VirtualQuantity) < 0)
         goto cleanup;
 
     def->os.type = VIR_DOMAIN_OSTYPE_HVM;
@@ -1110,7 +1105,7 @@ hypervConnectListDefinedDomains(virConnectPtr conn, char **const names, int maxn
 
     for (computerSystem = computerSystemList; computerSystem != NULL;
          computerSystem = computerSystem->next) {
-        names[count] = g_strdup(computerSystem->data.common->ElementName);
+        names[count] = g_strdup(computerSystem->data->ElementName);
 
         ++count;
 
@@ -1208,7 +1203,7 @@ hypervDomainGetAutostart(virDomainPtr domain, int *autostart)
     if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0)
         goto cleanup;
 
-    *autostart = vssd->data.v2->AutomaticStartupAction == 4;
+    *autostart = vssd->data->AutomaticStartupAction == 4;
     result = 0;
 
  cleanup:
@@ -1246,8 +1241,7 @@ hypervDomainSetAutostart(virDomainPtr domain, int autostart)
                                   autostart ? "4" : "2") < 0)
         goto cleanup;
 
-    if (hypervSetEmbeddedProperty(autostartParam, "InstanceID",
-                                  vssd->data.common->InstanceID) < 0)
+    if (hypervSetEmbeddedProperty(autostartParam, "InstanceID", vssd->data->InstanceID) < 0)
         goto cleanup;
 
     if (hypervAddEmbeddedParam(params, "SystemSettings",
@@ -1284,7 +1278,7 @@ hypervNodeGetFreeMemory(virConnectPtr conn)
         return 0;
     }
 
-    freeMemoryBytes = operatingSystem->data.common->FreePhysicalMemory * 1024;
+    freeMemoryBytes = operatingSystem->data->FreePhysicalMemory * 1024;
 
     hypervFreeObject(priv, (hypervObject *)operatingSystem);
 
@@ -1409,8 +1403,7 @@ hypervDomainHasManagedSaveImage(virDomainPtr domain, unsigned int flags)
     if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
         goto cleanup;
 
-    result = computerSystem->data.common->EnabledState ==
-             MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED ? 1 : 0;
+    result = computerSystem->data->EnabledState == MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED ? 1 : 0;
 
  cleanup:
     hypervFreeObject(priv, (hypervObject *)computerSystem);
@@ -1431,8 +1424,7 @@ hypervDomainManagedSaveRemove(virDomainPtr domain, unsigned int flags)
     if (hypervMsvmComputerSystemFromDomain(domain, &computerSystem) < 0)
         goto cleanup;
 
-    if (computerSystem->data.common->EnabledState !=
-        MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED) {
+    if (computerSystem->data->EnabledState != MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED) {
         virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                        _("Domain has no managed save image"));
         goto cleanup;
@@ -1530,7 +1522,7 @@ hypervConnectListAllDomains(virConnectPtr conn,
 
         /* managed save filter */
         if (MATCH(VIR_CONNECT_LIST_DOMAINS_FILTERS_MANAGEDSAVE)) {
-            bool mansave = computerSystem->data.common->EnabledState ==
+            bool mansave = computerSystem->data->EnabledState ==
                            MSVM_COMPUTERSYSTEM_ENABLEDSTATE_SUSPENDED;
 
             if (!((MATCH(VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE) && mansave) ||
@@ -1628,7 +1620,7 @@ hypervDomainSendKey(virDomainPtr domain, unsigned int codeset,
 
     selector = g_strdup_printf("CreationClassName=Msvm_Keyboard&DeviceID=%s&"
                                "SystemCreationClassName=Msvm_ComputerSystem&"
-                               "SystemName=%s", keyboard->data.common->DeviceID, uuid_string);
+                               "SystemName=%s", keyboard->data->DeviceID, uuid_string);
 
     /* press the keys */
     for (i = 0; i < nkeycodes; i++) {
@@ -1701,7 +1693,7 @@ hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory,
     if (hypervGetMsvmVirtualSystemSettingDataFromUUID(priv, uuid_string, &vssd) < 0)
         goto cleanup;
 
-    if (hypervGetMemorySD(priv, vssd->data.common->InstanceID, &memsd) < 0)
+    if (hypervGetMemorySD(priv, vssd->data->InstanceID, &memsd) < 0)
         goto cleanup;
 
     params = hypervCreateInvokeParamsList("ModifyResourceSettings",
@@ -1718,10 +1710,8 @@ hypervDomainSetMemoryFlags(virDomainPtr domain, unsigned long memory,
     if (hypervSetEmbeddedProperty(memResource, "VirtualQuantity", memory_str) < 0)
         goto cleanup;
 
-    if (hypervSetEmbeddedProperty(memResource, "InstanceID",
-                                  memsd->data.common->InstanceID) < 0) {
+    if (hypervSetEmbeddedProperty(memResource, "InstanceID", memsd->data->InstanceID) < 0)
         goto cleanup;
-    }
 
     if (hypervAddEmbeddedParam(params, "ResourceSettings",
                                &memResource, Msvm_MemorySettingData_WmiInfo) < 0) {
diff --git a/src/hyperv/hyperv_wmi.c b/src/hyperv/hyperv_wmi.c
index adb68425f9..2a3d6abc0b 100644
--- a/src/hyperv/hyperv_wmi.c
+++ b/src/hyperv/hyperv_wmi.c
@@ -50,31 +50,8 @@ VIR_LOG_INIT("hyperv.hyperv_wmi");
 static int
 hypervGetWmiClassInfo(hypervWmiClassInfoListPtr list, hypervWmiClassInfoPtr *info)
 {
-    size_t i;
-
-    if (list->count == 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("The WMI class info list is empty"));
-        return -1;
-    }
-
-    /* if there's just one WMI class and isn't versioned, assume "shared" */
-    if (list->count == 1 && list->objs[0]->version == NULL) {
-        *info = list->objs[0];
-        return 0;
-    }
-
-    for (i = 0; i < list->count; i++) {
-        if (STRCASEEQ(list->objs[i]->version, "v2")) {
-            *info = list->objs[i];
-            return 0;
-        }
-    }
-
-    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                   _("Could not match WMI class info for version v2"));
-
-    return -1;
+    *info = list->objs[0];
+    return 0;
 }
 
 
@@ -911,7 +888,7 @@ hypervInvokeMethod(hypervPrivate *priv,
             if (hypervGetWmiClass(Msvm_ConcreteJob, &job) < 0 || !job)
                 goto cleanup;
 
-            jobState = job->data.common->JobState;
+            jobState = job->data->JobState;
             switch (jobState) {
             case MSVM_CONCRETEJOB_JOBSTATE_NEW:
             case MSVM_CONCRETEJOB_JOBSTATE_STARTING:
@@ -1078,7 +1055,7 @@ hypervEnumAndPull(hypervPrivate *priv, hypervWqlQueryPtr wqlQuery,
 
         object = g_new0(hypervObject, 1);
         object->info = wmiInfo;
-        object->data.common = data;
+        object->data = data;
 
         data = NULL;
 
@@ -1139,7 +1116,7 @@ hypervFreeObject(hypervPrivate *priv G_GNUC_UNUSED, hypervObject *object)
     while (object != NULL) {
         next = object->next;
 
-        if (ws_serializer_free_mem(serializerContext, object->data.common,
+        if (ws_serializer_free_mem(serializerContext, object->data,
                                    object->info->serializerInfo) < 0) {
             VIR_ERROR(_("Could not free deserialized data"));
         }
@@ -1270,7 +1247,7 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
     wsmc_add_prop_from_str(options, properties);
 
     /* Invoke method */
-    response = wsmc_action_invoke(priv->client, MSVM_COMPUTERSYSTEM_V2_RESOURCE_URI,
+    response = wsmc_action_invoke(priv->client, MSVM_COMPUTERSYSTEM_RESOURCE_URI,
                                   options, "RequestStateChange", NULL);
 
     if (hypervVerifyResponse(priv->client, response, "invocation") < 0)
@@ -1320,7 +1297,7 @@ hypervInvokeMsvmComputerSystemRequestStateChange(virDomainPtr domain,
                 goto cleanup;
             }
 
-            switch (concreteJob->data.common->JobState) {
+            switch (concreteJob->data->JobState) {
             case MSVM_CONCRETEJOB_JOBSTATE_NEW:
             case MSVM_CONCRETEJOB_JOBSTATE_STARTING:
             case MSVM_CONCRETEJOB_JOBSTATE_RUNNING:
@@ -1380,7 +1357,7 @@ int
 hypervMsvmComputerSystemEnabledStateToDomainState
 (Msvm_ComputerSystem *computerSystem)
 {
-    switch (computerSystem->data.common->EnabledState) {
+    switch (computerSystem->data->EnabledState) {
     case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_UNKNOWN:
         return VIR_DOMAIN_NOSTATE;
 
@@ -1421,7 +1398,7 @@ hypervIsMsvmComputerSystemActive(Msvm_ComputerSystem *computerSystem,
     if (in_transition != NULL)
         *in_transition = false;
 
-    switch (computerSystem->data.common->EnabledState) {
+    switch (computerSystem->data->EnabledState) {
     case MSVM_COMPUTERSYSTEM_ENABLEDSTATE_UNKNOWN:
         return false;
 
@@ -1467,17 +1444,17 @@ hypervMsvmComputerSystemToDomain(virConnectPtr conn,
         return -1;
     }
 
-    if (virUUIDParse(computerSystem->data.common->Name, uuid) < 0) {
+    if (virUUIDParse(computerSystem->data->Name, uuid) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Could not parse UUID from string '%s'"),
-                       computerSystem->data.common->Name);
+                       computerSystem->data->Name);
         return -1;
     }
 
     if (hypervIsMsvmComputerSystemActive(computerSystem, NULL))
-        id = computerSystem->data.common->ProcessID;
+        id = computerSystem->data->ProcessID;
 
-    *domain = virGetDomain(conn, computerSystem->data.common->ElementName, uuid, id);
+    *domain = virGetDomain(conn, computerSystem->data->ElementName, uuid, id);
 
     return *domain ? 0 : -1;
 }
diff --git a/src/hyperv/hyperv_wmi.h b/src/hyperv/hyperv_wmi.h
index 2f8d5b2fce..a9fe5318e6 100644
--- a/src/hyperv/hyperv_wmi.h
+++ b/src/hyperv/hyperv_wmi.h
@@ -47,20 +47,8 @@ int hypervVerifyResponse(WsManClient *client, WsXmlDocH response,
 
 typedef struct _hypervObject hypervObject;
 struct _hypervObject {
-    /* Unserialized data from wsman response. The member called "common" has
-     * properties that are the same type and name for all "versions" of given
-     * WMI class. This means that calling code does not have to make any
-     * conditional checks based on which version was returned as long as it
-     * only needs to read common values. The alignment of structs is ensured
-     * by the generator.
-     */
-    union {
-        XML_TYPE_PTR common;
-        XML_TYPE_PTR v1;
-        XML_TYPE_PTR v2;
-    } data;
-    /* The info used to make wsman request */
-    hypervWmiClassInfoPtr info;
+    XML_TYPE_PTR data; /* Unserialized data from wsman response */
+    hypervWmiClassInfoPtr info; /* The info used to make wsman request */
     hypervObject *next;
 };
 
diff --git a/src/hyperv/hyperv_wmi_classes.h b/src/hyperv/hyperv_wmi_classes.h
index b9d8dfcf38..a00751013d 100644
--- a/src/hyperv/hyperv_wmi_classes.h
+++ b/src/hyperv/hyperv_wmi_classes.h
@@ -32,9 +32,6 @@
 #define ROOT_CIMV2 \
     "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/*"
 
-#define ROOT_VIRTUALIZATION \
-    "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/*"
-
 #define ROOT_VIRTUALIZATION_V2 \
     "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/v2/*"
 
@@ -121,8 +118,6 @@ typedef hypervWmiClassInfo *hypervWmiClassInfoPtr;
 struct _hypervWmiClassInfo {
     /* The WMI class name */
     const char *name;
-    /* The version of the WMI class as in "v1" or "v2" */
-    const char *version;
     /* The URI for wsman enumerate request */
     const char *rootUri;
     /* The namespace URI for XML serialization */
diff --git a/src/hyperv/hyperv_wmi_generator.input b/src/hyperv/hyperv_wmi_generator.input
index e6b53bc021..74c9495372 100644
--- a/src/hyperv/hyperv_wmi_generator.input
+++ b/src/hyperv/hyperv_wmi_generator.input
@@ -23,7 +23,7 @@
 #
 
 
-class v2/Msvm_ComputerSystem
+class Msvm_ComputerSystem
     string   InstanceID
     string   Caption
     string   Description
@@ -72,7 +72,7 @@ class v2/Msvm_ComputerSystem
 end
 
 
-class v2/Msvm_ConcreteJob
+class Msvm_ConcreteJob
     string   InstanceID
     string   Caption
     string   Description
@@ -117,7 +117,7 @@ class v2/Msvm_ConcreteJob
 end
 
 
-class v2/Msvm_MemorySettingData
+class Msvm_MemorySettingData
     string  InstanceID
     string  Caption
     string  Description
@@ -149,7 +149,7 @@ class v2/Msvm_MemorySettingData
 end
 
 
-class v2/Msvm_ProcessorSettingData
+class Msvm_ProcessorSettingData
     string  InstanceID
     string  Caption
     string  Description
@@ -180,7 +180,7 @@ class v2/Msvm_ProcessorSettingData
 end
 
 
-class v2/Msvm_VirtualSystemSettingData
+class Msvm_VirtualSystemSettingData
     string   InstanceID
     string   Caption
     string   Description
@@ -569,7 +569,7 @@ class Win32_OperatingSystem
 end
 
 
-class v2/Msvm_VirtualSystemManagementService
+class Msvm_VirtualSystemManagementService
     string   InstanceID
     string   Caption
     string   Description
@@ -601,7 +601,7 @@ class v2/Msvm_VirtualSystemManagementService
 end
 
 
-class v2/Msvm_ResourceAllocationSettingData
+class Msvm_ResourceAllocationSettingData
     string   InstanceID
     string   Caption
     string   Description
@@ -629,7 +629,7 @@ class v2/Msvm_ResourceAllocationSettingData
 end
 
 
-class v2/Msvm_SyntheticEthernetPortSettingData
+class Msvm_SyntheticEthernetPortSettingData
     string   InstanceID
     string   Caption
     string   Description
@@ -663,7 +663,7 @@ class v2/Msvm_SyntheticEthernetPortSettingData
 end
 
 
-class v2/Msvm_Keyboard
+class Msvm_Keyboard
     string   InstanceID
     string   Caption
     string   Description
@@ -710,7 +710,7 @@ class v2/Msvm_Keyboard
 end
 
 
-class v2/Msvm_ShutdownComponent
+class Msvm_ShutdownComponent
     string   InstanceID
     string   Caption
     string   Description
-- 
2.27.0





More information about the libvir-list mailing list