Skip to content

Commit 27525ee

Browse files
it works! :-)
1 parent 381a986 commit 27525ee

12 files changed

+200
-10
lines changed

experiments/Azure.Experiments/Azure.Experiments/CreateOrUpdateAsyncOperation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public override async Task<object> Visit<Config, ParentConfig>(
4242
NestedResourceConfig<Config, ParentConfig> config)
4343
{
4444
var parent = await GetOrAdd(config.Parent);
45-
return config.Policy.Get(parent);
45+
return config.Policy.Get(parent, config.Name);
4646
}
4747

4848
public CreateAsyncVisitor(

experiments/Azure.Experiments/Azure.Experiments/GetAsyncOperation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public override async Task<object> Visit<Config, ParentConfig>(
4646
NestedResourceConfig<Config, ParentConfig> config)
4747
{
4848
var parent = await GetOrAdd(config.Parent);
49-
return parent == null ? null : config.Policy.Get(parent);
49+
return parent == null ? null : config.Policy.Get(parent, config.Name);
5050
}
5151

5252
public Visitor(IClient client, CancellationToken cancellationToken)

experiments/Azure.Experiments/Azure.Experiments/NestedResourceConfig.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44

55
namespace Microsoft.Azure.Experiments
66
{
7+
public static class NestedResourceConfig
8+
{
9+
public static NestedResourceConfig<Config, ParentConfig> CreateConfig<Config, ParentConfig>(
10+
this NestedResourcePolicy<Config, ParentConfig> policy,
11+
IResourceConfig<ParentConfig> parent,
12+
string name,
13+
Func<Config> create)
14+
where Config : class
15+
where ParentConfig : class
16+
=> new NestedResourceConfig<Config, ParentConfig>(policy, parent, name, create);
17+
}
18+
719
public sealed class NestedResourceConfig<Config, ParentConfig> : IResourceConfig<Config>
820
where Config : class
921
where ParentConfig : class

experiments/Azure.Experiments/Azure.Experiments/NestedResourcePolicy.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,32 @@ public sealed class NestedResourcePolicy<Config, ParentConfig> : IResourcePolicy
77
{
88
public Func<string, IEnumerable<string>> GetId { get; }
99

10-
public Func<ParentConfig, Config> Get { get; }
10+
public Func<ParentConfig, string, Config> Get { get; }
1111

12-
public Action<ParentConfig, Config> Set { get; }
12+
public Action<ParentConfig, string, Config> Set { get; }
1313

1414
public NestedResourcePolicy(
1515
Func<string, IEnumerable<string>> getId,
16-
Func<ParentConfig, Config> get,
17-
Action<ParentConfig, Config> set)
16+
Func<ParentConfig, string, Config> get,
17+
Action<ParentConfig, string, Config> set)
1818
{
1919
GetId = getId;
2020
Get = get;
2121
Set = set;
2222
}
2323
}
24+
25+
public static class NestedResourcePolicy
26+
{
27+
public static NestedResourcePolicy<Config, ParentConfig> Create<Config, ParentConfig>(
28+
string header,
29+
Func<ParentConfig, string, Config> get,
30+
Action<ParentConfig, string, Config> set)
31+
where Config : class
32+
where ParentConfig : class
33+
=> new NestedResourcePolicy<Config, ParentConfig>(
34+
name => new[] { header, name},
35+
get,
36+
set);
37+
}
2438
}

experiments/Azure.Experiments/Azure.Experiments/Network/NetworkInterfacePolicy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ public static class NetworkInterfacePolicy
1515
p => p.Operations.CreateOrUpdateAsync(
1616
p.ResourceGroupName, p.Name, p.Config, p.CancellationToken));
1717

