Function: Load Balance Virtual Machine Deployments Across 2 vSphere Clusters in a Provider Virtual Data Center

by Simon Sparks · 5 September 2025

To use this function add it to the class library file named vCloudService.ts

GitHub Repository: https://github.com/SimonSparksUK/Orchestrator

Filename: vCloudService.ts

Description: Orchestrator Function to load balanced deployment of virtual machines across 2 vSphere clusters in a Provider Virtual Data Center

Function: VclDeployLocationGet

public VclDeployLocationGet(objVclHost: VclHost): { DeployDataCentre: string, DeployStorageProfile: string } {
  let objVclQueryService: VclQueryService = objVclHost.getQueryService();

  let objVclExpression1: VclExpression = new VclExpression(VclQueryProviderVdcResourcePoolRelationField.NAME, "DataCenter*Cluster01", VclExpressionType.EQUALS);

  let objVclExpression2: VclExpression = new VclExpression(VclQueryProviderVdcResourcePoolRelationField.ISENABLED, "true", VclExpressionType.EQUALS);

  let arrVclExpression: VclExpression[] = [];
  arrVclExpression.push(objVclExpression1);
  arrVclExpression.push(objVclExpression2);

  let objVclFilter: VclFilter = new VclFilter(arrVclExpression, VclFilterType.AND);

  let objVclQueryParams: VclQueryParams = new VclQueryParams();
  objVclQueryParams.setFilter(objVclFilter);

  let objVclAbstractRecordResultSet: VclAbstractRecordResultSet = objVclQueryService.queryRecords(VclQueryRecordType.PROVIDERVDCRESOURCEPOOLRELATION, objVclQueryParams);

  let arrVclQueryResultProviderVdcResourcePoolRelationRecord: VclQueryResultProviderVdcResourcePoolRelationRecord[] = objVclAbstractRecordResultSet.getRecords(new VclQueryResultProviderVdcResourcePoolRelationRecord());

  let intNumberOfVMsInDataCenter01: number;
  let intUsageCPUinDataCenter01: number;
  let intUsageMemoryInDataCenter01: number;

  let intNumberOfVMsInDataCenter02: number;
  let intUsageCPUinDataCenter02: number;
  let intUsageMemoryInDataCenter02: number;

  arrVclQueryResultProviderVdcResourcePoolRelationRecord.forEach((objVclQueryResultProviderVdcResourcePoolRelationRecord: VclQueryResultProviderVdcResourcePoolRelationRecord): void => {

      if (objVclQueryResultProviderVdcResourcePoolRelationRecord.name == "DataCenter01Cluster01") {
          intNumberOfVMsInDataCenter01 = objVclQueryResultProviderVdcResourcePoolRelationRecord.numberOfVMs;
          intUsageCPUinDataCenter01 = 100 * (objVclQueryResultProviderVdcResourcePoolRelationRecord.cpuReservationAllocationMhz / objVclQueryResultProviderVdcResourcePoolRelationRecord.cpuReservationLimitMhz);
          intUsageMemoryInDataCenter01 = 100 * (objVclQueryResultProviderVdcResourcePoolRelationRecord.memoryReservationAllocationMB / objVclQueryResultProviderVdcResourcePoolRelationRecord.memoryReservationLimitMB);
      }
      else if (objVclQueryResultProviderVdcResourcePoolRelationRecord.name == "DataCenter02Cluster01") {
          intNumberOfVMsInDataCenter02 = objVclQueryResultProviderVdcResourcePoolRelationRecord.numberOfVMs;
          intUsageCPUinDataCenter02 = 100 * (objVclQueryResultProviderVdcResourcePoolRelationRecord.cpuReservationAllocationMhz / objVclQueryResultProviderVdcResourcePoolRelationRecord.cpuReservationLimitMhz);
          intUsageMemoryInDataCenter02 = 100 * (objVclQueryResultProviderVdcResourcePoolRelationRecord.memoryReservationAllocationMB / objVclQueryResultProviderVdcResourcePoolRelationRecord.memoryReservationLimitMB);
      }

  });

  this.objLogger.info("===== DataCenter01 ===== Usage VMs = " + intNumberOfVMsInDataCenter01);
  this.objLogger.info("===== DataCenter01 ===== Usage CPU = " + intUsageCPUinDataCenter01 + "%");
  this.objLogger.info("===== DataCenter01 ===== Usage Memory = " + intUsageMemoryInDataCenter01 + "%");

  this.objLogger.info("===== DataCenter02 ===== Usage VMs = " + intNumberOfVMsInDataCenter02);
  this.objLogger.info("===== DataCenter02 ===== Usage CPU = " + intUsageCPUinDataCenter02 + "%");
  this.objLogger.info("===== DataCenter02 ===== Usage Memory = " + intUsageMemoryInDataCenter02 + "%");

  let strDeployDataCentre: string = "";
  let strDeployStorageProfile: string = "";

  if (intUsageMemoryInDataCenter01 > intUsageMemoryInDataCenter02) {
      strDeployDataCentre = "DataCenter02";
      strDeployStorageProfile = "DataCenter01-Storage-Profile-Name";
  }
  else {
      strDeployDataCentre = "DataCenter01";
      strDeployStorageProfile = "DataCenter01-Storage-Profile-Name";
  }

  this.objLogger.info("===== This vApp will be deployed into the " + strDeployStorageProfile + " storage profile in " + strDeployDataCentre);

  return {
      DeployDataCentre: strDeployDataCentre,
      DeployStorageProfile: strDeployStorageProfile
  };
}

Discover more from Cloud Build Tools

Subscribe to get the latest posts sent to your email.

You may also like