2014-03-27 23:24 GMT+01:00 Dawid Zamirski <dzamirski@xxxxxxxxxxxxxxx>: > Currently, ESX driver can only issue VI method calls available in version > 2.5. To send method calls available in newer versions, a SOAPAction > header needs to be set in the following format: > > 'SOAPAction: "urn:vim25/<version_number>"' > > This patch modifies the Python code generator to optionally read > 'apiVersion' token from .input file which is then passed to the > ESX_VI_METHOD macro. If the apiVersion is not specified, "2.5" is passed > by default. Finally, the esx_VI_Context_Execute function takes this > argument and conditionally sets SOAPAction header, performs CURL > request, and then unsets it again so that any subsequest 2.5 call gets > 2.5 formatted XML response. > > In conclusion, this patch allows to make method calls for VI API greater > than v2.5 wthout braking existing v2.5 calls. > --- > src/esx/esx_vi.c | 26 +++++++++++++++++++++++++- > src/esx/esx_vi.h | 2 +- > src/esx/esx_vi_generator.py | 20 +++++++++++++++----- > src/esx/esx_vi_methods.c | 12 +++++++----- > 4 files changed, 48 insertions(+), 12 deletions(-) > > diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c > index 6188139..393a009 100644 > --- a/src/esx/esx_vi.c > +++ b/src/esx/esx_vi.c > @@ -1251,8 +1253,29 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, > curl_easy_setopt(ctx->curl->handle, CURLOPT_POSTFIELDS, request); > curl_easy_setopt(ctx->curl->handle, CURLOPT_POSTFIELDSIZE, strlen(request)); > > + if (!STRPREFIX(apiVersion, "2.5")) { > + origHeader = ctx->curl->headers; > + > + virBufferAsprintf(&buffer, "SOAPAction: \"urn:vim25/%s\"", apiVersion); > + versionHeader = virBufferContentAndReset(&buffer); > + > + ctx->curl->headers = curl_slist_append(ctx->curl->headers, > + versionHeader); > + curl_easy_setopt(ctx->curl->handle, CURLOPT_HTTPHEADER, > + ctx->curl->headers); > + } > + > (*response)->responseCode = esxVI_CURL_Perform(ctx->curl, ctx->url); > > + if (origHeader) { > + curl_slist_free_all(origHeader->next); > + origHeader->next = NULL; > + > + ctx->curl->headers = origHeader; > + curl_easy_setopt(ctx->curl->handle, CURLOPT_HTTPHEADER, > + ctx->curl->headers); > + } > + > virMutexUnlock(&ctx->curl->lock); This works but is inefficient if you do many calls to non-2.5 functions. I the context of this series this is okay as you're only calling a single non-2.5 function. As a more general approach I would add multiple header lists to the esxVI_CURL struct, one for each API version we want to call. Also the esxVI_CURL struct would keep that of which header list is currently in use. Then esxVI_Context_Execute would only have to change the used header list if the API version is different from the last call. The header lists for the different API version would be created beforehand and not in esxVI_Context_Execute. -- Matthias Bolte http://photron.blogspot.com -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list