From fe83f275f4a85dc66bfe9f1325db92b32d48987d Mon Sep 17 00:00:00 2001 From: mkherani Date: Mon, 8 Jun 2015 19:05:42 +0530 Subject: [PATCH 1/3] My changes --- .../AzureBackupCmdletHelpMessage.cs | 1 + .../Container/RegisterAzureBackupContainer.cs | 120 ++++++++++++++++++ .../UnregisterAzureBackupContainer.cs | 84 ++++++++++++ .../RegisterAzureBackupContainer.cs | 14 ++ .../Commands.AzureBackup.csproj | 6 + .../RegisterContainer/RegisterContainer.cs | 66 ++++++++++ 6 files changed, 291 insertions(+) create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/RegisterContainer/RegisterAzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/RegisterContainer/RegisterContainer.cs diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs index 36ba804e8e69..15331e043040 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs @@ -25,5 +25,6 @@ internal static class AzureBackupCmdletHelpMessage public const string ContainerId = "The container ID."; public const string ContainerRegistrationStatus = "The container registration status."; public const string ContainerType = "The container type."; + public const string VirtualMachine = "Virtual Machine."; } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs new file mode 100644 index 000000000000..d060fc17fc9c --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs @@ -0,0 +1,120 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Azure.Commands.Compute; +using Microsoft.Azure.Management.BackupServices.Models; +using MBS = Microsoft.Azure.Management.BackupServices; +using Microsoft.Azure.Commands.Compute.Models; + + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Get list of containers + /// + [Cmdlet(VerbsLifecycle.Register, "AzureBackupContainer"), OutputType(typeof(Guid))] + public class RegisterAzureBackupContainer : AzureBackupVaultCmdletBase + { + [Parameter(Position = 2, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)] + [ValidateNotNullOrEmpty] + public PSVirtualMachineInstanceView VirtualMachine { get; set; } + + public override void ExecuteCmdlet() + { + base.ExecuteCmdlet(); + + ExecutionBlock(() => + { + string vmName = VirtualMachine.Name; + string rgName = VirtualMachine.ResourceGroupName; + Guid jobId = Guid.Empty; + bool isDiscoveryNeed = false; + MBS.OperationResponse operationResponse; + + ContainerInfo container = null; + isDiscoveryNeed = IsDiscoveryNeeded(vmName, rgName, out container); + if(isDiscoveryNeed) + { + RefreshContainer(); + } + + isDiscoveryNeed = IsDiscoveryNeeded(vmName, rgName, out container); + if((isDiscoveryNeed == false) && (container == null)) + { + //Container is not discovered. Throw exception + throw new NotImplementedException(); + } + else + { + //Container is discovered. Register the container + List containerNameList = new List(); + containerNameList.Add(container.Name); + RegisterContainerRequest registrationRequest = new RegisterContainerRequest(containerNameList, "IaasVMContainer"); //TODO: Container type from enum + operationResponse = AzureBackupClient.Container.RegisterAsync(registrationRequest, GetCustomRequestHeaders(), CmdletCancellationToken).Result; + + //TODO fix the OperationResponse to JobID conversion + jobId = operationResponse.OperationId; + WriteObject(jobId); + } + }); + } + + private void RefreshContainer() + { + MBS.OperationResponse opResponse = + AzureBackupClient.Container.RefreshAsync(GetCustomRequestHeaders(), CmdletCancellationToken).Result; + + //Now wait for the operation to Complete + + //If operat + throw new NotImplementedException(); + } + + private bool IsDiscoveryNeeded(string vmName, string rgName, out ContainerInfo container) + { + bool isDiscoveryNeed = false; + //First check if container is discoverd or not + ListContainerQueryParameter queryParams = new ListContainerQueryParameter(); + queryParams.ContainerFriendlyNameField = vmName; + ListContainerResponse containers = AzureBackupClient.Container.ListAsync(queryParams, + GetCustomRequestHeaders(), CmdletCancellationToken).Result; + if (containers.Objects.Count() == 0) + { + //Container is not discover + WriteVerbose("Container is not discovered"); + container = null; + isDiscoveryNeed = true; + } + + else + { + //We can have multiple container with same friendly name. + //Look for resourceGroup name in the container unoque name + container = containers.Objects.Where(c => c.ParentContainerFriendlyName.ToLower().Equals(rgName.ToLower())).FirstOrDefault(); + if (container == null) + { + //Container is not in list of registered container + isDiscoveryNeed = true; + } + } + return isDiscoveryNeed; + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs new file mode 100644 index 000000000000..1488830062a4 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs @@ -0,0 +1,84 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Azure.Commands.Compute; +using Microsoft.Azure.Management.BackupServices.Models; +using MBS = Microsoft.Azure.Management.BackupServices; +using Microsoft.Azure.Commands.Compute.Models; + + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Get list of containers + /// + [Cmdlet(VerbsLifecycle.Unregister, "AzureBackupContainer"), OutputType(typeof(Guid))] + public class UnregisterAzureBackupContainer : AzureBackupVaultCmdletBase + { + [Parameter(Position = 2, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)] + [ValidateNotNullOrEmpty] + public PSVirtualMachineInstanceView VirtualMachine { get; set; } + + public override void ExecuteCmdlet() + { + base.ExecuteCmdlet(); + + ExecutionBlock(() => + { + string vmName = VirtualMachine.Name; + string rgName = VirtualMachine.ResourceGroupName; + Guid jobId = Guid.Empty; + + ListContainerQueryParameter queryParams = new ListContainerQueryParameter(); + queryParams.ContainerStatusField = "Registered"; //TODO: Use enum + queryParams.ContainerFriendlyNameField = vmName; + + ListContainerResponse containers = + AzureBackupClient.Container.ListAsync(queryParams, + GetCustomRequestHeaders(), CmdletCancellationToken).Result; + if(containers.Objects.Count() == 0) + { + WriteVerbose("Container is not in the registered list"); + jobId = Guid.Empty; + } + + else + { + //We can havemultiple container with same friendly name. + //Look for resourceGroup name in the ParentFriendlyName + ContainerInfo containerToUnreg = containers.Objects.Where(c => c.ParentContainerFriendlyName.ToLower().Equals(rgName.ToLower())).FirstOrDefault(); + if (containerToUnreg == null) + { + //Container is not in list of registered container + jobId = Guid.Empty; + } + else + { + UnregisterContainerRequest unregRequest = new UnregisterContainerRequest(containerToUnreg.Name, "IaasVMContainer"); //TODO: Use enum + MBS.OperationResponse operationResponse = AzureBackupClient.Container.UnregisterAsync(unregRequest, GetCustomRequestHeaders(), CmdletCancellationToken).Result; + jobId = operationResponse.OperationId; //TODO: Fix it once PiyushKa publish the rest APi to get jobId based on operationId + } + } + + WriteObject(jobId); + }); + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/RegisterContainer/RegisterAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/RegisterContainer/RegisterAzureBackupContainer.cs new file mode 100644 index 000000000000..1f896324275f --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/RegisterContainer/RegisterAzureBackupContainer.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Management.Automation; + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets.RegisterContainer +{ + [Cmdlet(VerbsCommon.Get, ProfileNouns.VirtualMachine, DefaultParameterSetName = ListAllVirtualMachinesParamSet)] + class RegisterAzureBackupContainer + { + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj index d844b2eabb8f..c1724cd33cb7 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj @@ -122,6 +122,8 @@ + + @@ -148,6 +150,10 @@ {5ee72c53-1720-4309-b54b-5fb79703195f} Commands.Common + + {52643bd5-6378-49bd-9f6e-dac9dd8a867b} + Commands.Compute + diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/RegisterContainer/RegisterContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/RegisterContainer/RegisterContainer.cs new file mode 100644 index 000000000000..f35a9dc0b509 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/RegisterContainer/RegisterContainer.cs @@ -0,0 +1,66 @@ +// ---------------------------------------------------------------------------------- +// +// Copyright Microsoft Corporation +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------------- + +using Microsoft.Azure.Management.BackupServices.Models; +using System; +using System.Collections.Generic; +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Represents ProtectionPolicy object + /// + public class AzureBackupRegisterContainer : AzureBackupVaultContextObject + { + /// + /// InstanceId of the azurebackup object + /// + public string InstanceId { get; set; } + + /// + /// Name of the azurebackup object + /// + public string Name { get; set; } + + public string WorkloadType { get; set; } + + public string BackupType { get; set; } + + public DateTime ScheduleStartTime { get; set; } + + public IList ScheduleRunTimes { get; set; } + + public string RetentionType { get; set; } + + public int RetentionDuration { get; set; } + + public AzureBackupRegisterContainer() + { + } + + public AzureBackupRegisterContainer(string resourceGroupName, string resourceName, ProtectionPolicyInfo sourcePolicy) + : base(resourceGroupName, resourceName) + { + InstanceId = sourcePolicy.InstanceId; + Name = sourcePolicy.Name; + WorkloadType = sourcePolicy.WorkloadType; + + BackupType = sourcePolicy.Schedule.BackupType; + ScheduleStartTime = sourcePolicy.Schedule.ScheduleStartTime; + ScheduleRunTimes = sourcePolicy.Schedule.ScheduleRunTimes; + + RetentionType = sourcePolicy.Schedule.RetentionPolicy.RetentionType.ToString(); + RetentionDuration = sourcePolicy.Schedule.RetentionPolicy.RetentionDuration; + } + } +} From 59a90f08c0758e11d1e75b428e459ae0da1156d2 Mon Sep 17 00:00:00 2001 From: mkherani Date: Wed, 10 Jun 2015 17:52:58 +0530 Subject: [PATCH 2/3] temp changes --- .../AzureBackupCmdletHelpMessage.cs | 3 - .../Container/RegisterAzureBackupContainer.cs | 110 ++++++++++++++++-- .../UnregisterAzureBackupContainer.cs | 45 ++++++- .../Commands.AzureBackup.csproj | 11 +- ...upContainerType.cs => AzureBackupEnums.cs} | 54 ++++++++- ...atus.cs => ListContainerQueryParameter.cs} | 20 +++- 6 files changed, 214 insertions(+), 29 deletions(-) rename src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/{AzureBackupContainerType.cs => AzureBackupEnums.cs} (51%) rename src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/{AzureBackupContainerStatus.cs => ListContainerQueryParameter.cs} (62%) diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs index 8bb2e661b57e..1e0053c0a732 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs @@ -25,13 +25,10 @@ internal static class AzureBackupCmdletHelpMessage public const string ContainerId = "The container ID."; public const string ContainerRegistrationStatus = "The container registration status."; public const string ContainerType = "The container type."; -<<<<<<< HEAD public const string VirtualMachine = "Virtual Machine."; -======= public const string ContainerResourceGroupName = "The container resource group name."; public const string ProtectionStatus = "Protection Status of the azure backup item."; public const string AzureBackUpItem = "Azure BackUp Item."; public const string RecoveryPointId = "Recovery Point Id."; ->>>>>>> d3cf61941b7653ba9a2edf165b1ae23e38921395 } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs index d060fc17fc9c..ec871d8bcac3 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/RegisterAzureBackupContainer.cs @@ -13,7 +13,9 @@ // ---------------------------------------------------------------------------------- using System; +using System.Web; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using System.Management.Automation; using System.Text; @@ -23,7 +25,6 @@ using MBS = Microsoft.Azure.Management.BackupServices; using Microsoft.Azure.Commands.Compute.Models; - namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets { /// @@ -32,9 +33,16 @@ namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets [Cmdlet(VerbsLifecycle.Register, "AzureBackupContainer"), OutputType(typeof(Guid))] public class RegisterAzureBackupContainer : AzureBackupVaultCmdletBase { + //[Parameter(Position = 2, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)] + //[ValidateNotNullOrEmpty] + //public PSVirtualMachineInstanceView VirtualMachine { get; set; } [Parameter(Position = 2, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)] [ValidateNotNullOrEmpty] - public PSVirtualMachineInstanceView VirtualMachine { get; set; } + public string VirtualMachineName { get; set; } + + [Parameter(Position = 3, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)] + [ValidateNotNullOrEmpty] + public string VirtualMachineRGName { get; set; } public override void ExecuteCmdlet() { @@ -42,8 +50,10 @@ public override void ExecuteCmdlet() ExecutionBlock(() => { - string vmName = VirtualMachine.Name; - string rgName = VirtualMachine.ResourceGroupName; + //string vmName = VirtualMachine.Name; + //string rgName = VirtualMachine.ResourceGroupName; + string vmName = VirtualMachineName; + string rgName = VirtualMachineRGName; Guid jobId = Guid.Empty; bool isDiscoveryNeed = false; MBS.OperationResponse operationResponse; @@ -66,7 +76,7 @@ public override void ExecuteCmdlet() //Container is discovered. Register the container List containerNameList = new List(); containerNameList.Add(container.Name); - RegisterContainerRequest registrationRequest = new RegisterContainerRequest(containerNameList, "IaasVMContainer"); //TODO: Container type from enum + RegisterContainerRequest registrationRequest = new RegisterContainerRequest(containerNameList, AzureBackupContainerType.IaasVMContainer.ToString()); operationResponse = AzureBackupClient.Container.RegisterAsync(registrationRequest, GetCustomRequestHeaders(), CmdletCancellationToken).Result; //TODO fix the OperationResponse to JobID conversion @@ -78,13 +88,55 @@ public override void ExecuteCmdlet() private void RefreshContainer() { - MBS.OperationResponse opResponse = - AzureBackupClient.Container.RefreshAsync(GetCustomRequestHeaders(), CmdletCancellationToken).Result; + bool isRetyNeeded = true; + int retryCount = 1; + bool isDiscoverySuccessful = false; + while (isRetyNeeded && retryCount <= 3) + { + MBS.OperationResponse opResponse = + AzureBackupClient.Container.RefreshAsync(GetCustomRequestHeaders(), CmdletCancellationToken).Result; + + //Now wait for the operation to Complete + isRetyNeeded = WaitForDiscoveryToCOmplete(opResponse.OperationId.ToString(), out isDiscoverySuccessful); + retryCount++; + } + + if (!isDiscoverySuccessful) + { + //Discovery failed + throw new Exception(); //TODO: + } + } + + private bool WaitForDiscoveryToCOmplete(string operationId, out bool isDiscoverySuccessful) + { + bool isRetryNeeded = false; + + + BMSOperationStatusResponse status = new BMSOperationStatusResponse() + { + OperationStatus = AzureBackupOperationStatus.InProgress.ToString() + }; - //Now wait for the operation to Complete + while (status.OperationStatus != AzureBackupOperationStatus.Completed.ToString()) + { + status = AzureBackupClient.OperationStatus.GetAsync(operationId, GetCustomRequestHeaders(), CmdletCancellationToken).Result; + System.Threading.Thread.Sleep(TimeSpan.FromSeconds(15)); + } - //If operat - throw new NotImplementedException(); + isDiscoverySuccessful = true; + //If operation fails check if retry is needed or not + if (status.OperationResult != AzureBackupOperationResult.Succeeded.ToString()) + { + isDiscoverySuccessful = false; + if ((status.ErrorCode == AzureBackupOperationErrorCode.DiscoveryInProgress.ToString() || + (status.ErrorCode == AzureBackupOperationErrorCode.BMSUserErrorObjectLocked.ToString()))) + { + //Need to retry for this errors + isRetryNeeded = true; + } + } + return isRetryNeeded; } private bool IsDiscoveryNeeded(string vmName, string rgName, out ContainerInfo container) @@ -92,8 +144,13 @@ private bool IsDiscoveryNeeded(string vmName, string rgName, out ContainerInfo c bool isDiscoveryNeed = false; //First check if container is discoverd or not ListContainerQueryParameter queryParams = new ListContainerQueryParameter(); - queryParams.ContainerFriendlyNameField = vmName; - ListContainerResponse containers = AzureBackupClient.Container.ListAsync(queryParams, + queryParams.ContainerTypeField = String.Empty; // AzureBackupContainerType.IaasVMContainer.ToString(); + queryParams.ContainerStatusField = String.Empty; + // queryParams.ContainerFriendlyNameField = vmName; + queryParams.ContainerFriendlyNameField = String.Empty; + string queryString = GetQueryFileter(queryParams); + + ListContainerResponse containers = AzureBackupClient.Container.ListAsync(queryString, GetCustomRequestHeaders(), CmdletCancellationToken).Result; if (containers.Objects.Count() == 0) { @@ -116,5 +173,34 @@ private bool IsDiscoveryNeeded(string vmName, string rgName, out ContainerInfo c } return isDiscoveryNeed; } + + private string GetQueryFileter(ListContainerQueryParameter queryParams) + { + NameValueCollection collection = new NameValueCollection(); + if (!String.IsNullOrEmpty(queryParams.ContainerTypeField)) + { + collection.Add("ContainerType", queryParams.ContainerTypeField); + } + + if (!String.IsNullOrEmpty(queryParams.ContainerStatusField)) + { + collection.Add("ContainerStatus", queryParams.ContainerStatusField); + } + + if (!String.IsNullOrEmpty(queryParams.ContainerFriendlyNameField)) + { + collection.Add("FriendlyName", queryParams.ContainerFriendlyNameField); + } + + if (collection == null || collection.Count == 0) + { + return String.Empty; + } + + var httpValueCollection = HttpUtility.ParseQueryString(String.Empty); + httpValueCollection.Add(collection); + + return "&" + httpValueCollection.ToString(); + } } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs index 1488830062a4..3f9b1702899c 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs @@ -13,7 +13,9 @@ // ---------------------------------------------------------------------------------- using System; +using System.Web; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using System.Management.Automation; using System.Text; @@ -23,7 +25,6 @@ using MBS = Microsoft.Azure.Management.BackupServices; using Microsoft.Azure.Commands.Compute.Models; - namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets { /// @@ -47,12 +48,14 @@ public override void ExecuteCmdlet() Guid jobId = Guid.Empty; ListContainerQueryParameter queryParams = new ListContainerQueryParameter(); - queryParams.ContainerStatusField = "Registered"; //TODO: Use enum + queryParams.ContainerTypeField = AzureBackupContainerType.IaasVMContainer.ToString(); + queryParams.ContainerStatusField = AzureBackupContainerRegistrationStatus.Registered.ToString(); queryParams.ContainerFriendlyNameField = vmName; - ListContainerResponse containers = - AzureBackupClient.Container.ListAsync(queryParams, - GetCustomRequestHeaders(), CmdletCancellationToken).Result; + string queryString = GetQueryFileter(queryParams); + + ListContainerResponse containers = + AzureBackupClient.Container.ListAsync(queryString, GetCustomRequestHeaders(), CmdletCancellationToken).Result; if(containers.Objects.Count() == 0) { WriteVerbose("Container is not in the registered list"); @@ -71,7 +74,7 @@ public override void ExecuteCmdlet() } else { - UnregisterContainerRequest unregRequest = new UnregisterContainerRequest(containerToUnreg.Name, "IaasVMContainer"); //TODO: Use enum + UnregisterContainerRequest unregRequest = new UnregisterContainerRequest(containerToUnreg.Name, AzureBackupContainerType.IaasVMContainer.ToString()); MBS.OperationResponse operationResponse = AzureBackupClient.Container.UnregisterAsync(unregRequest, GetCustomRequestHeaders(), CmdletCancellationToken).Result; jobId = operationResponse.OperationId; //TODO: Fix it once PiyushKa publish the rest APi to get jobId based on operationId } @@ -80,5 +83,35 @@ public override void ExecuteCmdlet() WriteObject(jobId); }); } + + private string GetQueryFileter(ListContainerQueryParameter queryParams) + { + NameValueCollection collection = new NameValueCollection(); + if (!String.IsNullOrEmpty(queryParams.ContainerTypeField)) + { + collection.Add("ContainerType", queryParams.ContainerTypeField); + } + + if (!String.IsNullOrEmpty(queryParams.ContainerStatusField)) + { + collection.Add("ContainerStatus", queryParams.ContainerStatusField); + } + + if (!String.IsNullOrEmpty(queryParams.ContainerFriendlyNameField)) + { + collection.Add("FriendlyName", queryParams.ContainerFriendlyNameField); + } + + if (collection == null || collection.Count == 0) + { + return String.Empty; + } + + var httpValueCollection = HttpUtility.ParseQueryString(String.Empty); + httpValueCollection.Add(collection); + + return "&" + httpValueCollection.ToString(); + + } } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj index 4db165325d26..d8b2848ded8e 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj @@ -109,6 +109,7 @@ + @@ -122,7 +123,7 @@ - + @@ -134,10 +135,10 @@ - - + + True @@ -189,6 +190,10 @@ + + + +