Functions/Export-DatabricksJobConfigAsJson.ps1

<#
.SYNOPSIS
Exports DataBricks jobs and Saves as json.
 
.DESCRIPTION
Exports Databricks jobs and saves as json.
 
.PARAMETER Region
Azure Region - must match the URL of your Databricks workspace, example northeurope
 
.PARAMETER LocalOutputPath
Local directroy to save json files.
 
.PARAMETER JobConfig
The job config to export as a json file.
 
.EXAMPLE
Export-DatabricksJobConfigAsJson -Region $config.Region -LocalOutputPath $localOutputPath -JobConfig $job -Verbose
 
.NOTES
Author: Sabin IO
 
#>
 
Function Export-DatabricksJobConfigAsJson {  
    [cmdletbinding()]
    Param(
         [parameter(Mandatory = $true)][string]$LocalOutputPath,
        [parameter(Mandatory = $true)][psobject]$JobConfig
    )
    $jobName =$JobConfig.name | Remove-UnwantedFilenameChars
    $jobFileName = $jobName + '.job.config.json'

    <# We need to replace the existing cluster id with a named cluster for cross workspace #>
    if (($JobConfig.PSObject.Properties.Item('existing_cluster_id'))) {
        Write-Output "Job Name $($JobConfig.name) has existing_cluster_id, replacing with existing_cluster_name"
        $cluster = Get-DatabricksClusters -ClusterId $JobConfig.existing_cluster_id
        $JobConfig.PSObject.Properties.Remove('existing_cluster_id')  
        $JobConfig | Add-Member -NotePropertyName 'existing_cluster_name' -NotePropertyValue $cluster.cluster_name
    }

    <# Shallow sort job config into ordered hashtable for source control purposes #>
    if (($JobConfig.PSObject.Properties.Item('new_cluster'))) {
        $new_cluster = $JobConfig.new_cluster | Remove-JobNewClusterMetaDataAsPSObject
        $JobConfig.PSObject.Properties.Remove('new_cluster')  
        $new_cluster_sorted = $new_cluster | ConvertTo-OrderedHashtableFromPSCustomObject
        $new_cluster_psobject = [PSCustomObject]$new_cluster_sorted
        $JobConfig | Add-Member -NotePropertyName 'new_cluster' -NotePropertyValue $new_cluster_psobject
        
    }
    $tmp = $JobConfig | Remove-JobMetaDataAsPSObject
    $JobConfigAsJson = $tmp | ConvertTo-OrderedHashtableFromPSCustomObject | ConvertTo-Json -Depth 100
    
    $LocalExportPath = Join-Path $LocalOutputPath $jobFileName
    Write-Output "Exporting job `"$($jobName)`" to `"$($LocalExportPath)`""
    New-Item -Force -Path $LocalExportPath -Value $JobConfigAsJson -Type file | Out-Null 
}