Public/Models.ps1
using namespace System.Collections.Generic # https://github.com/dotnet/platform-compat/blob/master/docs/DE0006.md function Get-TMModel { <# .SYNOPSIS Gets a Model from TransitionManager .DESCRIPTION This function will retrieve a Model from TransitionManager by name or Id .PARAMETER TMSession The name of the TM Session to use when retrieving a Model .PARAMETER Server The URI of the TransitionManager instance .PARAMETER ResetIDs Switch indicating that the Model(s) should be returned without Id's .PARAMETER Page Used internally when more than 1000 Models exist in the TransitionManager instance .PARAMETER Name The name of the Model to be retrieved .PARAMETER Id The Id of the Model to be retrieved .EXAMPLE Get-TMModel -TMSession 'TMDDEV' -Name 'PowerEdge R410' .OUTPUTS PSCustomObject representing the Model in TransitionManager #> [CmdletBinding(DefaultParameterSetName = 'ByName')] [OutputType([PSCustomObject])] param ( [Parameter(Mandatory = $false)] [PSObject]$TMSession = 'Default', [Parameter(Mandatory = $false)] [Switch]$ResetIDs, [Parameter(Mandatory = $false)] [Int]$Page = 1, [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ParameterSetName = 'ByName')] [String]$Name, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ById')] [Int]$Id, [Parameter()] [Int16] $Rows = 1000 ) begin { $TMSession = Get-TMSession $TMSession # Prepare the REST request $RestParameters = @( "project=$($TMSession.UserContext.Project.Id)", "rows=$Rows", "page=$Page" ) if ($Name) { $RestParameters += 'modelName={0}' -f [System.Web.HttpUtility]::UrlEncode($Name) } $api = $Id ? "model/$Id" : 'model' $apiParams = "?rows=$Rows&page=$Page" if ( $PSBoundParameters.ContainsKey('Name') ) { $apiParams = [string]::Concat($apiParams, "&modelName=$Name") } $Result = Invoke-TMRestMethod -Api $api -ApiParams $apiParams -Method Get $ResultRows = $Result.rows if ( $PSBoundParameters.ContainsKey('Name') -and $Result.Count ) { $ResultRows = $ResultRows | Where-Object modelName -eq $Name } $Models = [List[pscustomobject]]::new($Result.records ?? 1) if ($Id) { # We will get a single record, not a collection of 1 $Models.Add($Result) } else { $ResultRows.ForEach( { $Models.Add($_) } ) # The 'total' property in $Result means the total number of pages if ($Page -eq 1 -and $Result.total -gt 1) { # Continue to make calls until all pages have been recorded for ($i = 2; $i -le $Result.total; $i++) { $SubResult = Get-TMModel -TMSession $TMSession -Page $i -Rows $Rows $SubResult.foreach( { $Models.Add($_) } ) } } } } process { if ($ResetIDs) { foreach ($Model in $Models) { $Model.id = $null } } $Models } } function New-TMModel { <# .SYNOPSIS Creates a new Model in TransitionManager .DESCRIPTION This function will create a new Model in TransitionManager .PARAMETER TMSession The name of the TM Session to use when creating a Model .PARAMETER Server The URI of the TransitionManager instance .PARAMETER Name The name of the Model to be created .PARAMETER Description The new Model's description .PARAMETER AssetType The asset type of the new Model .PARAMETER Status The status of the new Model .PARAMETER Manufacturer The manufacturer of the new Model .PARAMETER Aliases One or more aliases for the new Model .PARAMETER InputObject A PSCustomObject representing the Model to be created .PARAMETER Passthru Switch indicating that the new Model should be returned after creation .EXAMPLE $NewModelSplat = @{ TMSession = 'TMDDEV' Manufacturer = 'Microsoft' Name = 'Test-Model01' Description = "Created via PowerShell" Aliases = @('TestModel01', 'Test Model 01') } New-TMModel @NewModelSplat .EXAMPLE $ModelFromTmddev = Get-TMModel -TMSession 'TMDDEV' -Name 'Model123' New-TMModel -TMSession 'TMDDEV2' -InputObject $ModelFromTmddev .OUTPUTS If Passthru switch is used, an object representing the created Model. Otherwise, none #> [CmdletBinding()] param ( [Parameter(Mandatory = $false)] [psobject]$TMSession = 'Default', [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [string]$Name, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [string]$Description, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [string]$AssetType = 'Server', [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [ValidateSet('new', 'full', 'valid')] [string]$Status = 'new', [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [string]$Manufacturer, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [string[]]$Aliases, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [int]$powerNameplate = 0, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [int]$powerDesign = 0, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [int]$powerUse = 0, [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByProperty')] [int]$useImage = 0, [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'ByObject')] [pscustomobject]$InputObject, [Parameter(Mandatory = $false)] [switch]$Passthru ) begin { if (!(Get-Module BAMCIS.Common)) { # Import-Module BAMCIS.Common } $TMSession = Get-TMSession $TMSession } process { $ModelsToAdd = [List[psobject]]::new($InputObject?.Count ?? 1) switch ($PSCmdlet.ParameterSetName) { 'ByProperty' { $ModelsToAdd.Add( [PSCustomObject]@{ Name = $Name description = $Description assetType = $AssetType status = $Status manufacturer = $Manufacturer aliases = $Aliases powerNameplate = $powerNameplate powerDesign = $powerDesign powerUse = $powerUse useImage = $useImage } ) } 'ByObject' { $InputObject | ForEach-Object { $ModelsToAdd.Add( [PSCustomObject]@{ Name = $_.Name description = $_.Description assetType = $_.AssetType ?? 'Server' status = $_.Status ?? 'new' manufacturer = $_.Manufacturer aliases = $_.Aliases powerNameplate = $_.powerNameplate ?? 0 powerDesign = $_.powerDesign ?? 0 powerUse = $_.powerUse ?? 0 useImage = $_.useImage ?? 0 } ) } } } # Loop through the models and add them on the server foreach ($ModelToAdd in $ModelsToAdd) { # Check if the model exists. If it does, move on to the next one $ModelCheck = Get-TMModel -TMSession $TMSession -Name $ModelToAdd.Name if ($ModelCheck) { Write-Host 'Model [ ' -NoNewline Write-Host $($ModelCheck.modelName) -ForegroundColor Cyan -NoNewline Write-Host ' ] already exists' if ($Passthru) { $ModelCheck } continue } # We need the model manufacturer to exist. If it doesn't, move on to the next one $ManufacturerOnServer = Get-TMManufacturer -TMSession $TMSession -Name $ModelToAdd.manufacturer if ( -not $ManufacturerOnServer) { $ManufacturerOnServer = Get-TMManufacturer -TMSession $TMSession -Alias $ModelToAdd.manufacturer if ( -not $ManufacturerOnServer) { Write-Error "Manufacturer '$Manufacturer' was not found on the server. Model '$($ModelToAdd.Name)' cannot be created." continue } } $aliasCounter = 0 [pscustomobject[]]$IndexedAliases = foreach ($alias in $Aliases) { [PSCustomObject]@{ index = $aliasCounter++ name = $alias } } $RestParametersMap = @{ project = $TMSession.UserContext.Project.Id modelName = $Name assetType = $AssetType manufacturer = $ManufacturerOnServer.id powerNameplate = $powerNameplate powerDesign = $powerDesign powerUse = $powerUse aliases = @{ add = $IndexedAliases delete = @() } } $Response = Invoke-TMRestMethod -Api model -Method Post -BodyParams $RestParametersMap if ($Passthru) { $Response } } } } function Remove-TMModel { <# .SYNOPSIS Removes a Model from TransitionManager .DESCRIPTION This function will remove a Model in TransitionManager by Name or Id .PARAMETER TMSession The TransitionManager session to be used when deleting a Model .PARAMETER Server The URI of the TransitionManager instance .PARAMETER Name The name of the Model to be removed .PARAMETER Id The Id of the Model to be removed .EXAMPLE Remove-TMModel -Name 'Test-Model100' -TMSession 'TMDDEV' .EXAMPLE Remove-TMModel -Id 1806 .OUTPUTS None #> [CmdletBinding(DefaultParameterSetName = 'ByName')] param ( [Parameter(Mandatory = $false)] [psobject]$TMSession = 'Default', [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByName', Position = 0)] [string]$Name, [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ById', Position = 0)] [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true, ParameterSetName = 'ByName')] [string]$Id ) begin { $TMSession = Get-TMSession $TMSession if ( $PSBoundParameters.ContainsKey('Id') ) { $apiParams = "/$Id" } else { # The API executes a DELETE by id only $Model = Get-TMModel -TMSession $TMSession -Name $Name if (-not $Model) { throw "Specified model [ $Name ] was not found in [$($TMSession.UserContext.Project.Name)]@$($TMSession.TMServer) " } else { $apiParams = '/{0}' -f $Model.modelId } } } process { $Response = Invoke-TMRestMethod -Api model -ApiParams $apiParams -Method Delete if ($Response.deleted -ne 1) { throw "An unknown error happened: $Response" } Write-Host "Model [ " -NoNewline Write-Host $($PSBoundParameters.ContainsKey('Name') ? "'$Name'" : "id '$Id'") -ForegroundColor Yellow -NoNewline Write-Host " ] has been deleted" } } |