Public/ServiceEndpoint/EndPoints/New-AdoServiceEndpoint.ps1
|
function New-AdoServiceEndpoint { <# .SYNOPSIS Creates a new service endpoint in an Azure DevOps project. .DESCRIPTION This cmdlet creates a new service endpoint in an Azure DevOps project. Service endpoints provide connection details for external services like Azure subscriptions, GitHub, Docker registries, etc. .PARAMETER CollectionUri Optional. The collection URI of the Azure DevOps collection/organization, e.g., https://dev.azure.com/my-org. .PARAMETER Configuration Mandatory. The configuration for the service endpoint as a PSCustomObject. .PARAMETER Version Optional. The API version to use for the request. Default is '7.1'. .LINK https://learn.microsoft.com/en-us/rest/api/azure/devops/serviceendpoint/endpoints/create .EXAMPLE $config = [PSCustomObject]@{ data = [PSCustomObject]@{ creationMode = 'Manual' environment = 'AzureCloud' scopeLevel = 'Subscription' subscriptionId = '00000000-0000-0000-0000-000000000000' subscriptionName = 'my-subscription-1' } name = 'my-endpoint-1' type = 'AzureRM' url = 'https://management.azure.com/' authorization = [PSCustomObject]@{ parameters = [PSCustomObject]@{ serviceprincipalid = '11111111-1111-1111-1111-111111111111' tenantid = '22222222-2222-2222-2222-222222222222' scope = '/subscriptions/00000000-0000-0000-0000-000000000000' } scheme = 'WorkloadIdentityFederation' } isShared = $false serviceEndpointProjectReferences = [PSCustomObject[]]@( [PSCustomObject]@{ name = 'my-endpoint-1' projectReference = [PSCustomObject]@{ id = '33333333-3333-3333-3333-333333333333' name = 'my-project-1' } } ) } New-AdoServiceEndpoint -CollectionUri 'https://dev.azure.com/my-org' -Configuration $config Creates an Azure Resource Manager service endpoint with workload identity federation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] [OutputType([PSCustomObject])] param ( [Parameter(ValueFromPipelineByPropertyName)] [ValidateScript({ Confirm-CollectionUri -Uri $_ })] [string]$CollectionUri = $env:DefaultAdoCollectionUri, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [PSCustomObject]$Configuration, [Parameter()] [Alias('ApiVersion', 'Api')] [ValidateSet('7.1', '7.2-preview.4')] [string]$Version = '7.1' ) begin { Write-Verbose ("Command: $($MyInvocation.MyCommand.Name)") Write-Debug ("CollectionUri: $CollectionUri") Write-Debug ("Configuration: $($Configuration | ConvertTo-Json -Depth 10)") Write-Debug ("Version: $Version") Confirm-Default -Defaults ([ordered]@{ 'CollectionUri' = $CollectionUri }) } process { try { $endpointName = $Configuration.name $projectName = $Configuration.serviceEndpointProjectReferences[0].projectReference.name $params = @{ Uri = "$CollectionUri/_apis/serviceendpoint/endpoints" Version = $Version Method = 'POST' } if ($PSCmdlet.ShouldProcess($CollectionUri, "Create service endpoint: $endpointName")) { try { $results = $Configuration | Invoke-AdoRestMethod @params [PSCustomObject]@{ id = $results.id name = $results.name type = $results.type description = $results.description authorization = $results.authorization url = $results.url isShared = $results.isShared isReady = $results.isReady owner = $results.owner data = $results.data serviceEndpointProjectReferences = $results.serviceEndpointProjectReferences projectName = $projectName collectionUri = $CollectionUri } } catch { if ($_.ErrorDetails.Message -match 'DuplicateServiceConnectionException') { Write-Warning "Service endpoint '$endpointName' already exists, trying to get it." $params.Method = 'GET' $params.Uri = "$CollectionUri/$projectName/_apis/serviceendpoint/endpoints" $params.QueryParameters = "endpointNames=$endpointName" $results = (Invoke-AdoRestMethod @params).value [PSCustomObject]@{ id = $results.id name = $results.name type = $results.type description = $results.description authorization = $results.authorization isShared = $results.isShared url = $results.url isReady = $results.isReady owner = $results.owner data = $results.data serviceEndpointProjectReferences = $results.serviceEndpointProjectReferences projectName = $projectName collectionUri = $CollectionUri } } else { throw $_ } } } else { $params.Body = $Configuration Write-Verbose "Calling Invoke-AdoRestMethod with $($params | ConvertTo-Json -Depth 10)" } } catch { throw $_ } } end { Write-Verbose ("Exit: $($MyInvocation.MyCommand.Name)") } } |