public/library/Add-PSTSVariableGroup.ps1

function Add-PSTSVariableGroup
{
    [CmdletBinding(DefaultParameterSetName="set1")]
    param(

        [Parameter(Mandatory=$true)][string] $project,
        [Parameter(Mandatory=$true)][string] $name,
        [parameter(ParameterSetName="set1")] [HashTable] $variables,
        [parameter(ParameterSetName="set2", Mandatory=$true)] [string] $vault,
        [parameter(ParameterSetName="set2", Mandatory=$true)] [string] $serviceEndpoint,
        [parameter(ParameterSetName="set2")] [string[]] $vaultKeys

    )


    process {

        $null = @(

            $resp = Get-PSTSServiceEndpoint -project $project | Where-Object {$_.name -eq $serviceEndpoint }

            [VariableGroup] $variableGroup = [VariableGroup]::new()
            $variableGroup.name = $name

            if ($PSCmdlet.ParameterSetName -eq "set2" ) {

                $variableGroup.providerData = [ProviderData]::new($resp.id, $vault)
            }

           # [ProjectReference] = [ProjectReference]
            $variableGroup.variables = @{}

            if ($PSCmdlet.ParameterSetName -eq "set2" ) {

                $variableGroup.type ="AzureKeyVault"
                $vaultKeys |  `
                Foreach-Object {
                    $_, $variableGroup.variables.Add( `
                        $_ , `
                        $(_getJSONVariable `
                        -isSecret $true `
                        ) `
                    )
                }
            }
            else
            {

                $variables.GetEnumerator() | `
                Foreach-Object {
                    $_, $variableGroup.variables.Add( `
                        $_.Key , `
                        $(_getJSONVariable `
                        -isSecret $false `
                        -value $_.Value
                        ) `
                    )
                }
            }

            $content = `
            _PSTSAPI `
                -project $project `
                -resource "distributedtask/VariableGroups" `
                -method "POST" `
                -body $($variableGroup | ConvertTo-Json -Depth 100) `
                -contentType "application/json" `
                -apiVersion "api-version=5.1-preview.1"

        )
        return [VariableGroup]$content
    }
}

function _getJSONVariable
{

    param(
        [Parameter()] [string] $value = $([string]::Empty),
        [Parameter(Mandatory=$true)] [string] $isSecret
    )

        $ret = new-Object -TypeName "PSObject"

        $ret | Add-Member -MemberType NoteProperty "isSecret" -Value $isSecret
        $ret | Add-Member -MemberType NoteProperty "value" -Value $value
        $ret | Add-Member -MemberType NoteProperty "enabled" -Value $true
        $ret | Add-Member -MemberType NoteProperty "contentType" -Value ""
        $ret | Add-Member -MemberType NoteProperty "expires" -Value $null

        return $ret
}