function Get-ChocolateyServicesToStart { <# .SYNOPSIS Returns service objects for services running out of the Chocolatey path, decorated by tier, which are in the stopped state. .DESCRIPTION Returns service objects for services running out of the Chocolatey path, decorated by tier, which are in the stopped state. Includes the path for the service executable. .PARAMETER RemoteServer [string When supplied executes against a single remote machine. Defaults to localhost .EXAMPLE Get-ChocolateyServicesToStart -Verbose [Get-ChocolateyServices] : Finding services installed out of the chocolatey path: C:\ProgramData\chocolatey [Get-ChocolateyServices] : Found 4 chocolatey services. [Get-ChocolateyServicesToStart] : Found 4 Chocolatey Services VERBOSE: [Get-ChocolateyServicesToStart] : Pulling Services for Tier 0 VERBOSE: [Get-ChocolateyServicesToStart] : Found 2 Services for Tier 0 VERBOSE: [Get-ChocolateyServicesToStart] : Adding Service Alkami.Services.Subscriptions.Host to Tier 0 VERBOSE: [Get-ChocolateyServicesToStart] : Alkami.MicroServices.Broker.Host is a tier 0 service but cannot be started due to current state Running VERBOSE: [Get-ChocolateyServicesToStart] : Pulling Services for Tier 1 VERBOSE: [Get-ChocolateyServicesToStart] : Found 14 Services for Tier 1 VERBOSE: [Get-ChocolateyServicesToStart] : Adding Service Alkami.MicroServices.Authorization.Service.Host to Tier 1 VERBOSE: [Get-ChocolateyServicesToStart] : Pulling Services for Tier 2 VERBOSE: [Get-ChocolateyServicesToStart] : No Services Defined for Tier 2 -- adding all other services not matched VERBOSE: [Get-ChocolateyServicesToStart] : Adding Service Alkami.MicroServices.Features.Beacon.Host to Tier 2 ServiceName ServicePath ----------- ----------- Alkami.Services.Subscriptions.Host "C:\ProgramData\chocolatey\lib\Alkami.Services.Subscriptions.Host\to... Alkami.MicroServices.Authorization.Service.Host "C:\ProgramData\chocolatey\lib\Alkami.MicroServices.Authorization.Se... Alkami.MicroServices.Features.Beacon.Host "C:\ProgramData\chocolatey\lib\Alkami.MicroServices.Features.Beacon.... #> [CmdletBinding()] [OutputType([System.Object])] Param( [string]$RemoteServer = "localhost" ) $logLead = (Get-LogLeadName) [array]$chocolateyServices = Get-ChocolateyServices $RemoteServer Write-Verbose "$logLead : Found $($chocolateyServices.Count) Chocolatey Services" $microserviceTiers = (Get-MicroServiceTiers) $tieredServices = @() for ($i = 0; $i -le ($microserviceTiers).Count; $i++) { Write-Verbose "$logLead : Pulling Services for Tier $i" $matchedServiceNames = $tieredServices | Select-Object -ExpandProperty ServiceName if (Test-IsCollectionNullOrEmpty $microServiceTiers[$i]) { # We hit the end, return everything else not defined Write-Verbose "$logLead : No Services Defined for Tier $i -- adding all other services not matched" $allOtherServices = $chocolateyServices | Where-Object { ($_.State -eq "Stopped") -and ($matchedServiceNames -notcontains $_.Name) } foreach ($service in $allOtherServices) { Write-Verbose "$logLead : Adding Service $($service.Name) to Tier $i" $tieredServices += New-Object PSObject -Property @{ ServiceName = $service.Name; Tier=$i; ServicePath = $service.PathName; } } } else { Write-Verbose "$logLead : Found $(($microserviceTiers[$i]).Count) Services for Tier $i" foreach ($tierService in $microserviceTiers[$i]) { $serviceDefinition = $chocolateyServices | Where-Object {$_.Name -eq $tierService} if ($null -eq $serviceDefinition) { if (($i -eq 0 -and !(Test-IsServiceFabricServer)) -or (Test-IsMicroServer)) { # Tier 0 Services Should Exist Everywhere Except FAB Nodes # Any other Tiered service should exist on Microservice boxes Write-Warning "$logLead : $tierService is defined in tier $i but not located on this machine" } } elseif ($serviceDefinition.State -ne "Stopped") { Write-Verbose "$logLead : $tierService is a tier $i service but cannot be started due to current state $($serviceDefinition.State)" } else { Write-Verbose "$logLead : Adding Service $($serviceDefinition.Name) to Tier $i" $tieredServices += New-Object PSObject -Property @{ ServiceName = $serviceDefinition.Name; Tier=$i; ServicePath = $serviceDefinition.PathName; } } } } } Write-Host "$logLead : Found $($tieredServices.Count) Chocolatey Services to Start" return $tieredServices }