Public/Set-AGMLibSLA.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 Set-AGMLibSLA ([string]$appid,[string]$slaid,[string]$logicalgroupid,[string]$expiration,[string]$scheduler,[switch][alias("e")]$everysla,[switch][alias("s")]$showsla) 
{
    <#
    .SYNOPSIS
    Enables or disables an SLA
    Note that if both an SLA ID and an App ID are supplied, the App ID will be ignored.
 
    .EXAMPLE
    Set-AGMLibSLA
    Run a guided wizard
 
    .EXAMPLE
    Set-AGMLibSLA -logicalgroupid 99214 -scheduler enable -expiration enable
    Enabled the scheduler and expiration for all apps in one logical group
 
    .EXAMPLE
    Set-AGMLibSLA -everysla -scheduler disable -expiration disable
    Disable every SLA for both scheduler and expiration. Use with caution!
 
    .DESCRIPTION
    A function to enable or disable the scheduler or expiration
 
    #>



    # 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
    }

    if ($id)
    {
        $slaid = $id
    }

    if (($appid) -and (!($slaid)))
    {
        $slaid = (Get-AGMSLA -filtervalue appid=$appid).id
        if (!($slaid))
        {
            Get-AGMErrorMessage -messagetoprint "Could not find an SLA ID for App ID $appid Please use Get-AGMSLA to find the correct SLA ID or Get-AGMApplication to find the correct App ID"
            return
        }
    }

    if ($logicalgroupid)
    {
        $logicalgroupgrab = (Get-AGMLogicalGroup $logicalgroupid).sla
        if (!($logicalgroupgrab))
        {
            Get-AGMErrorMessage -messagetoprint "Could not find any SLA ID for Logical Group ID $logicalgroupid Please use Get-AGMLogicalGroup to find the correct managed Group ID"
            return
        }
    }

    if ( (!($slaid)) -and (!($logicalgroupid)) -and (!($everysla)))
    {
        #guided mode
        write-host ""
        Write-Host "This command is used to enable or disable the scheduler and/or expiration."
        Write-Host "This is either for a specific application, a specific logical group or every application"
        write-host ""
        Write-Host "1`: Lets get started (default)"
        Write-Host "2`: I need to know the current state - please run Get-AGMLibSLA"
        $userchoice = Read-Host "Please select from this list (1-2)"
        if ($userchoice -eq 2)
        {
            $slagrab = Get-AGMLibSLA
            $slagrab
            Read-Host -Prompt "Press enter to continue"
        }
        write-host ""
        Write-Host "Step one: What change do you want to make to the scheduler state (we will determine which apps are affected by this in step 3)"
        Write-Host "1`: I don't want to change the scheduler (default)"
        Write-Host "2`: I want to enable the scheduler"
        Write-Host "3`: I want to disable the scheduler"
        $userchoice = Read-Host "Please select from this list (1-3)"
        if ($userchoice -eq 3)
        {
            $scheduler = "disable"
        }
        if ($userchoice -eq 2)
        {
            $scheduler = "enable"
        }
        write-host ""
        Write-Host "Step two: What change do you want to make to the Expiration state"
        Write-Host "1`: I don't want to change expiration (default)"
        Write-Host "2`: I want to enable expiration"
        Write-Host "3`: I want to disable expiration"
        $userchoice = Read-Host "Please select from this list (1-3)"
        if ($userchoice -eq 3)
        {
            $expiration = "disable"
        }
        if ($userchoice -eq 2)
        {
            $expiration = "enable"
        }
        $command = ""; if ($scheduler) { $command += " -scheduler $scheduler" }; if ($expiration) { $command += " -expiration $expiration" }
        Write-Host ""
        Write-Host "Step 3: What do you want to work with?"
        Write-Host "1`: I want to work with one application (default)"
        Write-Host "2`: I want to work with one logical group"
        Write-Host "3`: I want to work with every application known to AGM"
        $userchoice = Read-Host "Please select from this list (1-3)"
        if ($userchoice -eq "") { $userchoice = 1 }
        if ($userchoice -eq 1)
        {
            $appgrab = Get-AGMApplication -sort "hostname:asc,appname:asc" | where-object {$_.sla.length -gt 0} 

            $printarray = @()
            $i = 1
            foreach ($app in $appgrab)
            {
                $printarray += [pscustomobject]@{
                    id = $i
                    apptype = $app.apptype
                    hostname = $app.host.hostname
                    appname = $app.appname
                    appid = $app.id
                    slaid = $app.sla.id
                }
                $i += 1
            }

            $printarray | Format-Table

            While ($true) 
            {
                Write-host ""
                $listmax = $printarray.appid.count
                [int]$userselection = Read-Host "Please select an 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
                }
            }
            $slaid = $printarray.slaid[($userselection - 1)]
            
            Write-Host "Guided selection is complete. The values entered resulted in the following command:"
            Write-Host ""
            Write-Host "Set-AGMLibSLA -slaid $slaid $command"
            Write-Host ""
            Write-Host "1`: Run the command now (default)"
            Write-Host "2`: Run the command now and then show the new status"
            Write-Host "3`: Exit without running the command"
            $appuserchoice = Read-Host "Please select from this list (1-3)"
            if ($appuserchoice -eq "") { $appuserchoice = 1}
            if ($appuserchoice -eq 2) { $showsla = $true}
            if ($appuserchoice -eq 3)
            {
                return
            }
        }
        if ($userchoice -eq 2)
        {
            Write-Host ""
            $logicalgroupgrab = Get-AGMLogicalGroup -sort name:asc | where-object {$_.sla.length -gt 0} | Select-Object id,name

            $printarray = @()
            $i = 1
            foreach ($group in $logicalgroupgrab)
            {
                $printarray += [pscustomobject]@{
                    id = $i
                    groupname = $group.name
                    logicalgroupid = $group.id
                }
                $i += 1
            }
            $printarray | Format-Table

            While ($true) 
            {
                Write-host ""
                $listmax = $printarray.logicalgroupid.count
                [int]$userselection = Read-Host "Please select an 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
                }
            }
            $logicalgroupid = $printarray.logicalgroupid[($userselection - 1)]

            Write-Host "Guided selection is complete. The values entered resulted in the following command:"
            Write-Host ""
            Write-Host "Set-AGMLibSLA -logicalgroupid $logicalgroupid $command"
            Write-Host ""
            Write-Host "1`: Run the command now (default)"
            Write-Host "2`: Run the command now and then show the new status"
            Write-Host "3`: Exit without running the command"
            $groupuserchoice = Read-Host "Please select from this list (1-3)"
            if ($groupuserchoice -eq "") { $groupuserchoice = 1}
            if ($groupuserchoice -eq 2) { $showsla = $true}
            if ($groupuserchoice -eq 3)
            {
                return
            }
        }
        if ($userchoice -eq 3)
        {
            Write-Host ""
            Write-Host "Are you sure? This will affect every Application known to AGM."
            Write-Host "1`: Let me think about this (default)"
            Write-Host "2`: Yes I am sure, lets continue"
            $userchoice = Read-Host "Please select from this list (1-2)"
            if ($userchoice -ne 2)
            {
                return
            } else {
                $everysla = $true
            }
            Write-Host "Guided selection is complete. The values entered resulted in the following command:"
            Write-Host ""
            Write-Host "Set-AGMLibSLA -everysla$command"
            Write-Host ""
            Write-Host "1`: Run the command now and exit (default)"
            Write-Host "2`: Run the command now and then show the new settings"
            Write-Host "3`: Exit without running the command"
            $everyuserchoice = Read-Host "Please select from this list (1-3)"
            if ($everyuserchoice -eq "") { $everyuserchoice = 1}
            if ($everyuserchoice -eq 2) { $showsla = $true}
            if ($everyuserchoice -eq 3)
            {
                return
            }
        }
       
    }
    if ((!($scheduler)) -and (!($expiration)))
    {
        Get-AGMErrorMessage -messagetoprint "You need to specify -scheduler enable or -scheduler disable and/or -expiration enable or -expiration disable "
        return
    }

    if ($slaid) 
    {
        if ((!($scheduler)) -and ($expiration))
        {
            Set-AGMSLA -slaid $slaid -expiration $expiration
        }
        if (($scheduler) -and (!($expiration)))
        {
            Set-AGMSLA -slaid $slaid -scheduler $scheduler
        }
        if (($scheduler) -and ($expiration))
        {
            Set-AGMSLA -slaid $slaid -expiration $expiration -scheduler $scheduler
        }
    }
    if ($logicalgroupid) 
    {
        if ((!($scheduler)) -and ($expiration))
        {
            Set-AGMSLA -logicalgroupid $logicalgroupid -expiration $expiration
        }
        if (($scheduler) -and (!($expiration)))
        {
            Set-AGMSLA -logicalgroupid $logicalgroupid -scheduler $scheduler
        }
        if (($scheduler) -and ($expiration))
        {
            Set-AGMSLA -logicalgroupid $logicalgroupid -expiration $expiration -scheduler $scheduler
        }
    }
    if ($everysla)
    {
        $slagrab = Get-AGMSLA   
        foreach ($sla in $slagrab)
        {
            $target = $sla.id
            if ((!($scheduler)) -and ($expiration))
            {
                Set-AGMSLA -slaid $target -expiration $expiration
            }
            if (($scheduler) -and (!($expiration)))
            {
                Set-AGMSLA -slaid $target -scheduler $scheduler
            }
            if (($scheduler) -and ($expiration))
            {
                Set-AGMSLA -slaid $target -expiration $expiration -scheduler $scheduler
            }
        }
    }
    if ($showsla -eq $true)
    {
        if ($slaid) { Get-AGMLibSLA -slaid $slaid}
        if ($logicalgroupid) { Get-AGMLibSLA -logicalgroupid $logicalgroupid}
        if ($everysla) 
        { 
            Get-AGMLibSLA
            Read-Host -Prompt "Press enter to continue"
        }
    }
}