Skip to content

"az network dns zone export" fails with empty TXT records #27396

Description

@mikeclayton

Describe the bug

Attempting to export a DNS zone with a TXT record that has an empty value results in the following error:

The command failed with an unexpected error. Here is the traceback:
'txt'
Traceback (most recent call last):
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\knack/cli.py", line 233, in invoke
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/__init__.py", line 663, in execute
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/__init__.py", line 726, in _run_jobs_serially
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/__init__.py", line 697, in _run_job
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/__init__.py", line 333, in __call__
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/core/commands/command_operation.py", line 121, in handler
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/command_modules/network/custom.py", line 2633, in export_zone
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/command_modules/network/zone_file/make_zone_file.py", line 96, in make_zone_file
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/command_modules/network/zone_file/record_processors.py", line 134, in process_txt
  File "D:\a\_work\1\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/command_modules/network/zone_file/record_processors.py", line 55, in _quote_field
KeyError: 'txt'
To check existing issues, please visit: https://github.com/Azure/azure-cli/issues

Related command

az network dns zone export
    --subscription   "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    --resource-group "my-dns"
    --name           "my.dns.zone"

Errors

See error in description above.

Issue script & Debug output

Set up a test environment

This script sets up a new dns zone with an empty TXT record so we can reproduce the issue, but you can create the zone and empty TXT record manually in a browser via https://portal.azure.com as well...

# set up some variables for the script
$subscriptionId        = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
$resourceGroupName     = "my-dns";
$zoneName              = "my.dns.zone";
$recordType            = "TXT";
$relativeRecordSetName = "@";
$apiVersion            = "2023-07-01-preview";

# create a new dns zone so we've got a clean environment to test
$azZone = New-AzDnsZone `
    -ResourceGroupName $resourceGroupName `
    -Name              $zoneName;

# add a TXT recordset with an empty value
#
# note that neither "az cli" nor the Az PowerShell cmdlets will let us create
# a TXT record with an empty value - they both throw parameter validation
# errors, so we have to either create it manually in a browser at
# https://portal.azure.com or invoke the raw rest api using "az rest" which
# *do* allow empty values.
#
# see:
#   https://learn.microsoft.com/en-us/cli/azure/reference-index?view=azure-cli-latest#az-rest
#   https://learn.microsoft.com/en-us/rest/api/dns/record-sets/create-or-update?tabs=HTTP#create-txt-recordset

$resourceId = `
    "/subscriptions/$subscriptionId" +
    "/resourceGroups/$resourceGroupName" +
    "/providers/Microsoft.Network" +
    "/dnsZones/$zoneName" +
    "/$recordType/$relativeRecordSetName";

# using Chrome's F12 dev tools shows this body is what https://portal.azure.com sends
# when creating an empty TXT record manually in a browser
$restBody = @{
  "id"         = $resourceId
  "name"       = "@"
  "type"       = "Microsoft.Network/dnszones/TXT"
  "properties" = @{
    "TTL"            = 3600
    "targetResource" = $null
    "ARecords"       = $null
    "AAAARecords"    = $null
    "caaRecords"     = $null
    "CNAMERecord"    = $null
    "MXRecords"      = $null
    "NSRecords"      = $null
    "SOARecord"      = $null
    "SRVRecords"     = $null
    "TXTRecords"     = $null
    "PTRRecords"     = $null
  }
} | ConvertTo-Json -Depth 99 -Compress;
$restBody = $restBody.Replace('"', '\"');

az rest `
  --uri     "https://management.azure.com$($resourceId)?api-version=$apiVersion" `
  --method  "PUT" `
  --headers "Content-Type=application/json" `
  --body    $restBody `
  --debug

Result of setup script

The setup script creates a TXT record with an empty value - the portal renders a hyphen - to indicate an empty value.

image

Reproduce the issue

With the environment set up with an empty TXT record using the above script, this command reproduces the error:

az network dns zone export `
  --subscription   $subscriptionId `
  --resource-group $resourceGroupName  `
  --name           $zoneName

Expected behavior

The DNS zone gets serialized properly to text, including an empty TXT record.

Environment Summary

azure-cli                         2.52.0

core                              2.52.0
telemetry                          1.1.0

Dependencies:
msal                            1.24.0b1
azure-mgmt-resource             23.1.0b2

Python location 'C:\Program Files\Microsoft SDKs\Azure\CLI2\python.exe'
Extensions directory '********'

Python (Windows) 3.10.10 (tags/v3.10.10:aad5f6a, Feb  7 2023, 17:20:36) [MSC v.1929 64 bit (AMD64)]

Legal docs and information: aka.ms/AzureCliLegal


Your CLI is up-to-date.

Additional context

There are other duplicate issues reported but have been closed with workarounds that I can't use:

The suggested resolution for these was to delete the empty TXT record, but I don't have this option as I don't have jurisdiction over the DNS configuration

And a similar issue:

Metadata

Metadata

Assignees

No one assigned

    Labels

    Auto-AssignAuto assign by botAuto-ResolveAuto resolve by botNetwork - DNSaz network dnsPossible-SolutionService AttentionThis issue is responsible by Azure service team.Similar-Issueact-quality-productivity-squadbugThis issue requires a change to an existing behavior in the product in order to be resolved.customer-reportedIssues that are reported by GitHub users external to the Azure organization.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions