Skip to content

Commit fb25694

Browse files
committed
Merge pull request #980 from dscsolutions/release-dev
Scenario tests and some minor bug fixes
2 parents c744659 + 78a0569 commit fb25694

File tree

18 files changed

+16286
-3
lines changed

18 files changed

+16286
-3
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156
<Compile Include="Common\ComputeTestController.cs" />
157157
<Compile Include="ScenarioTests\AddVhdTests.cs" />
158158
<Compile Include="ScenarioTests\ComputeCloudExceptionTests.cs" />
159+
<Compile Include="ScenarioTests\DscExtensionTests.cs" />
159160
<Compile Include="ScenarioTests\VMDynamicTests.cs" />
160161
<Compile Include="ScenarioTests\VirtualMachineProfileTests.cs" />
161162
<Compile Include="ScenarioTests\AvailabilitySetTests.cs" />
@@ -207,6 +208,12 @@
207208
<None Include="ScenarioTests\ComputeCloudExceptionTests.ps1">
208209
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
209210
</None>
211+
<None Include="ScenarioTests\DscExtensionTests.ps1">
212+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
213+
</None>
214+
<None Include="ScenarioTests\DummyConfig.ps1">
215+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
216+
</None>
210217
<None Include="ScenarioTests\Generated\VirtualMachineDynamicTest1.ps1">
211218
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
212219
</None>
@@ -248,6 +255,9 @@
248255
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.ComputeCloudExceptionTests\RunComputeCloudExceptionTests.json">
249256
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
250257
</None>
258+
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.DscExtensionTests\TestGetAzureRmVMDscExtension.json">
259+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
260+
</None>
251261
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests\TestVirtualMachineAccessExtension.json">
252262
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
253263
</None>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Microsoft.WindowsAzure.Commands.ScenarioTest;
2+
using Xunit;
3+
4+
namespace Microsoft.Azure.Commands.Compute.Test.ScenarioTests
5+
{
6+
public class DscExtensionTests
7+
{
8+
[Fact(Skip = "PSGet Migration: TODO: Get-AzureRmSubscription")]
9+
[Trait(Category.AcceptanceType, Category.CheckIn)]
10+
public void TestGetAzureRmVMDscExtension()
11+
{
12+
ComputeTestController.NewInstance.RunPsTest("Test-GetAzureRmVMDscExtension");
13+
}
14+
}
15+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<#
2+
.SYNOPSIS
3+
End to end DSC test that tests Get-AzureRmVMDscExtension cmdlet. It does the following:
4+
1) Publishes a configuration to the default storage account using Publish-AzureRmVMDscConfiguration cmdlet
5+
2) Installs the extension by calling Set-AzureRmVMDscExtension cmdlet on a VM.
6+
3) Calls Get-AzureRmVMDscExtensionStatus cmdlet to check the status of the extension installation.
7+
4) Calls Get-AzureRmVMDscExtension cmdlet to get extension details post installation.
8+
#>
9+
function Test-GetAzureRmVMDscExtension
10+
{
11+
Set-StrictMode -Version latest; $ErrorActionPreference = 'Stop'
12+
13+
# Setup
14+
$rgname = Get-ComputeTestResourceName
15+
16+
try
17+
{
18+
# Common
19+
$loc = Get-ComputeVMLocation;
20+
New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
21+
22+
# VM Profile & Hardware
23+
$vmsize = 'Standard_A2';
24+
$vmname = 'vm' + $rgname;
25+
$p = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize;
26+
Assert-AreEqual $p.HardwareProfile.VirtualMachineSize $vmsize;
27+
28+
# NRP
29+
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
30+
$vnet = New-AzureRmVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -DnsServer "10.1.1.1" -Subnet $subnet;
31+
$vnet = Get-AzureRmVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
32+
$subnetId = $vnet.Subnets[0].Id;
33+
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
34+
$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
35+
$pubipId = $pubip.Id;
36+
$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
37+
$nic = Get-AzureRmNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
38+
$nicId = $nic.Id;
39+
40+
$p = Add-AzureRmVMNetworkInterface -VM $p -Id $nicId;
41+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 1;
42+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].ReferenceUri $nicId;
43+
44+
# Storage Account
45+
$stoname = 'sto' + $rgname;
46+
$stotype = 'Standard_GRS';
47+
New-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
48+
Retry-IfException { $global:stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname; }
49+
50+
$osDiskName = 'osDisk';
51+
$osDiskCaching = 'ReadWrite';
52+
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/test/os.vhd";
53+
$dataDiskVhdUri1 = "https://$stoname.blob.core.windows.net/test/data1.vhd";
54+
55+
$p = Set-AzureRmVMOSDisk -VM $p -Name $osDiskName -VhdUri $osDiskVhdUri -Caching $osDiskCaching -CreateOption FromImage;
56+
$p = Add-AzureRmVMDataDisk -VM $p -Name 'testDataDisk1' -Caching 'ReadOnly' -DiskSizeInGB 10 -Lun 1 -VhdUri $dataDiskVhdUri1 -CreateOption Empty;
57+
58+
# OS & Image
59+
$user = "Foo12";
60+
$password = 'BaR@123' + $rgname;
61+
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
62+
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);
63+
$computerName = 'test';
64+
$vhdContainer = "https://$stoname.blob.core.windows.net/test";
65+
66+
$p = Set-AzureRmVMOperatingSystem -VM $p -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent;
67+
68+
$imgRef = Get-DefaultCRPWindowsImageOffline;
69+
$p = ($imgRef | Set-AzureRmVMSourceImage -VM $p);
70+
71+
# Virtual Machine
72+
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;
73+
74+
# Test DSC Extension
75+
$version = '2.3';
76+
77+
# Publish DSC Configuration
78+
#TODO: Find a way to mock calls with storage
79+
#$configPath = '.\ScenarioTests\DummyConfig.ps1'
80+
#Publish-AzureRmVMDscConfiguration -ConfigurationPath $configPath -ResourceGroupName $rgname -StorageAccountName $stoname -Force -Verbose
81+
82+
#Install DSC Extension handler
83+
Set-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname -ArchiveBlobName $null -ArchiveStorageAccountName $stoname -Version $version -Force -Location $loc
84+
85+
$extension = Get-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname
86+
Assert-NotNull $extension
87+
Assert-AreEqual $extension.ResourceGroupName $rgname
88+
Assert-AreEqual $extension.Name "Microsoft.Powershell.DSC"
89+
Assert-AreEqual $extension.Publisher "Microsoft.Powershell"
90+
Assert-AreEqual $extension.ExtensionType "DSC"
91+
Assert-AreEqual $extension.TypeHandlerVersion $version
92+
Assert-AreEqual $extension.Location $loc
93+
Assert-NotNull $extension.ProvisioningState
94+
95+
$status = Get-AzureRmVMDscExtensionStatus -ResourceGroupName $rgname -VMName $vmname
96+
Assert-NotNull $status
97+
Assert-AreEqual $status.ResourceGroupName $rgname
98+
Assert-AreEqual $status.VmName $vmname
99+
Assert-AreEqual $status.Version $version
100+
Assert-NotNull $status.Status
101+
Assert-NotNull $status.Timestamp
102+
103+
# Remove Extension
104+
Remove-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname
105+
}
106+
finally
107+
{
108+
# Cleanup
109+
Clean-ResourceGroup $rgname
110+
}
111+
}
112+
113+
#helper methods for ARM
114+
function Get-DefaultResourceGroupLocation
115+
{
116+
$location = Get-AzureRmLocation | where {$_.Name -eq "Microsoft.Resources/resourceGroups"}
117+
return $location.Locations[0]
118+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Configuration DummyConfig
2+
{
3+
Import-DscResource -ModuleName PSDesiredStateConfiguration
4+
5+
Script dummyscript
6+
{
7+
SetScript = 'Write-Verbose -Verbose "Testing Dummy script!!"'
8+
GetScript = "Test dummyscript"
9+
TestScript = {$false}
10+
}
11+
}
12+

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.DscExtensionTests/TestGetAzureRmVMDscExtension.json

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

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
<Compile Include="Extension\Diagnostics\GetAzureVMDiagnosticsExtension.cs" />
214214
<Compile Include="Extension\Diagnostics\RemoveAzureVMDiagnosticsExtension.cs" />
215215
<Compile Include="Extension\Diagnostics\SetAzureVMDiagnosticsExtension.cs" />
216+
<Compile Include="Extension\DSC\GetAzureVMDscExtensionStatusCommand.cs" />
216217
<Compile Include="Extension\DSC\GetDscResourceException.cs" />
217218
<Compile Include="Extension\DSC\DscExtensionPublishCmdletCommonBase.cs" />
218219
<Compile Include="Extension\DSC\DscExtensionCmdletCommonBase.cs" />
@@ -221,6 +222,7 @@
221222
<Compile Include="Extension\DSC\SetAzureVMDscExtensionCommand.cs" />
222223
<Compile Include="Extension\DSC\VirtualMachineDscExtensionContext.cs" />
223224
<Compile Include="Extension\DSC\GetAzureVMDscExtensionCommand.cs" />
225+
<Compile Include="Extension\DSC\VirtualMachineDscExtensionStatusContext.cs" />
224226
<Compile Include="Extension\SetAzureVMExtensionCommand.cs" />
225227
<Compile Include="Extension\RemoveAzureVMExtensionCommand.cs" />
226228
<Compile Include="Extension\GetAzureVMExtensionCommand.cs" />

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public static class ProfileNouns
9797
//DSC
9898
public const string VirtualMachineDscExtension = "AzureRmVMDscExtension";
9999
public const string VirtualMachineDscConfiguration = "AzureRmVMDscConfiguration";
100-
100+
public const string VirtualMachineDscExtensionStatus = "AzureRmVMDscExtensionStatus";
101101
public const string Vhd = "AzureRmVhd";
102102

103103
// Sql Server

src/ResourceManager/Compute/Commands.Compute/Extension/DSC/GetAzureVMDscExtensionCommand.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,11 @@ private VirtualMachineDscExtensionContext GetDscExtensionContext(PSVirtualMachin
149149
{
150150
context.ModulesUrl = extensionPublicSettings.ModulesUrl;
151151
context.ConfigurationFunction = extensionPublicSettings.ConfigurationFunction;
152-
context.Properties = new Hashtable(extensionPublicSettings.Properties.ToDictionary(x => x.Name, x => x.Value));
152+
if (extensionPublicSettings.Properties != null)
153+
{
154+
context.Properties =
155+
new Hashtable(extensionPublicSettings.Properties.ToDictionary(x => x.Name, x => x.Value));
156+
}
153157
}
154158

155159
return context;
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Management.Automation;
4+
using Microsoft.Azure.Commands.Compute.Common;
5+
using Microsoft.Azure.Commands.Compute.Models;
6+
using Microsoft.Azure.Management.Compute;
7+
using Microsoft.Azure.Management.Compute.Models;
8+
using Microsoft.WindowsAzure.Commands.Common.Extensions.DSC;
9+
10+
namespace Microsoft.Azure.Commands.Compute.Extension.DSC
11+
{
12+
/// <summary>
13+
/// This cmdlet is used to get the status of the DSC extension handler for a VM
14+
/// in a resource group. When a configuration is applied this cmdlet produces output
15+
/// consistent with Start-DscConfiguration.
16+
///
17+
/// Note: To get detailed output -Verbose flag need to be specified
18+
///
19+
/// Example Usage:
20+
/// Get-AzureVMDscExtensionStatus -ResourceGroupName resgrp1 -VMName vm1
21+
/// /// Get-AzureVMDscExtensionStatus -ResourceGroupName resgrp1 -VMName vm1 -Name DSC
22+
/// </summary>
23+
[Cmdlet(
24+
VerbsCommon.Get,
25+
ProfileNouns.VirtualMachineDscExtensionStatus),
26+
OutputType(
27+
typeof(PSVirtualMachineInstanceView))]
28+
public class GetAzureVMDscExtensionStatusCommand : VirtualMachineExtensionBaseCmdlet
29+
{
30+
[Parameter(
31+
Mandatory = true,
32+
Position = 0,
33+
ValueFromPipelineByPropertyName = true,
34+
HelpMessage = "The resource group name.")]
35+
[ValidateNotNullOrEmpty]
36+
public string ResourceGroupName { get; set; }
37+
38+
[Parameter(
39+
Mandatory = true,
40+
Position = 1,
41+
ValueFromPipelineByPropertyName = true,
42+
HelpMessage = "The virtual machine name.")]
43+
[ValidateNotNullOrEmpty]
44+
public string VMName { get; set; }
45+
46+
[Parameter(
47+
Position = 2,
48+
ValueFromPipelineByPropertyName = true,
49+
HelpMessage = "Name of the ARM resource that represents the extension. The Set-AzureVMDscExtension cmdlet sets this name to " +
50+
"'Microsoft.Powershell.DSC', which is the same value used by Get-AzureVMDscExtension. Specify this parameter only if you changed " +
51+
"the default name in the Set cmdlet or used a different resource name in an ARM template.")]
52+
[ValidateNotNullOrEmpty]
53+
public string Name { get; set; }
54+
55+
protected override void ProcessRecord()
56+
{
57+
base.ProcessRecord();
58+
59+
if (String.IsNullOrEmpty(Name))
60+
{
61+
Name = DscExtensionCmdletConstants.ExtensionPublishedNamespace + "." + DscExtensionCmdletConstants.ExtensionPublishedName;
62+
}
63+
64+
var result = VirtualMachineExtensionClient.GetWithInstanceView(ResourceGroupName, VMName, Name);
65+
if (result != null && result.VirtualMachineExtension != null)
66+
{
67+
WriteObject(GetDscExtensionStatusContext(result.VirtualMachineExtension, ResourceGroupName, VMName));
68+
}
69+
else
70+
{
71+
WriteObject(null);
72+
}
73+
}
74+
75+
private VirtualMachineDscExtensionStatusContext GetDscExtensionStatusContext(
76+
VirtualMachineExtension virtualMachineExtension, string resourceGroupName, string vmName)
77+
{
78+
var context = new VirtualMachineDscExtensionStatusContext
79+
{
80+
ResourceGroupName = resourceGroupName,
81+
VmName = vmName,
82+
Version = virtualMachineExtension.TypeHandlerVersion,
83+
};
84+
85+
var instanceView = virtualMachineExtension.InstanceView;
86+
if (instanceView == null) return context;
87+
88+
var statuses = instanceView.Statuses;
89+
var substatuses = instanceView.SubStatuses;
90+
91+
if (statuses != null && statuses.Count > 0)
92+
{
93+
context.StatusCode = statuses[0].Code;
94+
context.Status = statuses[0].DisplayStatus;
95+
context.StatusMessage = statuses[0].Message;
96+
context.Timestamp = statuses[0].Time == null ? DateTime.MinValue : statuses[0].Time.GetValueOrDefault();
97+
}
98+
99+
if (substatuses != null && substatuses.Count > 0)
100+
{
101+
context.DscConfigurationLog = !string.Empty.Equals(substatuses[0].Message)
102+
? substatuses[0].Message.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None)
103+
: new List<String>().ToArray();
104+
}
105+
106+
return context;
107+
}
108+
}
109+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+

2+
using System;
3+
4+
namespace Microsoft.Azure.Commands.Compute.Extension.DSC
5+
{
6+
public class VirtualMachineDscExtensionStatusContext
7+
{
8+
public string ResourceGroupName { get; set; }
9+
public string VmName { get; set; }
10+
public string Version { get; set; }
11+
public string Status { get; set; }
12+
public string StatusCode { get; set; }
13+
public string StatusMessage { get; set; }
14+
public string[] DscConfigurationLog { get; set; }
15+
public DateTimeOffset Timestamp { get; set; }
16+
}
17+
}

0 commit comments

Comments
 (0)