VConnectMultiStampManagement.psm1

Invoke-InstallOrUpdateModule 'SqlServer'

function Get-VConnectAzsStampsHealth {
      [CmdletBinding()]
      param (
            [Parameter(Mandatory = $true, Position = 0, HelpMessage = "VConnect API connection name; Please use Add-ApiConnection to create new connecition")]
            [string] $endpointName,
            [Switch] $exportCsv,
            [Switch] $gridView,
            [Switch] $printToConsole,
            [Switch] $extendedOutput,
            [Switch] $showLogs
      )
      try {
            $result = Invoke-RestApiRequest -endpointName $endpointName -relativeUrl 'admin/AzureStackAdminConnections/Get' -method 'GET'

            if (($result.Length -eq 2) -and ($null -ne $result[1])) {

                  $azsConnectionsList = $result[1] | Select-Object -Property ConnectionId, ConnectionName, Location, ArmEndpointUrl, TenantArmEndpointUrl, DefaultProviderSubscriptionId, TenantId, ClientId, LoginEndpoint, UseCertificateThumbprintInsteadAppSecret, EnvironmentCategoryTag, EnvironmentSubCategoryTag, IsAdfs, IsDisconnectedEnvironment, IsAllowManagement, CreatedTime, LastUpdatedTime

                  foreach ($azsConnection in $azsConnectionsList) {
                        try {
                              $adminArmEndpoint = $azsConnection.ArmEndpointUrl
                              $requestUrl = "$($adminArmEndpoint)/metadata/endpoints?api-version=2015-01-11"
                              if ($showLogs) {
                                    Write-Host "$($azsConnection.ConnectionName): Validating ARM endpoint..."
                                    Invoke-WebRequest $requestUrl
                              } else {
                                    Invoke-WebRequest $requestUrl |  Out-Null
                              }
                              Add-Member -InputObject $azsConnection -MemberType NoteProperty -Name Reachable -Value $true
                        }
                        catch {
                              $exception = $_
                              if ($showLogs) {
                                    Write-Host "$($azsConnection.ConnectionName) Validating ARM endpoint failed."
                                    Write-Host $exception
                              }
                              Add-Member -InputObject $azsConnection -MemberType NoteProperty -Name Reachable -Value $false
                        }
                  }

                  if ($gridView) {
                        $azsConnectionsList | Out-GridView
                        return
                  } 
                  if ($exportCsv) {
                        $dateTimeTicks = (Get-Date).Ticks
                        $outFileName = "Get-MamStamps-$($endpointName)-$($dateTimeTicks).csv"
                        Write-Host "Writing to File: $($outFileName)"
                        $azsConnectionsList | Export-Csv -Path $outFileName -NoTypeInformation
                        return
                  }
                  if ($printToConsole) {
                        if (-not $extendedOutput) {
                              $azsConnectionsList = $azsConnectionsList | Select-Object -Property ConnectionId, ConnectionName, Location, IsAdfs, EnvironmentCategoryTag, ArmEndpointUrl,TenantArmEndpointUrl,Reachable
                        }
                        Write-Host ""
                        Write-Host "Azure Stack Hub Stamp Connectivity Status" -BackgroundColor White -ForegroundColor DarkBlue
                        Write-Host ""

                        foreach ($azsConnection in $azsConnectionsList) {
                              Write-Host "------------------------------------------------------------------------------------------------"
                              if ($azsConnection.Reachable) {
                                    Write-Host "$($azsConnection.ConnectionName) is Reachable" -BackgroundColor Green -ForegroundColor Black
                              }
                              else {
                                    Write-Host "$($azsConnection.ConnectionName) is not Reachable" -BackgroundColor Red -ForegroundColor Black
                              }
                              Write-Host "------------------------------------------------------------------------------------------------"
                              Write-Output -InputObject $azsConnection
                              Write-Host ""
                        }
                        return
                  }
                  return $azsConnectionsList
            }
            Write-Error "Command returns null result."
            return $null
      }
      catch {
            $exception = $_
            Write-Host "Azure Stack Hub Stamp ARM endpoint validation: Failed to get stamp details."
            Write-Error $exception
      }
}