18-
public static ResourceConfig<NetworkInterface> CreateNetworkSecurityGroupConfig(
18+
public static ResourceConfig<NetworkInterface> CreateNetworkInterfaceConfig(
1919
this ResourceConfig<ResourceGroup> resourceGroup,
2020
string name,
21-
ResourceConfig<Subnet> subnet,
21+
NestedResourceConfig<Subnet, VirtualNetwork> subnet,
2222
ResourceConfig<PublicIPAddress> publicIPAddress,
2323
ResourceConfig<NetworkSecurityGroup> networkSecurityGroup)
2424
=> Policy.CreateConfig(
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.Azure.Management.Network.Models;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace Microsoft.Azure.Experiments.Network
6+
{
7+
public static class SubnetPolicy
8+
{
9+
public static NestedResourcePolicy<Subnet, VirtualNetwork> Policy { get; }
10+
= NestedResourcePolicy.Create<Subnet, VirtualNetwork>(
11+
"subnets",
12+
(vn, name) => vn.Subnets?.FirstOrDefault(s => s.Name == name),
13+
(vn, name, subnet) =>
14+
{
15+
subnet.Name = name;
16+
if (vn.Subnets == null)
17+
{
18+
vn.Subnets = new List<Subnet> { subnet };
19+
return;
20+
}
21+
var s = vn
22+
.Subnets
23+
.Select((sn, i) => new { sn, i })
24+
.FirstOrDefault(p => p.sn.Name == name);
25+
if (s != null)
26+
{
27+
vn.Subnets[s.i] = subnet;
28+
return;
29+
}
30+
vn.Subnets.Add(subnet);
31+
});
32+
33+
public static NestedResourceConfig<Subnet, VirtualNetwork> CreateSubnet(
34+
this ResourceConfig<VirtualNetwork> virtualNetwork, string name, string addressPrefix)
35+
=> Policy.CreateConfig(
36+
virtualNetwork,
37+
name,
38+
() => new Subnet { Name = name, AddressPrefix = addressPrefix });
39+
}
40+
}

experiments/Azure.Experiments/Azure.Experiments/Parameters.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public Config Get<Config>(IResourceConfig<Config> config)
3030
where Config : class
3131
=> GetUntyped(config) as Config;
3232

33-
public object Visit<Config>(ResourceConfig<Config> config) where Config : class
33+
public object Visit<Config>(ResourceConfig<Config> config)
34+
where Config : class
3435
{
3536
foreach (var d in config.Dependencies)
3637
{
@@ -47,7 +48,7 @@ public object Visit<Config, ParentConfig>(
4748
where ParentConfig : class
4849
{
4950
var result = config.Create();
50-
config.Policy.Set(Get(config.Parent), result);
51+
config.Policy.Set(Get(config.Parent), config.Name, result);
5152
return result;
5253
}
5354

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Microsoft.Azure.Experiments.Network;
2+
using Microsoft.Azure.Experiments.ResourceManager;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Xunit;
6+
7+
namespace Microsoft.Azure.Experiments.Tests
8+
{
9+
public class NetworkInterfaceTest
10+
{
11+
[Fact]
12+
public async Task CreateAsyncTest()
13+
{
14+
var rg = ResourceGroupPolicy.CreateResourceGroupConfig("nirg");
15+
var vn = rg.CreateVirtualNetworkConfig("Vnni", "192.168.0.0/16");
16+
var sn = vn.CreateSubnet("mysubnet", "192.168.1.0/24");
17+
var pipa = rg.CreatePublicIPAddressConfig("pipani");
18+
var nsg = rg.CreateNetworkSecurityGroupConfig("nsgni");
19+
var ni = rg.CreateNetworkInterfaceConfig("ni", sn, pipa, nsg);
20+
21+
var client = new Client(Credentials.Get());
22+
var state = await ni.GetAsync(client, new CancellationToken());
23+
var location = state.GetLocation(rg);
24+
var parameters = ni.GetParameters(client.Context.SubscriptionId, "eastus");
25+
var nic = parameters.GetOrNull(ni);
26+
var createState = await ni.CreateOrUpdateAsync(
27+
client, state, parameters, new CancellationToken());
28+
var nicc = createState.GetOrNull(ni);
29+
Assert.Equal("eastus", nicc.Location);
30+
Assert.Equal("ni", nicc.Name);
31+
Assert.Equal(ni.GetId(client.Context.SubscriptionId).IdToString(), nicc.Id);
32+
}
33+
}
34+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Microsoft.Azure.Experiments.Network;
2+
using Microsoft.Azure.Experiments.ResourceManager;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Xunit;
6+
7+
namespace Microsoft.Azure.Experiments.Tests
8+
{
9+
public class NetworkSecurityGroupTest
10+
{
11+
[Fact]
12+
public async Task CreateAsyncTest()
13+
{
14+
var rg = ResourceGroupPolicy.CreateResourceGroupConfig("nsgrg");
15+
var vn = rg.CreateNetworkSecurityGroupConfig("nsg");
16+
var client = new Client(Credentials.Get());
17+
var state = await vn.GetAsync(client, new CancellationToken());
18+
var location = state.GetLocation(rg);
19+
var parameters = vn.GetParameters(client.Context.SubscriptionId, "eastus");
20+
var vnc = parameters.GetOrNull(vn);
21+
var createState = await vn.CreateOrUpdateAsync(
22+
client, state, parameters, new CancellationToken());
23+
var vncc = createState.GetOrNull(vn);
24+
Assert.Equal("eastus", vncc.Location);
25+
Assert.Equal("nsg", vncc.Name);
26+
Assert.Equal(vn.GetId(client.Context.SubscriptionId).IdToString(), vncc.Id);
27+
}
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Microsoft.Azure.Experiments.Network;
2+
using Microsoft.Azure.Experiments.ResourceManager;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Xunit;
6+
7+
namespace Microsoft.Azure.Experiments.Tests
8+
{
9+
public class PublicIPAddressTest
10+
{
11+
[Fact]
12+
public async Task CreateAsyncTest()
13+
{
14+
var rg = ResourceGroupPolicy.CreateResourceGroupConfig("piparg");
15+
var vn = rg.CreatePublicIPAddressConfig("pipa");
16+
var client = new Client(Credentials.Get());
17+
var state = await vn.GetAsync(client, new CancellationToken());
18+
var location = state.GetLocation(rg);
19+
var parameters = vn.GetParameters(client.Context.SubscriptionId, "eastus");
20+
var vnc = parameters.GetOrNull(vn);
21+
var createState = await vn.CreateOrUpdateAsync(
22+
client, state, parameters, new CancellationToken());
23+
var vncc = createState.GetOrNull(vn);
24+
Assert.Equal("eastus", vncc.Location);
25+
Assert.Equal("pipa", vncc.Name);
26+
Assert.Equal(vn.GetId(client.Context.SubscriptionId).IdToString(), vncc.Id);
27+
}
28+
}
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Microsoft.Azure.Experiments.Network;
2+
using Microsoft.Azure.Experiments.ResourceManager;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using Xunit;
6+
7+
namespace Microsoft.Azure.Experiments.Tests
8+
{
9+
public class SubnetTest
10+
{
11+
[Fact]
12+
public async Task CreateAsyncTest()
13+
{
14+
var rg = ResourceGroupPolicy.CreateResourceGroupConfig("Snrg");
15+
var vn = rg.CreateVirtualNetworkConfig("Vn", "192.168.0.0/16");
16+
var sn = vn.CreateSubnet("mysubnet", "192.168.1.0/24");
17+
18+
var client = new Client(Credentials.Get());
19+
var state = await sn.GetAsync(client, new CancellationToken());
20+
var location = state.GetLocation(rg);
21+
var parameters = sn.GetParameters(client.Context.SubscriptionId, "eastus");
22+
var snc = parameters.GetOrNull(sn);
23+
var createState = await sn.CreateOrUpdateAsync(
24+
client, state, parameters, new CancellationToken());
25+
var sncc = createState.GetOrNull(sn);
26+
Assert.Equal("mysubnet", sncc.Name);
27+
Assert.Equal(sn.GetId(client.Context.SubscriptionId).IdToString(), sncc.Id);
28+
}
29+
}
30+
}

experiments/Azure.Experiments/Tests/VirtualNetworkTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public async Task CreateAsyncTest()
2222
client, state, parameters, new CancellationToken());
2323
var vncc = createState.GetOrNull(vn);
2424
Assert.Equal("eastus", vncc.Location);
25+
Assert.Equal("192.168.0.0/16", vncc.AddressSpace.AddressPrefixes[0]);
2526
Assert.Equal("vn", vncc.Name);
2627
Assert.Equal(vn.GetId(client.Context.SubscriptionId).IdToString(), vncc.Id);
2728
}

0 commit comments

Comments
 (0)