Skip to content

Scenario tests and some minor bug fixes #980

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

Merged
merged 13 commits into from Sep 29, 2015
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
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@
<Compile Include="Common\ComputeTestController.cs" />
<Compile Include="ScenarioTests\AddVhdTests.cs" />
<Compile Include="ScenarioTests\ComputeCloudExceptionTests.cs" />
<Compile Include="ScenarioTests\DscExtensionTests.cs" />
<Compile Include="ScenarioTests\VMDynamicTests.cs" />
<Compile Include="ScenarioTests\VirtualMachineProfileTests.cs" />
<Compile Include="ScenarioTests\AvailabilitySetTests.cs" />
Expand Down Expand Up @@ -207,6 +208,12 @@
<None Include="ScenarioTests\ComputeCloudExceptionTests.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="ScenarioTests\DscExtensionTests.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="ScenarioTests\DummyConfig.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="ScenarioTests\Generated\VirtualMachineDynamicTest1.ps1">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand Down Expand Up @@ -248,6 +255,9 @@
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.ComputeCloudExceptionTests\RunComputeCloudExceptionTests.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.DscExtensionTests\TestGetAzureRmVMDscExtension.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests\TestVirtualMachineAccessExtension.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Microsoft.WindowsAzure.Commands.ScenarioTest;
using Xunit;

namespace Microsoft.Azure.Commands.Compute.Test.ScenarioTests
{
public class DscExtensionTests
{
[Fact(Skip = "PSGet Migration: TODO: Get-AzureRmSubscription")]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestGetAzureRmVMDscExtension()
{
ComputeTestController.NewInstance.RunPsTest("Test-GetAzureRmVMDscExtension");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<#
.SYNOPSIS
End to end DSC test that tests Get-AzureRmVMDscExtension cmdlet. It does the following:
1) Publishes a configuration to the default storage account using Publish-AzureRmVMDscConfiguration cmdlet
2) Installs the extension by calling Set-AzureRmVMDscExtension cmdlet on a VM.
3) Calls Get-AzureRmVMDscExtensionStatus cmdlet to check the status of the extension installation.
4) Calls Get-AzureRmVMDscExtension cmdlet to get extension details post installation.
#>
function Test-GetAzureRmVMDscExtension
{
Set-StrictMode -Version latest; $ErrorActionPreference = 'Stop'

# Setup
$rgname = Get-ComputeTestResourceName

try
{
# Common
$loc = Get-ComputeVMLocation;
New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;

# VM Profile & Hardware
$vmsize = 'Standard_A2';
$vmname = 'vm' + $rgname;
$p = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize;
Assert-AreEqual $p.HardwareProfile.VirtualMachineSize $vmsize;

# NRP
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
$vnet = New-AzureRmVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -DnsServer "10.1.1.1" -Subnet $subnet;
$vnet = Get-AzureRmVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
$subnetId = $vnet.Subnets[0].Id;
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
$pubipId = $pubip.Id;
$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
$nic = Get-AzureRmNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
$nicId = $nic.Id;

$p = Add-AzureRmVMNetworkInterface -VM $p -Id $nicId;
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 1;
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].ReferenceUri $nicId;

# Storage Account
$stoname = 'sto' + $rgname;
$stotype = 'Standard_GRS';
New-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
Retry-IfException { $global:stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname; }

$osDiskName = 'osDisk';
$osDiskCaching = 'ReadWrite';
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/test/os.vhd";
$dataDiskVhdUri1 = "https://$stoname.blob.core.windows.net/test/data1.vhd";

$p = Set-AzureRmVMOSDisk -VM $p -Name $osDiskName -VhdUri $osDiskVhdUri -Caching $osDiskCaching -CreateOption FromImage;
$p = Add-AzureRmVMDataDisk -VM $p -Name 'testDataDisk1' -Caching 'ReadOnly' -DiskSizeInGB 10 -Lun 1 -VhdUri $dataDiskVhdUri1 -CreateOption Empty;

# OS & Image
$user = "Foo12";
$password = 'BaR@123' + $rgname;
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);
$computerName = 'test';
$vhdContainer = "https://$stoname.blob.core.windows.net/test";

$p = Set-AzureRmVMOperatingSystem -VM $p -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent;

