Skip to content

Commit a4aeca6

Browse files
ChildResourceConfig
1 parent ccb9d0e commit a4aeca6

File tree

10 files changed

+121
-16
lines changed

10 files changed

+121
-16
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
namespace Microsoft.Azure.Experiments
2+
{
3+
public interface IChildResourceConfig
4+
{
5+
}
6+
7+
public interface IChildResourceConfig<Info> : IChildResourceConfig
8+
{
9+
}
10+
11+
public static class ChildResourceConfig
12+
{
13+
public static ChildResourceConfig<Info, ParentInfo> CreateConfig<Info, ParentInfo>(
14+
this ChildResourcePolicy<Info, ParentInfo> policy,
15+
ResourceConfig<ParentInfo> parent,
16+
string name)
17+
where Info : class
18+
where ParentInfo : class
19+
=> new ChildResourceConfig<Info, ParentInfo>(policy, parent, name);
20+
}
21+
22+
public sealed class ChildResourceConfig<Info, ParentInfo> : IChildResourceConfig<Info>
23+
where Info : class
24+
where ParentInfo : class
25+
{
26+
public ChildResourcePolicy<Info, ParentInfo> Policy { get; }
27+
28+
public ResourceConfig<ParentInfo> Parent { get; }
29+
30+
public string Name { get; }
31+
32+
public ChildResourceConfig(
33+
ChildResourcePolicy<Info, ParentInfo> policy,
34+
ResourceConfig<ParentInfo> parent,
35+
string name)
36+
{
37+
Policy = policy;
38+
Parent = parent;
39+
Name = name;
40+
}
41+
}
42+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
3+
namespace Microsoft.Azure.Experiments
4+
{
5+
public static class ChildResourcePolicy
6+
{
7+
public static ChildResourcePolicy<Info, ParentInfo> Create<Info, ParentInfo>(
8+
Func<ParentInfo, string, Info> get,
9+
Action<ParentInfo, Info> set)
10+
where Info : class
11+
where ParentInfo : class
12+
=> new ChildResourcePolicy<Info, ParentInfo>(get, set);
13+
}
14+
15+
public sealed class ChildResourcePolicy<Info, ParentInfo>
16+
where Info : class
17+
where ParentInfo : class
18+
{
19+
public Func<ParentInfo, string, Info> Get { get; }
20+
21+
public Action<ParentInfo, Info> Set { get; }
22+
23+
public ChildResourcePolicy(
24+
Func<ParentInfo, string, Info> get, Action<ParentInfo, Info> set)
25+
{
26+
Get = get;
27+
Set = set;
28+
}
29+
}
30+
}

experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachinePolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static class VirtualMachinePolicy
1616
public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
1717
this ResourceName name,
1818
ResourceConfig<NetworkInterface> networkInterface)
19-
=> Policy.CreateResourceConfig(
19+
=> Policy.CreateConfig(
2020
name,
2121
_ => new VirtualMachine(),
2222
new[] { networkInterface });

experiments/Azure.Experiments/Azure.Experiments/IState.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
public interface IState
44
{
5-
T GetInfo<T>(IResourceConfig<T> resourceConfig);
5+
T Get<T>(IResourceConfig<T> resourceConfig);
6+
T Get<T>(IChildResourceConfig<T> childResourceConfig);
67
}
78
}

experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfacePolicy.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,33 @@ public static class NetworkInterfacePolicy
1414

1515
public static ResourceConfig<NetworkInterface> CreateNetworkInterfaceConfig(
1616
this ResourceName name,
17-
ResourceConfig<VirtualNetwork> virtualNetwork,
17+
ChildResourceConfig<Subnet, VirtualNetwork> subnet,
1818
ResourceConfig<NetworkSecurityGroup> networkSecurityGroup,
1919
ResourceConfig<PublicIPAddress> publicIPAddress)
20-
=> Policy.CreateResourceConfig(
20+
=> Policy.CreateConfig(
2121
name,
2222
state => new NetworkInterface
2323
{
2424
IpConfigurations = new[]
2525
{
2626
new NetworkInterfaceIPConfiguration
2727
{
28+
Subnet = new Subnet
29+
{
30+
Id = state.Get(subnet).Id
31+
},
2832
PublicIPAddress = new PublicIPAddress
2933
{
30-
Id = state.GetInfo(publicIPAddress).Id
34+
Id = state.Get(publicIPAddress).Id
3135
}
3236
}
3337
},
3438
NetworkSecurityGroup = new NetworkSecurityGroup
3539
{
36-
Id = state.GetInfo(networkSecurityGroup).Id
40+
Id = state.Get(networkSecurityGroup).Id
3741
}
3842
},
39-
new IResourceConfig[] { virtualNetwork, networkSecurityGroup, publicIPAddress });
43+
new IResourceConfig[] { networkSecurityGroup, publicIPAddress },
44+
new[] { subnet });
4045
}
4146
}

experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public static class NetworkSecurityGroupPolicy
1414

1515
public static ResourceConfig<NetworkSecurityGroup> CreateNetworkSecurityGroupConfig(
1616
this ResourceName name)
17-
=> Policy.CreateResourceConfig(name, _ => new NetworkSecurityGroup());
17+
=> Policy.CreateConfig(name, _ => new NetworkSecurityGroup());
1818
}
1919
}

experiments/Azure.Experiments/Azure.Experiments/Network/PublicIPAddressPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public static class PublicIPAddressPolicy
1414

1515
public static ResourceConfig<PublicIPAddress> CreatePublicIPAddressConfig(
1616
this ResourceName name)
17-
=> Policy.CreateResourceConfig(name, _ => new PublicIPAddress());
17+
=> Policy.CreateConfig(name, _ => new PublicIPAddress());
1818
}
1919
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.Azure.Management.Network.Models;
2+
using System.Linq;
3+
4+
namespace Microsoft.Azure.Experiments.Network
5+
{
6+
public static class SubnetPolicy
7+
{
8+
public static ChildResourcePolicy<Subnet, VirtualNetwork> Policy { get; }
9+
= ChildResourcePolicy.Create<Subnet, VirtualNetwork>(
10+
(p, name) => p.Subnets.FirstOrDefault(s => s.Name == name),
11+
(p, subnet) => p.Subnets = p.Subnets.Concat(new[] { subnet }).ToArray());
12+
13+
public static ChildResourceConfig<Subnet, VirtualNetwork> CreateSubnetConfig(
14+
ResourceConfig<VirtualNetwork> virtualNetwork, string name)
15+
=> Policy.CreateConfig(virtualNetwork, name);
16+
}
17+
}

experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public static class VirtualNetworkPolicy
1414

1515
public static ResourceConfig<VirtualNetwork> CreateVirtualNetworkConfig(
1616
this ResourceName name)
17-
=> Policy.CreateResourceConfig(name, _ => new VirtualNetwork());
17+
=> Policy.CreateConfig(name, _ => new VirtualNetwork());
1818
}
1919
}

experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,19 @@ public interface IResourceConfig<Info> : IResourceConfig
1313

1414
public static class ResourceConfig
1515
{
16-
public static ResourceConfig<Info> CreateResourceConfig<Info>(
16+
public static ResourceConfig<Info> CreateConfig<Info>(
1717
this ResourcePolicy<Info> policy,
1818
ResourceName name,
1919
Func<IState, Info> info,
20-
IEnumerable<IResourceConfig> dependencies = null)
20+
IEnumerable<IResourceConfig> resources = null,
21+
IEnumerable<IChildResourceConfig> childResources = null)
2122
where Info : class
22-
=> new ResourceConfig<Info>(policy, name, info, dependencies.EmptyIfNull());
23+
=> new ResourceConfig<Info>(
24+
policy,
25+
name,
26+
info,
27+
resources.EmptyIfNull(),
28+
childResources.EmptyIfNull());
2329
}
2430

2531
public sealed class ResourceConfig<Info> : IResourceConfig<Info>
@@ -31,18 +37,22 @@ public sealed class ResourceConfig<Info> : IResourceConfig<Info>
3137

3238
public Func<IState, Info> CreateInfo { get; }
3339

34-
public IEnumerable<IResourceConfig> Dependencies { get; }
40+
public IEnumerable<IResourceConfig> Resources { get; }
41+
42+
public IEnumerable<IChildResourceConfig> ChildResources { get; }
3543

3644
public ResourceConfig(
3745
ResourcePolicy<Info> policy,
3846
ResourceName name,
3947
Func<IState, Info> createInfo,
40-
IEnumerable<IResourceConfig> dependencies)
48+
IEnumerable<IResourceConfig> resources,
49+
IEnumerable<IChildResourceConfig> childResources)
4150
{
4251
Policy = policy;
4352
Name = name;
4453
CreateInfo = createInfo;
45-
Dependencies = dependencies;
54+
Resources = resources;
55+
ChildResources = childResources;
4656
}
4757
}
4858
}

0 commit comments

Comments
 (0)