Resource Placement and Validation Callout

Overview

The CloudCenter platform has the ability to deploy enterprise applications over public, private, or hybrid clouds by configuring user-specified cloud settings in the CCM UI > Environments  > Edit Deployment  Environment > Define Default Cloud Settings page.

The following integration features extend the CloudCenter platform capabilities:

  • Resource Placement allows users to define cloud settings based on third-party infrastructure tools or quota management tools using automated scripts instead of manually-selected settings.

  • Resource Validation blocks new deployments if users reach a configured threshold limit when using Cloud Resources (for example, restricting VMs being launched only if cloud resources consume < 75% of your maximum capacity).

You can configure these integrations using an automation callout script.

Resource Placement Flow

To use the resource placement script, specify a URL to the script that you want to run. The resource placement script runs inside a Docker container on the CCO. You cannot pass in any custom values. Your script must output the values specified in this section. 

The Resource Placement feature is only supported for AWS, VMware, and OpenStack clouds.

This script is executed for each Node launch (called for each VM). For example, if you have a single-tier application with the minimum number of nodes set to 2, then this script is executed twice – 1 tier x 2 nodes = 2 executions. However, the CloudCenter platform passes variables such as service types which allows you to decide where to place it in the VM.

  1. Toggle the switch to YES in the Resource Placement section, as shown in the following screenshot.

    If this feature is enabled, the Cloud Settings form in the Deployment Environments > Cloud Defaults page will be disabled.

  2. Identify the script location and the specific script for the Resource Placement Configuration. Based on the cloud account details received through the environment variables, the script can query the target cloud and return the cloud settings to be used for a deployment.

  3. The following table describes available (input) environment variables for the Resource Placement script.

    Environment VariableDescriptionCloud

    eNV_cliqrAppTierName

    The tier name.

    All clouds, except Container Clouds and Cisco UCSD.

    CliqrTier_<tierName>_instanceType

    The Instance Type of the tier.

    eNV_imageName

    The image Name (for example: CentOS 6.x).

    serviceName

    The service name to identify settings like private subnet for a database service.

    eNV_parentJobName

    The unique Job Name for the deployment.

    CliqrCloudAccountId

    The cloud account ID.

    CliqrCloudAccountPwd

    The cloud account password (for AWS, access key).

    CliqrCloudAccountName

    The cloud account username (for AWS, account email ID).

    Cloud_Setting_CloudFamily

    The cloud family of the region in the %wm.

    CliqrCloud_AccessSecretKey

    The AWS account secret key

    AWS

    CliqrCloud_ServiceUrl

    The SDK URL for VMware.

    VMware

    CliqrCloud_DomainId

    The default OpenStack domain ID.

    OpenStack

    CliqrCloud_Endpoint

    The OpenStack Keystone authentication endpoint.

    CliqrCloud_TenantName

    The OpenStack default tenant name.

    CliqrCloud_DomainName

    The OpenStack default domain name.

    CliqrCloudAccountPwd

    The OpenStack password.

    CliqrCloud_Region

    The OpenStack region.

    CliqrCloudAccountName

    The OpenStack user name for this account.

    CliqrCloud_TenantId

    The OpenStack default tenant ID.


    The cloud settings listed in the following tables are returned for AWS, OpenStack, and VMware.

    •  AWS Options
      • The following table describes AWS-specific cloud settings for the resource placement callout script.

        AWS SettingDescription

        vpcId

        The VPC for the node to be deployed.

        subnetId

        The subnet where the node should be deployed in the above VPC.

        securityGroupList

        The security groups where the node should be associated in the above VPC.

        vmTagsList

        The AWS tags to associate with the node.

        assignPublicIp

        Identifies if the node should be assigned with a public IP.

        nodeInfo

        Customizable node Information detail that is displayed in the %wm UI Job Details Page for each node. If not provided, the %wm generates the default nodeInfo based on the provided values.

      • Sample Amazon Resource Placement Callout Script
        #!/bin/bash
        
        . /utils.sh
        
        content="{\"vpcId\":\"vpc-1234abcd\",
        \"subnetId\":\"subnet-1234abcd\", \"securityGroupList\":\"sg-1234abcd\",
        \"vmTagsList\":\"Name:MyVm,PayProfile:Dev,BU:Engineering,User:DemoUser\",
        \"assignPublicIp\":\"true\", \"nodeInfo\":\"VpcID:
        vpc-1234abcd, subnetId: subnet-1234abcd,securityGroupList:sg-1234abcd \"}"
        
        print_ext_service_result "$content"


    •  OpenStack Options
      • The following table describes OpenStack-specific cloud settings for the resource placement callout script.

        OpenStack SettingDescription

        TenantName

        The name of OpenStack tenant.

        zone

        The availability zone as described in Availability Sets and Zones > OpenStack.

        nicInfo

        The OpenStack network interface information.

        privateIPAllocationMode

        The private IP allocation strategy (DHCP or PREALLOCATE_IP).

        networkID

        The OpenStack Network ID.

        publicIpAllocate

        A flag to allocate the public IP address (Boolean: true/false).

        nodeInfo

        Customizable node Information detail that is displayed in the %wm UI Job Details Page for each node. If not provided, the %wm generates the default nodeInfo.

      • Sample OpenStack Resource Placement Callout Script
        #!/bin/bash
        . /utils.sh
        content="{\"TenantName\":\"sample\",\"zone\":\"nova\",
        \"nicInfo\":\"
        [{\\\"privateIPAllocationMode\\\":\\\"DHCP\\\",\\\"networkID\\\":\\\"19f56fa2-babc-4q22-9q9b-20c4e3243b85\\\",\\\"publicIpAllocate\\\":true},
        {\\\"privateIPAllocationMode\\\":\\\"PREALLOCATE_IP\\\",\\\"networkID\\\":\\\"19f56fa2-babc-4q22-9q9b-20c4e3243b85\\\",\\\"publicIpAllocate\\\":true},
        {\\\"privateIPAllocationMode\\\":\\\"PREALLOCATE_IP\\\",\\\"networkID\\\":\\\"19f56fa2-babc-4q22-9q9b-20c4e3243b85\\\",\\\"publicIpAllocate\\\":false}]
        \",
        \"nodeInfo\":\"zone:nova, TenantName:sample\"}"
        print_ext_service_result "$content"
    •  vCenter Options
      • The following table describes vCenter-specific cloud settings for the resource placement callout script:

        VMware SettingDescription

        vmTagsList

        The AWS tags to associate with the node.

        UserDataCenterName

        The datacenter to deploy the node.

        UserClusterName

        The cluster to deploy the node in the above datacenter.

        UserResourcePoolName

        The resource pool used to deploy the node.

        UserDatastoreCluster

        The datastore cluster or datastore associated with the node. Datastore can be specified here, only if the datastore is not part of any datastore cluster.

        UserDatastore

        Specific datastore within the datastore cluster associated with the node. If this value is populated, it is mandatory to specify the datastore cluster that the datastore belongs to, in UserDatastoreCluster.

        UserFolderName

        The user folder used for the node deployment.

        DisableSDRS

        The value set to enable or disable the storage DRS.

        RootDiskResizable

        Identifies if the root disk is resizable (Boolean: true/false).

        The Root Disk setting is available as a separate field and you can only select the Root Disk size if the Cloning Mode is set to Full Clone (Enable Full Clone = Selected). See VMware Network Settings for additional context.

        FullClone

        Identifies if the node to be launched is with full clone (Boolean: true/false).

        SystemFolderName

        The folder from which the template is selected.

        networkList

        The list of networks to attach to the node. The following table describes the format that various network types require. See vCenter Configurations > Resource Placement for additional context.

        VMware Network

        Format Required

        DVS and ACI networks

        DistributedPortGroupName (DistributedSwitchName)

        For Example:
        DistributedPortGroupName101 (DistributedSwitch2)

        Standard Network

        NetworkName

        For Example:
        NetworkName101

        UserHost

        The ESX host to which the node is launched.

        nodeInfo

        Customizable node Information detail that is displayed in the %wm UI Job Details Page for each node. If not provided, the %wm generates the default nodeInfo based on the provided values.

        DisableStorageDRSIf you enable the Disable storage DRS for this virtual machine flag in the script, the values for the following variables are returned: UserDataCenterNameUserClusterName, and UserDatastoreCluster. Note that the UserDatastoreCluster value must be set to the exact datastore used from a DRS-enabled DS cluster, for example, datastore-151.
      • Sample VMware Resource Placement Callout Script
        #!/bin/bash
        
        . /utils.sh
        
        content="{\"UserDataCenterName\":\"SDC-01\",\"UserClusterName\":\"wm-Cluster\",\"UserResourcePoolName\":\"\",\"vmTagsList\":\"cloud:center\",\"UserDatastoreCluster\":\"wm-DS-Cluster\",
        \"RootFolderName\":\"vm\",
        \"UserFolderName\":\"CliqrUser-2\",
        \"RootDiskResizable\":\"false\",
        \"FullClone\":\"true\",
        \"SystemFolderName\":\"CliqrTemplates\",
        \"networkList\":\"VLAN-ENG-NET (CC-DSwitch)\",
        \"UserHost\":\"sc2-esx02.abc.private\",\"nodeInfo\":\"UserDataCenterName:
        SDC-01, UserClusterName: wm-Cluster,
        UserDatastoreCluster:wm-DS-Cluster, networkList VLAN-ENG-NET
        (CC-DSwitch)\"}"
        
        print_ext_service_result "$content"
        
      • Sample CWOM/Turbonomic Integration Script for Resource Placement for Vmware
        #!/bin/bash
        
        . /utils.sh
         
        export CWOM_URL="<VM_TURBO_HOST>"
        export CWOM_USER="<User>"
        export CWOM_PASSWORD="<pwd>"
        export CWOM_RESOURCE="http://$CWOM_USER:$CWOM_PASSWORD@$CWOM_URL"
        . /utils.sh
        
        #pre fixing a datacenter in the sample
        if [ -z $dcName ];
        then
            export dcName="SCL2"
        fi
        
        export vmTagsList="Name:myVm"
        export UserDataCenterName="$dcName"
        export UserClusterName="CliQr"
        export UserResourcePoolName="Eng"
        export RootFolderName="vm"
        export UserFolderName="CliqrUser-id"
        export RootDiskResizable="false"
        export FullClone="true"
        export SystemFolderName="CliqrTemplates"
        export networkList="10-DEV (DSwitch)"
        export instanceNameVar=`echo CliqrTier_"$eNV_cliqrAppTierName"_instanceType`
        eval instanceName='$'$instanceNameVar
        
        getProfileId() {
            result=`curl -s -X GET $CWOM_RESOURCE/cwom/api/templates 
        | grep $instanceName`
            export profileId=`echo $result | awk -F uuid=\" '{printf $2}' | awk -F \" '{printf $1}'`
        }
        getProfileId
        
        getDatacenterId() {
                DATACENTER=$1
            result=`curl -s -X GET
        $CWOM_RESOURCE/cwom/api/markets/Market/entities | grep
        \"DataCenter\" | grep $DATACENTER`
            export dcId=`echo $result | awk -F
        uuid=\" '{printf $2}' | awk -F \" '{printf $1}'`
        }
        getDatacenterId "$dcName"
        
        
        #echo "dcId=$dcId"
        
        getReservation() {
            reservationName="reserve-$RANDOM"
            export reserveId=`curl -s -X POST
        $CWOM_RESOURCE/cwom/api/reservations -d
        "reservationName=$reservationName&templateName=$profileId&count=1&segmentationUuid[]=$dcId"`
        }
        getReservation
        sleep 3
        
        getHostAndDS() {
            result=`curl -s -X GET
        $CWOM_RESOURCE/cwom/api/deployitems/$reserveId`
            export datastore=`echo $result |  awk -F datastore=\" '{printf $2}' | awk -F \" '{printf $1}'`-cluster
            export host=`echo $result |  awk -F host=\" '{printf $2}' | awk 
        -F
        \" '{printf $1}'`     
        }
        getHostAndDS
        export UserDatastoreCluster="$datastore" 
        export UserHost="$host"
        
        content="{\"UserDataCenterName\":\"$dcName\",\"UserClusterName\":\"$UserClusterName\",\"UserResourcePoolName\":\"$UserResourcePoolName\",\"vmTagsList\":\"$vmTagsList\",\"UserDatastoreCluster\":\"$UserDatastoreCluster\",
        \"RootFolderName\":\"$RootFolderName\",
        \"UserFolderName\":\"$UserFolderName\", \"RootDiskResizable\":\"$RootDiskResizable\",
        \"FullClone\":\"$FullClone\", 
        \"SystemFolderName\":\"$SystemFolderName\",
        \"networkList\":\"$networkList\", \"UserHost\":\"$UserHost\",\"nodeInfo\":\"UserDataCenterName:
        $dcName, UserClusterName: $UserClusterName, UserDatastoreCluster:
        $UserDatastoreCluster, networkList: $networkList \"}"
        
        print_ext_service_result "$content"
    •  vCenter Media Related Attributes

      You can specify media attributes for deployed VMs in vCenter for the following applications:

      1. Single Root I/O Virtualization (SR-IOV)
      2. PCI passthrough
      3. Shared PCI passthrough(vGPU)
      4. Available USB license dongles
      5. CPU pinning(CPU affinity)

      The following are sample callout scripts.

      SR-IOV example
      #!/bin/bash
      
      . /utils.sh
      content="{\"UserDataCenterName\":\"MediaPod\",\"UserClusterName\":\"GPU-Enabled\",\"UserResourcePoolName\":\"\",\"vmTagsList\":\"\",\"UserDatastoreCluster\":\"MP-NFS-1_Shared\",\"RootFolderName\":\"\",\"UserFolderName\":\"/CloudCenter/CC4.10.0/Deployments\",\"RootDiskResizable\":\"false\",\"FullClone\":\"true\", \"VmRelocationEnabled\":\"true\", \"LocalDataStoreEnabled\":\"flase\",
      \"SystemFolderName\":\"\",\"networkList\":\"VM Network\",\"UserHost\":\"\",
      \"mediaInfo\":[{\"networkId\":\"dv_VL041_CC-Deploy-1 (dvSwitch)\", \"type\": \"SRIOV\", \"pciAddress\": \"0000:d8:00.0\", \"model\":\"\"}],
      \"nodeInfo\":\"UserDataCenterName:MediaPod, UserClusterName: GPU-Enabled,UserDatastoreCluster:, networkList VM Network\"}"
      
      print_ext_service_result "$content"
      
      vGPU and CPU pinning example
      #!/bin/bash
      
      . /utils.sh
      content="{\"UserDataCenterName\":\"MediaPod\",\"UserClusterName\":\"GPU-Enabled\",\"UserResourcePoolName\":\"\",\"vmTagsList\":\"\",\"UserDatastoreCluster\":\"MP-NFS-1_Shared\",\"RootFolderName\":\"\",\"UserFolderName\":\"/CloudCenter/CC4.10.0/Deployments\",\"RootDiskResizable\":\"false\",\"FullClone\":\"true\", \"VmRelocationEnabled\":\"true\", \"LocalDataStoreEnabled\":\"flase\",
      \"SystemFolderName\":\"\",
      \"networkList\":\"VM Network\",\"UserHost\":\"\", \"CpuAffinitySet\":\"2, 4- 6 \",
      \"mediaInfo\":[{\"type\": \"PCI_SHARED\", \"vgpu\": \"\"}],
      \"nodeInfo\":\"UserDataCenterName:MediaPod, UserClusterName: GPU-Enabled,UserDatastoreCluster:, networkList VM Network\"}"
      
      print_ext_service_result "$content"
      
      xxx example
      #!/bin/bash
      
      . /utils.sh
      content="{\"UserDataCenterName\":\"MediaPod\",\"UserClusterName\":\"GPU-Enabled\",\"UserResourcePoolName\":\"\",\"vmTagsList\":\"\",\"UserDatastoreCluster\":\"MP-NFS-1_Shared\",\"RootFolderName\":\"\",\"UserFolderName\":\"/CloudCenter/CC4.10.0/Deployments\",\"RootDiskResizable\":\"false\",\"FullClone\":\"true\", \"VmRelocationEnabled\":\"true\", \"LocalDataStoreEnabled\":\"flase\",
      \"SystemFolderName\":\"\",
      \"networkList\":\"VM Network\",\"UserHost\":\"\", \"CpuAffinitySet\":\"2, 4- 6 \",
      \"mediaInfo\":[{\"type\": \"PCI\", \"pciAddress\": \"0000:d8:00.3\", \"model\":\"MT28800 Family [ConnectX-5 Ex Virtual Function]\",\"systemId\":\"5c50c62d-def1-5e0a-8f84-0025b50201af\"}],
      \"nodeInfo\":\"UserDataCenterName:MediaPod, UserClusterName: GPU-Enabled,UserDatastoreCluster:, networkList VM Network\"}"
      
      print_ext_service_result "$content"
      USB device and CPU pinning example
      #!/bin/bash
      
      . /utils.sh
      content="{\"UserDataCenterName\":\"MediaPod\",\"UserClusterName\":\"GPU-Enabled\",\"UserResourcePoolName\":\"\",\"vmTagsList\":\"\",\"UserDatastoreCluster\":\"MP-NFS-1_Shared\",\"RootFolderName\":\"\",\"UserFolderName\":\"/CloudCenter/CC4.10.0/Deployments\",\"RootDiskResizable\":\"false\",\"FullClone\":\"true\", \"VmRelocationEnabled\":\"true\", \"LocalDataStoreEnabled\":\"flase\",
      \"SystemFolderName\":\"\",
      \"networkList\":\"VM Network\",\"UserHost\":\"\", \"CpuAffinitySet\":\"2, 4- 6 \",
      \"mediaInfo\":[{\"type\": \"USB\",\"model\":\"path:0/1/1\"}],
      \"nodeInfo\":\"UserDataCenterName:MediaPod, UserClusterName: GPU-Enabled,UserDatastoreCluster:, networkList VM Network\"}"
      
      print_ext_service_result "$content"



Container-Specific Resource Placement

A placement group represents a container pod and a tier in the application profile. A placement group is represented by a rectangle that you add to the topology modeler canvas by clicking the Create A Group button as indicated in the following screenshot. This support is available for some services like Apache, Nginx, MongoDB, and MySQL.

You can only drag and drop supported containers into the Create a Group rectangle.

Click and drag container-based services from the services palate on the left side of the topology modeler tab to the placement group rectangle, similar to the Apache2 profile and MongoDB profile that are visible in the canvas displayed in the following screenshot.

The properties panel on the right displays the properties for the currently selected object, which in this case is the last container dragged into the placement group, MongoDB. Notice that the minimum and maximum replicas fields in the General Settings section are not available, and the Network Services and Firewall Rules sections are also not available for this container. This is because these parameters are properties of the tier/pod. To see these parameters, click on the border of the placement group to select the placement group as a whole.

After selecting the placement group, notice the following in the Properties panel:

  • The name of the placement group contains the name of the first container dragged to the group (but you can edit this field).

  • Expanding the sections for Network Services and then Firewall Rules reveals that these sections automatically contain the union of the corresponding network services and firewall rules of the constituent containers.

  • The sections for Volumes, Deployment Parameters, and Minimum Resource Specifications are gone as these are specific to each container in the pod.

When deploying an application with a container tier that contains multiple containers, each container is listed within the corresponding per tier section on Page 1 of the deploy form.

If the container has visible parameters (defined in the application profile), an expand triangular icon appears to the left of the container name. Click on the expand icon to expand that section and display the deployment parameters.

On Page 2 of the deploy form, you have the option to specify the instance type for each container separately.

After the application successfully deploys, the individual containers within each replica of the pod are shown in the deployment Details page as described in the Deployment Details section.

Container-Specific Parameters

The following screenshot is an example of a Kubernetes console.

In the above screenshot:

  • The Port Name in the in the CloudCenter variable syntax (displayed in the following screenshot of the CCM UI Properties pane) is the <service_name> in the Kubernetes console.

  • The string displayed in the Kubernetes console as http-668-335a5a is the longer unique name created by the CCO and passed to Kubernetes when the app is launched.

See CloudCenter-Defined Parameters > Kubernetes Container Service Parameters for additional context.

See Container Service for service-specific details.

Terms & Conditions Privacy Statement Cookies Trademarks