Public/Confirm-AGMLibComputeEngineSnapshot.ps1

# Copyright 2022 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


Function Confirm-AGMLibComputeEngineImage([string]$id,[switch]$every,[string]$appid) 
{
    <#
    .SYNOPSIS
    Confirms that the Compute Engine Snapshot created by a backup image still exists using the GoogleCloud PowerShell module

    .EXAMPLE
    Confirm-AGMLibComputeEngineImage -id 1234
    Validates backup image ID 1234. The status field is reported by Compute Engine If the status does not show as READY you will need to investigate

    .DESCRIPTION
    A function to validate images. Use this to confirm that an image shown in Backup and DR has all the relevant backing Compute Engine snapshots.
    To find eligible images use filters like: Get-AGMImage -filtervalue apptype=GCPInstance

    Note that if the GoogleCloud PowerShell module is not installed this function cannot run.

    #>


    if ( (!($AGMSESSIONID)) -or (!($AGMIP)) )
    {
        Get-AGMErrorMessage -messagetoprint "Not logged in or session expired. Please login using Connect-AGM"
        return
    }
    $sessiontest = Get-AGMVersion
    if ($sessiontest.errormessage)
    {
        $sessiontest
        return
    }
    
    # we depend on Google Cloud module being present
    try
    {
        Import-Module GoogleCloud -ErrorAction SilentlyContinue
    }

    catch
    {
        $retVal = $false
    }
    $moduletest = get-module -name GoogleCloud 
    if (!($moduletest.Version))
    {
        Get-AGMErrorMessage -messagetoprint "GoogleCloud module was not found using Get-Module command"
        return
    }
    if ((!($id)) -and (!($every)) -and (!($appid)))
    {
        $id = Read-Host "Backup Image ID"
    }
    if ($id) { $imagelist = Get-AGMImage $id }
    if ($every) { $imagelist = Get-AGMImage -filtervalue apptype=GCPInstance}
    if ($appid) { $imagelist = Get-AGMImage -filtervalue appid=$appid }
    if (!($imagelist.id))
    {
        if ($every) { Get-AGMErrorMessage -messagetoprint "Failed to find any images using: Get-AGMImage -filtervalue apptype=GCPInstance" }
        if ($id) { Get-AGMErrorMessage -messagetoprint "Failed to find any images using: Get-AGMImage $id" }
        if ($appid) { Get-AGMErrorMessage -messagetoprint "Failed to find any images using: Get-AGMImage -filtervalue appid=$appid" }
        return
    }
    foreach ($image in $imagelist)
    {
        $imagegrab = Get-AGMImage $image.id
        $apptype = $imagegrab.apptype
        if ($apptype -ne "GCPInstance")
        {
            Get-AGMErrorMessage -messagetoprint "Apptype $apptype is not the correct apptype. Expecting Compute Engine Instance apptype: GCPInstance"
            return
        }
        $snapshotlist = $imagegrab.restorableobjects.volumeinfo

        if (!($snapshotlist.target))
        {
            Get-AGMErrorMessage -messagetoprint "Image does not contain volumeinfo that can be used to find Compute Engine Snapshot"
            return
        }
        $projectgrab = $imagegrab.application.host.friendlypath
        if ($projectgrab)
        {
            $projectid = $projectgrab.split(":")[3]
        }

        $AGMArray = @()
        Foreach ($snap in $snapshotlist.target)
        {
            $snapshotname = $snap.split(":")[1]
            Try
            {
                $snapgrab = Get-GceSnapshot -Project $projectid -Name $snapshotname
            }
            Catch
            {
                $RestError = $_
            }
            if ($RestError)
            {
                $cleaned = Test-AGMJSON $RestError
                if ($cleaned.errormessage)
                {
                    #Get-AGMErrorMessage -messagetoprint $cleaned.errormessage
                    $AGMArray += [pscustomobject]@{
                        id = $imagegrab.id
                        project = $projectid
                        appliance = $imagegrab.clusterid
                        imagename = $imagegrab.backupname
                        snapshotname = $snapshotname
                        status = $cleaned.errormessage
                    }
                }
                else
                {
                    Get-AGMErrorMessage -messagetoprint $cleaned
                    return
                }
            }
            else 
            {
                #$snapgrab
                $AGMArray += [pscustomobject]@{
                    id = $imagegrab.id
                    project = $projectid
                    appliance = $imagegrab.clusterid
                    imagename = $imagegrab.backupname
                    snapshotname = $snapshotname
                    status = $snapgrab.Status
                }
            }
        }
        $AGMArray
    }
}