Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions eng/Packages.Data.props
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@
<PackageReference Update="Azure.ResourceManager.AppService" Version="1.1.0-alpha.20240222.2" />
<PackageReference Update="Azure.ResourceManager.Authorization" Version="1.2.0-alpha.20240227.2" />
<PackageReference Update="Azure.ResourceManager.KeyVault" Version="1.3.0-alpha.20240222.2" />
<PackageReference Update="Azure.ResourceManager.PostgreSql" Version="1.2.0-alpha.20240304.1" />
<PackageReference Update="Azure.ResourceManager.Redis" Version="1.4.0-alpha.20240304.2" />
<PackageReference Update="Azure.ResourceManager.Resources" Version="1.8.0-alpha.20240222.2" />
<PackageReference Update="Azure.ResourceManager.Sql" Version="1.3.0-alpha.20240222.1" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,20 @@ public partial class KeyVaultSecret : Azure.Provisioning.Resource<Azure.Resource
protected override Azure.Provisioning.Resource? FindParentInScope(Azure.Provisioning.IConstruct scope) { throw null; }
}
}
namespace Azure.Provisioning.PostgreSql
{
public partial class PostgreSqlConnectionString : Azure.Provisioning.ConnectionString
{
internal PostgreSqlConnectionString() : base (default(string)) { }
}
public partial class PostgreSqlFlexibleServer : Azure.Provisioning.Resource<Azure.ResourceManager.PostgreSql.FlexibleServers.PostgreSqlFlexibleServerData>
{
public PostgreSqlFlexibleServer(Azure.Provisioning.IConstruct scope, Azure.Provisioning.Parameter administratorLogin, Azure.Provisioning.Parameter administratorPassword, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerSku? sku = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerHighAvailability? highAvailability = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerStorage? storage = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerBackupProperties? backup = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerNetwork? network = null, string? availabilityZone = null, Azure.Provisioning.ResourceManager.ResourceGroup? parent = null, string name = "postgres", string version = "2020-06-01", Azure.Core.AzureLocation? location = default(Azure.Core.AzureLocation?)) : base (default(Azure.Provisioning.IConstruct), default(Azure.Provisioning.Resource), default(string), default(Azure.Core.ResourceType), default(string), default(System.Func<string, Azure.ResourceManager.PostgreSql.FlexibleServers.PostgreSqlFlexibleServerData>)) { }
protected override Azure.Provisioning.Resource? FindParentInScope(Azure.Provisioning.IConstruct scope) { throw null; }
protected override string GetAzureName(Azure.Provisioning.IConstruct scope, string resourceName) { throw null; }
public Azure.Provisioning.PostgreSql.PostgreSqlConnectionString GetConnectionString(Azure.Provisioning.Parameter administratorLogin, Azure.Provisioning.Parameter administratorPassword) { throw null; }
}
}
namespace Azure.Provisioning.Redis
{
public partial class RedisCache : Azure.Provisioning.Resource<Azure.ResourceManager.Redis.RedisData>
Expand Down Expand Up @@ -271,7 +285,7 @@ public partial class SqlDatabase : Azure.Provisioning.Resource<Azure.ResourceMan
}
public partial class SqlDatabaseConnectionString : Azure.Provisioning.ConnectionString
{
public SqlDatabaseConnectionString(Azure.Provisioning.Sql.SqlDatabase database, Azure.Provisioning.Parameter password, string userName) : base (default(string)) { }
internal SqlDatabaseConnectionString() : base (default(string)) { }
}
public partial class SqlFirewallRule : Azure.Provisioning.Resource<Azure.ResourceManager.Sql.SqlFirewallRuleData>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,20 @@ public partial class KeyVaultSecret : Azure.Provisioning.Resource<Azure.Resource
protected override Azure.Provisioning.Resource? FindParentInScope(Azure.Provisioning.IConstruct scope) { throw null; }
}
}
namespace Azure.Provisioning.PostgreSql
{
public partial class PostgreSqlConnectionString : Azure.Provisioning.ConnectionString
{
internal PostgreSqlConnectionString() : base (default(string)) { }
}
public partial class PostgreSqlFlexibleServer : Azure.Provisioning.Resource<Azure.ResourceManager.PostgreSql.FlexibleServers.PostgreSqlFlexibleServerData>
{
public PostgreSqlFlexibleServer(Azure.Provisioning.IConstruct scope, Azure.Provisioning.Parameter administratorLogin, Azure.Provisioning.Parameter administratorPassword, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerSku? sku = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerHighAvailability? highAvailability = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerStorage? storage = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerBackupProperties? backup = null, Azure.ResourceManager.PostgreSql.FlexibleServers.Models.PostgreSqlFlexibleServerNetwork? network = null, string? availabilityZone = null, Azure.Provisioning.ResourceManager.ResourceGroup? parent = null, string name = "postgres", string version = "2020-06-01", Azure.Core.AzureLocation? location = default(Azure.Core.AzureLocation?)) : base (default(Azure.Provisioning.IConstruct), default(Azure.Provisioning.Resource), default(string), default(Azure.Core.ResourceType), default(string), default(System.Func<string, Azure.ResourceManager.PostgreSql.FlexibleServers.PostgreSqlFlexibleServerData>)) { }
protected override Azure.Provisioning.Resource? FindParentInScope(Azure.Provisioning.IConstruct scope) { throw null; }
protected override string GetAzureName(Azure.Provisioning.IConstruct scope, string resourceName) { throw null; }
public Azure.Provisioning.PostgreSql.PostgreSqlConnectionString GetConnectionString(Azure.Provisioning.Parameter administratorLogin, Azure.Provisioning.Parameter administratorPassword) { throw null; }
}
}
namespace Azure.Provisioning.Redis
{
public partial class RedisCache : Azure.Provisioning.Resource<Azure.ResourceManager.Redis.RedisData>
Expand Down Expand Up @@ -271,7 +285,7 @@ public partial class SqlDatabase : Azure.Provisioning.Resource<Azure.ResourceMan
}
public partial class SqlDatabaseConnectionString : Azure.Provisioning.ConnectionString
{
public SqlDatabaseConnectionString(Azure.Provisioning.Sql.SqlDatabase database, Azure.Provisioning.Parameter password, string userName) : base (default(string)) { }
internal SqlDatabaseConnectionString() : base (default(string)) { }
}
public partial class SqlFirewallRule : Azure.Provisioning.Resource<Azure.ResourceManager.Sql.SqlFirewallRuleData>
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<PackageReference Include="Azure.ResourceManager.AppConfiguration" />
<PackageReference Include="Azure.ResourceManager.Authorization" />
<PackageReference Include="Azure.ResourceManager.Redis" />
<PackageReference Include="Azure.ResourceManager.PostgreSql" />
<PackageReference Include="System.ClientModel" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

