0

I am creating a cluster using the following azure cli 2.0 command

create-cluster.sh

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# -e: immediately exit if any command has a non-zero exit status
# -o: prevents errors in a pipeline from being masked
# IFS new value is less likely to cause confusing bugs when looping arrays or arguments (e.g. $@)

usage() { echo "Usage: $0 -i <subscriptionId> -g <resourceGroupName> -n <deploymentName> -l <resourceGroupLocation>" 1>&2; exit 1; }

declare subscriptionId=""
declare resourceGroupName=""
declare deploymentName=""
declare resourceGroupLocation=""

# Initialize parameters specified from command line
while getopts ":i:g:n:l:" arg; do
    case "${arg}" in
        i)
            subscriptionId=${OPTARG}
            ;;
        g)
            resourceGroupName=${OPTARG}
            ;;
        n)
            deploymentName=${OPTARG}
            ;;
        l)
            resourceGroupLocation=${OPTARG}
            ;;
        h)
            echo "This message"
        esac
done
shift $((OPTIND-1))

#Prompt for parameters is some required parameters are missing
if [[ -z "$subscriptionId" ]]; then
    echo "Your subscription ID can be looked up with the CLI using: az account show --out json "
    echo "Enter your subscription ID:"
    read subscriptionId
    [[ "${subscriptionId:?}" ]]
fi

if [[ -z "$resourceGroupName" ]]; then
    echo "This script will look for an existing resource group, otherwise a new one will be created "
    echo "You can create new resource groups with the CLI using: az group create "
    echo "Enter a resource group name"
    read resourceGroupName
    [[ "${resourceGroupName:?}" ]]
fi

if [[ -z "$deploymentName" ]]; then
    echo "Enter a name for this deployment:"
    read deploymentName
fi

if [[ -z "$resourceGroupLocation" ]]; then
    echo "If creating a *new* resource group, you need to set a location "
    echo "You can lookup locations with the CLI using: az account list-locations "

    echo "Enter resource group location:"
    read resourceGroupLocation
fi

#templateFile Path - template file to be used
templateFilePath="template.json"

if [ ! -f "$templateFilePath" ]; then
    echo "$templateFilePath not found"
    exit 1
fi

#parameter file path
parametersFilePath="parameters.json"

if [ ! -f "$parametersFilePath" ]; then
    echo "$parametersFilePath not found"
    exit 1
fi

if [ -z "$subscriptionId" ] || [ -z "$resourceGroupName" ] || [ -z "$deploymentName" ]; then
    echo "Either one of subscriptionId, resourceGroupName, deploymentName is empty"
    usage
fi

#login to azure using your credentials
az account show 1> /dev/null

if [ $? != 0 ];
then
    az login
fi

#set the default subscription id
az account set --subscription $subscriptionId

set +e

#Check for existing RG
az group show $resourceGroupName 1> /dev/null

if [ $? != 0 ]; then
    echo "Resource group with name" $resourceGroupName "could not be found. Creating new resource group.."
    set -e
    (
        set -x
        az group create --name $resourceGroupName --location $resourceGroupLocation 1> /dev/null
    )
    else
    echo "Using existing resource group..."
fi

#Start deployment
echo "Starting deployment..."
(
    set -x
    az group deployment create --name "$deploymentName" --resource-group "$resourceGroupName" --template-file "$templateFilePath" --parameters "@${parametersFilePath}"
)

if [ $?  == 0 ];
 then
    echo "Template has been successfully deployed"
fi

I have used cluster template and parameters to create a cluster and it takes around 15 minutes for completion.

In my Node js application UI, I have to show as "Cluster creation InProgress" when cluster creation starts (i.e when calling above create-cluster.sh).

I have to show status as "In progress" in UI till cluster creation completes.

To show as "In Progress" in UI, I am calling command to get the status of HDI cluster. Where I have to execute the below command. Is it end of create-cluster.sh?

az resource show --ids /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.HDInsight/clusters/$clusterName
Galet
  • 5,853
  • 21
  • 82
  • 148

1 Answers1

1

If my understanding is right, you could write a script to check whether deployment is succeed. For example:

az group deployment show --name HDInsight__2018-03-15T01.36.14.356Z --resource-group shuihdi2 --query '{"status":properties.provisioningState}'

When the status is Succeeded, you could call delete-cluster.sh to delete HDI cluster.

I test in my lab, you could check the test result.

enter image description here

Update:

You could make creating HDI process run in the background. Using like below:

nohup az group deployment create --name "$deploymentName" --resource-group "$resourceGroupName" --template-file "$templateFilePath" --parameters "@${parametersFilePath}" > /dev/null 2>&1 &

Then use az group deployment show to check the deployment status.

Shui shengbao
  • 18,746
  • 3
  • 27
  • 45
  • I have rephrased my question. Kindly take a look – Galet Mar 15 '18 at 04:18
  • 1
    OK, I think I mean your scenario, you could create HDI in the background. Using like this `nohup az group deployment create --name "$deploymentName" --resource-group "$resourceGroupName" --template-file "$templateFilePath" --parameters "@${parametersFilePath}" > /dev/null 2>&1 &` and use `az group deployment show` to check the status, if status is `Running`, in the UI, you could show `Cluster creation InProgress` – Shui shengbao Mar 15 '18 at 04:44
  • Check this question https://stackoverflow.com/questions/9190151/how-to-run-a-shell-script-in-the-background-and-get-no-output – Shui shengbao Mar 15 '18 at 04:45
  • You could use a loop to check the status, for example 30 seconds inspection. – Shui shengbao Mar 15 '18 at 04:46
  • When you execute `nohup – Shui shengbao Mar 15 '18 at 06:25
  • Ok. I will check. – Galet Mar 15 '18 at 06:28