Invoke-Terra.ps1

#Set-StrictMode -Version Latest
#####################################################
# Invoke-Terra
#####################################################
<#PSScriptInfo
 
.VERSION 0.12
 
.GUID 4eb31ea2-dbfd-4d66-9f6d-1d16ce6187d0
 
.AUTHOR David Walker, Sitecore Dave, Radical Dave
 
.COMPANYNAME David Walker, Sitecore Dave, Radical Dave
 
.COPYRIGHT David Walker, Sitecore Dave, Radical Dave
 
.TAGS powershell sitecore package
 
.LICENSEURI https://github.com/SharedSitecore/Invoke-Terra/blob/main/LICENSE
 
.PROJECTURI https://github.com/SharedSitecore/Invoke-Terra
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
see README.md
#>


<#
 
.DESCRIPTION
 PowerShell Script to Invoke-Terra
 
.PARAMETER name
Path of package
 
#>
 
#####################################################
# Invoke-Terra
#####################################################
[CmdletBinding(SupportsShouldProcess)]
Param(
    [Parameter(Mandatory=$false)]
    [string] $path = '',
    [Parameter(Mandatory=$false)] #Default/Full,Clean,Init,Plan,Apply
    [string] $mode = 'full',
    [Parameter(Mandatory=$false)]
    [string] $name = 'main',
    [Parameter(Mandatory=$false)]
    [string] $output = '',
    [Parameter(Mandatory=$false)]
    [string] $backendconfig = '',
    [Parameter(Mandatory=$false)]
    [string] $varfile = '',
    [Parameter(Mandatory=$false)]
    [string] $options = '-compact-warnings'
)
begin {
    $ProgressPreference = "SilentlyContinue"        
    $ErrorActionPreference = 'Stop'
    $PSScriptName = ($MyInvocation.MyCommand.Name.Replace(".ps1",""))
    $PSCallingScript = if ($MyInvocation.PSCommandPath) { $MyInvocation.PSCommandPath | Split-Path -Parent } else { $null }
    Write-Verbose "$PSScriptRoot\$PSScriptName $path $mode $name $output $backendconfig $varfile $options called by:$PSCallingScript"
    Import-Script Get-ConfigFile -Force
}
process {
    if (!$output) { $output = $name }
    $origpath = $(Get-Location)
    if ($path) {
        Write-Verbose "Get-Location: $origpath"
        Write-Verbose "Set-Location: $path"
        Set-Location $path
    }
    Write-Verbose "mode: $mode"
    if ($mode -eq "clean") {
        Write-Verbose "cleaning"
        remove-item *.tfplan -ErrorAction "SilentlyContinue"
        remove-item terraform.tfstate -ErrorAction "SilentlyContinue"
        remove-item *.terraform* -Recurse -ErrorAction "SilentlyContinue"
    }
    $error.Clear()    
    if (@('clean','full','init') -contains $mode) {
        Write-Verbose "init"
        $backendconfig = Get-ConfigFile 'tfbackend'
        Write-Verbose "backendconfig:$backendconfig"
        if (!$backendconfig) {
            ./terraform.exe init
        } else {
            ./terraform.exe init -backend-config="$backendconfig"
        }
    }
    if ($error) {
        Write-Verbose "$PSScriptName ERROR: $error"
    } else {
        Write-Verbose "plan"
        if (@('clean','full','plan') -contains $mode) {
            $varfile = Get-ConfigFile 'tfvars'
            Write-Verbose "varfile:$varfile"
            if (!$varfile) {
                ./terraform.exe plan -out="$output.tfplan"
            } else {
                if (!$options) {
                    ./terraform.exe plan -var-file="$varfile" -out="$output.tfplan"                
                } else {
                    ./terraform.exe plan -var-file="$varfile" $options -out="$output.tfplan"
                }
                Write-Verbose "plan completed:$output.tfplan exists:${(Test-Path "$output.tfplan")}"
            }
        }
        if ($error) {

            #needs init error? then do init!

            Write-Verbose "$PSScriptName ERROR: $error"
        } else {
            if (@('clean','full','apply') -contains $mode)
            {
                if (Test-Path "$output.tfplan") {
                    Write-Verbose "apply"
                    if (!$varfile) {
                        ./terraform.exe apply "$output.tfplan"
                    } else {
                        if (!$options) {
                            ./terraform.exe apply "$output.tfplan"
                        } else {
                            ./terraform.exe apply $options "$output.tfplan" 
                        }
                    }
                } else {
                    Write-Verbose "ERROR - $output.tfplan not found!"
                    Write-Output "ERROR - $output.tfplan not found!"
                }
            }
            
            if ($error) {

                #if needs plan then do it!

                Write-Verbose "$PSScriptName ERROR: $error"
            }
        }
    }
}
end {
    Write-Verbose "$PSScriptName $path $mode $name $output $backendconfig $varfile $options end"
    if ($origpath -ne $path) { Set-Location $origpath }
}