From 83cbdd809f81e750d5abc83bf503dba47e12fe50 Mon Sep 17 00:00:00 2001 From: Marco Franceschi Date: Wed, 7 Jun 2023 14:01:42 -0400 Subject: [PATCH 1/2] feat: Fetched records for private dns --- src/services/privateDns/data.ts | 43 ++++++++++++++++++++++++++ src/services/privateDns/format.ts | 23 ++++++++++++-- src/services/privateDns/schema.graphql | 8 +++++ src/types/generated.ts | 8 +++++ 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/services/privateDns/data.ts b/src/services/privateDns/data.ts index 01fc5716..f6c4998d 100644 --- a/src/services/privateDns/data.ts +++ b/src/services/privateDns/data.ts @@ -16,9 +16,51 @@ export interface RawAzurePrivateDnsZone extends Omit { region: string resourceGroupId: string + records: RawAzureRecordSet[] Tags: TagMap } +export interface RawAzureRecordSet { + id: string + name: string + type: string +} + +export const listRecordSets = async ( + client: PrivateDnsManagementClient, + resourceGroup: string, + databaseAccountName: string +): Promise => { + const records: RawAzureRecordSet[] = [] + const recordsIterable = client.recordSets.list( + resourceGroup, + databaseAccountName + ) + await tryCatchWrapper( + async () => { + for await (const record of recordsIterable) { + if (record) { + const { id, name, type } = record + const recordType = type?.split('/').pop() + records.push({ + id, + name, + type: recordType, + } as RawAzureRecordSet) + } + + } + } + , { + service: 'Records Sets', + client, + scope: 'recordSets', + operation: 'listRecordSets', + } + ) + return records +} + export default async ({ regions, config, @@ -46,6 +88,7 @@ export default async ({ ...rest, region, resourceGroupId, + records: await listRecordSets(client, resourceGroupId, privateDnsZone.name), Tags: tags || {}, }) } diff --git a/src/services/privateDns/format.ts b/src/services/privateDns/format.ts index a2b2dee3..af647e2e 100644 --- a/src/services/privateDns/format.ts +++ b/src/services/privateDns/format.ts @@ -25,8 +25,19 @@ export default ({ numberOfVirtualNetworkLinksWithRegistration, provisioningState, internalId, - resourceGroupId + resourceGroupId, + records = [] } = service + + const aRecords = records.filter(r => r.type === 'A').map(r => r.id) + const aaaRecords = records.filter(r => r.type === 'AAA').map(r => r.id) + const mxRecords = records.filter(r => r.type === 'MX').map(r => r.id) + const ptrRecords = records.filter(r => r.type === 'PTR').map(r => r.id) + const soaRecord = records.filter(r => r.type === 'SOA').map(r => r.id) + const srvRecords = records.filter(r => r.type === 'SRV').map(r => r.id) + const txtRecords = records.filter(r => r.type === 'TXT').map(r => r.id) + const cnameRecord = records.filter(r => r.type === 'CNAME').pop()?.id + return { id, subscriptionId: account, @@ -43,6 +54,14 @@ export default ({ provisioningState, internalId, tags: formatTagsFromMap(Tags), - resourceGroupId + resourceGroupId, + aRecords, + aaaRecords, + mxRecords, + ptrRecords, + soaRecord, + srvRecords, + txtRecords, + cnameRecord, } } diff --git a/src/services/privateDns/schema.graphql b/src/services/privateDns/schema.graphql index 0751ccbb..d29770f5 100644 --- a/src/services/privateDns/schema.graphql +++ b/src/services/privateDns/schema.graphql @@ -13,5 +13,13 @@ type azurePrivateDnsZone implements azureResource numberOfVirtualNetworkLinksWithRegistration: Int @search provisioningState: String @search(by: [hash, regexp]) internalId: String @search(by: [hash, regexp]) + aRecords: [String] @search(by: [hash]) + aaaRecords: [String] @search(by: [hash]) + cnameRecord: String @search(by: [hash]) + mxRecords: [String] @search(by: [hash]) + ptrRecords: [String] @search(by: [hash]) + soaRecord: [String] @search(by: [hash]) + srvRecords: [String] @search(by: [hash]) + txtRecords: [String] @search(by: [hash]) resourceGroup: [azureResourceGroup] @hasInverse(field: privateDns) } diff --git a/src/types/generated.ts b/src/types/generated.ts index 25ac1891..16699565 100644 --- a/src/types/generated.ts +++ b/src/types/generated.ts @@ -4380,16 +4380,24 @@ export type AzurePostgreSqlServerVirtualNetworkRule = { }; export type AzurePrivateDnsZone = AzureResource & { + aRecords?: Maybe>>; + aaaRecords?: Maybe>>; + cnameRecord?: Maybe; etag?: Maybe; internalId?: Maybe; maxNumberOfRecordSets?: Maybe; maxNumberOfVirtualNetworkLinks?: Maybe; maxNumberOfVirtualNetworkLinksWithRegistration?: Maybe; + mxRecords?: Maybe>>; numberOfRecordSets?: Maybe; numberOfVirtualNetworkLinks?: Maybe; numberOfVirtualNetworkLinksWithRegistration?: Maybe; provisioningState?: Maybe; + ptrRecords?: Maybe>>; resourceGroup?: Maybe>>; + soaRecord?: Maybe>>; + srvRecords?: Maybe>>; + txtRecords?: Maybe>>; }; export type AzurePublicIp = AzureResource & { From 414ceece3af505c18a76d6141d63a8d85e20067b Mon Sep 17 00:00:00 2001 From: Marco Franceschi Date: Wed, 7 Jun 2023 14:45:10 -0400 Subject: [PATCH 2/2] feat: Fetched virtual network links for private zone --- src/services/privateDns/data.ts | 52 ++++++++++++++++++++++---- src/services/privateDns/format.ts | 9 +++-- src/services/privateDns/schema.graphql | 3 +- src/types/generated.ts | 3 +- 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/services/privateDns/data.ts b/src/services/privateDns/data.ts index f6c4998d..2083beba 100644 --- a/src/services/privateDns/data.ts +++ b/src/services/privateDns/data.ts @@ -16,25 +16,61 @@ export interface RawAzurePrivateDnsZone extends Omit { region: string resourceGroupId: string - records: RawAzureRecordSet[] + records: RawAzurePrivateDnsMetadata[] + virtualNetworkLinks: RawAzurePrivateDnsMetadata[] Tags: TagMap } -export interface RawAzureRecordSet { +export interface RawAzurePrivateDnsMetadata { id: string name: string type: string } +export const listVirtualNetworkLinks = async ( + client: PrivateDnsManagementClient, + resourceGroup: string, + privateZoneName: string +): Promise => { + const vnetworkLinks: RawAzurePrivateDnsMetadata[] = [] + const vnetworkLinksIterable = client.virtualNetworkLinks.list( + resourceGroup, + privateZoneName + ) + await tryCatchWrapper( + async () => { + for await (const vnetworkLink of vnetworkLinksIterable) { + if (vnetworkLink) { + const { id, name, type } = vnetworkLink + const recordType = type?.split('/').pop() + vnetworkLinks.push({ + id, + name, + type: recordType, + } as RawAzurePrivateDnsMetadata) + } + + } + } + , { + service: 'Virtual Network Links', + client, + scope: 'virtualNetworkLinks', + operation: 'listVirtualNetworkLinks', + } + ) + return vnetworkLinks +} + export const listRecordSets = async ( client: PrivateDnsManagementClient, resourceGroup: string, - databaseAccountName: string -): Promise => { - const records: RawAzureRecordSet[] = [] + privateZoneName: string +): Promise => { + const records: RawAzurePrivateDnsMetadata[] = [] const recordsIterable = client.recordSets.list( resourceGroup, - databaseAccountName + privateZoneName ) await tryCatchWrapper( async () => { @@ -46,7 +82,7 @@ export const listRecordSets = async ( id, name, type: recordType, - } as RawAzureRecordSet) + } as RawAzurePrivateDnsMetadata) } } @@ -77,6 +113,7 @@ export default async ({ const privateDnsZones: RawAzurePrivateDnsZone[] = [] const privateDnsZoneIterable: PagedAsyncIterableIterator = client.privateZones.list() + client.virtualNetworkLinks await tryCatchWrapper( async () => { for await (const privateDnsZone of privateDnsZoneIterable) { @@ -88,6 +125,7 @@ export default async ({ ...rest, region, resourceGroupId, + virtualNetworkLinks: await listVirtualNetworkLinks(client, resourceGroupId, privateDnsZone.name), records: await listRecordSets(client, resourceGroupId, privateDnsZone.name), Tags: tags || {}, }) diff --git a/src/services/privateDns/format.ts b/src/services/privateDns/format.ts index af647e2e..6afeb6fe 100644 --- a/src/services/privateDns/format.ts +++ b/src/services/privateDns/format.ts @@ -26,11 +26,13 @@ export default ({ provisioningState, internalId, resourceGroupId, - records = [] + records = [], + virtualNetworkLinks = [] } = service + // Records const aRecords = records.filter(r => r.type === 'A').map(r => r.id) - const aaaRecords = records.filter(r => r.type === 'AAA').map(r => r.id) + const aaaaRecords = records.filter(r => r.type === 'AAAA').map(r => r.id) const mxRecords = records.filter(r => r.type === 'MX').map(r => r.id) const ptrRecords = records.filter(r => r.type === 'PTR').map(r => r.id) const soaRecord = records.filter(r => r.type === 'SOA').map(r => r.id) @@ -56,12 +58,13 @@ export default ({ tags: formatTagsFromMap(Tags), resourceGroupId, aRecords, - aaaRecords, + aaaaRecords, mxRecords, ptrRecords, soaRecord, srvRecords, txtRecords, cnameRecord, + virtualNetworkLinks: virtualNetworkLinks.map(r => r.id) } } diff --git a/src/services/privateDns/schema.graphql b/src/services/privateDns/schema.graphql index d29770f5..c822fd61 100644 --- a/src/services/privateDns/schema.graphql +++ b/src/services/privateDns/schema.graphql @@ -14,12 +14,13 @@ type azurePrivateDnsZone implements azureResource provisioningState: String @search(by: [hash, regexp]) internalId: String @search(by: [hash, regexp]) aRecords: [String] @search(by: [hash]) - aaaRecords: [String] @search(by: [hash]) + aaaaRecords: [String] @search(by: [hash]) cnameRecord: String @search(by: [hash]) mxRecords: [String] @search(by: [hash]) ptrRecords: [String] @search(by: [hash]) soaRecord: [String] @search(by: [hash]) srvRecords: [String] @search(by: [hash]) txtRecords: [String] @search(by: [hash]) + virtualNetworkLinks: [String] @search(by: [hash]) resourceGroup: [azureResourceGroup] @hasInverse(field: privateDns) } diff --git a/src/types/generated.ts b/src/types/generated.ts index 16699565..30697fa3 100644 --- a/src/types/generated.ts +++ b/src/types/generated.ts @@ -4381,7 +4381,7 @@ export type AzurePostgreSqlServerVirtualNetworkRule = { export type AzurePrivateDnsZone = AzureResource & { aRecords?: Maybe>>; - aaaRecords?: Maybe>>; + aaaaRecords?: Maybe>>; cnameRecord?: Maybe; etag?: Maybe; internalId?: Maybe; @@ -4398,6 +4398,7 @@ export type AzurePrivateDnsZone = AzureResource & { soaRecord?: Maybe>>; srvRecords?: Maybe>>; txtRecords?: Maybe>>; + virtualNetworkLinks?: Maybe>>; }; export type AzurePublicIp = AzureResource & {