Function: Create a Distributed Virtual Switch

by Simon Sparks · 22 May 2021

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

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

Filename: PluginVCDistributedVirtualPortgroupService.ts

Description: Orchestrator Function to Create a Distributed Virtual Switch – Part 1

Function VcVmwareDistributedVirtualSwitchCreate

public VcVmwareDistributedVirtualSwitchCreate(objVcNetworkFolder: VcNetworkFolder): VcVmwareDistributedVirtualSwitch {
    let arrUplinkPortName: string[] = [];
    arrUplinkPortName.push("dvUplink-A");
    arrUplinkPortName.push("dvUplink-B");

    let arrPortGroup: { strPortgroupName: string, intVLANNumber: number, arr: any[], strLoadBalancingMethod: string }[] = [];
    arrPortGroup.push({ strPortgroupName: "pgVLAN-10-Management", intVLANNumber: 10, strLoadBalancingMethod: "loadbalance_loadbased", arr: ["dvUplink-A", "dvUplink-B"] });
    arrPortGroup.push({ strPortgroupName: "pgVLAN-20-Provisioning", intVLANNumber: 20, strLoadBalancingMethod: "loadbalance_loadbased", arr: ["dvUplink-A", "dvUplink-B"] });
    arrPortGroup.push({ strPortgroupName: "pgVLAN-30-vMotion-A", intVLANNumber: 30, strLoadBalancingMethod: "loadbalance_loadbased", arr: ["dvUplink-A"] });
    arrPortGroup.push({ strPortgroupName: "pgVLAN-30-vMotion-B", intVLANNumber: 30, strLoadBalancingMethod: "loadbalance_loadbased", arr: ["dvUplink-B"] });

    let objVcDVSNameArrayUplinkPortPolicy: VcDVSNameArrayUplinkPortPolicy = new VcDVSNameArrayUplinkPortPolicy();
    objVcDVSNameArrayUplinkPortPolicy.uplinkPortName = arrUplinkPortName;

    let objVcDVSContactInfo: VcDVSContactInfo = new VcDVSContactInfo();
    objVcDVSContactInfo.name = "Administrator";
    objVcDVSContactInfo.contact = "Administrator";

    let objVcDVSPolicy: VcDVSPolicy = new VcDVSPolicy();
    objVcDVSPolicy.autoPreInstallAllowed = true;
    objVcDVSPolicy.autoUpgradeAllowed = true;
    objVcDVSPolicy.partialUpgradeAllowed = true;

    let objVcBoolPolicy: VcBoolPolicy = new VcBoolPolicy();
    objVcBoolPolicy.inherited = false;
    objVcBoolPolicy.value = false;

    let objVcStringPolicy: VcStringPolicy = new VcStringPolicy();
    objVcStringPolicy.inherited = false;
    objVcStringPolicy.value = "-1";

    let arrVcNumericRangeVLANs: VcNumericRange[] = [];

    arrPortGroup.forEach((objPortGroup) => {

        let intPortGroupVLAN: number = objPortGroup.intVLANNumber;

        let objVcNumericRangeCheck: VcNumericRange = arrVcNumericRangeVLANs.find((objVcNumericRange: VcNumericRange): boolean => {

            return objVcNumericRange.start === intPortGroupVLAN || objVcNumericRange.end === intPortGroupVLAN;

        });

        if (!objVcNumericRangeCheck) {
            let objVcNumericRange: VcNumericRange = new VcNumericRange();
            objVcNumericRange.start = intPortGroupVLAN;
            objVcNumericRange.end = intPortGroupVLAN;

            this.objLogger.info("Adding VLAN " + intPortGroupVLAN + " to the Trunk Allowed VLANs");

            arrVcNumericRangeVLANs.push(objVcNumericRange);
        }

    });

    let objVcVmwareDistributedVirtualSwitchTrunkVlanSpec: VcVmwareDistributedVirtualSwitchTrunkVlanSpec = new VcVmwareDistributedVirtualSwitchTrunkVlanSpec();
    objVcVmwareDistributedVirtualSwitchTrunkVlanSpec.inherited = false;
    objVcVmwareDistributedVirtualSwitchTrunkVlanSpec.vlanId = arrVcNumericRangeVLANs;

    let objVcVMwareDVSPortSetting: VcVMwareDVSPortSetting = new VcVMwareDVSPortSetting();
    objVcVMwareDVSPortSetting.vlan = objVcVmwareDistributedVirtualSwitchTrunkVlanSpec;
    objVcVMwareDVSPortSetting.blocked = objVcBoolPolicy;
    objVcVMwareDVSPortSetting.vmDirectPathGen2Allowed = objVcBoolPolicy;
    objVcVMwareDVSPortSetting.networkResourcePoolKey = objVcStringPolicy;

    let objVcLinkDiscoveryProtocolConfig: VcLinkDiscoveryProtocolConfig = new VcLinkDiscoveryProtocolConfig();
    objVcLinkDiscoveryProtocolConfig.protocol = "cdp";
    objVcLinkDiscoveryProtocolConfig.operation = "both";

    let arrVcDistributedVirtualSwitchHostMemberConfigSpec: VcDistributedVirtualSwitchHostMemberConfigSpec[] = [];

    let arrVcSdkConnection: VcSdkConnection[] = VcPlugin.allSdkConnections;

    arrVcSdkConnection.forEach((objVcSdkConnection: VcSdkConnection): void => {

        let arrVcHostSystem: VcHostSystem[] = objVcSdkConnection.allHostSystems;

        arrVcHostSystem.forEach((objVcHostSystem: VcHostSystem): void => {

            let objVcDistributedVirtualSwitchHostMemberConfigSpec: VcDistributedVirtualSwitchHostMemberConfigSpec = new VcDistributedVirtualSwitchHostMemberConfigSpec();
            objVcDistributedVirtualSwitchHostMemberConfigSpec.operation = "add";
            objVcDistributedVirtualSwitchHostMemberConfigSpec.host = objVcHostSystem;

            arrVcDistributedVirtualSwitchHostMemberConfigSpec.push(objVcDistributedVirtualSwitchHostMemberConfigSpec);
        });
    });

    let objVcVMwareDVSConfigSpec: VcVMwareDVSConfigSpec = new VcVMwareDVSConfigSpec();
    objVcVMwareDVSConfigSpec.name = "dvSwitch-vSphere-Services";
    objVcVMwareDVSConfigSpec.description = "dvSwitch-vSphere-Services";
    objVcVMwareDVSConfigSpec.uplinkPortPolicy = objVcDVSNameArrayUplinkPortPolicy;
    objVcVMwareDVSConfigSpec.configVersion = "5.1.0";
    objVcVMwareDVSConfigSpec.contact = objVcDVSContactInfo;
    objVcVMwareDVSConfigSpec.defaultProxySwitchMaxNumPorts = 1024;
    objVcVMwareDVSConfigSpec.policy = objVcDVSPolicy;
    objVcVMwareDVSConfigSpec.defaultPortConfig = objVcVMwareDVSPortSetting;
    objVcVMwareDVSConfigSpec.maxMtu = 9000;
    objVcVMwareDVSConfigSpec.linkDiscoveryProtocolConfig = objVcLinkDiscoveryProtocolConfig;
    objVcVMwareDVSConfigSpec.host = arrVcDistributedVirtualSwitchHostMemberConfigSpec;

    //TO DO - SS - Check this
    let objVcDistributedVirtualSwitchProductSpec: VcDistributedVirtualSwitchProductSpec = new VcDistributedVirtualSwitchProductSpec();
    objVcDistributedVirtualSwitchProductSpec.name = "DVS";
    objVcDistributedVirtualSwitchProductSpec.vendor = "VMware";
    objVcDistributedVirtualSwitchProductSpec.version = "5.1.0";

    let objVcDistributedVirtualSwitchHostProductSpec: VcDistributedVirtualSwitchHostProductSpec = new VcDistributedVirtualSwitchHostProductSpec();
    objVcDistributedVirtualSwitchHostProductSpec.productLineId = "";
    objVcDistributedVirtualSwitchHostProductSpec.version = "";

    let arrVcDistributedVirtualSwitchHostProductSpec: VcDistributedVirtualSwitchHostProductSpec[] = [];
    arrVcDistributedVirtualSwitchHostProductSpec.push(objVcDistributedVirtualSwitchHostProductSpec);

    let objVcDVSCapability: VcDVSCapability = new VcDVSCapability();
    objVcDVSCapability.compatibleHostComponentProductInfo = arrVcDistributedVirtualSwitchHostProductSpec;
    objVcDVSCapability.dvPortGroupOperationSupported = true;
    objVcDVSCapability.dvPortOperationSupported = true;
    objVcDVSCapability.dvsOperationSupported = true;

    let objVcDVSCreateSpec: VcDVSCreateSpec = new VcDVSCreateSpec();
    objVcDVSCreateSpec.configSpec = objVcVMwareDVSConfigSpec;
    objVcDVSCreateSpec.productInfo = objVcDistributedVirtualSwitchProductSpec;
    objVcDVSCreateSpec.capability = objVcDVSCapability;

    let objVcTask: VcTask = objVcNetworkFolder.createDVS_Task(objVcDVSCreateSpec);

    let objVcVmwareDistributedVirtualSwitch: VcVmwareDistributedVirtualSwitch = this.WaitForVcTaskEnd(objVcTask, 1);

    return objVcVmwareDistributedVirtualSwitch;
}

Discover more from Cloud Build Tools

Subscribe to get the latest posts sent to your email.

You may also like