From b6437300c6469419e37c735a4dfd4a3c8ebd794f Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Thu, 9 Nov 2017 10:37:57 -0800 Subject: [PATCH] IClient --- .../Compute/ComputePolicy.cs | 28 ++++++++++ .../Azure.Experiments/IClient.cs | 9 ++++ .../Azure.Experiments/IResourcePolicy.cs | 22 -------- .../Network/NetworkPolicy.cs | 52 +++++++++++++++++++ .../Azure.Experiments/OperationsPolicy.cs | 33 ++++++++++++ .../Azure.Experiments/ResourceConfig.cs | 43 +++++++++++++++ .../ResourceManager/ResourceManagerPolicy.cs | 17 ++++++ .../Azure.Experiments/ResourceName.cs | 14 +++++ .../Azure.Experiments/ResourcePolicy.cs | 34 ++++++++++++ 9 files changed, 230 insertions(+), 22 deletions(-) create mode 100644 experiments/Azure.Experiments/Azure.Experiments/Compute/ComputePolicy.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/IClient.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/NetworkPolicy.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/OperationsPolicy.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourceManager/ResourceManagerPolicy.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourceName.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourcePolicy.cs diff --git a/experiments/Azure.Experiments/Azure.Experiments/Compute/ComputePolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/Compute/ComputePolicy.cs new file mode 100644 index 000000000000..d2b237d5b7dc --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/Compute/ComputePolicy.cs @@ -0,0 +1,28 @@ +using Microsoft.Azure.Management.Compute; +using Microsoft.Azure.Management.Compute.Models; +using System; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Experiments.Compute +{ + public static class ComputePolicy + { + public static ResourcePolicy Create( + Func getOperations, + Func> getAsync, + Func> createOrUpdateAsync) + where Info : Resource + => OperationsPolicy + .Create(getAsync, createOrUpdateAsync) + .Transform(getOperations) + .CreateResourcePolicy(i => i.Location, (i, location) => i.Location = location); + + public static ResourcePolicy VirtualMachine + { get; } + = Create( + client => client.VirtualMachines, + (operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name), + (operations, name, info) + => operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info)); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/IClient.cs b/experiments/Azure.Experiments/Azure.Experiments/IClient.cs new file mode 100644 index 000000000000..426a7d59281f --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/IClient.cs @@ -0,0 +1,9 @@ +namespace Microsoft.Azure.Experiments +{ + public interface IClient + { + Context Context { get; } + + T GetClient(); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs deleted file mode 100644 index 2e3936c19beb..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments -{ - interface IInfoMap - { - Info Get(IResourcePolicy info); - } - - interface IResourcePolicy - { - IEnumerable Dependencies { get; } - } - - interface IResourcePolicy : IResourcePolicy - { - string GetLocation(Info info); - Task Get(Context context, IInfoMap infoMap, string name); - Task CreateAsync(Context context, IInfoMap infoMap, Info info); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkPolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkPolicy.cs new file mode 100644 index 000000000000..4a6afafc60d8 --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkPolicy.cs @@ -0,0 +1,52 @@ +using Microsoft.Azure.Management.Network; +using Microsoft.Azure.Management.Network.Models; +using System; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Experiments.Network +{ + public static class NetworkPolicy + { + public static ResourcePolicy Create( + Func getOperations, + Func> getAsync, + Func> createOrUpdateAsync) + where Info : Resource + => OperationsPolicy + .Create(getAsync, createOrUpdateAsync) + .Transform(getOperations) + .CreateResourcePolicy(i => i.Location, (i, location) => i.Location = location); + + public static ResourcePolicy 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 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 PublicIPAddresss + { 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 ResourcePolicy VirtualNetwork + { get; } + = Create( + client => client.VirtualNetworks, + (operations, name) => operations.GetAsync(name.ResourceGroupName, name.Name), + (operations, name, info) + => operations.CreateOrUpdateAsync(name.ResourceGroupName, name.Name, info)); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/OperationsPolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/OperationsPolicy.cs new file mode 100644 index 000000000000..dc7a8db13cee --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/OperationsPolicy.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Experiments +{ + public static class OperationsPolicy + { + public static OperationsPolicy Create( + Func> getAsync, + Func> createOrUpdateAsync) + => new OperationsPolicy(getAsync, createOrUpdateAsync); + } + + public sealed class OperationsPolicy + { + public Func> GetAsync { get; } + + public Func> CreateOrUpdateAsync { get; } + + public OperationsPolicy( + Func> getAsync, + Func> createOrUpdateAsync) + { + GetAsync = getAsync; + CreateOrUpdateAsync = createOrUpdateAsync; + } + + public OperationsPolicy Transform(Func get) + => OperationsPolicy.Create( + (client, name) => GetAsync(get(client), name), + (client, name, info) => CreateOrUpdateAsync(get(client), name, info)); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs new file mode 100644 index 000000000000..cef3041f9c0f --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace Microsoft.Azure.Experiments +{ + public interface IResourceConfig + { + } + + public static class ResourceConfig + { + public static ResourceConfig CreateResourceConfig( + this ResourcePolicy policy, + Name name, + Info info, + IEnumerable dependencies) + where Info : class + => new ResourceConfig(policy, name, info, dependencies); + } + + public sealed class ResourceConfig + where TInfo : class + { + public ResourcePolicy Policy { get; } + + public TName Name { get; } + + public TInfo Info { get; } + + public IEnumerable Dependencies { get; } + + public ResourceConfig( + ResourcePolicy policy, + TName name, + TInfo info, + IEnumerable dependencies) + { + Policy = policy; + Name = name; + Info = info; + Dependencies = dependencies; + } + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourceManager/ResourceManagerPolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourceManager/ResourceManagerPolicy.cs new file mode 100644 index 000000000000..42d72dab4b67 --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/ResourceManager/ResourceManagerPolicy.cs @@ -0,0 +1,17 @@ +using Microsoft.Azure.Management.ResourceManager; +using Microsoft.Azure.Management.ResourceManager.Models; + +namespace Microsoft.Azure.Experiments.ResourceManager +{ + public static class ResourceManagerPolicy + { + public static ResourcePolicy ResourceGroup + { get; } + = OperationsPolicy + .Create( + (operations, name) => operations.GetAsync(name), + (operations, name, info) => operations.CreateOrUpdateAsync(name, info)) + .Transform(r => r.ResourceGroups) + .CreateResourcePolicy(i => i.Location, (i, location) => i.Location = location); + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourceName.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourceName.cs new file mode 100644 index 000000000000..6bfbc2c6e7aa --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/ResourceName.cs @@ -0,0 +1,14 @@ +namespace Microsoft.Azure.Experiments +{ + public sealed class ResourceName + { + public string ResourceGroupName { get; } + public string Name { get; } + + public ResourceName(string resourceGroupName, string name) + { + ResourceGroupName = resourceGroupName; + Name = name; + } + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourcePolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourcePolicy.cs new file mode 100644 index 000000000000..c3a7898142cb --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/ResourcePolicy.cs @@ -0,0 +1,34 @@ +using System; + +namespace Microsoft.Azure.Experiments +{ + public static class ResourcePolicy + { + public static ResourcePolicy CreateResourcePolicy( + this OperationsPolicy operationsPolicy, + Func getLocation, + Action setLocation) + where Info : class + => new ResourcePolicy(operationsPolicy, getLocation, setLocation); + } + + public sealed class ResourcePolicy + where Info : class + { + public OperationsPolicy OperationsPolicy { get; } + + public Func GetLocation { get; } + + public Action SetLocation { get; } + + public ResourcePolicy( + OperationsPolicy operationsPolicy, + Func getLocation, + Action setLocation) + { + OperationsPolicy = operationsPolicy; + GetLocation = getLocation; + SetLocation = setLocation; + } + } +}