Skip to content

Commit e10a1eb

Browse files
author
Hovsep
authored
Merge pull request #3 from sergey-shandar/sergey-hovsepm-nestedresource
Improved NestedResource configuration
2 parents 8777f60 + 53fc1f9 commit e10a1eb

File tree

4 files changed

+49
-65
lines changed

4 files changed

+49
-65
lines changed

src/ResourceManager/Common/Commands.Common.Strategies/NestedResourceStrategy.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
using System;
1616
using System.Collections.Generic;
17+
using System.Linq;
1718

1819
namespace Microsoft.Azure.Commands.Common.Strategies
1920
{
@@ -48,5 +49,37 @@ public static NestedResourceStrategy<TModel, TParentModel> Create<TModel, TParen
4849
name => new[] { provider, name},
4950
get,
5051
createOrUpdate);
52+
53+
public static NestedResourceStrategy<TModel, TParentModel> Create<TModel, TParentModel>(
54+
string provider,
55+
Func<TParentModel, IList<TModel>> getList,
56+
Action<TParentModel, IList<TModel>> setList,
57+
Func<TModel, string> getName,
58+
Action<TModel, string> setName)
59+
where TModel : class
60+
where TParentModel : class
61+
=> Create<TModel, TParentModel>(
62+
provider,
63+
(parentModel, name) => getList(parentModel)?.FirstOrDefault(model => getName(model) == name),
64+
(parentModel, name, model) =>
65+
{
66+
setName(model, name);
67+
var list = getList(parentModel);
68+
if (list == null)
69+
{
70+
list = new List<TModel> { model };
71+
setList(parentModel, list);
72+
return;
73+
}
74+
var modelAndIndex = list
75+
.Select((m, i) => new { m, i })
76+
.FirstOrDefault(mi => getName(mi.m) == name);
77+
if (modelAndIndex != null)
78+
{
79+
list[modelAndIndex.i] = model;
80+
return;
81+
}
82+
list.Add(model);
83+
});
5184
}
5285
}

src/ResourceManager/Compute/Commands.Compute/Strategies/Network/BackendAddressPoolStrategy.cs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,36 +27,20 @@ static class BackendAddressPoolStrategy
2727
{
2828
public static NestedResourceStrategy<BackendAddressPool, LoadBalancer> Strategy { get; }
2929
= NestedResourceStrategy.Create<BackendAddressPool, LoadBalancer>(
30-
provider: "backendAddressPools",
31-
get: (lb, name) => lb.BackendAddressPools?.FirstOrDefault(s => s?.Name == name),
32-
createOrUpdate: (lb, name, backendConfigurationPool) =>
33-
{
34-
backendConfigurationPool.Name = name;
35-
if (lb.BackendAddressPools == null)
36-
{
37-
lb.BackendAddressPools = new List<BackendAddressPool> { backendConfigurationPool };
38-
return;
39-
}
40-
var b = lb
41-
.BackendAddressPools
42-
.Select((bn, i) => new { bn, i })
43-
.FirstOrDefault(p => p.bn.Name == name);
44-
45-
if (b != null)
46-
{
47-
lb.BackendAddressPools[b.i] = backendConfigurationPool;
48-
return;
49-
}
50-
lb.BackendAddressPools.Add(backendConfigurationPool);
51-
});
30+
provider: "backendAddressPools",
31+
getList: parentModel => parentModel.BackendAddressPools,
32+
setList: (parentModel, list) => parentModel.BackendAddressPools = list,
33+
getName: model => model.Name,
34+
setName: (model, name) => model.Name = name);
5235

5336
public static NestedResourceConfig<BackendAddressPool, LoadBalancer> CreateBackendAddressPool(
5437
this ResourceConfig<LoadBalancer> loadBalancer,
5538
string name)
5639
=> Strategy.CreateConfig(
5740
parent: loadBalancer,
5841
name: name,
59-
createModel: subscriptionId => CreateBackendAddressPoolConfig(backendPoolName:name , subscriptionId: subscriptionId));
42+
createModel: subscriptionId => CreateBackendAddressPoolConfig(
43+
backendPoolName: name , subscriptionId: subscriptionId));
6044

6145
internal static BackendAddressPool CreateBackendAddressPoolConfig(
6246
string backendPoolName,

src/ResourceManager/Compute/Commands.Compute/Strategies/Network/FrontendIPConfigurationStrategy.cs

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,11 @@ static class FrontendIPConfigurationStrategy
2727
{
2828
public static NestedResourceStrategy<FrontendIPConfiguration, LoadBalancer> Strategy { get; }
2929
= NestedResourceStrategy.Create<FrontendIPConfiguration, LoadBalancer>(
30-
provider: "frontendIPConfigurations",
31-
get: (lb, name) => lb.FrontendIPConfigurations?.FirstOrDefault(s => s?.Name == name),
32-
createOrUpdate: (lb, name, frontendIpConfiguration) =>
33-
{
34-
frontendIpConfiguration.Name = name;
35-
if (lb.FrontendIPConfigurations == null)
36-
{
37-
lb.FrontendIPConfigurations = new List<FrontendIPConfiguration> { frontendIpConfiguration };
38-
return;
39-
}
40-
var f = lb
41-
.FrontendIPConfigurations
42-
.Select((fn, i) => new { fn, i })
43-
.FirstOrDefault(p => p.fn.Name == name);
44-
45-
if (f != null)
46-
{
47-
lb.FrontendIPConfigurations[f.i] = frontendIpConfiguration;
48-
return;
49-
}
50-
lb.FrontendIPConfigurations.Add(frontendIpConfiguration);
51-
});
30+
provider: "frontendIPConfigurations",
31+
getList: parentModel => parentModel.FrontendIPConfigurations,
32+
setList: (parentModel, list) => parentModel.FrontendIPConfigurations = list,
33+
getName: model => model.Name,
34+
setName: (model, name) => model.Name = name);
5235

5336
public static NestedResourceConfig<FrontendIPConfiguration, LoadBalancer> CreateFrontendIPConfiguration(
5437
this ResourceConfig<LoadBalancer> loadBalancer,

src/ResourceManager/Compute/Commands.Compute/Strategies/Network/SubnetStrategy.cs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,10 @@ static class SubnetStrategy
2323
public static NestedResourceStrategy<Subnet, VirtualNetwork> Strategy { get; }
2424
= NestedResourceStrategy.Create<Subnet, VirtualNetwork>(
2525
provider: "subnets",
26-
get: (vn, name) => vn.Subnets?.FirstOrDefault(s => s?.Name == name),
27-
createOrUpdate: (vn, name, subnet) =>
28-
{
29-
subnet.Name = name;
30-
if (vn.Subnets == null)
31-
{
32-
vn.Subnets = new List<Subnet> { subnet };
33-
return;
34-
}
35-
var s = vn
36-
.Subnets
37-
.Select((sn, i) => new { sn, i })
38-
.FirstOrDefault(p => p.sn.Name == name);
39-
if (s != null)
40-
{
41-
vn.Subnets[s.i] = subnet;
42-
return;
43-
}
44-
vn.Subnets.Add(subnet);
45-
});
26+
getList: parentModel => parentModel.Subnets,
27+
setList: (parentModel, list) => parentModel.Subnets = list,
28+
getName: model => model.Name,
29+
setName: (model, name) => model.Name = name);
4630

4731
public static NestedResourceConfig<Subnet, VirtualNetwork> CreateSubnet(
4832
this ResourceConfig<VirtualNetwork> virtualNetwork, string name, string addressPrefix)

0 commit comments

Comments
 (0)