Skip to content

Commit da9ca43

Browse files
committed
Merge remote-tracking branch 'upstream/dev' into dev
2 parents 7f1eba5 + 237ab20 commit da9ca43

File tree

36 files changed

+6786
-2566
lines changed

36 files changed

+6786
-2566
lines changed

setup/azurecmdfiles.wxi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@
263263
<Component Id="cmpD5624BF8D78E80B0526773DE6E4FD2D2" Guid="*">
264264
<File Id="fil81AE4D49FE4C59DD6526396037D718F7" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\Compute\Microsoft.Azure.Commands.Compute.dll-Help.xml" />
265265
</Component>
266+
<Component Id="cmp2D89D47A52D9C508B335922A76918EE3" Guid="*">
267+
<File Id="filFE04FA7CFF5D29881FA54A6ED872814A" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\Compute\Microsoft.Azure.Commands.Compute.format.generated.ps1xml" />
268+
</Component>
266269
<Component Id="cmp62942A24352ADC631A6C9DAE39D62F70" Guid="*">
267270
<File Id="fil1FB621027ABD42027FCAE84212775303" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\Compute\Microsoft.Azure.Commands.Compute.format.ps1xml" />
268271
</Component>
@@ -883,6 +886,9 @@
883886
<Component Id="cmp4384DC163B139D10A7988F6DCE10A880" Guid="*">
884887
<File Id="fil93B13FEC3D2F0E6C24EEA5A88743673E" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\KeyVault\Microsoft.Azure.Commands.KeyVault.dll" />
885888
</Component>
889+
<Component Id="cmp72DEDEB70C04F613F499759765B491C3" Guid="*">
890+
<File Id="fil945BE330AE595DDFB65805EF5604059F" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\KeyVault\Microsoft.Azure.Commands.KeyVault.dll-help.xml" />
891+
</Component>
886892
<Component Id="cmp92D53BB85B8D42A3C0F2FD08233102D5" Guid="*">
887893
<File Id="fil74E9585A41297A7784BF077B4E9E0783" KeyPath="yes" Source="$(var.sourceDir)\ResourceManager\AzureResourceManager\KeyVault\Microsoft.Azure.Commands.KeyVault.format.ps1xml" />
888894
</Component>
@@ -3908,6 +3914,7 @@
39083914
<ComponentRef Id="cmpEDFE5B7CD43B10FD4C5F82D443DA0C5D" />
39093915
<ComponentRef Id="cmp7F2719BE7827D3FDDF69D7ACB6135115" />
39103916
<ComponentRef Id="cmpD5624BF8D78E80B0526773DE6E4FD2D2" />
3917+
<ComponentRef Id="cmp2D89D47A52D9C508B335922A76918EE3" />
39113918
<ComponentRef Id="cmp62942A24352ADC631A6C9DAE39D62F70" />
39123919
<ComponentRef Id="cmp479E4B1EF0A49C9845DB071F542F5392" />
39133920
<ComponentRef Id="cmpDCDC7F34E3D2A51F32765B8C00AE3808" />
@@ -4102,6 +4109,7 @@
41024109
<ComponentRef Id="cmpF691ECE2E61383DFBF997C509D946386" />
41034110
<ComponentRef Id="cmpDE148D8065A52DA77846D8339A7F2254" />
41044111
<ComponentRef Id="cmp4384DC163B139D10A7988F6DCE10A880" />
4112+
<ComponentRef Id="cmp72DEDEB70C04F613F499759765B491C3" />
41054113
<ComponentRef Id="cmp92D53BB85B8D42A3C0F2FD08233102D5" />
41064114
<ComponentRef Id="cmp5F38D5C60E748EC6C858B453AD3588CF" />
41074115
<ComponentRef Id="cmpF367A5E3647B7598492C73AE20E99B06" />

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/AvailabilitySetTests.ps1

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ function Test-AvailabilitySet
4343
Assert-AreEqual $aset.PlatformUpdateDomainCount $nonDefaultUD;
4444
Assert-AreEqual $aset.PlatformFaultDomainCount $nonDefaultFD;
4545

46-
Remove-AzureAvailabilitySet -ResourceGroupName $rgname -Name $asetName;
46+
Assert-ThrowsContains { Remove-AzureAvailabilitySet -ResourceGroupName $rgname -Name $asetName; } "This cmdlet will remove the specified availability set. Do you want to continue?"
47+
48+
Remove-AzureAvailabilitySet -ResourceGroupName $rgname -Name $asetName -Force;
4749

