www.powershellgallery.com Open in urlscan Pro
2620:1ec:29:1::45  Public Scan

Submitted URL: http://www.powershellgallery.com/packages/dbachecks/1.1.121/Content/checks%5CHADR.Tests.ps1
Effective URL: https://www.powershellgallery.com/packages/dbachecks/1.1.121/Content/checks%5CHADR.Tests.ps1
Submission: On November 19 via manual from BE — Scanned from DE

Form analysis 1 forms found in the DOM

GET /packages

<form aria-label="Package search bar" action="/packages" method="get">
  <div class="container">
    <div class="row">
      <div class="col-sm-offset-1 col-sm-2"></div>
      <div class="col-sm-12 col-md-8">
        <div class="form-group special-margin-left">
          <label for="search">Search PowerShell packages:</label>
          <div class="input-group" role="presentation">
            <input name="q" type="text" class="form-control ms-borderColor-blue search-box" id="search" aria-label="Enter packages to search, use the arrow keys to autofill." placeholder="Az, etc..." autocomplete="on" value="">
            <span class="input-group-btn">
              <button class="btn btn-default btn-search ms-borderColor-blue ms-borderColor-blue--hover" type="submit" title="Search PowerShell packages" aria-label="Search PowerShell packages">
                <span class="ms-Icon ms-Icon--Search" aria-hidden="true"></span>
              </button>
            </span>
          </div>
          <div id="autocomplete-results-container" class="text-left" tabindex="0"></div>
          <script type="text/html" id="autocomplete-results-row">
            <!-- ko if: $data -->
          <!-- ko if: $data.PackageRegistration -->
          <div class="col-sm-4 autocomplete-row-id autocomplete-row-data">
            <span data-bind="attr: { id: 'autocomplete-result-id-' + $data.PackageRegistration.Id, title: $data.PackageRegistration.Id }, text: $data.PackageRegistration.Id"></span>
          </div>
          <div class="col-sm-4 autocomplete-row-downloadcount text-right autocomplete-row-data">
            <span data-bind="text: $data.DownloadCount + ' downloads'"></span>
          </div>
          <div class="col-sm-4 autocomplete-row-owners text-left autocomplete-row-data">
            <span data-bind="text: $data.OwnersString + ' '"></span>
          </div>
          <!-- /ko -->
          <!-- ko ifnot: $data.PackageRegistration -->
          <div class="col-sm-12 autocomplete-row-id autocomplete-row-data">
            <span data-bind="attr: { id: 'autocomplete-result-id-' + $data, title: $data  }, text: $data"></span>
          </div>
          <!-- /ko -->
          <!-- /ko -->
          </script>
          <script type="text/html" id="autocomplete-results-template">
            <!-- ko if: $data.data.length > 0 -->
          <div data-bind="foreach: $data.data" id="autocomplete-results-list">
            <a data-bind="attr: { id: 'autocomplete-result-row-' + $data, href: '/packages/' + $data, title: $data }" tabindex="-1">
            <div data-bind="attr:{ id: 'autocomplete-container-' + $data }" class="autocomplete-results-row">
            </div>
        </a>
          </div>
          <!-- /ko -->
          </script>
        </div>
      </div>
    </div>
  </div>
</form>

Text Content

This site uses cookies for analytics, personalized content and ads. By
continuing to browse this site, you agree to this use. Learn more
Skip To Content

PowerShell Gallery

Toggle navigation
 * Packages
 * Publish
 * Documentation

Sign in

Search PowerShell packages:




DBACHECKS

1.1.121


CHECKS/HADR.TESTS.PS1

$filename = $MyInvocation.MyCommand.Name.Replace(".Tests.ps1", "")

