diff --git a/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.net6.0.cs b/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.net6.0.cs index 0f363d904168..7fe664ffd962 100644 --- a/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.net6.0.cs +++ b/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.net6.0.cs @@ -97,6 +97,7 @@ public abstract partial class Resource : Azure.Provisioning.Resource where T { protected Resource(Azure.Provisioning.IConstruct scope, Azure.Provisioning.Resource? parent, string resourceName, Azure.Core.ResourceType resourceType, string version, T properties) : base (default(Azure.Provisioning.IConstruct), default(Azure.Provisioning.Resource), default(string), default(Azure.Core.ResourceType), default(string), default(object)) { } public T Properties { get { throw null; } } + public void AssignParameter(System.Linq.Expressions.Expression> selector, Azure.Provisioning.Parameter parameter) { } } } namespace Azure.Provisioning.AppService diff --git a/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.netstandard2.0.cs b/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.netstandard2.0.cs index 0f363d904168..7fe664ffd962 100644 --- a/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.netstandard2.0.cs +++ b/sdk/provisioning/Azure.Provisioning/api/Azure.Provisioning.netstandard2.0.cs @@ -97,6 +97,7 @@ public abstract partial class Resource : Azure.Provisioning.Resource where T { protected Resource(Azure.Provisioning.IConstruct scope, Azure.Provisioning.Resource? parent, string resourceName, Azure.Core.ResourceType resourceType, string version, T properties) : base (default(Azure.Provisioning.IConstruct), default(Azure.Provisioning.Resource), default(string), default(Azure.Core.ResourceType), default(string), default(object)) { } public T Properties { get { throw null; } } + public void AssignParameter(System.Linq.Expressions.Expression> selector, Azure.Provisioning.Parameter parameter) { } } } namespace Azure.Provisioning.AppService diff --git a/sdk/provisioning/Azure.Provisioning/src/ResourceOfT.cs b/sdk/provisioning/Azure.Provisioning/src/ResourceOfT.cs index e76a83f64344..80bf23e141a2 100644 --- a/sdk/provisioning/Azure.Provisioning/src/ResourceOfT.cs +++ b/sdk/provisioning/Azure.Provisioning/src/ResourceOfT.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; +using System.Linq.Expressions; using Azure.Core; namespace Azure.Provisioning @@ -35,5 +37,23 @@ protected Resource(IConstruct scope, Resource? parent, string resourceName, Reso { Properties = properties; } + + /// + /// + /// + /// + /// + /// + public void AssignParameter(Expression> selector, Parameter parameter) + { + if (selector is not LambdaExpression lambda || + lambda.Body is not MemberExpression member) + { + throw new NotSupportedException(); + } + + object instance = Expression.Lambda(member.Expression!, lambda.Parameters[0]).Compile().DynamicInvoke(Properties)!; + AssignParameter(instance, member.Member.Name, parameter); + } } } diff --git a/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDefaults/main.bicep b/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDefaults/main.bicep index 784b164e5561..851bbf3e1563 100644 --- a/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDefaults/main.bicep +++ b/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDefaults/main.bicep @@ -9,9 +9,9 @@ resource resourceGroup_I6QNkoPsb 'Microsoft.Resources/resourceGroups@2023-07-01' } } -resource storageAccount_wIOls6qWR 'Microsoft.Storage/storageAccounts@2022-09-01' = { +resource storageAccount_64QAbICpM 'Microsoft.Storage/storageAccounts@2022-09-01' = { scope: resourceGroup_I6QNkoPsb - name: 'photoAcct-b238b0e606ba44' + name: 'photoAcct-47cc88f8-4ec0-' location: 'westus' sku: { name: 'Premium_LRS' @@ -21,8 +21,8 @@ resource storageAccount_wIOls6qWR 'Microsoft.Storage/storageAccounts@2022-09-01' } } -resource blobService_gWmK7aIWs 'Microsoft.Storage/storageAccounts/blobServices@2022-09-01' = { - parent: storageAccount_wIOls6qWR +resource blobService_hzBGHAAO1 'Microsoft.Storage/storageAccounts/blobServices@2022-09-01' = { + parent: storageAccount_64QAbICpM name: 'photos-TEST' properties: { cors: { diff --git a/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDropDown/main.bicep b/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDropDown/main.bicep index b46eb1267ffe..af051129e038 100644 --- a/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDropDown/main.bicep +++ b/sdk/provisioning/Azure.Provisioning/tests/Infrastructure/StorageBlobDropDown/main.bicep @@ -9,9 +9,9 @@ resource resourceGroup_I6QNkoPsb 'Microsoft.Resources/resourceGroups@2023-07-01' } } -resource storageAccount_zwcoTiJ7t 'Microsoft.Storage/storageAccounts@2022-09-01' = { +resource storageAccount_3AMx4MnVN 'Microsoft.Storage/storageAccounts@2022-09-01' = { scope: resourceGroup_I6QNkoPsb - name: 'photoAcct-42a20f49579e44' + name: 'photoAcct-e9ffc066-811e-' location: 'westus' sku: { name: 'Premium_LRS' @@ -21,8 +21,8 @@ resource storageAccount_zwcoTiJ7t 'Microsoft.Storage/storageAccounts@2022-09-01' } } -resource blobService_oQNAHmGlL 'Microsoft.Storage/storageAccounts/blobServices@2022-09-01' = { - parent: storageAccount_zwcoTiJ7t +resource blobService_JVW2TmYYM 'Microsoft.Storage/storageAccounts/blobServices@2022-09-01' = { + parent: storageAccount_3AMx4MnVN name: 'photos-TEST' properties: { cors: { diff --git a/sdk/provisioning/Azure.Provisioning/tests/ProvisioningTests.cs b/sdk/provisioning/Azure.Provisioning/tests/ProvisioningTests.cs index e319d2b55b44..d2e851d22d35 100644 --- a/sdk/provisioning/Azure.Provisioning/tests/ProvisioningTests.cs +++ b/sdk/provisioning/Azure.Provisioning/tests/ProvisioningTests.cs @@ -41,13 +41,13 @@ public void WebSiteUsingL1() .AddAccessPolicy(frontEndPrincipalId); // frontEnd.properties.identity.principalId KeyVaultSecret sqlAdminSecret = new KeyVaultSecret(infra, "sqlAdminPassword"); - sqlAdminSecret.AssignParameter(sqlAdminSecret.Properties.Properties, nameof(sqlAdminSecret.Properties.Properties.Value), sqlAdminPasswordParam); + sqlAdminSecret.AssignParameter(secret => secret.Properties.Value, sqlAdminPasswordParam); KeyVaultSecret appUserSecret = new KeyVaultSecret(infra, "appUserPassword"); - appUserSecret.AssignParameter(appUserSecret.Properties.Properties, nameof(appUserSecret.Properties.Properties.Value), appUserPasswordParam); + appUserSecret.AssignParameter(secret => secret.Properties.Value, appUserPasswordParam); SqlServer sqlServer = new SqlServer(infra, "sqlserver"); - sqlServer.AssignParameter(sqlServer.Properties, nameof(sqlServer.Properties.AdministratorLoginPassword), sqlAdminPasswordParam); + sqlServer.AssignParameter(sql => sql.AdministratorLoginPassword, sqlAdminPasswordParam); SqlDatabase sqlDatabase = new SqlDatabase(infra); diff --git a/sdk/provisioning/Azure.Provisioning/tests/TestCommonSqlDatabase.cs b/sdk/provisioning/Azure.Provisioning/tests/TestCommonSqlDatabase.cs index fcab9159b982..538308900054 100644 --- a/sdk/provisioning/Azure.Provisioning/tests/TestCommonSqlDatabase.cs +++ b/sdk/provisioning/Azure.Provisioning/tests/TestCommonSqlDatabase.cs @@ -28,13 +28,13 @@ public TestCommonSqlDatabase(IConstruct scope, KeyVault? keyVault = null) AddParameter(appUserPasswordParam); KeyVaultSecret sqlAdminSecret = new KeyVaultSecret(this, "sqlAdminPassword"); - sqlAdminSecret.AssignParameter(sqlAdminSecret.Properties.Properties, nameof(sqlAdminSecret.Properties.Properties.Value), sqlAdminPasswordParam); + sqlAdminSecret.AssignParameter(secret => secret.Properties.Value, sqlAdminPasswordParam); KeyVaultSecret appUserSecret = new KeyVaultSecret(this, "appUserPassword"); - appUserSecret.AssignParameter(appUserSecret.Properties.Properties, nameof(appUserSecret.Properties.Properties.Value), appUserPasswordParam); + appUserSecret.AssignParameter(secret => secret.Properties.Value, appUserPasswordParam); SqlServer sqlServer = new SqlServer(this, "sqlserver"); - sqlServer.AssignParameter(sqlServer.Properties, nameof(sqlServer.Properties.AdministratorLoginPassword), sqlAdminPasswordParam); + sqlServer.AssignParameter(sql => sql.AdministratorLoginPassword, sqlAdminPasswordParam); SqlDatabase = new SqlDatabase(this); KeyVaultSecret sqlAzureConnectionStringSecret = new KeyVaultSecret(this, "connectionString", SqlDatabase.GetConnectionString(appUserPasswordParam));