Skip to content

Commit 1a50fae

Browse files
committed
Add multiple DNS zones for Foundry private endpoint
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 3dd7f34 commit 1a50fae

File tree

23 files changed

+185
-43
lines changed

23 files changed

+185
-43
lines changed

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)