DSCResources/cWaitForVMGuestIntegration/cWaitForVMGuestIntegration.psm1

#region localizeddata
if (Test-Path "${PSScriptRoot}\${PSUICulture}")
{
    Import-LocalizedData -BindingVariable LocalizedData -filename cWaitForVMGuestIntegration.psd1 `
                         -BaseDirectory "${PSScriptRoot}\${PSUICulture}"
} 
else
{
    #fallback to en-US
    Import-LocalizedData -BindingVariable LocalizedData -filename cWaitForVMGuestIntegration.psd1 `
                         -BaseDirectory "${PSScriptRoot}\en-US"
}
#endregion

function Get-TargetResource
{
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [Parameter(Mandatory)]
        [String] $Id,

        [Parameter(Mandatory)]
        [String] $VMName,
        
        [Parameter()]
        [UInt64] $RetryIntervalSec = 10,
        
        [Parameter()]
        [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)
    $returnValue = @{
        Id = $Id
        VMName = $VMName
        RetryIntervalSec = $RetryIntervalSec
        RetryCount = $RetryCount
    }
    $returnValue
}

function Set-TargetResource
{
    param
    (
        [Parameter(Mandatory)]
        [String] $Id,
        
        [Parameter(Mandatory)]
        [String]$VMName,

        [Parameter()]
        [UInt64]$RetryIntervalSec = 10,

        [Parameter()]
        [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]$Id,

        [Parameter(Mandatory)]
        [String]$VMName,

        [Parameter()]        
        [UInt64]$RetryIntervalSec = 10,
        
        [Parameter()]        
        [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