@@ -26,23 +26,31 @@ function New-AzVm {
26
26
[Parameter ()][string ] $ImageName = " Win2016Datacenter" ,
27
27
[Parameter ()][string ] $Size = " Standard_DS1_v2" ,
28
28
29
+ [Parameter ()][object ] $AzureRmContext ,
29
30
[Parameter ()][switch ] $AsJob
30
31
)
31
32
32
33
PROCESS {
33
- $rgi = [ResourceGroup ]::new($ResourceGroupName );
34
+ # TODO: make sure it's logged in.
35
+ $context = if ($AzureRmContext ) {
36
+ Get-AzureRmContext - AzureRmContext $AzureRmContext
37
+ } else {
38
+ Get-AzureRmContext
39
+ }
40
+
41
+ $rgi = [ResourceGroup ]::new($ResourceGroupName )
34
42
35
- $vni = [VirtualNetwork ]::new($VirtualNetworkName , $AddressPrefix );
36
- $subnet = [Subnet ]::new($SubnetName , $vni , $SubnetAddressPrefix );
37
- $piai = [PublicIpAddress ]::new($PublicIpAddressName , $DomainNameLabel , $AllocationMethod );
38
- $sgi = [SecurityGroup ]::new($SecurityGroupName , $OpenPorts );
43
+ $vni = [VirtualNetwork ]::new($VirtualNetworkName , $AddressPrefix )
44
+ $subnet = [Subnet ]::new($SubnetName , $vni , $SubnetAddressPrefix )
45
+ $piai = [PublicIpAddress ]::new($PublicIpAddressName , $DomainNameLabel , $AllocationMethod )
46
+ $sgi = [SecurityGroup ]::new($SecurityGroupName , $OpenPorts )
39
47
40
48
# we don't allow to reuse NetworkInterface so $name is $null.
41
49
$nii = [NetworkInterface ]::new(
42
50
$null ,
43
51
$subnet ,
44
52
$piai ,
45
- $sgi );
53
+ $sgi )
46
54
47
55
# the purpouse of the New-AzVm cmdlet is to create (not get) a VM so $name is $null.
48
56
$vmi = [VirtualMachine ]::new(
@@ -57,52 +65,42 @@ function New-AzVm {
57
65
# infer a location
58
66
$locationi = [Location ]::new();
59
67
if (-not $Location ) {
60
- $vmi.UpdateLocation ($locationi );
68
+ $vmi.UpdateLocation ($locationi , $context );
61
69
if (-not $locationi.Value ) {
62
70
$locationi.Value = " eastus" ;
63
71
}
64
72
} else {
65
73
$locationi.Value = $Location ;
66
74
}
67
75
68
- $createParams = [CreateParams ]::new($Name , $locationi.Value , $Name );
76
+ $createParams = [CreateParams ]::new($Name , $locationi.Value , $Name , $context );
69
77
70
78
if ($PSCmdlet.ShouldProcess ($Name , " Creating a virtual machine" )) {
79
+
71
80
if ($AsJob ) {
81
+ $boundParams = $PSCmdlet.MyInvocation.BoundParameters
82
+ $arguments = @ { ' AzureRmContext' = $context }
83
+ foreach ($argName in $boundParams.Keys ) {
84
+ if ($argName -ne ' AsJob' -and $argName -ne ' AzureRmContext' ) {
85
+ $arguments [$argName ] = $boundParams [$argName ]
86
+ }
87
+ }
72
88
$script = {
73
- param ($rgi , $vmi , $createParams )
74
- New-AzVmInternal `
75
- - ResourceGroup $rgi `
76
- - VirtualMachine $vmi `
77
- - CreateParams $createParams `
78
- - ErrorAction Stop
89
+ [hashtable ] $params = $args [0 ]
90
+ New-AzVm @params
79
91
}
80
- return Start-Job - ScriptBlock $script - ArgumentList @ ( $rgi , $vmi , $createParams )
92
+ return Start-Job $script - ArgumentList $arguments
81
93
} else {
82
- return New-AzVmInternal `
83
- - ResourceGroup $rgi `
84
- - VirtualMachine $vmi `
85
- - CreateParams $createParams `
86
- - ErrorAction Stop
94
+ $rg = $rgi.GetOrCreate ($createParams );
95
+ $vmResponse = $vmi.Create ($createParams );
96
+ return [PSAzureVm ]::new(
97
+ $rg.ResourceId ,
98
+ $VirtualMachine.Name
99
+ );
87
100
}
88
101
}
89
102
}
90
103
}
91
- function New-AzVmInternal {
92
- param (
93
- [ResourceGroup ] $ResourceGroup ,
94
- [VirtualMachine ] $VirtualMachine ,
95
- [CreateParams ] $createParams
96
- )
97
-
98
- $rg = $ResourceGroup.GetOrCreate ($createParams );
99
- $vmResponse = $VirtualMachine.Create ($createParams );
100
-
101
- return [PSAzureVm ]::new(
102
- $rg.ResourceId ,
103
- $VirtualMachine.Name
104
- );
105
- }
106
104
107
105
class PSAzureVm {
108
106
[string ] $ResourceGroupId ;
@@ -128,11 +126,18 @@ class CreateParams {
128
126
[string ] $Name ;
129
127
[string ] $Location ;
130
128
[string ] $ResourceGroupName ;
129
+ [object ] $Context ;
131
130
132
- CreateParams([string ] $name , [string ] $location , [string ] $resourceGroupName ) {
133
- $this.Name = $name ;
134
- $this.Location = $location ;
135
- $this.ResourceGroupName = $resourceGroupName ;
131
+ CreateParams(
132
+ [string ] $name ,
133
+ [string ] $location ,
134
+ [string ] $resourceGroupName ,
135
+ [object ] $context )
136
+ {
137
+ $this.Name = $name
138
+ $this.Location = $location
139
+ $this.ResourceGroupName = $resourceGroupName
140
+ $this.Context = $context
136
141
}
137
142
}
138
143
@@ -154,30 +159,30 @@ class AzureObject {
154
159
}
155
160
156
161
# This function should be called only when $this.Name is not $null.
157
- [object ] GetInfo() {
162
+ [object ] GetInfo([ object ] $context ) {
158
163
return $null ;
159
164
}
160
165
161
166
[object ] Create([CreateParams ] $p ) {
162
167
return $null ;
163
168
}
164
169
165
- [void ] UpdateLocation([Location ] $location ) {
170
+ [void ] UpdateLocation([Location ] $location , [ object ] $context ) {
166
171
if ($this.Priority -gt $location.Priority ) {
167
172
if ($this.Name ) {
168
- $location.Value = $this.GetInfo ().Location;
173
+ $location.Value = $this.GetInfo ($context ).Location;
169
174
$location.Priority = $this.Priority ;
170
175
} else {
171
176
foreach ($child in $this.Children ) {
172
- $child.UpdateLocation ($location );
177
+ $child.UpdateLocation ($location , $context );
173
178
}
174
179
}
175
180
}
176
181
}
177
182
178
183
[object ] GetOrCreate([CreateParams ] $p ) {
179
184
if ($this.Name ) {
180
- return $this.GetInfo ();
185
+ return $this.GetInfo ($p .Context );
181
186
} else {
182
187
$result = $this.Create ($p );
183
188
$this.Name = $p.Name ;
@@ -190,14 +195,15 @@ class ResourceGroup: AzureObject {
190
195
ResourceGroup([string ] $name ): base($name , @ ()) {
191
196
}
192
197
193
- [object ] GetInfo() {
194
- return Get-AzureRmResourceGroup - Name $this.Name ;
198
+ [object ] GetInfo([ object ] $context ) {
199
+ return Get-AzureRmResourceGroup - Name $this.Name - AzureRmContext $context ;
195
200
}
196
201
197
202
[object ] Create([CreateParams ] $p ) {
198
203
return New-AzureRmResourceGroup `
199
204
- Name $p.Name `
200
205
- Location $p.Location `
206
+ - AzureRmContext $p.Context `
201
207
- WarningAction SilentlyContinue `
202
208
- ErrorAction Stop;
203
209
}
@@ -215,8 +221,8 @@ class VirtualNetwork: Resource1 {
215
221
$this.AddressPrefix = $addressPrefix
216
222
}
217
223
218
- [object ] GetInfo() {
219
- return Get-AzureRmVirtualNetwork - Name $this.Name
224
+ [object ] GetInfo([ object ] $context ) {
225
+ return Get-AzureRmVirtualNetwork - Name $this.Name - AzureRmContext $context
220
226
}
221
227
222
228
[object ] Create([CreateParams ] $p ) {
@@ -225,6 +231,7 @@ class VirtualNetwork: Resource1 {
225
231
- Location $p.Location `
226
232
- Name $p.Name `
227
233
- AddressPrefix $this.AddressPrefix `
234
+ - AzureRmContext $p.Context `
228
235
- WarningAction SilentlyContinue `
229
236
- ErrorAction Stop
230
237
}
@@ -243,8 +250,8 @@ class PublicIpAddress: Resource1 {
243
250
$this.AllocationMethod = $allocationMethod ;
244
251
}
245
252
246
- [object ] GetInfo() {
247
- return Get-AzureRMPublicIpAddress - Name $this.Name ;
253
+ [object ] GetInfo([ object ] $context ) {
254
+ return Get-AzureRMPublicIpAddress - Name $this.Name - AzureRmContext $context ;
248
255
}
249
256
250
257
[object ] Create([CreateParams ] $p ) {
@@ -254,6 +261,7 @@ class PublicIpAddress: Resource1 {
254
261
- Name $p.Name `
255
262
- DomainNameLabel $this.DomainNameLabel.ToLower () `
256
263
- AllocationMethod $this.AllocationMethod `
264
+ - AzureRmContext $p.Context `
257
265
- WarningAction SilentlyContinue `
258
266
- ErrorAction Stop
259
267
}
@@ -266,8 +274,8 @@ class SecurityGroup: Resource1 {
266
274
$this.OpenPorts = $OpenPorts ;
267
275
}
268
276
269
- [object ] GetInfo() {
270
- return Get-AzureRMSecurityGroup - Name $this.Name
277
+ [object ] GetInfo([ object ] $context ) {
278
+ return Get-AzureRMSecurityGroup - Name $this.Name - AzureRmContext $context
271
279
}
272
280
273
281
[object ] Create([CreateParams ] $p ) {
@@ -294,6 +302,7 @@ class SecurityGroup: Resource1 {
294
302
- Location $p.Location `
295
303
- Name $p.Name `
296
304
- SecurityRules $rules `
305
+ - AzureRmContext $p.Context `
297
306
- WarningAction SilentlyContinue `
298
307
- ErrorAction Stop
299
308
}
@@ -305,13 +314,13 @@ class Subnet: AzureObject {
305
314
306
315
Subnet([string ] $name , [VirtualNetwork ] $virtualNetwork , [string ] $subnetAddressPrefix ):
307
316
base($name , @ ($virtualNetwork )) {
308
- $this.VirtualNetwork = $virtualNetwork ;
309
- $this.SubnetAddressPrefix = $subnetAddressPrefix ;
317
+ $this.VirtualNetwork = $virtualNetwork
318
+ $this.SubnetAddressPrefix = $subnetAddressPrefix
310
319
}
311
320
312
- [object ] GetInfo() {
313
- $virutalNetworkInfo = $this.VirtualNetwork.GetInfo ();
314
- return $virutalNetworkInfo | Get-AzureRmVirtualNetworkSubnetConfig - Name $this.Name ;
321
+ [object ] GetInfo([ object ] $context ) {
322
+ $virutalNetworkInfo = $this.VirtualNetwork.GetInfo ($context )
323
+ return $virutalNetworkInfo | Get-AzureRmVirtualNetworkSubnetConfig - Name $this.Name
315
324
}
316
325
317
326
[object ] Create([CreateParams ] $p ) {
@@ -320,9 +329,11 @@ class Subnet: AzureObject {
320
329
- VirtualNetwork $virtualNetworkInfo `
321
330
- Name $p.Name `
322
331
- AddressPrefix $this.SubnetAddressPrefix ;
323
- $virtualNetworkInfo = Set-AzureRmVirtualNetwork - VirtualNetwork $virtualNetworkInfo - ErrorAction Stop
324
- $result = Get-AzureRmVirtualNetworkSubnetConfig - VirtualNetwork $virtualNetworkInfo - Name $p.Name
325
- return $result ;
332
+ $virtualNetworkInfo = Set-AzureRmVirtualNetwork `
333
+ - VirtualNetwork $virtualNetworkInfo `
334
+ - AzureRmContext $p.Context `
335
+ - ErrorAction Stop
336
+ return Get-AzureRmVirtualNetworkSubnetConfig - VirtualNetwork $virtualNetworkInfo - Name $p.Name
326
337
}
327
338
}
328
339
@@ -342,8 +353,8 @@ class NetworkInterface: AzureObject {
342
353
$this.SecurityGroup = $securityGroup ;
343
354
}
344
355
345
- [object ] GetInfo() {
346
- return Get-AzureRMNetworkInterface - Name $this.Name ;
356
+ [object ] GetInfo([ object ] $context ) {
357
+ return Get-AzureRMNetworkInterface - Name $this.Name - AzureRmContext $context ;
347
358
}
348
359
349
360
[object ] Create([CreateParams ] $p ) {
@@ -357,6 +368,7 @@ class NetworkInterface: AzureObject {
357
368
- PublicIpAddressId $publicIpAddressInfo.Id `
358
369
- SubnetId $subnetInfo.Id `
359
370
- NetworkSecurityGroupId $securityGroupInfo.Id `
371
+ - AzureRmContext $p.Context `
360
372
- WarningAction SilentlyContinue `
361
373
- ErrorAction Stop
362
374
}
@@ -386,17 +398,13 @@ class VirtualMachine: AzureObject {
386
398
$this.Size = $size ;
387
399
}
388
400
389
- [object ] GetInfo() {
390
- return Get-AzureRMVirtualMachine - Name $this.Name ;
401
+ [object ] GetInfo([ object ] $context ) {
402
+ return Get-AzureRMVirtualMachine - Name $this.Name - AzureRmContext $context ;
391
403
}
392
404
393
405
[object ] Create([CreateParams ] $p ) {
394
406
$networkInterfaceInstance = $this.NetworkInterface.GetOrCreate ($p );
395
407
396
- if (-not $this.Credential ) {
397
- $this.Credential = Get-Credential ;
398
- }
399
-
400
408
$vmImage = $this.Images | Where-Object { $_.Name -eq $this.ImageName } | Select-Object - First 1 ;
401
409
if (-not $vmImage ) {
402
410
throw " Unknown image: " + $this.ImageName ;
@@ -437,6 +445,7 @@ class VirtualMachine: AzureObject {
437
445
- ResourceGroupName $p.ResourceGroupName `
438
446
- Location $p.Location `
439
447
- VM $vmConfig `
448
+ - AzureRmContext $p.Context `
440
449
- WarningAction SilentlyContinue `
441
450
- ErrorAction Stop
442
451
}
@@ -539,4 +548,4 @@ $images = $staticImages.psobject.Properties | ForEach-Object {
539
548
}
540
549
}
541
550
542
- Export-ModuleMember - Function New-AzVm
551
+ Export-ModuleMember - Function New-AzVm
0 commit comments