Skip to content

Commit

Permalink
Enable Get-AzVM piping to Get-AzVMExtension cmdlet (#14039)
Browse files Browse the repository at this point in the history
* dev, test, changelog, help doc

* resourceId and switch

* id

* resourceId fix

Co-authored-by: Jin Lei <54836179+msJinLei@users.noreply.github.com>
  • Loading branch information
Sandido and msJinLei authored Feb 1, 2021
1 parent 270f1e2 commit d902ad7
Show file tree
Hide file tree
Showing 6 changed files with 2,846 additions and 13 deletions.
7 changes: 7 additions & 0 deletions src/Compute/Compute.Test/ScenarioTests/VirtualMachineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -360,5 +360,12 @@ public void TestVirtualMachineGetVMNameAcrossResourceGroups()
{
TestRunner.RunTestScript("Test-VirtualMachineGetVMNameAcrossResourceGroups");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestVirtualMachineGetVMExtensionPiping()
{
TestRunner.RunTestScript("Test-VirtualMachineGetVMExtensionPiping");
}
}
}
42 changes: 42 additions & 0 deletions src/Compute/Compute.Test/ScenarioTests/VirtualMachineTests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -4523,4 +4523,46 @@ function Test-VirtualMachineGetVMNameAcrossResourceGroups
Clean-ResourceGroup $rgname;
Clean-ResourceGroup $rgname2;
}
}

<#
.SYNOPSIS
#>
function Test-VirtualMachineGetVMExtensionPiping
{
# Setup
$loc = "eastus";
$rgname = Get-ComputeTestResourceName;

try
{
New-AzResourceGroup -Name $rgname -Location $loc -Force;

# VM Profile & Hardware
$vmsize = 'Standard_E2s_v3';
$vmname = 'v' + $rgname;

# Creating a VM using simple parameter set
$username = "admin01"
$password = Get-PasswordForVM | ConvertTo-SecureString -AsPlainText -Force
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
$domainNameLabel1 = "domain1" + $rgname;

$vm1 = New-AzVM -ResourceGroupName $rgname -Location $loc -Name $vmname -Credential $cred -Zone "2" -Size $vmsize -DomainNameLabel $domainNameLabel1;

# No error is thrown
$vmExt = Get-AzVM -VM $vm1 | Get-AzVMExtension;

# Test expected error message when missing ResourceGroup.
$vmname2 = "errorvm";
$vmConfig = New-AzVMConfig -Name $vmname2 -VMSize $vmsize;
Assert-ThrowsContains {
$vmError = $vmconfig | Get-AzVMExtension; } "The incoming virtual machine must have a 'resourceGroupName'.";
}
finally
{
# Cleanup
Clean-ResourceGroup $rgname;
}
}

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions src/Compute/Compute/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
- `Update-AzContainerService`
* Added parameter `-BurstingEnabled` to `New-AzDiskConfig` and `New-AzDiskUpdateConfig`
* Added `-GroupByApplicationId` and `-GroupByUserAgent` parameters to the `Export-AzLogAnalyticThrottledRequest` and `Export-AzLogAnalyticRequestRateByInterval` cmdlets.
* Added `VMParameterSet` parameter set to `Get-AzVMExtension` cmdlet. Added new parameter `-VM` to this parameter set.

## Version 4.8.0
* New parameter `VM` in new parameter set `VMParameterSet` added to `Get-AzVMDscExtensionStatus` and `Get-AzVMDscExtension` cmdlets.
Expand Down
80 changes: 70 additions & 10 deletions src/Compute/Compute/Extension/GetAzureVMExtensionCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,25 @@
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
using System.Management.Automation;
using System.Linq;
using System;
using Microsoft.Azure.Management.Internal.Resources.Utilities.Models;