$imgRef = Get-DefaultCRPWindowsImageOffline;
$p = ($imgRef | Set-AzureRmVMSourceImage -VM $p);

# Virtual Machine
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;

# Test DSC Extension
$version = '2.3';

# Publish DSC Configuration
#TODO: Find a way to mock calls with storage
#$configPath = '.\ScenarioTests\DummyConfig.ps1'
#Publish-AzureRmVMDscConfiguration -ConfigurationPath $configPath -ResourceGroupName $rgname -StorageAccountName $stoname -Force -Verbose

#Install DSC Extension handler
Set-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname -ArchiveBlobName $null -ArchiveStorageAccountName $stoname -Version $version -Force -Location $loc

$extension = Get-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname
Assert-NotNull $extension
Assert-AreEqual $extension.ResourceGroupName $rgname
Assert-AreEqual $extension.Name "Microsoft.Powershell.DSC"
Assert-AreEqual $extension.Publisher "Microsoft.Powershell"
Assert-AreEqual $extension.ExtensionType "DSC"
Assert-AreEqual $extension.TypeHandlerVersion $version
Assert-AreEqual $extension.Location $loc
Assert-NotNull $extension.ProvisioningState

$status = Get-AzureRmVMDscExtensionStatus -ResourceGroupName $rgname -VMName $vmname
Assert-NotNull $status
Assert-AreEqual $status.ResourceGroupName $rgname
Assert-AreEqual $status.VmName $vmname
Assert-AreEqual $status.Version $version
Assert-NotNull $status.Status
Assert-NotNull $status.Timestamp

# Remove Extension
Remove-AzureRmVMDscExtension -ResourceGroupName $rgname -VMName $vmname
}
finally
{
# Cleanup
Clean-ResourceGroup $rgname
}
}

