Search code examples
azureazure-configurationazure-powershell

Azure Powershell cmdlets for 1.7, June 2012: what's happened to Get-OperationStatus?


The new Powershell cmdlets (documented here: http://msdn.microsoft.com/en-us/library/windowsazure/jj152841) look lovely, but there's one that appears missing:

Get-OperationStatus -WaitToComplete

Without this my Azure operations (e.g. Set-AzureDeployment) don't wait for completion.

This makes it hard to know when e.g. a staging instance is running before doing a VIP swap.

Are there any alternatives?


Solution

  • So, after investigation, my initial supposition was partly wrong: calls to the new Powershell cmdlets do wait for successful completion, except for Set-AzureDeployment -newStatus "Running".

    This is good, as we no longer need to have calls to Get-OperationStatus scattered through the script; it's bad, though, as Set-AzureDeployment leaves the deployment spinning up.

    We can call Get-AzureDeployment, though, and iterate through the RoleInstanceList to figure out what's going on. Like so:

    function Get-StagingReady {
        $stagingStatus = Get-AzureDeployment $azureService -slot staging 
        if (-not $($stagingStatus.Status -eq "Running")) {
            Write-Host $(" ... ... Staging slot status is not Running; value is " + $stagingStatus.Running)
            return $False
        }
    
        if (-not $stagingStatus.RoleInstanceList) {
            Write-Host " ... ... Staging slot has no instances configured yet."
            return $False
        }
    
        $notReady = $False
    
        Foreach ($roleInstance in $stagingStatus.RoleInstanceList) {
            if (-not $($roleInstance.InstanceStatus -eq "ReadyRole")) {
                Write-Host $(" ... ... ... Staging slot instance " + $roleInstance.InstanceName + " has status " + $roleInstance.InstanceStatus)
                $notReady = $True
            }
        }
    
        if ($notReady) {
            Write-Host " ... ... One or more instances not running."
            return $False
        }
    
        Write-Host " ... Staging slot ready for use."
        return $True
    }
    
    
    function Wait-ForStagingToBeReady {
        while ( -not $(Get-StagingReady) ) {
            Write-Host " ... ... Staging slot not ready, waiting 15 seconds for Azure to spin up instances."
            Start-Sleep -s 15
        }
    }
    
    
    function Start-Staging {
        Write-Host " ... Starting staging slot."
    
        $staging = Get-Staging $azureService 
        $result = Set-AzureDeployment `
                -Status `
                -serviceName $azureService `
                -slot "Staging" `
                -newStatus "Running" 
    
        if (-not $?) {
            Write-Host
            Write-Host "Unable to start staging slot."
            Write-Host "DEPLOY FAILED"
            Write-Host
            exit 1
        }
    
        Wait-ForStagingToBeReady
    
        Write-Host " ... Deployment in Staging slot started."
    }