Skip to content

Commit c85c210

Browse files
committed
Add Run Command cmdlets.
1 parent faabfab commit c85c210

File tree

39 files changed

+448057
-59
lines changed

39 files changed

+448057
-59
lines changed

src/ResourceManager/Compute/AzureRM.Compute.psd1

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ CmdletsToExport = 'Remove-AzureRmAvailabilitySet', 'Get-AzureRmAvailabilitySet',
162162
'New-AzureRmImageConfig', 'Set-AzureRmImageOsDisk',
163163
'Add-AzureRmImageDataDisk', 'Remove-AzureRmImageDataDisk',
164164
'ConvertTo-AzureRmVMManagedDisk', 'Set-AzureRmVmssBootDiagnostic',
165-
'Get-AzureRmComputeResourceSku'
165+
'Get-AzureRmComputeResourceSku',
166+
'Get-AzureRmVMRunCommandDocument', 'Invoke-AzureRmVMRunCommand'
166167

167168
# Variables to export from this module
168169
# VariablesToExport = @()

src/ResourceManager/Compute/ChangeLog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
- Additional information about change #1
1919
-->
2020
## Current Release
21+
* Run Command feature:
22+
- New cmdlet: 'Invoke-AzureRmVMRunCommand' invokes a run command on a VM
23+
- New cmdlet: 'Get-AzureRmVMRunCommandDocument' shows available run command documents
24+
* Add 'StorageAccountType' parameter to Set-AzureRmDataDisk
2125

2226
## Version 3.3.1
2327
*

