Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
fd6af49
{ARO} add __init__.py for ARO tests and update recording (#13089)
Apr 20, 2020
ad2a70f
{Profile} az login: Polish UnicodeDecodeError (#12972)
jiasli Apr 20, 2020
8937383
{Aladdin} add usage examples for module: monitor network privatedns r…
Apr 20, 2020
66fe624
[Compute] az vmss disk detach: fix data disk NoneType issue (#13069)
arrownj Apr 20, 2020
2989946
[ARO] Fixed az aro table output bug (#13066)
m1kola Apr 20, 2020
758f7e9
fix CI (#13114)
mmyyrroonn Apr 22, 2020
9abb510
[Core] fix logging file fd leaking (#13102)
Apr 22, 2020
0ae790c
[AppService] remove sleep after request.get() (#12609)
bmc-msft Apr 22, 2020
2862ce5
[Network] az network security-partner: support security partner provi…
mmyyrroonn Apr 22, 2020
89cf88c
[KeyVault] Add new parameter `--enable-rbac-authorization` during cre…
bim-msft Apr 22, 2020
21172d9
[AKS] az aks create: Add support for Windows (#13084)
AbelHu Apr 23, 2020
facd2bd
fix ci (#13132)
mmyyrroonn Apr 23, 2020
b3d6fb7
{ACR} Fix small typos (#13142)
pablomh Apr 24, 2020
fdc155c
{Compute} Delete stale test of image builder (#13134)
qwordy Apr 24, 2020
12367f8
rename (#13147)
mmyyrroonn Apr 24, 2020
4a58bcb
[Core] fix core tests failed under certain profiles (#13136)
Apr 24, 2020
b93fab1
[Privatedns] Add feature in private DNS zone to import export zone fi…
rahisshaikh Apr 26, 2020
d10679e
{Resource} Remove resource test test_resource_policyset from profile …
Apr 26, 2020
f4ff610
[Monitor] Support LA cluster CMK features (#13133)
jsntcy Apr 26, 2020
80c7bc7
{Core} support get msal accesstoken with adal refresh token for vm ss…
arrownj Apr 26, 2020
4e1ed61
{REST} az rest: Refine help (#13067)
jiasli Apr 26, 2020
dada5c0
{Compute} Update doc of image-version (#13112)
qwordy Apr 27, 2020
5fff003
[Compute] az vm availability-set list: Support showing VM list (#13090)
qwordy Apr 27, 2020
32e5102
[ACS] BREAKING CHANGE: ARO remove vnet-peer, upgrade to 2019-10-27-pr…
Apr 27, 2020
984817c
[Compute] az vm list-skus: Fix display problem of table format (#13184)
qwordy Apr 27, 2020
79964fb
[Monitor] az monitor log-analytics workspace linked-storage: supports…
mmyyrroonn Apr 27, 2020
d261ede
[CI] Onboard pytest and deprecate nose for Automation Test (#13153)
Apr 27, 2020
a638130
[ARM] az deployment sub/group what-if:Add new commands to support Wha…
shenglol Apr 27, 2020
44c3b4a
[Core] Unpin wheel version via pkginfo to query metadata for Python P…
Apr 27, 2020
06cce5b
revert wheel to 0.30.0 (#13198)
Apr 27, 2020
2349420
update azure-cli version to 2.5.0 (#13206)
Apr 28, 2020
37fcdc6
fix style (#13218)
Juliehzl Apr 28, 2020
69c9933
{CI} Fix running full test timeout on profile when in batch mode (#13…
Apr 28, 2020
21e8a2c
upgrade package (#13183)
Juliehzl Apr 28, 2020
cf7f852
[Storage] Support GZRS for storage account creation and update (#13196)
Juliehzl Apr 28, 2020
015be59
[SQL] `az sql instance-pool`: Add instance pools command group (#11721)
rohands Apr 28, 2020
c8edc08
re-run (#13224)
mmyyrroonn Apr 28, 2020
d60ceda
[Compute] vm list-ip-addresses: Error handling (#13186)
qwordy Apr 28, 2020
35c140c
{Network} fix duplicated quotes for private-endpoint example (#13227)
Apr 28, 2020
91f91cc
[Extension] fix loading wrong metadata for wheel type extension (#13222)
Apr 28, 2020
3315616
[Cosmos DB] az cosmosdb create/update: add --enable-public-network su…
soeom Apr 28, 2020
16de64f
[ACR] `az acr check-health`: Fix "DOCKER_PULL_ERROR" on Windows (#13158)
Wwwsylvia Apr 29, 2020
b302f30
[Compute] Fix a bug of vm create if endpoint_vm_image_alias_doc is no…
qwordy Apr 29, 2020
868decc
[Packaging] Add az script for Git Bash/Cygwin on Windows (#13197)
fengzhou-msft Apr 29, 2020
154ecaa
[Compute] vmss create: Add --os-disk-size-gb (#13180)
qwordy Apr 29, 2020
1d64349
{Packaging} Remove wheel as a runtime dependency (#13230)
fengzhou-msft Apr 29, 2020
bd8a963
[Storage] `az storage account failover`: Add support for grs/gzrs sto…
Juliehzl Apr 30, 2020
4acf761
{Extension} Enhance the ability to filter extension's dist-info in or…
Apr 30, 2020
6fc125b
[Storage] `az storage blob upload`: Add --encryption-scope parameter …
Juliehzl Apr 30, 2020
c8bb769
upgarde version (#13265)
Juliehzl Apr 30, 2020
ba399c7
{Release} Upgrade to Azure CLI 2.5.1 (#13263)
Apr 30, 2020
527267b
{Profile} az login: In WSL use powershell.exe to open the default bro…
jiasli Apr 30, 2020
2aa71a7
pass test for connection string (#13273)
Juliehzl Apr 30, 2020
44c092a
{Config} Add endpoint suffix for mysql and postgre sql (#13115)
handsomesun May 6, 2020
f4f44bd
[AppService] functionapp: AzureWebJobsDashboard will only be set if A…
gzuber May 6, 2020
b7a41a3
fix in enable protection for fileshare cmd (#13268)
May 6, 2020
066ca6e
Fix in restore flow (#13348)
May 6, 2020
2325d7c
{Docs} Quote code in help messages with backticks (#13060)
jiasli May 6, 2020
7674236
[Extension] Support installing extensions in a system directory (#12856)
fengzhou-msft May 6, 2020
2343260
[AppService] fix #10664- VNet Integration - Location Check Issue & fi…
Kotasudhakarreddy May 6, 2020
7a087b1
[IoT] Update the IoT command module first run extension awareness mes…
digimaun May 7, 2020
949aaa0
[Network] fix ttl value changed unintended for dns add-record (#13243)
May 7, 2020
e6a19f2
[Compute] New command az vm auto-shutdown (#13199)
qwordy May 7, 2020
a2ab44e
refine help message (#13372)
mmyyrroonn May 7, 2020
cd405fa
ACS: remove fields cleanup that no longer exist (#13315)
May 7, 2020
da047a1
[AKS] update uptime-sla command help context (#13300)
zqingqing1 May 7, 2020
a6fc7da
[Extension] support .egg-info to store wheel type extension metadata …
May 7, 2020
26e341b
[AppConfig] Bug fix for list key values with fields (#13326)
shenmuxiaosen May 7, 2020
df10af0
{AppService}: Updating websites to use the latest SDK version (#13328)
panchagnula May 7, 2020
cef3cf4
{CI} temporary disable CredScan since ADO bug (#13388)
May 8, 2020
f2fa95a
acr: add timeout of 5 minutes (#13349)
yugangw-msft May 8, 2020
08328cd
{Packaging} Clean some azure-cli dependencies (#13253)
fengzhou-msft May 8, 2020
c3f32ed
[ACR] Support disable public network access (#13347)
yugangw-msft May 8, 2020
aa9c4c1
[ARM] az deployment: Fix the problem that the templateLink will not b…
zhoxing-ms May 8, 2020
2de661c
{Storage} Use get_login_credentials from Core for --auth-mode login i…
Juliehzl May 8, 2020
28cc8f4
Bump ADAL version to 1.2.3 (#13371)
jiasli May 8, 2020
4b495b0
[Network] az network public-ip create: Inform customers of a coming b…
jsntcy May 8, 2020
a15c836
[ARO] Add examples to az aro create, list, list-credentials, show, de…
troy0820 May 9, 2020
f04507a
Update python SDK (#13287)
soeom May 9, 2020
14ecf9e
[Storage] az storage account file-service-properties update/show: Add…
Juliehzl May 9, 2020
05d6f12
[ACR]: bug fixes on token create and image import commands (#13392)
yugangw-msft May 9, 2020
137fcc8
{CI} Allow CI to pass on fork repos (#13398)
jiasli May 9, 2020
193c17c
{Docs} Documentation update for configuring machine in VS Code (#13239)
niswitze May 9, 2020
3c8bf29
Fixes az openshift show command (#13358)
m1kola May 9, 2020
5f3c3da
Fix the problem that deployment does not support specially encoded ch…
zhoxing-ms May 9, 2020
70bedda
{Compute} az vm auto-shutdown: remove a validation (#13409)
qwordy May 11, 2020
938bbaf
[RBAC] `az ad sp credential reset`: fix weak credential generation (#…
qianwens May 11, 2020
0caf144
[Network] support generic commands for private link scenario (#13225)
mmyyrroonn May 11, 2020
bd3dfd5
[Network] az network private-endpoint-connection: Support mysql, post…
mmyyrroonn May 11, 2020
197fcf6
acr: keep show-endpoints command in preview (#13430)
yugangw-msft May 11, 2020
0fc82ed
[AMS] Change az ams transform create and az ams content-key-policy cr…
hivyas May 12, 2020
827774b
[Packaging] Build MSI/Homebrew packages with dependecies resolved fro…
fengzhou-msft May 12, 2020
fce911e
[CI] Support flake8 3.8.0 (#13454)
May 12, 2020
b465b2a
{Docs} Increase visibility of doc/use_cli_effectively.md (#13249)
jiasli May 13, 2020
50a18e8
[Network] az network private-endpoint-connection: Support cosmosdb ty…
mmyyrroonn May 13, 2020
0ce0448
[Core] Update local context on/off status to global user level (#13277)
arrownj May 13, 2020
830672d
remove range check for updating min count for autoscaler (#13215)
marwanad May 13, 2020
c07a398
{CI} Code style check use latest azdev (#13450)
May 13, 2020
fe18bc1
[AppService] az webapp|functionapp config ssl import: Lookup key vaul…
madsd May 14, 2020
df5cfde
{CI} Re-enable CredScan (#13464)
May 14, 2020
39c0d01
[ARM] az deployment sub/group what-if: Fix array alignment and error …
shenglol May 14, 2020
3d1fc80
change sappservice code (#13412)
Juliehzl May 14, 2020
f629608
{ACR} Use azure.multiapi.storage for storage blob service (#13411)
Juliehzl May 14, 2020
bcb9921
{batchai} Change storage dependency (#13414)
Juliehzl May 14, 2020
a6a469f
{TestSDK} Delete local context file when local context scenario test …
arrownj May 14, 2020
8f149eb
[ARO]Add generate_random_id function (#13482)
troy0820 May 14, 2020
863517e
{Resource} Remove unused f-string to fix code style (#13493)
May 14, 2020
8027e06
{Doc} Add quoting-issues-with-powershell.md (#13419)
jiasli May 14, 2020
989924e
{Core} Load vnet/subnet global definition for local context by defaul…
arrownj May 14, 2020
a70d7db
Added "MAB" backupmanagementtype to item list command (#13449)
May 14, 2020
ca63e5d
[Backup] Add support for retrying policy update for failed items. (#1…
May 14, 2020
28b1422
[Backup] Add Resume Protection functionality for Azure Virtual Machin…
May 14, 2020
2c3097b
[Backup] Add support to specify ResourceGroup for storing instantRP d…
May 14, 2020
73ee5ce
[Storage] `az storage container create`: Fix #13373 by adding validat…
Juliehzl May 14, 2020
e6e437a
[Output] Show update instruction in find, feedback and --help (#13345)
fengzhou-msft May 14, 2020
2439cc8
[Storage] Add ADLS Gen2 track2 support (#12729)
Juliehzl May 15, 2020
50cedea
{ACR}: expose --expiration from token commands (#13451)
yugangw-msft May 15, 2020
f7e6bba
Fix that cli doe not fail when user only specifies Windows password (…
AbelHu May 15, 2020
cb927d5
[Compute] az vm list-skus: Update --zone behavior, return all type sk…
qwordy May 15, 2020
58198af
[IoT Hub] Support for 2020-03-01 API and Network Isolation commands (…
c-ryan-k May 15, 2020
2e850ea
{Monitor} az monitor metrics alert: refine severity explanation (#13512)
mmyyrroonn May 15, 2020
80457eb
[AppService] Onboard local context for app service (#12984)
arrownj May 15, 2020
4d73f0f
Modify the deprecate information for deployment operation (#13390)
zhoxing-ms May 15, 2020
08432df
Support --connect-string for az storage blob sync (#13135)
zhoxing-ms May 15, 2020
9b71e8a
[Storage] az storage blob sync: Fix the incorrect error message when …
zhoxing-ms May 15, 2020
bae215b
{Network} az network nic create: Refine help message (#13513)
mmyyrroonn May 15, 2020
ee84afb
[NetAppFiles] Anf 5207 Bugfix - add missing snapshot restore function…
audunn May 15, 2020
fe1e042
{Resource} Add example to tell how to pass array to --parameters (#13…
May 16, 2020
530cd07
fix (#13511)
mmyyrroonn May 18, 2020
029e73b
{Release} Upgrade to Azure CLI 2.6.0 (#13542)
May 18, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[Privatedns] Add feature in private DNS zone to import export zone fi…
…le (#13062)

* Adding private DNS zone import export feature

* adding live tests

* Incorporating review comments

* style issue

* Fixing local test

* Encorporating review comment and adding test
  • Loading branch information
rahisshaikh authored Apr 26, 2020
commit b93fab13ee38fb91f5e17eae747eac166026d541
18 changes: 18 additions & 0 deletions src/azure-cli/azure/cli/command_modules/privatedns/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,3 +692,21 @@
- name: Pause executing next line of CLI script until the Private DNS zone is successfully provisioned.
text: az network private-dns zone wait -g MyResourceGroup -n www.mysite.com --created
"""

helps['network private-dns zone export'] = """
type: command
short-summary: Export a Private DNS zone as a DNS zone file.
examples:
- name: Export a Private DNS zone as a DNS zone file.
text: >
az network private-dns zone export -g MyResourceGroup -n www.mysite.com -f mysite_com_zone.txt
"""

helps['network private-dns zone import'] = """
type: command
short-summary: Create a Private DNS zone using a DNS zone file.
examples:
- name: Import a local zone file into a Private DNS zone resource.
text: >
az network private-dns zone import -g MyResourceGroup -n MyZone -f /path/to/zone/file
"""
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@

# pylint: disable=line-too-long
# pylint: disable=too-many-statements
from argcomplete.completers import FilesCompleter
from knack.arguments import CLIArgumentType, ignore_type
from azure.cli.core.commands.parameters import (get_three_state_flag, tags_type)
from azure.cli.core.commands.parameters import (get_three_state_flag, tags_type, file_type)
from azure.cli.command_modules.privatedns._validators import (
privatedns_zone_name_type, get_vnet_validator, validate_privatedns_metadata, validate_privatedns_record_type)

Expand Down Expand Up @@ -83,3 +84,9 @@ def load_arguments(self, _):

with self.argument_context('network private-dns record-set txt') as c:
c.argument('value', options_list=('--value', '-v'), nargs='+', help='Space-separated list of text values which will be concatenated together.')

with self.argument_context('network private-dns zone import') as c:
c.argument('file_name', options_list=['--file-name', '-f'], type=file_type, completer=FilesCompleter(), help='Path to the Private DNS zone file to import')

with self.argument_context('network private-dns zone export') as c:
c.argument('file_name', options_list=['--file-name', '-f'], type=file_type, completer=FilesCompleter(), help='Path to the Private DNS zone file to save')
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def load_command_table(self, _):
g.command('delete', 'delete', confirmation=True, supports_no_wait=True)
g.show_command('show', 'get', table_transformer=transform_privatedns_zone_table_output)
g.custom_command('list', 'list_privatedns_zones', client_factory=cf_privatedns_mgmt_zones, table_transformer=transform_privatedns_zone_table_output)
g.custom_command('import', 'import_zone')
g.custom_command('export', 'export_zone')
g.custom_command('create', 'create_privatedns_zone', client_factory=cf_privatedns_mgmt_zones, supports_no_wait=True)
g.generic_update_command('update', setter_name='update', custom_func_name='update_privatedns_zone', supports_no_wait=True)
g.wait_command('wait')
Expand Down
231 changes: 230 additions & 1 deletion src/azure-cli/azure/cli/command_modules/privatedns/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@

# pylint: disable=line-too-long
from __future__ import print_function
from collections import Counter
from collections import Counter, OrderedDict
from knack.log import get_logger
from msrestazure.azure_exceptions import CloudError
from msrestazure.tools import parse_resource_id
from azure.cli.core.util import CLIError
from azure.cli.core.commands import LongRunningOperation
from azure.cli.core.commands.client_factory import get_mgmt_service_client
from azure.cli.command_modules.network.zone_file.make_zone_file import make_zone_file
from azure.cli.command_modules.network.zone_file.parse_zone_file import parse_zone_file

logger = get_logger(__name__)

Expand All @@ -24,6 +27,231 @@ def list_privatedns_zones(cmd, resource_group_name=None):
return client.list()


# pylint: disable=too-many-statements, too-many-locals
def import_zone(cmd, resource_group_name, private_zone_name, file_name):
from azure.cli.core.util import read_file_content
import sys
from azure.mgmt.privatedns.models import RecordSet

file_text = read_file_content(file_name)
zone_obj = parse_zone_file(file_text, private_zone_name)
origin = private_zone_name
record_sets = {}

for record_set_name in zone_obj:
for record_set_type in zone_obj[record_set_name]:
record_set_obj = zone_obj[record_set_name][record_set_type]

if record_set_type == 'soa':
origin = record_set_name.rstrip('.')

if not isinstance(record_set_obj, list):
record_set_obj = [record_set_obj]

for entry in record_set_obj:

record_set_ttl = entry['ttl']
record_set_key = '{}{}'.format(record_set_name.lower(), record_set_type)

record = _build_record(cmd, entry)
if not record:
logger.warning('Cannot import %s. RecordType is not found. Skipping...', entry['delim'].lower())
continue

record_set = record_sets.get(record_set_key, None)
if not record_set:

# Workaround for issue #2824
relative_record_set_name = record_set_name.rstrip('.')
if not relative_record_set_name.endswith(origin):
logger.warning(
'Cannot import %s. Only records relative to origin may be '
'imported at this time. Skipping...', relative_record_set_name)
continue

record_set = RecordSet(ttl=record_set_ttl)
record_sets[record_set_key] = record_set
_privatedns_add_record(record_set, record, record_set_type, is_list=record_set_type.lower() not in ['soa', 'cname'])

total_records = 0
for key, rs in record_sets.items():
rs_name, rs_type = key.lower().rsplit('.', 1)
rs_name = rs_name[:-(len(origin) + 1)] if rs_name != origin else '@'
try:
record_count = len(getattr(rs, _privatedns_type_to_property_name(rs_type)))
except TypeError:
record_count = 1
total_records += record_count
cum_records = 0

from azure.mgmt.privatedns import PrivateDnsManagementClient
from azure.mgmt.privatedns.models import PrivateZone
client = get_mgmt_service_client(cmd.cli_ctx, PrivateDnsManagementClient)

print('== BEGINNING ZONE IMPORT: {} ==\n'.format(private_zone_name), file=sys.stderr)

if private_zone_name.endswith(".local"):
logger.warning(("Please be aware that DNS names ending with .local are reserved for use with multicast DNS "
"and may not work as expected with some operating systems. For details refer to your operating systems documentation."))
zone = PrivateZone(location='global')
result = LongRunningOperation(cmd.cli_ctx)(client.private_zones.create_or_update(resource_group_name, private_zone_name, zone))
if result.provisioning_state != 'Succeeded':
raise CLIError('Error occured while creating or updating private dns zone.')

for key, rs in record_sets.items():

rs_name, rs_type = key.lower().rsplit('.', 1)
rs_name = '@' if rs_name == origin else rs_name
if rs_name.endswith(origin):
rs_name = rs_name[:-(len(origin) + 1)]

try:
record_count = len(getattr(rs, _privatedns_type_to_property_name(rs_type)))
except TypeError:
record_count = 1
if rs_name == '@' and rs_type == 'soa':
root_soa = client.record_sets.get(resource_group_name, private_zone_name, 'soa', '@')
rs.soa_record.host = root_soa.soa_record.host
rs_name = '@'
try:
client.record_sets.create_or_update(
resource_group_name, private_zone_name, rs_type, rs_name, rs)
cum_records += record_count
print("({}/{}) Imported {} records of type '{}' and name '{}'"
.format(cum_records, total_records, record_count, rs_type, rs_name), file=sys.stderr)
except CloudError as ex:
logger.error(ex)
print("\n== {}/{} RECORDS IMPORTED SUCCESSFULLY: '{}' =="
.format(cum_records, total_records, private_zone_name), file=sys.stderr)


# pylint: disable=too-many-branches
def export_zone(cmd, resource_group_name, private_zone_name, file_name=None):
from azure.mgmt.privatedns import PrivateDnsManagementClient
from time import localtime, strftime
client = get_mgmt_service_client(cmd.cli_ctx, PrivateDnsManagementClient).record_sets
record_sets_soa = client.list_by_type(resource_group_name, private_zone_name, "soa")
record_sets_all = client.list(resource_group_name, private_zone_name)
zone_obj = OrderedDict({
'$origin': private_zone_name.rstrip('.') + '.',
'resource-group': resource_group_name,
'zone-name': private_zone_name.rstrip('.'),
'datetime': strftime('%a, %d %b %Y %X %z', localtime())
})

for record_set in record_sets_soa:
record_type = record_set.type.rsplit('/', 1)[1].lower()
if record_type == 'soa':
record_set_name = record_set.name
record_data = getattr(record_set, _privatedns_type_to_property_name(record_type), None)

if not isinstance(record_data, list):
record_data = [record_data]

for record in record_data:

record_obj = {'ttl': record_set.ttl}

if record_type == 'soa':
zone_obj[record_set_name] = OrderedDict()
zone_obj[record_set_name][record_type] = []
record_obj.update({
'mname': record.host.rstrip('.') + '.',
'rname': record.email.rstrip('.') + '.',
'serial': int(record.serial_number), 'refresh': record.refresh_time,
'retry': record.retry_time, 'expire': record.expire_time,
'minimum': record.minimum_ttl
})
zone_obj['$ttl'] = record.minimum_ttl
zone_obj[record_set_name][record_type].append(record_obj)

for record_set in record_sets_all:
record_type = record_set.type.rsplit('/', 1)[1].lower()
record_set_name = record_set.name
record_data = getattr(record_set, _privatedns_type_to_property_name(record_type), None)

# ignore empty record sets
if not record_data:
continue

if not isinstance(record_data, list):
record_data = [record_data]

if record_set_name not in zone_obj:
zone_obj[record_set_name] = OrderedDict()

for record in record_data:

record_obj = {'ttl': record_set.ttl}

if record_type not in zone_obj[record_set_name]:
zone_obj[record_set_name][record_type] = []

if record_type == 'aaaa':
record_obj.update({'ip': record.ipv6_address})
elif record_type == 'a':
record_obj.update({'ip': record.ipv4_address})
elif record_type == 'caa':
record_obj.update({'val': record.value, 'tag': record.tag, 'flags': record.flags})
elif record_type == 'cname':
record_obj.update({'alias': record.cname.rstrip('.') + '.'})
elif record_type == 'mx':
record_obj.update({'preference': record.preference, 'host': record.exchange})
elif record_type == 'ns':
record_obj.update({'host': record.nsdname})
elif record_type == 'ptr':
record_obj.update({'host': record.ptrdname})
elif record_type == 'soa':
continue
elif record_type == 'srv':
record_obj.update({'priority': record.priority, 'weight': record.weight,
'port': record.port, 'target': record.target})
elif record_type == 'txt':
record_obj.update({'txt': ''.join(record.value)})

zone_obj[record_set_name][record_type].append(record_obj)

zone_file_content = make_zone_file(zone_obj)
print(zone_file_content)
if file_name:
try:
with open(file_name, 'w') as f:
f.write(zone_file_content)
except IOError:
raise CLIError('Unable to export to file: {}'.format(file_name))


# pylint: disable=too-many-return-statements, inconsistent-return-statements, unused-argument
def _build_record(cmd, data):
from azure.mgmt.privatedns.models import AaaaRecord, ARecord, CnameRecord, MxRecord, PtrRecord, SoaRecord, SrvRecord, TxtRecord
record_type = data['delim'].lower()
try:
if record_type == 'aaaa':
return AaaaRecord(ipv6_address=data['ip'])
if record_type == 'a':
return ARecord(ipv4_address=data['ip'])
if record_type == 'cname':
return CnameRecord(cname=data['alias'])
if record_type == 'mx':
return MxRecord(preference=data['preference'], exchange=data['host'])
if record_type == 'ptr':
return PtrRecord(ptrdname=data['host'])
if record_type == 'soa':
return SoaRecord(host=data['host'], email=data['email'], serial_number=data['serial'],
refresh_time=data['refresh'], retry_time=data['retry'], expire_time=data['expire'],
minimum_ttl=data['minimum'])
if record_type == 'srv':
return SrvRecord(
priority=int(data['priority']), weight=int(data['weight']), port=int(data['port']),
target=data['target'])
if record_type in ['txt', 'spf']:
text_data = data['txt']
return TxtRecord(value=text_data) if isinstance(text_data, list) else TxtRecord(value=[text_data])
except KeyError as ke:
raise CLIError("The {} record '{}' is missing a property. {}"
.format(record_type, data['name'], ke))


def create_privatedns_zone(cmd, resource_group_name, private_zone_name, tags=None):
from azure.mgmt.privatedns import PrivateDnsManagementClient
from azure.mgmt.privatedns.models import PrivateZone
Expand Down Expand Up @@ -331,6 +559,7 @@ def dict_matches_filter(d, filter_dict):
or lists_match(filter_dict[key], d.get(key, [])) for key in filter_dict) # noqa


# pylint: disable=too-many-function-args
def lists_match(l1, l2):
try:
return Counter(l1) == Counter(l2)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
zone1.com - Check import for sample zone file with all record type in it.
zone2.com - Check import for preserving TXT record space preservation, long text record. SPF record to be imported as TXT and default TTL for record
zone3.com – Check import for zone file with Missing name in record set to reuse previous name, Missing class, Multi line record
zone4.com – Check TTL calculation to take lowest for record, Check for conflicting TTLs on records with the same name
zone5.com - checks fqdn with different $ORIGIN, checks different $ORIGIN are picked up and Check $ORIGIN from outside zone is permitted (but not for record names), Also check that $ORIGIN without '.' terminator has one added (and a warning)
zone6.com - Check @ A record import
zone7.com - Check @ TXT record import
zone8.com – Check * A record import
zone.local – Check for the warning while creating private DNS zones with .local at end.
Loading