[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH] esx: Extend esx_vi_generator.py to cover methods too



Generate almost all SOAP method mapping code.

Update the driver code to use the complete paramater list of some methods
that had parameters skipped before.

Improve the ESX_VI__METHOD marco to do automatic output deserialization
based on output occurrence. Also incorporate automatic _this binding and
output pointer check.
---
 src/esx/esx_driver.c           |   26 +-
 src/esx/esx_vi.c               |    7 +-
 src/esx/esx_vi_generator.input |  191 +++++++++-
 src/esx/esx_vi_generator.py    |  489 ++++++++++++++++++------
 src/esx/esx_vi_methods.c       |  854 ++++++----------------------------------
 src/esx/esx_vi_methods.h       |  132 +------
 6 files changed, 723 insertions(+), 976 deletions(-)

diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 4ed9890..e3340c9 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -1333,7 +1333,8 @@ esxDomainResume(virDomainPtr domain)
         goto failure;
     }
 
-    if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, &task) < 0 ||
+    if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, NULL,
+                             &task) < 0 ||
         esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid,
                                     priv->autoAnswer, &taskInfoState) < 0) {
         goto failure;
@@ -1710,8 +1711,9 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
     esxVI_PerfCounterInfo *perfCounterInfo = NULL;
     esxVI_PerfCounterInfo *perfCounterInfoList = NULL;
     esxVI_PerfQuerySpec *querySpec = NULL;
+    esxVI_PerfEntityMetricBase *perfEntityMetricBase = NULL;
+    esxVI_PerfEntityMetricBase *perfEntityMetricBaseList = NULL;
     esxVI_PerfEntityMetric *perfEntityMetric = NULL;
-    esxVI_PerfEntityMetric *perfEntityMetricList = NULL;
     esxVI_PerfMetricIntSeries *perfMetricIntSeries = NULL;
     esxVI_Long *value = NULL;
 
@@ -1883,17 +1885,26 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
         querySpec->metricId->instance = (char *)"";
         querySpec->format = (char *)"normal";
 
-        if (esxVI_QueryPerf(priv->host, querySpec, &perfEntityMetricList) < 0) {
+        if (esxVI_QueryPerf(priv->host, querySpec,
+                            &perfEntityMetricBaseList) < 0) {
             querySpec->entity = NULL;
             querySpec->metricId->instance = NULL;
             querySpec->format = NULL;
             goto failure;
         }
 
-        for (perfEntityMetric = perfEntityMetricList; perfEntityMetric != NULL;
-             perfEntityMetric = perfEntityMetric->_next) {
+        for (perfEntityMetricBase = perfEntityMetricBaseList;
+             perfEntityMetricBase != NULL;
+             perfEntityMetricBase = perfEntityMetricBase->_next) {
             VIR_DEBUG0("perfEntityMetric ...");
 
+            perfEntityMetric =
+              esxVI_PerfEntityMetric_DynamicCast(perfEntityMetricBase);
+
+            if (perfMetricIntSeries == NULL) {
+                VIR_ERROR0("QueryPerf returned object with unexpected type");
+            }
+
             perfMetricIntSeries =
               esxVI_PerfMetricIntSeries_DynamicCast(perfEntityMetric->value);
 
@@ -1927,7 +1938,7 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
     esxVI_Int_Free(&counterIdList);
     esxVI_PerfCounterInfo_Free(&perfCounterInfoList);
     esxVI_PerfQuerySpec_Free(&querySpec);
-    esxVI_PerfEntityMetric_Free(&perfEntityMetricList);
+    esxVI_PerfEntityMetricBase_Free(&perfEntityMetricBaseList);
 
     return result;
 
@@ -2367,7 +2378,8 @@ esxDomainCreate(virDomainPtr domain)
         goto failure;
     }
 
-    if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, &task) < 0 ||
+    if (esxVI_PowerOnVM_Task(priv->host, virtualMachine->obj, NULL,
+                             &task) < 0 ||
         esxVI_WaitForTaskCompletion(priv->host, task, domain->uuid,
                                     priv->autoAnswer, &taskInfoState) < 0) {
         goto failure;
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index 1a71558..4318ff1 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -444,7 +444,7 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url,
         goto failure;
     }
 
-    if (esxVI_Login(ctx, username, password, &ctx->session) < 0) {
+    if (esxVI_Login(ctx, username, password, NULL, &ctx->session) < 0) {
         goto failure;
     }
 
@@ -1344,7 +1344,7 @@ esxVI_EnsureSession(esxVI_Context *ctx)
     if (active != esxVI_Boolean_True) {
         esxVI_UserSession_Free(&ctx->session);
 
-        if (esxVI_Login(ctx, ctx->username, ctx->password,
+        if (esxVI_Login(ctx, ctx->username, ctx->password, NULL,
                         &ctx->session) < 0) {
             return -1;
         }
@@ -1378,7 +1378,8 @@ esxVI_EnsureSession(esxVI_Context *ctx)
     if (currentSession == NULL) {
         esxVI_UserSession_Free(&ctx->session);
 
-        if (esxVI_Login(ctx, ctx->username, ctx->password, &ctx->session) < 0) {
+        if (esxVI_Login(ctx, ctx->username, ctx->password, NULL,
+                        &ctx->session) < 0) {
             goto failure;
         }
     } else if (STRNEQ(ctx->session->key, currentSession->key)) {
diff --git a/src/esx/esx_vi_generator.input b/src/esx/esx_vi_generator.input
index 9c545eb..a016c63 100644
--- a/src/esx/esx_vi_generator.input
+++ b/src/esx/esx_vi_generator.input
@@ -28,7 +28,22 @@
 #  - ol for an optional list
 #  - i  for an ignored item or list
 #
-# Object member sequence has to match the WSDL sequence
+# Object member sequence has to match the WSDL sequence.
+#
+#
+# Method definition:
+#
+# method <name> [returns <type> <occurrence>]
+#     <type> <name> <occurrence>
+#     ...
+# end
+#
+# The _this paramater can have a type attached to it:
+#
+# _this:<type>
+#
+# The <type> refers to one of the ServiceContent members. This make the
+# generator auto-bind _this to the corresponding ServiceContent member.
 #
 
 
@@ -436,3 +451,177 @@ object VirtualMachineSnapshotTree
     Boolean                                  quiesced                       r
     VirtualMachineSnapshotTree               childSnapshotList              ol
 end
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Methods
+#
+
+method AnswerVM
+    ManagedObjectReference                   _this                          r
+    String                                   questionId                     r
+    String                                   answerChoice                   r
+end
+
+
+method CancelTask
+    ManagedObjectReference                   _this                          r
+end
+
+
+method CreateFilter returns ManagedObjectReference r
+    ManagedObjectReference                   _this:PropertyCollector        r
+    PropertyFilterSpec                       spec                           r
+    Boolean                                  partialUpdates                 r
+end
+
+
+method CreateSnapshot_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    String                                   name                           r
+    String                                   description                    o
+    Boolean                                  memory                         r
+    Boolean                                  quiesce                        r
+end
+
+
+method DestroyPropertyFilter
+    ManagedObjectReference                   _this                          r
+end
+
+
+method FindByIp returns ManagedObjectReference o
+    ManagedObjectReference                   _this:SearchIndex              r
+    ManagedObjectReference                   datacenter                     o
+    String                                   ip                             r
+    Boolean                                  vmSearch                       r
+end
+
+
+method FindByUuid returns ManagedObjectReference o
+    ManagedObjectReference                   _this:SearchIndex              r
+    ManagedObjectReference                   datacenter                     o
+    String                                   uuid                           r
+    Boolean                                  vmSearch                       r
+end
+
+
+method Login returns UserSession r
+    ManagedObjectReference                   _this:SessionManager           r
+    String                                   userName                       r
+    String                                   password                       r
+    String                                   locale                         o
+end
+
+
+method Logout
+    ManagedObjectReference                   _this:SessionManager           r
+end
+
+
+method MigrateVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    ManagedObjectReference                   pool                           o
+    ManagedObjectReference                   host                           o
+    VirtualMachineMovePriority               priority                       r
+    VirtualMachinePowerState                 state                          o
+end
+
+
+method PowerOffVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+end
+
+
+method PowerOnVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    ManagedObjectReference                   host                           o
+end
+
+
+method QueryAvailablePerfMetric returns PerfMetricId ol
+    ManagedObjectReference                   _this:PerformanceManager       r
+    ManagedObjectReference                   entity                         r
+    DateTime                                 beginTime                      o
+    DateTime                                 endTime                        o
+    Int                                      intervalId                     o
+end
+
+
+method QueryPerf returns PerfEntityMetricBase ol
+    ManagedObjectReference                   _this:PerformanceManager       r
+    PerfQuerySpec                            querySpec                      rl
+end
+
+
+method QueryPerfCounter returns PerfCounterInfo ol
+    ManagedObjectReference                   _this:PerformanceManager       r
+    Int                                      counterId                      rl
+end
+
+
+method RebootGuest
+    ManagedObjectReference                   _this                          r
+end
+
+
+method ReconfigVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    VirtualMachineConfigSpec                 spec                           r
+end
+
+
+method RegisterVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    String                                   path                           r
+    String                                   name                           o
+    Boolean                                  asTemplate                     r
+    ManagedObjectReference                   pool                           o
+    ManagedObjectReference                   host                           o
+end
+
+
+method RemoveSnapshot_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    Boolean                                  removeChildren                 r
+end
+
+
+method RetrieveProperties returns ObjectContent ol
+    ManagedObjectReference                   _this:PropertyCollector        r
+    PropertyFilterSpec                       specSet                        rl
+end
+
+
+method RevertToSnapshot_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+    ManagedObjectReference                   host                           o
+end
+
+
+method SessionIsActive returns Boolean r
+    ManagedObjectReference                   _this:SessionManager           r
+    String                                   sessionID                      r
+    String                                   userName                       r
+end
+
+
+method ShutdownGuest
+    ManagedObjectReference                   _this                          r
+end
+
+
+method SuspendVM_Task returns ManagedObjectReference r
+    ManagedObjectReference                   _this                          r
+end
+
+
+method UnregisterVM
+    ManagedObjectReference                   _this                          r
+end
+
+
+method WaitForUpdates returns UpdateSet r
+    ManagedObjectReference                   _this:PropertyCollector        r
+    String                                   version                        o
+end
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index b933d5b..272b219 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -27,34 +27,247 @@ import os.path
 
 
 
+OCCURRENCE__REQUIRED_ITEM = "r"
+OCCURRENCE__REQUIRED_LIST = "rl"
+OCCURRENCE__OPTIONAL_ITEM = "o"
+OCCURRENCE__OPTIONAL_LIST = "ol"
+OCCURRENCE__IGNORED = "i"
 
+valid_occurrences = [OCCURRENCE__REQUIRED_ITEM,
+                     OCCURRENCE__REQUIRED_LIST,
+                     OCCURRENCE__OPTIONAL_ITEM,
+                     OCCURRENCE__OPTIONAL_LIST,
+                     OCCURRENCE__IGNORED]
 
-class Property:
-    OCCURRENCE__REQUIRED_ITEM = "r"
-    OCCURRENCE__REQUIRED_LIST = "rl"
-    OCCURRENCE__OPTIONAL_ITEM = "o"
-    OCCURRENCE__OPTIONAL_LIST = "ol"
-    OCCURRENCE__IGNORED = "i"
-
-    valid_occurrences = [OCCURRENCE__REQUIRED_ITEM,
-                         OCCURRENCE__REQUIRED_LIST,
-                         OCCURRENCE__OPTIONAL_ITEM,
-                         OCCURRENCE__OPTIONAL_LIST,
-                         OCCURRENCE__IGNORED]
+
+
+
+
+
+class Parameter:
+    autobind_map = { "PerformanceManager" : "perfManager",
+                     "PropertyCollector"  : "propertyCollector",
+                     "SearchIndex"        : "searchIndex",
+                     "SessionManager"     : "sessionManager" }
 
     def __init__(self, type, name, occurrence):
         self.type = type
+        self.occurrence = occurrence
+
+        if ':' in name and name.startswith("_this"):
+            self.name, self.autobind_type = name.split(":")
+        else:
+            self.name = name
+            self.autobind_type = None
+
+
+    def is_enum(self):
+        global predefined_enums
+        global enums_by_name
+
+        return self.type in predefined_enums or self.type in enums_by_name
+
+
+    def generate_paramater(self, is_last = False, is_header = True, offset = 0):
+        if self.occurrence == OCCURRENCE__IGNORED:
+            raise ValueError("invalid function parameter occurrence value '%s'" % self.occurrence)
+        elif self.autobind_type is not None:
+            return ""
+        else:
+            string = "       "
+            string += " " * offset
+            string += "%s%s" % (self.get_type_string(), self.name)
+
+            if is_last:
+                if is_header:
+                    string += "); "
+                else:
+                    string += "), "
+            else:
+                string += ", "
+
+            while len(string) < 59:
+                string += " "
+
+            return string + self.get_occurrence_comment() + "\n"
+
+
+    def generate_return(self, offset = 0, end_of_line = ";"):
+        if self.occurrence == OCCURRENCE__IGNORED:
+            raise ValueError("invalid function parameteroccurrence value '%s'" % self.occurrence)
+        else:
+            string = "       "
+            string += " " * offset
+            string += "%s*%s)%s" % (self.get_type_string(), self.name, end_of_line)
+
+            while len(string) < 59:
+                string += " "
+
+            return string + self.get_occurrence_comment() + "\n"
+
+
+    def generate_require_code(self):
+        if self.occurrence in [OCCURRENCE__REQUIRED_ITEM,
+                               OCCURRENCE__REQUIRED_LIST]:
+            return "    ESX_VI__METHOD__PARAMETER__REQUIRE(%s)\n" % self.name
+        else:
+            return ""
+
+
+    def generate_serialize_code(self):
+        if self.occurrence in [OCCURRENCE__REQUIRED_LIST,
+                               OCCURRENCE__OPTIONAL_LIST]:
+            return "    ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(%s, %s)\n" % (self.type, self.name)
+        elif self.type == "String":
+            return "    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, %s)\n" % self.name
+        else:
+            return "    ESX_VI__METHOD__PARAMETER__SERIALIZE(%s, %s)\n" % (self.type, self.name)
+
+
+    def get_type_string(self):
+        if self.type == "String" and \
+           self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
+                                   OCCURRENCE__OPTIONAL_LIST]:
+            return "const char *"
+        elif self.is_enum():
+            return "esxVI_%s " % self.type
+        else:
+            return "esxVI_%s *" % self.type
+
+
+    def get_occurrence_comment(self):
+        if self.occurrence == OCCURRENCE__REQUIRED_ITEM:
+            return "/* required */"
+        elif self.occurrence == OCCURRENCE__REQUIRED_LIST:
+            return "/* required, list */"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_ITEM:
+            return "/* optional */"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            return "/* optional, list */"
+
+        raise ValueError("unknown occurrence value '%s'" % self.occurrence)
+
+
+    def get_occurrence_short_enum(self):
+        if self.occurrence == OCCURRENCE__REQUIRED_ITEM:
+            return "RequiredItem"
+        elif self.occurrence == OCCURRENCE__REQUIRED_LIST:
+            return "RequiredList"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_ITEM:
+            return "OptionalItem"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            return "OptionalList"
+
+        raise ValueError("unknown occurrence value '%s'" % self.occurrence)
+
+
+
+class Method:
+    def __init__(self, name, parameters, returns):
+        self.name = name
+        self.parameters = []
+        self.autobind_parameter = None
+        self.returns = returns
+
+        for parameter in parameters:
+            if parameter.autobind_type is None:
+                self.parameters.append(parameter)
+            else:
+                self.autobind_parameter = parameter
+
+
+    def generate_header(self):
+        header = "int esxVI_%s\n" % self.name
+        header += "      (esxVI_Context *ctx"
+
+        if len(self.parameters) > 0 or self.returns is not None:
+            header += ",\n"
+
+            for parameter in self.parameters[:-1]:
+                header += parameter.generate_paramater()
+
+            if self.returns is None:
+                header += self.parameters[-1].generate_paramater(is_last = True)
+            else:
+                header += self.parameters[-1].generate_paramater()
+                header += self.returns.generate_return()
+        else:
+            header += ");\n"
+
+        header += "\n"
+
+        return header
+
+
+    def generate_source(self):
+        source = "/* esxVI_%s */\n" % self.name
+        source += "ESX_VI__METHOD(%s," % self.name
+
+        if self.autobind_parameter is not None:
+            source += " %s,\n" % Parameter.autobind_map[self.autobind_parameter.autobind_type]
+        else:
+            source += " /* explicit _this */,\n"
+
+        source += "               (esxVI_Context *ctx"
+
+        if len(self.parameters) > 0 or self.returns is not None:
+            source += ",\n"
+
+            for parameter in self.parameters[:-1]:
+                source += parameter.generate_paramater(is_header = False, offset = 9)
+
+            if self.returns is None:
+                source += self.parameters[-1].generate_paramater(is_last = True, is_header = False, offset = 9)
+            else:
+                source += self.parameters[-1].generate_paramater(is_header = False, offset = 9)
+                source += self.returns.generate_return(offset = 9, end_of_line = ",")
+        else:
+            source += "),\n"
+
+        if self.returns is None:
+            source += "               void, None,\n"
+        else:
+            source += "               %s, %s,\n" % (self.returns.type, self.returns.get_occurrence_short_enum())
+
+        source += "{\n"
+
+        if self.autobind_parameter is not None:
+            source += self.autobind_parameter.generate_require_code()
+
+        for parameter in self.parameters:
+            source += parameter.generate_require_code()
+
+        source += "},\n"
+        source += "{\n"
+
+        if self.autobind_parameter is not None:
+            source += self.autobind_parameter.generate_serialize_code()
+
+        for parameter in self.parameters:
+            source += parameter.generate_serialize_code()
+
+        source += "})\n\n\n\n"
+
+        return source
+
+
+
+class Property:
+    def __init__(self, type, name, occurrence):
+        self.type = type
         self.name = name
         self.occurrence = occurrence
 
+
     def is_enum(self):
         global predefined_enums
         global enums_by_name
 
         return self.type in predefined_enums or self.type in enums_by_name
 
+
     def generate_struct_member(self):
-        if self.occurrence == Property.OCCURRENCE__IGNORED:
+        if self.occurrence == OCCURRENCE__IGNORED:
             return "    /* FIXME: %s is currently ignored */\n" % self.name
         else:
             string = "    %s%s; " % (self.get_type_string(), self.name)
@@ -62,36 +275,39 @@ class Property:
             while len(string) < 59:
                 string += " "
 
-            return string + "/* %s */\n" % self.get_occurrence_string()
+            return string + self.get_occurrence_comment() + "\n"
+
 
     def generate_free_code(self):
         if self.type == "String" and \
-           self.occurrence not in [Property.OCCURRENCE__REQUIRED_LIST,
-                                   Property.OCCURRENCE__OPTIONAL_LIST,
-                                   Property.OCCURRENCE__IGNORED]:
+           self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
+                                   OCCURRENCE__OPTIONAL_LIST,
+                                   OCCURRENCE__IGNORED]:
             return "    VIR_FREE(item->%s);\n" % self.name
         elif self.is_enum():
             return ""
         else:
-            if self.occurrence == Property.OCCURRENCE__IGNORED:
+            if self.occurrence == OCCURRENCE__IGNORED:
                 return "    /* FIXME: %s is currently ignored */\n" % self.name
             else:
                 return "    esxVI_%s_Free(&item->%s);\n" % (self.type, self.name)
 
+
     def generate_validate_code(self):
-        if self.occurrence in [Property.OCCURRENCE__REQUIRED_ITEM,
-                               Property.OCCURRENCE__REQUIRED_LIST]:
+        if self.occurrence in [OCCURRENCE__REQUIRED_ITEM,
+                               OCCURRENCE__REQUIRED_LIST]:
             return "    ESX_VI__TEMPLATE__PROPERTY__REQUIRE(%s)\n" % self.name
-        elif self.occurrence == Property.OCCURRENCE__IGNORED:
+        elif self.occurrence == OCCURRENCE__IGNORED:
             return "    /* FIXME: %s is currently ignored */\n" % self.name
         else:
             return ""
 
+
     def generate_deep_copy_code(self):
-        if self.occurrence == Property.OCCURRENCE__IGNORED:
+        if self.occurrence == OCCURRENCE__IGNORED:
             return "    /* FIXME: %s is currently ignored */\n" % self.name
-        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
-                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+        elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,
+                                 OCCURRENCE__OPTIONAL_LIST]:
             return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_LIST(%s, %s)\n" % (self.type, self.name)
         elif self.type == "String":
             return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY_VALUE(String, %s)\n" % self.name
@@ -100,54 +316,53 @@ class Property:
         else:
             return "    ESX_VI__TEMPLATE__PROPERTY__DEEP_COPY(%s, %s)\n" % (self.type, self.name)
 
+
     def generate_serialize_code(self):
-        if self.occurrence == Property.OCCURRENCE__IGNORED:
+        if self.occurrence == OCCURRENCE__IGNORED:
             return "    /* FIXME: %s is currently ignored */\n" % self.name
-        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
-                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+        elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,
+                                 OCCURRENCE__OPTIONAL_LIST]:
             return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_LIST(%s, %s)\n" % (self.type, self.name)
         elif self.type == "String":
             return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE_VALUE(String, %s)\n" % self.name
         else:
             return "    ESX_VI__TEMPLATE__PROPERTY__SERIALIZE(%s, %s)\n" % (self.type, self.name)
 
+
     def generate_deserialize_code(self):
-        if self.occurrence == Property.OCCURRENCE__IGNORED:
+        if self.occurrence == OCCURRENCE__IGNORED:
             return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_IGNORE(%s) /* FIXME */\n" % self.name
-        elif self.occurrence in [Property.OCCURRENCE__REQUIRED_LIST,
-                                 Property.OCCURRENCE__OPTIONAL_LIST]:
+        elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,
+                                 OCCURRENCE__OPTIONAL_LIST]:
             return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_LIST(%s, %s)\n" % (self.type, self.name)
         elif self.type == "String":
             return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE_VALUE(String, %s)\n" % self.name
         else:
             return "    ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(%s, %s)\n" % (self.type, self.name)
 
+
     def get_type_string(self):
         if self.type == "String" and \
-           self.occurrence not in [Property.OCCURRENCE__REQUIRED_LIST,
-                                   Property.OCCURRENCE__OPTIONAL_LIST]:
+           self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
+                                   OCCURRENCE__OPTIONAL_LIST]:
             return "char *"
         elif self.is_enum():
             return "esxVI_%s " % self.type
         else:
             return "esxVI_%s *" % self.type
 
-    def get_occurrence_string(self):
-        if self.occurrence == Property.OCCURRENCE__REQUIRED_ITEM:
-            return "required"
-        elif self.occurrence == Property.OCCURRENCE__REQUIRED_LIST:
-            return "required, list"
-        elif self.occurrence == Property.OCCURRENCE__OPTIONAL_ITEM:
-            return "optional"
-        elif self.occurrence == Property.OCCURRENCE__OPTIONAL_LIST:
-            return "optional, list"
-
-        raise ValueError("unknown cardinality value '%s'" % self.cardinality)
-
-
-
 
+    def get_occurrence_comment(self):
+        if self.occurrence == OCCURRENCE__REQUIRED_ITEM:
+            return "/* required */"
+        elif self.occurrence == OCCURRENCE__REQUIRED_LIST:
+            return "/* required, list */"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_ITEM:
+            return "/* optional */"
+        elif self.occurrence == OCCURRENCE__OPTIONAL_LIST:
+            return "/* optional, list */"
 
+        raise ValueError("unknown occurrence value '%s'" % self.occurrence)
 
 
 
@@ -159,6 +374,7 @@ class Object:
     FEATURE__SERIALIZE    = (1 << 5)
     FEATURE__DESERIALIZE  = (1 << 6)
 
+
     def __init__(self, name, extends, properties, features = 0, extended_by = None):
         self.name = name
         self.extends = extends
@@ -166,10 +382,6 @@ class Object:
         self.properties = properties
         self.extended_by = extended_by
 
-        self.properties_by_name = {}
-
-        for property in self.properties:
-            self.properties_by_name[property.name] = property
 
     def generate_struct_members(self, add_banner = False, struct_gap = False):
         global objects_by_name
@@ -201,6 +413,7 @@ class Object:
 
         return members
 
+
     def generate_free_code(self, add_banner = False):
         global objects_by_name
         source = ""
@@ -226,6 +439,7 @@ class Object:
 
         return source
 
+
     def generate_validate_code(self, add_banner = False):
         global objects_by_name
         source = ""
@@ -251,6 +465,7 @@ class Object:
 
         return source
 
+
     def generate_dynamic_cast_code(self):
         global objects_by_name
         source = ""
@@ -266,6 +481,7 @@ class Object:
 
         return source
 
+
     def generate_deep_copy_code(self, add_banner = False):
         global objects_by_name
         source = ""
@@ -291,6 +507,7 @@ class Object:
 
         return source
 
+
     def generate_serialize_code(self, add_banner = False):
         global objects_by_name
         source = ""
@@ -309,6 +526,7 @@ class Object:
 
         return source
 
+
     def generate_deserialize_code(self, add_banner = False):
         global objects_by_name
         source = ""
@@ -327,18 +545,22 @@ class Object:
 
         return source
 
+
     def generate_typedef(self):
         return "typedef struct _esxVI_%s esxVI_%s;\n" % (self.name, self.name)
 
+
     def generate_typeenum(self):
         return "    esxVI_Type_%s,\n" % self.name
 
+
     def generate_typetostring(self):
         string = "          case esxVI_Type_%s:\n" % self.name
         string += "            return \"%s\";\n\n" % self.name
 
         return string
 
+
     def generate_typefromstring(self):
         string =  "           else if (STREQ(type, \"%s\")) {\n" % self.name
         string += "               return esxVI_Type_%s;\n" % self.name
@@ -346,6 +568,7 @@ class Object:
 
         return string
 
+
     def generate_header(self):
         header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
         header += " * VI Type: %s\n" % self.name
@@ -424,6 +647,7 @@ class Object:
 
         return header
 
+
     def generate_source(self):
         source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
         source += " * VI Type: %s\n" % self.name
@@ -601,11 +825,6 @@ class Object:
 
 
 
-
-
-
-
-
 class Enum:
     FEATURE__ANY_TYPE = (1 << 1)
     FEATURE__SERIALIZE = (1 << 2)
@@ -617,18 +836,22 @@ class Enum:
         self.values = values
         self.features = features | Enum.FEATURE__SERIALIZE | Enum.FEATURE__DESERIALIZE
 
+
     def generate_typedef(self):
         return "typedef enum _esxVI_%s esxVI_%s;\n" % (self.name, self.name)
 
+
     def generate_typeenum(self):
         return "    esxVI_Type_%s,\n" % self.name
 
+
     def generate_typetostring(self):
         string = "          case esxVI_Type_%s:\n" % self.name
         string += "            return \"%s\";\n\n" % self.name
 
         return string
 
+
     def generate_typefromstring(self):
         string =  "           else if (STREQ(type, \"%s\")) {\n" % self.name
         string += "               return esxVI_Type_%s;\n" % self.name
@@ -636,6 +859,7 @@ class Enum:
 
         return string
 
+
     def generate_header(self):
         header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
         header += " * VI Enum: %s\n" % self.name
@@ -664,6 +888,7 @@ class Enum:
 
         return header
 
+
     def generate_source(self):
         source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
         source += " * VI Enum: %s\n" % self.name
@@ -698,20 +923,12 @@ class Enum:
 
 
 
-
-
 def report_error(message):
     print "error: " + message
     sys.exit(1)
 
 
 
-def usage():
-    print "%s <input-filename> <output-directory>" % sys.argv[0]
-    sys.exit(0)
-
-
-
 def capitalize_first(string):
     return string[:1].upper() + string[1:]
 
@@ -744,7 +961,7 @@ def parse_object(block):
         if len(items) != 3:
             report_error("line %d: invalid property" % line[0])
 
-        if items[2] not in Property.valid_occurrences:
+        if items[2] not in valid_occurrences:
             report_error("line %d: invalid occurrence" % line[0])
 
         properties.append(Property(type = items[0], name = items[1],
@@ -775,6 +992,44 @@ def parse_enum(block):
 
 
 
+def parse_method(block):
+    # expected format: method <name> [returns <type> <occurrence>]
+    header_items = block[0][1].split()
+
+    if len(header_items) < 2:
+        report_error("line %d: invalid block header" % (number))
+
+    assert header_items[0] == "method"
+
+    name = header_items[1]
+    returns = None
+
+    if len(header_items) > 2:
+        if header_items[2] != "returns":
+            report_error("line %d: invalid block header" % (number))
+        else:
+            returns = Parameter(type = header_items[3], name = "output",
+                                occurrence = header_items[4])
+
+    parameters = []
+
+    for line in block[1:]:
+        # expected format: <type> <name> <occurrence>
+        items = line[1].split()
+
+        if len(items) != 3:
+            report_error("line %d: invalid property" % line[0])
+
+        if items[2] not in valid_occurrences:
+            report_error("line %d: invalid occurrence" % line[0])
+
+        parameters.append(Parameter(type = items[0], name = items[1],
+                                    occurrence = items[2]))
+
+    return Method(name = name, parameters = parameters, returns = returns)
+
+
+
 def inherit_features(obj):
     if obj.extended_by is not None:
         for extended_by in obj.extended_by:
@@ -834,7 +1089,7 @@ additional_object_features = { "Event"                      : Object.FEATURE__LI
                                "ManagedObjectReference"     : Object.FEATURE__ANY_TYPE,
                                "ObjectContent"              : Object.FEATURE__DEEP_COPY | Object.FEATURE__LIST,
                                "PerfCounterInfo"            : Object.FEATURE__LIST,
-                               "PerfEntityMetric"           : Object.FEATURE__LIST,
+                               "PerfEntityMetric"           : Object.FEATURE__LIST |  Object.FEATURE__DYNAMIC_CAST,
                                "PerfQuerySpec"              : Object.FEATURE__LIST,
                                "PerfMetricIntSeries"        : Object.FEATURE__DYNAMIC_CAST,
                                "PropertyFilterSpec"         : Object.FEATURE__LIST,
@@ -859,7 +1114,6 @@ removed_object_features = { "DynamicProperty"            : Object.FEATURE__SERIA
 
 
 
-
 if "srcdir" in os.environ:
     input_filename = os.path.join(os.environ["srcdir"], "esx/esx_vi_generator.input")
     output_dirname = os.path.join(os.environ["srcdir"], "esx")
@@ -869,18 +1123,21 @@ else:
 
 
 
-typedef = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
-typeenum = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
-typetostring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
-typefromstring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
-header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.h"))
-source = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.c"))
+types_typedef = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
+types_typeenum = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
+types_typetostring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
+types_typefromstring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
+types_header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.h"))
+types_source = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.c"))
+methods_header = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.h"))
+methods_source = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
 
 
 
 number = 0
 objects_by_name = {}
 enums_by_name = {}
+methods_by_name = {}
 block = None
 
 
@@ -896,7 +1153,7 @@ for line in file(input_filename, "rb").readlines():
     if len(line) < 1:
         continue
 
-    if line.startswith("object") or line.startswith("enum"):
+    if line.startswith("object") or line.startswith("enum") or line.startswith("method"):
         if block is not None:
             report_error("line %d: nested block found" % (number))
         else:
@@ -907,9 +1164,12 @@ for line in file(input_filename, "rb").readlines():
             if block[0][1].startswith("object"):
                 obj = parse_object(block)
                 objects_by_name[obj.name] = obj
-            else:
+            elif block[0][1].startswith("enum"):
                 enum = parse_enum(block)
                 enums_by_name[enum.name] = enum
+            else:
+                method = parse_method(block)
+                methods_by_name[method.name] = method
 
             block = None
         else:
@@ -926,7 +1186,7 @@ for enum in enums_by_name.values():
 
 for obj in objects_by_name.values():
     for property in obj.properties:
-        if property.occurrence != Property.OCCURRENCE__IGNORED and \
+        if property.occurrence != OCCURRENCE__IGNORED and \
            not is_known_type(property.type):
             report_error("object '%s' contains unknown property type '%s'" % (obj.name, property.type))
 
@@ -936,8 +1196,8 @@ for obj in objects_by_name.values():
 
     # detect list usage
     for property in obj.properties:
-        if (property.occurrence == Property.OCCURRENCE__REQUIRED_LIST or \
-            property.occurrence == Property.OCCURRENCE__OPTIONAL_LIST) and \
+        if (property.occurrence == OCCURRENCE__REQUIRED_LIST or \
+            property.occurrence == OCCURRENCE__OPTIONAL_LIST) and \
            property.type not in predefined_objects:
             objects_by_name[property.type].features |= Object.FEATURE__LIST
 
@@ -951,7 +1211,7 @@ for obj in objects_by_name.values():
     # spread deep copy onto properties
     if obj.features & Object.FEATURE__DEEP_COPY:
         for property in obj.properties:
-            if property.occurrence != Property.OCCURRENCE__IGNORED and \
+            if property.occurrence != OCCURRENCE__IGNORED and \
                property.type not in predefined_objects and \
                property.type in objects_by_name:
                 objects_by_name[property.type].features |= Object.FEATURE__DEEP_COPY
@@ -976,55 +1236,62 @@ for obj in objects_by_name.values():
 
 
 
-typedef.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
-typeenum.write("/* Generated by esx_vi_generator.py */\n\n")
-typetostring.write("/* Generated by esx_vi_generator.py */\n\n")
-typefromstring.write("/* Generated by esx_vi_generator.py */\n\n")
-header.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
-source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
-
-
-typedef.write("/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
-              " * VI Enums\n" +
-              " */\n\n")
+types_typedef.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+types_typeenum.write("/* Generated by esx_vi_generator.py */\n\n")
+types_typetostring.write("/* Generated by esx_vi_generator.py */\n\n")
+types_typefromstring.write("/* Generated by esx_vi_generator.py */\n\n")
+types_header.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+types_source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+methods_header.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
+methods_source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
 
 
+# output enums
+types_typedef.write("/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
+                    " * VI Enums\n" +
+                    " */\n\n")
 
 names = enums_by_name.keys()
 names.sort()
 
-
 for name in names:
-    typedef.write(enums_by_name[name].generate_typedef())
-    typeenum.write(enums_by_name[name].generate_typeenum())
-    typetostring.write(enums_by_name[name].generate_typetostring())
-    typefromstring.write(enums_by_name[name].generate_typefromstring())
-    header.write(enums_by_name[name].generate_header())
-    source.write(enums_by_name[name].generate_source())
+    types_typedef.write(enums_by_name[name].generate_typedef())
+    types_typeenum.write(enums_by_name[name].generate_typeenum())
+    types_typetostring.write(enums_by_name[name].generate_typetostring())
+    types_typefromstring.write(enums_by_name[name].generate_typefromstring())
+    types_header.write(enums_by_name[name].generate_header())
+    types_source.write(enums_by_name[name].generate_source())
 
 
 
-typedef.write("\n\n\n" +
-              "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
-              " * VI Types\n" +
-              " */\n\n")
+# output objects
+types_typedef.write("\n\n\n" +
+                    "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
+                    " * VI Types\n" +
+                    " */\n\n")
+types_typeenum.write("\n")
+types_typetostring.write("\n")
+types_typefromstring.write("\n")
 
-typeenum.write("\n")
 
-typetostring.write("\n")
 
-typefromstring.write("\n")
+names = objects_by_name.keys()
+names.sort()
 
+for name in names:
+    types_typedef.write(objects_by_name[name].generate_typedef())
+    types_typeenum.write(objects_by_name[name].generate_typeenum())
+    types_typetostring.write(objects_by_name[name].generate_typetostring())
+    types_typefromstring.write(objects_by_name[name].generate_typefromstring())
+    types_header.write(objects_by_name[name].generate_header())
+    types_source.write(objects_by_name[name].generate_source())
 
 
-names = objects_by_name.keys()
-names.sort()
 
+# output methods
+names = methods_by_name.keys()
+names.sort()
 
 for name in names:
-    typedef.write(objects_by_name[name].generate_typedef())
-    typeenum.write(objects_by_name[name].generate_typeenum())
-    typetostring.write(objects_by_name[name].generate_typetostring())
-    typefromstring.write(objects_by_name[name].generate_typefromstring())
-    header.write(objects_by_name[name].generate_header())
-    source.write(objects_by_name[name].generate_source())
+    methods_header.write(methods_by_name[name].generate_header())
+    methods_source.write(methods_by_name[name].generate_source())
diff --git a/src/esx/esx_vi_methods.c b/src/esx/esx_vi_methods.c
index b2b3e8d..5c52167 100644
--- a/src/esx/esx_vi_methods.c
+++ b/src/esx/esx_vi_methods.c
@@ -51,18 +51,88 @@
 
 
 
-#define ESX_VI__METHOD(_name, _parameters, _occurrence, _prolog, _validate,   \
-                       _serialize, _deserialize)                              \
+#define ESX_VI__METHOD__CHECK_OUTPUT__None                                    \
+    /* nothing */
+
+
+
+#define ESX_VI__METHOD__CHECK_OUTPUT__NotNone                                 \
+    if (output == NULL || *output != 0) {                                     \
+        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));    \
+        return -1;                                                            \
+    }
+
+
+
+#define ESX_VI__METHOD__CHECK_OUTPUT__RequiredItem                            \
+    ESX_VI__METHOD__CHECK_OUTPUT__NotNone
+
+
+
+#define ESX_VI__METHOD__CHECK_OUTPUT__RequiredList                            \
+    ESX_VI__METHOD__CHECK_OUTPUT__NotNone
+
+
+
+#define ESX_VI__METHOD__CHECK_OUTPUT__OptionalItem                            \
+    ESX_VI__METHOD__CHECK_OUTPUT__NotNone
+
+
+
+#define ESX_VI__METHOD__CHECK_OUTPUT__OptionalList                            \
+    ESX_VI__METHOD__CHECK_OUTPUT__NotNone
+
+
+
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__None(_type)                       \
+    /* nothing */
+
+
+
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredItem(_type)               \
+    if (esxVI_##_type##_Deserialize(response->node, output) < 0) {            \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__RequiredList(_type)               \
+    if (esxVI_##_type##_DeserializeList(response->node, output) < 0) {        \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalItem(_type)               \
+    if (response->node != NULL &&                                             \
+        esxVI_##_type##_Deserialize(response->node, output) < 0) {            \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__METHOD__DESERIALIZE_OUTPUT__OptionalList(_type)               \
+    if (response->node != NULL &&                                             \
+        esxVI_##_type##_DeserializeList(response->node, output) < 0) {        \
+        goto failure;                                                         \
+    }
+
+
+
+#define ESX_VI__METHOD(_name, _this_from_service, _parameters, _output_type,  \
+                       _occurrence, _validate, _serialize)                    \
     int                                                                       \
     esxVI_##_name _parameters                                                 \
     {                                                                         \
         int result = 0;                                                       \
-        const char* method_name = #_name;                                     \
+        const char *methodName = #_name;                                      \
         virBuffer buffer = VIR_BUFFER_INITIALIZER;                            \
         char *request = NULL;                                                 \
         esxVI_Response *response = NULL;                                      \
                                                                               \
-        _prolog                                                               \
+        ESX_VI__METHOD__PARAMETER__THIS__##_this_from_service                 \
+                                                                              \
+        ESX_VI__METHOD__CHECK_OUTPUT__##_occurrence                           \
                                                                               \
         _validate                                                             \
                                                                               \
@@ -81,14 +151,12 @@
                                                                               \
         request = virBufferContentAndReset(&buffer);                          \
                                                                               \
-        if (esxVI_Context_Execute(ctx, #_name, request, &response,            \
+        if (esxVI_Context_Execute(ctx, methodName, request, &response,        \
                                   esxVI_Occurrence_##_occurrence) < 0) {      \
             goto failure;                                                     \
         }                                                                     \
                                                                               \
-        if (response->node != NULL) {                                         \
-            _deserialize                                                      \
-        }                                                                     \
+        ESX_VI__METHOD__DESERIALIZE_OUTPUT__##_occurrence(_output_type)       \
                                                                               \
       cleanup:                                                                \
         VIR_FREE(request);                                                    \
@@ -106,19 +174,44 @@
 
 
 
-#define ESX_VI__METHOD__CHECK_SERVICE()                                       \
+#define ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(_type, _name)            \
+    esxVI_##_type *_this = NULL;                                              \
+                                                                              \
     if (ctx->service == NULL) {                                               \
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid call"));        \
         return -1;                                                            \
-    }
+    }                                                                         \
+                                                                              \
+    _this = ctx->service->_name;
 
 
 
-#define ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(_name)                        \
-    if (_name == NULL || *_name != NULL) {                                    \
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));    \
-        return -1;                                                            \
-    }
+#define ESX_VI__METHOD__PARAMETER__THIS__/* explicit _this */                 \
+    /* nothing */
+
+
+
+#define ESX_VI__METHOD__PARAMETER__THIS__perfManager                          \
+    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \
+                                                 perfManager)
+
+
+
+#define ESX_VI__METHOD__PARAMETER__THIS__propertyCollector                    \
+    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \
+                                                 propertyCollector)
+
+
+
+#define ESX_VI__METHOD__PARAMETER__THIS__searchIndex                          \
+    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \
+                                                 searchIndex)
+
+
+
+#define ESX_VI__METHOD__PARAMETER__THIS__sessionManager                       \
+    ESX_VI__METHOD__PARAMETER__THIS_FROM_SERVICE(ManagedObjectReference,      \
+                                                 sessionManager)
 
 
 
@@ -132,17 +225,7 @@
     if (_name == 0) {                                                         \
         ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,                                  \
                      "Required parameter '%s' is missing for call to %s",     \
-                     #_name, method_name);                                    \
-        return -1;                                                            \
-    }
-
-
-
-#define ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(_name)                        \
-    if (_name == 0) {                                                         \
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR,                                  \
-                     "Required parameter '_this' is missing for call to %s",  \
-                     method_name);                                            \
+                     #_name, methodName);                                     \
         return -1;                                                            \
     }
 
@@ -169,13 +252,6 @@
 
 
 
-#define ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(_type, _name)               \
-    if (esxVI_##_type##_Serialize(_name, "_this", &buffer) < 0) {             \
-        goto failure;                                                         \
-    }
-
-
-
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * VI Methods
  */
@@ -220,553 +296,16 @@ esxVI_RetrieveServiceContent(esxVI_Context *ctx,
 
 
 
-/* esxVI_Login */
-ESX_VI__METHOD(Login,
-               (esxVI_Context *ctx,
-                const char *userName, const char *password,
-                esxVI_UserSession **userSession),
-               RequiredItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(userSession)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->sessionManager)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(userName)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(password)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->sessionManager)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, userName)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, password)
-},
-{
-    if (esxVI_UserSession_Deserialize(response->node, userSession) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_Logout */
-ESX_VI__METHOD(Logout, (esxVI_Context *ctx), None,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->sessionManager)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->sessionManager)
-},
-{
-})
-
-
-
-/* esxVI_SessionIsActive */
-ESX_VI__METHOD(SessionIsActive,
-               (esxVI_Context *ctx, const char *sessionID,
-                const char *userName, esxVI_Boolean *active),
-               RequiredItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-
-    if (active == NULL) {
-        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
-        return -1;
-    }
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->sessionManager)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(sessionID)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(userName)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->sessionManager)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, sessionID)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, userName)
-},
-{
-    if (esxVI_Boolean_Deserialize(response->node, active) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_RetrieveProperties */
-ESX_VI__METHOD(RetrieveProperties,
-               (esxVI_Context *ctx,
-                esxVI_PropertyFilterSpec *specSet, /* list */
-                esxVI_ObjectContent **objectContentList),
-               OptionalList,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(objectContentList)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(specSet)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(PropertyFilterSpec, specSet)
-},
-{
-    if (esxVI_ObjectContent_DeserializeList(response->node,
-                                            objectContentList) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_PowerOnVM_Task */
-ESX_VI__METHOD(PowerOnVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_PowerOffVM_Task */
-ESX_VI__METHOD(PowerOffVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_SuspendVM_Task */
-ESX_VI__METHOD(SuspendVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_MigrateVM_Task */
-ESX_VI__METHOD(MigrateVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                esxVI_ManagedObjectReference *pool,
-                esxVI_ManagedObjectReference *host,
-                esxVI_VirtualMachineMovePriority priority,
-                esxVI_VirtualMachinePowerState state,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(priority)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, pool)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, host)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(VirtualMachineMovePriority, priority)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(VirtualMachinePowerState, state)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_ReconfigVM_Task */
-ESX_VI__METHOD(ReconfigVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                esxVI_VirtualMachineConfigSpec *spec,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(spec)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(VirtualMachineConfigSpec, spec)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_RegisterVM_Task */
-ESX_VI__METHOD(RegisterVM_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *folder,
-                const char *path, const char *name,
-                esxVI_Boolean asTemplate,
-                esxVI_ManagedObjectReference *pool,
-                esxVI_ManagedObjectReference *host,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(folder)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(path)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference, folder)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, path)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, name)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, asTemplate)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, pool)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, host)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_CreateSnapshot_Task */
-ESX_VI__METHOD(CreateSnapshot_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                const char *name, const char *description,
-                esxVI_Boolean memory, esxVI_Boolean quiesce,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(name)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(memory)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(quiesce)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, name)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, description)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, memory)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, quiesce)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_RevertToSnapshot_Task */
-ESX_VI__METHOD(RevertToSnapshot_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachineSnapshot,
-                esxVI_ManagedObjectReference *host,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachineSnapshot)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachineSnapshot)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, host)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_RemoveSnapshot_Task */
-ESX_VI__METHOD(RemoveSnapshot_Task,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachineSnapshot,
-                esxVI_Boolean removeChildren,
-                esxVI_ManagedObjectReference **task),
-               RequiredItem,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachineSnapshot)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(removeChildren)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachineSnapshot)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, removeChildren)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node, task) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_CancelTask */
-ESX_VI__METHOD(CancelTask,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *task),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(task)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference, task)
-},
-{
-})
-
-
-
-/* esxVI_UnregisterVM */
-ESX_VI__METHOD(UnregisterVM,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-})
-
-
-
-/* esxVI_AnswerVM */
-ESX_VI__METHOD(AnswerVM,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine,
-                const char *questionId,
-                const char *answerChoice),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(questionId)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(answerChoice)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, questionId)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, answerChoice)
-},
-{
-})
-
-
-
-/* esxVI_CreateFilter */
-ESX_VI__METHOD(CreateFilter,
-               (esxVI_Context *ctx,
-                esxVI_PropertyFilterSpec *spec,
-                esxVI_Boolean partialUpdates,
-                esxVI_ManagedObjectReference **propertyFilter),
-               RequiredItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(propertyFilter)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(spec)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(partialUpdates)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(PropertyFilterSpec, spec)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, partialUpdates)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node,
-                                                 propertyFilter) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_DestroyPropertyFilter */
-ESX_VI__METHOD(DestroyPropertyFilter,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *propertyFilter),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(propertyFilter)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              propertyFilter)
-},
-{
-})
-
-
-
-/* esxVI_WaitForUpdates */
-ESX_VI__METHOD(WaitForUpdates,
-               (esxVI_Context *ctx,
-                const char *version,
-                esxVI_UpdateSet **updateSet),
-               RequiredItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(updateSet)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(version)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->propertyCollector)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, version)
-},
-{
-    if (esxVI_UpdateSet_Deserialize(response->node, updateSet) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_RebootGuest */
-ESX_VI__METHOD(RebootGuest,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-})
-
-
-
-/* esxVI_ShutdownGuest */
-ESX_VI__METHOD(ShutdownGuest,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *virtualMachine),
-               None,
-{
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(virtualMachine)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              virtualMachine)
-},
-{
-})
-
-
-
 /* esxVI_ValidateMigration */
