On Sun, Dec 13, 2009 at 12:20:43AM +0100, Matthias Bolte wrote:
> If an ESX host is managed by a vCenter, it knows the IP address of the
> vCenter. Setting the vCenter query parameter to * allows to connect to the
> vCenter known to an ESX host without the need to specify its IP address
> or hostname explicitly.
> ---
>  src/esx/esx_driver.c |  125 
> +++++++++++++++++++++++++++++++++++++++-----------
>  1 files changed, 98 insertions(+), 27 deletions(-)
> 
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index db379d7..d7e1ab5 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -234,7 +234,7 @@ esxCapsInit(virConnectPtr conn)
>  
>  
>  /*
> - * URI format: 
> {esx|gsx}://[<user>@]<server>[:<port>][?transport={http|https}][&vcenter=<vcenter>][&no_verify={0|1}][&auto_answer={0|1}]
> + * URI format: {esx|gsx}://[<user>@]<server>[:<port>]/[<query parameter> ...]
>   *
>   * If no port is specified the default port is set dependent on the scheme 
> and
>   * transport parameter:
> @@ -243,10 +243,19 @@ esxCapsInit(virConnectPtr conn)
>   * - gsx+http  8222
>   * - gsx+https 8333
>   *
> + * Optional query parameters:
> + * - transport={http|https}
> + * - vcenter={<vcenter>|*}
> + * - no_verify={0|1}
> + * - auto_answer={0|1}
> + *
>   * If no transport parameter is specified https is used.
>   *
>   * The vcenter parameter is only necessary for migration, because the vCenter
> - * server is in charge to initiate a migration between two ESX hosts.
> + * server is in charge to initiate a migration between two ESX hosts. The
> + * vcenter parameter can be set to an explicity hostname or to *. If set to 
> *,
> + * the driver will check if the ESX host is managed by a vCenter and connect 
> to
> + * it. If the ESX host is not managed by a vCenter an error is reported.
>   *
>   * If the no_verify parameter is set to 1, this disables libcurl client 
> checks
>   * of the server's certificate. The default value it 0.
> @@ -258,6 +267,7 @@ esxCapsInit(virConnectPtr conn)
>  static virDrvOpenStatus
>  esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags 
> ATTRIBUTE_UNUSED)
>  {
> +    virDrvOpenStatus result = VIR_DRV_OPEN_SUCCESS;
>      esxPrivate *priv = NULL;
>      char hostIpAddress[NI_MAXHOST] = "";
>      char vCenterIpAddress[NI_MAXHOST] = "";
> @@ -267,6 +277,9 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>      int autoAnswer = 0; // boolean
>      char *username = NULL;
>      char *password = NULL;
> +    esxVI_String *propertyNameList = NULL;
> +    esxVI_ObjectContent *hostSystem = NULL;
> +    esxVI_DynamicProperty *dynamicProperty = NULL;
>  
>      /* Decline if the URI is NULL or the scheme is neither 'esx' nor 'gsx' */
>      if (conn->uri == NULL || conn->uri->scheme == NULL ||
> @@ -305,18 +318,6 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>          priv->autoAnswer = esxVI_Boolean_True;
>      }
>  
> -    /* Request credentials and login to host/vCenter */
> -    if (esxUtil_ResolveHostname(conn, conn->uri->server, hostIpAddress,
> -                                NI_MAXHOST) < 0) {
> -        goto failure;
> -    }
> -
> -    if (vCenter != NULL &&
> -        esxUtil_ResolveHostname(conn, vCenter, vCenterIpAddress,
> -                                NI_MAXHOST) < 0) {
> -        goto failure;
> -    }
> -
>      /*
>       * Set the port dependent on the transport protocol if no port is
>       * specified. This allows us to rely on the port parameter being
> @@ -340,6 +341,11 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>      }
>  
>      /* Login to host */
> +    if (esxUtil_ResolveHostname(conn, conn->uri->server, hostIpAddress,
> +                                NI_MAXHOST) < 0) {
> +        goto failure;
> +    }
> +
>      if (virAsprintf(&url, "%s://%s:%d/sdk", priv->transport,
>                      conn->uri->server, conn->uri->port) < 0) {
>          virReportOOMError(conn);
> @@ -394,12 +400,77 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>          }
>      }
>  
> -    VIR_FREE(url);
> -    VIR_FREE(password);
> -    VIR_FREE(username);
> -
>      /* Login to vCenter */
>      if (vCenter != NULL) {
> +        VIR_FREE(url);
> +        VIR_FREE(password);
> +        VIR_FREE(username);
> +
> +        /* If a vCenter is specified resolve the hostname */
> +        if (STRNEQ(vCenter, "*") &&
> +            esxUtil_ResolveHostname(conn, vCenter, vCenterIpAddress,
> +                                    NI_MAXHOST) < 0) {
> +            goto failure;
> +        }
> +
> +        /* Lookup the vCenter from the ESX host */
> +        if (esxVI_String_AppendValueToList
> +              (conn, &propertyNameList, "summary.managementServerIp") < 0 ||
> +            esxVI_LookupHostSystemByIp(conn, priv->host, hostIpAddress,
> +                                       propertyNameList, &hostSystem) < 0) {
> +            goto failure;
> +        }
> +
> +        for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL;
> +             dynamicProperty = dynamicProperty->_next) {
> +            if (STREQ(dynamicProperty->name,
> +                      "summary.managementServerIp")) {
> +                if (esxVI_AnyType_ExpectType(conn, dynamicProperty->val,
> +                                             esxVI_Type_String) < 0) {
> +                    goto failure;
> +                }
> +
> +                /* Get the vCenter IP address or verify the specified one */
> +                if (STREQ(vCenter, "*")) {
> +                    VIR_FREE(vCenter);
> +
> +                    vCenter = strdup(dynamicProperty->val->string);
> +
> +                    if (vCenter == NULL) {
> +                        virReportOOMError(conn);
> +                        goto failure;
> +                    }
> +
> +                    if (virStrcpyStatic(vCenterIpAddress,
> +                                        dynamicProperty->val->string) == 
> NULL) {
> +                        ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
> +                                  "vCenter IP address %s too big for "
> +                                  "destination", 
> dynamicProperty->val->string);
> +                        goto failure;
> +                    }
> +                } else if (STRNEQ(vCenterIpAddress,
> +                           dynamicProperty->val->string)) {
> +                    ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
> +                              "This host is managed by a vCenter with IP "
> +                              "address %s, but a mismachting vCenter '%s' "
> +                              "(%s) has been specified",
> +                              dynamicProperty->val->string, vCenter,
> +                              vCenterIpAddress);
> +                    goto failure;
> +                }
> +
> +                break;
> +            } else {
> +                VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
> +            }
> +        }
> +
> +        if (STREQ(vCenter, "*")) {
> +            ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR,
> +                      "This host is not managed by a vCenter");
> +            goto failure;
> +        }
> +
>          if (virAsprintf(&url, "%s://%s/sdk", priv->transport,
>                          vCenter) < 0) {
>              virReportOOMError(conn);
> @@ -440,11 +511,6 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>                        conn->uri->server);
>              goto failure;
>          }
> -
> -        VIR_FREE(url);
> -        VIR_FREE(vCenter);
> -        VIR_FREE(password);
> -        VIR_FREE(username);
>      }
>  
>      conn->privateData = priv;
> @@ -456,14 +522,17 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>          goto failure;
>      }
>  
> -    return VIR_DRV_OPEN_SUCCESS;
> -
> -  failure:
> +  cleanup:
>      VIR_FREE(url);
>      VIR_FREE(vCenter);
>      VIR_FREE(password);
>      VIR_FREE(username);
> +    esxVI_String_Free(&propertyNameList);
> +    esxVI_ObjectContent_Free(&hostSystem);
>  
> +    return result;
> +
> +  failure:
>      if (priv != NULL) {
>          esxVI_Context_Free(&priv->host);
>          esxVI_Context_Free(&priv->vCenter);
> @@ -474,7 +543,9 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int 
> flags ATTRIBUTE_UNUSED)
>          VIR_FREE(priv);
>      }
>  
> -    return VIR_DRV_OPEN_ERROR;
> +    result = VIR_DRV_OPEN_ERROR;
> +
> +    goto cleanup;
>  }
>  
>  

  ACK, this should make it easier to set things up ! The doc update is
  nice, as well as the HTML update in the following patch

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
dan...@veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/

--
Libvir-list mailing list
Libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to