4850
$asets = Get-AzureAvailabilitySet -ResourceGroupName $rgname;
4951
Assert-AreEqual $asets $null;

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/ComputeTestCommon.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ function Get-DefaultCRPImage
211211
$defaultVersion = $result[0];
212212
}
213213

214-
$vmimg = Get-AzureVMImageDetail -Location $loc -Offer $defaultOffer -PublisherName $defaultPublisher -Skus $defaultSku -Version $defaultVersion;
214+
$vmimg = Get-AzureVMImage -Location $loc -Offer $defaultOffer -PublisherName $defaultPublisher -Skus $defaultSku -Version $defaultVersion;
215215

216216
return $vmimg;
217217
}

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineProfileTests.ps1

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,26 @@ function Test-VirtualMachineProfile
2626

2727
# Network
2828
$ipname = 'hpfip' + ((Get-Random) % 10000);
29-
$ipRefUri = "https://test.foo.bar/$ipname";
29+
$ipRefUri1 = "https://test.foo.bar/$ipname";
3030
$nicName = $ipname + 'nic1';
3131
$publicIPName = $ipname + 'name1';
3232

33-
$p = Add-AzureVMNetworkInterface -VM $p -Id $ipRefUri;
33+
$p = Add-AzureVMNetworkInterface -VM $p -Id $ipRefUri1;
34+
35+
$ipname = 'hpfip' + ((Get-Random) % 10000);
36+
$ipRefUri2 = "https://test.foo.bar/$ipname";
37+
$p = Add-AzureVMNetworkInterface -VM $p -Id $ipRefUri2;
38+
39+
# Remove all NICs
40+
$p = $p | Remove-AzureVMNetworkInterface
41+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 0;
42+
43+
$p = Add-AzureVMNetworkInterface -VM $p -Id $ipRefUri1;
44+
$p = Add-AzureVMNetworkInterface -VM $p -Id $ipRefUri2;
45+
$p = Remove-AzureVMNetworkInterface -VM $p -Id $ipRefUri2;
3446

3547
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 1;
36-
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].ReferenceUri $ipRefUri;
48+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].ReferenceUri $ipRefUri1;
3749

3850
# Storage
3951
$stoname = 'hpfteststo' + ((Get-Random) % 10000);
@@ -66,6 +78,23 @@ function Test-VirtualMachineProfile
6678
Assert-AreEqual $p.StorageProfile.DataDisks[1].Lun 1;
6779
Assert-AreEqual $p.StorageProfile.DataDisks[1].VirtualHardDisk.Uri $dataDiskVhdUri2;
6880

