DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.psm1

# Fallback message strings in en-US
DATA localizedData
{
ConvertFrom-StringData @'
    NoHyperVModule=Hyper-V PowerShell Module not found.
    CheckGIS=Checking if Guest integration Services on VM {0} are running.
    GISRunning=Guest Integration Services on VM {0} are running.
    GISNotRunning=Guest Integration Services on VM {0} are not running.
    Retry=Check for guest integration services in another {0} seconds.
    CheckError=Guest Integration Services on VM {0} failed to be in running state after {1} seconds.
'@

}

if (Test-Path "$PSScriptRoot\$PSCulture")
{
    Import-LocalizedData LocalizedData -filename "cWaitForVMGuestIntegration.psd1" -BaseDirectory "$PSScriptRoot\$PSCulture"
}

function Get-TargetResource
{
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory)]
        [String] $VMName,
        [UInt64] $RetryIntervalSec = 10,
        [UInt32] $RetryCount = 5
    )

    # Check if Hyper-V module is present for Hyper-V cmdlets
    if(!(Get-Module -ListAvailable -Name Hyper-V))
    {
        Throw $localizedData.NoHyperVModule
    }
    
    $returnValue = @{
        VMName = $VMName
        RetryIntervalSec = $RetryIntervalSec
        RetryCount = $RetryCount
    }
    $returnValue
}

function Set-TargetResource
{
    param
    (
        [Parameter(Mandatory)]
        [String]$VMName,
        [UInt64]$RetryIntervalSec = 10,
        [UInt32]$RetryCount = 5
    )

    # Check if Hyper-V module is present for Hyper-V cmdlets
    if(!(Get-Module -ListAvailable -Name Hyper-V))
    {
        Throw $localizedData.NoHyperVModule
    }

    $vmIntegrationServicesRunning = $false
    Write-Verbose -Message ($localizedData.CheckGIS -f $VMName)

    for ($count = 0; $count -lt $RetryCount; $count++)
    {
        $gis = Get-VMIntegrationService -VMName $VMName -Name 'Guest Service Interface'
        if ($gis.PrimaryStatusDescription -eq 'OK') {
            Write-Verbose -Message ($localizedData.GISRunning -f $VMName)
            $vmIntegrationServicesRunning = $true
            break
        }
        else
        {
            Write-Verbose -Message ($localizedData.GISNotRunning -f $VMName)
            Write-Verbose -Message ($localizedData.Retry -f $RetryIntervalSec)
            Start-Sleep -Seconds $RetryIntervalSec
        }
    }

    if (!$vmIntegrationServicesRunning)
    {
        throw ($localizedData.CheckError -f $VMName, $RetryIntervalSec)
    }
}

function Test-TargetResource
{
    [OutputType([System.Boolean])]
    param
    (
        [Parameter(Mandatory)]
        [String]$VMName,
        [UInt64]$RetryIntervalSec = 10,
        [UInt32]$RetryCount = 5
    )

    # Check if Hyper-V module is present for Hyper-V cmdlets
    if(!(Get-Module -ListAvailable -Name Hyper-V))
    {
        Throw $localizedData.NoHyperVModule
    }
    
    Write-Verbose -Message ($localizedData.CheckGIS -f $VMName)
    $gis = Get-VMIntegrationService -VMName $VMName -Name 'Guest Service Interface'
    if ($gis.PrimaryStatusDescription -eq 'OK') {
        Write-Verbose -Message ($localizedData.GISRunning -f $VMName)
        return $true
    }
    else
    {
        Write-Verbose -Message ($localizedData.GISNotRunning -f $VMName)
        return $false
    }
}

Export-ModuleMember -Function *-TargetResource