#helper methods for ARM
function Get-DefaultResourceGroupLocation
{
$location = Get-AzureRmLocation | where {$_.Name -eq "Microsoft.Resources/resourceGroups"}
return $location.Locations[0]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Configuration DummyConfig
{
Import-DscResource -ModuleName PSDesiredStateConfiguration

Script dummyscript
{
SetScript = 'Write-Verbose -Verbose "Testing Dummy script!!"'
GetScript = "Test dummyscript"
TestScript = {$false}
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@
<Compile Include="Extension\Diagnostics\GetAzureVMDiagnosticsExtension.cs" />
<Compile Include="Extension\Diagnostics\RemoveAzureVMDiagnosticsExtension.cs" />
<Compile Include="Extension\Diagnostics\SetAzureVMDiagnosticsExtension.cs" />
<Compile Include="Extension\DSC\GetAzureVMDscExtensionStatusCommand.cs" />
<Compile Include="Extension\DSC\GetDscResourceException.cs" />
<Compile Include="Extension\DSC\DscExtensionPublishCmdletCommonBase.cs" />
<Compile Include="Extension\DSC\DscExtensionCmdletCommonBase.cs" />
Expand All @@ -221,6 +222,7 @@
<Compile Include="Extension\DSC\SetAzureVMDscExtensionCommand.cs" />
<Compile Include="Extension\DSC\VirtualMachineDscExtensionContext.cs" />
<Compile Include="Extension\DSC\GetAzureVMDscExtensionCommand.cs" />
<Compile Include="Extension\DSC\VirtualMachineDscExtensionStatusContext.cs" />
<Compile Include="Extension\SetAzureVMExtensionCommand.cs" />
<Compile Include="Extension\RemoveAzureVMExtensionCommand.cs" />
<Compile Include="Extension\GetAzureVMExtensionCommand.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public static class ProfileNouns
//DSC
public const string VirtualMachineDscExtension = "AzureRmVMDscExtension";
public const string VirtualMachineDscConfiguration = "AzureRmVMDscConfiguration";

public const string VirtualMachineDscExtensionStatus = "AzureRmVMDscExtensionStatus";
public const string Vhd = "AzureRmVhd";

// Sql Server
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,11 @@ private VirtualMachineDscExtensionContext GetDscExtensionContext(PSVirtualMachin
{
context.ModulesUrl = extensionPublicSettings.ModulesUrl;
context.ConfigurationFunction = extensionPublicSettings.ConfigurationFunction;
context.Properties = new Hashtable(extensionPublicSettings.Properties.ToDictionary(x => x.Name, x => x.Value));
if (extensionPublicSettings.Properties != null)
{
context.Properties =
new Hashtable(extensionPublicSettings.Properties.ToDictionary(x => x.Name, x => x.Value));
}
}

return context;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
using System.Management.Automation;
using Microsoft.Azure.Commands.Compute.Common;
using Microsoft.Azure.Commands.Compute.Models;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using Microsoft.WindowsAzure.Commands.Common.Extensions.DSC;

namespace Microsoft.Azure.Commands.Compute.Extension.DSC
{
/// <summary>
/// This cmdlet is used to get the status of the DSC extension handler for a VM
/// in a resource group. When a configuration is applied this cmdlet produces output
/// consistent with Start-DscConfiguration.
///
/// Note: To get detailed output -Verbose flag need to be specified
///
/// Example Usage:
/// Get-AzureVMDscExtensionStatus -ResourceGroupName resgrp1 -VMName vm1
/// /// Get-AzureVMDscExtensionStatus -ResourceGroupName resgrp1 -VMName vm1 -Name DSC
/// </summary>
[Cmdlet(
VerbsCommon.Get,
ProfileNouns.VirtualMachineDscExtensionStatus),
OutputType(
typeof(PSVirtualMachineInstanceView))]
public class GetAzureVMDscExtensionStatusCommand : VirtualMachineExtensionBaseCmdlet
{
[Parameter(
Mandatory = true,
Position = 0,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The resource group name.")]
[ValidateNotNullOrEmpty]
public string ResourceGroupName { get; set; }

[Parameter(
Mandatory = true,
Position = 1,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The virtual machine name.")]
[ValidateNotNullOrEmpty]
public string VMName { get; set; }

[Parameter(
Position = 2,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Name of the ARM resource that represents the extension. The Set-AzureVMDscExtension cmdlet sets this name to " +
"'Microsoft.Powershell.DSC', which is the same value used by Get-AzureVMDscExtension. Specify this parameter only if you changed " +
"the default name in the Set cmdlet or used a different resource name in an ARM template.")]
[ValidateNotNullOrEmpty]
public string Name { get; set; }

protected override void ProcessRecord()
{
base.ProcessRecord();

if (String.IsNullOrEmpty(Name))
{
Name = DscExtensionCmdletConstants.ExtensionPublishedNamespace + "." + DscExtensionCmdletConstants.ExtensionPublishedName;
}

var result = VirtualMachineExtensionClient.GetWithInstanceView(ResourceGroupName, VMName, Name);
if (result != null && result.VirtualMachineExtension != null)
{
WriteObject(GetDscExtensionStatusContext(result.VirtualMachineExtension, ResourceGroupName, VMName));
}
else
{
WriteObject(null);
}
}

private VirtualMachineDscExtensionStatusContext GetDscExtensionStatusContext(
VirtualMachineExtension virtualMachineExtension, string resourceGroupName, string vmName)
{
var context = new VirtualMachineDscExtensionStatusContext
{
ResourceGroupName = resourceGroupName,
VmName = vmName,
Version = virtualMachineExtension.TypeHandlerVersion,
};

var instanceView = virtualMachineExtension.InstanceView;
if (instanceView == null) return context;

var statuses = instanceView.Statuses;
var substatuses = instanceView.SubStatuses;

if (statuses != null && statuses.Count > 0)
{
context.StatusCode = statuses[0].Code;
context.Status = statuses[0].DisplayStatus;
context.StatusMessage = statuses[0].Message;
context.Timestamp = statuses[0].Time == null ? DateTime.MinValue : statuses[0].Time.GetValueOrDefault();
}

if (substatuses != null && substatuses.Count > 0)
{
context.DscConfigurationLog = !string.Empty.Equals(substatuses[0].Message)
? substatuses[0].Message.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None)
: new List<String>().ToArray();
}

return context;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

using System;

namespace Microsoft.Azure.Commands.Compute.Extension.DSC
{
public class VirtualMachineDscExtensionStatusContext
{
public string ResourceGroupName { get; set; }
public string VmName { get; set; }
public string Version { get; set; }
public string Status { get; set; }
public string StatusCode { get; set; }
public string StatusMessage { get; set; }
public string[] DscConfigurationLog { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
}
Loading