-ESX_VI__METHOD(ValidateMigration,
+ESX_VI__METHOD(ValidateMigration, /* special _this */,
                (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *vm, /* list */
-                esxVI_VirtualMachinePowerState state,
-                esxVI_String *testType, /* list */
-                esxVI_ManagedObjectReference *pool,
-                esxVI_ManagedObjectReference *host,
-                esxVI_Event **eventList),
-               OptionalList,
-{
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(eventList)
-},
+                esxVI_ManagedObjectReference *vm,          /* required, list */
+                esxVI_VirtualMachinePowerState state,      /* optional */
+                esxVI_String *testType,                    /* optional, list */
+                esxVI_ManagedObjectReference *pool,        /* optional */
+                esxVI_ManagedObjectReference *host,        /* optional */
+                esxVI_Event **output),                     /* optional, list */
+               Event, OptionalList,
 {
     ESX_VI__METHOD__PARAMETER__REQUIRE(vm)
 },
@@ -781,165 +320,8 @@ ESX_VI__METHOD(ValidateMigration,
     ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(String, testType)
     ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, pool)
     ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, host)
-},
-{
-    if (esxVI_Event_DeserializeList(response->node, eventList) < 0) {
-        goto failure;
-    }
 })
 
 
 
-/* esxVI_FindByIp */
-ESX_VI__METHOD(FindByIp,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *datacenter,
-                const char *ip,
-                esxVI_Boolean vmSearch,
-                esxVI_ManagedObjectReference **managedObjectReference),
-               OptionalItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(managedObjectReference)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->searchIndex)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(ip)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(vmSearch)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->searchIndex)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, datacenter)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, ip)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, vmSearch)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node,
-                                                 managedObjectReference) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_FindByUuid */
-ESX_VI__METHOD(FindByUuid,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *datacenter,
-                const char *uuid, /* string */
-                esxVI_Boolean vmSearch,
-                esxVI_ManagedObjectReference **managedObjectReference),
-               OptionalItem,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(managedObjectReference)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->searchIndex)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(uuid)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(vmSearch)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->searchIndex)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, datacenter)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_VALUE(String, uuid)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Boolean, vmSearch)
-},
-{
-    if (esxVI_ManagedObjectReference_Deserialize(response->node,
-                                                 managedObjectReference) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_QueryAvailablePerfMetric */
-ESX_VI__METHOD(QueryAvailablePerfMetric,
-               (esxVI_Context *ctx,
-                esxVI_ManagedObjectReference *entity,
-                esxVI_DateTime *beginTime,
-                esxVI_DateTime *endTime,
-                esxVI_Int *intervalId,
-                esxVI_PerfMetricId **perfMetricIdList),
-               OptionalList,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfMetricIdList)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(entity)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(ManagedObjectReference, entity)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(DateTime, beginTime)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(DateTime, endTime)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE(Int, intervalId)
-},
-{
-    if (esxVI_PerfMetricId_DeserializeList(response->node,
-                                           perfMetricIdList) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_QueryPerfCounter */
-ESX_VI__METHOD(QueryPerfCounter,
-               (esxVI_Context *ctx,
-                esxVI_Int *counterId, /* list */
-                esxVI_PerfCounterInfo **perfCounterInfoList),
-               OptionalList,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfCounterInfoList)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(counterId)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(Int, counterId)
-},
-{
-    if (esxVI_PerfCounterInfo_DeserializeList(response->node,
-                                              perfCounterInfoList) < 0) {
-        goto failure;
-    }
-})
-
-
-
-/* esxVI_QueryPerf */
-ESX_VI__METHOD(QueryPerf,
-               (esxVI_Context *ctx,
-                esxVI_PerfQuerySpec *querySpec, /* list */
-                esxVI_PerfEntityMetric **perfEntityMetricList),
-               OptionalList,
-{
-    ESX_VI__METHOD__CHECK_SERVICE()
-    ESX_VI__METHOD__PARAMETER__CHECK_OUTPUT(perfEntityMetricList)
-},
-{
-    ESX_VI__METHOD__PARAMETER__REQUIRE_THIS(ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__REQUIRE(querySpec)
-},
-{
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_THIS(ManagedObjectReference,
-                                              ctx->service->perfManager)
-    ESX_VI__METHOD__PARAMETER__SERIALIZE_LIST(PerfQuerySpec, querySpec)
-},
-{
-    if (esxVI_PerfEntityMetric_DeserializeList(response->node,
-                                               perfEntityMetricList) < 0) {
-        goto failure;
-    }
-})
+#include "esx_vi_methods.generated.c"
diff --git a/src/esx/esx_vi_methods.h b/src/esx/esx_vi_methods.h
index 9ff8b4b..7b6be4e 100644
--- a/src/esx/esx_vi_methods.h
+++ b/src/esx/esx_vi_methods.h
@@ -32,123 +32,19 @@
  * VI Methods
  */
 
-int esxVI_RetrieveServiceContent(esxVI_Context *ctx,
-                                 esxVI_ServiceContent **serviceContent);
-
-int esxVI_Login(esxVI_Context *ctx, const char *userName, const char *password,
-                esxVI_UserSession **userSession);
-
-int esxVI_Logout(esxVI_Context *ctx);
-
-int esxVI_SessionIsActive(esxVI_Context *ctx, const char *sessionID,
-                          const char *userName, esxVI_Boolean *active);
-
-int esxVI_RetrieveProperties(esxVI_Context *ctx,
-                             esxVI_PropertyFilterSpec *specSet, /* list */
-                             esxVI_ObjectContent **objectContentList);
-
-int esxVI_PowerOnVM_Task(esxVI_Context *ctx,
-                         esxVI_ManagedObjectReference *virtualMachine,
-                         esxVI_ManagedObjectReference **task);
-
-int esxVI_PowerOffVM_Task(esxVI_Context *ctx,
-                          esxVI_ManagedObjectReference *virtualMachine,
-                          esxVI_ManagedObjectReference **task);
-
-int esxVI_SuspendVM_Task(esxVI_Context *ctx,
-                         esxVI_ManagedObjectReference *virtualMachine,
-                         esxVI_ManagedObjectReference **task);
-
-int esxVI_MigrateVM_Task(esxVI_Context *ctx,
-                         esxVI_ManagedObjectReference *virtualMachine,
-                         esxVI_ManagedObjectReference *pool,
-                         esxVI_ManagedObjectReference *host,
-                         esxVI_VirtualMachineMovePriority priority,
-                         esxVI_VirtualMachinePowerState state,
-                         esxVI_ManagedObjectReference **task);
-
-int esxVI_ReconfigVM_Task(esxVI_Context *ctx,
-                          esxVI_ManagedObjectReference *virtualMachine,
-                          esxVI_VirtualMachineConfigSpec *spec,
-                          esxVI_ManagedObjectReference **task);
-
-int esxVI_RegisterVM_Task(esxVI_Context *ctx,
-                          esxVI_ManagedObjectReference *folder,
-                          const char *path, const char *name,
-                          esxVI_Boolean asTemplate,
-                          esxVI_ManagedObjectReference *pool,
-                          esxVI_ManagedObjectReference *host,
-                          esxVI_ManagedObjectReference **task);
-
-int esxVI_CreateSnapshot_Task(esxVI_Context *ctx,
-                              esxVI_ManagedObjectReference *virtualMachine,
-                              const char *name, const char *description,
-                              esxVI_Boolean memory, esxVI_Boolean quiesce,
-                              esxVI_ManagedObjectReference **task);
-
-int esxVI_RevertToSnapshot_Task
-      (esxVI_Context *ctx, esxVI_ManagedObjectReference *virtualMachineSnapshot,
-       esxVI_ManagedObjectReference *host, esxVI_ManagedObjectReference **task);
-
-int esxVI_RemoveSnapshot_Task
-      (esxVI_Context *ctx, esxVI_ManagedObjectReference *virtualMachineSnapshot,
-       esxVI_Boolean removeChildren, esxVI_ManagedObjectReference **task);
-
-int esxVI_CancelTask(esxVI_Context *ctx, esxVI_ManagedObjectReference *task);
-
-int esxVI_UnregisterVM(esxVI_Context *ctx,
-                       esxVI_ManagedObjectReference *virtualMachine);
-
-int esxVI_AnswerVM(esxVI_Context *ctx,
-                   esxVI_ManagedObjectReference *virtualMachine,
-                   const char *questionId, const char *answerChoice);
-
-int esxVI_CreateFilter(esxVI_Context *ctx,
-                       esxVI_PropertyFilterSpec *spec,
-                       esxVI_Boolean partialUpdates,
-                       esxVI_ManagedObjectReference **propertyFilter);
-
-int esxVI_DestroyPropertyFilter(esxVI_Context *ctx,
-                                esxVI_ManagedObjectReference *propertyFilter);
-
-int esxVI_WaitForUpdates(esxVI_Context *ctx, const char *version,
-                         esxVI_UpdateSet **updateSet);
-
-int esxVI_RebootGuest(esxVI_Context *ctx,
-                      esxVI_ManagedObjectReference *virtualMachine);
-
-int esxVI_ShutdownGuest(esxVI_Context *ctx,
-                        esxVI_ManagedObjectReference *virtualMachine);
-
-int esxVI_ValidateMigration(esxVI_Context *ctx,
-                            esxVI_ManagedObjectReference *vm, /* list */
-                            esxVI_VirtualMachinePowerState state,
-                            esxVI_String *testType, /* list */ // FIXME: see ValidateMigrationTestType
-                            esxVI_ManagedObjectReference *pool,
-                            esxVI_ManagedObjectReference *host,
-                            esxVI_Event **eventList);
-
-int esxVI_FindByIp(esxVI_Context *ctx, esxVI_ManagedObjectReference *datacenter,
-                   const char *ip, esxVI_Boolean vmSearch,
-                   esxVI_ManagedObjectReference **managedObjectReference);
-
-int esxVI_FindByUuid(esxVI_Context *ctx,
-                     esxVI_ManagedObjectReference *datacenter,
-                     const char *uuid, /* string */
-                     esxVI_Boolean vmSearch,
-                     esxVI_ManagedObjectReference **managedObjectReference);
-
-int esxVI_QueryAvailablePerfMetric(esxVI_Context *ctx,
-                                   esxVI_ManagedObjectReference *entity,
-                                   esxVI_DateTime *beginTime,
-                                   esxVI_DateTime *endTime,
-                                   esxVI_Int *intervalId,
-                                   esxVI_PerfMetricId **perfMetricIdList);
-
-int esxVI_QueryPerfCounter(esxVI_Context *ctx, esxVI_Int *counterId, /* list */
-                           esxVI_PerfCounterInfo **perfCounterInfoList);
-
-int esxVI_QueryPerf(esxVI_Context *ctx, esxVI_PerfQuerySpec *querySpecList,
-                    esxVI_PerfEntityMetric **perfEntityMetricList);
+int esxVI_RetrieveServiceContent
+      (esxVI_Context *ctx,
+       esxVI_ServiceContent **serviceContent);             /* required */
+
+int esxVI_ValidateMigration
+      (esxVI_Context *ctx,
+       esxVI_ManagedObjectReference *vm,                   /* required, list */
+       esxVI_VirtualMachinePowerState state,               /* optional */
+       esxVI_String *testType,                             /* optional, list */
+       esxVI_ManagedObjectReference *pool,                 /* optional */
+       esxVI_ManagedObjectReference *host,                 /* optional */
+       esxVI_Event **output);                              /* optional, list */
+
+#include "esx_vi_methods.generated.h"
 
 #endif /* __ESX_VI_METHODS_H__ */
-- 
1.6.3.3


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]