namespace Microsoft.Azure.Commands.Compute
{
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "VMExtension")]
[Cmdlet("Get", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "VMExtension", DefaultParameterSetName = GetExtensionParamSetName)]
[OutputType(typeof(PSVirtualMachineExtension))]
public class GetAzureVMExtensionCommand : VirtualMachineExtensionBaseCmdlet
{

private const string GetExtensionParamSetName = "GetExtensionParameterSet",
VMParameterSetName = "VMParameterSet",
ResourceIdParameterSet = "ResourceIdParameterSet";

[Parameter(
Mandatory = true,
Position = 0,
ValueFromPipelineByPropertyName = true,
ParameterSetName = GetExtensionParamSetName,
HelpMessage = "The resource group name.")]
[ResourceGroupCompleter]
[ValidateNotNullOrEmpty]
Expand All @@ -38,6 +46,7 @@ public class GetAzureVMExtensionCommand : VirtualMachineExtensionBaseCmdlet
Mandatory = true,
Position = 1,
ValueFromPipelineByPropertyName = true,
ParameterSetName = GetExtensionParamSetName,
HelpMessage = "The virtual machine name.")]
[ResourceNameCompleter("Microsoft.Compute/virtualMachines", "ResourceGroupName")]
[ValidateNotNullOrEmpty]
Expand All @@ -48,6 +57,7 @@ public class GetAzureVMExtensionCommand : VirtualMachineExtensionBaseCmdlet
Mandatory = false,
Position = 2,
ValueFromPipelineByPropertyName = true,
ParameterSetName = GetExtensionParamSetName,
HelpMessage = "The extension name.")]
[ResourceNameCompleter("Microsoft.Compute/virtualMachines/extensions", "ResourceGroupName", "VMName")]
[ValidateNotNullOrEmpty]
Expand All @@ -60,40 +70,90 @@ public class GetAzureVMExtensionCommand : VirtualMachineExtensionBaseCmdlet
[ValidateNotNullOrEmpty]
public SwitchParameter Status { get; set; }

[Parameter(
ParameterSetName = VMParameterSetName,
ValueFromPipeline = true,
HelpMessage = "Specifies the virtual machine object the extension is on.")]
[ValidateNotNullOrEmpty]
public PSVirtualMachine VMObject { get; set; }

[Parameter(
ParameterSetName = ResourceIdParameterSet,
ValueFromPipeline = true,
HelpMessage = "Resource id specifying the virtual machine object the extension is on.")]
[ValidateNotNullOrEmpty]
public string ResourceId { get; set; }

public override void ExecuteCmdlet()
{
base.ExecuteCmdlet();

ExecuteClientAction(() =>
{
string virtualMachineName = "";
string resourceGroup = "";
switch (ParameterSetName)
{
case VMParameterSetName:
virtualMachineName = this.VMObject.Name;
if (this.VMObject.ResourceGroupName == null)
{
WriteError("The incoming virtual machine must have a 'resourceGroupName'.", this.VMObject);
}
resourceGroup = this.VMObject.ResourceGroupName;
break;
case ResourceIdParameterSet:
ResourceIdentifier identifier = new ResourceIdentifier(this.ResourceId);
resourceGroup = identifier.ResourceGroupName;
virtualMachineName = identifier.ResourceName;
break;
default:
virtualMachineName = VMName;
resourceGroup = ResourceGroupName;
break;
}
if (!string.IsNullOrEmpty(Name))
{
if (Status.IsPresent)
{
var result = this.VirtualMachineExtensionClient.GetWithInstanceView(this.ResourceGroupName, this.VMName, this.Name);
WriteObject(result.ToPSVirtualMachineExtension(this.ResourceGroupName, this.VMName));
var result = this.VirtualMachineExtensionClient.GetWithInstanceView(resourceGroup, virtualMachineName, this.Name);
WriteObject(result.ToPSVirtualMachineExtension(resourceGroup, virtualMachineName));
}
else
{
var result = this.VirtualMachineExtensionClient.GetWithHttpMessagesAsync(this.ResourceGroupName,
this.VMName, this.Name).GetAwaiter().GetResult();
WriteObject(result.ToPSVirtualMachineExtension(this.ResourceGroupName, this.VMName));
var result = this.VirtualMachineExtensionClient.GetWithHttpMessagesAsync(resourceGroup,
virtualMachineName, this.Name).GetAwaiter().GetResult();
WriteObject(result.ToPSVirtualMachineExtension(resourceGroup, virtualMachineName));
}
}
else
{
if (Status.IsPresent)
{
var result = this.VirtualMachineExtensionClient.ListWithInstanceView(this.ResourceGroupName, this.VMName).Body.Value;
WriteObject(result.ToList().Select(t => t.ToPSVirtualMachineExtension(this.ResourceGroupName, this.VMName)), true);
var result = this.VirtualMachineExtensionClient.ListWithInstanceView(resourceGroup, virtualMachineName).Body.Value;
WriteObject(result.ToList().Select(t => t.ToPSVirtualMachineExtension(resourceGroup, virtualMachineName)), true);
}
else
{
var result = this.VirtualMachineExtensionClient.ListWithHttpMessagesAsync(this.ResourceGroupName, this.VMName).GetAwaiter().GetResult().Body.Value;
WriteObject(result.ToList().Select(t => t.ToPSVirtualMachineExtension(this.ResourceGroupName, this.VMName)), true);
var result = this.VirtualMachineExtensionClient.ListWithHttpMessagesAsync(resourceGroup, virtualMachineName).GetAwaiter().GetResult().Body.Value;
WriteObject(result.ToList().Select(t => t.ToPSVirtualMachineExtension(resourceGroup, virtualMachineName)), true);
}
}
});
}

