#include "util.h"
#include "uuid.h"
#include "virterror_internal.h"
+#include "xml.h"
#include "esx_vi.h"
#include "esx_vi_methods.h"
#include "esx_util.h"
int
esxVI_RemoteRequest_Execute(virConnectPtr conn, esxVI_Context *ctx,
esxVI_RemoteRequest *remoteRequest,
- esxVI_RemoteResponse **remoteResponse)
+ esxVI_RemoteResponse **remoteResponse,
+ esxVI_Boolean expectList)
{
virBuffer buffer = VIR_BUFFER_INITIALIZER;
esxVI_Fault *fault = NULL;
BAD_CAST "urn:vim25");
if ((*remoteResponse)->responseCode == 500) {
- (*remoteResponse)->xpathObject =
- xmlXPathEval(BAD_CAST
- "/soapenv:Envelope/soapenv:Body/soapenv:Fault",
- (*remoteResponse)->xpathContext);
-
- if (esxVI_RemoteResponse_DeserializeXPathObject
- (conn, *remoteResponse,
- (esxVI_RemoteResponse_DeserializeFunc)
- esxVI_Fault_Deserialize,
- (void **)&fault) < 0) {
+ (*remoteResponse)->node =
+ virXPathNode(conn, "/soapenv:Envelope/soapenv:Body/soapenv:Fault",
+ (*remoteResponse)->xpathContext);
+
+ if ((*remoteResponse)->node == NULL) {
+ ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
+ "HTTP response code %d. VI Fault is unknown, "
+ "XPath evaluation failed",
+ (int)(*remoteResponse)->responseCode);
+ goto failure;
+ }
+
+ if (esxVI_Fault_Deserialize(conn, (*remoteResponse)->node,
+ &fault) < 0) {
+ ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
+ "HTTP response code %d. VI Fault is unknown, "
+ "deserialization failed",
+ (int)(*remoteResponse)->responseCode);
goto failure;
}
fault->faultcode, fault->faultstring);
goto failure;
+ } else if (expectList == esxVI_Boolean_True) {
+ xmlNodePtr *nodeSet = NULL;
+ int nodeSet_size;
+
+ nodeSet_size = virXPathNodeSet(conn, remoteRequest->xpathExpression,
+ (*remoteResponse)->xpathContext,
+ &nodeSet);
+
+ if (nodeSet_size < 0) {
+ ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
+ "XPath evaluation of '%s' failed",
+ remoteRequest->xpathExpression);
+ goto failure;
+ } else if (nodeSet_size == 0) {
+ (*remoteResponse)->node = NULL;
+ } else {
+ (*remoteResponse)->node = nodeSet[0];
+ }
+
+ VIR_FREE(nodeSet);
} else {
- (*remoteResponse)->xpathObject =
- xmlXPathEval(BAD_CAST remoteRequest->xpathExpression,
+ (*remoteResponse)->node =
+ virXPathNode(conn, remoteRequest->xpathExpression,
(*remoteResponse)->xpathContext);
+
+ if ((*remoteResponse)->node == NULL) {
+ ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
+ "XPath evaluation of '%s' failed",
+ remoteRequest->xpathExpression);
+ goto failure;
+ }
}
} else if ((*remoteResponse)->responseCode != 200) {
ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
{
VIR_FREE(item->response);
- xmlXPathFreeObject(item->xpathObject);
xmlXPathFreeContext(item->xpathContext);
if (item->document != NULL) {
}
});
-int
-esxVI_RemoteResponse_DeserializeXPathObject
- (virConnectPtr conn, esxVI_RemoteResponse *remoteResponse,
- esxVI_RemoteResponse_DeserializeFunc deserializeFunc, void **item)
-{
- xmlNodePtr node = NULL;
-
- if (remoteResponse->xpathObject != NULL &&
- remoteResponse->xpathObject->type == XPATH_NODESET) {
- if (remoteResponse->xpathObject->nodesetval->nodeNr != 1) {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Expecting 1 XML node but found '%d'",
- remoteResponse->xpathObject->nodesetval->nodeNr);
- return -1;
- }
-
- node = remoteResponse->xpathObject->nodesetval->nodeTab[0];
-
- if (node->type != XML_ELEMENT_NODE) {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Wrong XML element type %d", node->type);
- return -1;
- }
-
- if (deserializeFunc(conn, node, item) < 0) {
- return -1;
- }
- } else {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR, "XPath error");
- return -1;
- }
-
- return 0;
-}
-
-int
-esxVI_RemoteResponse_DeserializeXPathObjectList
- (virConnectPtr conn, esxVI_RemoteResponse *remoteResponse,
- esxVI_RemoteResponse_DeserializeListFunc deserializeListFunc,
- esxVI_List **list)
-{
- xmlNodePtr node = NULL;
-
- if (remoteResponse->xpathObject != NULL &&
- remoteResponse->xpathObject->type == XPATH_NODESET) {
- if (remoteResponse->xpathObject->nodesetval->nodeNr > 0) {
- node = remoteResponse->xpathObject->nodesetval->nodeTab[0];
-
- if (node->type != XML_ELEMENT_NODE) {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Wrong XML element type %d", node->type);
- return -1;
- }
- } else {
- node = NULL;
- }
-
- if (deserializeListFunc(conn, node, list) < 0) {
- return -1;
- }
- } else {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR, "XPath error");
- return -1;
- }
-
- return 0;
-}
-
-int
-esxVI_RemoteResponse_DeserializeXPathObjectAsManagedObjectReference
- (virConnectPtr conn, esxVI_RemoteResponse *remoteResponse,
- esxVI_ManagedObjectReference **managedObjectReference,
- const char *expectedType)
-{
- xmlNodePtr node = NULL;
-
- if (remoteResponse->xpathObject != NULL &&
- remoteResponse->xpathObject->type == XPATH_NODESET) {
- if (remoteResponse->xpathObject->nodesetval->nodeNr != 1) {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Expecting 1 XML node but found '%d'",
- remoteResponse->xpathObject->nodesetval->nodeNr);
- return -1;
- }
-
- node = remoteResponse->xpathObject->nodesetval->nodeTab[0];
-
- if (node->type != XML_ELEMENT_NODE) {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
- "Wrong XML element type %d", node->type);
- return -1;
- }
-
- if (esxVI_ManagedObjectReference_Deserialize(conn, node,
- managedObjectReference,
- expectedType) < 0) {
- return -1;
- }
- } else {
- ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR, "XPath error");
- return -1;
- }
-
- return 0;
-}
-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
goto failure;
}
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectAsManagedObjectReference
- (conn, remoteResponse, task, "Task") < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_ManagedObjectReference_Deserialize
+ (conn, remoteResponse->node, task, "Task") < 0) {
goto failure;
}
remoteRequest->request = virBufferContentAndReset(&buffer);
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("RetrieveServiceContent");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObject
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeFunc)
- esxVI_ServiceContent_Deserialize,
- (void **)serviceContent) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_ServiceContent_Deserialize(conn, remoteResponse->node,
+ serviceContent) < 0) {
goto failure;
}
remoteRequest->request = virBufferContentAndReset(&buffer);
remoteRequest->xpathExpression = ESX_VI__SOAP__RESPONSE_XPATH("Login");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObject
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeFunc)
- esxVI_UserSession_Deserialize,
- (void **)userSession) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_UserSession_Deserialize(conn, remoteResponse->node,
+ userSession) < 0) {
goto failure;
}
remoteRequest->request = virBufferContentAndReset(&buffer);
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("SessionIsActive");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObject
- (conn, remoteResponse,
- /*
- * FIXME: esxVI_Boolean_Deserialize expects *boolean,
- * esxVI_RemoteResponse_DeserializeFunc expects void **,
- * passing *boolean casted to void * to it
- */
- (esxVI_RemoteResponse_DeserializeFunc)esxVI_Boolean_Deserialize,
- (void *)active) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_Boolean_Deserialize(conn, remoteResponse->node, active) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("RetrieveProperties");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectList
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeListFunc)
- esxVI_ObjectContent_DeserializeList,
- (esxVI_List **)objectContentList) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_True) < 0 ||
+ esxVI_ObjectContent_DeserializeList(conn, remoteResponse->node,
+ objectContentList) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("CreateFilter");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectAsManagedObjectReference
- (conn, remoteResponse, propertyFilter, "PropertyFilter") < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_ManagedObjectReference_Deserialize
+ (conn, remoteResponse->node, propertyFilter, "PropertyFilter") < 0) {
goto failure;
}
remoteRequest->request = virBufferContentAndReset(&buffer);
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("WaitForUpdates");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObject
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeFunc)esxVI_UpdateSet_Deserialize,
- (void **)updateSet) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_UpdateSet_Deserialize(conn, remoteResponse->node,
+ updateSet) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("ValidateMigration");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectList
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeListFunc)
- esxVI_Event_DeserializeList,
- (esxVI_List **)eventList) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_True) < 0 ||
+ esxVI_Event_DeserializeList(conn, remoteResponse->node,
+ eventList) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("FindByIp");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectAsManagedObjectReference
- (conn, remoteResponse, managedObjectReference,
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_ManagedObjectReference_Deserialize
+ (conn, remoteResponse->node, managedObjectReference,
vmSearch == esxVI_Boolean_True ? "VirtualMachine"
: "HostSystem") < 0) {
goto failure;
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("FindByUuid");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectAsManagedObjectReference
- (conn, remoteResponse, managedObjectReference,
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_False) < 0 ||
+ esxVI_ManagedObjectReference_Deserialize
+ (conn, remoteResponse->node, managedObjectReference,
vmSearch == esxVI_Boolean_True ? "VirtualMachine"
: "HostSystem") < 0) {
goto failure;
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("QueryAvailablePerfMetric");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectList
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeListFunc)
- esxVI_PerfMetricId_DeserializeList,
- (esxVI_List **)perfMetricIdList) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_True) < 0 ||
+ esxVI_PerfMetricId_DeserializeList(conn, remoteResponse->node,
+ perfMetricIdList) < 0) {
goto failure;
}
remoteRequest->xpathExpression =
ESX_VI__SOAP__RESPONSE_XPATH("QueryPerfCounter");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectList
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeListFunc)
- esxVI_PerfCounterInfo_DeserializeList,
- (esxVI_List **)perfCounterInfoList) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_True) < 0 ||
+ esxVI_PerfCounterInfo_DeserializeList(conn, remoteResponse->node,
+ perfCounterInfoList) < 0) {
goto failure;
}
remoteRequest->request = virBufferContentAndReset(&buffer);
remoteRequest->xpathExpression = ESX_VI__SOAP__RESPONSE_XPATH("QueryPerf");
- if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest,
- &remoteResponse) < 0 ||
- esxVI_RemoteResponse_DeserializeXPathObjectList
- (conn, remoteResponse,
- (esxVI_RemoteResponse_DeserializeListFunc)
- esxVI_PerfEntityMetric_DeserializeList,
- (esxVI_List **)perfEntityMetricList) < 0) {
+ if (esxVI_RemoteRequest_Execute(conn, ctx, remoteRequest, &remoteResponse,
+ esxVI_Boolean_True) < 0 ||
+ esxVI_PerfEntityMetric_DeserializeList(conn, remoteResponse->node,
+ perfEntityMetricList) < 0) {
goto failure;
}