Skip to content

Commit d32bee0

Browse files
Compute classess (Get/Create logic).
2 parents a321a65 + 90ab0fa commit d32bee0

File tree

2 files changed

+246
-91
lines changed

2 files changed

+246
-91
lines changed

experiments/Compute.Experiments/AzureRM.Compute.Experiments.psd1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ RequiredModules = @(
7373
# NestedModules = @()
7474

7575
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
76-
FunctionsToExport = 'New-AzVm2','New-AzVm', 'New-AzVm3'
76+
FunctionsToExport = 'New-AzVm'
7777

7878
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
7979
# CmdletsToExport =

experiments/Compute.Experiments/AzureRM.Compute.Experiments.psm1

Lines changed: 245 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -4,86 +4,262 @@ function New-AzVm {
44
[Parameter()][PSCredential] $Credential,
55
[Parameter()][string] $Name = "VM",
66
[Parameter()][string] $ImageName = "Win2012R2Datacenter",
7-
[Parameter()][string] $ResourceGroupName = $Name + "ResourceGroup",
7+
[Parameter()][string] $ResourceGroupName,
88
[Parameter()][string] $Location = "eastus",
9-
[Parameter()][string] $VirtualNetworkName = $Name + "VirtualNetwork",
10-
[Parameter()][string] $PublicIpAddressName = $Name + "PublicIpAddress",
11-
[Parameter()][string] $SecurityGroupName = $Name + "SecurityGroup",
12-
[Parameter()][string] $NetworkInterfaceName = $Name + "NetworkInterface"
9+
[Parameter()][string] $VirtualNetworkName,
10+
[Parameter()][string] $PublicIpAddressName,
11+
[Parameter()][string] $SecurityGroupName,
12+
[Parameter()][string] $NetworkInterfaceName
1313
)
1414

1515
PROCESS {
16-
if (-not $Credential) {
17-
$Credential = Get-Credential
16+
$rgi = [ResourceGroup]::new($ResourceGroupName);
17+
$vni = [VirtualNetwork]::new($VirtualNetworkName);
18+
$piai = [PublicIpAddress]::new($PublicIpAddressName);
19+
$sgi = [SecurityGroup]::new($SecurityGroupName);
20+
$nii = [NetworkInterface]::new(
21+
$NetworkInterfaceName,
22+
$vni,
23+
$piai,
24+
$sgi);
25+
$vmi = [VirtualMachine]::new($null, $nii, $rgi, $Credential, $ImageName, $images);
26+
27+
$locationi = [Location]::new();
28+
if (-not $Location) {
29+
$vmi.UpdateLocation($locationi);
30+
if (-not $locationi.Value) {
31+
$locationi.Value = "eastus";
32+
}
33+
} else {
34+
$locationi.Value = $Location;
1835
}
1936

20-
# Find VM Image
21-
$vmImage = $images | Where-Object { $_.Name -eq $ImageName } | Select-Object -First 1
22-
if (-not $vmImage) {
23-
throw "Unknown image: " + $ImageName
37+
$resourceGroup = $rgi.GetOrCreate($Name + "ResourceGroup", $locationi.Value, $null);
38+
$vmResponse = $vmi.Create($Name, $locationi.Value, $resourceGroup.ResourceGroupName);
39+
40+
New-PsObject @{
41+
ResourceId = $resourceGroup.ResourceId;
42+
Response = $vmResponse
43+
}
44+
}
45+
}
46+
47+
class Location {
48+
[int] $Priority;
49+
[string] $Value;
50+
51+
Location() {
52+
$this.Priority = 0;
53+
$this.Value = $null;
54+
}
55+
}
56+
57+
class AzureObject {
58+
[string] $Name;
59+
[AzureObject[]] $Children;
60+
[int] $Priority;
61+
62+
AzureObject([string] $name, [AzureObject[]] $children) {
63+
$this.Name = $name;
64+
$this.Children = $children;
65+
$this.Priority = 0;
66+
foreach ($child in $this.Children) {
67+
if ($this.Priority -lt $child.Priority) {
68+
$this.Priority = $child.Priority;
69+
}
70+
}
71+
$this.Priority++;
72+
}
73+
74+
# This function should be called only when $this.Name is not $null.
75+
[object] GetInfo() {
76+
return $null;
77+
}
78+
79+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
80+
return $null;
81+
}
82+
83+
[void] UpdateLocation([Location] $location) {
84+
if ($this.Priority -gt $location.Priority) {
85+
if ($this.Name) {
86+
$location.Value = $this.GetInfo().Location;
87+
$location.Priority = $this.Priority;
88+
} else {
89+
foreach ($child in $this.Children) {
90+
$child.UpdateLocation($location);
91+
}
92+
}
93+
}
94+
}
95+
96+
[object] GetOrCreate([string] $name, [string] $location, [string] $resourceGroupName) {
97+
if ($this.Name) {
98+
return $this.GetInfo();
99+
} else {
100+
$result = $this.Create($name, $location, $resourceGroupName);
101+
$this.Name = $name;
102+
return $result;
24103
}
104+
}
105+
}
106+
107+
class ResourceGroup: AzureObject {
108+
ResourceGroup([string] $name): base($name, @()) {
109+
}
110+
111+
[object] GetInfo() {
112+
return Get-AzureRmResourceGroup -Name $this.Name;
113+
}
25114

26-
# Resource Group
27-
$resourceGroup = Set-ResourceGroup -Name $ResourceGroupName -Location $Location
115+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
116+
return New-AzureRmResourceGroup -Name $name -Location $location;
117+
}
118+
}
119+
120+
class Resource1: AzureObject {
121+
Resource1([string] $name): base($name, @([ResourceGroup]::new($null))) {
122+
}
123+
}
28124

