提交 d4601696 编写于 作者: M Matthias Bolte

esx: Extend VI generator to cover managed object types

Generate lookup functions for managed object types.
上级 ac1e6586
此差异已折叠。
...@@ -444,4 +444,6 @@ int esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo, ...@@ -444,4 +444,6 @@ int esxVI_ParseHostCpuIdInfo(esxVI_ParsedHostCpuIdInfo *parsedHostCpuIdInfo,
int esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductVersion productVersion); int esxVI_ProductVersionToDefaultVirtualHWVersion(esxVI_ProductVersion productVersion);
# include "esx_vi.generated.h"
#endif /* __ESX_VI_H__ */ #endif /* __ESX_VI_H__ */
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
# #
# Object definition: # Object definition:
# #
# object <name> [extends <name>] # [managed] object <name> [extends <name>]
# <type> <name> <occurrence> # <type> <name> <occurrence>
# ... # ...
# end # end
...@@ -738,6 +738,32 @@ object VmfsDatastoreInfo extends DatastoreInfo ...@@ -738,6 +738,32 @@ object VmfsDatastoreInfo extends DatastoreInfo
end end
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Managed Objects
#
managed object ComputeResource extends ManagedEntity
ManagedObjectReference host ol
ManagedObjectReference resourcePool o
end
managed object Datacenter extends ManagedEntity
ManagedObjectReference hostFolder r
ManagedObjectReference vmFolder r
end
managed object HostSystem extends ManagedEntity
HostConfigManager configManager r
end
managed object ManagedEntity
String name r
end
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Methods # Methods
# #
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# #
# esx_vi_generator.py: generates most of the SOAP type mapping code # esx_vi_generator.py: generates most of the SOAP type mapping code
# #
# Copyright (C) 2010 Matthias Bolte <matthias.bolte@googlemail.com> # Copyright (C) 2010-2011 Matthias Bolte <matthias.bolte@googlemail.com>
# #
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
...@@ -297,10 +297,15 @@ class Property: ...@@ -297,10 +297,15 @@ class Property:
return " esxVI_%s_Free(&item->%s);\n" % (self.type, self.name) return " esxVI_%s_Free(&item->%s);\n" % (self.type, self.name)
def generate_validate_code(self): def generate_validate_code(self, managed=False):
if managed:
macro = "ESX_VI__TEMPLATE__PROPERTY__MANAGED_REQUIRE"
else:
macro = "ESX_VI__TEMPLATE__PROPERTY__REQUIRE"
if self.occurrence in [OCCURRENCE__REQUIRED_ITEM, if self.occurrence in [OCCURRENCE__REQUIRED_ITEM,
OCCURRENCE__REQUIRED_LIST]: OCCURRENCE__REQUIRED_LIST]:
return " ESX_VI__TEMPLATE__PROPERTY__REQUIRE(%s)\n" % self.name return " %s(%s)\n" % (macro, self.name)
elif self.occurrence == OCCURRENCE__IGNORED: elif self.occurrence == OCCURRENCE__IGNORED:
return " /* FIXME: %s is currently ignored */\n" % self.name return " /* FIXME: %s is currently ignored */\n" % self.name
else: else:
...@@ -345,6 +350,18 @@ class Property: ...@@ -345,6 +350,18 @@ class Property:
return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(%s, %s)\n" % (self.type, self.name) return " ESX_VI__TEMPLATE__PROPERTY__DESERIALIZE(%s, %s)\n" % (self.type, self.name)
def generate_lookup_code(self):
if self.occurrence == OCCURRENCE__IGNORED:
return " ESX_VI__TEMPLATE__PROPERTY__CAST_FROM_ANY_TYPE_IGNORE(%s) /* FIXME */\n" % self.name
elif self.occurrence in [OCCURRENCE__REQUIRED_LIST,
OCCURRENCE__OPTIONAL_LIST]:
return " ESX_VI__TEMPLATE__PROPERTY__CAST_LIST_FROM_ANY_TYPE(%s, %s)\n" % (self.type, self.name)
elif self.type == "String":
return " ESX_VI__TEMPLATE__PROPERTY__CAST_VALUE_FROM_ANY_TYPE(String, %s)\n" % self.name
else:
return " ESX_VI__TEMPLATE__PROPERTY__CAST_FROM_ANY_TYPE(%s, %s)\n" % (self.type, self.name)
def get_type_string(self): def get_type_string(self):
if self.type == "String" and \ if self.type == "String" and \
self.occurrence not in [OCCURRENCE__REQUIRED_LIST, self.occurrence not in [OCCURRENCE__REQUIRED_LIST,
...@@ -572,20 +589,20 @@ class Object(Base): ...@@ -572,20 +589,20 @@ class Object(Base):
def generate_header(self): def generate_header(self):
header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" header = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
header += " * VI Type: %s\n" % self.name header += " * VI Object: %s\n" % self.name
if self.extends is not None: if self.extends is not None:
header += " * extends %s\n" % self.extends header += " * extends %s\n" % self.extends
first = True first = True
if self.extended_by is not None: if self.extended_by is not None:
for extended_by in self.extended_by: for extended_by in self.extended_by:
if first: if first:
header += " * extended by %s\n" % extended_by header += " * extended by %s\n" % extended_by
first = False first = False
else: else:
header += " * %s\n" % extended_by header += " * %s\n" % extended_by
header += " */\n\n" header += " */\n\n"
...@@ -646,20 +663,20 @@ class Object(Base): ...@@ -646,20 +663,20 @@ class Object(Base):
def generate_source(self): def generate_source(self):
source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" source = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
source += " * VI Type: %s\n" % self.name source += " * VI Object: %s\n" % self.name
if self.extends is not None: if self.extends is not None:
source += " * extends %s\n" % self.extends source += " * extends %s\n" % self.extends
first = True first = True
if self.extended_by is not None: if self.extended_by is not None:
for extended_by in self.extended_by: for extended_by in self.extended_by:
if first: if first:
source += " * extended by %s\n" % extended_by source += " * extended by %s\n" % extended_by
first = False first = False
else: else:
source += " * %s\n" % extended_by source += " * %s\n" % extended_by
source += " */\n\n" source += " */\n\n"
...@@ -863,15 +880,303 @@ class Object(Base): ...@@ -863,15 +880,303 @@ class Object(Base):
class ManagedObject(Base):
FEATURE__LIST = (1 << 2)
def __init__(self, name, extends, properties, features=0, extended_by=None):
Base.__init__(self, "struct", name)
self.extends = extends
self.features = features
self.properties = properties
self.extended_by = extended_by
if self.extended_by is not None:
self.extended_by.sort()
def generate_struct_members(self, add_banner=False, struct_gap=False):
members = ""
if struct_gap:
members += "\n"
if self.extends is not None:
members += managed_objects_by_name[self.extends].generate_struct_members(add_banner=True) + "\n"
if self.extends is not None or add_banner:
members += " /* %s */\n" % self.name
for property in self.properties:
members += property.generate_struct_member()
if len(self.properties) < 1:
members += " /* no properties */\n"
return members
def generate_free_code(self, add_banner=False):
source = ""
if self.extends is not None:
source += managed_objects_by_name[self.extends].generate_free_code(add_banner=True) + "\n"
if self.extends is not None or add_banner:
source += " /* %s */\n" % self.name
if len(self.properties) < 1:
source += " /* no properties */\n"
else:
string = ""
for property in self.properties:
string += property.generate_free_code()
if len(string) < 1:
source += " /* no properties to be freed */\n"
else:
source += string
return source
def generate_validate_code(self, add_banner=False):
source = ""
if self.extends is not None:
source += managed_objects_by_name[self.extends].generate_validate_code(add_banner=True) + "\n"
if self.extends is not None or add_banner:
source += " /* %s */\n" % self.name
if len(self.properties) < 1:
source += " /* no properties */\n"
else:
string = ""
for property in self.properties:
string += property.generate_validate_code(managed=True)
if len(string) < 1:
source += " /* no required properties */\n"
else:
source += string
return source
def generate_lookup_code1(self, add_banner=False):
source = ""
if self.extends is not None:
source += managed_objects_by_name[self.extends].generate_lookup_code1(add_banner=True) + "\n"
if self.extends is not None or add_banner:
source += " /* %s */\n" % self.name
if len(self.properties) < 1:
source += " /* no properties */\n"
else:
string = ""
for property in self.properties:
string += " \"%s\\0\"\n" % property.name
if len(string) < 1:
source += " /* no properties */\n"
else:
source += string
return source
def generate_lookup_code2(self, add_banner=False):
source = ""
if self.extends is not None:
source += managed_objects_by_name[self.extends].generate_lookup_code2(add_banner=True) + "\n"
if self.extends is not None or add_banner:
source += " /* %s */\n" % self.name
if len(self.properties) < 1:
source += " /* no properties */\n"
else:
string = ""
for property in self.properties:
string += property.generate_lookup_code()
if len(string) < 1:
source += " /* no properties */\n"
else:
source += string
return source
def generate_comment(self):
comment = "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n"
comment += " * VI Managed Object: %s\n" % self.name
if self.extends is not None:
comment += " * extends %s\n" % self.extends
first = True
if self.extended_by is not None:
for extended_by in self.extended_by:
if first:
comment += " * extended by %s\n" % extended_by
first = False
else:
comment += " * %s\n" % extended_by
comment += " */\n\n"
return comment
def generate_header(self):
header = self.generate_comment()
# struct
header += "struct _esxVI_%s {\n" % self.name
if self.features & Object.FEATURE__LIST:
header += aligned(" esxVI_%s *_next; " % self.name, "/* optional */\n")
else:
header += aligned(" esxVI_%s *_unused; " % self.name, "/* optional */\n")
header += aligned(" esxVI_Type _type; ", "/* required */\n")
header += aligned(" esxVI_ManagedObjectReference *_reference; ", "/* required */\n")
header += "\n"
header += self.generate_struct_members()
header += "};\n\n"
# functions
header += "int esxVI_%s_Alloc(esxVI_%s **item);\n" % (self.name, self.name)
header += "void esxVI_%s_Free(esxVI_%s **item);\n" % (self.name, self.name)
header += "int esxVI_%s_Validate(esxVI_%s *item, esxVI_String *selectedPropertyNameList);\n" % (self.name, self.name)
if self.features & Object.FEATURE__LIST:
header += "int esxVI_%s_AppendToList(esxVI_%s **list, esxVI_%s *item);\n" % (self.name, self.name, self.name)
header += "\n\n\n"
return header
def generate_helper_header(self):
header = ""
# functions
header += ("int esxVI_Lookup%s(esxVI_Context *ctx, " +
"const char *name, " +
"esxVI_ManagedObjectReference *root, " +
"esxVI_String *selectedPropertyNameList, " +
"esxVI_%s **item, " +
"esxVI_Occurrence occurrence);\n") % (self.name, self.name)
header += "\n"
return header
def generate_source(self):
source = self.generate_comment()
# functions
source += "/* esxVI_%s_Alloc */\n" % self.name
source += "ESX_VI__TEMPLATE__ALLOC(%s)\n\n" % self.name
# free
if self.extended_by is None:
source += "/* esxVI_%s_Free */\n" % self.name
source += "ESX_VI__TEMPLATE__FREE(%s,\n" % self.name
source += "{\n"
if self.features & ManagedObject.FEATURE__LIST:
if self.extends is not None:
# avoid "dereferencing type-punned pointer will break strict-aliasing rules" warnings
source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" % (self.extends, self.extends)
source += " esxVI_%s_Free(&next);\n" % self.extends
source += " item->_next = (esxVI_%s *)next;\n\n" % self.name
else:
source += " esxVI_%s_Free(&item->_next);\n" % self.name
source += " esxVI_ManagedObjectReference_Free(&item->_reference);\n\n"
source += self.generate_free_code()
source += "})\n\n"
else:
source += "/* esxVI_%s_Free */\n" % self.name
source += "ESX_VI__TEMPLATE__DYNAMIC_FREE(%s,\n" % self.name
source += "{\n"
for extended_by in self.extended_by:
source += " ESX_VI__TEMPLATE__DISPATCH__FREE(%s)\n" % extended_by
source += "},\n"
source += "{\n"
if self.features & Object.FEATURE__LIST:
if self.extends is not None:
# avoid "dereferencing type-punned pointer will break strict-aliasing rules" warnings
source += " esxVI_%s *next = (esxVI_%s *)item->_next;\n\n" % (self.extends, self.extends)
source += " esxVI_%s_Free(&next);\n" % self.extends
source += " item->_next = (esxVI_%s *)next;\n\n" % self.name
else:
source += " esxVI_%s_Free(&item->_next);\n" % self.name
source += " esxVI_ManagedObjectReference_Free(&item->_reference);\n\n"
source += self.generate_free_code()
source += "})\n\n"
# validate
source += "/* esxVI_%s_Validate */\n" % self.name
source += "ESX_VI__TEMPLATE__MANAGED_VALIDATE(%s,\n" % self.name
source += "{\n"
source += self.generate_validate_code()
source += "})\n\n"
# append to list
if self.features & ManagedObject.FEATURE__LIST:
source += "/* esxVI_%s_AppendToList */\n" % self.name
source += "ESX_VI__TEMPLATE__LIST__APPEND(%s)\n\n" % self.name
source += "\n\n"
return source
def generate_helper_source(self):
source = ""
# lookup
source += "/* esxVI_Lookup%s */\n" % self.name
source += "ESX_VI__TEMPLATE__LOOKUP(%s,\n" % self.name
source += "{\n"
source += self.generate_lookup_code1()
source += "},\n"
source += "{\n"
source += self.generate_lookup_code2()
source += "})\n\n"
source += "\n\n"
return source
...@@ -962,8 +1267,13 @@ def capitalize_first(string): ...@@ -962,8 +1267,13 @@ def capitalize_first(string):
def parse_object(block): def parse_object(block):
# expected format: object <name> [extends <name>] # expected format: [managed] object <name> [extends <name>]
header_items = block[0][1].split() header_items = block[0][1].split()
managed = False
if header_items[0] == "managed":
managed = True
del header_items[0]
if len(header_items) < 2: if len(header_items) < 2:
report_error("line %d: invalid block header" % (number)) report_error("line %d: invalid block header" % (number))
...@@ -994,7 +1304,10 @@ def parse_object(block): ...@@ -994,7 +1304,10 @@ def parse_object(block):
properties.append(Property(type=items[0], name=items[1], properties.append(Property(type=items[0], name=items[1],
occurrence=items[2])) occurrence=items[2]))
return Object(name = name, extends = extends, properties = properties) if managed:
return ManagedObject(name=name, extends=extends, properties=properties)
else:
return Object(name=name, extends=extends, properties=properties)
...@@ -1075,6 +1388,7 @@ def is_known_type(type): ...@@ -1075,6 +1388,7 @@ def is_known_type(type):
return type in predefined_objects or \ return type in predefined_objects or \
type in predefined_enums or \ type in predefined_enums or \
type in objects_by_name or \ type in objects_by_name or \
type in managed_objects_by_name or \
type in enums_by_name type in enums_by_name
...@@ -1169,11 +1483,14 @@ types_header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generat ...@@ -1169,11 +1483,14 @@ types_header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generat
types_source = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.c")) 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_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")) methods_source = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
helpers_header = open_and_print(os.path.join(output_dirname, "esx_vi.generated.h"))
helpers_source = open_and_print(os.path.join(output_dirname, "esx_vi.generated.c"))
number = 0 number = 0
objects_by_name = {} objects_by_name = {}
managed_objects_by_name = {}
enums_by_name = {} enums_by_name = {}
methods_by_name = {} methods_by_name = {}
block = None block = None
...@@ -1191,7 +1508,8 @@ for line in file(input_filename, "rb").readlines(): ...@@ -1191,7 +1508,8 @@ for line in file(input_filename, "rb").readlines():
if len(line) < 1: if len(line) < 1:
continue continue
if line.startswith("object") or line.startswith("enum") or line.startswith("method"): if line.startswith("object") or line.startswith("managed object") or \
line.startswith("enum") or line.startswith("method"):
if block is not None: if block is not None:
report_error("line %d: nested block found" % (number)) report_error("line %d: nested block found" % (number))
else: else:
...@@ -1202,6 +1520,9 @@ for line in file(input_filename, "rb").readlines(): ...@@ -1202,6 +1520,9 @@ for line in file(input_filename, "rb").readlines():
if block[0][1].startswith("object"): if block[0][1].startswith("object"):
obj = parse_object(block) obj = parse_object(block)
objects_by_name[obj.name] = obj objects_by_name[obj.name] = obj
elif block[0][1].startswith("managed object"):
obj = parse_object(block)
managed_objects_by_name[obj.name] = obj
elif block[0][1].startswith("enum"): elif block[0][1].startswith("enum"):
enum = parse_enum(block) enum = parse_enum(block)
enums_by_name[enum.name] = enum enums_by_name[enum.name] = enum
...@@ -1268,6 +1589,30 @@ for obj in objects_by_name.values(): ...@@ -1268,6 +1589,30 @@ for obj in objects_by_name.values():
for obj in managed_objects_by_name.values():
for property in obj.properties:
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))
if obj.extends is not None:
if not is_known_type(obj.extends):
report_error("object '%s' extends unknown object '%s'" % (obj.name, obj.extends))
# detect extended_by relation
if obj.extends is not None:
extended_obj = managed_objects_by_name[obj.extends]
if extended_obj.extended_by is None:
extended_obj.extended_by = [obj.name]
else:
extended_obj.extended_by.append(obj.name)
extended_obj.extended_by.sort()
for obj in objects_by_name.values(): for obj in objects_by_name.values():
inherit_features(obj) inherit_features(obj)
...@@ -1283,6 +1628,8 @@ types_header.write("/* Generated by esx_vi_generator.py */\n\n\n\n") ...@@ -1283,6 +1628,8 @@ 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") 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_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") methods_source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
helpers_header.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
helpers_source.write("/* Generated by esx_vi_generator.py */\n\n\n\n")
# output enums # output enums
...@@ -1306,7 +1653,7 @@ for name in names: ...@@ -1306,7 +1653,7 @@ for name in names:
# output objects # output objects
types_typedef.write("\n\n\n" + types_typedef.write("\n\n\n" +
"/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" + "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
" * VI Types\n" + " * VI Objects\n" +
" */\n\n") " */\n\n")
types_typeenum.write("\n") types_typeenum.write("\n")
types_typetostring.write("\n") types_typetostring.write("\n")
...@@ -1327,6 +1674,30 @@ for name in names: ...@@ -1327,6 +1674,30 @@ for name in names:
# output managed objects
types_typedef.write("\n\n\n" +
"/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n" +
" * VI Managed Objects\n" +
" */\n\n")
types_typeenum.write("\n")
types_typetostring.write("\n")
types_typefromstring.write("\n")
names = managed_objects_by_name.keys()
names.sort()
for name in names:
types_typedef.write(managed_objects_by_name[name].generate_typedef())
types_typeenum.write(managed_objects_by_name[name].generate_typeenum())
types_typetostring.write(managed_objects_by_name[name].generate_typetostring())
types_typefromstring.write(managed_objects_by_name[name].generate_typefromstring())
types_header.write(managed_objects_by_name[name].generate_header())
types_source.write(managed_objects_by_name[name].generate_source())
# output methods # output methods
names = methods_by_name.keys() names = methods_by_name.keys()
names.sort() names.sort()
...@@ -1334,3 +1705,13 @@ names.sort() ...@@ -1334,3 +1705,13 @@ names.sort()
for name in names: for name in names:
methods_header.write(methods_by_name[name].generate_header()) methods_header.write(methods_by_name[name].generate_header())
methods_source.write(methods_by_name[name].generate_source()) methods_source.write(methods_by_name[name].generate_source())
# output helpers
names = managed_objects_by_name.keys()
names.sort()
for name in names:
helpers_header.write(managed_objects_by_name[name].generate_helper_header())
helpers_source.write(managed_objects_by_name[name].generate_helper_source())
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* esx_vi_types.c: client for the VMware VI API 2.5 to manage ESX hosts * esx_vi_types.c: client for the VMware VI API 2.5 to manage ESX hosts
* *
* Copyright (C) 2010 Red Hat, Inc. * Copyright (C) 2010 Red Hat, Inc.
* Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte@googlemail.com> * Copyright (C) 2009-2011 Matthias Bolte <matthias.bolte@googlemail.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -693,6 +693,44 @@ esxVI_GetActualObjectType(xmlNodePtr node, esxVI_Type baseType, ...@@ -693,6 +693,44 @@ esxVI_GetActualObjectType(xmlNodePtr node, esxVI_Type baseType,
/*
* Macros to implement managed objects
*/
#define ESX_VI__TEMPLATE__PROPERTY__MANAGED_REQUIRE(_name) \
/* FIXME: This results in O(n^2) runtime in case of missing required, but \
* unselected properties. */ \
if (item->_name == 0 && \
esxVI_String_ListContainsValue(selectedPropertyNameList, #_name)) { \
ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \
_("%s object is missing the required '%s' property"), \
typeName, #_name); \
return -1; \
}
#define ESX_VI__TEMPLATE__MANAGED_VALIDATE(__type, _require) \
int \
esxVI_##__type##_Validate(esxVI_##__type *item, \
esxVI_String *selectedPropertyNameList) \
{ \
const char *typeName = esxVI_Type_ToString(esxVI_Type_##__type); \
\
if (item->_type <= esxVI_Type_Undefined || \
item->_type >= esxVI_Type_Other) { \
ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, \
_("%s object has invalid dynamic type"), typeName); \
return -1; \
} \
\
_require \
\
return 0; \
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* XSI: Type * XSI: Type
*/ */
...@@ -735,15 +773,6 @@ esxVI_Type_ToString(esxVI_Type type) ...@@ -735,15 +773,6 @@ esxVI_Type_ToString(esxVI_Type type)
case esxVI_Type_ManagedObjectReference: case esxVI_Type_ManagedObjectReference:
return "ManagedObjectReference"; return "ManagedObjectReference";
case esxVI_Type_Datacenter:
return "Datacenter";
case esxVI_Type_ComputeResource:
return "ComputeResource";
case esxVI_Type_HostSystem:
return "HostSystem";
#include "esx_vi_types.generated.typetostring" #include "esx_vi_types.generated.typetostring"
case esxVI_Type_Other: case esxVI_Type_Other:
...@@ -776,12 +805,6 @@ esxVI_Type_FromString(const char *type) ...@@ -776,12 +805,6 @@ esxVI_Type_FromString(const char *type)
return esxVI_Type_MethodFault; return esxVI_Type_MethodFault;
} else if (STREQ(type, "ManagedObjectReference")) { } else if (STREQ(type, "ManagedObjectReference")) {
return esxVI_Type_ManagedObjectReference; return esxVI_Type_ManagedObjectReference;
} else if (STREQ(type, "Datacenter")) {
return esxVI_Type_Datacenter;
} else if (STREQ(type, "ComputeResource")) {
return esxVI_Type_ComputeResource;
} else if (STREQ(type, "HostSystem")) {
return esxVI_Type_HostSystem;
} }
#include "esx_vi_types.generated.typefromstring" #include "esx_vi_types.generated.typefromstring"
...@@ -1050,6 +1073,20 @@ ESX_VI__TEMPLATE__VALIDATE(String, ...@@ -1050,6 +1073,20 @@ ESX_VI__TEMPLATE__VALIDATE(String,
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(value) ESX_VI__TEMPLATE__PROPERTY__REQUIRE(value)
}) })
bool
esxVI_String_ListContainsValue(esxVI_String *stringList, const char *value)
{
esxVI_String *string;
for (string = stringList; string != NULL; string = string->_next) {
if (STREQ(string->value, value)) {
return true;
}
}
return false;
}
/* esxVI_String_AppendToList */ /* esxVI_String_AppendToList */
ESX_VI__TEMPLATE__LIST__APPEND(String) ESX_VI__TEMPLATE__LIST__APPEND(String)
...@@ -1452,7 +1489,7 @@ esxVI_DateTime_ConvertToCalendarTime(esxVI_DateTime *dateTime, ...@@ -1452,7 +1489,7 @@ esxVI_DateTime_ConvertToCalendarTime(esxVI_DateTime *dateTime,
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: Fault * SOAP: Fault
*/ */
/* esxVI_Fault_Alloc */ /* esxVI_Fault_Alloc */
...@@ -1483,7 +1520,7 @@ ESX_VI__TEMPLATE__DESERIALIZE(Fault, ...@@ -1483,7 +1520,7 @@ ESX_VI__TEMPLATE__DESERIALIZE(Fault,
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: MethodFault * VI Object: MethodFault
*/ */
/* esxVI_MethodFault_Alloc */ /* esxVI_MethodFault_Alloc */
...@@ -1528,7 +1565,7 @@ esxVI_MethodFault_Deserialize(xmlNodePtr node, esxVI_MethodFault **methodFault) ...@@ -1528,7 +1565,7 @@ esxVI_MethodFault_Deserialize(xmlNodePtr node, esxVI_MethodFault **methodFault)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: ManagedObjectReference * VI Object: ManagedObjectReference
*/ */
/* esxVI_ManagedObjectReference_Alloc */ /* esxVI_ManagedObjectReference_Alloc */
...@@ -1631,280 +1668,6 @@ esxVI_ManagedObjectReference_Deserialize ...@@ -1631,280 +1668,6 @@ esxVI_ManagedObjectReference_Deserialize
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: Datacenter
* extends ManagedEntity
*/
/* esxVI_Datacenter_Alloc */
ESX_VI__TEMPLATE__ALLOC(Datacenter)
/* esxVI_Datacenter_Free */
ESX_VI__TEMPLATE__FREE(Datacenter,
{
esxVI_Datacenter_Free(&item->_next);
esxVI_ManagedObjectReference_Free(&item->_reference);
/* ManagedEntity */
VIR_FREE(item->name);
/* Datacenter */
esxVI_ManagedObjectReference_Free(&item->hostFolder);
esxVI_ManagedObjectReference_Free(&item->vmFolder);
})
/* esxVI_Datacenter_Validate */
ESX_VI__TEMPLATE__VALIDATE(Datacenter,
{
/* ManagedEntity */
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
/* Datacenter */
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(hostFolder);
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(vmFolder);
})
int
esxVI_Datacenter_CastFromObjectContent(esxVI_ObjectContent *objectContent,
esxVI_Datacenter **datacenter)
{
esxVI_DynamicProperty *dynamicProperty = NULL;
if (objectContent == NULL || datacenter == NULL || *datacenter != NULL) {
ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
return -1;
}
if (esxVI_Datacenter_Alloc(datacenter) < 0) {
return -1;
}
if (esxVI_ManagedObjectReference_DeepCopy(&(*datacenter)->_reference,
objectContent->obj) < 0) {
goto failure;
}
for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL;
dynamicProperty = dynamicProperty->_next) {
if (STREQ(dynamicProperty->name, "name")) {
if (esxVI_AnyType_ExpectType(dynamicProperty->val,
esxVI_Type_String) < 0) {
goto failure;
}
(*datacenter)->name = strdup(dynamicProperty->val->string);
if ((*datacenter)->name == NULL) {
virReportOOMError();
goto failure;
}
} else if (STREQ(dynamicProperty->name, "hostFolder")) {
if (esxVI_ManagedObjectReference_CastFromAnyType
(dynamicProperty->val, &(*datacenter)->hostFolder) < 0) {
goto failure;
}
} else if (STREQ(dynamicProperty->name, "vmFolder")) {
if (esxVI_ManagedObjectReference_CastFromAnyType
(dynamicProperty->val, &(*datacenter)->vmFolder) < 0) {
goto failure;
}
}
}
if (esxVI_Datacenter_Validate(*datacenter) < 0) {
goto failure;
}
return 0;
failure:
esxVI_Datacenter_Free(datacenter);
return -1;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: ComputeResource
* extends ManagedEntity
*/
/* esxVI_ComputeResource_Alloc */
ESX_VI__TEMPLATE__ALLOC(ComputeResource)
/* esxVI_ComputeResource_Free */
ESX_VI__TEMPLATE__FREE(ComputeResource,
{
esxVI_ComputeResource_Free(&item->_next);
esxVI_ManagedObjectReference_Free(&item->_reference);
/* ManagedEntity */
VIR_FREE(item->name);
/* ComputeResource */
esxVI_ManagedObjectReference_Free(&item->host);
esxVI_ManagedObjectReference_Free(&item->resourcePool);
})
/* esxVI_ComputeResource_Validate */
ESX_VI__TEMPLATE__VALIDATE(ComputeResource,
{
/* ManagedEntity */
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
/* ComputeResource */
})
int
esxVI_ComputeResource_CastFromObjectContent
(esxVI_ObjectContent *objectContent, esxVI_ComputeResource **computeResource)
{
esxVI_DynamicProperty *dynamicProperty = NULL;
if (objectContent == NULL || computeResource == NULL ||
*computeResource != NULL) {
ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
return -1;
}
if (esxVI_ComputeResource_Alloc(computeResource) < 0) {
return -1;
}
if (esxVI_ManagedObjectReference_DeepCopy(&(*computeResource)->_reference,
objectContent->obj) < 0) {
goto failure;
}
for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL;
dynamicProperty = dynamicProperty->_next) {
if (STREQ(dynamicProperty->name, "name")) {
if (esxVI_AnyType_ExpectType(dynamicProperty->val,
esxVI_Type_String) < 0) {
goto failure;
}
(*computeResource)->name = strdup(dynamicProperty->val->string);
if ((*computeResource)->name == NULL) {
virReportOOMError();
goto failure;
}
} else if (STREQ(dynamicProperty->name, "host")) {
if (esxVI_ManagedObjectReference_CastListFromAnyType
(dynamicProperty->val, &(*computeResource)->host) < 0) {
goto failure;
}
} else if (STREQ(dynamicProperty->name, "resourcePool")) {
if (esxVI_ManagedObjectReference_CastFromAnyType
(dynamicProperty->val, &(*computeResource)->resourcePool) < 0) {
goto failure;
}
}
}
if (esxVI_ComputeResource_Validate(*computeResource) < 0) {
goto failure;
}
return 0;
failure:
esxVI_ComputeResource_Free(computeResource);
return -1;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: HostSystem
* extends ManagedEntity
*/
/* esxVI_HostSystem_Alloc */
ESX_VI__TEMPLATE__ALLOC(HostSystem)
/* esxVI_HostSystem_Free */
ESX_VI__TEMPLATE__FREE(HostSystem,
{
esxVI_HostSystem_Free(&item->_next);
esxVI_ManagedObjectReference_Free(&item->_reference);
/* ManagedEntity */
VIR_FREE(item->name);
/* HostSystem */
esxVI_HostConfigManager_Free(&item->configManager);
})
/* esxVI_HostSystem_Validate */
ESX_VI__TEMPLATE__VALIDATE(HostSystem,
{
/* ManagedEntity */
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(name);
/* HostSystem */
ESX_VI__TEMPLATE__PROPERTY__REQUIRE(configManager);
})
int
esxVI_HostSystem_CastFromObjectContent(esxVI_ObjectContent *objectContent,
esxVI_HostSystem **hostSystem)
{
esxVI_DynamicProperty *dynamicProperty = NULL;
if (objectContent == NULL || hostSystem == NULL || *hostSystem != NULL) {
ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
return -1;
}
if (esxVI_HostSystem_Alloc(hostSystem) < 0) {
return -1;
}
if (esxVI_ManagedObjectReference_DeepCopy(&(*hostSystem)->_reference,
objectContent->obj) < 0) {
goto failure;
}
for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL;
dynamicProperty = dynamicProperty->_next) {
if (STREQ(dynamicProperty->name, "name")) {
if (esxVI_AnyType_ExpectType(dynamicProperty->val,
esxVI_Type_String) < 0) {
goto failure;
}
(*hostSystem)->name = strdup(dynamicProperty->val->string);
if ((*hostSystem)->name == NULL) {
virReportOOMError();
goto failure;
}
} else if (STREQ(dynamicProperty->name, "configManager")) {
if (esxVI_HostConfigManager_CastFromAnyType
(dynamicProperty->val, &(*hostSystem)->configManager) < 0) {
goto failure;
}
}
}
if (esxVI_HostSystem_Validate(*hostSystem) < 0) {
goto failure;
}
return 0;
failure:
esxVI_HostSystem_Free(hostSystem);
return -1;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Enum: VirtualMachinePowerState (Additions) * VI Enum: VirtualMachinePowerState (Additions)
*/ */
......
/* /*
* esx_vi_types.h: client for the VMware VI API 2.5 to manage ESX hosts * esx_vi_types.h: client for the VMware VI API 2.5 to manage ESX hosts
* *
* Copyright (C) 2009-2010 Matthias Bolte <matthias.bolte@googlemail.com> * Copyright (C) 2009-2011 Matthias Bolte <matthias.bolte@googlemail.com>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -44,15 +45,18 @@ typedef struct _esxVI_DateTime esxVI_DateTime; ...@@ -44,15 +45,18 @@ typedef struct _esxVI_DateTime esxVI_DateTime;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Types * SOAP
*/ */
typedef struct _esxVI_Fault esxVI_Fault; typedef struct _esxVI_Fault esxVI_Fault;
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Objects
*/
typedef struct _esxVI_MethodFault esxVI_MethodFault; typedef struct _esxVI_MethodFault esxVI_MethodFault;
typedef struct _esxVI_ManagedObjectReference esxVI_ManagedObjectReference; typedef struct _esxVI_ManagedObjectReference esxVI_ManagedObjectReference;
typedef struct _esxVI_Datacenter esxVI_Datacenter;
typedef struct _esxVI_ComputeResource esxVI_ComputeResource;
typedef struct _esxVI_HostSystem esxVI_HostSystem;
# include "esx_vi_types.generated.typedef" # include "esx_vi_types.generated.typedef"
...@@ -74,9 +78,6 @@ enum _esxVI_Type { ...@@ -74,9 +78,6 @@ enum _esxVI_Type {
esxVI_Type_Fault, esxVI_Type_Fault,
esxVI_Type_MethodFault, esxVI_Type_MethodFault,
esxVI_Type_ManagedObjectReference, esxVI_Type_ManagedObjectReference,
esxVI_Type_Datacenter,
esxVI_Type_ComputeResource,
esxVI_Type_HostSystem,
# include "esx_vi_types.generated.typeenum" # include "esx_vi_types.generated.typeenum"
...@@ -170,6 +171,7 @@ struct _esxVI_String { ...@@ -170,6 +171,7 @@ struct _esxVI_String {
int esxVI_String_Alloc(esxVI_String **string); int esxVI_String_Alloc(esxVI_String **string);
void esxVI_String_Free(esxVI_String **stringList); void esxVI_String_Free(esxVI_String **stringList);
int esxVI_String_Validate(esxVI_String *string); int esxVI_String_Validate(esxVI_String *string);
bool esxVI_String_ListContainsValue(esxVI_String *stringList, const char *value);
int esxVI_String_AppendToList(esxVI_String **stringList, esxVI_String *string); int esxVI_String_AppendToList(esxVI_String **stringList, esxVI_String *string);
int esxVI_String_AppendValueToList(esxVI_String **stringList, int esxVI_String_AppendValueToList(esxVI_String **stringList,
const char *value); const char *value);
...@@ -264,7 +266,7 @@ int esxVI_DateTime_ConvertToCalendarTime(esxVI_DateTime *dateTime, ...@@ -264,7 +266,7 @@ int esxVI_DateTime_ConvertToCalendarTime(esxVI_DateTime *dateTime,
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: Fault * SOAP: Fault
*/ */
struct _esxVI_Fault { struct _esxVI_Fault {
...@@ -283,7 +285,7 @@ int esxVI_Fault_Deserialize(xmlNodePtr node, esxVI_Fault **fault); ...@@ -283,7 +285,7 @@ int esxVI_Fault_Deserialize(xmlNodePtr node, esxVI_Fault **fault);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: MethodFault * VI Object: MethodFault
*/ */
/* /*
...@@ -306,7 +308,7 @@ int esxVI_MethodFault_Deserialize(xmlNodePtr node, ...@@ -306,7 +308,7 @@ int esxVI_MethodFault_Deserialize(xmlNodePtr node,
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Type: ManagedObjectReference * VI Object: ManagedObjectReference
*/ */
struct _esxVI_ManagedObjectReference { struct _esxVI_ManagedObjectReference {
...@@ -347,84 +349,6 @@ int esxVI_ManagedObjectReference_Deserialize ...@@ -347,84 +349,6 @@ int esxVI_ManagedObjectReference_Deserialize
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: Datacenter
* extends ManagedEntity
*/
struct _esxVI_Datacenter {
esxVI_Datacenter *_next; /* optional */
esxVI_Type _type; /* required */
esxVI_ManagedObjectReference *_reference; /* required */
/* ManagedEntity */
char *name; /* required */
/* Datacenter */
esxVI_ManagedObjectReference *hostFolder; /* required */
esxVI_ManagedObjectReference *vmFolder; /* required */
};
int esxVI_Datacenter_Alloc(esxVI_Datacenter **datacenter);
void esxVI_Datacenter_Free(esxVI_Datacenter **datacenter);
int esxVI_Datacenter_Validate(esxVI_Datacenter *datacenter);
int esxVI_Datacenter_CastFromObjectContent(esxVI_ObjectContent *objectContent,
esxVI_Datacenter **datacenter);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: ComputeResource
* extends ManagedEntity
*/
struct _esxVI_ComputeResource {
esxVI_ComputeResource *_next; /* optional */
esxVI_Type _type; /* required */
esxVI_ManagedObjectReference *_reference; /* required */
/* ManagedEntity */
char *name; /* required */
/* ComputeResource */
esxVI_ManagedObjectReference *host; /* optional, list */
esxVI_ManagedObjectReference *resourcePool; /* optional */
};
int esxVI_ComputeResource_Alloc(esxVI_ComputeResource **computeResource);
void esxVI_ComputeResource_Free(esxVI_ComputeResource **computeResource);
int esxVI_ComputeResource_Validate(esxVI_ComputeResource *computeResource);
int esxVI_ComputeResource_CastFromObjectContent
(esxVI_ObjectContent *objectContent,
esxVI_ComputeResource **computeResource);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Managed Object: HostSystem
* extends ManagedEntity
*/
struct _esxVI_HostSystem {
esxVI_HostSystem *_next; /* optional */
esxVI_Type _type; /* required */
esxVI_ManagedObjectReference *_reference; /* required */
/* ManagedEntity */
char *name; /* required */
/* HostSystem */
esxVI_HostConfigManager *configManager; /* required */
};
int esxVI_HostSystem_Alloc(esxVI_HostSystem **hostSystem);
void esxVI_HostSystem_Free(esxVI_HostSystem **hostSystem);
int esxVI_HostSystem_Validate(esxVI_HostSystem *hostSystem);
int esxVI_HostSystem_CastFromObjectContent(esxVI_ObjectContent *objectContent,
esxVI_HostSystem **hostSystem);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* VI Enum: VirtualMachinePowerState (Additions) * VI Enum: VirtualMachinePowerState (Additions)
*/ */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册