Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable Get-AzVM piping to Get-AzVMExtension cmdlet #14039

Merged
merged 7 commits into from
Feb 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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