# Get all the info in the function
function Get-ClusterObject {
    [CmdletBinding()]
    param (
        [string]$ClusterVM
    )
    
    [pscustomobject]$return = @{}
    # Don't think you can use the cluster name here it won't run remotely
    $return.Cluster = (Get-Cluster -Name $clustervm)
    $return.Nodes = (Get-ClusterNode -Cluster $clustervm)
    $return.Resources = (Get-ClusterResource -Cluster $clustervm)
    $return.Network = (Get-ClusterNetwork -Cluster $clustervm)
    $return.Groups = (Get-ClusterGroup -Cluster $clustervm)
    $return.AGs = $return.Resources.Where{ $psitem.ResourceType -eq 'SQL Server
Availability Group' }
    $return.AvailabilityGroups = @{}
    #Add all the AGs
    foreach ($Ag in $return.AGs) {

        $return.AvailabilityGroups[$AG.Name] = Get-DbaAvailabilityGroup -SqlInstance $Ag.OwnerNode.Name -AvailabilityGroup $AG.Name
    }
    Return $return
}

# Import module or bomb out

# needs the failover cluster module
if (-not (Get-Module FailoverClusters)) {
    try {
        Import-Module FailoverClusters -ErrorAction Stop
    }
    catch {
        Stop-PSFFunction -Message "FailoverClusters module could not load -
Please install the Failover Cluster module using Windows Features
" -ErrorRecord $psitem
        return
    }
}

# Grab some values
$clusters = Get-DbcConfigValue app.cluster
$skiplistener = Get-DbcConfigValue skip.hadr.listener.pingcheck
$domainname = Get-DbcConfigValue domain.name
$tcpport = Get-DbcConfigValue policy.hadr.tcpport

#Check for Cluster config value
if ($clusters.Count -eq 0) {
    Write-Warning "No Clusters to look at. Please use Set-DbcConfig -Name
app.clusters to add clusters for checking"
    break
}
    
foreach ($clustervm in $clusters) {
    # pick the name here for the output - we cant use it as we are accessing
remotely
    $clustername = (Get-Cluster -Name $clustervm).Name
    Describe "Cluster $clustername Health using Node
$clustervm" -Tags ClusterHealth, $filename {
        $return = Get-ClusterObject -Clustervm $clustervm
    
        Context "Cluster nodes for $clustername" {
            $return.Nodes.ForEach{
                It "Node $($psitem.Name) should be up" {
                    $psitem.State | Should -Be 'Up' -Because 'Every node in the
cluster should be available'
                }
            }
        }
        Context "Cluster resources for $clustername" {
            $return.Resources.foreach{
                It "Resource $($psitem.Name) should be online" {
                    $psitem.State | Should -Be 'Online' -Because 'All of the
cluster resources should be online'
                }
            }
        }
        Context "Cluster networks for $clustername" {
            $return.Network.ForEach{
                It "$($psitem.Name) should be up" {
                    $psitem.State | Should -Be 'Up' -Because 'All of the CLuster
Networks should be up'
                }
            }
        }
        
        Context "HADR status for $clustername" {
            $return.Nodes.ForEach{
                It "HADR should be enabled on the node $($psitem.Name)" {
                    (Get-DbaAgHadr -SqlInstance $psitem.Name).IsHadrEnabled | Should -BeTrue -Because 'All
of the nodes should have HADR enabled'
                }
            }
        }
        $Ags = $return.AGs.Name
        foreach ($Name in $Ags) {
            $Ag = $return.AvailabilityGroups[$Name]
            
            Context "Cluster Connectivity for Availability Group $($AG.Name) on
$clustername" {
                $AG.AvailabilityGroupListeners.ForEach{
                    $results = Test-DbaConnection -sqlinstance $_.Name
                    It "Listener $($results.SqlInstance) should be
pingable" -skip:$skiplistener {
                        $results.IsPingable | Should -BeTrue -Because 'The
listeners should be pingable'
                    }
                    It "Listener $($results.SqlInstance) should be able to
connect with SQL" {
                        $results.ConnectSuccess | Should -BeTrue -Because 'The
listener should process SQL commands successfully'
                    }
                    It "Listener $($results.SqlInstance) domain name should be
$domainname" {
                        $results.DomainName | Should -Be $domainname -Because "$domainname
is what we expect the domain name to be"
                    }
                    It "Listener $($results.SqlInstance) TCP port should be
$tcpport" {
                        $results.TCPPort | Should -Be $tcpport -Because "$tcpport
is what we said the TCP port should be"
                    }
                }

                $AG.AvailabilityReplicas.ForEach{
                    $results = Test-DbaConnection -sqlinstance $PsItem.Name
                    It "Replica $($results.SqlInstance) Should Be Pingable" {
                        $results.IsPingable | Should -BeTrue -Because 'Each
replica should be pingable'
                    }
                    It "Replica $($results.SqlInstance) should be able to
connect with SQL" {
                        $results.ConnectSuccess | Should -BeTrue -Because 'Each
replica should be able to process SQL commands'
                    }
                    It "Replica $($results.SqlInstance) domain name should be
$domainname" {
                        $results.DomainName | Should -Be $domainname -Because "$domainname
is what we expect the domain name to be"
                    }
                    It "Replica $($results.SqlInstance) TCP port should be
$tcpport" {
                        $results.TCPPort | Should -Be $tcpport -Because "$tcpport
is what we said the TCP port should be"
                    }
                }
            }

            Context "Availability group status for $($AG.Name) on
