Scripts/Set-AzTableStorageEntities.ps1

param(
    [Parameter(Mandatory = $true)][string] $ResourceGroupName = $(throw "Name of resource group is required"),
    [Parameter(Mandatory = $true)][string] $StorageAccountName = $(throw "Name of Azure storage account is required"),
    [Parameter(Mandatory = $true)][string] $TableName = $(throw "Name of Azure table is required"),
    [Parameter(Mandatory = $true)][string] $ConfigurationFile = $(throw "Path to the configuration file is required")
)

if (-not (Test-Path -Path $ConfigurationFile)) {
    throw "Cannot re-create entities based on JSON configuration file because no file was found at: '$ConfigurationFile'"
}
if ((Get-Content -Path $ConfigurationFile -Raw) -eq $null) {
     throw "Cannot re-create entities based on JSON configuration file because the file is empty."
}

$schema = @'
{
  "definitions": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://scripting.arcus-azure.net/Features/powershell/azure-storage/azure-storage-table/config.json",
  "type": "array",
  "title": "The configuration JSON schema",
  "items": [{
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "anyOf": [{
              "type": "string"
            }, {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    }
  ]
}
'@


if (-not (Get-Content -Path $ConfigurationFile -Raw | Test-Json -Schema $schema -ErrorAction SilentlyContinue)) {
    throw "Cannot re-create entities based on JSON configuration file because the file does not contain a valid JSON configuration file."
}

Write-Verbose "Retrieving Azure storage account context for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'..."
$storageAccount = Get-AzStorageAccount -ResourceGroupName $ResourceGroupName -Name $StorageAccountName
if ($storageAccount -eq $null) {
    throw "Retrieving Azure storage account context for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName' failed."
}
$ctx = $storageAccount.Context
Write-Verbose "Azure storage account context has been retrieved for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'"

Write-Verbose "Retrieving Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'..."
$storageTable = Get-AzStorageTable -Name $TableName -Context $ctx
if ($storageTable -eq $null) {
    throw "Retrieving Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName' failed."
}
$cloudTable = ($storageTable).CloudTable
Write-Verbose "Azure storage table '$TableName' has been retrieved for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'"

Write-Host "Deleting all existing entities in Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'..."
$entitiesToDelete = Get-AzTableRow -table $cloudTable
$deletedEntities = $entitiesToDelete | Remove-AzTableRow -table $cloudTable
Write-Host "Successfully deleted all existing entities in Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'"

$configFile = Get-Content -Path $ConfigurationFile | ConvertFrom-Json
foreach ($entityToAdd in $configFile) {
    if ($entityToAdd.PartitionKey) {
        $partitionKey = $entityToAdd.PartitionKey
        $entityToAdd.PSObject.Properties.Remove('PartitionKey')
    } else {
        $partitionKey = New-Guid
    }

    if ($entityToAdd.RowKey) {
        $rowKey = $entityToAdd.RowKey
        $entityToAdd.PSObject.Properties.Remove('RowKey')
    } else {
        $rowKey = New-Guid
    }

    $entityHash = @{}
    $entityToAdd.PSObject.Properties | foreach { $entityHash[$_.Name] = $_.Value }

    $addedRow = Add-AzTableRow `
    -table $cloudTable `
    -partitionKey $partitionKey `
    -rowKey $rowKey `
    -property $entityHash

    Write-Verbose "Successfully added row with PartitionKey '$partitionKey' and RowKey '$rowKey' to Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'"
}

Write-Host "Successfully added all entities in Azure storage table '$TableName' for Azure storage account '$StorageAccountName' in resource group '$ResourceGroupName'"