81+
# Remove all data disks
82+
$p = $p | Remove-AzureVMDataDisk;
83+
Assert-AreEqual $p.StorageProfile.DataDisks.Count 0;
84+
85+
$p = Add-AzureVMDataDisk -VM $p -Name 'testDataDisk1' -Caching 'ReadOnly' -DiskSizeInGB 10 -Lun 0 -VhdUri $dataDiskVhdUri1 -CreateOption Empty;
86+
$p = Add-AzureVMDataDisk -VM $p -Name 'testDataDisk2' -Caching 'ReadOnly' -DiskSizeInGB 11 -Lun 1 -VhdUri $dataDiskVhdUri2 -CreateOption Empty;
87+
88+
Assert-AreEqual $p.StorageProfile.DataDisks.Count 2;
89+
Assert-AreEqual $p.StorageProfile.DataDisks[0].Caching 'ReadOnly';
90+
Assert-AreEqual $p.StorageProfile.DataDisks[0].DiskSizeGB 10;
91+
Assert-AreEqual $p.StorageProfile.DataDisks[0].Lun 0;
92+
Assert-AreEqual $p.StorageProfile.DataDisks[0].VirtualHardDisk.Uri $dataDiskVhdUri1;
93+
Assert-AreEqual $p.StorageProfile.DataDisks[1].Caching 'ReadOnly';
94+
Assert-AreEqual $p.StorageProfile.DataDisks[1].DiskSizeGB 11;
95+
Assert-AreEqual $p.StorageProfile.DataDisks[1].Lun 1;
96+
Assert-AreEqual $p.StorageProfile.DataDisks[1].VirtualHardDisk.Uri $dataDiskVhdUri2;
97+
6998
# Windows OS
7099
$user = "Foo12";
71100
$password = 'BaR@000' + ((Get-Random) % 10000);

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineTests.ps1

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,15 @@ function Test-VirtualMachineImageList
252252
{
253253
$versions = $s4 | select -ExpandProperty Version;
254254

255-
$s6 = Get-AzureVMImage -Location $locStr -PublisherName $pub -Offer $offer -Sku $sku -FilterExpression ('name -eq *');
256-
Assert-NotNull $s6;
257-
Assert-NotNull $s6.Count -gt 0;
258-
$verNames = $s6 | select -ExpandProperty Version;
255+
$s5 = Get-AzureVMImage -Location $locStr -PublisherName $pub -Offer $offer -Sku $sku -FilterExpression ('name -eq *');
256+
Assert-NotNull $s5;
257+
Assert-NotNull $s5.Count -gt 0;
258+
$verNames = $s5 | select -ExpandProperty Version;
259259

260260
foreach ($ver in $versions)
261261
{
262262
if ($ver -eq $null -or $ver -eq '') { continue; }
263-
$s6 = Get-AzureVMImageDetail -Location $locStr -PublisherName $pub -Offer $offer -Sku $sku -Version $ver;
263+
$s6 = Get-AzureVMImage -Location $locStr -PublisherName $pub -Offer $offer -Sku $sku -Version $ver;
264264
Assert-NotNull $s6;
265265
$s6;
266266

@@ -299,7 +299,7 @@ function Test-VirtualMachineImageList
299299
$versions = $s2 | select -ExpandProperty Version;
300300
foreach ($ver in $versions)
301301
{
302-
$s3 = Get-AzureVMExtensionImageDetail -Location $locStr -PublisherName $pub -Type $type -Version $ver -FilterExpression '*';
302+
$s3 = Get-AzureVMExtensionImage -Location $locStr -PublisherName $pub -Type $type -Version $ver -FilterExpression '*';
303303

304304
Assert-NotNull $s3;
305305
Assert-True { $s3.Version -eq $ver; }
@@ -316,11 +316,11 @@ function Test-VirtualMachineImageList
316316

317317
# Test Piping
318318
$pubNameFilter = '*Microsoft*Windows*Server*';
319-
$imgs = Get-AzureVMImagePublisher -Location $locStr | where { $_.PublisherName -like $pubNameFilter } | Get-AzureVMImageOffer | Get-AzureVMImageSku | Get-AzureVMImage | Get-AzureVMImageDetail;
319+
$imgs = Get-AzureVMImagePublisher -Location $locStr | where { $_.PublisherName -like $pubNameFilter } | Get-AzureVMImageOffer | Get-AzureVMImageSku | Get-AzureVMImage | Get-AzureVMImage;
320320
Assert-True { $imgs.Count -gt 0 };
321321

322322
$pubNameFilter = '*Microsoft.Compute*';
323-
$extimgs = Get-AzureVMImagePublisher -Location $locStr | where { $_.PublisherName -like $pubNameFilter } | Get-AzureVMExtensionImageType | Get-AzureVMExtensionImage | Get-AzureVMExtensionImageDetail;
323+
$extimgs = Get-AzureVMImagePublisher -Location $locStr | where { $_.PublisherName -like $pubNameFilter } | Get-AzureVMExtensionImageType | Get-AzureVMExtensionImage | Get-AzureVMExtensionImage;
324324
Assert-True { $extimgs.Count -gt 0 };
325325

326326
# Negative Tests
@@ -341,12 +341,12 @@ function Test-VirtualMachineImageList
341341
Assert-ThrowsContains { $s5 = Get-AzureVMImage -Location $locStr -PublisherName $publisherName -Offer $offerName -Skus $skusName -FilterExpression $filter; } "was not found";
342342

343343
$version = '1.0.0';
344-
Assert-ThrowsContains { $s6 = Get-AzureVMImageDetail -Location $locStr -PublisherName $publisherName -Offer $offerName -Skus $skusName -Version $version; } "was not found";
344+
Assert-ThrowsContains { $s6 = Get-AzureVMImage -Location $locStr -PublisherName $publisherName -Offer $offerName -Skus $skusName -Version $version; } "was not found";
345345

346346
# Extension Images
347347
$type = Get-ComputeTestResourceName;
348-
Assert-ThrowsContains { $s7 = Get-AzureVMExtensionImageDetail -Location $locStr -PublisherName $publisherName -Type $type -FilterExpression $filter -Version $version; } "was not found";
349-
348+
Assert-ThrowsContains { $s7 = Get-AzureVMExtensionImage -Location $locStr -PublisherName $publisherName -Type $type -FilterExpression $filter -Version $version; } "was not found";
349+
350350
Assert-ThrowsContains { $s8 = Get-AzureVMExtensionImageType -Location $locStr -PublisherName $publisherName; } "was not found";
351351

352352
Assert-ThrowsContains { $s9 = Get-AzureVMExtensionImage -Location $locStr -PublisherName $publisherName -Type $type -FilterExpression $filter; } "was not found";
@@ -987,7 +987,7 @@ function Test-VirtualMachinePlan2
987987
$vmmImgOfferName = 'a10-vthunder-adc';
988988
$vmmImgSkusName = 'vthunder_byol';
989989
$vmmImgVerName = '1.0.0';
990-
$imgRef = Get-AzureVMImageDetail -PublisherName $vmmImgPubName -Location $loc -Offer $vmmImgOfferName -Skus $vmmImgSkusName -Version $vmmImgVerName;
990+
$imgRef = Get-AzureVMImage -PublisherName $vmmImgPubName -Location $loc -Offer $vmmImgOfferName -Skus $vmmImgSkusName -Version $vmmImgVerName;
991991
$plan = $imgRef.PurchasePlan;
992992
$p = Set-AzureVMSourceImage -VM $p -PublisherName $imgRef.PublisherName -Offer $imgRef.Offer -Skus $imgRef.Skus -Version $imgRef.Version;
993993
$p.Plan = New-Object Microsoft.Azure.Management.Compute.Models.Plan;

src/ResourceManager/Compute/Commands.Compute/AvailabilitySets/RemoveAzureAvailabilitySetCommand.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
// limitations under the License.
1313
// ----------------------------------------------------------------------------------
1414

15+
using AutoMapper;
1516
using Microsoft.Azure.Commands.Compute.Common;
17+
using Microsoft.Azure.Commands.Compute.Models;
1618
using Microsoft.Azure.Management.Compute;
1719
using System.Management.Automation;
1820

1921
namespace Microsoft.Azure.Commands.Compute
2022
{
2123
[Cmdlet(VerbsCommon.Remove, ProfileNouns.AvailabilitySet)]
24+
[OutputType(typeof(PSOperationResponse))]
2225
public class RemoveAzureAvailabilitySetCommand : AvailabilitySetBaseCmdlet
2326
{
2427
[Parameter(
@@ -37,13 +40,24 @@ public class RemoveAzureAvailabilitySetCommand : AvailabilitySetBaseCmdlet
3740
[ValidateNotNullOrEmpty]
3841
public string Name { get; set; }
3942

43+
[Parameter(
44+
Position = 2,
45+
HelpMessage = "To force the removal.")]
46+
[ValidateNotNullOrEmpty]
47+
public SwitchParameter Force { get; set; }
48+
4049
public override void ExecuteCmdlet()
4150
{
4251
base.ExecuteCmdlet();
4352

44-
var op = this.AvailabilitySetClient.Delete(this.ResourceGroupName, this.Name);
45-
46-
WriteObject(op);
53+
if (this.Force.IsPresent
54+
|| this.ShouldContinue(Properties.Resources.AvailabilitySetRemovalConfirmation,
55+
Properties.Resources.AvailabilitySetRemovalCaption))
56+
{
57+
AzureOperationResponse op = this.AvailabilitySetClient.Delete(this.ResourceGroupName, this.Name);
58+
var result = Mapper.Map<PSOperationResponse>(op);
59+
WriteObject(result);
60+
}
4761
}
4862
}
4963
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
<Compile Include="Images\GetAzureVMImageOfferCommand.cs" />
178178
<Compile Include="Images\GetAzureVMImageDetailCommand.cs" />
179179
<Compile Include="Images\VirtualMachineImageBaseCmdlet.cs" />
180+
<Compile Include="Models\PSOperationResponse.cs" />
180181
<Compile Include="Models\PSUsage.cs" />
181182
<Compile Include="Models\PSVirtualMachineExtensionImage.cs" />
182183
<Compile Include="Models\PSVirtualMachineImage.cs" />

src/ResourceManager/Compute/Commands.Compute/Common/ComputeAutoMapperProfile.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ protected override void Configure()
7272
Mapper.CreateMap<FROM.VirtualMachine, TO.PSVirtualMachine>();
7373
Mapper.CreateMap<FROM.VirtualMachineSize, TO.PSVirtualMachineSize>();
7474
Mapper.CreateMap<FROM.Usage, TO.PSUsage>();
75-
7675
Mapper.CreateMap<FROM.ComputeLongRunningOperationResponse, TO.PSComputeLongRunningOperation>();
76+
Mapper.CreateMap<Microsoft.Azure.AzureOperationResponse, TO.PSOperationResponse>();
7777
}
7878
}
7979
}

src/ResourceManager/Compute/Commands.Compute/ExtensionImages/GetAzureVMExtensionImageCommand.cs

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@
2121

2222
namespace Microsoft.Azure.Commands.Compute
2323
{
24-
[Cmdlet(VerbsCommon.Get, ProfileNouns.VirtualMachineExtensionImage)]
25-
[OutputType(typeof(PSVirtualMachineExtensionImage))]
24+
[Cmdlet(VerbsCommon.Get,
25+
ProfileNouns.VirtualMachineExtensionImage)]
26+
[OutputType(typeof(PSVirtualMachineExtensionImageDetails))]
2627
public class GetAzureVMExtensionImageCommand : VirtualMachineExtensionImageBaseCmdlet
2728
{
2829
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true), ValidateNotNullOrEmpty]
@@ -37,34 +38,73 @@ public class GetAzureVMExtensionImageCommand : VirtualMachineExtensionImageBaseC
3738
[Parameter, ValidateNotNullOrEmpty]
3839
public string FilterExpression { get; set; }
3940

41+
[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true)]
42+
public string Version { get; set; }
43+
4044
public override void ExecuteCmdlet()
4145
{
4246
base.ExecuteCmdlet();
4347

44-
var parameters = new VirtualMachineExtensionImageListVersionsParameters
48+
if (string.IsNullOrEmpty(this.Version))
49+
{
50+
var parameters = new VirtualMachineExtensionImageListVersionsParameters
51+
{
52+
Location = Location.Canonicalize(),
53+
PublisherName = PublisherName,
54+
Type = Type,
55+
FilterExpression = FilterExpression
56+
};
57+
58+
VirtualMachineImageResourceList result = this.VirtualMachineExtensionImageClient.ListVersions(parameters);
59+
60+
var images = from r in result.Resources
61+
select new PSVirtualMachineExtensionImage
62+
{
63+
RequestId = result.RequestId,
64+
StatusCode = result.StatusCode,
65+
Id = r.Id,
66+
Location = r.Location,
67+
Version = r.Name,
68+
PublisherName = this.PublisherName,
69+
Type = this.Type,
70+
FilterExpression = this.FilterExpression
71+
};
72+
73+
WriteObject(images, true);
74+
}
75+
else
4576
{
46-
Location = Location.Canonicalize(),
47-
PublisherName = PublisherName,
48-
Type = Type,
49-
FilterExpression = FilterExpression
50-
};
5177

52-
VirtualMachineImageResourceList result = this.VirtualMachineExtensionImageClient.ListVersions(parameters);
78+
var parameters = new VirtualMachineExtensionImageGetParameters
79+
{
80+
Location = Location.Canonicalize(),
81+
PublisherName = PublisherName,
82+
Type = Type,
83+
FilterExpression = FilterExpression,
84+
Version = Version
85+
};
86+
87+
VirtualMachineExtensionImageGetResponse result = this.VirtualMachineExtensionImageClient.Get(parameters);
5388

54-
var images = from r in result.Resources
55-
select new PSVirtualMachineExtensionImage
56-
{
57-
RequestId = result.RequestId,
58-
StatusCode = result.StatusCode,
59-
Id = r.Id,
60-
Location = r.Location,
61-
Version = r.Name,
62-
PublisherName = this.PublisherName,
63-
Type = this.Type,
64-
FilterExpression = this.FilterExpression
65-
};
89+
var image = new PSVirtualMachineExtensionImageDetails
90+
{
91+
RequestId = result.RequestId,
92+
StatusCode = result.StatusCode,
93+
Id = result.VirtualMachineExtensionImage.Id,
94+
Location = result.VirtualMachineExtensionImage.Location,
95+
Name = result.VirtualMachineExtensionImage.Name,
96+
HandlerSchema = result.VirtualMachineExtensionImage.HandlerSchema,
97+
OperatingSystem = result.VirtualMachineExtensionImage.OperatingSystem,
98+
ComputeRole = result.VirtualMachineExtensionImage.ComputeRole,
99+
SupportsMultipleExtensions = result.VirtualMachineExtensionImage.SupportsMultipleExtensions,
100+
VMScaleSetEnabled = result.VirtualMachineExtensionImage.VMScaleSetEnabled,
101+
PublisherName = this.PublisherName,
102+
Type = this.Type,
103+
Version = this.Version
104+
};
66105

67-
WriteObject(images, true);
106+
WriteObject(image);
107+
}
68108
}
69109
}
70110
}

src/ResourceManager/Compute/Commands.Compute/ExtensionImages/GetAzureVMExtensionImageDetailCommand.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public override void ExecuteCmdlet()
4343
{
4444
base.ExecuteCmdlet();
4545

46+
WriteWarning(Properties.Resources.DeprecationOfGetAzureVMExtensionImageDetail);
47+
4648
var parameters = new VirtualMachineExtensionImageGetParameters
4749
{
4850
Location = Location.Canonicalize(),

0 commit comments

Comments
 (0)