Public/Start-AGMLibPolicy.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 Start-AGMLibPolicy ([string]$policyid,[string]$logicalgroupid,[string]$label,[string]$backuptype)
{
    <#
    .SYNOPSIS
    Runs on-demand jobs for one policy
 
    .EXAMPLE
    Start-AGMLibPolicy
    Runs a guided menu to let you start a policy or policies in an SLT
 
    .EXAMPLE
    Start-AGMLibPolicy -policyid 1234
    Runs on-demand jobs for all apps using policy ID 1234
 
    .EXAMPLE
    Start-AGMLibPolicy -policyid 1234 -backuptype db
    Runs on-demand jobs for all apps using policy ID 1234 with a backup type of DB
    If the application if not a database type, in that the appclass field for that application is blank, then the backuptype will be ignored.
 
    .EXAMPLE
    Start-AGMLibPolicy -policyid 1234 -label "testrun"
    Runs on-demand jobs for all apps using policy ID 1234 where each image gets a label of "testrun"
 
    .DESCRIPTION
    A function to start large numbers of on-demand jobs
 
    -policyid Will start an on-demand job for all apps using this policy ID
    -backuptype <type> Where type needs to be db, dblog or log
    -logicalgroupid WIll start on-demand job for all members of the logical group
 
    #>


   # its pointless procededing without a connection.
   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)
   {
       Get-AGMErrorMessage -messagetoprint "AGM session has expired. Please login again using Connect-AGM"
       return
   }
   # will need this later to handle DBs.
   if ($capturetype)
   {
       $backuptype = $capturetype
   }
   if ($backuptype)
   {
       if (( $backuptype -ne "db") -and ( $backuptype -ne "log") -and ( $backuptype -ne "dblog"))
       {
           Get-AGMErrorMessage -messagetoprint "Requested backuptype $backuptype is invalid, use either `'-backuptype db`' or `'-backuptype log`' or `'-backuptype dblog`'"
           return
       }
   }
   if (!($backuptype))
   {
       $backuptype = ""
   }

   # if asked for logicalgroupid
   if ($logicalgroupid)
   {
       $groupgrab = Get-AGMLogicalGroup -id $logicalgroupid
       if ($groupgrab.err_code)
       {
        $groupgrab
        return
       }
   }


   # we could let user fail, but this is a composite function, so lets be polite.
   if ($policyid)
   {
       $policygrab = Get-AGMLibPolicies  | where-object { $_.policyid -eq $policyid }
       if ($policygrab.operation.count -ne 1)
       {
           Get-AGMErrorMessage -messagetoprint "Failed to find policy ID $policyid Please check the Policy ID with Get-AGMLibPolicies"
           return
       }
       $sltname = $policygrab.sltname
       $optype = $policygrab.operation
   }

   # if we have got to here and have no policy ID, we go to guided mode
   if (!($policyid))
   {     
        $policygrab = Get-AGMLibPolicies 
        $printarray = @()
        $i = 1
            foreach ($policy in $policygrab)
            {
                $printarray += [pscustomobject]@{
                    id = $i
                    sltname = $policy.sltname
                    policyname = $policy.name
                    policyid = $policy.policyid
                    operation = $policy.operation
                    retention = $policy.retention
                }
                $i += 1
            }


        Clear-Host
        Write-host "This function is used to start large numbers of on-demand jobs. This is done by choosing:"
        Write-host "-- The Policy ID to run"
        Write-Host "-- The backup type for any database apps (this is optional)" 
        Write-host "-- A Logical Group (this is optional)"
        Write-host ""
        write-host "Policy ID selection menu. Please select which Policy ID will be run"
        Write-host ""
        $printarray | Format-Table
        While ($true) 
        {
            Write-host ""
            $listmax = $policygrab.sltid.count
            [int]$userselection = Read-Host "Please select a ID to run (1-$listmax)"
            if ($userselection -lt 1 -or $userselection -gt $listmax)
            {
                Write-Host -Object "Invalid selection. Please enter a number in range [1-$($listmax)]"
            } 
            else
            {
                break
            }
        }
        $policyid = $printarray.policyid[($userselection - 1)]
        $sltname = $printarray.sltname[($userselection - 1)]
        $optype = $printarray.operation[($userselection - 1)]
       
        #
        if (!($backuptype))
        {
            Write-Host ""
            Write-Host "Backup Type (this is only applied to database applications with a defined appclass"
            Write-Host "1`: Non-Database(default)"
            Write-Host "2`: DB"
            Write-Host "3`: DB+Log"
            Write-Host "4`: Log"
            Write-Host ""
            [int]$userselection = Read-Host "Please select from this list (1-4)"
            if ($userselection -eq 2) {  $backuptype = "db"  }
            if ($userselection -eq 3) {  $backuptype = "dblog"  }
            if ($userselection -eq 4) {  $backuptype = "log"  }
        } 

        # offer group support
        Write-Host ""
        Write-Host "Do you want to run this policy for a specific group"
        Write-Host "1`: No(default)"
        Write-Host "2`: Yes"
        Write-Host ""
        [int]$userselection = Read-Host "Please select from this list (1-2)"
        if ($userselection -eq 2) 
        {  
            $groupgrab = Get-AGMLogicalGroup | where-object { $_.membercount -gt 0 } | where-object { $_.managed -eq "True" } 
            if ($groupgrab.count -eq 0)
            {
                Get-AGMErrorMessage -messagetoprint "Failed to find any managed and used Logical groups with Get-AGMLogicalGroup"
                return
            }

            $printarray = @()
            $i = 1
            foreach ($group in $groupgrab)
            {
                $printarray += [pscustomobject]@{
                    id = $i
                    name = $group.name
                    logicalgroupid = $group.id
                    membercount = $group.membercount
                }
                $i += 1
            }


            Clear-Host
            write-host "Logical Group selection menu. Please select which Logical Group will be run"
            Write-host ""
            $printarray | Format-Table
            While ($true) 
            {
                Write-host ""
                $listmax = $printarray.count
                [int]$userselection = Read-Host "Please select a Logical Group to run (1-$listmax)"
                if ($userselection -lt 1 -or $userselection -gt $listmax)
                {
                    Write-Host -Object "Invalid selection. Please enter a number in range [1-$($listmax)]"
                } 
                else
                {
                    break
                }
            }
            $logicalgroupid = $printarray.logicalgroupid[($userselection - 1)]
        }
        # help the user
       Write-Host ""
       Write-Host "Guided selection is complete. The values entered resulted in the following command:"
       Write-Host ""
       Write-Host ""
       Write-host -nonewline "Start-AGMLibPolicy -policyid $policyid"
       if ($backuptype) { Write-Host -nonewline " -backuptype $backuptype" }
       if ($logicalgroupid) { Write-Host -nonewline " -logicalgroupid $logicalgroupid" }
       Write-Host ""
       Write-Host ""
       Write-Host "1`: Run the command now (default)"
       Write-Host "2`: Exit without running the command"
       $userchoice = Read-Host "Please select from this list (1-2)"
       if ($userchoice -eq "") { $userchoice = 1 }
       if ($userchoice -eq 2)
       {
           return
       }
   }

   # we now have to find all apps using this policy and run a backup for each one.
   
   if ($logicalgroupid)
   {    
        $applist = (Get-AGMLogicalGroupMember -id $logicalgroupid).sources
   } else {
        $applist = Get-AGMApplication -filtervalue sltname=$sltname
   }
   
   if ($applist.count -eq 0)
   {
       Get-AGMErrorMessage -messagetoprint "Failed to find any applications using policy ID $policyid and SLT Name $sltname."
       return
   }


   # now create JSON
   $policy = @{id=$policyid}
   $body = [ordered]@{}
   if ($label)
   {
       $body += @{label=$label}
   }
   $body += @{policy=$policy}
   if ($backuptype)
   {
       $body += @{backuptype=$backuptype}
   }
   $json = $body | ConvertTo-Json

   foreach ($app in $applist)
   {
        $appname = $app.appname
        $appid = $app.id
        if (($app).host)
        { $hostname = (($app).host).hostname }
        else {
            $hostname = $appname
        }
        # if there is no appclass, lets assume it is not a database and not cause confused errors.
        if (($backuptype) -and ($app.appclass))
        {
            write-host "Starting job for hostname: $hostname appname: $appname appid: $appid using: $optype policyID: $policyid from SLTName: $sltname with backuptype: $backuptype"
        }
        else {
            write-host "Starting job for hostname: $hostname appname: $appname appid: $appid using: $optype policyID: $policyid from SLTName: $sltname"
        }
        Post-AGMAPIData  -endpoint /application/$appid/backup -body $json
   }
}