Create API requests and handle responses

This document describes how to construct API requests and handle API responses from the VMware Engine API. It covers how to do the following:

  • Construct a request body.
  • Determine the resource URIs necessary for a request.
  • Handle API responses.
  • Determine whether an API request succeeded.

This document does not cover how to authenticate with the API. To learn how to authenticate with the API, read Authenticating requests.

Before you begin

  • Be familiar with REST APIs.
  • Know how to authenticate requests to the VMware Engine API.

Create an API request

The VMware Engine API expects API requests to be in JSON format. To make an API request, make a direct HTTP request by using tools like curl or httplib2. When you make an API request that requires a request body, like a POST, UPDATE, or PATCH request, the request body contains resource properties that you set in the request.

For example, the following curl command makes a POST request to the PrivateCloud resource URI. The request creates a private cloud with the properties defined in the request body. The curl request body is indicated by the -d flag:

curl -X POST "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/privateClouds?privateCloudId=example-privatecloud" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
  "networkConfig":{
    "managementCidr": "192.168.1.0/24"
    "vmwareEngineNetwork": "projects/example-project/locations/europe-west4/vmwareEngineNetworks/europe-west4-default",
  },
  "managementCluster":{
    "clusterId": "example-cluster"
    "nodeTypeId": "standard-72",
    "nodeCount": 3,
  },
  "description": "Example description of a private cloud"
}'

Creating resource URIs

In the VMware Engine API, a reference to another Google Cloud resource is given as a resource name. This format applies when you specify a private cloud, a cluster, a VMware Engine network, or any other resource.

For example, you might need to specify a network as part of a peering setup using a relative resource name. To provide the global default network in the the network property, your relative resource name looks something like this:

projects/example-project/network/default

In the preceding example, the specified network is a resource in the example-project project.

When performing list operations, you can also insert a wildcard using a hyphen (-). For example, the following resource name refers to private clouds in all locations of the specified project:

projects/example-project/locations/-/privateClouds

Determine required properties

The VMware Engine API reference documentation describes all of the possible properties you can set for a specific resource. The reference documentation makes a distinction between mutable versus immutable properties (marked by "Output only" in the property description). To determine required properties for an API method, review the documentation specific to the API method and identify properties marked as "Required" in the description.

Handle API responses

If you make a request that changes data, VMware Engine returns an Operation object that you can then poll to get the status of the operations for your request. When the operation is running, the Operation resource looks like the following example:

{
  "name": "projects/example-project/locations/europe-west4-a/operations/operation-1629406175532-5c9efb0499490-22bf8217-c53fd451",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vmwareengine.v1.OperationMetadata",
    "createTime": "2021-08-19T20:49:37.261822386Z",
    "target": "projects/example-project/locations/europe-west4-a/privateClouds/example-privatecloud",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Your request is not complete until the done field of the Operation resource returns as true. This process can take some time depending on the nature of your request. After the done field returns as true, you can check to see if the operation succeeded and whether there were any errors.

For example, the following response indicates that the preceding operation is now complete, and the absence of the error field indicates that the operation succeeded with no errors:

{
  "name": "projects/example-project/locations/europe-west4-a/operations/operation-1629406175532-5c9efb0499490-22bf8217-c53fd451",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vmwareengine.v1.OperationMetadata",
    "createTime": "2021-08-19T20:49:37.261822386Z",
    "endTime": "2021-08-19T22:44:37.529476321Z",
    "target": "projects/example-project/locations/europe-west4-a/privateClouds/example-privatecloud",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.vmwareengine.v1.PrivateCloud",
    "name": "projects/example-project/locations/europe-west4-a/privateClouds/example-privatecloud",
    "createTime": "2021-08-19T20:49:39.230Z",
    "updateTime": "2021-08-19T21:48:26.477Z",
    "state": "ACTIVE",
    "networkConfig": {
      "vmwareEngineNetwork": "projects/example-project/locations/europe-west4/vmwareEngineNetworks/europe-west4-default",
      "managementCidr": "192.168.1.0/24"
    },
    "hcx": {
      "fdqn": "hcx-49305.cdad53b7.europe-west4.gve.goog",
      "internalIp": "192.168.1.13",
      "state": "ACTIVE"
    },
    "nsx": {
      "fdqn": "nsx-49304.cdad53b7.europe-west4.gve.goog",
      "internalIp": "192.168.1.11",
      "state": "ACTIVE"
    },
    "vcenter": {
      "fdqn": "vcsa-49225.cdad53b7.europe-west4.gve.goog",
      "internalIp": "192.168.1.6",
      "version": "7.0.1.17928463",
      "state": "ACTIVE"
    }
  }
}