private void WriteError(string message, params object[] args)
{
base.WriteError(new ErrorRecord(new Exception(String.Format(message, args)), "Error", ErrorCategory.NotSpecified, null));
}
}
}
73 changes: 70 additions & 3 deletions src/Compute/Compute/help/Get-AzVMExtension.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,24 @@ Gets properties of Virtual Machine Extensions installed on a virtual machine.

## SYNTAX

### GetExtensionParameterSet (Default)
```
Get-AzVMExtension [-ResourceGroupName] <String> [-VMName] <String> [[-Name] <String>] [-Status]
[-DefaultProfile <IAzureContextContainer>] [<CommonParameters>]
```

### VMParameterSet
```
Get-AzVMExtension [-Status] [-VMObject <PSVirtualMachine>] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

### ResourceIdParameterSet
```
Get-AzVMExtension [-Status] [-ResourceId <String>] [-DefaultProfile <IAzureContextContainer>]
[<CommonParameters>]
```

## DESCRIPTION
The **Get-AzVMExtension** cmdlet gets properties of Virtual Machine Extensions installed on a virtual machine.
Specify the name of an extension for which to get properties.
Expand Down Expand Up @@ -98,6 +111,30 @@ AutoUpgradeMinorVersion : True
ForceUpdateTag :
```

### Example 4: Get properties of an extension using the VM parameter
```
PS C:\> $vm = Get-AzVMExtension -ResourceGroupName "ResourceGroup11" -Name "VirtualMachine22"
PS C:\> Get-AzVMExtension -VM $vm
ResourceGroupName : ResourceGroup11
VMName : VirtualMachine22
Name : CustomScriptExtension
Location : eastus
Etag : null
Publisher : Microsoft.Azure.Extensions
ExtensionType : CustomScript
TypeHandlerVersion : 2.0
Id : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/ResourceGroup11
/providers/Microsoft.Compute/virtualMachines/VirtualMachine22/extensions/CustomScriptExtension
PublicSettings : {}
ProtectedSettings :
ProvisioningState : Succeeded
Statuses :
SubStatuses :
AutoUpgradeMinorVersion : True
ForceUpdateTag :
```

This command gets the list of extensions installed on the virtual machine named VirtualMachine22 in the resource group ResourceGroup11.

## PARAMETERS
Expand All @@ -123,7 +160,7 @@ This cmdlet gets properties for the extension that this parameter specifies.
```yaml
Type: System.String
Parameter Sets: (All)
Parameter Sets: GetExtensionParameterSet
Aliases: ExtensionName

Required: False
Expand All @@ -138,7 +175,7 @@ Specifies the name of a resource group.
```yaml
Type: System.String
Parameter Sets: (All)
Parameter Sets: GetExtensionParameterSet
Aliases:

Required: True
Expand All @@ -148,6 +185,21 @@ Accept pipeline input: True (ByPropertyName)
Accept wildcard characters: False
```
### -ResourceId
Resource Id specifying the virtual machine object the extension is on.
```yaml
Type: System.String
Parameter Sets: ResourceIdParameterSet
Aliases:

Required: False
Position: Named
Default value: None
Accept pipeline input: True (ByValue)
Accept wildcard characters: False
```
### -Status
Indicates that this cmdlet gets only the instance view of an extension.
Expand All @@ -169,7 +221,7 @@ This cmdlet gets properties of an extension from the virtual machine that this p
```yaml
Type: System.String
Parameter Sets: (All)
Parameter Sets: GetExtensionParameterSet
Aliases: ResourceName

Required: True
Expand All @@ -179,6 +231,21 @@ Accept pipeline input: True (ByPropertyName)
Accept wildcard characters: False
```
### -VMObject
Specifies the virtual machine object the extension is on.
```yaml
Type: Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine
Parameter Sets: VMParameterSet
Aliases:

Required: False
Position: Named
Default value: None
Accept pipeline input: True (ByValue)
Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
Expand Down

0 comments on commit d902ad7

Please sign in to comment.