Public/Set-CommonTenantVariable.ps1

function Set-CommonTenantVariable {
    <#
    .SYNOPSIS
        Set a common tenant variable
    .DESCRIPTION
        A longer description of the function, its purpose, common use cases, etc.
    .NOTES
        Information or caveats about the function e.g. 'This function is not supported in Linux'
    .LINK
        Specify a URI to a help page, this will show when Get-Help -Online is used.
    .EXAMPLE
        Set-CommonTenantVariable -Tenant Tenant -VariableSet 'Customer Variables' -Name 'Password' -Value '123'
        Sets the variable to 123
    .EXAMPLE
        Set-CommonTenantVariable -Tenant Tenant -VariableSet 'Customer Variables' -Name 'Password' -Value ''
        Resets the variable back to default
    .EXAMPLE
        Set-CommonTenantVariable -Tenant Tenant -VariableSet 'Customer Variables' -VariableHash @{Port = "1111"; IP = "1.2.3.4"}
        Sets multiple variables by passing a hashtable
    #>

    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true,
            ParameterSetName = 'Hash')]
        [parameter(Mandatory = $true,
            ParameterSetName = 'Value')]
        [TenantSingleTransformation()]
        [Octopus.Client.Model.TenantResource]$Tenant,

        [parameter(Mandatory = $true,
            ParameterSetName = 'Hash')]
        [parameter(Mandatory = $true,
            ParameterSetName = 'Value')]
        [LibraryVariableSetSingleTransformation()]
        [Octopus.Client.Model.LibraryVariableSetResource]$VariableSet,

        [parameter(Mandatory = $true,
            ParameterSetName = 'Value')]
        [String]$Name,

        [parameter(Mandatory = $true,
            ParameterSetName = 'Value')]
        [AllowEmptyString()]
        [String]$Value,

        [parameter(Mandatory = $true,
            ParameterSetName = 'Hash')]
        [hashtable]$VariableHash


    )
    begin {
        # testing connection to octopus
        Test-OctopusConnection | Out-Null
    }
    process {
        # variables types [System.Enum]::GetNames([Octopus.Client.Model.VariableSetContentType])
        if ($PSCmdlet.ParameterSetName -eq "value") {
            $VariableHash = @{}
            $VariableHash[$Name] = $Value
        }
        $TenantEditor = $repo._repository.Tenants.CreateOrModify($Tenant.Name)

        # get the library variable we want to modify
        $libVars = $TenantEditor.Variables.Instance.LibraryVariables."$($VariableSet.Id)"

        # Check that all the variable are defined in template
        foreach ($h in $VariableHash.GetEnumerator()) {
            if ($libVars.Templates.name -notcontains $h.Name) {
                $message = "Couldn't find {0} in variable set {1}" -f $h.Name, $VariableSet.Name
                Throw $message
            } else {
                $message = "Found variable {0} in variable set {1}" -f $h.Name, $VariableSet.Name
                Write-Verbose $message
            }
        }

        # update each variable
        foreach ($h in $VariableHash.GetEnumerator()) {

            # get the template object. Id is needed to identiy and set variable
            $varTemplate = $libVars.Templates | Where-Object Name -EQ $h.name

            # set value
            $newValue = [Octopus.Client.Model.PropertyValueResource]::new($h.Value, $varTemplate.DefaultValue.IsSensitive)

            # Check if variable key exists an delete if there
            if ($libVars.Variables.ContainsKey($vartemplate.id)) {
                $message = "Removing old value {0} for {1}" -f $libVars.Variables."$($vartemplate.id)".value, $varTemplate.name
                Write-Verbose $message
                $libVars.Variables.Remove($vartemplate.id) | Out-Null
            }

            if ([string]::IsNullOrEmpty($h.Value)) {
                $message = "Resetting {0} to default value" -f $varTemplate.name
                Write-Verbose $message
            } else {

                # update variable
                $libVars.Variables.add($vartemplate.id, $newValue) | Out-Null
            }
        }

        try {
            #save modified tenant object
            $TenantEditor.Save() | Out-Null
            Write-Verbose "Saved changes to $($Tenant.Name)"
        } catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }
    end {}

}