Skip to content

Commit

Permalink
CreateConfig for different resources
Browse files Browse the repository at this point in the history
  • Loading branch information
sergey-shandar committed Nov 9, 2017
1 parent 6d8b26f commit 0b84a5e
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Experiments.ResourceManager;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using Microsoft.Azure.Management.Network.Models;
using Microsoft.Azure.Management.ResourceManager.Models;
using System;
using System.Threading.Tasks;

Expand All @@ -11,7 +14,7 @@ public static ResourcePolicy<ResourceName, Info> Create<Operations, Info>(
Func<IComputeManagementClient, Operations> getOperations,
Func<Operations, ResourceName, Task<Info>> getAsync,
Func<Operations, ResourceName, Info, Task<Info>> createOrUpdateAsync)
where Info : Resource
where Info : Management.Compute.Models.Resource
=> OperationsPolicy
.Create(getAsync, createOrUpdateAsync)
.Transform(getOperations)
Expand All @@ -24,5 +27,15 @@ public static ResourcePolicy<ResourceName, VirtualMachine> VirtualMachine
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourceConfig<ResourceName, VirtualMachine> CreateVirtualMachineConfig(
this ResourceConfig<string, ResourceGroup> resourceGroup,
string name,
ResourceConfig<ResourceName, NetworkInterface> networkInterface)
=> resourceGroup.CreateResourceConfig(
VirtualMachine,
name,
new VirtualMachine(),
new [] { networkInterface });
}
}
11 changes: 11 additions & 0 deletions experiments/Azure.Experiments/Azure.Experiments/EnumerableEx.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using System.Linq;

namespace Microsoft.Azure.Experiments
{
public static class EnumerableEx
{
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> value)
=> value == null ? Enumerable.Empty<T>() : value;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Microsoft.Azure.Management.Network;
using Microsoft.Azure.Experiments.ResourceManager;
using Microsoft.Azure.Management.Network;
using Microsoft.Azure.Management.Network.Models;
using Microsoft.Azure.Management.ResourceManager.Models;
using System;
using System.Threading.Tasks;

Expand All @@ -11,38 +13,65 @@ public static ResourcePolicy<ResourceName, Info> Create<Operations, Info>(
Func<INetworkManagementClient, Operations> getOperations,
Func<Operations, ResourceName, Task<Info>> getAsync,
Func<Operations, ResourceName, Info, Task<Info>> createOrUpdateAsync)
where Info : Resource
where Info : Management.Network.Models.Resource
=> OperationsPolicy
.Create(getAsync, createOrUpdateAsync)
.Transform(getOperations)
.CreateResourcePolicy(i => i.Location, (i, location) => i.Location = location);

public static ResourcePolicy<ResourceName, NetworkInterface> NetworkInterface { get; }
= Create(
client => client.NetworkInterfaces,
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourcePolicy<ResourceName, NetworkSecurityGroup> NetworkSecurityGroup { get; }
= Create(
client => client.NetworkSecurityGroups,
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourcePolicy<ResourceName, PublicIPAddress> PublicIPAddresss { get; }
public static ResourceConfig<ResourceName, NetworkSecurityGroup> CreateNetworkSecurityGroupConfig(
this ResourceConfig<string, ResourceGroup> resourceGroup,
string name)
=> resourceGroup.CreateResourceConfig(NetworkSecurityGroup, name, new NetworkSecurityGroup());

public static ResourcePolicy<ResourceName, PublicIPAddress> PublicIPAddress { get; }
= Create(
client => client.PublicIPAddresses,
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourceConfig<ResourceName, PublicIPAddress> CreatePublicIPAddressConfig(
this ResourceConfig<string, ResourceGroup> resourceGroup,
string name)
=> resourceGroup.CreateResourceConfig(PublicIPAddress, name, new PublicIPAddress());

public static ResourcePolicy<ResourceName, VirtualNetwork> VirtualNetwork { get; }
= Create(
client => client.VirtualNetworks,
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourceConfig<ResourceName, VirtualNetwork> CreateVirtualNetworkConfig(
this ResourceConfig<string, ResourceGroup> resourceGroup,
string name)
=> resourceGroup.CreateResourceConfig(VirtualNetwork, name, new VirtualNetwork());

public static ResourcePolicy<ResourceName, NetworkInterface> NetworkInterface { get; }
= Create(
client => client.NetworkInterfaces,
(operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name),
(operations, name, info)
=> operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info));

public static ResourceConfig<ResourceName, NetworkInterface> CreateNetworkInterfaceConfig(
this ResourceConfig<string, ResourceGroup> resourceGroup,
string name,
ResourceConfig<ResourceName, VirtualNetwork> virtualNetwork,
ResourceConfig<ResourceName, NetworkSecurityGroup> networkSecurityGroup,
ResourceConfig<ResourceName, PublicIPAddress> publicIPAddress)
=> resourceGroup.CreateResourceConfig(
NetworkInterface,
name,
new NetworkInterface(),
new IResourceConfig[] { virtualNetwork, networkSecurityGroup, publicIPAddress });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ public static ResourceConfig<Name, Info> CreateResourceConfig<Name, Info>(
this ResourcePolicy<Name, Info> policy,
Name name,
Info info,
IEnumerable<IResourceConfig> dependencies)
IEnumerable<IResourceConfig> dependencies = null)
where Info : class
=> new ResourceConfig<Name, Info>(policy, name, info, dependencies);
=> new ResourceConfig<Name, Info>(policy, name, info, dependencies.EmptyIfNull());
}

public sealed class ResourceConfig<TName, TInfo>
public sealed class ResourceConfig<TName, TInfo> : IResourceConfig
where TInfo : class
{
public ResourcePolicy<TName, TInfo> Policy { get; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Microsoft.Azure.Management.ResourceManager;
using Microsoft.Azure.Management.ResourceManager.Models;
using System.Collections.Generic;
using System.Linq;

namespace Microsoft.Azure.Experiments.ResourceManager
{
Expand All @@ -12,5 +14,20 @@ public static class ResourceManagerPolicy
(operations, name, info) => operations.CreateOrUpdateAsync(name, info))
.Transform<IResourceManagementClient>(r => r.ResourceGroups)
.CreateResourcePolicy(i => i.Location, (i, location) => i.Location = location);

public static ResourceConfig<string, ResourceGroup> CreateResourceGroupConfig(string name)
=> ResourceGroup.CreateResourceConfig(name, new ResourceGroup());

public static ResourceConfig<ResourceName, Info> CreateResourceConfig<Info>(
this ResourceConfig<string, ResourceGroup> resourceGroup,
ResourcePolicy<ResourceName, Info> policy,
string name,
Info info,
IEnumerable<IResourceConfig> dependencies = null)
where Info : class
=> policy.CreateResourceConfig(
new ResourceName(resourceGroup.Name, name),
info,
dependencies.EmptyIfNull().Concat(new[] { resourceGroup }));
}
}

0 comments on commit 0b84a5e

Please sign in to comment.