namespace Azure.Provisioning.PostgreSql
{
/// <summary>
/// Represents a connection string.
/// </summary>
public class PostgreSqlConnectionString : ConnectionString
{
/// <summary>
/// Initializes a new instance of the <see cref="PostgreSqlConnectionString"/>.
/// </summary>
/// <param name="server">The server.</param>
/// <param name="userName">The username.</param>
/// <param name="password">The password.</param>
internal PostgreSqlConnectionString(PostgreSqlFlexibleServer server, Parameter userName, Parameter password)
: base($"Host=${{{server.Name}.properties.fullyQualifiedDomainName}};Username=${{{GetParameterValue(userName)}}};Password=${{{GetParameterValue(password)}}}")
{
}

private static string GetParameterValue(Parameter parameter) => parameter.IsFromOutput ? parameter.Value! : parameter.Name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using Azure.Core;
using Azure.Provisioning.Redis;
using Azure.Provisioning.ResourceManager;
using Azure.ResourceManager.PostgreSql;
using Azure.ResourceManager.PostgreSql.FlexibleServers;
using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;
using Azure.ResourceManager.PostgreSql.Models;
using Azure.ResourceManager.Redis.Models;

namespace Azure.Provisioning.PostgreSql
{
/// <summary>
/// Represents a PostGreSql server.
/// </summary>
public class PostgreSqlFlexibleServer : Resource<PostgreSqlFlexibleServerData>
{
private const string ResourceTypeName = "Microsoft.DBforPostgreSQL/flexibleServers";

/// <summary>
/// Creates a new instance of the <see cref="PostgreSqlFlexibleServer"/> class.
/// </summary>
/// <param name="scope">The scope.</param>
/// <param name="administratorLogin">The administrator login.</param>
/// <param name="administratorPassword">The administrator password.</param>
/// <param name="sku">The Sku.</param>
/// <param name="highAvailability">The high availability.</param>
/// <param name="storage">The storage.</param>
/// <param name="backup">The backup.</param>
/// <param name="network">The network.</param>
/// <param name="availabilityZone">The availability zone.</param>
/// <param name="parent">The parent.</param>
/// <param name="name">The name.</param>
/// <param name="version">The version.</param>
/// <param name="location">The location.</param>
public PostgreSqlFlexibleServer(
IConstruct scope,
Parameter administratorLogin,
Parameter administratorPassword,
PostgreSqlFlexibleServerSku? sku = default,
PostgreSqlFlexibleServerHighAvailability? highAvailability = default,
PostgreSqlFlexibleServerStorage? storage = default,
PostgreSqlFlexibleServerBackupProperties? backup = default,
PostgreSqlFlexibleServerNetwork? network = default,
string? availabilityZone = default,
ResourceGroup? parent = default,
string name = "postgres",
string version = "2020-06-01",
AzureLocation? location = default)
: base(scope, parent, name, ResourceTypeName, version, (name) => ArmPostgreSqlFlexibleServersModelFactory.PostgreSqlFlexibleServerData(
name: name,
sku: sku,
// create new instances so the properties can be overriden by user if needed
highAvailability: highAvailability ?? new PostgreSqlFlexibleServerHighAvailability(),
storage: storage ?? new PostgreSqlFlexibleServerStorage(),
backup: backup ?? new PostgreSqlFlexibleServerBackupProperties(),
network: network ?? new PostgreSqlFlexibleServerNetwork(),
availabilityZone: availabilityZone,
location: location ?? Environment.GetEnvironmentVariable("AZURE_LOCATION") ?? AzureLocation.WestUS))
{
AssignProperty(data => data.Name, GetAzureName(scope, name));
AssignProperty(data => data.AdministratorLogin, administratorLogin);
AssignProperty(data => data.AdministratorLoginPassword, administratorPassword);
}

/// <inheritdoc/>
protected override Resource? FindParentInScope(IConstruct scope)
{
var result = base.FindParentInScope(scope);
if (result is null)
{
result = scope.GetOrAddResourceGroup();
}
return result;
}

/// <summary>
/// Gets the connection string for the <see cref="RedisCache"/>.
/// </summary>
public PostgreSqlConnectionString GetConnectionString(Parameter administratorLogin, Parameter administratorPassword)
=> new PostgreSqlConnectionString(this, administratorLogin, administratorPassword);

/// <inheritdoc/>
protected override string GetAzureName(IConstruct scope, string resourceName) => GetGloballyUniqueName(resourceName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class SqlDatabaseConnectionString : ConnectionString
/// <param name="database">The database.</param>
/// <param name="password">The password.</param>
/// <param name="userName">The user name.</param>
public SqlDatabaseConnectionString(SqlDatabase database, Parameter password, string userName)
internal SqlDatabaseConnectionString(SqlDatabase database, Parameter password, string userName)
: base($"Server=${{{database.Parent!.Name}.properties.fullyQualifiedDomainName}}; Database=${{{database.Name}.name}}; User={userName}; Password=${{{(password.IsFromOutput ? password.Value : password.Name)}}}")
{
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
targetScope = 'resourceGroup'

@description('')
param location string = resourceGroup().location

@description('Administrator login')
param adminLogin string

@secure()
@description('Administrator password')
param adminPassword string


resource postgreSqlFlexibleServer_mZ8PC2Gce 'Microsoft.DBforPostgreSQL/flexibleServers@2020-06-01' = {
name: toLower(take(concat('postgres', uniqueString(resourceGroup().id)), 24))
location: location
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
backup: {
backupRetentionDays: 7
geoRedundantBackup: 'Disabled'
}
highAvailability: {
mode: 'haMode'
}
}
}

resource keyVault_5t0GshPLB 'Microsoft.KeyVault/vaults@2023-02-01' = {
name: toLower(take(concat('kv', uniqueString(resourceGroup().id)), 24))
location: location
properties: {
tenantId: tenant().tenantId
sku: {
name: 'standard'
family: 'A'
}
enableRbacAuthorization: true
}
}

resource keyVaultSecret_R6AWfDGcA 'Microsoft.KeyVault/vaults/secrets@2023-02-01' = {
parent: keyVault_5t0GshPLB
name: 'connectionString'
location: location
properties: {
value: 'Host=${postgreSqlFlexibleServer_mZ8PC2Gce.properties.fullyQualifiedDomainName};Username=${adminLogin};Password=${adminPassword}'
}
}
33 changes: 33 additions & 0 deletions sdk/provisioning/Azure.Provisioning/tests/ProvisioningTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@
using Azure.Provisioning.Storage;
using Azure.Provisioning.AppConfiguration;
using Azure.Provisioning.Authorization;
using Azure.Provisioning.PostgreSql;
using Azure.Provisioning.Redis;
using Azure.ResourceManager;
using Azure.ResourceManager.Authorization.Models;
using Azure.ResourceManager.PostgreSql.FlexibleServers.Models;
using Azure.ResourceManager.Resources;
using Azure.ResourceManager.Resources.Models;
using Azure.ResourceManager.Storage.Models;
Expand Down Expand Up @@ -233,6 +235,37 @@ public async Task RedisCacheSecondaryConnectionString()
await ValidateBicepAsync(interactiveMode: true);
}

[RecordedTest]
public async Task PostgreSql()
{
TestInfrastructure infrastructure = new TestInfrastructure(configuration: new Configuration { UseInteractiveMode = true });
var adminLogin = new Parameter("adminLogin", "Administrator login");
var adminPassword = new Parameter("adminPassword", "Administrator password", isSecure: true);
var server = new PostgreSqlFlexibleServer(
infrastructure,
administratorLogin: adminLogin,
administratorPassword: adminPassword,
highAvailability: new PostgreSqlFlexibleServerHighAvailability { Mode = "haMode" },
backup: new PostgreSqlFlexibleServerBackupProperties
{
BackupRetentionDays = 7,
GeoRedundantBackup = PostgreSqlFlexibleServerGeoRedundantBackupEnum.Disabled
});
_ = infrastructure.AddKeyVault();
_ = new KeyVaultSecret(infrastructure, "connectionString", server.GetConnectionString(adminLogin, adminPassword));

infrastructure.Build(GetOutputPath());

await ValidateBicepAsync(
BinaryData.FromObjectAsJson(
new
{
adminLogin = new { value = "password" },
adminPassword = new { value = "password" }
}),
interactiveMode: true);
}

[RecordedTest]
public async Task WebSiteUsingL2()
{
Expand Down