Test-ProvCloudConnection.ps1


<#PSScriptInfo
 
.VERSION 1.0.3
 
.GUID d3b73fe3-d9b8-433c-a29d-cfddd90f8643
 
.AUTHOR Dragan Arambasic
 
.COMPANYNAME Provance Technologies
 
.COPYRIGHT Provance Technologies
 
.TAGS Provance PCC AzureAutomation Azure
 
.LICENSEURI https://www.provance.com/
 
.PROJECTURI https://www.provance.com/
 
.ICONURI http://assetdesk.com/Images_for_KB_Articles/PROVANCE_FavIcon_mstile-310x310.png
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
1st Version with basic functionality
 
.PRIVATEDATA Privatedata
 
#>
 

#Requires -Module Provance.Azure,Provance.Dyn365


<#
 
.DESCRIPTION
This runbook tests connections to Cloud Service Management targets (ITSM, Azure Subscriptions, ...)
 
#>
 
param(
    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [String] $ITSMConnection,

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [String] $AzureConnection,

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [String] $ServiceMapConnection,

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [String] $CSPConnection
)

try
{   
    #################### S T A R T runbook ####################
    $time = [DateTime]::UtcNow.ToString('u')
    Write-Output "Start runbook at: $time"            

    # set the security protocol to TLS 1.2
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12

    ############## ITSM Connection - START ##############
    if ($ITSMConnection)
    {
        Write-Output ("1) Test ITSM connection: " + $ITSMConnection)
    
        $connectionITSM = Get-AutomationConnection -Name $ITSMConnection

        if ($connectionITSM)
        {
            $instanceURL = $connectionITSM.InstanceURL
            $userName = $connectionITSM.UserName
            $password = $connectionITSM.Password
            $tenantId = $connectionITSM.TenantId
            $applicationID = $connectionITSM.ApplicationID
            $apiVersion = $connectionITSM.APIVersion

            $msg = "instanceURL: {0}, userName: {1}, tenantId: {2}, applicationID: {3}, apiVersion: {4}"  `
                -f $instanceURL, $userName, $tenantId, $applicationID, $apiVersion

            Write-Output $msg

            if (($instanceURL -ne $null) -and ($userName -ne $null) -and ($password -ne $null) -and ($tenantId -ne $null))
            {
                $pswSecureString = ConvertTo-SecureString -String $password -AsPlainText -Force
                $userCred = New-Object -TypeName PSCredential -ArgumentList $userName, $pswSecureString

                $uCntx = Get-ProvAzureAuthContext -Resource $instanceURL -UserCredential $userCred -TenantId $tenantId

                if ($uCntx)
                {
                    Write-Output "INFO: ITSM context is OK" 

                    $lic = Get-ProvDyn365Entity -AuthContext $uCntx `
                        -EntityName apitil_itsmlicense `
                        -SelectSection "apitil_orguniquename,apitil_azuresubscription,apitil_azureservicemap" `
                        -FilterSection "(apitil_productlicensed eq 'Cloud Integration')" `
                        -TopSection 1 

                    if ($lic)
                    {
                       Write-Output ("INFO: Cloud Integration license:")
                       $lic 
                    }
                    else
                    { 
                       Write-Output ("INFO: Cloud Integration license is missing")
                    }
                }
                else
                {
                    Write-Output "*** ERROR: No valid ITSM context. Check value of the following ITSM connection properties: InstanceURL, UserName, Password and TennatId"  
                }
            }
            else
            {
            
                Write-Output "*** ERROR: ITSM connection propertiy (InstanceURL, UserName, Password or TennatId) is null"  
            }
        }
        else
        {
            Write-Output "*** ERROR: ITSM connection is missing"  
        }
    }

    # ITSM Connection - END #

    ############## Azure Connection - START ##############
    if ($AzureConnection)
    {
        Write-Output ("2) Test Azure connection: " + $AzureConnection)
        $connectionAzure = Get-AutomationConnection -Name $AzureConnection

        if ($connectionAzure)
        {
            $tenantName = $connectionAzure.TenantName
            $subscriptionName = $connectionAzure.SubscriptionName
            $subscriptionId = [System.Guid]$connectionAzure.SubscriptionId
            $tenantId = $connectionAzure.TenantId
            $applicationID = $connectionAzure.ApplicationID
            $applicationKey = $connectionAzure.ApplicationKey
            $apiVersion = $connectionAzure.APIVersion

            $msg = "tenantName: {0}, subscriptionName: {1}, subscriptionId: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}"  `
                -f $tenantName, $subscriptionName, $subscriptionId, $tenantId, $applicationID, $apiVersion

            Write-Output $msg

            if (($tenantId -ne $null) -and ($applicationKey -ne $null) -and ($applicationID -ne $null) -and ($subscriptionId -ne $null))
            {
                $appKeySecureString = ConvertTo-SecureString -String $applicationKey -AsPlainText -Force
                $cred = New-Object -TypeName PSCredential -ArgumentList $applicationID, $appKeySecureString

                $aCntx = Get-ProvAzureAuthContext -TenantId $tenantId -ClientCredential $cred

                if ($aCntx)
                {
                    Write-Output "INFO: Azure context is OK" 
        
                    $subscription = Get-ProvAzureSubscription -AuthContext $aCntx -SubscriptionId $subscriptionId

                    if ($subscription)
                    {
                        Write-Output ("INFO: Found Azure subscription: " + $subscription.DisplayName)
                    }
                    else {
                        Write-Output ("*** ERROR: No valid Azure subscription Id: " +  $subscriptionId)
                    }
                }
                else
                {
                    Write-Output "*** ERROR: No valid Azure context. Check value of the following Azure connection properties: TenantId, ApplicationId, and ApplicationKey" 
                }
            }
        }
        else
        {
            Write-Output ("*** ERROR: Azure connection: " + $AzureConnection + " is missing")
        }
    }
    # Azure Connection - END #

    ############## Service Map Connection - START ##############
    if ($ServiceMapConnection)
    {
        Write-Output ("3) Test Service Map connection: " + $ServiceMapConnection)   
        $connectionServiceMap = Get-AutomationConnection -Name $ServiceMapConnection

        if ($connectionServiceMap)
        {   
            $omsWorkspace = $connectionServiceMap.OMSWorkspace
            $resourceGroup = $connectionServiceMap.OMSRGName
            $subscriptionId = $connectionServiceMap.SubscriptionId
            $tenantId = $connectionServiceMap.TenantId
            $applicationID = $connectionServiceMap.ApplicationID
            $applicationKey = $connectionServiceMap.ApplicationKey
            $apiVersion = $connectionServiceMap.APIVersion

            $msg = "omsWorkspace: {0}, resourceGroup: {1}, subscriptionId: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}"  `
                -f $omsWorkspace, $resourceGroup, $subscriptionId, $tenantId, $applicationID, $apiVersion

            Write-Output $msg

            if (($tenantId -ne $null) -and ($applicationKey -ne $null) -and ($applicationID -ne $null) -and ($subscriptionId -ne $null))
            {
                $appKeySecureString = ConvertTo-SecureString -String $applicationKey -AsPlainText -Force
                $cred = New-Object -TypeName PSCredential -ArgumentList $applicationID, $appKeySecureString

                $aCntx = Get-ProvAzureAuthContext -TenantId $tenantId -ClientCredential $cred

                if ($aCntx)
                {
                    Write-Output "INFO: ServiceMap context is OK" 


                    if (($omsWorkspace -ne $null) -and ($resourceGroup -ne $null)) {
                        $smWrkSpc = Get-ProvAzureServiceMapWorkspace -AuthContext $aCntx `
                            -SubscriptionId $subscriptionId `
                            -ResourceGroup $resourceGroup `
                            -OMSWorkspace $omsWorkspace `
                            -ApiVersion $apiVersion `
                            -Verbose
                    
                        if ($smWrkSpc)
                        {
                            Write-Output ("INFO: Found Service Map workspace " + $smWrkSpc.DisplayName)
                        }
                        else {
                            Write-Output ("*** ERROR: Servic Map workspace " + $omsWorkspace + "in resource group " + $resourceGroup + " is missing") 
                        }
                    }
                    else {
                        Write-Output "*** ERROR: Servic Map workspace or resource group is null"
                    }

                }
                else
                {
                    Write-Output "*** ERROR: No valid ServiceMap context. Check value of the following Azure connection properties: TenantId, ApplicationId, and ApplicationKey"  
                }
            }
        }
        else
        {
            Write-Output ("*** ERROR: Service Map connection " + $ServiceMapConnection + " is missing")  
        }
    }
    # Service Map Connection - END #

    ############## CSP Connection - START ##############
    if ($CSPConnection)
    {
        Write-Output ("4) Test Service Map connection: " + $CSPConnection)
        $connectionCSP = Get-AutomationConnection -Name $CSPConnection

        if ($connectionCSP)
        {
            $baseURL = $connectionCSP.BaseURL
            $resource = $connectionCSP.Resource
            $loginURL = $connectionCSP.LoginURL
            $userName = $connectionCSP.UserName
            $password = $connectionCSP.Password
            $tenantId = $connectionCSP.TenantId
            $applicationID = $connectionCSP.ApplicationID
            $apiVersion = $connectionCSP.APIVersion

            $msg = "baseURL: {0}, resource: {1}, loginURL: {1}, userName: {1}, password: {2}, tenantId: {3}, applicationID: {4}, apiVersion: {5}"  `
                -f $baseURL, $resource, $loginURL, $userName, $password, $tenantId, $applicationID, $apiVersion

            Write-Output $msg

            if (($resource -ne $null) -and ($userName -ne $null) -and ($password -ne $null) -and ($tenantId -ne $null))
            {
                $pswSecureString = ConvertTo-SecureString -String $password -AsPlainText -Force
                $userCred = New-Object -TypeName PSCredential -ArgumentList $userName, $pswSecureString

                $uCntx = Get-ProvAzureAuthContext -Resource $resource -UserCredential $userCred -TenantId $tenantId

                if ($uCntx)
                {
                    Write-Output "INFO: CSP context is OK" 
                }
                else
                {
                    Write-Output "*** ERROR: No valid CSP context. Check value of the following CSP connection properties: BaseURL, UserName, Password and TennatId"  
                }
            }
        }
        else
        {
            Write-Output "*** ERROR: CSP connection is missing"  
        }
    }
    # CSP Connection - END #
} 
catch {
    $message = "Runbook *** ERROR: {0}" -f $_.Exception
    Write-Error -Message $message
}
finally {
    $time = [DateTime]::UtcNow.ToString('u')
    Write-Output "End of runbook at: $time"
}