function Get-VConnectDiscoveredResourcesStatus {
      param(
            [Parameter(Mandatory = $true, Position = 0)]
            $name,
            [Parameter(Mandatory = $true, Position = 1)]
            $dbName,
            [Parameter(Mandatory = $false, Position = 2)]
            [int] $connectionId = 0,
            [Switch] $printToConsole
            )

      $query = "select
           drs.PlatformConnectionId as ConnectionId,
           drs.Cluster as StampName,
           drs.PlatformServiceName as Service,
           drs.ResourceSubType as ResourceType,
           Max(drs.DiscoveredDate) as UpdatesDate,
           Max(dj.Id) as DiscoverJobId,
           Max(ds.DeploymentId) as DeploymentId,
           Max(ops.ResultMessage) as LastMessage
           from DiscoveredResources drs with (nolock)
           inner join DiscoveryJobs dj with (nolock) on drs.DiscoveryJobId = dj.Id
           inner join Deployments ds with (nolock) on ds.DeploymentId = dj.DiscoveryJobDeploymentId
           inner join Operations ops with (nolock) on ops.DeploymentId = ds.DeploymentId
           Where ($connectionId <= 0 or drs.PlatformConnectionId = $connectionId)
              and drs.IsDeleted = 0
              and drs.PlatformConnectionType = 1050
              and ds.StatusString = 'Completed'
              and ops.OperationName = 'DiscoverAdminPlatformServiceOp'
           Group by PlatformConnectionId, Cluster, PlatformServiceName, ResourceSubType
           order by Cluster, PlatformServiceName, ResourceSubType"


      Write-Host "Azure Stack Hub Stamp Resource Update Status..."

      if ($printToConsole) {
        Invoke-SqlDbQuery $name $query $dbName -printToConsole
        return
      }
      return Invoke-SqlDbQuery $name $query $dbName
}
# SIG # Begin signature block
# MIIOCwYJKoZIhvcNAQcCoIIN/DCCDfgCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUC3NouP/DyloolTJ6ukJj7yjt
# gAGgggtCMIIFWjCCBEKgAwIBAgIQDO0lEK+T1uQiVg3lGt++5DANBgkqhkiG9w0B
# AQsFADB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEj
# MCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwHhcNMTcxMDEzMDAw
# MDAwWhcNMjExMDEzMjM1OTU5WjCBojELMAkGA1UEBhMCVVMxDjAMBgNVBBEMBTk4
# MDUyMQswCQYDVQQIDAJXQTEQMA4GA1UEBwwHUmVkbW9uZDESMBAGA1UECQwJU3Vp
# dGUgMjAwMRowGAYDVQQJDBE4MjAxIDE2NHRoIEF2ZSBORTEZMBcGA1UECgwQQ0xP
# VUQgQVNTRVJUIExMQzEZMBcGA1UEAwwQQ0xPVUQgQVNTRVJUIExMQzCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3TRJvdYkx0p/ETrd2ZDE42azIJ4qsR
# SrFIrV2Ac0rSRry9gouPMNgPGCdvcLkDj247i5LuJK1G/kXK27cCnefXgiiy7IZz
# XCzYIr+rhQ2IpZFDQHRDu8gAHthtCrW/0DiDZZLOqAfQipoaJiZLktfw1ExMjoZO
# lzux00hH/8BasYAaV2wWR3MPEqt8ehtOInop7vUKXHBeHqlS0vGZpmZmSooqnOqo
# e/+Ik7rBODjfWbS/ukEEz3uT5tQAfbaCqe0AI7jy+Qguag20pUSJZI15tzoUGDzu
# QF0IIhDZRUhrs9MVGlBCHPcQg5nAfll1xeyAXDGvOTUVNbe7p20H0tECAwEAAaOC
# Aa4wggGqMB8GA1UdIwQYMBaAFCmRYP+KTfrr+aZquM/55ku9Sc4SMB0GA1UdDgQW
# BBQDFhoCqrRSPk96X5/uWmKZzc0GfjAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/
# BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEEBAMCBBAwRgYD
# VR0gBD8wPTA7BgwrBgEEAbIxAQIBAwIwKzApBggrBgEFBQcCARYdaHR0cHM6Ly9z
# ZWN1cmUuY29tb2RvLm5ldC9DUFMwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2Ny
# bC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5jcmwwdAYIKwYB
# BQUHAQEEaDBmMD4GCCsGAQUFBzAChjJodHRwOi8vY3J0LmNvbW9kb2NhLmNvbS9D
# T01PRE9SU0FDb2RlU2lnbmluZ0NBLmNydDAkBggrBgEFBQcwAYYYaHR0cDovL29j
# c3AuY29tb2RvY2EuY29tMB8GA1UdEQQYMBaBFGluZm9AY2xvdWRhc3NlcnQuY29t
# MA0GCSqGSIb3DQEBCwUAA4IBAQCkmEma81+PRWa1v+En+dBfFF0TlfrnwXHQeU6a
# qGRxFWJO2ORTlj8TyTJZNQp7/5senwqGOkhZyBiUbDDz+mgpS3dD8+OTB+LPeTC0
# qxA2FwZan2yLiMyJ+tzWoMZThxWGdKr//9SwglLk6sjgAYeQ8zw0eLC3R5GkGZKE
# ZJdlZkeZj3OcjDZ+tsB0YeyrvzQApaAHxROJjPFmFNJulHkGTOIftgAYTZOLCuBw
# UjveYnsgiOjey0ljXb94Xfiy5V7F+Tg3hKmu+ykDthEr04omYgun4JRB++4ZmoYy
# Q9oqjKQDJM7/dnVbMh0W0D/8Ns0OepvGilKNbYYbVsLKi451MIIF4DCCA8igAwIB
# AgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UEBhMC
# R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y
# ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBS
# U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5MDAwMDAwWhcNMjgw
# NTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5j
# aGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGlt
# aXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR3elnMRHrzB79MR2z
# uWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvthe4YJs+P9omidHCyd
# v3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3e9V5kAoUGFEs5v7B
# EvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQc5hc9IVKaw+A3V7W
# vf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPiXzjbxghdR7ODQfAu
# ADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmLAgaff9ULAgMBAAGj
# ggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs2TIy1DAdBgNVHQ4E
# FgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB
# /wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYDVR0gBAowCDAGBgRV
# HSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NP
# TU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEGCCsGAQUFBwEBBGUw
# YzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5jb20vQ09NT0RPUlNB
# QWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2Nh
# LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4MbU2x8U6ST6/COCwE
# zMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQciGlEcOtTh6Qm/5iR0
# rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHfWGshqknUfDdOvf+2
# dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HITfK7ZU2o94VFB696
# aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46BLqioXwfy2M6FafU
# FRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gbqjSm/Iz13X9ljIwx
# VzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm5LLY5TjCqO3GgZw1
# a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQFhv/K53b0CDKieoo
# fjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5sL6iPDAZQ+4wns3bJ
# 9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55ZmjoIs2475iFTZYR
# PAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6Q++6Z2H/fUnguzB9
# XIDj5hY5S6cxggIzMIICLwIBATCBkTB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS
# R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
# T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p
# bmcgQ0ECEAztJRCvk9bkIlYN5RrfvuQwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcC
# AQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYB
# BAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFJRuxUPilFBk
# vB1XtpY5mzri9kdGMA0GCSqGSIb3DQEBAQUABIIBAHcCx4VdjyD1lh/NSjSZouIz
# 8xpx2OTpgo8/mbBILJvPD0t5qyu3uYwcBu+VL55jgLCTAP8iK9Lpk3iS3AmPxV4N
# Wo1hOTU201P0SyVo6hr8EnyyI5X9T4kwrFMRnIkjhMZ1OLItKtPkCkteyLNJKuYy
# K/pF7nlnAzg5yEi2XES0zqMovMXL1DrF0CA0KyJTYP/fi9xsCYxRnwf3XC9N6qoT
# mv4O0V8iJYitibmvh7ejZbCr41nniZ5ZqMEoOCmi43hifXlpv7Y8pW7lst4lLJgR
# X3rhLzHAhALmGfaTmRf5sD/xOxOll9GX9HdC5/nESs60ZqGJ7wKJ/3DLymKDN/k=
# SIG # End signature block