$clustername" {
                $AG.AvailabilityReplicas.ForEach{
                    It "$($psitem.Name) replica should not be in unknown
availability mode" {
                        $psitem.AvailabilityMode | Should -Not -Be 'Unknown' -Because 'The
replica should not be in unknown state'
                    }
                }
                $AG.AvailabilityReplicas.Where{ $psitem.AvailabilityMode -eq 'SynchronousCommit' }.ForEach{
                    It "$($psitem.Name) replica should be synchronised" {
                        $psitem.RollupSynchronizationState | Should -Be 'Synchronized' -Because 'The
synchronous replica should be synchronised'
                    }
                }
                $AG.AvailabilityReplicas.Where{ $psitem.AvailabilityMode -eq 'ASynchronousCommit' }.ForEach{
                    It "$($psitem.Name) replica should be synchronising" {
                        $psitem.RollupSynchronizationState | Should -Be 'Synchronizing' -Because 'The
asynchronous replica should be synchronizing '
                    }
                }
                $AG.AvailabilityReplicas.Where.ForEach{
                    It"$($psitem.Name) replica should be connected" {
                        $psitem.ConnectionState | Should -Be 'Connected' -Because 'The
replica should be connected'
                    }
                }
            
            }
        
            Context "Database availability group status for $($AG.Name) on
$clustername" {
                $ag.AvailabilityReplicas.Where{$_.AvailabilityMode -eq 'SynchronousCommit' }.ForEach{
                    (Get-DbaAgDatabase -SqlInstance $psitem.Name -AvailabilityGroup $Ag.Name).ForEach{
                        It "Database $($psitem.DatabaseName) should be
synchronised on the replica $($psitem.Replica)" {
                            $psitem.SynchronizationState | Should -Be 'Synchronized'  -Because 'The
database on the synchronous replica should be synchronised'
                        }
                        It "Database $($psitem.DatabaseName) should be failover
ready on the replica $($psitem.Replica)" {
                            $psitem.IsFailoverReady | Should -BeTrue -Because 'The
database on the synchronous replica should be ready to failover'
                        }
                        It "Database $($psitem.DatabaseName) should be joined on
the replica $($psitem.Replica)" {
                            $psitem.IsJoined | Should -BeTrue -Because 'The
database on the synchronous replica should be joined to the availability group'
                        }
                        It "Database $($psitem.DatabaseName) should not be
suspended on the replica $($psitem.Replica)" {
                            $psitem.IsSuspended | Should -Be  $False -Because 'The
database on the synchronous replica should not be suspended'
                        }
                    }
                }
                $ag.AvailabilityReplicas.Where{$_.AvailabilityMode -eq 'AsynchronousCommit' }.ForEach{
                    (Get-DbaAgDatabase -SqlInstance $PSItem.Name -AvailabilityGroup $Ag.Name).ForEach{
                        It "Database $($psitem.DatabaseName) should be
synchronising on the secondary as it is Async" {
                            $psitem.SynchronizationState | Should -Be 'Synchronizing' -Because 'The
database on the asynchronous secondary replica should be synchronising'
                        }
                        It "Database $($psitem.DatabaseName) should be failover
ready on the secondary replica $($psitem.Replica)" {
                            $psitem.IsFailoverReady | Should -BeFalse -Because 'The
database on the asynchronous secondary replica should be ready to failover'
                        }
                        It "Database $($psitem.DatabaseName) should be joined on
the secondary replica $($psitem.Replica)" {
                            $psitem.IsJoined | Should -BeTrue -Because 'The
database on the asynchronous secondary replica should be joined to the
availaility group'
                        }
                        It "Database $($psitem.DatabaseName) should not be
suspended on the secondary replica $($psitem.Replica)" {
                            $psitem.IsSuspended | Should -Be  $False -Because 'The
database on the asynchronous secondary replica should not be suspended'
                        }
                    }
                }
            } 
        }
        $return.Nodes.ForEach{
            Context "Always On extended event status for replica $($psitem.Name)
on $clustername" {
                $Xevents = Get-DbaXEsession -SqlInstance $psitem.Name
                It "Replica $($psitem.Name) should have an extended event
session called AlwaysOn_health" {
                    $Xevents.Name  | Should -Contain 'AlwaysOn_health' -Because 'The
extended events session should exist'
                }
                It "Replica $($psitem.Name) Always On Health extended event
session should be running" {
                    $Xevents.Where{ $_.Name -eq 'AlwaysOn_health' }.Status | Should -Be 'Running' -Because 'The
extended event session will enable you to troubleshoot errors'
                }
                It "Replica $($psitem.Name) Always On Health extended event
