diff --git a/experiments/Azure.Experiments/Azure.Experiments/CreateTask.cs b/experiments/Azure.Experiments/Azure.Experiments/CreateTask.cs new file mode 100644 index 000000000000..6d6af36149e0 --- /dev/null +++ b/experiments/Azure.Experiments/Azure.Experiments/CreateTask.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Microsoft.Azure.Experiments +{ + public interface ICreateTask + { + } + + public sealed class CreateTask : ICreateTask + { + public IEnumerable Subtasks { get; } + + public CreateTask(IEnumerable subtasks) + { + Subtasks = subtasks; + } + } +} diff --git a/experiments/Azure.Experiments/Azure.Experiments/IState.cs b/experiments/Azure.Experiments/Azure.Experiments/IState.cs index 09d75cc82a15..1ed1c67794a2 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/IState.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/IState.cs @@ -5,9 +5,12 @@ namespace Microsoft.Azure.Experiments public interface IState { ResourceGroup GetResourceGroup(string name); + T Get(ResourceConfig resourceConfig) where T : class; - T Get(IChildResourceConfig childResourceConfig) - where T : class; + + T Get(ChildResourceConfig childResourceConfig) + where T : class + where P : class; } } diff --git a/experiments/Azure.Experiments/Azure.Experiments/StateMap.cs b/experiments/Azure.Experiments/Azure.Experiments/State.cs similarity index 54% rename from experiments/Azure.Experiments/Azure.Experiments/StateMap.cs rename to experiments/Azure.Experiments/Azure.Experiments/State.cs index ce7c9cde6443..2357e421bf10 100644 --- a/experiments/Azure.Experiments/Azure.Experiments/StateMap.cs +++ b/experiments/Azure.Experiments/Azure.Experiments/State.cs @@ -9,22 +9,39 @@ namespace Microsoft.Azure.Experiments { - public sealed class StateMap : IState + public static class State { - public T Get(ResourceConfig resourceConfig) + public static async Task GetStateAsync(this IClient client, ResourceConfig config) where T : class - => Resources.TryGetValue(resourceConfig, out var result) ? (T)result : null; + { + var visitor = new GetAsyncVisitor(client); + await visitor.Visit(config); + return visitor.State; + } - public T Get(IChildResourceConfig childResourceConfig) - where T : class - => ChildResources.TryGetValue(childResourceConfig, out var result) ? (T)result : null; + sealed class Result : IState + { + public T Get(ResourceConfig resourceConfig) + where T : class + => Resources.TryGetValue(resourceConfig, out var result) ? (T)result : null; - public ResourceGroup GetResourceGroup(string name) - => ResourceGroups.TryGetValue(name, out var result) ? result : null; + public T Get(ChildResourceConfig config) + where T : class + where P : class + { + var parent = Get(config.Parent); + return parent == null ? null : config.Policy.Get(parent, config.Name); + } - public Task GetAsync(IClient client, ResourceConfig config) - where T : class - => new GetAsyncVisitor(this, client).Visit(config); + public ResourceGroup GetResourceGroup(string name) + => ResourceGroups.TryGetValue(name, out var result) ? result : null; + + public ConcurrentDictionary ResourceGroups { get; } + = new ConcurrentDictionary(); + + public ConcurrentDictionary Resources { get; } + = new ConcurrentDictionary(); + } static async Task HandleNotFoundException(Func> f) where T : class @@ -44,9 +61,10 @@ sealed class GetAsyncVisitor : IResourceConfigVisitor, IChildResourceConfigVisitor { - public GetAsyncVisitor(StateMap map, IClient client) + public Result State { get; } = new Result(); + + public GetAsyncVisitor(IClient client) { - State = map; Client = client; } @@ -67,10 +85,9 @@ public async Task GetResourceGroupAsync(string name) return result; }); - public async Task GetResourceAsync(ResourceConfig config) + public async Task Visit(ResourceConfig config) where Info : class - { - var result = await ResourcesTasks.GetOrAdd( + => await ResourcesTasks.GetOrAdd( config, async _ => { @@ -94,44 +111,11 @@ public async Task GetResourceAsync(ResourceConfig config) } return i; }); - return result as Info; - } - - public async Task Visit(ResourceConfig config) - where Info : class - => await GetResourceAsync(config); - /// - /// Get infromation about a child resource. - /// - /// - /// - /// - /// - public async Task Visit(ChildResourceConfig config) + public Task Visit(ChildResourceConfig config) where Info : class where ParentInfo : class - => await ChildResourcesTasks.GetOrAdd( - config, - async _ => - { - var parent = await GetResourceAsync(config.Parent); - if (parent != null) - { - var result = config.Policy.Get(parent, config.Name); - if (result != null) - { - State.ChildResources.GetOrAdd(config, result); - } - return result; - } - else - { - return null; - } - }); - - StateMap State { get; } + => Visit(config.Parent); IClient Client { get; } @@ -140,18 +124,6 @@ public async Task Visit(ChildResourceConfig ConcurrentDictionary> ResourcesTasks { get; } = new ConcurrentDictionary>(); - - ConcurrentDictionary> ChildResourcesTasks { get; } - = new ConcurrentDictionary>(); } - - ConcurrentDictionary ResourceGroups { get; } - = new ConcurrentDictionary(); - - ConcurrentDictionary Resources { get; } - = new ConcurrentDictionary(); - - ConcurrentDictionary ChildResources { get; } - = new ConcurrentDictionary(); } }