public/Domain/New-FabricDomain.ps1
<#
.SYNOPSIS Creates a new Fabric domain. .DESCRIPTION The `Add-FabricDomain` function creates a new domain in Microsoft Fabric by making a POST request to the relevant API endpoint. .PARAMETER DomainName The name of the domain to be created. Must only contain alphanumeric characters, underscores, and spaces. .PARAMETER DomainDescription A description of the domain to be created. .PARAMETER ParentDomainId (Optional) The ID of the parent domain, if applicable. .EXAMPLE Add-FabricDomain -DomainName "Finance" -DomainDescription "Finance data domain" -ParentDomainId "12345" Creates a "Finance" domain under the parent domain with ID "12345". .NOTES - Requires `$FabricConfig` global configuration, including `BaseUrl` and `FabricHeaders`. - Calls `Test-TokenExpired` to ensure token validity before making the API request. Author: Tiago Balabuch #> function New-FabricDomain { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [ValidatePattern('^[a-zA-Z0-9_ ]*$')] [string]$DomainName, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [string]$DomainDescription, [Parameter(Mandatory = $false)] [ValidateNotNullOrEmpty()] [string]$ParentDomainId ) try { # Step 1: Ensure token validity Write-Message -Message "Validating token..." -Level Debug Test-TokenExpired Write-Message -Message "Token validation completed." -Level Debug # Step 3: Construct the request body $apiEndpointUrl = "{0}/admin/domains" -f $FabricConfig.BaseUrl Write-Message -Message "API Endpoint: $apiEndpointUrl" -Level Debug # Construct the request body $body = @{ displayName = $DomainName } if ($DomainDescription) { $body.description = $DomainDescription } if ($ParentDomainId) { $body.parentDomainId = $ParentDomainId } # Convert the body to JSON $bodyJson = $body | ConvertTo-Json -Depth 2 Write-Message -Message "Request Body: $bodyJson" -Level Debug # Step 4: Make the API request $response = Invoke-RestMethod ` -Headers $FabricConfig.FabricHeaders ` -Uri $apiEndpointUrl ` -Method Post ` -Body $bodyJson ` -ContentType "application/json" ` -ErrorAction Stop ` -SkipHttpErrorCheck ` -ResponseHeadersVariable "responseHeader" ` -StatusCodeVariable "statusCode" # Step 5: Handle and log the response switch ($statusCode) { 201 { Write-Message -Message "Domain '$DomainName' created successfully!" -Level Info return $response } 202 { Write-Message -Message "Domain '$DomainName' creation accepted. Provisioning in progress!" -Level Info [string]$operationId = $responseHeader["x-ms-operation-id"] Write-Message -Message "Operation ID: '$operationId'" -Level Debug Write-Message -Message "Getting Long Running Operation status" -Level Debug $operationStatus = Get-FabricLongRunningOperation -operationId $operationId Write-Message -Message "Long Running Operation status: $operationStatus" -Level Debug # Handle operation result if ($operationStatus.status -eq "Succeeded") { Write-Message -Message "Operation Succeeded" -Level Debug Write-Message -Message "Getting Long Running Operation result" -Level Debug $operationResult = Get-FabricLongRunningOperationResult -operationId $operationId Write-Message -Message "Long Running Operation status: $operationResult" -Level Debug return $operationResult } else { Write-Message -Message "Operation failed. Status: $($operationStatus)" -Level Debug Write-Message -Message "Operation failed. Status: $($operationStatus)" -Level Error return $operationStatus } } default { Write-Message -Message "Unexpected response code: $statusCode" -Level Error Write-Message -Message "Error details: $($response.message)" -Level Error throw "API request failed with status code $statusCode." } } } catch { # Step 6: Handle and log errors $errorDetails = $_.Exception.Message Write-Message -Message "Failed to create domain. Error: $errorDetails" -Level Error } } |