diff --git a/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineParameters.cs index 0bf313ed07d1..a2ea02cebc07 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineParameters.cs @@ -18,8 +18,9 @@ public VirtualMachineParameters( Ni = ni; } - public override Task GetAsync(Context context) + public override Task GetAsync(GetContext context) => context + .Context .CreateCompute() .VirtualMachines .GetAsync(ResourceGroup.Name, Name); diff --git a/experiments/Azure.Experiments/Azure.Experiments/GetContext.cs b/experiments/Azure.Experiments/Azure.Experiments/GetContext.cs new file mode 100644 index 000000000000..88b71c566b59 --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/GetContext.cs @@ -0,0 +1,37 @@ +using System.Collections.Concurrent; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Experiments +{ + public sealed class GetContext + { + public Context Context { get; } + + public GetContext(Context context) + { + Context = context; + } + + public async Task GetOrNullAsync(Parameters parameters) + { + var result = await Map.GetOrAdd( + parameters, _ => GetObjectOrNullAsync(parameters)); + return (T)result; + } + + private async Task GetObjectOrNullAsync(Parameters parameters) + { + try + { + return await parameters.GetAsync(this); + } + catch + { + return null; + } + } + + private ConcurrentDictionary> Map { get; } + = new ConcurrentDictionary>(); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceParameters.cs index 81b763a46e34..38d44cfd1c60 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceParameters.cs @@ -27,8 +27,9 @@ public NetworkInterfaceParameters( Pia = pia; } - public override Task GetAsync(Context context) + public override Task GetAsync(GetContext context) => context + .Context .CreateNetwork() .NetworkInterfaces .GetAsync(ResourceGroup.Name, Name); diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupParameters.cs index 72edab16ec5d..b1e4a23eacbb 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupParameters.cs @@ -13,8 +13,9 @@ public NetworkSecurityGroupParameters( { } - public override Task GetAsync(Context context) + public override Task GetAsync(GetContext context) => context + .Context .CreateNetwork() .NetworkSecurityGroups .GetAsync(ResourceGroup.Name, Name); diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressParameters.cs index 7fb97f1caba3..14e372e7c6f1 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressParameters.cs @@ -14,8 +14,9 @@ public PublicIpAddressParameters( { } - public override Task GetAsync(Context context) + public override Task GetAsync(GetContext context) => context + .Context .CreateNetwork() .PublicIPAddresses .GetAsync(ResourceGroup.Name, Name); diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetParameters.cs index bbd2e1635d47..b9898303edd0 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetParameters.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Microsoft.Azure.Management.Network.Models; +using System.Linq; namespace Microsoft.Azure.Experiments.Network { @@ -13,5 +14,11 @@ public SubnetParameters( { VirtualNetwork = virtualNetwork; } + + public override async Task GetAsync(GetContext context) + { + var virtualNetwork = await context.GetOrNullAsync(VirtualNetwork); + return virtualNetwork?.Subnets.FirstOrDefault(s => s.Name == Name); + } } } diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkParameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkParameters.cs index 8d3ce8397f9c..621496ec37c8 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkParameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkParameters.cs @@ -13,8 +13,9 @@ public VirtualNetworkParameters( { } - public override Task GetAsync(Context context) + public override Task GetAsync(GetContext context) => context + .Context .CreateNetwork() .VirtualNetworks .GetAsync(ResourceGroup.Name, Name); diff --git a/experiments/Azure.Experiments/Azure.Experiments/Parameters.cs b/experiments/Azure.Experiments/Azure.Experiments/Parameters.cs index 3dda87e9eead..44865810b8e3 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/Parameters.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/Parameters.cs @@ -27,6 +27,6 @@ protected Parameters(string name, IEnumerable parameters) { } - public abstract Task GetAsync(Context context); + public abstract Task GetAsync(GetContext context); } }