Skip to content

huangpf PR: dev <- Azure:dev #603

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 67 commits into from
Sep 1, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
09bf816
Remove hardcoded default extension names
May 27, 2016
f489d96
Set ExtensionName property when getting extension status
May 28, 2016
3666987
Fix extension name assignment in Disable cmdlet
May 30, 2016
ec6424f
Use the Name property for extension type
May 30, 2016
ae53598
Merge branch 'release-1.5.0' into dev
Jun 2, 2016
b2cf886
Remove duplicate assignment
Jun 2, 2016
dfc53c8
Added ProgressMessage field for disk encryption status
Jun 2, 2016
2cc44ac
Display EncryptionProgress in cmdlet output
Jun 2, 2016
d7f17e4
Fix label name
Jun 2, 2016
6626475
Merge branch 'dev' of github.com:Azure/azure-powershell into dev
Jun 3, 2016
c079b3c
Merge branch 'dev' of github.com:Azure/azure-powershell into dev
Jun 21, 2016
de50276
Allow OS disk encryption on Linux
Jun 22, 2016
f91016f
If extension name is provided, use it when getting the status
Jun 22, 2016
f5451e9
Merge branch 'dev' of github.com:Azure/azure-powershell into dev
Jun 30, 2016
3be1bc1
Merge branch 'dev' of github.com:Azure/azure-powershell into dev
Aug 10, 2016
199e44b
Add updates to Dns help file xml
Aug 18, 2016
95f9f91
Remove force as paramaeter and set confirm impact to high
Aug 19, 2016
026f49f
Iterate through result before Write Object
Aug 19, 2016
d154287
Add test to verify can add record without naming RecordSet
Aug 19, 2016
8f1547f
Fix bug to expose NumRecord Sets and MaxNumRecordSets
Aug 4, 2016
24c4b9e
Added comments to DnsZone
Aug 4, 2016
5a859d0
add test to add and remove records from zone
Aug 8, 2016
f85bb6b
successfully add a record to zone and check recordsets
Aug 8, 2016
42342e5
Modify test to both add and remove record set and test NumberOfRecord…
Aug 9, 2016
55a9438
Create new error message for if SOA record is created
Aug 12, 2016
e71a7d0
Add error handling for if record type is SOA
Aug 12, 2016
d950c33
Add New-AzureRmDnsRecordSet test to Test-RecordSetSOA when record typ…
Aug 12, 2016
8603347
Add new error for zone name in suffix issue
Aug 15, 2016
1f91de7
Add test case to verify if Record Name ends with Zone Name
Aug 15, 2016
aad7cce
Add test case to ensure warning appears/does not interrupt workflow
Aug 15, 2016
e65a073
Merge branch 'helpfileUpdate' into AugustCojaco
Aug 19, 2016
4f5d9f5
Merge branch 'ConfirmBug' into AugustCojaco
Aug 19, 2016
80ec1b6
Merge branch 'NumRecordSetsBugFix6059441' into AugustCojaco
Aug 19, 2016
1c0920c
Merge branch 'SOABugFix5600833' into AugustCojaco
Aug 19, 2016
50e7306
Merge branch 'suffixZoneNameBugFix3172031' into AugustCojaco
Aug 19, 2016
a510eb5
Fixes error & adds tests when Piping RecordSet is not explicitly named
Aug 19, 2016
1e7ccb1
Change -Force to -Confirm:$false in all tests
Aug 19, 2016
e03a6fe
Merge change to -Force/-Confirm and fix conflicts
Aug 19, 2016
1751a3c
Minor fix to new tests from -Force to -Confirm:$false
Aug 19, 2016
930cadb
Use QueryEncryptionStatus operation for Linux VMs
Aug 19, 2016
2606e68
Modify DNS cmdlets to remove Should Continue and add Should Process a…
Aug 22, 2016
70d0564
Resolve Merge conflicts so all RecordsTests use -Confirm:$false inste…
Aug 22, 2016
e825b29
Parse the encryption status from JSON in substatus field for Linux VMs
Aug 22, 2016
624c813
Add new prompts to resources
Aug 22, 2016
34a3d0d
Add ConfirmAction to cmdlets
Aug 22, 2016
f2ef2eb
Add Bug ID for future reference
Aug 22, 2016
f0b3a4d
Fix spacing
Aug 23, 2016
79f789a
Merge remote-tracking branch 'upstream/dev' into dev
Aug 28, 2016
6b0bf42
Use Unknown for encryption status for issue Azure/WALinuxAgent#388
Aug 29, 2016
6df090a
Adds minor fix where tests have all passed on production endpoint
Aug 29, 2016
c7b894f
Merge branch 'dev' into SeptemberCojaco
Aug 30, 2016
d4d5774
Capitalize "Windows"
Aug 30, 2016
674d0e0
bug fixes for vnet peering and effective nsg
DeepakRajendranMsft Aug 30, 2016
aaa84f3
Always use the default name for extension type parameter
Aug 30, 2016
395437b
Fix PR to change ConfirmAction Overload and add JSON files for tests
Aug 30, 2016
d1b4c7b
Use default extension name for type in Disable cmdlet
Aug 30, 2016
7209864
Use default extension name when disabling on Linux VM
Aug 30, 2016
f5d7c03
Add Force params back in and add obsolete because of breaking change
Aug 31, 2016
e7231d8
Merge remote-tracking branch 'upstream/dev' into dev
Aug 31, 2016
8931221
Merge branch 'dev' of https://github.com/Azure/azure-powershell into …
DeepakRajendranMsft Aug 31, 2016
8c284b4
Do null-checks on context and context.SubsStatuses
Aug 31, 2016
727639c
Show message to user if no extension status is available
Aug 31, 2016
def485a
Add disable encryption volume check for Linux VMs
Aug 31, 2016
a9b53c4
Merge remote-tracking branch 'upstream/dev' into dev
Aug 31, 2016
d300324
Merge pull request #2835 from corinajacobson/SeptemberCojaco
markcowl Sep 1, 2016
68a90d2
Merge pull request #2849 from krkhan/dev
markcowl Sep 1, 2016
6cee247
Merge pull request #2865 from DeepakRajendranMsft/BugFixes
markcowl Sep 1, 2016
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 @@ -23,6 +23,9 @@ public static class AzureDiskEncryptionExtensionConstants
public const string aadClientSecretParameterSet = "AAD Client Secret Parameters";
public const string enableEncryptionOperation = "EnableEncryption";
public const string disableEncryptionOperation = "DisableEncryption";
public const string queryEncryptionStatusOperation = "QueryEncryptionStatus";
public const string encryptionResultOsKey = "os";
public const string encryptionResultDataKey = "data";
public const string aadClientIDKey = "AADClientID";
public const string aadClientSecretKey = "AADClientSecret";
public const string aadClientCertThumbprintKey = "AADClientCertThumbprint";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ public AzureDiskEncryptionExtensionContext(PSVirtualMachineExtension psExt)
ProtectedSettings = psExt.ProtectedSettings;
ProvisioningState = psExt.ProvisioningState;
Statuses = psExt.Statuses;
SubStatuses = psExt.SubStatuses;

