Clusters APIs
APIs for managing Clusters
Table of Contents
Note : The ipAddress field in request payload or response body are deprecated and will be removed. Please use fqdn field instead.
1. Create a Cluster
After you add the primary cluster, you can add more clusters to expand the domain.
1.1. Prerequisites API
The following data is required
ID of the domain in which the cluster is to be created
Cluster details
Name of the cluster
Hosts details
ID of the host (UUID)
License key for the host
List of VDS names to associate with host
ID of the vmNic host to be associated with VDS / N-VDS, once added to cluster
Datastore details
Note : Only one of "vsanDatastoreSpec" (For VSAN), "nfsDatastoreSpec" (For NFS) or "vmfsDatastoreSpec" (For VMFS on FC) or vvolDatastoreSpec (For VVOL) or vsanRemoteDatastoreClusterSpec (For vSAN Remote Datastore) must be specified.
* For VSAN
* Number of host failures to tolerate (can be 0, 1, or 2)
* License key for the vSAN datastore
* Esa Config to enable vSAN ESA
```json
{
"vsanDatastoreSpec" : {
"failuresToTolerate" : 1,
"licenseKey" : "XXXXX-XXXXX-XXXXX-XXXXX-XXXXX",
"esaConfig" : {
"enabled" : false
},
"datastoreName" : "sfo-w01-cl01-ds-vsan01"
}
}
```
* For NFS
* List of NFS server names
* Shared directory path
* User tag used to annotate NFS share
* Boolean to identify if the mount directory should be read-only
```json
{
"nfsDatastoreSpecs" : [ {
"nasVolume" : {
"serverName" : [ "10.0.0.250" ],
"path" : "/nfs_mount/my_read_write_folder",
"readOnly" : false
},
"datastoreName" : "sfo-w01-cl01-ds-nfs01"
} ]
}
```
* For VMFS on FC
* Ensure that the ESXi hosts have the given VMFS on FC datastore name configured.
```json
{
"vmfsDatastoreSpec" : {
"fcSpec" : [ {
"datastoreName" : "sfo-w01-cl01-ds-fc01"
} ]
}
}
```
* For VVOL, Ensure that the ESXi hosts have the given VVOL datastore name configured.
* Vasa provider guid
* Vasa container guid
* Protocol type for vVol container
* Vasa user guid
```json
{
"vvolDatastoreSpecs" : [ {
"name" : "sfo-w01-cl01-ds-vvol01",
"vasaProviderSpec" : {
"vasaProviderId" : "42de6c36-e85e-483b-89c1-4aee5e8deebe",
"storageContainerId" : "908ce3e4-4e8d-414b-84e7-847ba9883521",
"storageProtocolType" : "ISCSI",
"userId" : "d0ed4dd6-1375-4b12-af8c-96c18c46d319"
}
} ]
}
```
* For vSAN Compute Only Cluster
* vSAN datastore uuid of the server datastore
{
"vsanRemoteDatastoreClusterSpec" : {
"vsanRemoteDatastoreSpec" : [ {
"datastoreUuid" : "c83f081533b449e1-a1673ed0afdc4545",
"networkTopology" : "Symmetric"
} ]
}
}
Network Details
List of VDS details, For each VDS
Port group names and the corresponding transport type. Note that EDGE_INFRA_OVERLAY_UPLINK, VREALIZE should not be specified in the input spec. Multiple port groups with transport type PUBLIC can be created.
DVS host Infrastructure traffic resource type
Maximum allowed usage for a traffic class
Amount of bandwidth to be reserved for the host infrastructure traffic class
The list of transport zone(s) to be associated with the vSphere Distributed Switch managed by NSX. The supported transport types are OVERLAY and VLAN.
[ { "name" : "sfo-w01-cl01-vds01", "portGroupSpecs" : [ { "name" : "sfo-w01-cl01-vds01-pg-mgmt", "transportType" : "MANAGEMENT", "activeUplinks" : [ "uplink1", "uplink2" ], "teamingPolicy" : "loadbalance_ip" }, { "name" : "sfo-w01-cl01-vds01-pg-vsan", "transportType" : "VSAN", "activeUplinks" : [ "uplink1" ], "standByUplinks" : [ "uplink2" ], "teamingPolicy" : "loadbalance_loadbased" }, { "name" : "sfo-w01-cl01-vds01-pg-vmotion", "transportType" : "VMOTION", "activeUplinks" : [ "uplink2" ], "standByUplinks" : [ "uplink1" ], "teamingPolicy" : "loadbalance_srcmac" } ], "mtu" : 9000 }, { "name" : "sfo-w01-cl01-vds02", "nsxtSwitchConfig" : { "transportZones" : [ { "name" : "sfo-w01-nsx-overlay", "transportType" : "OVERLAY" }, { "name" : "sfo-w01-nsx-vlan01", "transportType" : "VLAN" } ], "hostSwitchOperationalMode" : "STANDARD" }, "mtu" : 9000 } ]
NSX cluster Details
For each vSphere Distributed Switch that is managed by NSX UplinkProfile needs to be defined inside nsxTClusterSpec . For DHCP transportVlan needs to be provided inside UplinkProfile
{ "nsxTClusterSpec" : { "uplinkProfiles" : [ { "name" : "Uplink-Profile-1", "teamings" : [ { "policy" : "FAILOVER_ORDER", "activeUplinks" : [ "uplink-1" ], "standByUplinks" : [ "uplink-2" ] } ], "transportVlan" : 2 } ] } }
TEP IP assignment can be done from the Static IP pool. For creating a new IP pool during the domain creation
{ "nsxTClusterSpec" : { "ipAddressPoolsSpec" : [ { "name" : "static-ip-pool-01", "subnets" : [ { "ipAddressPoolRanges" : [ { "start" : "10.0.11.50", "end" : "10.0.11.70" }, { "start" : "10.0.11.80", "end" : "10.0.11.150" } ], "cidr" : "10.0.11.0/24", "gateway" : "10.0.11.250" } ] } ], "uplinkProfiles" : [ { "name" : "Uplink-Profile-1", "teamings" : [ { "policy" : "FAILOVER_ORDER", "activeUplinks" : [ "uplink-1" ], "standByUplinks" : [ "uplink-2" ] } ], "transportVlan" : 2 } ] } }
For using an existing IP pool during the domain creation
{ "nsxTClusterSpec" : { "ipAddressPoolsSpec" : [ { "name" : "static-ip-pool-01" } ], "uplinkProfiles" : [ { "name" : "Uplink-Profile-1", "teamings" : [ { "policy" : "FAILOVER_ORDER", "activeUplinks" : [ "uplink-1" ], "standByUplinks" : [ "uplink-2" ] } ], "transportVlan" : 2 } ] } }
Note : To create a new IP address pool during domain creation, "subnets" , the list of IpAddressPoolSubnetSpec in the input spec must not be empty. Only the IP address pool name has to be sent in the input spec while using an existing IP address pool.
* Once vSphere Distributed Switch, Uplink Profiles and IP Address Pools Spec are defined, they need to be associated in *networkProfiles* in *networkSpec*
```json
[ {
"name" : "Cluster-1-network-profile01",
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl01-vds02",
"uplinkProfileName" : "Uplink-Profile-1",
"ipAddressPoolName" : "static-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
```
Note : In case of multiple profiles, the profile name needs to be referred in networkProfileName in HostNetworkSpec.
Network pool must be configured.
Logical VMware Cloud Foundation container (Workload Domain) must be provisioned.
Note : NSX management cluster is configured when the domain is created.
Prerequisites for vSAN, NFS or VMFS on FC or VVOL must be met.
License key details may be provisioned in vCenter.
Host configuration must have minimum two active vmNics.
There must be at least three hosts available in the VMware Cloud Foundation inventory.
Ensure that the hosts you want to add to the cluster are in UNASSIGNED_USEABLE state.
You must have valid host and vSAN (if using vSAN storage) license key specified with adequate sockets available for the host to be added.
A DHCP server must be configured on the Geneve VLAN of the respective domains. When NSX creates VTEPs for the hosts in the domain, they are assigned IP addresses from the DHCP server.
Evaluate if you want to have pNICs on multiple vSphere Distributed Switches in the NSX domain. At least two pNICs are needed on a single switch. Below is a spec sample:
{ "vmNics" : [ { "id" : "vmnic0", "vdsName" : "sfo-w01-cl01-vds01", "uplink" : "uplink1" }, { "id" : "vmnic1", "vdsName" : "sfo-w01-cl01-vds01", "uplink" : "uplink2" }, { "id" : "vmnic2", "vdsName" : "sfo-w01-cl01-vds02", "uplink" : "uplink1" }, { "id" : "vmnic3", "vdsName" : "sfo-w01-cl01-vds02", "uplink" : "uplink2" } ] }
1.2. Steps API
- Validate the input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/validations' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"domainId" : "3c557e14-f22d-4901-b5e4-39499bd82462",
"computeSpec" : {
"clusterSpecs" : [ {
"name" : "sfo-w01-cl02",
"hostSpecs" : [ {
"id" : "780f96ad-eb79-4943-adc0-fe6e604a905d",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "d52972dd-5cf6-4a6e-8f3c-d53e0d7f1f0f",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "6d27bbbc-fc5f-4cb3-8c87-c8bc17834ebd",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
} ],
"datastoreSpec" : {
"vsanDatastoreSpec" : {
"failuresToTolerate" : 1,
"licenseKey" : "XXXX-XXXX",
"datastoreName" : "sfo-w01-cl02-ds-vsan01"
}
},
"networkSpec" : {
"vdsSpecs" : [ {
"name" : "sfo-w01-cl02-vds01",
"portGroupSpecs" : [ {
"name" : "sfo-w01-cl02-vds01-pg-mgmt",
"transportType" : "MANAGEMENT",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vsan",
"transportType" : "VSAN",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vmotion",
"transportType" : "VMOTION",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
} ],
"mtu" : 9000
}, {
"name" : "sfo-w01-cl02-vds02",
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "sfo-m01-tz-vlan01",
"transportType" : "VLAN"
}, {
"name" : "sfo-m01-tz-overlay01",
"transportType" : "OVERLAY"
} ]
},
"mtu" : 9000
} ],
"nsxClusterSpec" : {
"nsxTClusterSpec" : {
"uplinkProfiles" : [ {
"name" : "Uplink-Profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 2
} ]
}
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile01",
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds02",
"uplinkProfileName" : "Uplink-Profile-1",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
},
"advancedOptions" : {
"evcMode" : "",
"highAvailability" : {
"enabled" : false
}
}
} ],
"skipFailedHosts" : false
}
}'
HTTP Request
POST /v1/clusters/validations HTTP/1.1
Content-Type: application/json
Content-Length: 4774
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"domainId" : "3c557e14-f22d-4901-b5e4-39499bd82462",
"computeSpec" : {
"clusterSpecs" : [ {
"name" : "sfo-w01-cl02",
"hostSpecs" : [ {
"id" : "780f96ad-eb79-4943-adc0-fe6e604a905d",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "d52972dd-5cf6-4a6e-8f3c-d53e0d7f1f0f",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "6d27bbbc-fc5f-4cb3-8c87-c8bc17834ebd",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
} ],
"datastoreSpec" : {
"vsanDatastoreSpec" : {
"failuresToTolerate" : 1,
"licenseKey" : "XXXX-XXXX",
"datastoreName" : "sfo-w01-cl02-ds-vsan01"
}
},
"networkSpec" : {
"vdsSpecs" : [ {
"name" : "sfo-w01-cl02-vds01",
"portGroupSpecs" : [ {
"name" : "sfo-w01-cl02-vds01-pg-mgmt",
"transportType" : "MANAGEMENT",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vsan",
"transportType" : "VSAN",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vmotion",
"transportType" : "VMOTION",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
} ],
"mtu" : 9000
}, {
"name" : "sfo-w01-cl02-vds02",
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "sfo-m01-tz-vlan01",
"transportType" : "VLAN"
}, {
"name" : "sfo-m01-tz-overlay01",
"transportType" : "OVERLAY"
} ]
},
"mtu" : 9000
} ],
"nsxClusterSpec" : {
"nsxTClusterSpec" : {
"uplinkProfiles" : [ {
"name" : "Uplink-Profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 2
} ]
}
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile01",
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds02",
"uplinkProfileName" : "Uplink-Profile-1",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
},
"advancedOptions" : {
"evcMode" : "",
"highAvailability" : {
"enabled" : false
}
}
} ],
"skipFailedHosts" : false
}
}
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 292
{
"id" : "135e143f-5420-4c16-b182-085dc35f8295",
"description" : "Validating Cluster Creation Spec",
"executionStatus" : "COMPLETED",
"resultStatus" : "SUCCEEDED",
"validationChecks" : [ {
"description" : "ClusterCreationSpecValidation",
"resultStatus" : "SUCCEEDED"
} ]
}
In case of no errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "SUCCEEDED".
In case of errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "FAILED".
Note : Make changes to the input specification and re-validate using a new API invocation.
- Trigger the task using the valid input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Accept-Language: zh' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"domainId" : "df259653-e28d-422f-a3d6-e80add1de91b",
"computeSpec" : {
"clusterSpecs" : [ {
"name" : "sfo-w01-cl02",
"hostSpecs" : [ {
"id" : "4ee5cdd0-2480-433f-a934-c91cb7fbffeb",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "169fa834-301b-4d07-a44e-f2e97db4f119",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "68f574c8-8280-4fed-a82e-2895b6a32d39",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
} ],
"datastoreSpec" : {
"vsanDatastoreSpec" : {
"failuresToTolerate" : 1,
"licenseKey" : "XXXX-XXXX",
"datastoreName" : "sfo-w01-cl02-ds-vsan01"
}
},
"networkSpec" : {
"vdsSpecs" : [ {
"name" : "sfo-w01-cl02-vds01",
"portGroupSpecs" : [ {
"name" : "sfo-w01-cl02-vds01-pg-mgmt",
"transportType" : "MANAGEMENT",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vsan",
"transportType" : "VSAN",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vmotion",
"transportType" : "VMOTION",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
} ],
"mtu" : 9000
}, {
"name" : "sfo-w01-cl02-vds02",
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "sfo-m01-tz-vlan01",
"transportType" : "VLAN"
}, {
"name" : "sfo-m01-tz-overlay01",
"transportType" : "OVERLAY"
} ]
},
"mtu" : 9000
} ],
"nsxClusterSpec" : {
"nsxTClusterSpec" : {
"uplinkProfiles" : [ {
"name" : "Uplink-Profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 2
} ]
}
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile01",
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds02",
"uplinkProfileName" : "Uplink-Profile-1",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
},
"advancedOptions" : {
"evcMode" : "",
"highAvailability" : {
"enabled" : false
}
}
} ],
"skipFailedHosts" : false
}
}'
HTTP Request
POST /v1/clusters HTTP/1.1
Content-Type: application/json
Accept-Language: zh
Content-Length: 4774
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"domainId" : "df259653-e28d-422f-a3d6-e80add1de91b",
"computeSpec" : {
"clusterSpecs" : [ {
"name" : "sfo-w01-cl02",
"hostSpecs" : [ {
"id" : "4ee5cdd0-2480-433f-a934-c91cb7fbffeb",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "169fa834-301b-4d07-a44e-f2e97db4f119",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "68f574c8-8280-4fed-a82e-2895b6a32d39",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ]
}
} ],
"datastoreSpec" : {
"vsanDatastoreSpec" : {
"failuresToTolerate" : 1,
"licenseKey" : "XXXX-XXXX",
"datastoreName" : "sfo-w01-cl02-ds-vsan01"
}
},
"networkSpec" : {
"vdsSpecs" : [ {
"name" : "sfo-w01-cl02-vds01",
"portGroupSpecs" : [ {
"name" : "sfo-w01-cl02-vds01-pg-mgmt",
"transportType" : "MANAGEMENT",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vsan",
"transportType" : "VSAN",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
}, {
"name" : "sfo-w01-cl02-vds01-pg-vmotion",
"transportType" : "VMOTION",
"activeUplinks" : [ "uplink1", "uplink2" ],
"teamingPolicy" : "loadbalance_loadbased"
} ],
"mtu" : 9000
}, {
"name" : "sfo-w01-cl02-vds02",
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "sfo-m01-tz-vlan01",
"transportType" : "VLAN"
}, {
"name" : "sfo-m01-tz-overlay01",
"transportType" : "OVERLAY"
} ]
},
"mtu" : 9000
} ],
"nsxClusterSpec" : {
"nsxTClusterSpec" : {
"uplinkProfiles" : [ {
"name" : "Uplink-Profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 2
} ]
}
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile01",
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds02",
"uplinkProfileName" : "Uplink-Profile-1",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
},
"advancedOptions" : {
"evcMode" : "",
"highAvailability" : {
"enabled" : false
}
}
} ],
"skipFailedHosts" : false
}
}
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/c93995bb-90e0-44c3-b633-5520c5d63770
Content-Length: 218
{
"id" : "c93995bb-90e0-44c3-b633-5520c5d63770",
"name" : "Add Cluster Workflow",
"status" : "IN_PROGRESS",
"creationTimestamp" : "2024-06-21T02:32:48.961Z",
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
1.3. Related APIs API
[_validateclustercreationspec] API [_createcluster] API [_getdomains] API [_getdomain] API [_getclusters] API [_getcluster] API [_gethosts] API [_gethost] API [_gettasks] API [_gettask] API [_retrytask] API
2. Get the Clusters
2.1. Prerequisites API
None
2.2. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 8998
{
"elements" : [ {
"id" : "8045e44e-974e-4f43-9862-7f0326782655",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-m01-cl01",
"status" : "ACTIVE",
"hciMeshData" : {
"name" : "sfo-m01-cl01",
"isHciMeshEnabled" : true,
"primaryDataStoreId" : "8045e44e-974e-4f43-9862-7f0326783766",
"vsanDataStores" : [ "sfo-m01-cl01-ds-vsan01" ],
"remoteDatastoreInfos" : [ {
"serverCluster" : "8045e44e-974e-4f43-9862-7f0326784877",
"remoteDatastore" : "8045e44e-974e-4f43-9862-7f0326785988"
} ],
"isServer" : false,
"isClient" : true,
"computeOnlyClient" : false,
"numberOfClients" : 1,
"numberOfServers" : 1
},
"primaryDatastoreName" : "sfo-m01-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : false,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : true,
"capacity" : {
"cpu" : {
"used" : {
"value" : 9.745999724364296,
"unit" : "GHz"
},
"total" : {
"value" : 67.03999810397931,
"unit" : "GHz"
},
"numberOfCores" : 32
},
"memory" : {
"used" : {
"value" : 127.80859375,
"unit" : "GB"
},
"total" : {
"value" : 312.484375,
"unit" : "GB"
}
},
"storage" : {
"used" : {
"value" : 224.15609374642372,
"unit" : "GB"
},
"total" : {
"value" : 858.1875,
"unit" : "GB"
}
}
},
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9862-7f0326782677",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w01-cl01",
"status" : "ACTIVATING",
"primaryDatastoreName" : "sfo-w01-cl01-ds-nfs01",
"primaryDatastoreType" : "NFS",
"hosts" : [ {
"id" : "c0703437-6746-470z-9e1c-f9d3bbc9b1c6"
}, {
"id" : "c0703431-6742-470t-9e1d-f9d3bbc9b1c1"
} ],
"isStretched" : false,
"isDefault" : true,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9861-7f0326782633",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w02-cl01",
"status" : "ERROR",
"primaryDatastoreName" : "sfo-w02-cl01-ds-nfs01",
"primaryDatastoreType" : "NFS",
"hosts" : [ {
"id" : "c0703437-6746-470e-9e1c-f9d3bbc9b1c3"
}, {
"id" : "c0703431-6742-470r-9e1d-f9d3bbc9b1c4"
} ],
"isStretched" : false,
"isDefault" : true,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9861-7f0326782677",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w03-cl01",
"status" : "SKIPPED",
"primaryDatastoreName" : "sfo-w03-cl01-ds-fc01",
"primaryDatastoreType" : "FC",
"hosts" : [ {
"id" : "c0703437-6746-470e-9e2c-f9d3bbc9b1c3"
}, {
"id" : "c0703431-6742-460r-9e1d-f9d3bbc9b1c4"
} ],
"isStretched" : false,
"isDefault" : true,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "2345e44e-974e-4f43-9862-7f0326782898",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w04-cl01",
"status" : "DEACTIVATING",
"primaryDatastoreName" : "sfo-w04-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : true,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "2345e44e-974e-4f43-9862-7f0326782899",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w05-cl01",
"status" : "CREATING",
"primaryDatastoreName" : "sfo-w05-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN_ESA",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c7"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c7"
} ],
"isStretched" : false,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "2345e44e-974e-4f43-9862-7f0326782899",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w05-cl01",
"status" : "CREATING",
"hciMeshData" : {
"name" : "sfo-m01-cl01",
"isHciMeshEnabled" : true,
"primaryDataStoreId" : "8045e44e-974e-4f43-9862-7f0326783766",
"vsanDataStores" : [ "sfo-m01-cl01-ds-vsan01" ],
"clientClusters" : [ "client-cluster" ],
"isServer" : true,
"isClient" : false,
"computeOnlyClient" : false,
"numberOfClients" : 1,
"numberOfServers" : 1
},
"primaryDatastoreName" : "sfo-w05-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN_MAX",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c7"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c7"
} ],
"isStretched" : false,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9862-7f0326782655",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-m01-cl01",
"status" : "ACTIVE",
"hciMeshData" : {
"name" : "sfo-m01-cl01",
"isHciMeshEnabled" : true,
"primaryDataStoreId" : "8045e44e-974e-4f43-9862-7f0326783766",
"vsanDataStores" : [ "sfo-m01-cl01-ds-vsan01" ],
"clientClusters" : [ "client-cluster" ],
"isServer" : true,
"isClient" : false,
"computeOnlyClient" : false,
"numberOfClients" : 1,
"numberOfServers" : 1
},
"primaryDatastoreName" : "sfo-m01-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : false,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : true,
"capacity" : {
"cpu" : {
"used" : {
"value" : 9.745999724364296,
"unit" : "GHz"
},
"total" : {
"value" : 67.03999810397931,
"unit" : "GHz"
},
"numberOfCores" : 32
},
"memory" : {
"used" : {
"value" : 127.80859375,
"unit" : "GB"
},
"total" : {
"value" : 312.484375,
"unit" : "GB"
}
},
"storage" : {
"used" : {
"value" : 224.15609374642372,
"unit" : "GB"
},
"total" : {
"value" : 858.1875,
"unit" : "GB"
}
}
},
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
Get the Stretched Clusters
2.3. Prerequisites API
None
2.4. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters?isStretched=true' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters?isStretched=true HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 707
{
"elements" : [ {
"id" : "2345e44e-974e-4f43-9862-7f0326782898",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w04-cl01",
"primaryDatastoreName" : "sfo-w04-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
Get the Vanilla Clusters
2.5. Prerequisites API
None
2.6. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters?isStretched=false' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters?isStretched=false HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 3726
{
"elements" : [ {
"id" : "8045e44e-974e-4f43-9862-7f0326782655",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-m01-cl01",
"primaryDatastoreName" : "sfo-m01-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : false,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9862-7f0326782677",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21g"
},
"name" : "sfo-w01-cl01",
"primaryDatastoreName" : "sfo-w01-cl01-ds-nfs01",
"primaryDatastoreType" : "NFS",
"hosts" : [ {
"id" : "c0703437-6746-470z-9e1c-f9d3bbc9b1c6"
}, {
"id" : "c0703431-6742-470t-9e1d-f9d3bbc9b1c1"
} ],
"isStretched" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9861-7f0326782633",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21h"
},
"name" : "sfo-w02-cl01",
"primaryDatastoreName" : "sfo-w02-cl01-ds-nfs01",
"primaryDatastoreType" : "NFS",
"hosts" : [ {
"id" : "c0703437-6746-470e-9e1c-f9d3bbc9b1c3"
}, {
"id" : "c0703431-6742-470r-9e1d-f9d3bbc9b1c4"
} ],
"isStretched" : false,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9861-7f0326782677",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21i"
},
"name" : "sfo-w03-cl01",
"primaryDatastoreName" : "sfo-w03-cl01-ds-fc01",
"primaryDatastoreType" : "FC",
"hosts" : [ {
"id" : "c0703437-6746-470e-9e2c-f9d3bbc9b1c3"
}, {
"id" : "c0703431-6742-460r-9e1d-f9d3bbc9b1c4"
} ],
"isStretched" : false,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9862-7f0326782688",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21j"
},
"name" : "sfo-w05-cl01",
"primaryDatastoreName" : "sfo-w05-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN_ESA",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c7"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c0"
} ],
"isStretched" : false,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}, {
"id" : "8045e44e-974e-4f43-9862-7f0326782688",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21k"
},
"name" : "sfo-w05-cl02",
"primaryDatastoreName" : "sfo-w05-cl02-ds-vsan01",
"primaryDatastoreType" : "VSAN_MAX",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c7"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c0"
} ],
"isStretched" : false,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
Get Clusters that are managed using vSphere Lifecycle Manager Baselines
2.7. Prerequisites API
None
2.8. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters?isImageBased=false' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters?isImageBased=false HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 735
{
"elements" : [ {
"id" : "2345e44e-974e-4f43-9862-7f0326782898",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w04-cl01",
"primaryDatastoreName" : "sfo-w04-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : true,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
Get Clusters that are managed using vSphere Lifecycle Manager Images
2.9. Prerequisites API
None
2.10. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters?isImageBased=true' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters?isImageBased=true HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 734
{
"elements" : [ {
"id" : "2345e44e-974e-4f43-9862-7f0326782898",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w04-cl01",
"primaryDatastoreName" : "sfo-w04-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : true,
"isImageBased" : true,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
Get Clusters by domain
2.11. Prerequisites API
The following data is required
- ID of the Domain
2.12. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters?domainId=4fb47280-3beb-46d3-89cf-e5209febb21f' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters?domainId=4fb47280-3beb-46d3-89cf-e5209febb21f HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 735
{
"elements" : [ {
"id" : "2345e44e-974e-4f43-9862-7f0326782898",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-w04-cl01",
"primaryDatastoreName" : "sfo-w04-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : true,
"isImageBased" : false,
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
} ]
}
2.13. Related APIs API
[_getclusters] API [_getcluster] API
3. Get a Cluster
3.1. Prerequisites API
The following data is required
- ID of the cluster
3.2. Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/8045e44e-974e-4f43-9862-7f0326782655' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters/8045e44e-974e-4f43-9862-7f0326782655 HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1861
{
"id" : "8045e44e-974e-4f43-9862-7f0326782655",
"domain" : {
"id" : "4fb47280-3beb-46d3-89cf-e5209febb21f"
},
"name" : "sfo-m01-cl01",
"status" : "ACTIVE",
"hciMeshData" : {
"name" : "sfo-m01-cl01",
"isHciMeshEnabled" : true,
"primaryDataStoreId" : "8045e44e-974e-4f43-9862-7f0326783766",
"vsanDataStores" : [ "sfo-m01-cl01-ds-vsan01" ],
"remoteDatastoreInfos" : [ {
"serverCluster" : "8045e44e-974e-4f43-9862-7f0326784877",
"remoteDatastore" : "8045e44e-974e-4f43-9862-7f0326785988"
} ],
"isServer" : false,
"isClient" : true,
"computeOnlyClient" : false,
"numberOfClients" : 1,
"numberOfServers" : 1
},
"primaryDatastoreName" : "sfo-m01-cl01-ds-vsan01",
"primaryDatastoreType" : "VSAN",
"hosts" : [ {
"id" : "c0703437-6746-470b-9e1c-f9d3bbc9b1c5"
}, {
"id" : "c0703431-6742-470b-9e1d-f9d3bbc9b1c9"
} ],
"isStretched" : false,
"isDefault" : true,
"failuresToTolerate" : 1,
"isImageBased" : true,
"capacity" : {
"cpu" : {
"used" : {
"value" : 9.745999724364296,
"unit" : "GHz"
},
"total" : {
"value" : 67.03999810397931,
"unit" : "GHz"
},
"numberOfCores" : 32
},
"memory" : {
"used" : {
"value" : 127.80859375,
"unit" : "GB"
},
"total" : {
"value" : 312.484375,
"unit" : "GB"
}
},
"storage" : {
"used" : {
"value" : 224.15609374642372,
"unit" : "GB"
},
"total" : {
"value" : 858.1875,
"unit" : "GB"
}
}
},
"vcenter" : {
"id" : "ed2c9f30-db7f-48d2-9c9c-d38c5d3718e4",
"fqdn" : "vcenter-1.vrack.vsphere.local",
"vcInstanceId" : "abe05e93-cffb-41ca-a367-2352f54f815d"
},
"managedObjectReferenceId" : "domain-c8",
"vsanClusterMode" : "NONE"
}
3.3. Get list of VDSes of a cluster API
Prerequisites API
None
Steps API
- Invoke the API.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/vdses' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/vdses HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 703
[ {
"id" : "bbcb8e27-2af5-4662-9631-d7982e132bbc",
"name" : "sfo-w01-cl01-vds01",
"isUsedByNsxt" : false,
"mtu" : 1500,
"portGroups" : [ {
"name" : "sfo-w01-cl01-vds01-pg-mgmt",
"transportType" : "MANAGEMENT",
"portBindingType" : "EPHEMERAL",
"vlanId" : 0
}, {
"name" : "sfo-w01-cl01-vds01-pg-vsan",
"transportType" : "VSAN",
"portBindingType" : "EPHEMERAL",
"vlanId" : 0
}, {
"name" : "sfo-w01-cl01-vds01-pg-vmotion",
"transportType" : "VMOTION",
"portBindingType" : "EPHEMERAL",
"vlanId" : 0
} ],
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "sfo-m01-tz-overlay01",
"transportType" : "OVERLAY"
} ]
}
} ]
3.4. Related APIs API
[_getclusters] API [_getcluster] API
4. Expand a Cluster
Adding an individual host to a cluster adds the resources of that host to the cluster. You can add multiple hosts at a time to a cluster.
4.1. Prerequisites API
The following data is required
ID of the cluster
For each host
ID of the host (UUID)
List of VDS names to associate with host
ID of the vmNic, host is associated to
The name of the uplinks on the VDSes to which the vmnics are meant to be associated
Availability zone name to which host is mapped, if expand operation to be performed is on a stretched cluster
The network profile name if the host is intended to be part of a NSX sub cluster. The host could be added to a new sub cluster defined by the network profile in the spec or to an existing NSX sub cluster. Hosts that do not define "networkProfileName" will be associated with the global config of the cluster
Tip : Refer to the get cluster network configuration API to get all the existing sub clusters: Query the cluster network configuration
Is inter-rack cluster expansion - required, only if Cluster contains NSX Edge Cluster
License key of ESXi
The cluster network specification. Creation of sub clusters and sub transport node profiles is supported from NSX version 4.1.2 onwards. This network spec is needed if the hosts used for cluster expansion needs to have a different NSX network configurations than the cluster.
The NSX cluster specification
To use DHCP for host TEP IP assignment
The list of IP address pool specifications if the host TEP IP assignment is done from a static IP pool
{
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
}
Note : The spec allows user to either define new IP pools or reuse existing ones. To reuse existing IP pool only the "ipAddressPoolName" has to be defined while "subnets" will be null
- Define the uplink profiles
{
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
}
The network profile is equivalent to the transport node profile and sub transport profiles in NSX. This contains the cluster VDSes used by NSX and the network configurations to be applied on the VDS. The below details are required to create a new network profile.
The name of the network profile
The list of NSX Host switch configurations
The VDS name (should be a VDS used by NSX)
The name of the uplink profile to be associated with the VDS (should be one of the uplink profiles defined in the spec)
The name of the IP address pool specification (should be one of the IP address pools defined in the spec)
VDS uplink to NSX uplink mappings
{
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
}
Note : The spec allows user to either define new network profiles or apply an existing network profile on the incoming host(s). To add host(s) to an existing sub cluster define "networkProfileName" under "hostNetworkSpec". If the cluster is stretched, hosts in one availability zone cannot reuse the network profile of hosts in the other availability zone.
The cluster in a domain to which hosts are to be added must exist.
There must be a host available in the VMware Cloud Foundation inventory.
The hosts to be added must have been commissioned.
Ensure that the host you want to add is in an active state.
For expanding a cluster which uses more than 2 vmnics, get the hosts which are compatible with the cluster using hosts query API with the criterion "HOST_COMPATIBLE_WITH_CLUSTER_USING_PNICS".
Tip : Refer to: Get the Hosts based on a Criterion.
You must have a valid ESXi license specified with adequate sockets available for the host to be added.
Ensure that the host to be added to the cluster matches the configuration of the hosts already in the cluster. This ensures a balanced configuration of the cluster.
Cluster should be in Stretched state, if expansion to be performed is on Stretched cluster.
4.2. Steps API
- Validate the input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterUpdateSpec" : {
"clusterExpansionSpec" : {
"hostSpecs" : [ {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-01"
}
}, {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-02"
}
}, {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02"
} ]
}
} ],
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}
}'
HTTP Request
POST /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations HTTP/1.1
Content-Type: application/json
Content-Length: 3640
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterUpdateSpec" : {
"clusterExpansionSpec" : {
"hostSpecs" : [ {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-01"
}
}, {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-02"
}
}, {
"id" : "69d6a6be-4f31-4489-83dd-483278aee01e",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02"
} ]
}
} ],
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}
}
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 294
{
"id" : "b34bf648-4ee9-44e0-8084-56a23eb9bb3c",
"description" : "Validating Cluster Expansion Spec",
"executionStatus" : "COMPLETED",
"resultStatus" : "SUCCEEDED",
"validationChecks" : [ {
"description" : "ClusterExpansionSpecValidation",
"resultStatus" : "SUCCEEDED"
} ]
}
In case of no errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "SUCCEEDED".
In case of errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "FAILED".
Note : Make changes to the input specification and re-validate using a new API invocation.
- Trigger the task using the valid input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X PATCH \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterExpansionSpec" : {
"hostSpecs" : [ {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-01"
}
}, {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-02"
}
}, {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02"
} ]
}
} ],
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}'
HTTP Request
PATCH /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Content-Type: application/json
Content-Length: 3388
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterExpansionSpec" : {
"hostSpecs" : [ {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-01"
}
}, {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink1"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02",
"uplink" : "uplink2"
} ],
"networkProfileName" : "sfo-w01-cl02-network-profile-02"
}
}, {
"id" : "f8fb4b36-961d-4bff-ab03-d7a911dd73d2",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01"
}, {
"id" : "vmnic2",
"vdsName" : "sfo-w01-cl02-vds02"
}, {
"id" : "vmnic3",
"vdsName" : "sfo-w01-cl02-vds02"
} ]
}
} ],
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/null
Content-Length: 54
{
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
4.3. Related APIs API
[_validateclustercreationspec] API [_updatecluster] API [_gethosts] API [_gethost] API [_gettasks] API [_gettask] API [_retrytask] API [_getcriterion] API
5. Compact a Cluster
When a host is removed from a cluster in a domain, the vSAN members are reduced. Ensure that you have enough hosts remaining to facilitate the configured vSAN availability. Failure to do so might result in the datastore being marked as read-only or in data loss.
5.1. Prerequisites API
The following data is required
For each host to be removed
- ID of the host
5.2. Steps API
- Validate the input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterCompactionSpec" : {
"hosts" : [ {
"id" : "0f64b038-5003-4c13-9b9a-de5735809d8f"
} ]
}
}'
HTTP Request
POST /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations HTTP/1.1
Content-Type: application/json
Content-Length: 115
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterCompactionSpec" : {
"hosts" : [ {
"id" : "0f64b038-5003-4c13-9b9a-de5735809d8f"
} ]
}
}
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 296
{
"id" : "f70ad194-58fd-4cbd-875a-b62eaa0857e7",
"description" : "Validating Cluster Compaction Spec",
"executionStatus" : "COMPLETED",
"resultStatus" : "SUCCEEDED",
"validationChecks" : [ {
"description" : "ClusterCompactionSpecValidation",
"resultStatus" : "SUCCEEDED"
} ]
}
In case of no errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "SUCCEEDED".
In case of errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "FAILED".
Note : Make changes to the input specification and re-validate using a new API invocation.
- Trigger the task using the valid input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X PATCH \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterCompactionSpec" : {
"hosts" : [ {
"id" : "07668771-acb8-434e-b9e0-0b2621b8df80"
} ]
}
}'
HTTP Request
PATCH /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Content-Type: application/json
Content-Length: 115
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterCompactionSpec" : {
"hosts" : [ {
"id" : "07668771-acb8-434e-b9e0-0b2621b8df80"
} ]
}
}
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/null
Content-Length: 54
{
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
5.3. Related APIs API
[_validateclustercreationspec] API [_updatecluster] API [_gethosts] API [_gethost] API [_gettasks] API [_gettask] API [_retrytask] API
6. Stretch a Cluster
Convert a Standard vSAN cluster to a Stretched cluster
6.1. Prerequisites API
The following data is required
ID of the cluster
Secondary AZ overlay vLAN Id
For each host
ID of the host (UUID)
License key of ESXi
For each Witness host
ID of witness host
FQDN of witness host
vSAN subnet cidr of witness host
The following data is optional
Witness traffic shared with vSAN (or Management VMK)
Edge cluster configured Multi-AZ
The cluster network specification. Creation of sub clusters and sub transport node profiles is supported from NSX version 4.1.2 onwards. This network spec is needed if the hosts used for the secondary availability zone (az) need to have a different NSX network configuration than the primary availability zone. This enables user to use static IP pool for host TEP IP assignment for secondary az hosts.
The NSX cluster specification
To use DHCP for host TEP IP assignment
The list of IP address pool specifications if the host TEP IP assignment is done from a static IP pool
{
"name" : "sfo-w01-cl02-ip-pool-01",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
}
Note : The spec allows user to either define new IP pools or reuse existing ones. To reuse existing IP pool only the "ipAddressPoolName" has to be defined while "subnets" will be null
- Define the uplink profiles
{
"name" : "sfo-w01-cl02-uplink-profile-01",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
}
Note : The "secondaryAzOverlayVlanId" is deprecated in favour of "transportVlan" in "uplinkProfiles" . If the NSX version is less than 4.1.2 where sub TNP is not supported, the "secondaryAzOverlayVlanId" is still mandatory.
The network profile is equivalent to the transport node profile and sub transport profiles in NSX. This contains the cluster VDSes used by NSX and the network configurations to be applied on the VDS. The below details are required to create a new network profile
The name of the network profile
The list of NSX Host switch configurations
The VDS name (should be a VDS used by NSX)
The name of the uplink profile to be associated with the VDS (should be one of the uplink profiles defined in the spec)
The name of the IP address pool specification (should be one of the IP address pools defined in the spec)
VDS uplink to NSX uplink mappings
{
"name" : "sfo-w01-cl02-network-profile-01",
"description" : "Network profile 02",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "sfo-w01-cl02-uplink-profile-01",
"ipAddressPoolName" : "sfo-w01-cl02-ip-pool-01",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
}
Note : The spec should only define new network profiles to be used for hosts in secondary availability zone.
The cluster must exist.
There must be a host available in the VMware Cloud Foundation inventory.
The hosts to be added must have been commissioned.
Ensure that the host you want to add is in an active state.
You must have a valid ESXi license specified with adequate sockets available for the host to be added.
Ensure that the host to be added to the cluster matches the configuration of the hosts already in the cluster. This ensures a balanced configuration of the cluster.
vSAN witness should be configured.
Underlying physical network should have proper MTUs and vSAN/vMotion connectivity between availability zones and the witness.
6.2. Steps API
- Validate the input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterStretchSpec" : {
"hostSpecs" : [ {
"id" : "8036cc06-727b-4783-8cae-d4c8d84ab5ed",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
} ],
"networkProfileName" : "az2-sub-tnp"
}
} ],
"witnessSpec" : {
"vsanIp" : "10.0.4.88",
"fqdn" : "witness-vsan.sfo.rainpole.io",
"vsanCidr" : "10.0.4.0/24"
},
"witnessTrafficSharedWithVsanTraffic" : false,
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "ip-address-pool",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "uplink-profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "az2-sub-tnp",
"description" : "AZ2 Sub-TNP",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "uplink-profile-1",
"ipAddressPoolName" : "ip-address-pool",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}'
HTTP Request
POST /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/validations HTTP/1.1
Content-Type: application/json
Content-Length: 1995
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterStretchSpec" : {
"hostSpecs" : [ {
"id" : "8036cc06-727b-4783-8cae-d4c8d84ab5ed",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds01",
"uplink" : "uplink2"
} ],
"networkProfileName" : "az2-sub-tnp"
}
} ],
"witnessSpec" : {
"vsanIp" : "10.0.4.88",
"fqdn" : "witness-vsan.sfo.rainpole.io",
"vsanCidr" : "10.0.4.0/24"
},
"witnessTrafficSharedWithVsanTraffic" : false,
"networkSpec" : {
"nsxClusterSpec" : {
"ipAddressPoolsSpec" : [ {
"name" : "ip-address-pool",
"description" : "static ip pool for az2",
"subnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.8.30",
"end" : "10.0.8.50"
} ],
"cidr" : "10.0.8.0/24",
"gateway" : "10.0.8.250"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "uplink-profile-1",
"teamings" : [ {
"policy" : "FAILOVER_ORDER",
"activeUplinks" : [ "uplink-1" ],
"standByUplinks" : [ "uplink-2" ]
} ],
"transportVlan" : 100
} ]
},
"networkProfiles" : [ {
"name" : "az2-sub-tnp",
"description" : "AZ2 Sub-TNP",
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl02-vds01",
"uplinkProfileName" : "uplink-profile-1",
"ipAddressPoolName" : "ip-address-pool",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
}, {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
} ]
} ]
} ]
}
}
}
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 478
{
"id" : "6bbcc492-27ae-442f-bd0e-be398000c301",
"description" : "Validating Cluster Stretch Spec",
"executionStatus" : "COMPLETED",
"resultStatus" : "FAILED",
"validationChecks" : [ {
"severity" : "ERROR",
"resultStatus" : "FAILED",
"errorResponse" : {
"errorCode" : "NSX_SPEC_FOUND_IN_NSX_LESS_CONFIGURATION",
"arguments" : [ ],
"message" : "The cluster does not have NSX configured but NSX spec is provided in input spec"
}
} ]
}
In case of no errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "SUCCEEDED".
In case of errors in the input specification, the "executionStatus" is "COMPLETED" and "resultStatus" is "FAILED".
Note : Make changes to the input specification and re-validate using a new API invocation.
- Trigger the task using the valid input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X PATCH \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterStretchSpec" : {
"hostSpecs" : [ {
"id" : "0e37ee5b-1663-4587-b380-d9da3f7b4e0d",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"moveToNvds" : false
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds02",
"moveToNvds" : false
} ]
}
} ],
"witnessSpec" : {
"vsanIp" : "10.0.4.88",
"fqdn" : "witness-vsan.sfo.rainpole.io",
"vsanCidr" : "10.0.4.0/24"
},
"witnessTrafficSharedWithVsanTraffic" : false,
"secondaryAzOverlayVlanId" : 0
}
}'
HTTP Request
PATCH /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Content-Type: application/json
Content-Length: 712
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterStretchSpec" : {
"hostSpecs" : [ {
"id" : "0e37ee5b-1663-4587-b380-d9da3f7b4e0d",
"licenseKey" : "XX0XX-XX0XX-XX0XX-XX0XX-XX0XX",
"username" : "root",
"hostNetworkSpec" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl02-vds01",
"moveToNvds" : false
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl02-vds02",
"moveToNvds" : false
} ]
}
} ],
"witnessSpec" : {
"vsanIp" : "10.0.4.88",
"fqdn" : "witness-vsan.sfo.rainpole.io",
"vsanCidr" : "10.0.4.0/24"
},
"witnessTrafficSharedWithVsanTraffic" : false,
"secondaryAzOverlayVlanId" : 0
}
}
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/null
Content-Length: 54
{
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
6.3. Related APIs API
[_validateclustercreationspec] API [_updatecluster] API [_getclusters] API [_gettasks] API [_gettask] API [_retrytask] API
7. Unstretch a Cluster
Convert a Stretched cluster to a Standard vSAN cluster
7.1. Prerequisites API
The following data is required
- ID of the cluster
The cluster must exist.
Cluster should be in Stretched state.
7.2. Steps API
- Trigger the task using the valid input specification.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X PATCH \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"clusterUnstretchSpec" : { }
}'
HTTP Request
PATCH /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Content-Type: application/json
Content-Length: 34
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"clusterUnstretchSpec" : { }
}
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/null
Content-Length: 54
{
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
7.3. Related APIs API
[_updatecluster] API [_getclusters] API [_gettasks] API [_gettask] API [_retrytask] API
8. Delete a Cluster
Warning : Datastores on the ESXi hosts in the cluster that will be deleted are destroyed.
Note : You cannot delete the last cluster in a domain. Instead, the domain can be deleted. A cluster cannot be deleted if it has remote vSAN datastores configured. If so, unmount the remote vSAN datastores from vCenter and then retry cluster deletion. Please refer to the 'VMware Cloud Foundation Administration Guide' for more details.
8.1. Prerequisites API
The following data is required
- ID of the cluster to be deleted
Ensure that a cluster with the given ID exists.
The cluster has been marked for deletion.
Migrate or backup the VMs and data on the data store associated with the cluster to another location.
8.2. Steps API
- Initialize the deletion.
Warning : It is not possible to delete a cluster without having marked it for deletion. This 2-step deletion ensures that a cluster is not deleted accidentally.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X PATCH \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"markForDeletion" : true
}'
HTTP Request
PATCH /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Content-Type: application/json
Content-Length: 30
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"markForDeletion" : true
}
HTTP Response
HTTP/1.1 200 OK
- Trigger the deletion.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32' -i -X DELETE \
-H 'Accept-Language: de' \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
DELETE /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32 HTTP/1.1
Accept-Language: de
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: /v1/tasks/93db5f6b-9f64-40d0-86ef-691d47367c2e
Content-Length: 212
{
"id" : "93db5f6b-9f64-40d0-86ef-691d47367c2e",
"name" : "Remove Cluster",
"status" : "IN_PROGRESS",
"creationTimestamp" : "2024-06-21T02:32:43.714Z",
"isCancellable" : false,
"isRetryable" : false
}
- Poll the task until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get a Task.
If the "status" is "SUCCESSFUL", the task is completed successfully.
If the "status" is "FAILED", the task can be re-executed.
Tip : Refer to: Retry a Task.
8.3. Related APIs API
[_getdomains] API [_getdomain] API [_getclusters] API [_getcluster] API [_updatecluster] API [_gettask] API [_retrytask] API
9. Get Cluster Network Configuration Query Criteria
This API is used to get supported criteria for query on cluster network configuration.
9.1. Prerequisites API
The following data is required:
- ID of the Cluster
9.2. Steps API
- Invoke the Get Cluster Network Configuration Query Criteria.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/network/criteria' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/network/criteria HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 525
{
"elements" : [ {
"name" : "VCENTER_NSXT_NETWORK_CONFIG",
"description" : "Cluster networking configuration at vCenter and NSX"
}, {
"name" : "VCENTER_NETWORK_CONFIG_SUMMARY",
"description" : "Cluster network configuration summary at the vCenter"
}, {
"name" : "NSX_NETWORK_CONFIG_PREVIEW_POST_DRIFT",
"description" : "Preview of cluster network configuration at NSX after cluster auto reconfigures with the Sub-TNP feature - grouping host transport nodes of the same NSX configuration"
} ]
}
9.3. Related APIs API
[_getclusternetworkconfiguration] API [_getclusternetworkconfigurationqueryresponse] API
10. Query Cluster Network Configuration using criteria
This API is used to initiate a network configuration query on the cluster.
10.1. Prerequisites API
The following data is required:
ID of the Cluster
Query Criteria
10.2. Steps API
- Invoke the API to initiate a query based on criteria on the cluster.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/network/queries' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer etYWRta....' \
-d '{
"name" : "VCENTER_NSXT_NETWORK_CONFIG"
}'
HTTP Request
POST /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/network/queries HTTP/1.1
Content-Type: application/json
Content-Length: 44
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
{
"name" : "VCENTER_NSXT_NETWORK_CONFIG"
}
HTTP Response
HTTP/1.1 202 Accepted
Location: /v1/clusters/2d54bb6c-637a-49a4-a94c-622671d0ab32/network/queries/5c108d4a-b4db-48f3-86d0-4521419338f0
Content-Type: application/json
Content-Length: 183
{
"queryInfo" : {
"status" : "IN_PROGRESS",
"queryId" : "5c108d4a-b4db-48f3-86d0-4521419338f0",
"completed" : false,
"processing" : true,
"failure" : false
}
}
- Poll the query response until "status" is not "IN_PROGRESS" using the "id" from the previous response.
Tip : Refer to: Get Cluster Network Configuration Query Response.
- If the "status" is "SUCCESSFUL", the query response is completed successfully.
10.3. Related APIs API
[_getclusternetworkconfigurationcriteria] API [_getclusternetworkconfigurationqueryresponse] API
11. Get Cluster Network Configuration Query Response
API is used to get response for submitted query for network configuration on a cluster.
11.1. Prerequisites API
The following data is required:
ID of the Cluster
ID of the Query
11.2. Steps API
- Invoke the API to get the response for submitted query for network configuration on a cluster.
cURL Request
$ curl 'https://sfo-vcf01.rainpole.io/v1/clusters/e46fa08f-9053-4ac0-b6ed-af438381faae/network/queries/610cf079-0342-453b-a565-8204cd816b66' -i -X GET \
-H 'Authorization: Bearer etYWRta....'
HTTP Request
GET /v1/clusters/e46fa08f-9053-4ac0-b6ed-af438381faae/network/queries/610cf079-0342-453b-a565-8204cd816b66 HTTP/1.1
Host: sfo-vcf01.rainpole.io
Authorization: Bearer etYWRta....
HTTP Response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 4060
{
"queryInfo" : {
"status" : "COMPLETED",
"queryId" : "72a1da56-0c99-47d1-aaf0-7c3597d8a055",
"completed" : true,
"processing" : false,
"failure" : false
},
"result" : {
"elements" : [ {
"hostDetails" : [ {
"id" : "3a20bfcb-cd69-4d26-99ae-54a488ff8aee",
"hostName" : "sfo01-m01-esx01",
"hostNetworkConfiguration" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "7fb60d2c-e9a9-46ce-92d1-47d360030ef7",
"hostName" : "sfo01-m01-esx02",
"hostNetworkConfiguration" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink2"
} ]
}
}, {
"id" : "b198ebc7-2261-4301-8430-0a826d798218",
"hostName" : "sfo01-m01-esx03",
"hostNetworkConfiguration" : {
"vmNics" : [ {
"id" : "vmnic0",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink1"
}, {
"id" : "vmnic1",
"vdsName" : "sfo-w01-cl01-vds01",
"uplink" : "uplink2"
} ]
}
} ],
"vdsConfigurations" : [ {
"name" : "sfo-w01-cl01-vds01",
"portGroups" : [ {
"name" : "sfo-w01-cl01-vds01-pg-management",
"transportType" : "MANAGEMENT",
"activeUplinks" : [ "uplink1", "uplink2" ],
"standByUplinks" : [ ],
"policy" : "loadbalance_loadbased",
"vlanId" : 0
}, {
"name" : "sfo-w01-cl01-vds01-pg-vsan",
"transportType" : "VSAN",
"activeUplinks" : [ "uplink1", "uplink2" ],
"standByUplinks" : [ ],
"policy" : "loadbalance_loadbased",
"vlanId" : 0
}, {
"name" : "sfo-w01-cl01-vds01-pg-vmotion",
"transportType" : "VMOTION",
"activeUplinks" : [ "uplink1", "uplink2" ],
"standByUplinks" : [ ],
"policy" : "loadbalance_loadbased",
"vlanId" : 0
} ],
"nsxtSwitchConfig" : {
"transportZones" : [ {
"name" : "vlan-tz-sfo-w01-cl01-vds01",
"transportType" : "VLAN"
}, {
"name" : "overlay-tz-nsxt-vip.vrack.vsphere.local",
"transportType" : "OVERLAY"
} ]
},
"uplinks" : [ "uplink2", "uplink1" ]
} ],
"ipAddressPools" : [ {
"name" : "static-ip-pool-1",
"description" : "Static ip pool 1",
"availableIpAddresses" : 185,
"totalIpAddresses" : 191,
"staticSubnets" : [ {
"ipAddressPoolRanges" : [ {
"start" : "10.0.1.10",
"end" : "10.0.1.200"
} ],
"gateway" : "10.0.1.253",
"cidr" : "10.0.1.0/24"
} ]
} ],
"uplinkProfiles" : [ {
"name" : "vcenter-1-new-vi-cluster1-sfo-w01-cl01-vds01",
"teamings" : [ {
"policy" : "LOADBALANCE_SRCID",
"activeUplinks" : [ "uplink-2", "uplink-1" ],
"standByUplinks" : [ ]
} ],
"transportVlan" : 0,
"supportedTeamingPolicies" : null
} ],
"networkProfiles" : [ {
"isDefault" : true,
"nsxtHostSwitchConfigs" : [ {
"vdsName" : "sfo-w01-cl01-vds01",
"uplinkProfileName" : "vcenter-1-new-vi-cluster1-sfo-w01-cl01-vds01",
"ipAddressPoolName" : "static-ip-pool-1",
"vdsUplinkToNsxUplink" : [ {
"vdsUplinkName" : "uplink2",
"nsxUplinkName" : "uplink-2"
}, {
"vdsUplinkName" : "uplink1",
"nsxUplinkName" : "uplink-1"
} ]
} ]
} ]
} ]
}
}
11.3. Related APIs API
[_getclusternetworkconfigurationcriteria] API [_getclusternetworkconfiguration] API
Last updated 2024-06-21 01:22:12 -0700