29-
# Virtual Network
30-
$virtualNetworkAddressPrefix = "192.168.0.0/16"
31-
$subnet = @{ Name = $Name + "Subnet"; AddressPrefix = "192.168.1.0/24" }
125+
class VirtualNetwork: Resource1 {
126+
VirtualNetwork([string] $name): base($name) {
127+
}
128+
129+
[object] GetInfo() {
130+
return Get-AzureRmVirtualNetwork -Name $this.Name;
131+
}
132+
133+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
32134
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
33-
-Name $subnet.Name `
34-
-AddressPrefix $subnet.AddressPrefix
35-
$virtualNetwork = New-AzureRmVirtualNetwork `
36-
-ResourceGroupName $ResourceGroupName `
37-
-Location $Location `
38-
-Name $VirtualNetworkName `
39-
-AddressPrefix $virtualNetworkAddressPrefix `
135+
-Name "Subnet" `
136+
-AddressPrefix "192.168.1.0/24"
137+
return New-AzureRmVirtualNetwork `
138+
-ResourceGroupName $resourceGroupName `
139+
-Location $location `
140+
-Name $name `
141+
-AddressPrefix "192.168.0.0/16" `
40142
-Subnet $subnetConfig
143+
}
144+
}
41145

42-
# Piblic IP
43-
$publicIpAddress = New-AzureRmPublicIpAddress `
44-
-ResourceGroupName $ResourceGroupName `
45-
-Location $Location `
146+
class PublicIpAddress: Resource1 {
147+
PublicIpAddress([string] $name): base($name) {
148+
}
149+
150+
[object] GetInfo() {
151+
return Get-AzureRMPublicIpAddress -Name $this.Name;
152+
}
153+
154+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
155+
return New-AzureRmPublicIpAddress `
156+
-ResourceGroupName $resourceGroupName `
157+
-Location $location `
46158
-AllocationMethod Static `
47-
-Name $PublicIpAddressName
48-
49-
# Security Group (it may have several rules(ports))
50-
$securityRule = @{
51-
Name = $Name + "SecurityRule";
52-
Protocol = "Tcp";
53-
Priority = 1000;
54-
Access = "Allow";
55-
Direction = "Inbound";
56-
SourcePortRange = "*";
57-
SourceAddressPrefix = "*";
58-
DestinationPortRange = 3389;
59-
DestinationAddressPrefix = "*";
60-
}
159+
-Name $name
160+
}
161+
}
162+
163+
class SecurityGroup: Resource1 {
164+
SecurityGroup([string] $name): base($name) {
165+
}
166+
167+
[object] GetInfo() {
168+
return Get-AzureRMSecurityGroup -Name $this.Name;
169+
}
170+
171+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
61172
$securityRuleConfig = New-AzureRmNetworkSecurityRuleConfig `
62-
-Name $securityRule.Name `
63-
-Protocol $securityRule.Protocol `
64-
-Priority $securityRule.Priority `
65-
-Access $securityRule.Access `
66-
-Direction $securityRule.Direction `
67-
-SourcePortRange $securityRule.SourcePortRange `
68-
-SourceAddressPrefix $securityRule.SourceAddressPrefix `
69-
-DestinationPortRange $securityRule.DestinationPortRange `
70-
-DestinationAddressPrefix $securityRule.DestinationAddressPrefix
71-
$securityGroup = New-AzureRmNetworkSecurityGroup `
72-
-ResourceGroupName $ResourceGroupName `
73-
-Location $Location `
74-
-Name $SecurityGroupName `
173+
-Name $name `
174+
-Protocol "Tcp" `
175+
-Priority 1000 `
176+
-Access "Allow" `
177+
-Direction "Inbound" `
178+
-SourcePortRange "*" `
179+
-SourceAddressPrefix "*" `
180+
-DestinationPortRange 3389 `
181+
-DestinationAddressPrefix "*"
182+
183+
return New-AzureRmNetworkSecurityGroup `
184+
-ResourceGroupName $resourceGroupName `
185+
-Location $location `
186+
-Name $name `
75187
-SecurityRules $securityRuleConfig
188+
}
189+
}
190+
191+
class NetworkInterface: AzureObject {
192+
[VirtualNetwork] $VirtualNetwork;
193+
[PublicIpAddress] $PublicIpAddress;
194+
[SecurityGroup] $SecurityGroup;
76195

77-
# Network Interface
78-
$networkInterface = New-AzureRmNetworkInterface `
79-
-ResourceGroupName $ResourceGroupName `
80-
-Location $Location `
81-
-Name $NetworkInterfaceName `
82-
-PublicIpAddressId $publicIpAddress.Id `
83-
-SubnetId $virtualNetwork.Subnets[0].Id `
84-
-NetworkSecurityGroupId $securityGroup.Id
196+
NetworkInterface(
197+
[string] $name,
198+
[VirtualNetwork] $virtualNetwork,
199+
[PublicIpAddress] $publicIpAddress,
200+
[SecurityGroup] $securityGroup
201+
): base($name, @($virtualNetwork, $publicIpAddress, $securityGroup)) {
202+
$this.VirtualNetwork = $virtualNetwork;
203+
$this.PublicIpAddress = $publicIpAddress;
204+
$this.SecurityGroup = $securityGroup;
205+
}
206+
207+
[object] GetInfo() {
208+
return Get-AzureRMNetworkInterface -Name $this.Name;
209+
}
210+
211+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
212+
$xpublicIpAddress = $this.PublicIpAddress.GetOrCreate($name, $location, $resourceGroupName);
213+
$xvirtualNetwork = $this.VirtualNetwork.GetOrCreate($name, $location, $resourceGroupName);
214+
$xsecurityGroup = $this.SecurityGroup.GetOrCreate($name, $location, $resourceGroupName);
215+
return New-AzureRmNetworkInterface `
216+
-ResourceGroupName $resourceGroupName `
217+
-Location $location `
218+
-Name $name `
219+
-PublicIpAddressId $xpublicIpAddress.Id `
220+
-SubnetId $xvirtualNetwork.Subnets[0].Id `
221+
-NetworkSecurityGroupId $xsecurityGroup.Id
222+
}
223+
}
224+
225+
class VirtualMachine: AzureObject {
226+
[NetworkInterface] $NetworkInterface;
227+
[pscredential] $Credential;
228+
[string] $ImageName;
229+
[object] $Images;
230+
231+
VirtualMachine(
232+
[string] $name,
233+
[NetworkInterface] $networkInterface,
234+
[ResourceGroup] $resourceGroup,
235+
[PSCredential] $credential,
236+
[string] $imageName,
237+
[object] $images):
238+
base($name, @($networkInterface, $resourceGroup)) {
239+
240+
$this.Credential = $credential;
241+
$this.ImageName = $imageName;
242+
$this.NetworkInterface = $networkInterface;
243+
$this.Images = $images;
244+
}
245+
246+
[object] GetInfo() {
247+
return Get-AzureRMVirtualMachine -Name $this.Name;
248+
}
249+
250+
[object] Create([string] $name, [string] $location, [string] $resourceGroupName) {
251+
$networkInterfaceInstance = $this.NetworkInterface.GetOrCreate( `
252+
$name, $location, $resourceGroupName);
253+
254+
if (-not $this.Credential) {
255+
$this.Credential = Get-Credential
256+
}
257+
258+
$vmImage = $this.Images | Where-Object { $_.Name -eq $this.ImageName } | Select-Object -First 1
259+
if (-not $vmImage) {
260+
throw "Unknown image: " + $this.ImageName
261+
}
85262

86-
# VM
87263
$vmSize = "Standard_DS2"
88264
$vmConfig = New-AzureRmVMConfig -VMName $Name -VMSize $vmSize
89265
$vmComputerName = $Name + "Computer"
@@ -92,13 +268,13 @@ function New-AzVm {
92268
$vmConfig = $vmConfig | Set-AzureRmVMOperatingSystem `
93269
-Windows `
94270
-ComputerName $vmComputerName `
95-
-Credential $Credential
271+
-Credential $this.Credential
96272
}
97273
"Linux" {
98274
$vmConfig = $vmConfig | Set-AzureRmVMOperatingSystem `
99275
-Linux `
100276
-ComputerName $vmComputerName `
101-
-Credential $Credential
277+
-Credential $this.Credential
102278
}
103279
}
104280

@@ -109,33 +285,12 @@ function New-AzVm {
109285
-Offer $vmImageImage.offer `
110286
-Skus $vmImageImage.sku `
111287
-Version $vmImageImage.version `
112-
| Add-AzureRmVMNetworkInterface -Id $networkInterface.Id
288+
| Add-AzureRmVMNetworkInterface -Id $networkInterfaceInstance.Id
113289

114-
$response = New-AzureRmVm `
115-
-ResourceGroupName $ResourceGroupName `
116-
-Location $Location `
290+
return New-AzureRmVm `
291+
-ResourceGroupName $resourceGroupName `
292+
-Location $location `
117293
-VM $vmConfig
118-
119-
New-PsObject @{
120-
ResourceId = $resourceGroup.ResourceId;
121-
Response = $response
122-
}
123-
}
124-
}
125-
126-
function Set-ResourceGroup {
127-
param(
128-
[parameter(Mandatory = $true)][string]$Name,
129-
[parameter(Mandatory = $true)][string]$Location
130-
)
131-
132-
$resourceGroup = Get-AzureRmResourceGroup `
133-
| Where-Object { $_.ResourceGroupName -eq $Name } `
134-
| Select-Object -First 1 -Wait;
135-
if ($resourceGroup) {
136-
$resourceGroup;
137-
} else {
138-
New-AzureRmResourceGroup -Name $ResourceGroupName -Location $Location
139294
}
140295
}
141296

0 commit comments

Comments
 (0)