Function: Create a Load Balancer on an Edge

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 Create a Load Balancer on an Edge

Function VclLoadBalancerVirtualServerCreate

public VclLoadBalancerVirtualServerCreate(objVclVdc: VclVdc, objVclOrgVdcNetwork: VclOrgVdcNetwork, objVclVApp: VclVApp, strDeployDataCentre: string, strVclLoadBalancerName: string, strLoadBalancerIpAddress: string): void {

    let objVclGateway: VclGateway = this.VclGatewayGet(objVclVdc, strDeployDataCentre);

    objVclGateway.updateInternalState();

    this.objLogger.info("The Next Available IP is: " + strLoadBalancerIpAddress);

    let arrLoadBalancerIPAddress: string[] = strLoadBalancerIpAddress.split('.');

    let strOctetA: string = System.decimalToHex(parseInt(arrLoadBalancerIPAddress[0])).toLowerCase();
    let strOctetB: string = System.decimalToHex(parseInt(arrLoadBalancerIPAddress[1])).toLowerCase();
    let strOctetC: string = System.decimalToHex(parseInt(arrLoadBalancerIPAddress[2])).toLowerCase();
    let strOctetD: string = System.decimalToHex(parseInt(arrLoadBalancerIPAddress[3])).toLowerCase();

    if (strOctetA.length == 1) { strOctetA = "0" + strOctetA; }
    if (strOctetB.length == 1) { strOctetB = "0" + strOctetB; }
    if (strOctetC.length == 1) { strOctetC = "0" + strOctetC; }
    if (strOctetD.length == 1) { strOctetD = "0" + strOctetD; }

    let strLoadBalancerHostName: string = strOctetA + strOctetB + strOctetC + strOctetD + "-vip.cloudbuildtools.com";

    let objVclLBPoolHealthCheck: VclLBPoolHealthCheck = new VclLBPoolHealthCheck();
    objVclLBPoolHealthCheck.timeout = "15";
    objVclLBPoolHealthCheck.uri = "/";
    objVclLBPoolHealthCheck.mode = "HTTP";
    objVclLBPoolHealthCheck.interval = "5";
    objVclLBPoolHealthCheck.healthThreshold = "2";
    objVclLBPoolHealthCheck.unhealthThreshold = "3";

    let objVclLBPoolServicePort: VclLBPoolServicePort = new VclLBPoolServicePort();
    objVclLBPoolServicePort.isEnabled = true;
    objVclLBPoolServicePort.port = "80";
    objVclLBPoolServicePort.protocol = "HTTP";
    objVclLBPoolServicePort.healthCheckPort = "80";
    objVclLBPoolServicePort.algorithm = "LEAST_CONN";
    objVclLBPoolServicePort.healthCheck.add(objVclLBPoolHealthCheck);

    let objVclLBPoolServicePortMember: VclLBPoolServicePort = new VclLBPoolServicePort();
    objVclLBPoolServicePortMember.port = "80";
    objVclLBPoolServicePortMember.protocol = "HTTP";
    objVclLBPoolServicePortMember.healthCheckPort = "80";

    let objVclLoadBalancerPool: VclLoadBalancerPool = new VclLoadBalancerPool();
    objVclLoadBalancerPool.operational = true;
    objVclLoadBalancerPool.name = strVclLoadBalancerName + "-Pool";
    objVclLoadBalancerPool.description = strLoadBalancerHostName;
    objVclLoadBalancerPool.errorDetails = "";
    objVclLoadBalancerPool.servicePort.add(objVclLBPoolServicePort);

    let arrVclVM: VclVM[] = objVclVApp.getChildrenVms();

    arrVclVM.forEach((objVclVM: VclVM): void => {

        this.objLogger.info("objVclVM.name = " + objVclVM.name);

        let arrVclVirtualNetworkCard: VclVirtualNetworkCard[] = objVclVM.getNetworkCards();

        let objVclVirtualNetworkCard: VclVirtualNetworkCard = arrVclVirtualNetworkCard.find((objVclVirtualNetworkCard: VclVirtualNetworkCard): boolean => {

            return objVclVirtualNetworkCard.primaryNetworkConnection == true;

        });

        this.objLogger.info("objVclVirtualNetworkCard.ipAddress = " + objVclVirtualNetworkCard.ipAddress);

        let objVclLBPoolMember: VclLBPoolMember = new VclLBPoolMember();
        objVclLBPoolMember.weight = "1";
        objVclLBPoolMember.ipAddress = objVclVirtualNetworkCard.ipAddress;
        objVclLBPoolMember.servicePort.add(objVclLBPoolServicePortMember);

        objVclLoadBalancerPool.member.add(objVclLBPoolMember);

        this.objLogger.info("objVclLoadBalancerPool.member.size() = " + objVclLoadBalancerPool.member.size());
    });

    let objVclLBPersistence: VclLBPersistence = new VclLBPersistence();
    objVclLBPersistence.method = "COOKIE";
    objVclLBPersistence.cookieName = "VCOSESSIONID";
    objVclLBPersistence.cookieMode = "INSERT";

    let objVclLBVirtualServerServiceProfile: VclLBVirtualServerServiceProfile = new VclLBVirtualServerServiceProfile();
    objVclLBVirtualServerServiceProfile.isEnabled = true;
    objVclLBVirtualServerServiceProfile.protocol = "HTTP";
    objVclLBVirtualServerServiceProfile.port = "80";
    objVclLBVirtualServerServiceProfile.persistence = objVclLBPersistence;

    let objVclLoadBalancerVirtualServer: VclLoadBalancerVirtualServer = new VclLoadBalancerVirtualServer();
    objVclLoadBalancerVirtualServer.isEnabled = true;
    objVclLoadBalancerVirtualServer.logging = false;
    objVclLoadBalancerVirtualServer.pool = strVclLoadBalancerName + "-Pool";
    objVclLoadBalancerVirtualServer.name = strVclLoadBalancerName + "-VirtualServer";
    objVclLoadBalancerVirtualServer.description = strLoadBalancerHostName;
    objVclLoadBalancerVirtualServer.ipAddress = strLoadBalancerIpAddress;
    objVclLoadBalancerVirtualServer.interface = objVclOrgVdcNetwork.getReference();
    objVclLoadBalancerVirtualServer.serviceProfile.add(objVclLBVirtualServerServiceProfile);

    let objVclLoadBalancerService: VclLoadBalancerService = new VclLoadBalancerService();
    objVclLoadBalancerService.isEnabled = true;
    objVclLoadBalancerService.pool.add(objVclLoadBalancerPool);
    objVclLoadBalancerService.virtualServer.add(objVclLoadBalancerVirtualServer);

    this.objLogger.info("objVclLoadBalancerService.virtualServer.size() = " + objVclLoadBalancerService.virtualServer.size());

    this.objLogger.info("Preperation Completed, next phase of applying the configuration is about to run.");

    let objVclGatewayConfiguration: VclGatewayConfiguration = objVclGateway.configuration;

    let objVclGatewayFeatures: VclGatewayFeatures = objVclGatewayConfiguration.edgeGatewayServiceConfiguration;

    let objVclAbstractObjectSet: VclAbstractObjectSet = objVclGatewayFeatures.networkService;

    let arrVclLoadBalancerService: VclLoadBalancerService[] = objVclAbstractObjectSet.find(new VclLoadBalancerService());

    let arrVclLoadBalancerPool: VclLoadBalancerPool[];
    let arrLoadBalancerVirtualServer: VclLoadBalancerVirtualServer[];

    if (arrVclLoadBalancerService.length == 0) {
        this.objLogger.info("Load Balancer Service Not Found on Gateway");

        objVclGatewayFeatures.networkService.add(objVclLoadBalancerService);

        arrVclLoadBalancerPool = objVclLoadBalancerService.pool.enumerate();;

        this.objLogger.info("Pool to be Applied: " + arrVclLoadBalancerPool[0].name);

        arrLoadBalancerVirtualServer = objVclLoadBalancerService.virtualServer.enumerate();

        this.objLogger.info("Virtual Server to be applied: " + arrLoadBalancerVirtualServer[0].name);
    }
    else {
        let objVclLoadBalancerService: VclLoadBalancerService = arrVclLoadBalancerService[0];

        let intLoadBalancerPoolSize: number = objVclLoadBalancerService.pool.size();

        let intLoadBalancerVirtualServerSize: number = objVclLoadBalancerService.virtualServer.size();

        if ((intLoadBalancerPoolSize == 64) || (intLoadBalancerVirtualServerSize == 64)) {
            this.objLogger.info("Load Balancer Pools Before Service is Applied: " + intLoadBalancerPoolSize);
            this.objLogger.info("Load Balancer Virtual Servers Before Service is Applied: " + intLoadBalancerVirtualServerSize);
            this.objLogger.info("No more Load Balancer Services can be Applied to this vShield Edge Device.");

            throw "No more Load Balancer Services can be Applied to this vShield Edge Device.";
        }
        else {
            this.objLogger.info("Load Balancer Pools Before Service is Applied: " + intLoadBalancerPoolSize);
            this.objLogger.info("Load Balancer Virtual Servers Before Service is Applied: " + intLoadBalancerVirtualServerSize);

            let arrVclLoadBalancerPool: VclLoadBalancerPool[] = objVclLoadBalancerService.pool.enumerate();

            if (intLoadBalancerPoolSize == 0) {
                this.objLogger.info("No existing Pools found. ");
                this.objLogger.info("New Pool " + strVclLoadBalancerName + "-Pool will be deployed.");

                objVclLoadBalancerService.pool.add(objVclLoadBalancerPool);
            }
            else {

                arrVclLoadBalancerPool.forEach((objVclLoadBalancerPool: VclLoadBalancerPool) => {

                    if (objVclLoadBalancerPool.name === strVclLoadBalancerName + "-Pool") {
                        this.objLogger.info("A Match was Found for " + strVclLoadBalancerName + "-Pool, will NOT be deployed");
                    }
                    else {
                        // TO DO - SS - The logic here is not good

                        this.objLogger.info("No Match was Found for " + strVclLoadBalancerName + "-Pool, will be deployed.");

                        objVclLoadBalancerService.pool.add(objVclLoadBalancerPool);
                    }
                });
            }

            let arrVclLoadBalancerVirtualServer: VclLoadBalancerVirtualServer[] = objVclLoadBalancerService.virtualServer.enumerate();

            if (arrVclLoadBalancerVirtualServer.length === 0) {
                this.objLogger.info("New Virtual Server " + strVclLoadBalancerName + "-VirtualServer will be deployed.");

                objVclLoadBalancerService.virtualServer.add(objVclLoadBalancerVirtualServer);
            }
            else {

                arrLoadBalancerVirtualServer.forEach((objVclLoadBalancerVirtualServer: VclLoadBalancerVirtualServer): void => {

                    if (objVclLoadBalancerVirtualServer.name == strVclLoadBalancerName + "-VirtualServer") {
                        this.objLogger.info("A Match was Found for " + strVclLoadBalancerName + "-VirtualServer will NOT be deployed.");
                    }
                    else {
                        // TO DO - SS - The logic here is not good

                        this.objLogger.info("No Match was Found for " + strVclLoadBalancerName + "-VirtualServer will be deployed.");

                        objVclLoadBalancerService.virtualServer.add(objVclLoadBalancerVirtualServer);
                    }

                });

            }
        }
    }

    this.objLogger.info("objVclGateway.update() is the next command to be run.");

    let objVclTask: VclTask = objVclGateway.update();

    this.WaitForVclTask(objVclTask, 1);
}

Discover more from Cloud Build Tools

Subscribe to get the latest posts sent to your email.

You may also like