--- src/esx/esx_vi.c | 122 +++++++++++++++++++++++++++--------------------------- src/esx/esx_vi.h | 1 + 2 files changed, 62 insertions(+), 61 deletions(-) diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 78cfdfd..d361f01 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -464,6 +464,10 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, ctx->hasQueryVirtualDiskUuid = true; } + if (ctx->productVersion & esxVI_ProductVersion_VPX) { + ctx->hasSessionIsActive = true; + } + if (esxVI_Login(ctx, username, password, NULL, &ctx->session) < 0 || esxVI_BuildSelectSetCollection(ctx) < 0) { return -1; @@ -1452,6 +1456,7 @@ esxVI_BuildSelectSet(esxVI_SelectionSpec **selectSet, } + int esxVI_BuildSelectSetCollection(esxVI_Context *ctx) { @@ -1533,97 +1538,92 @@ esxVI_BuildSelectSetCollection(esxVI_Context *ctx) } -/* - * Can't use the SessionIsActive() function here, because at least - * 'ESX Server 3.5.0 build-64607' returns an 'method not implemented' fault if - * you try to call it. Query the session manager for the current session of - * this connection instead and re-login if there is no current session for this - * connection. - * - * Update: 'ESX 4.0.0 build-171294' doesn't implement this method. - */ -#define ESX_VI_USE_SESSION_IS_ACTIVE 0 int esxVI_EnsureSession(esxVI_Context *ctx) { -#if ESX_VI_USE_SESSION_IS_ACTIVE - esxVI_Boolean active = esxVI_Boolean_Undefined; -#else int result = -1; + esxVI_Boolean active = esxVI_Boolean_Undefined; esxVI_String *propertyNameList = NULL; esxVI_ObjectContent *sessionManager = NULL; esxVI_DynamicProperty *dynamicProperty = NULL; esxVI_UserSession *currentSession = NULL; -#endif if (ctx->session == NULL) { ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid call")); return -1; } -#if ESX_VI_USE_SESSION_IS_ACTIVE - if (esxVI_SessionIsActive(ctx, ctx->session->key, ctx->session->userName, - &active) < 0) { - return -1; - } - - if (active != esxVI_Boolean_True) { - esxVI_UserSession_Free(&ctx->session); - - if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, - &ctx->session) < 0) { + if (ctx->hasSessionIsActive) { + /* + * Use SessionIsActive to check if there is an active session for this + * connection an re-login in there isn't. + */ + if (esxVI_SessionIsActive(ctx, ctx->session->key, + ctx->session->userName, &active) < 0) { return -1; } - } - return 0; -#else - if (esxVI_String_AppendValueToList(&propertyNameList, - "currentSession") < 0 || - esxVI_LookupObjectContentByType(ctx, ctx->service->sessionManager, - "SessionManager", propertyNameList, - &sessionManager) < 0) { - goto cleanup; - } + if (active != esxVI_Boolean_True) { + esxVI_UserSession_Free(&ctx->session); - for (dynamicProperty = sessionManager->propSet; dynamicProperty != NULL; - dynamicProperty = dynamicProperty->_next) { - if (STREQ(dynamicProperty->name, "currentSession")) { - if (esxVI_UserSession_CastFromAnyType(dynamicProperty->val, - ¤tSession) < 0) { - goto cleanup; + if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, + &ctx->session) < 0) { + return -1; } + } - break; - } else { - VIR_WARN("Unexpected '%s' property", dynamicProperty->name); + return 0; + } else { + /* + * Query the session manager for the current session of this connection + * and re-login if there is no current session for this connection. + */ + if (esxVI_String_AppendValueToList(&propertyNameList, + "currentSession") < 0 || + esxVI_LookupObjectContentByType(ctx, ctx->service->sessionManager, + "SessionManager", propertyNameList, + &sessionManager) < 0) { + goto cleanup; + } + + for (dynamicProperty = sessionManager->propSet; dynamicProperty != NULL; + dynamicProperty = dynamicProperty->_next) { + if (STREQ(dynamicProperty->name, "currentSession")) { + if (esxVI_UserSession_CastFromAnyType(dynamicProperty->val, + ¤tSession) < 0) { + goto cleanup; + } + + break; + } else { + VIR_WARN("Unexpected '%s' property", dynamicProperty->name); + } } - } - if (currentSession == NULL) { - esxVI_UserSession_Free(&ctx->session); + if (currentSession == NULL) { + esxVI_UserSession_Free(&ctx->session); - if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, - &ctx->session) < 0) { + if (esxVI_Login(ctx, ctx->username, ctx->password, NULL, + &ctx->session) < 0) { + goto cleanup; + } + } else if (STRNEQ(ctx->session->key, currentSession->key)) { + ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", + _("Key of the current session differs from the key at " + "last login")); goto cleanup; } - } else if (STRNEQ(ctx->session->key, currentSession->key)) { - ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", - _("Key of the current session differs from the key at " - "last login")); - goto cleanup; - } - result = 0; + result = 0; cleanup: - esxVI_String_Free(&propertyNameList); - esxVI_ObjectContent_Free(&sessionManager); - esxVI_UserSession_Free(¤tSession); + esxVI_String_Free(&propertyNameList); + esxVI_ObjectContent_Free(&sessionManager); + esxVI_UserSession_Free(¤tSession); - return result; -#endif + return result; + } } diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h index b205b8c..aa47e87 100644 --- a/src/esx/esx_vi.h +++ b/src/esx/esx_vi.h @@ -168,6 +168,7 @@ struct _esxVI_Context { esxVI_SelectionSpec *selectSet_computeResourceToHost; esxVI_SelectionSpec *selectSet_computeResourceToParentToParent; bool hasQueryVirtualDiskUuid; + bool hasSessionIsActive; }; int esxVI_Context_Alloc(esxVI_Context **ctx); -- 1.7.0.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list