session should be set to auto start" {
                    $Xevents.Where{ $_.Name -eq 'AlwaysOn_health' }.AutoStart | Should -BeTrue  -Because 'The
extended event session will enable you to troubleshoot errors'
                }
            }
        }
    }
}

# SIG # Begin signature block
# MIINEAYJKoZIhvcNAQcCoIINATCCDP0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU2EBzwToJ0XEVspT8S9HmHBSh
# TQWgggpSMIIFGjCCBAKgAwIBAgIQAsF1KHTVwoQxhSrYoGRpyjANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE3MDUwOTAwMDAwMFoXDTIwMDUx
# MzEyMDAwMFowVzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMQ8wDQYD
# VQQHEwZWaWVubmExETAPBgNVBAoTCGRiYXRvb2xzMREwDwYDVQQDEwhkYmF0b29s
# czCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAI8ng7JxnekL0AO4qQgt
# Kr6p3q3SNOPh+SUZH+SyY8EA2I3wR7BMoT7rnZNolTwGjUXn7bRC6vISWg16N202
# 1RBWdTGW2rVPBVLF4HA46jle4hcpEVquXdj3yGYa99ko1w2FOWzLjKvtLqj4tzOh
# K7wa/Gbmv0Si/FU6oOmctzYMI0QXtEG7lR1HsJT5kywwmgcjyuiN28iBIhT6man0
# Ib6xKDv40PblKq5c9AFVldXUGVeBJbLhcEAA1nSPSLGdc7j4J2SulGISYY7ocuX3
# tkv01te72Mv2KkqqpfkLEAQjXgtM0hlgwuc8/A4if+I0YtboCMkVQuwBpbR9/6ys
# Z+sCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZldQ5Y
# MB0GA1UdDgQWBBRcxSkFqeA3vvHU0aq2mVpFRSOdmjAOBgNVHQ8BAf8EBAMCB4Aw
# EwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDovL2Ny
# bDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGGL2h0
# dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMEwG
# A1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3
# LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYwJAYI
# KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcwAoZC
# aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJ
# RENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD
# ggEBANuBGTbzCRhgG0Th09J0m/qDqohWMx6ZOFKhMoKl8f/l6IwyDrkG48JBkWOA
# QYXNAzvp3Ro7aGCNJKRAOcIjNKYef/PFRfFQvMe07nQIj78G8x0q44ZpOVCp9uVj
# sLmIvsmF1dcYhOWs9BOG/Zp9augJUtlYpo4JW+iuZHCqjhKzIc74rEEiZd0hSm8M
# asshvBUSB9e8do/7RhaKezvlciDaFBQvg5s0fICsEhULBRhoyVOiUKUcemprPiTD
# xh3buBLuN0bBayjWmOMlkG1Z6i8DUvWlPGz9jiBT3ONBqxXfghXLL6n8PhfppBhn
# daPQO8+SqF5rqrlyBPmRRaTz2GQwggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7Vv
# lVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp
# Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEw
# MjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI
# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
# A4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx
# 6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEj
# lpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJN
# YBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2
# DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9
# hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNV
# HRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF
# BQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
# Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDig
# NoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAo
# BggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgB
# hv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAU
# Reuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi
# 0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6l
# jlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0k
# riTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/P
# QMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d
# 9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJm
# oecYpJpkUe8xggIoMIICJAIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQD
# EyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhACwXUo
# dNXChDGFKtigZGnKMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgACh
# AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM
# BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQm2xema3nr3tBboVo5EE42DegI
# ZTANBgkqhkiG9w0BAQEFAASCAQBzYLFJibFufLFWDQGfJ+NakNRr7clqB/9tOMdT
# yDaqf+UbB0q10RCq2A80jOpKSuLt1WkOh53hgG1H0pCHHHvk/HTKOnVkbCXxuS5u
# jY/YhUjm/bil9elOcjgpXjqQOaoLIb9OePt5jYSVQ5PNXrqWrAhSeguQi9Y10QHO
# kaoRz7cajXa1P+8B3jW2EgHC95WvcBtbqLO2JPa90jp7RFO/eQdbyh0T57MjUNA1
# Plh0oeXn9jewnGrdmgW+XxGfA8mPAbazrWLhMZae8I50wpeDAPsXiKW1FF8jFOxs
# s7MKgvlfG0u5fsFgHTl3+kM32yZeQZ3cva58F8Er4z506oLW
# SIG # End signature block


Contact Us
Terms of Use
Privacy Policy
Gallery Status
Feedback
FAQs
© 2024 Microsoft Corporation