diff --git a/.docs/Remove-VSTeamAgent.md b/.docs/Remove-VSTeamAgent.md new file mode 100644 index 000000000..93e9f8375 --- /dev/null +++ b/.docs/Remove-VSTeamAgent.md @@ -0,0 +1,50 @@ + + +# Remove-VSTeamAgent + +## SYNOPSIS + + + +## SYNTAX + +## DESCRIPTION + + + +## EXAMPLES + +## PARAMETERS + +### -PoolId + +Id of the pool. + +```yaml +Type: String +Required: True +Accept pipeline input: true (ByValue) +``` + +### -Id + +Id of the agent to remove. + +```yaml +Type: int +Aliases: AgentID +Required: True +Accept pipeline input: true (ByPropertyName) +``` + + + +## INPUTS + +### System.String + +## OUTPUTS + +## NOTES + +## RELATED LINKS \ No newline at end of file diff --git a/.docs/synopsis/Remove-VSTeamAgent.md b/.docs/synopsis/Remove-VSTeamAgent.md new file mode 100644 index 000000000..e7bee3538 --- /dev/null +++ b/.docs/synopsis/Remove-VSTeamAgent.md @@ -0,0 +1 @@ +Removes an agent from a pool. \ No newline at end of file diff --git a/README.md b/README.md index 4420a2949..92f21415f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ The cases of every file is very important. This module is to be used on Windows, ## Release Notes +### 3.0.5 + +Merged [Pull Request](https://github.com/DarqueWarrior/vsteam/pull/70) from [Geert van der Cruijsen](https://github.com/Geertvdc) which included the following: + +Added a function to remove vsts agents from a pool. by calling Remove-Agent or Remove-VSTeamAgent + ### 3.0.4 The ProjectName dynamic parameter that enables Tab Complete of project names was getting called approximately 20 times when tab completing a function name. To reduce the number of calls a rudimentary cache was put in place. diff --git a/VSTeam.psd1 b/VSTeam.psd1 index db2b11206..8c0343c1c 100644 --- a/VSTeam.psd1 +++ b/VSTeam.psd1 @@ -13,7 +13,7 @@ RootModule = '' # Version number of this module. - ModuleVersion = '3.0.4' + ModuleVersion = '3.0.5' # Supported PSEditions # CompatiblePSEditions = @() @@ -202,7 +202,8 @@ 'Get-VSTeamWorkItem', 'Show-VSTeamWorkItem', 'Get-VSTeamGitRef', - 'Get-VSTeamAgent') + 'Get-VSTeamAgent', + 'Remove-VSTeamAgent') # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. # CmdletsToExport = @() @@ -302,7 +303,8 @@ 'Update-Policy', 'Remove-Policy', 'Get-GitRef', - 'Get-Agent') + 'Get-Agent', + 'Remove-Agent') # DSC resources to export from this module # DscResourcesToExport = @() diff --git a/docs/Team.md b/docs/Team.md index d0f038bd6..ea3438899 100644 --- a/docs/Team.md +++ b/docs/Team.md @@ -223,6 +223,10 @@ Removes a team from a project. Clears your default project, account name and personal access token. +### [Remove-VSTeamAgent](Remove-VSTeamAgent.md) + +Removes an agent from a pool. + ### [Remove-VSTeamBuild](Remove-VSTeamBuild.md) Deletes the build. diff --git a/docs/readme.md b/docs/readme.md index 424770a94..d585844fb 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -228,6 +228,10 @@ Removes a team from a project. Clears your default project, account name and personal access token. +### [Remove-VSTeamAgent](Remove-VSTeamAgent.md) + +Removes an agent from a pool. + ### [Remove-VSTeamBuild](Remove-VSTeamBuild.md) Deletes the build. diff --git a/en-US/VSTeam-Help.xml b/en-US/VSTeam-Help.xml index 0e6be9754..05580e813 100644 --- a/en-US/VSTeam-Help.xml +++ b/en-US/VSTeam-Help.xml @@ -8860,6 +8860,115 @@ Demo-CI Demo-CI-45 notStarted + + + Remove-VSTeamAgent + Remove + VSTeamAgent + + Removes an agent from a pool. + + + + Removes an agent from a pool. + + + + Remove-VSTeamAgent + + PoolId + + Id of the pool. + + String + + String + + + None + + + Id + + Id of the agent to remove. + + int + + int + + + None + + + Force + + Forces the command without confirmation + + + SwitchParameter + + + False + + + + + + PoolId + + Id of the pool. + + String + + String + + + None + + + Id + + Id of the agent to remove. + + int + + int + + + None + + + Force + + Forces the command without confirmation + + SwitchParameter + + SwitchParameter + + + False + + + + + + System.String + + + + + + + + + + + + + + + Remove-VSTeamBuild diff --git a/integration/test/010_projects.Tests.ps1 b/integration/test/010_projects.Tests.ps1 index f30bd4ed1..bdd313d48 100644 --- a/integration/test/010_projects.Tests.ps1 +++ b/integration/test/010_projects.Tests.ps1 @@ -10,9 +10,11 @@ if ($null -eq $env:TEAM_CIBUILD) { ############################################################## # Before running these tests you must set the following # Environment variables. -# $env:API_VERSION = TFS2017, TFS2018 or VSTS depending on the value used for ACCT +# $env:API_VERSION = TFS2017, TFS2018 or VSTS depending on +# the value used for ACCT # $env:EMAIL = Email of user to remove and re-add to account -# $env:ACCT = VSTS Account Name or full TFS URL including collection +# $env:ACCT = VSTS Account Name or full TFS URL including +# collection # $env:PAT = Personal Access token of ACCT ############################################################## # THESE TEST ARE DESTRUCTIVE. USE AN EMPTY ACCOUNT. # @@ -169,7 +171,7 @@ Describe 'VSTeam Integration Tests' -Tag 'integration' { $actual.name | Should Be 'Default' } else { - $actual.Count | Should Be 6 + $actual.Count | Should -Not -Be 0 } } } @@ -193,7 +195,7 @@ Describe 'VSTeam Integration Tests' -Tag 'integration' { } else { $global:queueId = $actual[0].id - $actual.Count | Should Be 6 + $actual.Count | Should -Not -Be 0 } } diff --git a/src/agents.psm1 b/src/agents.psm1 index b65330ae9..636e9f79a 100644 --- a/src/agents.psm1 +++ b/src/agents.psm1 @@ -43,8 +43,38 @@ function Get-VSTeamAgent { } } +function Remove-VSTeamAgent { + [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "High")] + param( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0)] + [int] $PoolId, + + [parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 1)] + [Alias('AgentID')] + [int[]] $Id, + + # Forces the command without confirmation + [switch] $Force + ) + + process { + foreach ($item in $Id) { + if ($force -or $pscmdlet.ShouldProcess($item,"Delete agent")) { + try { + _callAPI -Method Delete -Area "distributedtask/pools/$PoolId" -Resource agents -Id $item -Version $VSTeamVersionTable.DistributedTask | Out-Null + Write-Output "Deleted agent $item" + } + catch { + _handleException $_ + } + } + } + } +} + Set-Alias Get-Agent Get-VSTeamAgent +Set-Alias Remove-Agent Remove-VSTeamAgent Export-ModuleMember ` - -Function Get-VSTeamAgent ` - -Alias Get-Agent \ No newline at end of file + -Function Get-VSTeamAgent, Remove-VSTeamAgent ` + -Alias Get-Agent, Remove-Agent \ No newline at end of file diff --git a/unit/test/agents.Tests.ps1 b/unit/test/agents.Tests.ps1 index 6e0fbe1e1..3c4c9d048 100644 --- a/unit/test/agents.Tests.ps1 +++ b/unit/test/agents.Tests.ps1 @@ -66,5 +66,26 @@ InModuleScope agents { } } } + + Context 'Remove-VSTeamAgent by ID' { + Mock Invoke-RestMethod + + It 'should remove the agent with passed in Id' { + Remove-VSTeamAgent -Pool 36 -Id 950 -Force + + Assert-MockCalled Invoke-RestMethod -Exactly -Scope It -Times 1 -ParameterFilter { + $Method -eq 'Delete' -and + $Uri -eq "https://test.visualstudio.com/_apis/distributedtask/pools/36/agents/950?api-version=$($VSTeamVersionTable.DistributedTask)" + } + } + } + + Context 'Remove-VSTeamAgent throws' { + Mock Invoke-RestMethod { throw 'boom' } + + It 'should remove the agent with passed in Id' { + { Remove-VSTeamAgent -Pool 36 -Id 950 -Force } | Should Throw + } + } } } \ No newline at end of file