Skip to content

Commit 7832679

Browse files
GetDependecyLocation
1 parent bc0fb77 commit 7832679

13 files changed

+134
-7
lines changed

experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineParameters.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,8 @@ protected override Task<VirtualMachine> GetAsync(
2525
.CreateCompute()
2626
.VirtualMachines
2727
.GetAsync(ResourceGroup.Name, Name);
28+
29+
public override string GetLocation(VirtualMachine value)
30+
=> value.Location;
2831
}
2932
}

experiments/Azure.Experiments/Azure.Experiments/Context.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.Azure.Management.Compute;
22
using Microsoft.Azure.Management.Network;
3+
using Microsoft.Azure.Management.ResourceManager;
34
using Microsoft.Rest;
45

56
namespace Microsoft.Azure.Experiments
@@ -28,5 +29,11 @@ public ComputeManagementClient CreateCompute()
2829
{
2930
SubscriptionId = SubscriptionId
3031
};
32+
33+
public ResourceManagementClient CreateResource()
34+
=> new ResourceManagementClient(Credentials)
35+
{
36+
SubscriptionId = SubscriptionId
37+
};
3138
}
3239
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace Microsoft.Azure.Experiments
2+
{
3+
public sealed class DependencyLocation
4+
{
5+
public string Location { get; }
6+
7+
public bool IsCommon { get; }
8+
9+
public DependencyLocation(string location, bool isCommon)
10+
{
11+
Location = location;
12+
IsCommon = isCommon;
13+
}
14+
}
15+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
3+
namespace Microsoft.Azure.Experiments
4+
{
5+
public static class DependencyLocationExtensions
6+
{
7+
public static DependencyLocation Best(this DependencyLocation a, DependencyLocation b)
8+
{
9+
if (a == null)
10+
{
11+
return b;
12+
}
13+
if (b == null)
14+
{
15+
return a;
16+
}
17+
18+
// a != null
19+
// b != null
20+
if (!a.IsCommon)
21+
{
22+
return b;
23+
}
24+
if (!b.IsCommon)
25+
{
26+
return a;
27+
}
28+
29+
// a.IsCommon == true
30+
// b.IsCommon == true
31+
if (a.Location != b.Location)
32+
{
33+
throw new Exception("dependent resources have different locations");
34+
}
35+
return a;
36+
}
37+
}
38+
}

experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace Microsoft.Azure.Experiments.Network
77
{
88
public sealed class NetworkInterfaceParameters
9-
: ResourceParameters<NetworkInterface>
9+
: NetworkParameters<NetworkInterface>
1010
{
1111
public SubnetParameters Subnet { get; }
1212

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Microsoft.Azure.Management.Network.Models;
2+
using System.Collections.Generic;
3+
4+
namespace Microsoft.Azure.Experiments.Network
5+
{
6+
public abstract class NetworkParameters<T> : ResourceParameters<T>
7+
where T : Resource
8+
{
9+
public NetworkParameters(
10+
string name,
11+
ResourceGroupParameters resourceGroup,
12+
IEnumerable<Parameters> dependencies)
13+
: base(name, resourceGroup, dependencies)
14+
{
15+
}
16+
17+
public sealed override string GetLocation(T value)
18+
=> value.Location;
19+
}
20+
}

experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Microsoft.Azure.Experiments.Network
66
{
77
public sealed class NetworkSecurityGroupParameters
8-
: ResourceParameters<NetworkSecurityGroup>
8+
: NetworkParameters<NetworkSecurityGroup>
99
{
1010
public NetworkSecurityGroupParameters(
1111
string name, ResourceGroupParameters resourceGroup)

experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace Microsoft.Azure.Experiments.Network
77
{
88
public sealed class PublicIpAddressParameters
9-
: ResourceParameters<PublicIPAddress>
9+
: NetworkParameters<PublicIPAddress>
1010
{
1111
public PublicIpAddressParameters(
1212
string name, ResourceGroupParameters resourceGroup)

experiments/Azure.Experiments/Azure.Experiments/Network/SubnetParameters.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public sealed class SubnetParameters : Parameters<Subnet>
88
{
99
public VirtualNetworkParameters VirtualNetwork { get; }
1010

11+
public override bool HasCommonLocation => true;
12+
1113
public SubnetParameters(
1214
string name, VirtualNetworkParameters virtualNetwork)
1315
: base(name, new[] { virtualNetwork })
@@ -22,5 +24,8 @@ protected override async Task<Subnet> GetAsync(
2224
await VirtualNetwork.GetOrNullAsync(context, getParameters);
2325
return virtualNetwork?.Subnets.FirstOrDefault(s => s.Name == Name);
2426
}
27+
28+
public override string GetLocation(Subnet value)
29+
=> null;
2530
}
2631
}

experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkParameters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace Microsoft.Azure.Experiments.Network
66
{
77
public sealed class VirtualNetworkParameters
8-
: ResourceParameters<VirtualNetwork>
8+
: NetworkParameters<VirtualNetwork>
99
{
1010
public VirtualNetworkParameters(
1111
string name, ResourceGroupParameters resourceGroup)

experiments/Azure.Experiments/Azure.Experiments/Parameters.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ public static IEnumerable<Parameters> NoDependencies
1515

1616
public IEnumerable<Parameters> Dependencies { get; }
1717

18+
public abstract bool HasCommonLocation { get; }
19+
20+
public abstract Task<DependencyLocation> GetDependencyLocation(
21+
Context context, IGetParameters getParameters);
22+
1823
protected Parameters(string name, IEnumerable<Parameters> dependencies)
1924
{
2025
Name = name;
@@ -30,7 +35,8 @@ protected Parameters(string name, IEnumerable<Parameters> parameters)
3035
{
3136
}
3237

33-
public Task<T> GetOrNullAsync(Context context, IGetParameters getParameters)
38+
public Task<T> GetOrNullAsync(
39+
Context context, IGetParameters getParameters)
3440
=> getParameters.GetOrAdd(
3541
this,
3642
async () =>
@@ -49,6 +55,24 @@ public Task<T> GetOrNullAsync(Context context, IGetParameters getParameters)
4955
protected abstract Task<T> GetAsync(
5056
Context context, IGetParameters getParameters);
5157

58+
public abstract string GetLocation(T value);
59+
60+
public sealed override async Task<DependencyLocation> GetDependencyLocation(
61+
Context context, IGetParameters getParameters)
62+
{
63+
var info = await GetOrNullAsync(context, getParameters);
64+
var location = info == null ? null : GetLocation(info);
65+
if (location == null)
66+
{
67+
var tasks = Dependencies.Select(
68+
d => d.GetDependencyLocation(context, getParameters));
69+
var dependencyLocations = await Task.WhenAll(tasks);
70+
return dependencyLocations.Aggregate(
71+
(DependencyLocation)null, DependencyLocationExtensions.Best);
72+
}
73+
return new DependencyLocation(location, HasCommonLocation);
74+
}
75+
5276
//protected abstract Task<T> CreateAsync(
5377
// Context context, ICreateParameters createParameters);
5478
}
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
1-
namespace Microsoft.Azure.Experiments
1+
using Microsoft.Azure.Management.ResourceManager;
2+
using Microsoft.Azure.Management.ResourceManager.Models;
3+
using System.Threading.Tasks;
4+
5+
namespace Microsoft.Azure.Experiments
26
{
3-
public sealed class ResourceGroupParameters : Parameters
7+
public sealed class ResourceGroupParameters : Parameters<ResourceGroup>
48
{
59
public ResourceGroupParameters(string name) : base(name, NoDependencies)
610
{
711
}
12+
13+
public override bool HasCommonLocation => false;
14+
15+
public override string GetLocation(ResourceGroup value)
16+
=> value.Location;
17+
18+
protected override Task<ResourceGroup> GetAsync(
19+
Context context, IGetParameters getParameters)
20+
=> context.CreateResource().ResourceGroups.GetAsync(Name);
821
}
922
}

experiments/Azure.Experiments/Azure.Experiments/ResourceParameters.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public abstract class ResourceParameters<T> : Parameters<T>
88
{
99
public ResourceGroupParameters ResourceGroup { get; }
1010

11+
public sealed override bool HasCommonLocation => true;
12+
1113
public ResourceParameters(
1214
string name,
1315
ResourceGroupParameters resourceGroup,

0 commit comments

Comments
 (0)