Skip to content

Commit cad25fb

Browse files
Resource strategies.
1 parent e37b2a4 commit cad25fb

19 files changed

+398
-13
lines changed

src/ResourceManager/Common/Commands.Common.Strategies/Commands.Common.Strategies.csproj

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565
</ItemGroup>
6666
<ItemGroup>
6767
<Compile Include="AsyncOperationVisitor.cs" />
68+
<Compile Include="Compute\ComputeStrategy.cs" />
69+
<Compile Include="Compute\VirtualMachineStrategy.cs" />
6870
<Compile Include="CreateOrUpdateAsyncOperation.cs" />
6971
<Compile Include="CreateOrUpdateAsyncParams.cs" />
7072
<Compile Include="Extensions.cs" />
@@ -77,6 +79,13 @@
7779
<Compile Include="IState.cs" />
7880
<Compile Include="NestedResourceConfig.cs" />
7981
<Compile Include="NestedResourceStrategy.cs" />
82+
<Compile Include="Network\NetworkInterfaceStrategy.cs" />
83+
<Compile Include="Network\NetworkSecurityGroupPolicy.cs" />
84+
<Compile Include="Network\NetworkStrategy.cs" />
85+
<Compile Include="Network\PublicIPAddressStrategy.cs" />
86+
<Compile Include="Network\SubnetStrategy.cs" />
87+
<Compile Include="Network\VirtualNetworkStrategy.cs" />
88+
<Compile Include="ResourceManager\ResourceGroupStrategy.cs" />
8089
<Compile Include="TargetState.cs" />
8190
<Compile Include="Properties\AssemblyInfo.cs" />
8291
<Compile Include="ResourceConfig.cs" />
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Microsoft.Azure.Management.Compute;
2+
using Microsoft.Azure.Management.Compute.Models;
3+
using System;
4+
using System.Threading.Tasks;
5+
6+
namespace Microsoft.Azure.Commands.Common.Strategies.Compute
7+
{
8+
public static class ComputePolicy
9+
{
10+
public static ResourceStrategy<Model> Create<Model, Operations>(
11+
string header,
12+
Func<IComputeManagementClient, Operations> getOperations,
13+
Func<GetAsyncParams<Operations>, Task<Model>> getAsync,
14+
Func<CreateOrUpdateAsyncParams<Operations, Model>, Task<Model>> createOrUpdateAsync)
15+
where Model : Resource
16+
=> ResourceStrategy.Create(
17+
new[] { "Microsoft.Compute", header },
18+
getOperations,
19+
getAsync,
20+
createOrUpdateAsync,
21+
config => config.Location,
22+
(config, location) => config.Location = location);
23+
}
24+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using Microsoft.Azure.Management.Compute;
2+
using Microsoft.Azure.Management.Compute.Models;
3+
using Microsoft.Azure.Management.Network.Models;
4+
using Microsoft.Azure.Management.ResourceManager.Models;
5+
6+
namespace Microsoft.Azure.Commands.Common.Strategies.Compute
7+
{
8+
public static class VirtualMachineStrategy
9+
{
10+
public static ResourceStrategy<VirtualMachine> Strategy { get; }
11+
= ComputePolicy.Create(
12+
"virtualMachines",
13+
client => client.VirtualMachines,
14+
p => p.Operations.GetAsync(
15+
p.ResourceGroupName, p.Name, null, p.CancellationToken),
16+
p => p.Operations.CreateOrUpdateAsync(
17+
p.ResourceGroupName, p.Name, p.Model, p.CancellationToken));
18+
19+
public static ResourceConfig<VirtualMachine> CreateVirtualMachineConfig(
20+
this ResourceConfig<ResourceGroup> resourceGroup,
21+
string name,
22+
ResourceConfig<NetworkInterface> networkInterface,
23+
string adminUsername,
24+
string adminPassword)
25+
=> Strategy.CreateConfig(
26+
resourceGroup,
27+
name,
28+
subscription => new VirtualMachine
29+
{
30+
OsProfile = new OSProfile
31+
{
32+
ComputerName = name,
33+
WindowsConfiguration = new WindowsConfiguration
34+
{
35+
},
36+
AdminUsername = adminUsername,
37+
AdminPassword = adminPassword,
38+
},
39+
NetworkProfile = new NetworkProfile
40+
{
41+
NetworkInterfaces = new[]
42+
{
43+
new NetworkInterfaceReference
44+
{
45+
Id = networkInterface.GetId(subscription).IdToString()
46+
}
47+
}
48+
},
49+
HardwareProfile = new HardwareProfile
50+
{
51+
VmSize = "Standard_DS1_v2"
52+
},
53+
StorageProfile = new StorageProfile
54+
{
55+
ImageReference = new ImageReference
56+
{
57+
Publisher = "MicrosoftWindowsServer",
58+
Offer = "WindowsServer",
59+
Sku = "2016-Datacenter",
60+
Version = "latest"
61+
}
62+
},
63+
},
64+
new[] { networkInterface });
65+
}
66+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public override async Task<object> Visit<Model>(ResourceConfig<Model> config)
3030
}
3131
var tasks = config.Dependencies.Select(GetOrAddUntyped);
3232
await Task.WhenAll(tasks);
33-
return await config.Policy.CreateOrUpdateAsync(CreateOrUpdateAsyncParams.Create(
33+
return await config.Strategy.CreateOrUpdateAsync(CreateOrUpdateAsyncParams.Create(
3434
Client,
3535
config.ResourceGroupName,
3636
config.Name,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public override async Task<object> Visit<Model>(ResourceConfig<Model> config)
2626
Model info;
2727
try
2828
{
29-
info = await config.Policy.GetAsync(GetAsyncParams.Create(
29+
info = await config.Strategy.GetAsync(GetAsyncParams.Create(
3030
Client, config.ResourceGroupName, config.Name, CancellationToken));
3131
}
3232
catch (CloudException e) when (e.Response.StatusCode == HttpStatusCode.NotFound)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public NestedResourceStrategy(
2222
}
2323
}
2424

25-
public static class NestedResourceStraegy
25+
public static class NestedResourceStrategy
2626
{
2727
public static NestedResourceStrategy<Model, ParentModel> Create<Model, ParentModel>(
2828
string header,
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using Microsoft.Azure.Management.Network;
2+
using Microsoft.Azure.Management.Network.Models;
3+
using Microsoft.Azure.Management.ResourceManager.Models;
4+
5+
namespace Microsoft.Azure.Commands.Common.Strategies.Network
6+
{
7+
public static class NetworkInterfaceStrategy
8+
{
9+
public static ResourceStrategy<NetworkInterface> Strategy { get; }
10+
= NetworkStrategy.Create(
11+
"networkInterfaces",
12+
client => client.NetworkInterfaces,
13+
p => p.Operations.GetAsync(
14+
p.ResourceGroupName, p.Name, null, p.CancellationToken),
15+
p => p.Operations.CreateOrUpdateAsync(
16+
p.ResourceGroupName, p.Name, p.Model, p.CancellationToken));
17+
18+
public static ResourceConfig<NetworkInterface> CreateNetworkInterfaceConfig(
19+
this ResourceConfig<ResourceGroup> resourceGroup,
20+
string name,
21+
NestedResourceConfig<Subnet, VirtualNetwork> subnet,
22+
ResourceConfig<PublicIPAddress> publicIPAddress,
23+
ResourceConfig<NetworkSecurityGroup> networkSecurityGroup)
24+
=> Strategy.CreateConfig(
25+
resourceGroup,
26+
name,
27+
subscription => new NetworkInterface
28+
{
29+
IpConfigurations = new []
30+
{
31+
new NetworkInterfaceIPConfiguration
32+
{
33+
Name = name,
34+
Subnet = new Subnet { Id = subnet.GetId(subscription).IdToString() },
35+
PublicIPAddress = new PublicIPAddress
36+
{
37+
Id = publicIPAddress.GetId(subscription).IdToString()
38+
}
39+
}
40+
},
41+
NetworkSecurityGroup = new NetworkSecurityGroup
42+
{
43+
Id = networkSecurityGroup.GetId(subscription).IdToString()
44+
}
45+
},
46+
new IResourceConfig[] { subnet, publicIPAddress, networkSecurityGroup });
47+
}
48+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Microsoft.Azure.Management.Network;
2+
using Microsoft.Azure.Management.Network.Models;
3+
using Microsoft.Azure.Management.ResourceManager.Models;
4+
5+
namespace Microsoft.Azure.Commands.Common.Strategies.Network
6+
{
7+
public static class NetworkSecurityGroupStrategy
8+
{
9+
public static ResourceStrategy<NetworkSecurityGroup> Strategy { get; }
10+
= NetworkStrategy.Create(
11+
"networkSecurityGroups",
12+
client => client.NetworkSecurityGroups,
13+
p => p.Operations.GetAsync(
14+
p.ResourceGroupName, p.Name, null, p.CancellationToken),
15+
p => p.Operations.CreateOrUpdateAsync(
16+
p.ResourceGroupName, p.Name, p.Model, p.CancellationToken));
17+
18+
public static ResourceConfig<NetworkSecurityGroup> CreateNetworkSecurityGroupConfig(
19+
this ResourceConfig<ResourceGroup> resourceGroup, string name)
20+
=> Strategy.CreateConfig(resourceGroup, name);
21+
}
22+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using Microsoft.Azure.Management.Network;
2+
using Microsoft.Azure.Management.Network.Models;
3+
using System;
4+
using System.Threading.Tasks;
5+
6+
namespace Microsoft.Azure.Commands.Common.Strategies.Network
7+
{
8+
public static class NetworkStrategy
9+
{
10+
public static ResourceStrategy<Model> Create<Model, Operations>(
11+
string header,
12+
Func<INetworkManagementClient, Operations> getOperations,
13+
Func<GetAsyncParams<Operations>, Task<Model>> getAsync,
14+
Func<CreateOrUpdateAsyncParams<Operations, Model>, Task<Model>> createOrUpdateAsync)
15+
where Model : Resource
16+
=> ResourceStrategy.Create(
17+
new [] { "Microsoft.Network", header },
18+
getOperations,
19+
getAsync,
20+
createOrUpdateAsync,
21+
model => model.Location,
22+
(model, location) => model.Location = location);
23+
}
24+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using Microsoft.Azure.Management.Network;
2+
using Microsoft.Azure.Management.Network.Models;
3+
using Microsoft.Azure.Management.ResourceManager.Models;
4+
5+
namespace Microsoft.Azure.Commands.Common.Strategies.Network
6+
{
7+
public static class PublicIPAddressStrategy
8+
{
9+
public static ResourceStrategy<PublicIPAddress> Strategy { get; }
10+
= NetworkStrategy.Create(
11+
"publicIPAddresses",
12+
client => client.PublicIPAddresses,
13+
p => p.Operations.GetAsync(
14+
p.ResourceGroupName, p.Name, null, p.CancellationToken),
15+
p => p.Operations.CreateOrUpdateAsync(
16+
p.ResourceGroupName, p.Name, p.Model, p.CancellationToken));
17+
18+
public static ResourceConfig<PublicIPAddress> CreatePublicIPAddressConfig(
19+
this ResourceConfig<ResourceGroup> resourceGroup, string name)
20+
=> Strategy.CreateConfig(resourceGroup, name);
21+
}
22+
}
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.Commands.Common.Strategies.Network
6+
{
7+
public static class SubnetPolicy
8+
{
9+
public static NestedResourceStrategy<Subnet, VirtualNetwork> Strategy { get; }
10+
= NestedResourceStrategy.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+
=> Strategy.CreateConfig(
36+
virtualNetwork,
37+
name,
38+
() => new Subnet { Name = name, AddressPrefix = addressPrefix });
39+
}
40+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Microsoft.Azure.Management.Network;
2+
using Microsoft.Azure.Management.Network.Models;
3+
using Microsoft.Azure.Management.ResourceManager.Models;
4+
5+
namespace Microsoft.Azure.Commands.Common.Strategies.Network
6+
{
7+
public static class VirtualNetworkStrategy
8+
{
9+
public static ResourceStrategy<VirtualNetwork> Strategy { get; }
10+
= NetworkStrategy.Create(
11+
"virtualNetworks",
12+
client => client.VirtualNetworks,
13+
p => p.Operations.GetAsync(
14+
p.ResourceGroupName, p.Name, null, p.CancellationToken),
15+
p => p.Operations.CreateOrUpdateAsync(
16+
p.ResourceGroupName, p.Name, p.Model, p.CancellationToken));
17+
18+
public static ResourceConfig<VirtualNetwork> CreateVirtualNetworkConfig(
19+
this ResourceConfig<ResourceGroup> resourceGroup,
20+
string name,
21+
string addressPrefix)
22+
=> Strategy.CreateConfig(
23+
resourceGroup,
24+
name,
25+
_ => new VirtualNetwork
26+
{
27+
AddressSpace = new AddressSpace
28+
{
29+
AddressPrefixes = new[] { addressPrefix }
30+
}
31+
});
32+
}
33+
}

0 commit comments

Comments
 (0)