src/ResourceManager/Compute/Commands.Compute.Test/Commands.Compute.Test.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@
178178
<Compile Include="ScenarioTests\DscExtensionTests.cs" />
179179
<Compile Include="ScenarioTests\RunnerTests.cs" />
180180
<Compile Include="ScenarioTests\VirtualMachineBootDiagnosticsTests.cs" />
181+
<Compile Include="ScenarioTests\VirtualMachineRunCommandTests.cs" />
181182
<Compile Include="ScenarioTests\VirtualMachineScaleSetTests.cs" />
182183
<Compile Include="ScenarioTests\VMDynamicTests.cs" />
183184
<Compile Include="ScenarioTests\VirtualMachineProfileTests.cs" />
@@ -303,12 +304,18 @@
303304
<None Include="ScenarioTests\SqlIaaSExtensionTests.ps1">
304305
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
305306
</None>
307+
<None Include="ScenarioTests\test.ps1">
308+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
309+
</None>
306310
<None Include="ScenarioTests\VirtualMachineBootDiagnosticsTests.ps1">
307311
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
308312
</None>
309313
<None Include="ScenarioTests\DiagnosticsExtensionTests.ps1">
310314
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
311315
</None>
316+
<None Include="ScenarioTests\VirtualMachineRunCommandTests.ps1">
317+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
318+
</None>
312319
<None Include="ScenarioTests\VirtualMachineScaleSetTests.ps1">
313320
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
314321
</None>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
using Microsoft.WindowsAzure.Commands.ScenarioTest;
16+
using Xunit;
17+
18+
namespace Microsoft.Azure.Commands.Compute.Test.ScenarioTests
19+
{
20+
public class VirtualMachineRunCommandTests
21+
{
22+
public VirtualMachineRunCommandTests(Xunit.Abstractions.ITestOutputHelper output)
23+
{
24+
ServiceManagemenet.Common.Models.XunitTracingInterceptor.AddToContext(new ServiceManagemenet.Common.Models.XunitTracingInterceptor(output));
25+
}
26+
27+
[Fact]
28+
[Trait(Category.AcceptanceType, Category.CheckIn)]
29+
public void TestVirtualMachineGetRunCommand()
30+
{
31+
ComputeTestController.NewInstance.RunPsTest("Test-VirtualMachineGetRunCommand");
32+
}
33+
34+
[Fact]
35+
[Trait(Category.AcceptanceType, Category.CheckIn)]
36+
public void TestVirtualMachineSetRunCommand()
37+
{
38+
ComputeTestController.NewInstance.RunPsTest("Test-VirtualMachineSetRunCommand");
39+
}
40+
41+
}
42+
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# ----------------------------------------------------------------------------------
2+
#
3+
# Copyright Microsoft Corporation
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
# ----------------------------------------------------------------------------------
14+
15+
<#
16+
.SYNOPSIS
17+
Test Virtual Machine Run Command Get
18+
#>
19+
function Test-VirtualMachineGetRunCommand
20+
{
21+
# Common
22+
$loc = Get-ComputeVMLocation;
23+
$loc = $loc.Replace(" ", "")
24+
25+
$commandId = "RunPowerShellScript"
26+
27+
$result = Get-AzureRmVMRunCommandDocument -Location $loc -CommandId $commandId
28+
29+
Assert-AreEqual $commandId $result.Id
30+
Assert-AreEqual "Windows" $result.OsType
31+
$result_output = $result | Out-String
32+
33+
$result = Get-AzureRmVMRunCommandDocument -Location $loc
34+
35+
Assert-True {$result.Count -gt 0}
36+
$result_output = $result | Out-String
37+
}
38+
39+
40+
<#
41+
.SYNOPSIS
42+
Test Virtual Machine Run Command Set
43+
#>
44+
function Test-VirtualMachineSetRunCommand
45+
{
46+
# Setup
47+
$rgname = Get-ComputeTestResourceName
48+
49+
try
50+
{
51+
# Common
52+
$loc = Get-ComputeVMLocation;
53+
$loc = $loc.Replace(" ", "")
54+
New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
55+
56+
# VM Profile & Hardware
57+
$vmsize = 'Standard_A4';
58+
$vmname = 'vm' + $rgname;
59+
60+
# NRP
61+
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
62+
$vnet = New-AzureRmVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -Subnet $subnet;
63+
$vnet = Get-AzureRmVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
64+
$subnetId = $vnet.Subnets[0].Id;
65+
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
66+
$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
67+
$pubipId = $pubip.Id;
68+
$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
69+
$nic = Get-AzureRmNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
70+
$nicId = $nic.Id;
71+
72+
# Storage Account (SA)
73+
$stoname = 'sto' + $rgname;
74+
$stotype = 'Standard_GRS';
75+
New-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
76+
$stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname;
77+
78+
$osDiskName = 'osDisk';
79+
$osDiskCaching = 'ReadWrite';
80+
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/test/os.vhd";
81+
82+
# OS & Image
83+
$user = "Foo12";
84+
$password = $PLACEHOLDER;
85+
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
86+
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);
87+
$computerName = 'test';
88+
$vhdContainer = "https://$stoname.blob.core.windows.net/test";
89+
90+
$p = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize `
91+
| Add-AzureRmVMNetworkInterface -Id $nicId -Primary `
92+
| Set-AzureRmVMOSDisk -Name $osDiskName -VhdUri $osDiskVhdUri -Caching $osDiskCaching -CreateOption FromImage `
93+
| Set-AzureRmVMOperatingSystem -Windows -ComputerName $computerName -Credential $cred;
94+
95+
$imgRef = Get-DefaultCRPImage -loc $loc;
96+
$imgRef | Set-AzureRmVMSourceImage -VM $p | New-AzureRmVM -ResourceGroupName $rgname -Location $loc;
97+
98+
# Get VM
99+
$vm1 = Get-AzureRmVM -Name $vmname -ResourceGroupName $rgname;
100+
101+
$vm = Get-AzureRmVM -ResourceGroupName $rgname
102+
$commandId = "RunPowerShellScript"
103+
104+
$param = @{"first" = "var1";"second" = "var2"};
105+
106+
#$path = 'F:\hylee-ps\run\src\ResourceManager\Compute\Commands.Compute.Test\bin\Debug\ScenarioTests\test.ps1'
107+
$path = 'ScenarioTests\test.ps1';
108+
109+
$result = Invoke-AzureRmVMRunCommand -ResourceGroupName $rgname -Name $vmname -CommandId $commandId;
110+
#$result = Invoke-AzureRmVMRunCommand -ResourceGroupName $rgname -Name $vmname -CommandId $commandId -ScriptPath $path -Parameter $param;
111+
#$vm | Invoke-AzureRmVMRunCommand -CommandId $commandId -ScriptPath $path -Parameter $param;
112+
$result_output = $result | Out-String;
113+
114+
# Remove All VMs
115+
Get-AzureRmVM -ResourceGroupName $rgname | Remove-AzureRmVM -Force;
116+
$vms = Get-AzureRmVM -ResourceGroupName $rgname;
117+
Assert-AreEqual $vms $null;
118+
}
119+
finally
120+
{
121+
# Cleanup
122+
Clean-ResourceGroup $rgname
123+
}
124+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
param(
2+
[string]$first,
3+
[string]$second
4+
)
5+
Write-Host This is a sample script with parameters $first $second
6+
Write-Host "Second line with escaped characters"

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineRunCommandTests/TestVirtualMachineGetRunCommand.json

Lines changed: 184 additions & 0 deletions
Large diffs are not rendered by default.

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineRunCommandTests/TestVirtualMachineSetRunCommand.json

Lines changed: 447240 additions & 0 deletions
Large diffs are not rendered by default.

src/ResourceManager/Compute/Commands.Compute/Generated/ComputeAutomationBaseCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ private static int GetTabLength(Object obj, int max, int depth, List<Tuple<strin
228228
{
229229
Type propType = elem[i].GetType();
230230

231-
if (propType.IsSerializable)
231+
if (propType.IsSerializable || propType.Equals(typeof(Newtonsoft.Json.Linq.JObject)))
232232
{
233233
tupleList.Add(MakeTuple(property.Name + "[" + i + "]", elem[i].ToString(), depth));
234234
}

src/ResourceManager/Compute/Commands.Compute/Generated/ContainerService/ContainerServiceCreateOrUpdateMethod.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected override void ProcessRecord()
121121
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
122122
ExecuteClientAction(() =>
123123
{
124-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.New))
124+
if (ShouldProcess(this.Name, VerbsCommon.New))
125125
{
126126
string resourceGroupName = this.ResourceGroupName;
127127
string containerServiceName = this.Name;
@@ -173,7 +173,7 @@ protected override void ProcessRecord()
173173
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
174174
ExecuteClientAction(() =>
175175
{
176-
if (ShouldProcess(this.ResourceGroupName, VerbsData.Update))
176+
if (ShouldProcess(this.Name, VerbsData.Update))
177177
{
178178
string resourceGroupName = this.ResourceGroupName;
179179
string containerServiceName = this.Name;

src/ResourceManager/Compute/Commands.Compute/Generated/ContainerService/ContainerServiceDeleteMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ protected override void ProcessRecord()
106106
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
107107
ExecuteClientAction(() =>
108108
{
109-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.Remove)
109+
if (ShouldProcess(this.Name, VerbsCommon.Remove)
110110
&& (this.Force.IsPresent ||
111111
this.ShouldContinue(Properties.Resources.ResourceRemovalConfirmation,
112112
"Remove-AzureRmContainerService operation")))

src/ResourceManager/Compute/Commands.Compute/Generated/Disk/DiskCreateOrUpdateMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected override void ProcessRecord()
121121
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
122122
ExecuteClientAction(() =>
123123
{
124-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.New))
124+
if (ShouldProcess(this.DiskName, VerbsCommon.New))
125125
{
126126
string resourceGroupName = this.ResourceGroupName;
127127
string diskName = this.DiskName;

src/ResourceManager/Compute/Commands.Compute/Generated/Disk/DiskDeleteMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void ProcessRecord()
107107
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
108108
ExecuteClientAction(() =>
109109
{
110-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.Remove)
110+
if (ShouldProcess(this.DiskName, VerbsCommon.Remove)
111111
&& (this.Force.IsPresent ||
112112
this.ShouldContinue(Properties.Resources.ResourceRemovalConfirmation,
113113
"Remove-AzureRmDisk operation")))

src/ResourceManager/Compute/Commands.Compute/Generated/Disk/DiskGrantAccessMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ protected override void ProcessRecord()
137137
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
138138
ExecuteClientAction(() =>
139139
{
140-
if (ShouldProcess(this.ResourceGroupName, VerbsSecurity.Grant))
140+
if (ShouldProcess(this.DiskName, VerbsSecurity.Grant))
141141
{
142142
string resourceGroupName = this.ResourceGroupName;
143143
string diskName = this.DiskName;

src/ResourceManager/Compute/Commands.Compute/Generated/Disk/DiskRevokeAccessMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void ProcessRecord()
107107
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
108108
ExecuteClientAction(() =>
109109
{
110-
if (ShouldProcess(this.ResourceGroupName, VerbsSecurity.Revoke))
110+
if (ShouldProcess(this.DiskName, VerbsSecurity.Revoke))
111111
{
112112
string resourceGroupName = this.ResourceGroupName;
113113
string diskName = this.DiskName;

src/ResourceManager/Compute/Commands.Compute/Generated/Disk/DiskUpdateMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ protected override void ProcessRecord()
124124
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
125125
ExecuteClientAction(() =>
126126
{
127-
if (ShouldProcess(this.ResourceGroupName, VerbsData.Update))
127+
if (ShouldProcess(this.DiskName, VerbsData.Update))
128128
{
129129

130130
string resourceGroupName = this.ResourceGroupName;

src/ResourceManager/Compute/Commands.Compute/Generated/Image/ImageCreateOrUpdateMethod.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected override void ProcessRecord()
121121
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
122122
ExecuteClientAction(() =>
123123
{
124-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.New))
124+
if (ShouldProcess(this.ImageName, VerbsCommon.New))
125125
{
126126
string resourceGroupName = this.ResourceGroupName;
127127
string imageName = this.ImageName;
@@ -174,7 +174,7 @@ protected override void ProcessRecord()
174174
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
175175
ExecuteClientAction(() =>
176176
{
177-
if (ShouldProcess(this.ResourceGroupName, VerbsData.Update))
177+
if (ShouldProcess(this.ImageName, VerbsData.Update))
178178
{
179179
string resourceGroupName = this.ResourceGroupName;
180180
string imageName = this.ImageName;

src/ResourceManager/Compute/Commands.Compute/Generated/Image/ImageDeleteMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void ProcessRecord()
107107
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
108108
ExecuteClientAction(() =>
109109
{
110-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.Remove)
110+
if (ShouldProcess(this.ImageName, VerbsCommon.Remove)
111111
&& (this.Force.IsPresent ||
112112
this.ShouldContinue(Properties.Resources.ResourceRemovalConfirmation,
113113
"Remove-AzureRmImage operation")))

src/ResourceManager/Compute/Commands.Compute/Generated/Models/ComputeAutoMapperProfile.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ protected override void Configure()
8989
Mapper.CreateMap<FROM.SnapshotUpdate, FROM.Snapshot>();
9090
Mapper.CreateMap<FROM.SnapshotUpdate, TO.PSSnapshotUpdate>();
9191
Mapper.CreateMap<TO.PSSnapshotUpdate, FROM.SnapshotUpdate>();
92-
Mapper.CreateMap<FROM.RunCommandInput, TO.PSRunCommandInput>();
93-
Mapper.CreateMap<TO.PSRunCommandInput, FROM.RunCommandInput>();
9492
Mapper.CreateMap<FROM.AvailabilitySet, TO.PSAvailabilitySet>();
9593
Mapper.CreateMap<TO.PSAvailabilitySet, FROM.AvailabilitySet>();
9694
Mapper.CreateMap<FROM.OperationStatusResponse, TO.PSOperationStatusResponse>();

src/ResourceManager/Compute/Commands.Compute/Generated/Models/PSRunCommandInput.cs

Lines changed: 0 additions & 29 deletions
This file was deleted.

src/ResourceManager/Compute/Commands.Compute/Generated/Snapshot/SnapshotCreateOrUpdateMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected override void ProcessRecord()
121121
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
122122
ExecuteClientAction(() =>
123123
{
124-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.New))
124+
if (ShouldProcess(this.SnapshotName, VerbsCommon.New))
125125
{
126126
string resourceGroupName = this.ResourceGroupName;
127127
string snapshotName = this.SnapshotName;

src/ResourceManager/Compute/Commands.Compute/Generated/Snapshot/SnapshotDeleteMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ protected override void ProcessRecord()
107107
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
108108
ExecuteClientAction(() =>
109109
{
110-
if (ShouldProcess(this.ResourceGroupName, VerbsCommon.Remove)
110+
if (ShouldProcess(this.SnapshotName, VerbsCommon.Remove)
111111
&& (this.Force.IsPresent ||
112112
this.ShouldContinue(Properties.Resources.ResourceRemovalConfirmation,
113113
"Remove-AzureRmSnapshot operation")))

src/ResourceManager/Compute/Commands.Compute/Generated/Snapshot/SnapshotGrantAccessMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ protected override void ProcessRecord()
137137
AutoMapper.Mapper.AddProfile<ComputeAutomationAutoMapperProfile>();
138138
ExecuteClientAction(() =>
139139
{
140-
if (ShouldProcess(this.ResourceGroupName, VerbsSecurity.Grant))
140+
if (ShouldProcess(this.SnapshotName, VerbsSecurity.Grant))
141141
{
142142
string resourceGroupName = this.ResourceGroupName;
143143
string snapshotName = this.SnapshotName;

0 commit comments

Comments
 (0)