BuildMasterAutomation/Functions/Get-BMPackage.ps1


function Get-BMPackage
{
    <#
    .SYNOPSIS
    Gets a package from BuildMaster.
 
    .DESCRIPTION
    The `Get-BMPackage` function gets a package from BuildMaster. With no parameters, it returns all packages. To get all the packages that are part of a release, pass a release object or ID to the `Release` property (a release object must have an `id` or `Release_Id` property). To get a specific package, pass a package object or ID to the `Package` property (a package object must have an `id` or `Package_Id` property).
 
    This function uses BuildMaster's "Release & Package Deployment" API. When creating a BuildMaster session (using the `New-BMSession` function), the API key you use must have access to that API.
 
    .EXAMPLE
    Get-BMPackage -Session $session
 
    Demonstrates how to get all packages.
 
    .EXAMPLE
    Get-BMPackage -Session $session -Package $package
 
    Demonstrates how to get a specific package using a package object. The package object must have an `id` or `Package_Id` property.
 
    .EXAMPLE
    Get-BMPackage -Session $session -Package 500
 
    Demonstrates how to get a specific package using its ID.
 
    .EXAMPLE
    Get-BMPackage -Session $session -Release $release
 
    Demonstrates how to get all the packages that are part of a release using a release object. The release object must have an `id` or `Release_Id` property.
 
    .EXAMPLE
    Get-BMPackage -Session $session -Release 438
 
    Demonstrates how to get all the packages that are part of a release using the release's ID.
    #>

    [CmdletBinding(DefaultParameterSetName='AllPackages')]
    param(
        [Parameter(Mandatory=$true)]
        [object]
        # A object that represents what instance of BuildMaster to connect to. Use the `New-BMSession` function to create session objects.
        $Session,

        [Parameter(Mandatory=$true,ParameterSetName='SpecificPackage')]
        [object]
        # The package to get. Can be:
        #
        # * A package object with a `Package_Id` or `id` property.
        # * A package ID (as an integer)
        $Package,

        [Parameter(Mandatory=$true,ParameterSetName='ReleasePackages')]
        [object]
        # The release whose packages to get. Gets all the packages that are part of this release.
        #
        # * A release object with a `Release_Id` or `id` property.
        # * A release ID (as an integer)
        $Release
    )

    Set-StrictMode -Version 'Latest'

    $parameter = $null
    if( $PSCmdlet.ParameterSetName -eq 'SpecificPackage' )
    {
        $parameter = @{ } | Add-BMObjectParameter -Name 'package' -Value $Package -PassThru
    }
    elseif( $PSCmdlet.ParameterSetName -eq 'ReleasePackages' )
    {
        $parameter = @{ } | Add-BMObjectParameter -Name 'release' -Value $Release -PassThru
    }

    $parameterParam = @{ }
    if( $parameter )
    {
        $parameterParam['Parameter'] = $parameter
    }

    Invoke-BMRestMethod -Session $Session -Name 'releases/packages' @parameterParam |
        Where-Object {
            # There's a bug in BuildMaster's API that returns packages for multiple releases. We don't want this.
            if( $PSCmdlet.ParameterSetName -eq 'ReleasePackages' )
            {
                return $_.releaseId -eq $parameter.releaseId
            }
            return $true
        }
}