From e5822895ef9de49da4a244d3107ed87e3b172888 Mon Sep 17 00:00:00 2001 From: Sergey Shandar Date: Fri, 3 Nov 2017 14:03:29 -0700 Subject: [PATCH] policies --- .../Compute/VirtualMachineConfig.cs | 29 ------ .../Azure.Experiments/IResourcePolicy.cs | 22 +++++ .../Azure.Experiments/IStateMap.cs | 8 -- .../Azure.Experiments/Location.cs | 19 ---- .../Azure.Experiments/LocationExtensions.cs | 24 ----- .../ManagedResourceConfig.cs | 27 ------ .../Network/NetworkInterfaceConfig.cs | 23 ----- .../Network/NetworkResourceConfig.cs | 26 ------ .../Network/NetworkSecurityGroupConfig.cs | 19 ---- .../Network/PublicIpAddressConfig.cs | 22 ----- .../Azure.Experiments/Network/SubnetConfig.cs | 19 ---- .../Network/VirtualNetworkConfig.cs | 19 ---- .../Azure.Experiments/ResourceConfig.cs | 74 --------------- .../Azure.Experiments/ResourceGroupConfig.cs | 18 ---- .../Azure.Experiments/States.cs | 92 ------------------- 15 files changed, 22 insertions(+), 419 deletions(-) delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineConfig.cs create mode 100644 experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/IStateMap.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Location.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/LocationExtensions.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/ManagedResourceConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/NetworkResourceConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/SubnetConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/ResourceGroupConfig.cs delete mode 100644 experiments/Azure.Experiments/Azure.Experiments/States.cs diff --git a/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineConfig.cs deleted file mode 100644 index dc54df72535c..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Compute/VirtualMachineConfig.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.Azure.Management.Compute; -using Microsoft.Azure.Management.Compute.Models; -using Microsoft.Azure.Management.Network.Models; -using Microsoft.Azure.Management.ResourceManager.Models; - -namespace Microsoft.Azure.Experiments.Compute -{ - public static class VirtualMachineConfig - { - public static ResourceConfig Create( - string name, - ResourceConfig resourceGroup, - ResourceConfig networkInterface) - => ManagedResourceConfig.Create( - resourceGroup, - name, - new[] { networkInterface }, - c => c - .CreateComputeManagementClient() - .VirtualMachines - .GetAsync(resourceGroup.Name, name), - c => c.Location, - (c, location) => c - .CreateComputeManagementClient() - .VirtualMachines - .CreateOrUpdateAsync( - resourceGroup.Name, name, new VirtualMachine { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs b/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs new file mode 100644 index 000000000000..2e3936c19beb --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/IResourcePolicy.cs @@ -0,0 +1,22 @@ +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/IStateMap.cs b/experiments/Azure.Experiments/Azure.Experiments/IStateMap.cs deleted file mode 100644 index 8b4eca0fd98e..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/IStateMap.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Microsoft.Azure.Experiments -{ - public interface IStateMap - { - I Get(ResourceConfig config) - where I : class; - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Location.cs b/experiments/Azure.Experiments/Azure.Experiments/Location.cs deleted file mode 100644 index ffbd22ef8494..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Location.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Microsoft.Azure.Experiments -{ - /// - /// null is no prefered location - /// { IsCommon = ...; Name = null } is a location conflict. - /// - public sealed class Location - { - public bool IsCommon { get; } - - public string Name { get; } - - public Location(bool isCommon, string name) - { - IsCommon = isCommon; - Name = name; - } - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/LocationExtensions.cs b/experiments/Azure.Experiments/Azure.Experiments/LocationExtensions.cs deleted file mode 100644 index 99c4cbb186f7..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/LocationExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Microsoft.Azure.Experiments -{ - public static class LocationExtensions - { - public static Location Merge(this Location a, Location b) - { - if (a == null) - { - return b; - } - if (b == null) - { - return a; - } - - if (a.IsCommon != b.IsCommon) - { - return a.IsCommon ? b : a; - } - - return a.Name == b.Name ? a : new Location(a.IsCommon, null); - } - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ManagedResourceConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/ManagedResourceConfig.cs deleted file mode 100644 index f199b6614846..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/ManagedResourceConfig.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.Azure.Management.ResourceManager.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments -{ - public static class ManagedResourceConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, - string name, - IEnumerable dependencies, - Func> getAsync, - Func getLocation, - Func> createAsync) - where I : class - => ResourceConfig.Create( - name, - dependencies.Concat(new[] { resourceGroup }), - getAsync, - i => new Location(true, getLocation(i)), - (map, config) => map.Get(config), - createAsync); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceConfig.cs deleted file mode 100644 index 448679d953e2..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfaceConfig.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.Azure.Management.Network; -using Microsoft.Azure.Management.Network.Models; -using Microsoft.Azure.Management.ResourceManager.Models; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class NetworkInterfaceConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, - string name, - ResourceConfig subnet, - ResourceConfig publicIpAddress, - ResourceConfig networkSecurityGroup) - => NetworkResourceConfig.Create( - resourceGroup, - name, - new IResourceConfig[] { subnet, publicIpAddress, networkSecurityGroup }, - c => c.NetworkInterfaces.GetAsync(resourceGroup.Name, name), - (c, location) => c.NetworkInterfaces.CreateOrUpdateAsync( - resourceGroup.Name, name, new NetworkInterface { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkResourceConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkResourceConfig.cs deleted file mode 100644 index ce4c8d317aa8..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkResourceConfig.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Microsoft.Azure.Management.Network; -using Microsoft.Azure.Management.ResourceManager.Models; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class NetworkResourceConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, - string name, - IEnumerable dependencies, - Func> getAsync, - Func> createAsync) - where I : Management.Network.Models.Resource - => ManagedResourceConfig.Create( - resourceGroup, - name, - dependencies, - c => getAsync(c.CreateNetworkManagementClient()), - i => i.Location, - (c, location) => createAsync(c.CreateNetworkManagementClient(), location)); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupConfig.cs deleted file mode 100644 index 666f39e7b990..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/NetworkSecurityGroupConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.Azure.Management.Network; -using Microsoft.Azure.Management.Network.Models; -using Microsoft.Azure.Management.ResourceManager.Models; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class NetworkSecurityGroupConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, string name) - => NetworkResourceConfig.Create( - resourceGroup, - name, - new IResourceConfig[] { }, - c => c.NetworkSecurityGroups.GetAsync(resourceGroup.Name, name), - (c, location) => c.NetworkSecurityGroups.CreateOrUpdateAsync( - resourceGroup.Name, name, new NetworkSecurityGroup { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressConfig.cs deleted file mode 100644 index 7fbdde5b43ce..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/PublicIpAddressConfig.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Azure.Management.Network; -using Microsoft.Azure.Management.Network.Models; -using Microsoft.Azure.Management.ResourceManager.Models; -using System; -using System.Collections.Generic; -using System.Text; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class PublicIpAddressConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, string name) - => NetworkResourceConfig.Create( - resourceGroup, - name, - new IResourceConfig[] { }, - c => c.PublicIPAddresses.GetAsync(resourceGroup.Name, name), - (c, location) => c.PublicIPAddresses.CreateOrUpdateAsync( - resourceGroup.Name, name, new PublicIPAddress { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetConfig.cs deleted file mode 100644 index e8fb01c5e78b..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/SubnetConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.Azure.Management.Network.Models; -using System.Linq; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class SubnetConfig - { - public static ResourceConfig Create( - string name, ResourceConfig virtualNetwork) - => ResourceConfig.Create( - name, - new[] { virtualNetwork }, - _ => Task.FromResult(null), - null, - (map, _) => map.Get(virtualNetwork)?.Subnets?.FirstOrDefault(v => v.Name == name), - (_0, _1) => null); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkConfig.cs deleted file mode 100644 index d55f3f27d130..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/Network/VirtualNetworkConfig.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.Azure.Management.Network; -using Microsoft.Azure.Management.Network.Models; -using Microsoft.Azure.Management.ResourceManager.Models; - -namespace Microsoft.Azure.Experiments.Network -{ - public static class VirtualNetworkConfig - { - public static ResourceConfig Create( - ResourceConfig resourceGroup, string name) - => NetworkResourceConfig.Create( - resourceGroup, - name, - new IResourceConfig[] { }, - c => c.VirtualNetworks.GetAsync(resourceGroup.Name, name), - (c, location) => c.VirtualNetworks.CreateOrUpdateAsync( - resourceGroup.Name, name, new VirtualNetwork { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs deleted file mode 100644 index 5b011cf6b5be..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/ResourceConfig.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments -{ - public interface IResourceConfig - { - string Name { get; } - - IEnumerable Dependencies { get; } - - Task GetAsync(Context context); - - Location GetLocation(object i); - - object GetState(IStateMap getState); - - Task CreateAsync(Context context, string location); - } - - public static class ResourceConfig - { - public static ResourceConfig Create( - string name, - IEnumerable dependencies, - Func> getAsync, - Func getLocation, - Func, I> getState, - Func> createAsync) - => new ResourceConfig( - name, dependencies, getAsync, getLocation, getState, createAsync); - } - - public sealed class ResourceConfig : IResourceConfig - { - public string Name { get; } - - public IEnumerable Dependencies { get; } - - public ResourceConfig( - string name, - IEnumerable dependencies, - Func> getAsyncFunc, - Func getLocationFunc, - Func, I> getStateFunc, - Func> createAsyncFunc) - { - Name = name; - Dependencies = dependencies; - GetAsyncFunc = getAsyncFunc; - GetLocationFunc = getLocationFunc; - GetStateFunc = getStateFunc; - CreateAsyncFunc = createAsyncFunc; - } - - public async Task GetAsync(Context context) => await GetAsyncFunc(context); - - public Location GetLocation(object i) => GetLocationFunc((I)i); - - public object GetState(IStateMap stateMap) => GetStateFunc(stateMap, this); - - public async Task CreateAsync(Context context, string location) - => await CreateAsyncFunc(context, location); - - private Func> GetAsyncFunc { get; } - - private Func GetLocationFunc { get; } - - public Func, I> GetStateFunc { get; } - - private Func> CreateAsyncFunc { get; } - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/ResourceGroupConfig.cs b/experiments/Azure.Experiments/Azure.Experiments/ResourceGroupConfig.cs deleted file mode 100644 index 7a3cf9bd5876..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/ResourceGroupConfig.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.Azure.Management.ResourceManager; -using Microsoft.Azure.Management.ResourceManager.Models; - -namespace Microsoft.Azure.Experiments -{ - public static class ResourceGroupConfig - { - public static ResourceConfig Create(string name) - => ResourceConfig.Create( - name, - new IResourceConfig[] { }, - c => c.CreateResourceManagementClient().ResourceGroups.GetAsync(name), - i => new Location(false, i.Location), - (map, config) => map.Get(config), - (c, location) => c.CreateResourceManagementClient().ResourceGroups.CreateOrUpdateAsync( - name, new ResourceGroup { Location = location })); - } -} diff --git a/experiments/Azure.Experiments/Azure.Experiments/States.cs b/experiments/Azure.Experiments/Azure.Experiments/States.cs deleted file mode 100644 index 95f9ed530d22..000000000000 --- a/experiments/Azure.Experiments/Azure.Experiments/States.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Microsoft.Rest.Azure; -using System.Collections.Concurrent; -using System.Linq; -using System.Net; -using System.Threading.Tasks; - -namespace Microsoft.Azure.Experiments -{ - public sealed class States - { - public static async Task CreateAsync( - Context context, IResourceConfig config) - { - var mapContext = new MapContext(context); - await mapContext.UpdateStateAsync(config); - return new States(new StateMap(mapContext.ResultMap)); - } - - public T Get(ResourceConfig config) - where T : class - => config.GetStateFunc(Map, config); - - public Location GetLocation() - => Map - .Map - .Select(v => v.Key.GetLocation(v.Value)) - .Aggregate((Location)null, LocationExtensions.Merge); - - private States(StateMap map) - { - Map = map; - } - - private sealed class StateMap : IStateMap - { - public I Get(ResourceConfig config) - where I : class - => Map.TryGetValue(config, out var result) ? result as I : null; - - public StateMap(ConcurrentDictionary map) - { - Map = map; - } - - public ConcurrentDictionary Map { get; } - } - - private StateMap Map { get; } - - private sealed class MapContext - { - public ConcurrentDictionary ResultMap { get; } - = new ConcurrentDictionary(); - - public MapContext(Context context) - { - Context = context; - } - - public async Task UpdateStateAsync(IResourceConfig config) - { - var result = await TaskMap.GetOrAdd( - config, - async c => - { - try - { - return await c.GetAsync(Context); - } - catch (CloudException e) when (e.Response.StatusCode == HttpStatusCode.NotFound) - { - return null; - } - }); - if (result != null) - { - ResultMap.GetOrAdd(config, result); - } - else - { - var taskSet = config.Dependencies.Select(UpdateStateAsync); - await Task.WhenAll(taskSet); - } - } - - private ConcurrentDictionary> TaskMap { get; } - = new ConcurrentDictionary>(); - - private Context Context { get; } - } - } -}