Skip to content

Commit

Permalink
ChildResourceConfig
Browse files Browse the repository at this point in the history
  • Loading branch information
sergey-shandar committed Nov 9, 2017
1 parent ccb9d0e commit a4aeca6
Show file tree
Hide file tree
Showing 10 changed files with 121 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
namespace Microsoft.Azure.Experiments
{
public interface IChildResourceConfig
{
}

public interface IChildResourceConfig<Info> : IChildResourceConfig
{
}

public static class ChildResourceConfig
{
public static ChildResourceConfig<Info, ParentInfo> CreateConfig<Info, ParentInfo>(
this ChildResourcePolicy<Info, ParentInfo> policy,
ResourceConfig<ParentInfo> parent,
string name)
where Info : class
where ParentInfo : class
=> new ChildResourceConfig<Info, ParentInfo>(policy, parent, name);
}

public sealed class ChildResourceConfig<Info, ParentInfo> : IChildResourceConfig<Info>
where Info : class
where ParentInfo : class
{
public ChildResourcePolicy<Info, ParentInfo> Policy { get; }

public ResourceConfig<ParentInfo> Parent { get; }

public string Name { get; }

public ChildResourceConfig(
ChildResourcePolicy<Info, ParentInfo> policy,
ResourceConfig<ParentInfo> parent,
string name)
{
Policy = policy;
Parent = parent;
Name = name;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System;

namespace Microsoft.Azure.Experiments
{
public static class ChildResourcePolicy
{
public static ChildResourcePolicy<Info, ParentInfo> Create<Info, ParentInfo>(
Func<ParentInfo, string, Info> get,
Action<ParentInfo, Info> set)
where Info : class
where ParentInfo : class
=> new ChildResourcePolicy<Info, ParentInfo>(get, set);
}

public sealed class ChildResourcePolicy<Info, ParentInfo>
where Info : class
where ParentInfo : class
{
public Func<ParentInfo, string, Info> Get { get; }

public Action<ParentInfo, Info> Set { get; }

public ChildResourcePolicy(
Func<ParentInfo, string, Info> get, Action<ParentInfo, Info> set)
{
Get = get;
Set = set;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public static class VirtualMachinePolicy
public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
this ResourceName name,
ResourceConfig<NetworkInterface> networkInterface)
=> Policy.CreateResourceConfig(
=> Policy.CreateConfig(
name,
_ => new VirtualMachine(),
new[] { networkInterface });
Expand Down
3 changes: 2 additions & 1 deletion experiments/Azure.Experiments/Azure.Experiments/IState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{
public interface IState
{
T GetInfo<T>(IResourceConfig<T> resourceConfig);
T Get<T>(IResourceConfig<T> resourceConfig);
T Get<T>(IChildResourceConfig<T> childResourceConfig);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,28 +14,33 @@ public static class NetworkInterfacePolicy

public static ResourceConfig<NetworkInterface> CreateNetworkInterfaceConfig(
this ResourceName name,
ResourceConfig<VirtualNetwork> virtualNetwork,
ChildResourceConfig<Subnet, VirtualNetwork> subnet,
ResourceConfig<NetworkSecurityGroup> networkSecurityGroup,
ResourceConfig<PublicIPAddress> publicIPAddress)
=> Policy.CreateResourceConfig(
=> Policy.CreateConfig(
name,
state => new NetworkInterface
{
IpConfigurations = new[]
{
new NetworkInterfaceIPConfiguration
{
Subnet = new Subnet
{
Id = state.Get(subnet).Id
},
PublicIPAddress = new PublicIPAddress
{
Id = state.GetInfo(publicIPAddress).Id
Id = state.Get(publicIPAddress).Id
}
}
},
NetworkSecurityGroup = new NetworkSecurityGroup
{
Id = state.GetInfo(networkSecurityGroup).Id
Id = state.Get(networkSecurityGroup).Id
}
},
new IResourceConfig[] { virtualNetwork, networkSecurityGroup, publicIPAddress });
new IResourceConfig[] { networkSecurityGroup, publicIPAddress },
new[] { subnet });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public static class NetworkSecurityGroupPolicy

public static ResourceConfig<NetworkSecurityGroup> CreateNetworkSecurityGroupConfig(
this ResourceName name)
=> Policy.CreateResourceConfig(name, _ => new NetworkSecurityGroup());
=> Policy.CreateConfig(name, _ => new NetworkSecurityGroup());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public static class PublicIPAddressPolicy

public static ResourceConfig<PublicIPAddress> CreatePublicIPAddressConfig(
this ResourceName name)
=> Policy.CreateResourceConfig(name, _ => new PublicIPAddress());
=> Policy.CreateConfig(name, _ => new PublicIPAddress());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Microsoft.Azure.Management.Network.Models;
using System.Linq;

namespace Microsoft.Azure.Experiments.Network
{
public static class SubnetPolicy
{
public static ChildResourcePolicy<Subnet, VirtualNetwork> Policy { get; }
= ChildResourcePolicy.Create<Subnet, VirtualNetwork>(
(p, name) => p.Subnets.FirstOrDefault(s => s.Name == name),
(p, subnet) => p.Subnets = p.Subnets.Concat(new[] { subnet }).ToArray());

public static ChildResourceConfig<Subnet, VirtualNetwork> CreateSubnetConfig(
ResourceConfig<VirtualNetwork> virtualNetwork, string name)
=> Policy.CreateConfig(virtualNetwork, name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ public static class VirtualNetworkPolicy

public static ResourceConfig<VirtualNetwork> CreateVirtualNetworkConfig(
this ResourceName name)
=> Policy.CreateResourceConfig(name, _ => new VirtualNetwork());
=> Policy.CreateConfig(name, _ => new VirtualNetwork());
}
}
22 changes: 16 additions & 6 deletions experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,19 @@ public interface IResourceConfig<Info> : IResourceConfig

public static class ResourceConfig
{
public static ResourceConfig<Info> CreateResourceConfig<Info>(
public static ResourceConfig<Info> CreateConfig<Info>(
this ResourcePolicy<Info> policy,
ResourceName name,
Func<IState, Info> info,
IEnumerable<IResourceConfig> dependencies = null)
IEnumerable<IResourceConfig> resources = null,
IEnumerable<IChildResourceConfig> childResources = null)
where Info : class
=> new ResourceConfig<Info>(policy, name, info, dependencies.EmptyIfNull());
=> new ResourceConfig<Info>(
policy,
name,
info,
resources.EmptyIfNull(),
childResources.EmptyIfNull());
}

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

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

public IEnumerable<IResourceConfig> Dependencies { get; }
public IEnumerable<IResourceConfig> Resources { get; }

public IEnumerable<IChildResourceConfig> ChildResources { get; }

public ResourceConfig(
ResourcePolicy<Info> policy,
ResourceName name,
Func<IState, Info> createInfo,
IEnumerable<IResourceConfig> dependencies)
IEnumerable<IResourceConfig> resources,
IEnumerable<IChildResourceConfig> childResources)
{
Policy = policy;
Name = name;
CreateInfo = createInfo;
Dependencies = dependencies;
Resources = resources;
ChildResources = childResources;
}
}
}

0 comments on commit a4aeca6

Please sign in to comment.