InitializeAzureDiskEncryptionMembers(psExt);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,20 @@ public override void ExecuteCmdlet()

currentOSType = virtualMachineResponse.StorageProfile.OsDisk.OsType;

if (OperatingSystemTypes.Linux.Equals(currentOSType) &&
!AzureDiskEncryptionExtensionContext.VolumeTypeData.Equals(VolumeType, StringComparison.InvariantCultureIgnoreCase))
{
ThrowTerminatingError(
new ErrorRecord(
new ArgumentException(
string.Format(
CultureInfo.CurrentUICulture,
"Disabling encryption is only allowed on Data volumes for Linux VMs.")),
"InvalidType",
ErrorCategory.NotImplemented,
null));
}

if (this.ShouldProcess(VMName, Properties.Resources.DisableDiskEncryptionAction)
&& (this.Force.IsPresent ||
this.ShouldContinue(Properties.Resources.DisableAzureDiskEncryptionConfirmation, Properties.Resources.DisableAzureDiskEncryptionCaption)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@
using Microsoft.Azure.Commands.Compute.Models;
using Microsoft.Azure.Management.Compute;
using Microsoft.Azure.Management.Compute.Models;
using Microsoft.Rest.Azure;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Management.Automation;

Expand Down Expand Up @@ -45,6 +49,140 @@ public class GetAzureDiskEncryptionStatusCommand : VirtualMachineExtensionBaseCm
[ValidateNotNullOrEmpty]
public string VMName { get; set; }

[Alias("ExtensionName")]
[Parameter(
Mandatory = false,
Position = 2,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The extension name. If this parameter is not specified, default values used are AzureDiskEncryption for Windows VMs and AzureDiskEncryptionForLinux for Linux VMs")]
[ValidateNotNullOrEmpty]
public string Name { get; set; }

private VirtualMachineExtension GetVmExtensionParameters(VirtualMachine vmParameters, OSType currentOSType)
{
Hashtable publicSettings = new Hashtable();
Hashtable protectedSettings = new Hashtable();

publicSettings.Add(AzureDiskEncryptionExtensionConstants.encryptionOperationKey, AzureDiskEncryptionExtensionConstants.queryEncryptionStatusOperation);
publicSettings.Add(AzureDiskEncryptionExtensionConstants.sequenceVersionKey, Guid.NewGuid().ToString());

if (vmParameters == null)
{
ThrowTerminatingError(new ErrorRecord(new ApplicationException(string.Format(CultureInfo.CurrentUICulture, "Get-AzureDiskEncryptionExtension can enable encryption only on a VM that was already created ")),
"InvalidResult",
ErrorCategory.InvalidResult,
null));
}

VirtualMachineExtension vmExtensionParameters = null;

if (OSType.Windows.Equals(currentOSType))
{
this.Name = this.Name ?? AzureDiskEncryptionExtensionContext.ExtensionDefaultName;
vmExtensionParameters = new VirtualMachineExtension
{
Location = vmParameters.Location,
Publisher = AzureDiskEncryptionExtensionContext.ExtensionDefaultPublisher,
VirtualMachineExtensionType = AzureDiskEncryptionExtensionContext.ExtensionDefaultName,
TypeHandlerVersion = AzureDiskEncryptionExtensionContext.ExtensionDefaultVersion,
Settings = publicSettings,
ProtectedSettings = protectedSettings
};
}
else if (OSType.Linux.Equals(currentOSType))
{
this.Name = this.Name ?? AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultName;
vmExtensionParameters = new VirtualMachineExtension
{
Location = vmParameters.Location,
Publisher = AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultPublisher,
VirtualMachineExtensionType = AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultName,
TypeHandlerVersion = AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultVersion,
Settings = publicSettings,
ProtectedSettings = protectedSettings
};
}

return vmExtensionParameters;
}

private string GetExtensionStatusMessage(OSType currentOSType, bool returnSubstatusMessage=false)
{
AzureOperationResponse<VirtualMachineExtension> extensionResult = this.VirtualMachineExtensionClient.GetWithInstanceView(this.ResourceGroupName, this.VMName, this.Name);
if (extensionResult == null)
{
ThrowTerminatingError(new ErrorRecord(new ApplicationFailedException(string.Format(CultureInfo.CurrentUICulture, "Failed to retrieve extension status")),
"InvalidResult",
ErrorCategory.InvalidResult,
null));
}

PSVirtualMachineExtension returnedExtension = extensionResult.ToPSVirtualMachineExtension(
this.ResourceGroupName, this.VMName);

if ((returnedExtension == null) ||
(string.IsNullOrWhiteSpace(returnedExtension.Publisher)) ||
(string.IsNullOrWhiteSpace(returnedExtension.ExtensionType)))
{
ThrowTerminatingError(new ErrorRecord(new ApplicationFailedException(string.Format(CultureInfo.CurrentUICulture, "Missing extension publisher and type info")),
"InvalidResult",
ErrorCategory.InvalidResult,
null));
}
bool publisherMatch = false;
if (OSType.Linux.Equals(currentOSType))
{
if (returnedExtension.Publisher.Equals(AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultPublisher, StringComparison.InvariantCultureIgnoreCase) &&
returnedExtension.ExtensionType.Equals(AzureDiskEncryptionExtensionContext.LinuxExtensionDefaultName, StringComparison.InvariantCultureIgnoreCase))
{
publisherMatch = true;
}
}
else if (OSType.Windows.Equals(currentOSType))
{
if (returnedExtension.Publisher.Equals(AzureDiskEncryptionExtensionContext.ExtensionDefaultPublisher, StringComparison.InvariantCultureIgnoreCase) &&
returnedExtension.ExtensionType.Equals(AzureDiskEncryptionExtensionContext.ExtensionDefaultName, StringComparison.InvariantCultureIgnoreCase))
{
publisherMatch = true;
}
}
if (publisherMatch)
{
AzureDiskEncryptionExtensionContext context = new AzureDiskEncryptionExtensionContext(returnedExtension);
if ((context == null) ||
(context.Statuses == null) ||
(context.Statuses.Count < 1) ||
(string.IsNullOrWhiteSpace(context.Statuses[0].Message)))
{
throw new KeyNotFoundException(string.Format(CultureInfo.CurrentUICulture, "Invalid extension status"));
}

if (returnSubstatusMessage)
{
if((context == null) ||
(context.SubStatuses == null) ||
(context.SubStatuses.Count < 1))
{
throw new KeyNotFoundException(string.Format(CultureInfo.CurrentUICulture, "Invalid extension substatus"));
}
else
{
return context.SubStatuses[0].Message;
}
}

return context.Statuses[0].Message;
}
else
{
ThrowTerminatingError(new ErrorRecord(new ApplicationFailedException(string.Format(CultureInfo.CurrentUICulture, "Extension publisher and type mismatched")),
"InvalidResult",
ErrorCategory.InvalidResult,
null));
}
return null;
}

private OSType GetOSType(VirtualMachine vmParameters)
{
if (vmParameters == null || vmParameters.StorageProfile == null || vmParameters.StorageProfile.OsDisk == null)
Expand Down Expand Up @@ -209,17 +347,72 @@ public override void ExecuteCmdlet()
EncryptionStatus osVolumeEncrypted = IsOsVolumeEncrypted(vmParameters);
DiskEncryptionSettings osVolumeEncryptionSettings = GetOsVolumeEncryptionSettings(vmParameters);
EncryptionStatus dataVolumesEncrypted = AreDataVolumesEncrypted(vmParameters);
AzureDiskEncryptionStatusContext encryptionStatus = null;
string progressMessage = null;

OSType osType = GetOSType(vmParameters);
switch (osType)
{
case OSType.Windows:
case OSType.Linux:
AzureDiskEncryptionStatusContext encryptionStatus = new AzureDiskEncryptionStatusContext
try
{
progressMessage = GetExtensionStatusMessage(osType);
}
catch(KeyNotFoundException)
{
progressMessage = string.Format(CultureInfo.CurrentUICulture, "Extension status not available on the VM");
}

encryptionStatus = new AzureDiskEncryptionStatusContext
{
OsVolumeEncrypted = osVolumeEncrypted,
DataVolumesEncrypted = dataVolumesEncrypted,
OsVolumeEncryptionSettings = osVolumeEncryptionSettings
OsVolumeEncryptionSettings = osVolumeEncryptionSettings,
ProgressMessage = progressMessage
};
WriteObject(encryptionStatus);
break;
case OSType.Linux:
VirtualMachine virtualMachineResponse = this.ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView(
this.ResourceGroupName, VMName).Body;
VirtualMachineExtension parameters = GetVmExtensionParameters(virtualMachineResponse, osType);

this.VirtualMachineExtensionClient.CreateOrUpdateWithHttpMessagesAsync(
this.ResourceGroupName,
this.VMName,
this.Name,
parameters).GetAwaiter().GetResult();

Dictionary<string, string> encryptionStatusParsed = null;
try
{
string encryptionStatusJson = GetExtensionStatusMessage(osType, returnSubstatusMessage: true);
encryptionStatusParsed = JsonConvert.DeserializeObject<Dictionary<string, string>>(encryptionStatusJson);
}
catch(KeyNotFoundException)
{
encryptionStatusParsed = new Dictionary<string, string>()
{
{ AzureDiskEncryptionExtensionConstants.encryptionResultOsKey, EncryptionStatus.Unknown.ToString() },
{ AzureDiskEncryptionExtensionConstants.encryptionResultDataKey, EncryptionStatus.Unknown.ToString() }
};
}

try
{
progressMessage = GetExtensionStatusMessage(osType);
}
catch(KeyNotFoundException)
{
progressMessage = string.Format(CultureInfo.CurrentUICulture, "Extension status not available on the VM");
}

encryptionStatus = new AzureDiskEncryptionStatusContext
{
OsVolumeEncrypted = (EncryptionStatus)Enum.Parse(typeof(EncryptionStatus), encryptionStatusParsed[AzureDiskEncryptionExtensionConstants.encryptionResultOsKey]),
DataVolumesEncrypted = (EncryptionStatus)Enum.Parse(typeof(EncryptionStatus), encryptionStatusParsed[AzureDiskEncryptionExtensionConstants.encryptionResultDataKey]),
OsVolumeEncryptionSettings = osVolumeEncryptionSettings,
ProgressMessage = progressMessage
};
WriteObject(encryptionStatus);
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -430,20 +430,6 @@ public override void ExecuteCmdlet()

currentOSType = virtualMachineResponse.StorageProfile.OsDisk.OsType;

if (OperatingSystemTypes.Linux.Equals(currentOSType) &&
!AzureDiskEncryptionExtensionContext.VolumeTypeData.Equals(VolumeType, StringComparison.InvariantCultureIgnoreCase))
{
ThrowTerminatingError(
new ErrorRecord(
new ArgumentException(
string.Format(
CultureInfo.CurrentUICulture,
"Enabling encryption is only allowed on Data volumes for Linux VMs.")),
"InvalidType",
ErrorCategory.NotImplemented,
null));
}

if (OperatingSystemTypes.Linux.Equals(currentOSType))
{
CreateVMBackupForLinx();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,10 @@
<Label>OsVolumeEncryptionSettings</Label>
<PropertyName>OsVolumeEncryptionSettings</PropertyName>
</ListItem>
<ListItem>
<Label>ProgressMessage</Label>
<PropertyName>ProgressMessage</PropertyName>
</ListItem>
</ListItems>
</ListEntry>
</ListEntries>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ enum EncryptionStatus
{
Encrypted,
NotEncrypted,
NotMounted,
EncryptionInProgress,
VMRestartPending,
Unknown
}

Expand All @@ -29,5 +32,6 @@ class AzureDiskEncryptionStatusContext
public EncryptionStatus OsVolumeEncrypted { get; set; }
public DiskEncryptionSettings OsVolumeEncryptionSettings { get; set; }
public EncryptionStatus DataVolumesEncrypted { get; set; }
public string ProgressMessage { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,12 @@
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.RecordsTests\TestRecordSetTXTNonEmpty.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.RecordsTests\TestRecordSetEndsWithZoneName.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.RecordsTests\TestRecordSetNewRecordNoName.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.ZoneTests\TestZoneCrud.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
Expand Down Expand Up @@ -348,6 +354,9 @@
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.ZoneTests\TestZoneSetNotFound.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="SessionRecords\Microsoft.Azure.Commands.ScenarioTest.DnsTests.ZoneTests\TestZoneAddRemoveRecordSet.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup />
<ItemGroup>
Expand All @@ -357,4 +366,4 @@
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -229,5 +229,18 @@ public void TestRecordSetGet()
{
DnsTestsBase.NewInstance.RunPowerShellTest("Test-RecordSetGet");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestRecordSetEndsWithZoneName()
{
DnsTestsBase.NewInstance.RunPowerShellTest("Test-RecordSetEndsWithZoneName");
}
[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestRecordSetNewRecordNoName()
{
DnsTestsBase.NewInstance.RunPowerShellTest("Test-RecordSetNewRecordNoName");
}
}
}
Loading