Source/Private/Export_Rest.ps1


Set-StrictMode -Version Latest

#region Function: Invoke-ODURestMethod

<#
.SYNOPSIS
Calls url with API key in header and returns results
.DESCRIPTION
Calls url with API key in header and returns results
.PARAMETER Url
Full url of REST API to call
.PARAMETER ApiKey
Unencrypted ApiKey to pass in REST API call headers
.EXAMPLE
Invoke-ODURestMethod -Url https://MyOctoServer.octopus.app -ApiKey 'API-ABCDEFGH01234567890ABCDEFGH'
<calls Url passing in ApiKey and returns results>
#>

function Invoke-ODURestMethod {
  #region Function parameters
  [CmdletBinding()]
  [OutputType([string])]
  param(
    [ValidateNotNullOrEmpty()]
    [string]$Url = $(throw "$($MyInvocation.MyCommand) : missing parameter RestName"),
    [ValidateNotNullOrEmpty()]
    [string]$ApiKey = $(throw "$($MyInvocation.MyCommand) : missing parameter RestName")
  )
  #endregion
  process {
    Write-Verbose "$($MyInvocation.MyCommand) :: Calling Url $Url with API Key (first 7 characters) $($ApiKey.Substring(0,8))..."
    try {
      Invoke-RestMethod -Method Get -Uri $Url -Headers @{ 'X-Octopus-ApiKey' = $ApiKey }
    } catch {
      $Err = $_
      # a user may not have access to a particular api which is not the end of the world - it's
      # not worth throwing a terminating exception so just write error so user can see
      if (($Err.ToString()) -match "You do not have permission to perform this action. Please contact your Octopus administrator") {
        Write-Verbose "$($MyInvocation.MyCommand) :: Error calling $Url"
        Write-Verbose "$($MyInvocation.MyCommand) :: Error was $Err"
        throw "Error occurred calling: $Url You may not have permission to access this API; you should exclude this type from exports by adding it to the type blacklist. See the docs. Error was: $Err"
      } else {
        throw $Err
      }
    }
  }
}
#endregion


#region Function: Test-ODUOctopusServerCredential

<#
.SYNOPSIS
Calls simple, safe test url and discards results, if url or ApiKey is incorrect, throws error
.DESCRIPTION
Calls simple, safe test url and discards results, if url or ApiKey is incorrect, throws error
.PARAMETER ServerDomainName
Protocol and domain name
.PARAMETER ApiKey
Unencrypted ApiKey to pass with REST API call
.EXAMPLE
Test-ODUOctopusServerCredential -Url https://MyOctoServer.octopus.app -ApiKey 'API-ABCDEFGH01234567890ABCDEFGH'
<no results, those values are valid>
#>

function Test-ODUOctopusServerCredential {
  #region Function parameters
  [CmdletBinding()]
  [OutputType([string])]
  param(
    [ValidateNotNullOrEmpty()]
    [string]$ServerDomainName = $(throw "$($MyInvocation.MyCommand) : missing parameter RestName"),
    [ValidateNotNullOrEmpty()]
    [string]$ApiKey = $(throw "$($MyInvocation.MyCommand) : missing parameter RestName")
  )
  #endregion
  process {
    # use machines roles api to test (simple and fast)
    $null = Invoke-RestMethod -Method Get -Uri ($ServerDomainName + "/api/machineroles/all") -Headers @{ 'X-Octopus-ApiKey' = $ApiKey }
  }
}
#endregion