Poll operations

You can write some code to periodically poll the operation with a get or wait request that returns when the operation is complete.

With a get request, the operation is returned immediately, regardless of the status of the operation. You need to poll the operation regularly to know when the operation is done.

If you make a wait request, the request returns when the operation is complete or if the request approaches the 2 minute deadline. The wait method provides certain benefits over the get method:

  • You can set up your clients to poll for the operation status less frequently, reducing your query count to the VMware Engine API.
  • The average latency between when the operation is done and when the client is informed that the operation is done is significantly reduced because the server responds as soon as the operation is done.
  • The wait method provides bounded waits. The method waits for no more than the default HTTP timeout (2 minutes) and then returns the current state of the operation, which might be complete or in progress.

The wait method is a best-effort API. If the server is overloaded, the request might return before it reaches the default deadline, or after waiting just zero seconds. The method is also not guaranteed to return only when the operation is complete. For example, if the request approaches the 2 minute deadline, the method returns even if the operation is not done. We recommend that you use either the wait or get method with sleep in-between to regularly poll the operation status.

Error messages

When an API response that you receive contains the error field, then the operation encountered an error during processing. Use the error field to differentiate between error types and get more information about what happened.

For example, the following response contains an error message for an operation that attempted to update a private cloud:

{
  "done": true,
  "error": {
    "code": 9,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "resource",
            "subject": "projects/1234567891011/locations/asia-northeast1-a/privateClouds/example-privatecloud",
            "description": "`PrivateCloud` resource is already being modified. Wait for all pending operations to complete before making further changes."
          }
        ]
      },
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "RESOURCE_IS_BEING_MODIFIED",
        "domain": "vmwareengine.googleapis.com",
        "metadata": {
          "resourceType": "PrivateCloud"
        }
      }
    ],
    "message": "`PrivateCloud` resource is already being modified. Wait for all pending operations to complete before making further changes."
  },
  "name": "projects/example-project/locations/asia-northeast1-a/operations/operation-1653648987302-5dffc2878abff-d667a181-f17c686f",
  "metadata": {
    "createTime": "2022-05-27T10:56:27.671026261Z",
    "endTime": "2022-05-27T10:56:28.038648292Z",
    "target": "projects/example-project/locations/asia-northeast1-a/privateClouds/example-privatecloud",
    "verb": "update",
    "apiVersion": "v1",
    "@type": "type.googleapis.com/google.cloud.vmwareengine.v1.OperationMetadata"
  }
}

Example requests

The following sections contain example curl requests for some common use cases. For details about individual methods and resources, see the REST API reference.

Get a list of locations

To get a list of locations where VMware Engine is supported, use locations.list.

curl -LsX GET "https://vmwareengine.googleapis.com/v1/projects/example-project/locations" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json"

Get details of a single node type

To get information about a particular node type, use nodeTypes.get. The following example gets information about the standard-72 node type in the europe-west4-a location:

curl -LsX GET "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/nodeTypes/standard-72" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json"

Create a private cloud

To request creation of a new private cloud, use privateClouds.create. The following example creates a private cloud using the provided network and management cluster configuration:

curl -X POST "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/privateClouds?private_cloud_id=example-privatecloud" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
  "networkConfig":{
    "managementCidr": "192.168.1.0/24"
    "vmwareEngineNetwork": "projects/example-project/locations/europe-west4-a/vmwareEngineNetworks/europe-west4-default",
  },
  "managementCluster":{
    "clusterId": "example-cluster"
    "nodeTypeId": "standard-72",
    "nodeCount": 3,
  },
  "description": "Example description of a private cloud"
}'

Update the number of nodes in a cluster

To change the number of nodes in an existing cluster, use clusters.patch. The following example updates the node count of a cluster using the provided field mask and cluster configuration:

curl -X PATCH "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/privateClouds/example-privatecloud/clusters/example-cluster?updateMask=nodeCount" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
  "nodeCount": 5,
}'

Delete a private cloud

To mark a private cloud for deletion, use privateClouds.delete. When a private cloud is marked for deletion, VMware Engine sets an expiration time on the private cloud for when the deletion is final and can no longer be reversed.

The following example marks a private cloud for deletion after 5&hours:

curl -LsX DELETE "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/privateClouds/example-private-cloud?delayHours=5" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json"

Get details of an operation

To get information about a long-running operation, use operations.get. The following example gets details about an existing operation with the provided operation name:

curl -LsX GET "https://vmwareengine.googleapis.com/v1/projects/example-project/locations/europe-west4-a/operations/operation-1629406175532-5c9efb0499490-22bf8217-c53fd451" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json"