Skip to content

Commit beaf43f

Browse files
authored
Add multiple DNS zones for Foundry private endpoint (#16051)
Foundry has multiple DNS names it can use, we should support the common ones when creating a private endpoint to a Foundry resource. This involves a minor binary breaking change on IAzurePrivateEndpointTarget, which is public but experimental.
1 parent 7892900 commit beaf43f

23 files changed

Lines changed: 185 additions & 43 deletions

File tree

src/Aspire.Hosting.Azure.AppConfiguration/AzureAppConfigurationResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ public override ProvisionableResource AddAsExistingResource(AzureResourceInfrast
7979

8080
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["configurationStores"];
8181

82-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.azconfig.io";
82+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.azconfig.io"];
8383
}

src/Aspire.Hosting.Azure.CognitiveServices/AzureOpenAIResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public override ProvisionableResource AddAsExistingResource(AzureResourceInfrast
113113

114114
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["account"];
115115

116-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.openai.azure.com";
116+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.openai.azure.com"];
117117

118118
IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionString.GetConnectionProperties()
119119
{

src/Aspire.Hosting.Azure.CosmosDB/AzureCosmosDBResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,5 +266,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
266266

267267
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["Sql"];
268268

269-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.documents.azure.com";
269+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.documents.azure.com"];
270270
}

src/Aspire.Hosting.Azure.EventHubs/AzureEventHubsResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,5 +216,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
216216

217217
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["namespace"];
218218

219-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.servicebus.windows.net";
219+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.servicebus.windows.net"];
220220
}

src/Aspire.Hosting.Azure.KeyVault/AzureKeyVaultResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
149149

150150
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["vault"];
151151

152-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.vaultcore.azure.net";
152+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.vaultcore.azure.net"];
153153
}

src/Aspire.Hosting.Azure.Network/AzurePrivateEndpointExtensions.cs

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,13 @@ public static IResourceBuilder<AzurePrivateEndpointResource> AddPrivateEndpoint(
6565
return builder.CreateResourceBuilder(resource);
6666
}
6767

68-
// Get or create the shared Private DNS Zone for this zone name
69-
var zoneName = target.Resource.GetPrivateDnsZoneName();
70-
var dnsZone = GetOrCreatePrivateDnsZone(builder, zoneName, vnet);
71-
resource.DnsZone = dnsZone;
68+
// Get or create the shared Private DNS Zones for this resource type
69+
var zoneNames = target.Resource.GetPrivateDnsZoneNames();
70+
foreach (var zoneName in zoneNames)
71+
{
72+
var dnsZone = GetOrCreatePrivateDnsZone(builder, zoneName, vnet);
73+
resource.DnsZones.Add(dnsZone);
74+
}
7275

7376
// Add annotation to the target's root parent (e.g., storage account) to signal
7477
// that it should deny public network access and to associate the private endpoint
@@ -95,12 +98,16 @@ void ConfigurePrivateEndpoint(AzureResourceInfrastructure infra)
9598
{
9699
var azureResource = (AzurePrivateEndpointResource)infra.AspireResource;
97100

98-
// Get the shared DNS Zone as an existing resource
99-
var dnsZone = azureResource.DnsZone!;
100-
var dnsZoneIdentifier = dnsZone.GetBicepIdentifier();
101-
var privateDnsZone = PrivateDnsZone.FromExisting(dnsZoneIdentifier);
102-
privateDnsZone.Name = dnsZone.NameOutputReference.AsProvisioningParameter(infra);
103-
infra.Add(privateDnsZone);
101+
// Get the shared DNS Zones as existing resources
102+
var privateDnsZones = new List<(string Identifier, PrivateDnsZone Zone)>();
103+
foreach (var dnsZone in azureResource.DnsZones)
104+
{
105+
var dnsZoneIdentifier = dnsZone.GetBicepIdentifier();
106+
var privateDnsZone = PrivateDnsZone.FromExisting(dnsZoneIdentifier);
107+
privateDnsZone.Name = dnsZone.NameOutputReference.AsProvisioningParameter(infra);
108+
infra.Add(privateDnsZone);
109+
privateDnsZones.Add((dnsZoneIdentifier, privateDnsZone));
110+
}
104111

105112
// Create the Private Endpoint
106113
var endpoint = AzureProvisioningResource.CreateExistingOrNewProvisionableResource(infra,
@@ -138,15 +145,17 @@ void ConfigurePrivateEndpoint(AzureResourceInfrastructure infra)
138145
{
139146
Name = "default",
140147
Parent = endpoint,
141-
PrivateDnsZoneConfigs =
142-
{
143-
new PrivateDnsZoneConfig
144-
{
145-
Name = dnsZoneIdentifier,
146-
PrivateDnsZoneId = privateDnsZone.Id
147-
}
148-
}
149148
};
149+
150+
foreach (var (identifier, zone) in privateDnsZones)
151+
{
152+
dnsZoneGroup.PrivateDnsZoneConfigs.Add(new PrivateDnsZoneConfig
153+
{
154+
Name = identifier,
155+
PrivateDnsZoneId = zone.Id
156+
});
157+
}
158+
150159
infra.Add(dnsZoneGroup);
151160

152161
// Output the Private Endpoint ID for references

src/Aspire.Hosting.Azure.Network/AzurePrivateEndpointResource.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ public class AzurePrivateEndpointResource(
4141
public IAzurePrivateEndpointTarget Target { get; } = target;
4242

4343
/// <summary>
44-
/// Gets or sets the Private DNS Zone for this endpoint.
44+
/// Gets the Private DNS Zones for this endpoint.
4545
/// </summary>
46-
internal AzurePrivateDnsZoneResource? DnsZone { get; set; }
46+
internal List<AzurePrivateDnsZoneResource> DnsZones { get; } = [];
4747

4848
/// <inheritdoc/>
4949
public override ProvisionableResource AddAsExistingResource(AzureResourceInfrastructure infra)

src/Aspire.Hosting.Azure.PostgreSQL/AzurePostgresFlexibleServerResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,5 +316,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
316316

317317
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["postgresqlServer"];
318318

319-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.postgres.database.azure.com";
319+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.postgres.database.azure.com"];
320320
}

src/Aspire.Hosting.Azure.Redis/AzureManagedRedisResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,5 +253,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
253253

254254
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["redisEnterprise"];
255255

256-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.redis.azure.net";
256+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.redis.azure.net"];
257257
}

src/Aspire.Hosting.Azure.Search/AzureSearchResource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,5 @@ IEnumerable<KeyValuePair<string, ReferenceExpression>> IResourceWithConnectionSt
9393

9494
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateLinkGroupIds() => ["searchService"];
9595

96-
string IAzurePrivateEndpointTarget.GetPrivateDnsZoneName() => "privatelink.search.windows.net";
96+
IEnumerable<string> IAzurePrivateEndpointTarget.GetPrivateDnsZoneNames() => ["privatelink.search.windows.net"];
9797
}

0 commit comments

Comments
 (0)