From c6cb27135a55996e65fa09017cbffbc2f3f50ec7 Mon Sep 17 00:00:00 2001 From: dragonfly91 Date: Wed, 15 Jul 2015 12:54:40 +0530 Subject: [PATCH 1/5] Get-AzureBackupContainer cmdlet part1 --- .../ContainerAdapter.cs | 79 +++++++++++++ .../AzureBackupCmdletHelpMessage.cs | 4 + .../Container/GetAzureBackupContainer.cs | 109 ++++++++++++++++++ .../Commands.AzureBackup.csproj | 8 +- .../Models/AzureBackupBaseObjects.cs | 44 +++++++ .../Models/AzureBackupContainer.cs | 71 ++++++++++++ .../Models/AzureBackupEnums.cs | 26 +++++ ...re.Management.BackupServicesManagement.dll | Bin 0 -> 76288 bytes 8 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Resources/Microsoft.Azure.Management.BackupServicesManagement.dll diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs new file mode 100644 index 000000000000..3ef973773934 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs @@ -0,0 +1,79 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Management.Automation; +using System.Collections.Generic; +using System.Xml; +using Microsoft.WindowsAzure.Commands.Utilities.Common; +using Microsoft.Azure.Common.Authentication; +using Microsoft.Azure.Common.Authentication.Models; +using System.Threading; +using Hyak.Common; +using Microsoft.Azure.Commands.AzureBackup.Properties; +using System.Net; +using System.Linq; +using Microsoft.WindowsAzure.Management.Scheduler; +using Microsoft.Azure.Management.BackupServices; +using Microsoft.Azure.Management.BackupServices.Models; +using Microsoft.Azure.Commands.AzureBackup.Models; + +namespace Microsoft.Azure.Commands.AzureBackup.ClientAdapter +{ + public partial class AzureBackupClientAdapter + { + /// + /// Gets all MARS containers in the vault + /// + /// + public IEnumerable ListMachineContainers() + { + var listResponse = AzureBackupVaultClient.Container.ListMarsContainersByType(MarsContainerType.Machine, GetCustomRequestHeaders()); + return listResponse.ListMarsContainerResponse.Value; + } + + /// + /// Gets all MARS containers in the vault which match the friendly name + /// + /// The friendly name of the container + /// + public IEnumerable ListMachineContainers(string friendlyName) + { + var listResponse = AzureBackupVaultClient.Container.ListMarsContainersByTypeAndFriendlyName(MarsContainerType.Machine, friendlyName, GetCustomRequestHeaders()); + return listResponse.ListMarsContainerResponse.Value; + } + + ///// + ///// Register container + ///// + ///// + ///// + //public Guid RegisterContainer(string containerName) + //{ + // var response = AzureBackupVaultClient.Container.RegisterAsync(containerName, GetCustomRequestHeaders(), CmdletCancellationToken).Result; + // return response.OperationId; + //} + + ///// + ///// UnRegister container + ///// + ///// + ///// + //public Guid UnRegisterContainer(string containerName) + //{ + // var response = AzureBackupVaultClient.Container.UnregisterAsync(containerName, GetCustomRequestHeaders(), CmdletCancellationToken).Result; + // return response.OperationId; + //} + } +} \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs index 9d2719413564..a54e38f4cd51 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs @@ -22,5 +22,9 @@ internal static class AzureBackupCmdletHelpMessage public const string Location = "The resource location."; public const string TargetLocation = "The directory where the credentials file will be saved. This must be an absolute path."; public const string StorageType = "The vault back-end storage type."; + public const string ManagedResourceName = "The resource name of the resource being managed by the Azure Backup service (ex: resource name of the VM)."; + public const string ManagedResourceGroupName = "The resource group name of the resource being managed by the Azure Backup service (ex: resource group name of the VM)."; + public const string ContainerRegistrationStatus = "The container registration status."; + public const string ContainerType = "The container type."; } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs new file mode 100644 index 000000000000..e2b007cf3939 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs @@ -0,0 +1,109 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Commands.AzureBackup.Helpers; +using Microsoft.Azure.Commands.AzureBackup.Library; +using Microsoft.Azure.Commands.AzureBackup.Models; +using Microsoft.Azure.Management.BackupServices.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management.Automation; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Get list of containers + /// + [Cmdlet(VerbsCommon.Get, "AzureBackupContainer"), OutputType(typeof(AzureBackupContainer), typeof(List))] + public class GetAzureBackupContainer : AzureBackupVaultCmdletBase + { + //[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ManagedResourceGroupName)] + //[ValidateNotNullOrEmpty] + //public string ManagedResourceGroupName { get; set; } + + [Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ManagedResourceName)] + [ValidateNotNullOrEmpty] + public string ManagedResourceName { get; set; } + + //[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ContainerRegistrationStatus)] + //[ValidateNotNullOrEmpty] + //public AzureBackupContainerStatusInput Status { get; set; } + + [Parameter(Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.ContainerType)] + [ValidateNotNullOrEmpty] + public AzureBackupContainerTypeInput Type { get; set; } + + public override void ExecuteCmdlet() + { + ExecutionBlock(() => + { + base.ExecuteCmdlet(); + + List containers = new List(); + + switch (Type) + { + case AzureBackupContainerTypeInput.Windows: + case AzureBackupContainerTypeInput.SCDPM: + containers.AddRange(GetMachineContainers()); + break; + default: + break; + } + + WriteObject(containers); + }); + } + + private List GetMachineContainers() + { + List marsContainerResponses = new List(); + if (!string.IsNullOrEmpty(ManagedResourceName)) + { + marsContainerResponses.AddRange(AzureBackupClient.ListMachineContainers()); + } + else + { + marsContainerResponses.AddRange(AzureBackupClient.ListMachineContainers(ManagedResourceName)); + } + + return marsContainerResponses.ConvertAll(marsContainerResponse => + { + return new AzureBackupContainer(Vault, marsContainerResponse); + }).Where(container => container.ContainerType == GetCustomerType().ToString()).ToList(); + } + + private CustomerType GetCustomerType() + { + CustomerType customerType = CustomerType.Invalid; + + switch (Type) + { + case AzureBackupContainerTypeInput.Windows: + customerType = CustomerType.OBS; + break; + case AzureBackupContainerTypeInput.SCDPM: + customerType = CustomerType.DPM; + break; + default: + break; + } + + return customerType; + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj index b581a19ef2a3..feeed90c75fc 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj @@ -56,9 +56,9 @@ ..\..\..\packages\Microsoft.Azure.Common.2.1.0\lib\net45\Microsoft.Azure.Common.NetFramework.dll - + False - ..\..\..\packages\Microsoft.Azure.Management.BackupServices.1.0.0-preview\lib\net40\Microsoft.Azure.Management.BackupServicesManagement.dll + Resources\Microsoft.Azure.Management.BackupServicesManagement.dll ..\..\..\packages\Microsoft.IdentityModel.Clients.ActiveDirectory.2.14.201151115\lib\net45\Microsoft.IdentityModel.Clients.ActiveDirectory.dll @@ -116,10 +116,12 @@ + + @@ -128,6 +130,7 @@ + @@ -160,6 +163,7 @@ Always + diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs index f427757a46b8..c1299738ba01 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs @@ -12,6 +12,8 @@ // limitations under the License. // ---------------------------------------------------------------------------------- +using Microsoft.Azure.Management.BackupServices.Models; + namespace Microsoft.Azure.Commands.AzureBackup.Models { public class AzureBackupVaultContextObject @@ -43,4 +45,46 @@ public AzureBackupVaultContextObject(string resourceGroupName, string resourceNa public AzureBackupVaultContextObject(AzurePSBackupVault vault) : this(vault.ResourceGroupName, vault.Name, vault.Region) { } } + + /// + /// This class encapsulates all the properties of the container object + /// that are needed by higher level objects (data source, recovery point etc). + /// + public class AzureBackupContainerContextObject : AzureBackupVaultContextObject + { + /// + /// Type of the Azure Backup container + /// + public string ContainerType { get; set; } + + /// + /// Unique name of the Azure Backup Container + /// + public string ContainerUniqueName { get; set; } + + public AzureBackupContainerContextObject() + : base() + { + } + + public AzureBackupContainerContextObject(AzureBackupContainerContextObject azureBackupContainerContextObject) + : base(azureBackupContainerContextObject.ResourceGroupName, azureBackupContainerContextObject.ResourceName, azureBackupContainerContextObject.Location) + { + ContainerType = azureBackupContainerContextObject.ContainerType; + ContainerUniqueName = azureBackupContainerContextObject.ContainerUniqueName; + } + public AzureBackupContainerContextObject(AzureBackupContainer azureBackupContainer) + : base(azureBackupContainer.ResourceGroupName, azureBackupContainer.ResourceName, azureBackupContainer.Location) + { + ContainerType = azureBackupContainer.ContainerType; + ContainerUniqueName = azureBackupContainer.ContainerUniqueName; + } + + public AzureBackupContainerContextObject(AzurePSBackupVault vault, MarsContainerResponse marsContainerResponse) + : base(vault.ResourceGroupName, vault.Name, vault.Region) + { + ContainerType = marsContainerResponse.Properties.CustomerType; + ContainerUniqueName = marsContainerResponse.UniqueName; + } + } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs new file mode 100644 index 000000000000..6bfdaa7c5fc8 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs @@ -0,0 +1,71 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Commands.AzureBackup.Helpers; +using Microsoft.Azure.Management.BackupServices.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Azure.Commands.AzureBackup.Models +{ + /// + /// Represents Azure Backup Container + /// + public class AzureBackupContainer : AzureBackupContainerContextObject + { + ///// + ///// Resource group name of the resource (ex: resource group name of the VM) being managed by Azure Backup service. + ///// + //public string ManagedResourceGroupName { get; set; } + + /// + /// Resource name of the resource (ex: resource name of the VM) being managed by the Azure Backup service. + /// + public string ManagedResourceName { get; set; } + + ///// + ///// Status of health of the Azure Backup container + ///// + //public string HealthStatus { get; set; } + + ///// + ///// Status of registration of the container + ///// + //public string RegistrationStatus { get; set; } + + public long ContainerId { get; set; } + + public string ContainerStampUri { get; set; } + + public Guid ContainerStampId { get; set; } + + public bool CanReRegister { get; set; } + + public AzureBackupContainer() : base() { } + + public AzureBackupContainer(AzurePSBackupVault vault, MarsContainerResponse marsContainerResponse) + : base(vault, marsContainerResponse) + { + //ManagedResourceGroupName = ContainerHelpers.GetRGNameFromId(marsContainerResponse.Properties.ParentContainerId); + ManagedResourceName = marsContainerResponse.Properties.FriendlyName; + ContainerId = marsContainerResponse.Properties.ContainerId; + ContainerStampId = marsContainerResponse.Properties.ContainerStampId; + ContainerStampUri = marsContainerResponse.Properties.ContainerStampUri; + CanReRegister = marsContainerResponse.Properties.CanReRegister; + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs index 79cc0f9b20c0..bf75de554bdd 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs @@ -19,4 +19,30 @@ public enum AzureBackupVaultStorageType GeoRedundant = 1, LocallyRedundant, } + + public enum AzureBackupContainerTypeInput + { + Windows = 1, + SCDPM, + } + + public enum AzureBackupContainerStatusInput + { + Registering = 1, + Registered, + } + + public enum AzureBackupContainerType + { + Invalid = 0, + + Unknown, + + // used by fabric adapter to populate discovered VMs + IaasVMContainer, + + // used by fabric adapter to populate discovered services + // VMs are child containers of services they belong to + IaasVMServiceContainer + } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Resources/Microsoft.Azure.Management.BackupServicesManagement.dll b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Resources/Microsoft.Azure.Management.BackupServicesManagement.dll new file mode 100644 index 0000000000000000000000000000000000000000..4ed29f9fc5812bfae3da13349fc7b6474af50d42 GIT binary patch literal 76288 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 Date: Sat, 18 Jul 2015 01:24:20 +0530 Subject: [PATCH 2/5] container cmdlets and tests --- .../Commands.AzureBackup.Test.csproj | 9 +- .../AzureBackupContainerTests.cs | 34 ++ .../AzureBackupContainerTests.ps1 | 51 ++ ...AzureBackupMarsContainerScenarioTests.json | 358 +++++++++++++ .../ContainerAdapter.cs | 38 +- .../AzureBackupCmdletHelpMessage.cs | 1 + .../AzureBackupContainerCmdletBase.cs | 45 ++ ...nableAzureBackupContainerReregistration.cs | 58 ++ .../Container/GetAzureBackupContainer.cs | 43 +- .../UnregisterAzureBackupContainer.cs | 77 +++ .../Commands.AzureBackup.csproj | 11 + .../Helpers/ContainerHelpers.cs | 71 +++ ...ft.Azure.Commands.AzureBackup.dll-help.xml | 503 +++++++++++++++++- ...t.Azure.Commands.AzureBackup.format.ps1xml | 39 +- .../Models/AzureBackupBaseObjects.cs | 26 +- .../Models/AzureBackupContainer.cs | 40 +- .../Models/AzureBackupEnums.cs | 15 +- .../Properties/Resources.Designer.cs | 23 +- .../Properties/Resources.resx | 9 +- ...re.Management.BackupServicesManagement.dll | Bin 76288 -> 79872 bytes 20 files changed, 1309 insertions(+), 142 deletions(-) create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/SessionRecords/Microsoft.Azure.Commands.AzureBackup.Test.ScenarioTests.AzureBackupContainerTests/AzureBackupMarsContainerScenarioTests.json create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupContainerCmdletBase.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs create mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Helpers/ContainerHelpers.cs diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/Commands.AzureBackup.Test.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/Commands.AzureBackup.Test.csproj index 12977a420ca1..06cfc0e401b5 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/Commands.AzureBackup.Test.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/Commands.AzureBackup.Test.csproj @@ -41,7 +41,7 @@ False - ..\..\..\packages\Microsoft.Azure.Management.BackupServices.1.0.0-preview\lib\net40\Microsoft.Azure.Management.BackupServicesManagement.dll + ..\Commands.AzureBackup\Resources\Microsoft.Azure.Management.BackupServicesManagement.dll False @@ -124,6 +124,7 @@ + @@ -154,9 +155,15 @@ Designer + + Always + Always + + Always + Always diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.cs new file mode 100644 index 000000000000..7c461caf5071 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.cs @@ -0,0 +1,34 @@ +// ---------------------------------------------------------------------------------- +// +// 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.WindowsAzure.Commands.ScenarioTest; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.Azure.Commands.AzureBackup.Test.ScenarioTests +{ + public class AzureBackupContainerTests : AzureBackupTestsBase + { + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + public void AzureBackupMarsContainerScenarioTests() + { + this.RunPowerShellTest("Test-AzureBackupMarsContainerScenario"); + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 new file mode 100644 index 000000000000..73ec09b22dde --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 @@ -0,0 +1,51 @@ +# ---------------------------------------------------------------------------------- +# +# 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. +# ---------------------------------------------------------------------------------- + +$ResourceGroupName = "backuprg" +$ResourceName = "backuprn1" +$ContainerName = "DPMDRSCALEINT1.DPMDOM02.SELFHOST.CORP.MICROSOFT.COM" +$ContainerType = "Windows" +$ContainerId = "10034" +$ContainerStatus = "Registered" + +function Test-AzureBackupMarsContainerScenario +{ + $vault = Get-AzureBackupVault -ResourceGroupName $ResourceGroupName -Name $ResourceName + + $containers = Get-AzureBackupContainer -vault $vault -type $ContainerType + Assert-AreEqual $containers[0].ContainerType $ContainerType; + Assert-AreEqual $containers[0].Id $ContainerId; + Assert-AreEqual $containers[0].Location $vault.Region; + Assert-AreEqual $containers[0].Name $ContainerName; + Assert-AreEqual $containers[0].ResourceGroupName $vault.ResourceGroupName; + Assert-AreEqual $containers[0].ResourceName $vault.Name; + Assert-AreEqual $containers[0].Status $ContainerStatus; + + $namedContainers = Get-AzureBackupContainer -vault $vault -type $ContainerType -name $ContainerName + $container = $namedContainers[0]; + Assert-AreEqual $container.ContainerType $ContainerType; + Assert-AreEqual $container.Id $ContainerId; + Assert-AreEqual $container.Location $vault.Region; + Assert-AreEqual $container.Name $ContainerName; + Assert-AreEqual $container.ResourceGroupName $vault.ResourceGroupName; + Assert-AreEqual $container.ResourceName $vault.Name; + Assert-AreEqual $container.Status $ContainerStatus; + + #Enable-AzureBackupContainerReregistration -Container $container + + Unregister-AzureBackupContainer -Container $container -Force + + $unregContainers = Get-AzureBackupContainer -vault $vault -type $ContainerType -name $ContainerName + Assert-AreEqual $unregContainers.Count 0; +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/SessionRecords/Microsoft.Azure.Commands.AzureBackup.Test.ScenarioTests.AzureBackupContainerTests/AzureBackupMarsContainerScenarioTests.json b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/SessionRecords/Microsoft.Azure.Commands.AzureBackup.Test.ScenarioTests.AzureBackupContainerTests/AzureBackupMarsContainerScenarioTests.json new file mode 100644 index 000000000000..503061a5b70f --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/SessionRecords/Microsoft.Azure.Commands.AzureBackup.Test.ScenarioTests.AzureBackupContainerTests/AzureBackupMarsContainerScenarioTests.json @@ -0,0 +1,358 @@ +{ + "Entries": [ + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1?api-version=2015-03-15", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMT9hcGktdmVyc2lvbj0yMDE1LTAzLTE1", + "RequestMethod": "GET", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "x-ms-client-request-id": [ + "3bde4861-d6c7-4785-b954-c2fb7498260c-2015-07-17 19:46:07Z-PS" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "{\r\n \"location\": \"westus\",\r\n \"name\": \"backuprn1\",\r\n \"etag\": \"327fe758-7f7b-4879-b708-4d5366d2c687\",\r\n \"tags\": {},\r\n \"properties\": {\r\n \"sku\": {\r\n \"name\": \"standard\"\r\n },\r\n \"ProvisioningState\": \"Succeeded\"\r\n },\r\n \"id\": \"/subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1\",\r\n \"type\": \"Microsoft.Backup/BackupVault\"\r\n}", + "ResponseHeaders": { + "Content-Length": [ + "339" + ], + "Content-Type": [ + "application/json" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "650d6914-a58c-4610-90c4-578f43f4194a" + ], + "x-ms-client-request-id": [ + "3bde4861-d6c7-4785-b954-c2fb7498260c-2015-07-17 19:46:07Z-PS" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-reads": [ + "14995" + ], + "x-ms-correlation-request-id": [ + "650d6914-a58c-4610-90c4-578f43f4194a" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194610Z:650d6914-a58c-4610-90c4-578f43f4194a" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:10 GMT" + ], + "Server": [ + "Microsoft-IIS/8.0" + ] + }, + "StatusCode": 200 + }, + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1/storageconfig/vaultstorageconfig?api-version=2015-03-15", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMS9zdG9yYWdlY29uZmlnL3ZhdWx0c3RvcmFnZWNvbmZpZz9hcGktdmVyc2lvbj0yMDE1LTAzLTE1", + "RequestMethod": "GET", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "x-ms-client-request-id": [ + "3bde4861-d6c7-4785-b954-c2fb7498260c-2015-07-17 19:46:07Z-PS" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "{\r\n \"resourceId\": 8395314960984740771,\r\n \"properties\": {\r\n \"storageType\": \"GeoRedundant\",\r\n \"storageTypeState\": \"Locked\"\r\n }\r\n}", + "ResponseHeaders": { + "Content-Length": [ + "106" + ], + "Content-Type": [ + "application/json" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "f28b0d83-8805-4900-92db-90809a187048" + ], + "x-ms-client-request-id": [ + "3bde4861-d6c7-4785-b954-c2fb7498260c-2015-07-17 19:46:07Z-PS", + "3bde4861-d6c7-4785-b954-c2fb7498260c-2015-07-17 19:46:07Z-PS" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-reads": [ + "14994" + ], + "x-ms-correlation-request-id": [ + "f28b0d83-8805-4900-92db-90809a187048" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194611Z:f28b0d83-8805-4900-92db-90809a187048" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:11 GMT" + ], + "Server": [ + "Microsoft-IIS/8.0" + ] + }, + "StatusCode": 200 + }, + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1/backupContainers?api-version=2015-03-15&$filter=type%20eq%20'Machine'", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMS9iYWNrdXBDb250YWluZXJzP2FwaS12ZXJzaW9uPTIwMTUtMDMtMTUmJGZpbHRlcj10eXBlJTIwZXElMjAnTWFjaGluZSc=", + "RequestMethod": "GET", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "{\r\n \"value\": [\r\n {\r\n \"uniqueName\": \"dpmdrscaleint1.dpmdom02.selfhost.corp.microsoft.com\",\r\n \"containerType\": \"Machine\",\r\n \"properties\": {\r\n \"containerId\": 10034,\r\n \"friendlyName\": \"DPMDRSCALEINT1.DPMDOM02.SELFHOST.CORP.MICROSOFT.COM\",\r\n \"containerStampId\": \"eaf33dbc-a5b5-411a-a6af-1976a3f94602\",\r\n \"containerStampUri\": \"https://sea-dev01-prot-4bodw.ext.trafficmanager.net\",\r\n \"canReRegister\": false,\r\n \"customerType\": \"OBS\"\r\n }\r\n }\r\n ],\r\n \"nextLink\": null\r\n}", + "ResponseHeaders": { + "Content-Length": [ + "401" + ], + "Content-Type": [ + "application/json" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "46a1fbfd-6e8b-4ab0-835b-1dcbe559162f" + ], + "x-ms-client-request-id": [ + "012da3f2-c253-475c-9f1a-516b11d3a906", + "012da3f2-c253-475c-9f1a-516b11d3a906" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-reads": [ + "14993" + ], + "x-ms-correlation-request-id": [ + "46a1fbfd-6e8b-4ab0-835b-1dcbe559162f" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194612Z:46a1fbfd-6e8b-4ab0-835b-1dcbe559162f" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:11 GMT" + ], + "Server": [ + "Microsoft-IIS/8.0" + ] + }, + "StatusCode": 200 + }, + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1/backupContainers?api-version=2015-03-15&$filter=type%20eq%20'Machine'%20and%20friendlyName%20eq%20'DPMDRSCALEINT1.DPMDOM02.SELFHOST.CORP.MICROSOFT.COM'", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMS9iYWNrdXBDb250YWluZXJzP2FwaS12ZXJzaW9uPTIwMTUtMDMtMTUmJGZpbHRlcj10eXBlJTIwZXElMjAnTWFjaGluZSclMjBhbmQlMjBmcmllbmRseU5hbWUlMjBlcSUyMCdEUE1EUlNDQUxFSU5UMS5EUE1ET00wMi5TRUxGSE9TVC5DT1JQLk1JQ1JPU09GVC5DT00n", + "RequestMethod": "GET", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "{\r\n \"value\": [\r\n {\r\n \"uniqueName\": \"dpmdrscaleint1.dpmdom02.selfhost.corp.microsoft.com\",\r\n \"containerType\": \"Machine\",\r\n \"properties\": {\r\n \"containerId\": 10034,\r\n \"friendlyName\": \"DPMDRSCALEINT1.DPMDOM02.SELFHOST.CORP.MICROSOFT.COM\",\r\n \"containerStampId\": \"eaf33dbc-a5b5-411a-a6af-1976a3f94602\",\r\n \"containerStampUri\": \"https://sea-dev01-prot-4bodw.ext.trafficmanager.net\",\r\n \"canReRegister\": false,\r\n \"customerType\": \"OBS\"\r\n }\r\n }\r\n ],\r\n \"nextLink\": null\r\n}", + "ResponseHeaders": { + "Content-Length": [ + "401" + ], + "Content-Type": [ + "application/json" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "95e616a7-bb6a-434b-876d-8dc9271a9375" + ], + "x-ms-client-request-id": [ + "add32202-8b85-48cd-bf42-76899a482387", + "add32202-8b85-48cd-bf42-76899a482387" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-reads": [ + "14992" + ], + "x-ms-correlation-request-id": [ + "95e616a7-bb6a-434b-876d-8dc9271a9375" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194612Z:95e616a7-bb6a-434b-876d-8dc9271a9375" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:12 GMT" + ], + "Server": [ + "Microsoft-IIS/8.0" + ] + }, + "StatusCode": 200 + }, + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1/backupContainers?api-version=2015-03-15&$filter=type%20eq%20'Machine'%20and%20friendlyName%20eq%20'DPMDRSCALEINT1.DPMDOM02.SELFHOST.CORP.MICROSOFT.COM'", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMS9iYWNrdXBDb250YWluZXJzP2FwaS12ZXJzaW9uPTIwMTUtMDMtMTUmJGZpbHRlcj10eXBlJTIwZXElMjAnTWFjaGluZSclMjBhbmQlMjBmcmllbmRseU5hbWUlMjBlcSUyMCdEUE1EUlNDQUxFSU5UMS5EUE1ET00wMi5TRUxGSE9TVC5DT1JQLk1JQ1JPU09GVC5DT00n", + "RequestMethod": "GET", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "{\r\n \"value\": [],\r\n \"nextLink\": null\r\n}", + "ResponseHeaders": { + "Content-Length": [ + "28" + ], + "Content-Type": [ + "application/json" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "ad8d0c5f-7388-48d1-8079-8cee7573cf09" + ], + "x-ms-client-request-id": [ + "7af25c88-040a-4ce3-9728-8f94fe64d42f", + "7af25c88-040a-4ce3-9728-8f94fe64d42f" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-reads": [ + "14991" + ], + "x-ms-correlation-request-id": [ + "ad8d0c5f-7388-48d1-8079-8cee7573cf09" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194618Z:ad8d0c5f-7388-48d1-8079-8cee7573cf09" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:17 GMT" + ], + "Server": [ + "Microsoft-IIS/8.0" + ] + }, + "StatusCode": 200 + }, + { + "RequestUri": "/Subscriptions/f5303a0b-fae4-4cdb-b44d-0e4c032dde26/resourceGroups/backuprg/providers/Microsoft.Backup/BackupVault/backuprn1/backupContainers/10034/UnRegisterContainer?api-version=2015-03-15", + "EncodedRequestUri": "L1N1YnNjcmlwdGlvbnMvZjUzMDNhMGItZmFlNC00Y2RiLWI0NGQtMGU0YzAzMmRkZTI2L3Jlc291cmNlR3JvdXBzL2JhY2t1cHJnL3Byb3ZpZGVycy9NaWNyb3NvZnQuQmFja3VwL0JhY2t1cFZhdWx0L2JhY2t1cHJuMS9iYWNrdXBDb250YWluZXJzLzEwMDM0L1VuUmVnaXN0ZXJDb250YWluZXI/YXBpLXZlcnNpb249MjAxNS0wMy0xNQ==", + "RequestMethod": "DELETE", + "RequestBody": "", + "RequestHeaders": { + "Accept-Language": [ + "en-us" + ], + "x-ms-client-request-id": [ + "3a02406f-4fc3-48b6-9621-c05d9d1c3cdb-2015-07-17 19:46:12Z-PS" + ], + "User-Agent": [ + "Microsoft.Azure.Management.BackupServices.BackupVaultServicesManagementClient/1.0.0.0" + ] + }, + "ResponseBody": "", + "ResponseHeaders": { + "Content-Length": [ + "0" + ], + "Expires": [ + "-1" + ], + "Pragma": [ + "no-cache" + ], + "x-ms-request-id": [ + "3577d465-9453-43bc-93ec-93603396aa9f" + ], + "x-ms-client-request-id": [ + "3a02406f-4fc3-48b6-9621-c05d9d1c3cdb-2015-07-17 19:46:12Z-PS", + "3a02406f-4fc3-48b6-9621-c05d9d1c3cdb-2015-07-17 19:46:12Z-PS" + ], + "Strict-Transport-Security": [ + "max-age=31536000; includeSubDomains" + ], + "x-ms-ratelimit-remaining-subscription-writes": [ + "1199" + ], + "x-ms-correlation-request-id": [ + "3577d465-9453-43bc-93ec-93603396aa9f" + ], + "x-ms-routing-request-id": [ + "CENTRALUS:20150717T194617Z:3577d465-9453-43bc-93ec-93603396aa9f" + ], + "Cache-Control": [ + "no-cache" + ], + "Date": [ + "Fri, 17 Jul 2015 19:46:17 GMT" + ] + }, + "StatusCode": 204 + } + ], + "Names": {}, + "Variables": { + "SubscriptionId": "f5303a0b-fae4-4cdb-b44d-0e4c032dde26" + } +} \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs index 3ef973773934..4f8ef0ee1a45 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs @@ -54,26 +54,24 @@ public IEnumerable ListMachineContainers(string friendlyN return listResponse.ListMarsContainerResponse.Value; } - ///// - ///// Register container - ///// - ///// - ///// - //public Guid RegisterContainer(string containerName) - //{ - // var response = AzureBackupVaultClient.Container.RegisterAsync(containerName, GetCustomRequestHeaders(), CmdletCancellationToken).Result; - // return response.OperationId; - //} + /// + /// Enable container reregistration + /// + /// + /// + public void EnableMachineContainerReregistration(long containerId) + { + AzureBackupVaultClient.Container.EnableMarsContainerReregistration(containerId.ToString(), GetCustomRequestHeaders()); + } - ///// - ///// UnRegister container - ///// - ///// - ///// - //public Guid UnRegisterContainer(string containerName) - //{ - // var response = AzureBackupVaultClient.Container.UnregisterAsync(containerName, GetCustomRequestHeaders(), CmdletCancellationToken).Result; - // return response.OperationId; - //} + /// + /// UnRegister container + /// + /// + /// + public void UnregisterMachineContainer(long containerId) + { + AzureBackupVaultClient.Container.UnregisterMarsContainer(containerId.ToString(), GetCustomRequestHeaders()); + } } } \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs index a54e38f4cd51..7d8dd45e1b4b 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupCmdletHelpMessage.cs @@ -26,5 +26,6 @@ internal static class AzureBackupCmdletHelpMessage public const string ManagedResourceGroupName = "The resource group name of the resource being managed by the Azure Backup service (ex: resource group name of the VM)."; public const string ContainerRegistrationStatus = "The container registration status."; public const string ContainerType = "The container type."; + public const string AzureBackupContainer = "Azure Backup Container for Azure Backup Item."; } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupContainerCmdletBase.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupContainerCmdletBase.cs new file mode 100644 index 000000000000..b1b623d832c6 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupContainerCmdletBase.cs @@ -0,0 +1,45 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Management.Automation; +using System.Collections.Generic; +using System.Xml; +using Microsoft.WindowsAzure.Commands.Utilities.Common; +using Microsoft.Azure.Common.Authentication; +using Microsoft.Azure.Common.Authentication.Models; +using System.Threading; +using Hyak.Common; +using Microsoft.Azure.Commands.AzureBackup.Properties; +using System.Net; +using Microsoft.Azure.Commands.AzureBackup.Models; + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + public abstract class AzureBackupContainerCmdletBase : AzureBackupCmdletBase + { + [Parameter(Position = 0, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.AzureBackupContainer, ValueFromPipeline = true)] + [ValidateNotNullOrEmpty] + public AzureBackupContainer Container { get; set; } + + public override void ExecuteCmdlet() + { + base.ExecuteCmdlet(); + + WriteDebug(String.Format("Cmdlet called for ResourceGroupName: {0}, ResourceName: {1}, Location: {2}", Container.ResourceGroupName, Container.ResourceName, Container.Location)); + + InitializeAzureBackupCmdlet(Container.ResourceGroupName, Container.ResourceName); + } + } +} \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs new file mode 100644 index 000000000000..4ae62420fa63 --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Web; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Management.Automation; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Azure.Management.BackupServices.Models; +using MBS = Microsoft.Azure.Management.BackupServices; +using Microsoft.WindowsAzure.Commands.ServiceManagement.Model; +using Microsoft.Azure.Commands.AzureBackup.Properties; +using Microsoft.Azure.Commands.AzureBackup.Models; +using Microsoft.Azure.Commands.AzureBackup.Helpers; +using Microsoft.Azure.Management.BackupServices; + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Enables reregistration of a machine container + /// + [Cmdlet(VerbsLifecycle.Enable, "AzureBackupContainerReregistration")] + public class EnableAzureBackupContainerReregistration : AzureBackupContainerCmdletBase + { + public override void ExecuteCmdlet() + { + ExecutionBlock(() => + { + base.ExecuteCmdlet(); + + AzureBackupContainerType containerType = (AzureBackupContainerType)Enum.Parse(typeof(AzureBackupContainerType), Container.ContainerType); + switch (containerType) + { + case AzureBackupContainerType.Windows: + case AzureBackupContainerType.SCDPM: + AzureBackupClient.EnableMachineContainerReregistration(Container.Id); + break; + default: + throw new ArgumentException("Reregistration can be enable only for machine containers."); + } + }); + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs index e2b007cf3939..fd5bcb2d6b3c 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/GetAzureBackupContainer.cs @@ -28,24 +28,16 @@ namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets /// /// Get list of containers /// - [Cmdlet(VerbsCommon.Get, "AzureBackupContainer"), OutputType(typeof(AzureBackupContainer), typeof(List))] + [Cmdlet(VerbsCommon.Get, "AzureBackupContainer"), OutputType(typeof(List))] public class GetAzureBackupContainer : AzureBackupVaultCmdletBase { - //[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ManagedResourceGroupName)] - //[ValidateNotNullOrEmpty] - //public string ManagedResourceGroupName { get; set; } - [Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ManagedResourceName)] [ValidateNotNullOrEmpty] - public string ManagedResourceName { get; set; } - - //[Parameter(Mandatory = false, HelpMessage = AzureBackupCmdletHelpMessage.ContainerRegistrationStatus)] - //[ValidateNotNullOrEmpty] - //public AzureBackupContainerStatusInput Status { get; set; } + public string Name { get; set; } [Parameter(Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.ContainerType)] [ValidateNotNullOrEmpty] - public AzureBackupContainerTypeInput Type { get; set; } + public AzureBackupContainerType Type { get; set; } public override void ExecuteCmdlet() { @@ -57,8 +49,8 @@ public override void ExecuteCmdlet() switch (Type) { - case AzureBackupContainerTypeInput.Windows: - case AzureBackupContainerTypeInput.SCDPM: + case AzureBackupContainerType.Windows: + case AzureBackupContainerType.SCDPM: containers.AddRange(GetMachineContainers()); break; default: @@ -72,38 +64,19 @@ public override void ExecuteCmdlet() private List GetMachineContainers() { List marsContainerResponses = new List(); - if (!string.IsNullOrEmpty(ManagedResourceName)) + if (string.IsNullOrEmpty(Name)) { marsContainerResponses.AddRange(AzureBackupClient.ListMachineContainers()); } else { - marsContainerResponses.AddRange(AzureBackupClient.ListMachineContainers(ManagedResourceName)); + marsContainerResponses.AddRange(AzureBackupClient.ListMachineContainers(Name)); } return marsContainerResponses.ConvertAll(marsContainerResponse => { return new AzureBackupContainer(Vault, marsContainerResponse); - }).Where(container => container.ContainerType == GetCustomerType().ToString()).ToList(); - } - - private CustomerType GetCustomerType() - { - CustomerType customerType = CustomerType.Invalid; - - switch (Type) - { - case AzureBackupContainerTypeInput.Windows: - customerType = CustomerType.OBS; - break; - case AzureBackupContainerTypeInput.SCDPM: - customerType = CustomerType.DPM; - break; - default: - break; - } - - return customerType; + }).Where(container => container.ContainerType == Type.ToString()).ToList(); } } } 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..9b02d0e5530a --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/UnregisterAzureBackupContainer.cs @@ -0,0 +1,77 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Web; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Management.Automation; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Azure.Management.BackupServices.Models; +using MBS = Microsoft.Azure.Management.BackupServices; +using Microsoft.Azure.Commands.AzureBackup.Models; +using Microsoft.WindowsAzure.Commands.Utilities.Store; +using Microsoft.Azure.Commands.AzureBackup.Properties; + +namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets +{ + /// + /// Get list of containers + /// + [Cmdlet(VerbsLifecycle.Unregister, "AzureBackupContainer")] + public class UnregisterAzureBackupContainer : AzureBackupContainerCmdletBase + { + private PowerShellCustomConfirmation customerConfirmation; + + [Parameter(Position = 1, Mandatory = false, HelpMessage = "Confirm unregistration and deletion of server")] + public SwitchParameter Force { get; set; } + + public override void ExecuteCmdlet() + { + ExecutionBlock(() => + { + base.ExecuteCmdlet(); + + AzureBackupContainerType containerType = (AzureBackupContainerType)Enum.Parse(typeof(AzureBackupContainerType), Container.ContainerType); + switch (containerType) + { + case AzureBackupContainerType.Windows: + case AzureBackupContainerType.SCDPM: + DeleteServer(); + break; + default: + break; + } + }); + } + + private void DeleteServer() + { + bool shouldUnregister = true; + + if (!Force.IsPresent) + { + customerConfirmation = customerConfirmation ?? new PowerShellCustomConfirmation(Host); + shouldUnregister = customerConfirmation.ShouldProcess(Resources.UnregisterServerCaption, Resources.UnregisterServerMessage); + } + + if (shouldUnregister) + { + AzureBackupClient.UnregisterMachineContainer(Container.Id); + } + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj index feeed90c75fc..47f9c3cc3e6f 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj @@ -118,15 +118,19 @@ + + + + @@ -172,6 +176,13 @@ {5ee72c53-1720-4309-b54b-5fb79703195f} Commands.Common + + {4900ec4e-8deb-4412-9108-0bc52f81d457} + Commands.Utilities + + + + diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Helpers/ContainerHelpers.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Helpers/ContainerHelpers.cs new file mode 100644 index 000000000000..65678f8542da --- /dev/null +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Helpers/ContainerHelpers.cs @@ -0,0 +1,71 @@ +// ---------------------------------------------------------------------------------- +// +// 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.Management.Automation; +using System.Collections.Generic; +using System.Xml; +using Microsoft.WindowsAzure.Commands.Utilities.Common; +using Microsoft.Azure.Common.Authentication; +using Microsoft.Azure.Common.Authentication.Models; +using System.Threading; +using Hyak.Common; +using Microsoft.Azure.Commands.AzureBackup.Properties; +using System.Net; +using Microsoft.Azure.Management.BackupServices.Models; +using Microsoft.Azure.Commands.AzureBackup.Cmdlets; +using System.Linq; +using Microsoft.Azure.Commands.AzureBackup.Models; +using CmdletModel = Microsoft.Azure.Commands.AzureBackup.Models; +using System.Collections.Specialized; +using System.Web; +using System.Text.RegularExpressions; + +namespace Microsoft.Azure.Commands.AzureBackup.Helpers +{ + internal class ContainerHelpers + { + internal static AzureBackupContainerType GetContainerType(string customerType) + { + CustomerType type = (CustomerType)Enum.Parse(typeof(CustomerType), customerType); + + AzureBackupContainerType containerType = 0; + + switch (type) + { + case CustomerType.DPM: + containerType = AzureBackupContainerType.SCDPM; + break; + case CustomerType.InMage: + break; + case CustomerType.Invalid: + break; + case CustomerType.ManagedContainer: + break; + case CustomerType.OBS: + containerType = AzureBackupContainerType.Windows; + break; + case CustomerType.SBS: + containerType = AzureBackupContainerType.Windows; + break; + case CustomerType.SqlPaaS: + break; + default: + break; + } + + return containerType; + } + } +} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml index 732d973175bf..31d0e6ad6ee9 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml @@ -1,5 +1,312 @@  + + + Enable-AzureBackupContainerReregistration + + Allow re-registration of the server to connect the server back to the vault and continue the backup points chain. + + + + + Enable + AzureBackupContainerReregistration + + + + When a server is destroyed, all its cloud backup points remain in the Azure Backup vault. If the server is rebuilt and given the same FQDN, it is possible to connect it back to the same vault. This will allow the server to continue taking backups and adding new backup points to the existing set - essentially continuing where it was left off in the backup chain. + To make this connection, the AzureBackupContainer has to be primed for "re-registration". Without this step, you can lose all the existing data as a part of the registration process. The commandlet tells the service that the next time the container is registered, it should continue the backup chain. + + + + Enable-AzureBackupContainerReregistration + + Container + + An object referencing the container for which re-registration is being requested + + AzureBackupContainer + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + + + + + Container + + An object referencing the container for which re-registration is being requested + + AzureBackupContainer + + AzureBackupContainer + + + + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + AzureProfile + + + + + + + + + AzureBackupContainer + + + + + This section details out the type of the objects that you can pipe to the cmdlet. + + + + + + + + None + + + + + This section details out the type of the objects that the cmdlet emits. + + + + + + + + + None + + + + + + + + + + + Get-AzureBackupContainer + + Retrieves one or more Azure Backup containers that match the filter criteria specified. + + + + + Get + AzureBackupContainer + + + + An AzureBackupContainer is an object that encapsulates datasources, protected items, and recovery points. An AzureBackupContainer can be one of three: +- a Windows server +- a System Center Data Protection Manager server (SCDPM) +- an Azure IaaS virtual machine + Before a datasource or item can be backed-up, the container holding it must be registered with the Azure Backup service and be authenticated to send backup data to the backup vault. For Windows and SCDPM servers, the registration is held with the FQDN of the server. + + + + Get-AzureBackupContainer + + Name + + The name of the AzureBackupContainer for which an object reference will be returned. + + String + + + Type + + This determines the Type of the container that has been registered. +- For Windows servers using the Azure Backup agent directly, the type will be "Windows" +- For SCDPM servers using the Azure Backup agent in conjunction with SCDPM, the type will be "DPM" + + AzureBackupContainerType + + + Vault + + A filter for the vault object, under which the container needs to be found. + + AzurePSBackupVault + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + + + + + Name + + The name of the AzureBackupContainer for which an object reference will be returned. + + String + + String + + + + + + Type + + This determines the Type of the container that has been registered. +- For Windows servers using the Azure Backup agent directly, the type will be "Windows" +- For SCDPM servers using the Azure Backup agent in conjunction with SCDPM, the type will be "DPM" + + AzureBackupContainerType + + AzureBackupContainerType + + + + + + Vault + + A filter for the vault object, under which the container needs to be found. + + AzurePSBackupVault + + AzurePSBackupVault + + + + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + AzureProfile + + + + + + ManagedResourceName + + The name of the container that is specified as a filter. + + string + + string + + + + + + + + + AzureBackupVault + + + + + +This section details out the type of the objects that you can pipe to the cmdlet. + + + + + + + AzureBackupContainer + + + + + +This section details out the type of the objects that the cmdlet emits. + + + + + + + + + None + + + + + -------------------------- List of all Windows servers registered to the vault -------------------------- + + PS C:\> + + Get-AzureBackupContainer -vault $v -type Windows + + Gets a list of all containers of type "Windows" from the specified vault. + + + Name Type Status +---- ---- ------ +SERVER1.CONTOSO.COM Windows Registered +SERVER2.CONTOSO.COM Windows Registered + + + + + + + + + + + + -------------------------- Retrieve a specific container -------------------------- + + PS C:\> + + Get-AzureBackupContainer -vault $v -type SCDPM -name "DPMSERVER.CONTOSO.COM" + + Gets the container representing a specific DPM server registered to the specified vault. + + + Name Type Status +---- ---- ------ +DPMSERVER.CONTOSO.COM SCDPM Registered + + + + + + + + + + + + + + + Get-AzureBackupVault @@ -88,7 +395,8 @@ - This section details out the type of the objects that you can pipe to the cmdlet. + +This section details out the type of the objects that you can pipe to the cmdlet. @@ -100,7 +408,8 @@ - This section details out the type of the objects that the cmdlet emits. + +This section details out the type of the objects that the cmdlet emits. @@ -312,8 +621,7 @@ Property : - -This section details out the type of the objects that you can pipe to the cmdlet. + This section details out the type of the objects that you can pipe to the cmdlet. @@ -325,8 +633,7 @@ This section details out the type of the objects that you can pipe to the cmdlet - -This section details out the type of the objects that the cmdlet emits. + This section details out the type of the objects that the cmdlet emits. @@ -490,7 +797,8 @@ This section details out the type of the objects that the cmdlet emits. - This section details out the type of the objects that you can pipe to the cmdlet. + +This section details out the type of the objects that you can pipe to the cmdlet. @@ -502,7 +810,8 @@ This section details out the type of the objects that the cmdlet emits. - This section details out the type of the objects that the cmdlet emits. + +This section details out the type of the objects that the cmdlet emits. @@ -656,7 +965,8 @@ Storage : LocallyRedundant - This section details out the type of the objects that you can pipe to the cmdlet. + +This section details out the type of the objects that you can pipe to the cmdlet. @@ -668,7 +978,8 @@ Storage : LocallyRedundant - This section details out the type of the objects that the cmdlet emits. + +This section details out the type of the objects that the cmdlet emits. @@ -814,8 +1125,7 @@ Storage : LocallyRedundant - -This section details out the type of the objects that you can pipe to the cmdlet. + This section details out the type of the objects that you can pipe to the cmdlet. @@ -827,8 +1137,7 @@ This section details out the type of the objects that you can pipe to the cmdlet - -This section details out the type of the objects that the cmdlet emits. + This section details out the type of the objects that the cmdlet emits. @@ -881,4 +1190,170 @@ This section details out the type of the objects that the cmdlet emits. + + + + Unregister-AzureBackupContainer + + Unregisters the specified Windows Server or Azure virtual machine from the Azure Backup vault. + + + + + Unregister + AzureBackupContainer + + + + The Unregister command works on an Container object. It removes references of this container from the Azure Backup vault. Before you can Unregister a Container, any protected data associated with the Container needs to be deleted. + + + + Unregister-AzureBackupContainer + + Force + + When applied to an AzureBackupContainer of type Windows, this will not prompt the user for explicit consent before deleting data from the Azure Backup vault. + + SwitchParameter + + + Container + + The Windows Server or Azure virtual machine that should be unregistered. + + AzureBackupContainer + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + + + + + Force + + When applied to an AzureBackupContainer of type Windows, this will not prompt the user for explicit consent before deleting data from the Azure Backup vault. + + SwitchParameter + + SwitchParameter + + + + + + Container + + The Windows Server or Azure virtual machine that should be unregistered. + + AzureBackupContainer + + AzureBackupContainer + + + + + + Profile + + Non-mandatory AzureProfile input object + + AzureProfile + + AzureProfile + + + + + + + + + Container of type [AzureBackupContainer] + + + + + This section details out the type of the objects that you can pipe to the cmdlet. + + + + + + + AzureBackupJob +- For containers of type Windows, the return value is $null + + + + + This section details out the type of the objects that the cmdlet emits. + + + + + + + + + None + + + + + -------------------------- Unregister a Windows Server with user prompt -------------------------- + + PS C:\> + + $c = Get-AzureBackupContainer -vault $v -type Windows -name "server1.contoso.com" +PS C:\> Unregister-AzureBackupContainer -container $c[0] + + The user first gets the container that needs to be unregistered using the Get-AzureBackupContainer commandlet. This container object is passed to the unregister commandlet. This unregisters the specified Windows Server from the Azure Backup vault. + + + Unregister Server +This operation will delete all data in the backup vault that is associated with the server. Are you sure you want to unregister the server? +[] Yes [] No [?] Help (default is "No"): Yes + + + + + + + + + + + -------------------------- Unregister a Windows Server without confirmation prompt -------------------------- + + PS C:\> + + Unregister-AzureBackupContainer -container $c –force + + The -Force option does not ask the user for confirmation before deleting the data and unregistering the server. + + + None + + + + + + + + + + + + + Get-AzureBackupContainer + + + + \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.format.ps1xml b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.format.ps1xml index ab415da71864..500adb8d49be 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.format.ps1xml +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.format.ps1xml @@ -37,6 +37,43 @@ - + + + Microsoft.Azure.Commands.AzureBackup.Models.AzureBackupContainer + + Microsoft.Azure.Commands.AzureBackup.Models.AzureBackupContainer + + + + + + 60 + + + + 18 + + + + 18 + + + + + + + Name + + + ContainerType + + + Status + + + + + + diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs index c1299738ba01..ff6434c7eab8 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupBaseObjects.cs @@ -12,7 +12,9 @@ // limitations under the License. // ---------------------------------------------------------------------------------- +using Microsoft.Azure.Commands.AzureBackup.Helpers; using Microsoft.Azure.Management.BackupServices.Models; +using System; namespace Microsoft.Azure.Commands.AzureBackup.Models { @@ -57,34 +59,16 @@ public class AzureBackupContainerContextObject : AzureBackupVaultContextObject /// public string ContainerType { get; set; } - /// - /// Unique name of the Azure Backup Container - /// - public string ContainerUniqueName { get; set; } - public AzureBackupContainerContextObject() : base() { } - public AzureBackupContainerContextObject(AzureBackupContainerContextObject azureBackupContainerContextObject) - : base(azureBackupContainerContextObject.ResourceGroupName, azureBackupContainerContextObject.ResourceName, azureBackupContainerContextObject.Location) - { - ContainerType = azureBackupContainerContextObject.ContainerType; - ContainerUniqueName = azureBackupContainerContextObject.ContainerUniqueName; - } - public AzureBackupContainerContextObject(AzureBackupContainer azureBackupContainer) - : base(azureBackupContainer.ResourceGroupName, azureBackupContainer.ResourceName, azureBackupContainer.Location) - { - ContainerType = azureBackupContainer.ContainerType; - ContainerUniqueName = azureBackupContainer.ContainerUniqueName; - } - public AzureBackupContainerContextObject(AzurePSBackupVault vault, MarsContainerResponse marsContainerResponse) - : base(vault.ResourceGroupName, vault.Name, vault.Region) + : base(vault) { - ContainerType = marsContainerResponse.Properties.CustomerType; - ContainerUniqueName = marsContainerResponse.UniqueName; + ContainerType = ContainerHelpers.GetContainerType(marsContainerResponse.Properties.CustomerType).ToString(); + //ContainerUniqueName = marsContainerResponse.UniqueName; } } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs index 6bfdaa7c5fc8..eba87adff331 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupContainer.cs @@ -27,45 +27,29 @@ namespace Microsoft.Azure.Commands.AzureBackup.Models /// public class AzureBackupContainer : AzureBackupContainerContextObject { - ///// - ///// Resource group name of the resource (ex: resource group name of the VM) being managed by Azure Backup service. - ///// - //public string ManagedResourceGroupName { get; set; } - /// /// Resource name of the resource (ex: resource name of the VM) being managed by the Azure Backup service. /// - public string ManagedResourceName { get; set; } - - ///// - ///// Status of health of the Azure Backup container - ///// - //public string HealthStatus { get; set; } - - ///// - ///// Status of registration of the container - ///// - //public string RegistrationStatus { get; set; } - - public long ContainerId { get; set; } - - public string ContainerStampUri { get; set; } + public string Name { get; set; } - public Guid ContainerStampId { get; set; } + /// + /// Id of the container + /// + public long Id { get; set; } - public bool CanReRegister { get; set; } + /// + /// Status of registration of the container + /// + public string Status { get; set; } public AzureBackupContainer() : base() { } public AzureBackupContainer(AzurePSBackupVault vault, MarsContainerResponse marsContainerResponse) : base(vault, marsContainerResponse) { - //ManagedResourceGroupName = ContainerHelpers.GetRGNameFromId(marsContainerResponse.Properties.ParentContainerId); - ManagedResourceName = marsContainerResponse.Properties.FriendlyName; - ContainerId = marsContainerResponse.Properties.ContainerId; - ContainerStampId = marsContainerResponse.Properties.ContainerStampId; - ContainerStampUri = marsContainerResponse.Properties.ContainerStampUri; - CanReRegister = marsContainerResponse.Properties.CanReRegister; + Name = marsContainerResponse.Properties.FriendlyName; + Id = marsContainerResponse.Properties.ContainerId; + Status = AzureBackupContainerRegistrationStatus.Registered.ToString(); } } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs index bf75de554bdd..332fb487024c 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Models/AzureBackupEnums.cs @@ -20,7 +20,7 @@ public enum AzureBackupVaultStorageType LocallyRedundant, } - public enum AzureBackupContainerTypeInput + public enum AzureBackupContainerType { Windows = 1, SCDPM, @@ -32,17 +32,8 @@ public enum AzureBackupContainerStatusInput Registered, } - public enum AzureBackupContainerType + public enum AzureBackupContainerRegistrationStatus { - Invalid = 0, - - Unknown, - - // used by fabric adapter to populate discovered VMs - IaasVMContainer, - - // used by fabric adapter to populate discovered services - // VMs are child containers of services they belong to - IaasVMServiceContainer + Registered = 1, } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.Designer.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.Designer.cs index 58372d895579..515623e43787 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.Designer.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.18449 +// Runtime Version:4.0.30319.34014 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -61,20 +61,29 @@ internal Resources() { } /// - /// Looks up a localized string similar to The specified Azure Virtual Machine Not Found.. + /// Looks up a localized string similar to The specified resource does not exist.. /// - internal static string AzureVMNotFound { + internal static string ResourceNotFoundMessage { get { - return ResourceManager.GetString("AzureVMNotFound", resourceCulture); + return ResourceManager.GetString("ResourceNotFoundMessage", resourceCulture); } } /// - /// Looks up a localized string similar to The specified resource does not exist.. + /// Looks up a localized string similar to Unregister Server. /// - internal static string ResourceNotFoundMessage { + internal static string UnregisterServerCaption { get { - return ResourceManager.GetString("ResourceNotFoundMessage", resourceCulture); + return ResourceManager.GetString("UnregisterServerCaption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This operation will delete all data in the backup vault that is associated with the server. Are you sure you want to unregister the server?. + /// + internal static string UnregisterServerMessage { + get { + return ResourceManager.GetString("UnregisterServerMessage", resourceCulture); } } } diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.resx b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.resx index 73ab213136b1..3abfe5b400d9 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.resx +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Properties/Resources.resx @@ -117,10 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - The specified Azure Virtual Machine Not Found. - The specified resource does not exist. + + Unregister Server + + + This operation will delete all data in the backup vault that is associated with the server. Are you sure you want to unregister the server? + \ No newline at end of file diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Resources/Microsoft.Azure.Management.BackupServicesManagement.dll b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Resources/Microsoft.Azure.Management.BackupServicesManagement.dll index 4ed29f9fc5812bfae3da13349fc7b6474af50d42..d686b576b1bce649312c703388d11ce2c2ab5c18 100644 GIT binary patch literal 79872 zcmeFa33wdE(LdZX(yp{C$}E z^BPn$RbACxU42#c^voW8>eZ@3DOHKT*IrZVi@5UN3W0kEyO2Do<4cp&U9sQ`+;`%B6Rt`%$i1ueCLv0|f4h+mI{#IuO&61u z{|8rtl7xRBLcS;Q2KhEbcvJLmm!oPy8a~QVQ;L%Iigx;{3tKhtBP@XhV}skrfLG3k zzDSe08ofO>kT)&J=CWHr5Z$1oRCE!p*1r{Kt_9h_;S3n5tAfsAg9A$VR#{?l`wZ=h zf7H!Y5w-ClrCKjkDl921`vg+ZjXFR+q1-$!mGK@Go$Jw2MbdEz)6oY>$0bZhza$+O zO`oOQiUP5@N_lx29<-jtL(Jka`k*V;;R?k*mB8 z?WPk-#bIAJHwz6|pfK(~#d`|4S!g#}psm~{sT?lU-%TeW*e!;?H@hO80+wl%yr2^5 z@2cx?g^CF`Jz4rjMdPbZ^Q%rgI=@zBTaaz83H;|)+T_JPIbxHcuHl|k*_dvIn4i%$ zKMB^SMcm2)jps%RY%zCIWq~c~rZLi@ZU!~!Q3`GDstf*4=vQ8eY=K&~Lho|QKo7Rb ziMaBgTaj)PL;i;wg>}9j`AeHjilnFg|E^VZzq!!YvGPBup1n}IBJSB0r9a}H-BG#$?m4hzbm5*; zhYT^?bBM_}i)Pqwqh7x~Oa>DNY()XEQem)pa}CBT$2rL|uT5SQQ7b?MA<S^o!A?n<_5sLR7OK>E?S^x|mH-8xN(gQRV zO~`|nb zvrh`;aPVk~o7Z`+1tnYMsL^P8204|RJpowZD9~Lu&r9|s5YjVQhEVgA$;^gD#jF|3 zd2v)j)S8b;P=wraTxkf!gPc6x>^b2AN^`&*7cCO@l)JH z(2QyHw0L?Rvt#3tEoi=aw&8rH9W6x#FtY&EmQykdap_nnOOCW}7c(GRv%YwIi@Z#r zAIoVjk!Jp_9i zdmjV2*TwwM`!C+T1OR)uxh2d=XF-_FAp6`>5HtG&pbk2XHIW4;b3j1Oyb1SNOhBXA zo2gZ=B<(x`yy*iqTVP>XFHLUb$Sea#bLJqxRCTgCy_`3(WGsC!ZsxCXn+vRxn}`*# zT35O|*8nDCZW_~Fk7}-c@(ZY_n`c@o<|gB>Ho=xoBCffcL>QSJip*3prc+_8W0{vf zb+w$r87O3~p8DQfXrOCosvD&+6l2dfXg)Jz&@|~4EJ3*w)S6z6XG5v=N)Vbes{m6q z$(l6k7*EwEYtyJ6Yu#dMU0Z;w?$x^1O+!to^?kT;^Gr+Cy2-j%o2oJ4Ch9b|sda4{ zR*xrZbz*9go0w$kUA`K$Ng6XStKsH}WiUI&3&&A|JYnZIVG=#BEsMc0Mb)Jp8nvX6 zM^)n)l!mGv37D!+)~C^h;;DvYLmHztK7VHp-94U4xQRpoo=T8BfFd@ftTz+f-#ff#TR_1l1iXa|#$h5rdqH`|KT@K;D8oYaY*| z8^X3lOs9b<9YL=kJ2IYVbh7aD+gOe%y6&mbYA^Q=Q@FQUPx6%M69M%^h*LVaS=Y%) zJhRDgKGmM8bUR+vEhgPIQJL;%;#18koDfTI7NNN-F$U0|)mPBF|A`^}MGWJ)!1<5# zt3f*+b^L`zmqdU`G5rVMQDJa72k5a#7nn$7ACz8r7a0*VUiULMBu9XEE zHK`&6^g~?Jr$efM*$4M#aHu@d+N6tA*taLCq*m!O!CBLzs!#@f!H4R^$4j)NX1aN_ zXJsm#NbjRF_!h|ao{viQo=ZRnxOWtw2i4c^9@>HK-X>o1MA&k35_9Ii)pPgeCg*B* zk362c_d|3eH;*n-c||Mo3j2I-1=;iYbjIjGmDxW-rpV_*^U>$y#q#-tnx{+|pO3nU z&o?2Lqtd_ED?RM#q}3H`iC*pm%>K1N$Vpx1B#WzzhsdDPsuS zSdz%2{l1yLq+ux*6~B=RXDz>xd0BoVli6%R7pR9BwBLx)hYAMJ^9L8AV9#%)isCnt z4Spjp9^WGH6-a=7EGO(YQd0azCK*Yoc+hy!Y z_Gp)JUUHsx8P~#Phg*;*BL$HaSw3o$UnWFmA5E!Al43R$q)wG?) z{gV4>r*TPgiFO(b+G$+sCYBbqv7lB{^(BQ2QC;;VZW`^Zt3DHL@8-#?y~d@9rP^y; zs=dagp4TYZ<(W%riJRQtc#Zq(e2tBkXs>Ze$ZI^nO&m}-lci74;!N|sMk4eYF|UQq zWR|yOr$RvivFZ)w~_Oc zxQ#**w~;I;jTgF&yoTLI$Sga%64lM2yF}qG(kNBj+K(E!EH=7EGZ?S&+Uj|=)urOg zDj=?^$Ka4T88l%$)!T!X?|lJ-FwvVqmyg$}Tpl^5kTbemG*OvB{o^W@eW#Z$Y<;30vh}61?J7|pxc;dIWYE9{(S^U@XMm^;86-+GfZ_>V zcoMQnHjPeVk*jPmD$ zysNBumlmI1m6&d9WyAx6btk$Z-d$F_TZ_-AO3d)=1@(hT*o#L`=Ok4ckJ51P5AzHl z^pa&UmBypxS4@`X$D>42v!2QZZN!L_#d{6KI8)R?Zg3XV6Jb_aK24jFm3U^8VMRzf zn~|q12eK$8W~VWsAS7*(kkm?;l^z$VxhpZhW7d4j4oQ_Ks$*4HiLojP=^fy-V%6!BtXLJ(;~R-pKL_P{e}YQ({(#_7f^P!! za0I}p-h&Hv5KiiADc zAhxw+t=QJ42Jxy*4PslHT9((=sVKI!WrNsOs5*W=(D=tZ{+QP+|vm~4oGdGYup3MK(#i{(rZ1vAM+!Jal0GEp!|Itu2U*PV)@U`c8$ z6v&bHri6bh3f5T=hN56iW-*~CnB)nfU`&dB6dV}00mgOnIyZ8>eiY2wFbcki*PZZa zBnrlKZb!jP3`fDj-c+D;nJD-?X674epQB)V!ejKP=O!`M3iJugp*zc0JBid#wO=<1 z*418ExP+SOY9k7+^{TC-U?zs6U|~1aE*AysikGhk(}F0Nn2v(arwVz(GEuNyUm5~Y zur5R7k3hZmJqo^<1+_|>xrrr(cM{cAM-+^O%Z`G{`#MpuWS3_y;V4-0H8z?!3f{%i zLrYxH;!N|SU?PlyFAxFCOhr+!ZK-`U4x?b*5hk>Tj)LDvC3O`14r;5TU{SoWaG~f= zdQlWCBsk`AVL`ViC!=6qOFYzY6wJK+D46{J8wLMw6#TzYu=Tu=o;LOi{$o+F46=Ve z3KsEyKMEG{e?JNq@&7kba4-pbQLs$4r(*UBKb7^OV1^oc$=YiaTzhwV!RT2fu@@YlE#7m-JSq@}TEQ*4y1V0K^%8P@4YvSO)7RAAbMsyr}gDkJm z3I7-$HzPh~9Q<{QE{OmyfX2Ue+#ji*+0rcw#lfhdLYOLXFugy6R`W#V4eL7wSO$Yq7Dp6yX&0?z_{VF?{6Uju$OPiRNVLa-xI+FhQEntx%mKk5#~bld@mAZIr2P~Y=}g8@%R>juRsF4HXFtT5{yQ(Kt~g`UlJsz0(|kHiAZg9?U=bd92QY zFpZeqe;%vJEG86*l3YF#%?C+5m*eJTlwn1PdT0EuWElr?60xn{Afc)*jvRKVTK;llM2b)6(T?;2 zSuh`Ph+RD|FmyUkx~9cRJhKV4LWh3BJDn%CmJU~RIxk4@Pv^l0To2nr{3n=zK8NA> z?&{L>c|3z?pW6ew{QDJn`PUBYNbT!!UMo4Dhe=L+y~~kEUyo}keZ4E>8Y!?-dFS(F zVuXuFW#Qrx)h-_99=doW1n2Xn>9;!O@+@G5nhHHIwIuLb2{gtUbQ_r6{QD^~9}~8` z+yS1{qNq9sR}98P?lC4rD+=U|Ru;&t(mP?(=&RB1AuU(Hy_<$>9&b*c512_olXN3M z2AdyoXqQH0;yr^&Evi&t(0aHPl_Hp#?v?H^f zg}!9=_5A_$#pY&M-zMtYOnoml`eGxnSYOe@*SFg%-O{&GfvQ6Ken9m7pui6SrWbp1 zVq=Uq1v@2jKQua%A39SY8Yxi1SN%tCTy>NYVg6bt=pNC=p5ZCsDeu`j)Hgni(%t+= z0Mko60p#WN4Hzwvd)(+vUg%9`U*R89;r~S6nCX}9y^n;p;`>N7C{DVpydOzy?p!yG z-8>F=bb09NsyVn;f!|FZf_(5koDNF#yMmX&Gc`}>D$*EH5Y%$|eNIzOZKxb#EC&P4 zF6RipoK>ae@Tf|1 zn074t5u1Cem#3SkGCUYU z77wvf9t?GhhZxI0R@4o(p~(}&z~U!H{u3wU$5d(Y6SM1Q*#mPs>oqOJPt4L8W+6{U zh=&;Syu7pxr)d7p5I?aA_@N&2?+Wn~V|$(=b#!xBOyWG^jWGb#{PyJ7fGj3ptG>i6 z{Y@P)y;(fOEFM&u`Cx9bc!*g%rY$g_EgoW}JhMVP#7cQ)hj@rh&_<@*bcmmrl_#2m z`eVAVbR%Z*n0!F7c!;swiTl!m5I?cK>xre!%AZ)N4vRuO#7cRv*jV`xE9KcQ#6zr< z2h+cm53y37r6C?-7LVya`-galSv~J=C@yZ zUWGKwjNW<`)8&!szw`Vxth<=f@SaPXn@1HYQ&SRC_VGQJ<00F7TLr+41lJK<1<=FL z?oQ-oHcN5vj%SB3T0PGs|6e7ke+X=q|9DBN6AfgUnz<6@31^Q7pMLhj0!v22EQbax z`aPUaAuB|{pXMb`grP6h-RYfPnwFfV-@_q~w_VGc=o)(4wbb5~T6q*|>`F~M%9A4X z3FMZ(iLi+G8u>$y_!wcWlMKLE^9xNJdBv6fM82k zL^V~{u}H*|2sUyp3F`opO$|0@ZECQQYg5beYTFiTqPJcDn|8_*hPGWvu(w@l8`*Yc zVfMBw8Le$sCeti|iR)?S`RH(k&mzsu2hiJ2#e(K3X@W=H;+pd397`ZRI051~od^yLk z-gebl5T@S^^}W|%G?~SOwp~e{VB0lF(%Y^w5>BOUv6f-0b>}Bp2G%TYy9U;80Ee5` z#gW6_cI`-Z==WqglbykPGMvWTL}%e^yzcxcV6xLqBkJIJk+vrvspkB|#8ju7>@x4k zbZPdc0;Q1~=6k$b-RZw4^EqbLSol0IxvP;__yTX;JTEr+izEv*%NWVclaRSaSIeK6 zGV4(-%uX`fY*LaVUJ@X0_FBvZRpliz*IQy~RVAmf%{0ULPO=rI^m|aE&V<#amRSa8 zhMDuH#bT(}f@+jnhQ`K0eb%%V@}fACGuHv6rt?LFo_RR0{9d4SDp`?+X7N-dZf@XB zgf9j}tP&J>vrJ(x{|3%)w|R4IDly$NL^YUlV8Z!rqw>wLMYX90j7{^mG+%id--vi0 z7z@%Yrg!i@eIuy3n*cI5Gb7z|GPjU$D?s+c$S{2y(f3PwW8rRy1!JWAjygnD@5kWa z^xkgR+M?c|tk+wV>W055qv_g=sYKvU-@R$N+i->-N$nmt2oPZMxR=GZ${2MM>B85EYJ;R*eh5g9@aHRO5c2Asc0AkH??uhg??uh=-iwm#^2{Zb zc9V0>dr@q?L@fKevb$Q#!H5bhw;$kG%F5} zWt-tf71?het;Hi^y1z_l9=!1a^SqH-<0vIgTz-Y>=MKX(qifPw_^MQhbiMb^u`Mr3 z3F!nht+1dpa&qsT*YMsutDD83Qn^Era|&}k&4l-n)&ez>GL!D*oh0UQ8M08hW0*&E zB8r!i4yJsfN~TjSTlS?S>U^xqVK(6#N!55G>1YwO-*hSaMiK?(jii%MPxD3+<~{@y zG%qV^y=GJPy(E)^|6WoQ?|Rc&)HkcmwiQv@;eZGG-W;rsnmQ~RC*Kh z<<+*a&6wm<%?htAeTbE zDHxI71D*2IA^H3VIz&?Kc)i76!uWa%$EQ~eAL+<=?Gw%LdP|6vQ=!dDJhREL;+f85 zzTP5(SmrjI1q0&0-eM)Rr{Ue8>T}h~o#-^E5*~A?mAIaTYX`3UNBYIJN}*q?@8N3G zUjyI%_*+^hJ|EeI|7VyZE{ZADXVE1Q;0neb z$at<(QMgmCl?4WWJnuuFLeBeqLf=FR^zZOg2#oOpv*epFtS+7k5!FwHP%NJck&s3f z`l$xb{d~4csacF=;Yi(&)Kq1nlA$cBCv|GZm49IKzu$$A2OR^vw;T2Cokq|GAQ9{y zWPw(qn}T;JizC=?l%!e_td1_f2^P%y-{K`t#LMdKUUV5vMs;*ao^W)@(!I!0N0%(o zqdY0GBi&FfMg1SR`xjJl#&^4p-ped5K6C54)&Oqp1cb(UCiLM|&DBM*ZnDIka? zMO0JWJZn@W;zM8=LoCUQ$G3=sgaphrEGHaGQc_|` zCYe~$(}qGOmLy5XlDzYpqbQb?q{hOdLRIIsP2>CF}I1rYBQ39hkfWyt};>cl#ko>ORatO$0y5KVCuXAzwa1+&q zAMm>K0l;LnJPU$@S@Yz2Oc8FLX{l=0`~DWr`3QGYfx`Ia*P&D+S?x!V-(_CD{Saqx zUgjU>AJr4@h3}wxuYlt$vyVMr&@I>Fn{`O9V8-wc%U4#17glAl9C+bHJQ>&F1;5U< zMpw2)^mP+8g&$EtUD+BpJ%x&(viQavif3A?#`V6tm8jL+rm{6Ux~MVHMV*U}cIoPt zuLjeC=z^GzE*_%>c|z~a67*y5z>ZyARu2bubQvOl1Zrc)5tEXWbR5BxJL_3h^HHt_ zp3wOr3u-kruP;1KRM))TO;0s7A4FTYd9vy-q5?pYHk|3lFUiL3=aJ4$jQBnUv>z_Fc@1ec&x}j4GB4ZzJ2$hB#LR7mU)6h%chL8}rA@c3018bB@ z(+|OsrTmYP4&Sw9ANSP14FmS_gLvgUlAj?jw>umRsdj=U0IsllcUxyc7<#=`lUYp2H6eKd*Ca^Nu8E9}?I`^Z6AhUF~UwKTuO$ZJhP$l%*Qg#-mo0&&1R;H`!tKKsz+M zsrEGOrA#wkN++KY=!%!G2h##Cg_!nIo}~(TLeEP<-}b%&W!IPW!xEs&5cy&+r7PK` zy_D(6>7m`uZa2|gc%B8dnyODP{E?`x`gE7Gv~KZlSF-Bl)ouzt6{6jgZtbRYd%K;I zU7oq5rn^aO1!J9>oS32WH8z^A-IVDeH)W=qm|6G@OAjp?L5nlZcT}O6&OoI5Nvf`7pczqSV1$C({9&BeK6o7a`srYvIeGPg$bGB?} zz9})=+RjYiLr{7Ch-NRk4TXa%i>17vwN_c+32}ysl;r$=rnXS zm~!NX`@miwj5se2C_k~0&yNF$q?)js>6gGrfCJJihLL~_&_2-&yO|+YndOW|WF?;2 zWLUAA+00l#MyYG!iG_RzjhFg)cclPK1r(y-;sg=ZRBg{95l2=(vPmQ#9X-4Z zem74TiXKR?qX$|{q6doF(E}N+=z+;JR$%xbdiV#@+EQ?e=B;>SrCSz2Tf)% zq3D6+38IG}Nk>KLJbP6}4{dOU9nufGHI}x`IT$dWM~>#h54Y5qn{85@~$n{!r?{@5?h4 z^TaF6)VJh5M-TSILSIr(1guSZ1xrBmP`=tada$Z(MGwhjQb!M|WGaXrbhT53%AndQ zm%oHU7drOjX;@A0n=-6+%1t(!=%G=wn`)g1N;gdJ+$iRq1B5XB)dFwNwv7iHWNLx>3ofiT6FZ#5{e$$-9&rg zRjGA(OEJxl9*8h{cufQ>Gnpl5*>et-?{Lr9N8>Ph&>dkyYixiIfgcol1C>OSjbI$V zlZNP_9|Kk^-dJ!*$&;?52TouTJqYOpw4|`0G;%U};5F<}vSVNtp-N25UWF-M9;eq- z&8sc?EGzSGR#ozORQ!Gs%~zdy8{K|Sny1l3x-K@aw&=^OEa^&?l)Duo_~gH2fUsf{ zbBJX>?3G;pbFwTPaYN{HvNuWDvFulT(XyYDHKL)<$=)KOQtzM}crI=EK14p>r6rPz z!=;URehXb%_7b|ZERlYy^qM}IXyDR@SY_y0ti)}XwuUaPbS0TW@m1PSG9UB(Nh=|q z{*)Bp|0cqNm}#!V-zo6lY`-;+VHiVO@tM0vXM6D9XF%g$JMN9&%89!o{b}SqSHBa6 zdQeWDw{vx--%3Y}ek+{@`mJ14#Bb#+1Hbh%5HH9Q0Kb(=!*3<3{nlB?5PmBO>Cb|* zMt&TD&)Ij>C^b*^w_EYUUFeu8e9m97+#<8-W`{;(L zZQ#XnH-(y~Oc{5Rx{13vA(!Q`k%u0X6!1@!uU$3~)h-*3&S5G^vuzr9nAR2^Xy+9m8R54P{SrwiE>ZkN zsfP72MKW6cqF39%a`hP6dbc?NR=hmtL(dOf2$j6uX4XvnMY6$P;_7}O^x*Rr5@lf@_xDkJm!`n@C6xw**i64-w zOm?{JG4viTtc&(%4oN_ND@*k=vojO>tA!_=_oK=38=~{Y85+puea` zGHc`ei{-1W{Y9(VmcPgy*ww5ycVO4(YPX2uZen_2GBwrJ#+EAvrLOi4Syh?Hoz!mQ zFLrBoQ|;;6U&KyoHGk1*hKrq6UGehuU|QfW64U-7K7s;c5qkb2`nKmU+Vy4q;4kVj zM84QxoSB@d{l!_ySs{OMwwst;z|#@>i@L>U6{Zl?RiEXiG4<%GpC=Ild9}Yd8+%al zP<*!b7iW9^qGXq6F4$mAn&Y!Lvn%-;8_m-G;;fLrCFj3RUQ4OKEV*G zF0|gjj#~T2Ww)Ox2uIZ0eok=z+1tRbw)U>eZa!1k+I)^-^LaOGimC<&am(&I8%b~9 zIfi}b+l^$fV_kO3*+_a@&M|B`f51ovo7H7^n~h|H-at;ou%8TTi?+c&buy7e!z4?( z$^7l~74<&#JhM+d&)TO>DQrZ42-)FB2U6BPbyH05Q#azw?nk7w#5}!EO?9|W-Rik( zsl+^b+oV^6DM#)n&>PUPvdkC>%Wlx0^0#Dq0+}9PM)!5=Q~u3~W>l-Wv|4RAF02jG zqI)cU*#NU3rfUw0V2<#DiSiQ+`TSslNU9CNgs&xo2~HuNsthJ%O7Vk<5Ub3~#u8*D zZU+S=CCl!9VxtCRrT@8vm^LgN{H&`fjKLWxU^Ho6kOl z-(;h|!T5t7CgTq}CyYNh1taYE5~K>^Ng(WC^$>Ot)nNznW7t7L`W|rVutUz(JOUm3 zxMM09-ay>Z582)t%#FQK0{l|F>U{-u?t!`VY26vf5bMZHUh+h|j_iNQ-j6%Th*0yC*;^zsAy?q* z7s$g%L<%^^|0P>3%KCWSdz#0kt2t2?K`_xnMk|#APrwy@Szu^lnrLc zhG2#lk57Ub5>RuNGeI!JBooYd+EB;@GbHI?hId}m76mhs)L58Hj=VRB{;gm}XF(VW zW;B__gn}88CkSSOBpuAi7_ozyZkAz!nZWuwn9;?NrU`AJadSMAQ z)zwBYgPGJ0W|$ZbW`x~TyIe4%D_*`HObdb;Vmg?aM-}pfWr7*IzN{aD8C{0RV;K)^ ze(yb)*^dRaN}KUj$E8Gd)e+2Kp|XP+^1eGDG5P#phDd2J!zsk`_86halu|yJk$Kq)W{8&rGcwP}Y+Dq}SP51z+ z&quLE!Oy{RRPA!BR!Sp6rc& z;AF{K=YMSK_sjA=UY1&x*Vd_JVx5AMKvKGn#15fF^Ms+3KqT0~5UnV|5Jl~iKxDLn zAtuv+L1P5L(4k1f=d*n11vz#w#B$`x4%rY4@#67GFhm0SG0O=DLzI*!J4`ackf#lW zOfW=}4u*K=HCItEBuR~h739c!!*8Ns2#*`^3IQgV-X?+u01h?%9)Zq+Fq^?g#dAyP zt?tjUjSqZD_ADzD5s^GWL=+_Hh)4#G6%k36TJ{qdJXvTq>YWr?hHSlHDQF!XENM;1 zVFyd)KVD9A@Z;r2@w)Q>Kz_U&Z3x%7_Q~VrF#yxTA1@c~rUHe_e7t-m^J*-t;zfT% zXEkr#JTEqR4aq_^AJHMf`y>wMHkrLLx9KTNra1K4Jh`&pfJMyg!zoUf((hq=TqAQW zilYLd&&Y^krlELW`WYE%l3SPyPDsSFzeOS8&&aHWSkQ^e$AOSnz1OoJ-DY}EXjWxZ zpyx%FmR_ON-C4dxbsT85=t{8f^~3DCMQaO3Q&Zid_%J(0o3!XIEFEs1Y2gpE3%6;} zavx^b^|lv>pc+gI!a!m=3_Oe)~ zNgjPWhN!MSj=o|4PO7iJ&Q4Yx3gUwq`ngs@Ki5il&$T4CJTnP@on5jucAEI>?1!`P z2^yVgeke$Uq2LiBV42D+!QR)|ZENkLZTNL|-4`Y@#u!?{eM5EBUuR!OW%bwDMeoMK zk)l57IuhjUEswQ?B#|IlP#Q0c1bGcdf|Thr9J0CZeVv_USYKxkOyzmR<$ERhe2dDNBYAonEtTX)$@l#UuS3kv^j~}?rDzLZp>NAB z1()`8%qInz_us$Tna_H&2?mP}Ki4RCF5l;ahkURu? z3;6kRki#F46!xY9rOSLk@-$}FSa>Th+V_1MZ{0jEHo1>vp&H+p1kd;7Bq!5YW~cFe zO^3{rD;ulvCmqgp!c^q@Qh|`~D~jc{eRyB$`-;i;=KF4fSkOPp`@V3SRqy-QF>d#K zUwe9`)2OFImgf7u<(pLdzE+d2418an<5~?g#cwID!Hv8=tedpEa3(d?P1^0I5vB1# zK--h}{4UC8VyatSjYSjl)mULSP1>ywbeYp$DS0VYSG;^Zm=-v{#I*C@-Wv?tS~>Fi2bwp{6Y@LW#agxA&y&}!O~i#Q}U445K&$K z*=`yEs;R$(bL7?DZ#t3I-fvoaziH3=mF)7&B{kbk&M|KR%+dK8L(SHwx@Lz?b;+@( z%`82%ss_!@G~fFrLhpBr2w1i{5H?80oMPkEI+`fnt?qyIS2mAS-79_~v{_{~O?X|#>=qm36C$*sQRgdc5$WR0$8 zZ8aW#Txuk*^d<3z03M6fl{5qE>3yuR8ZQrHArlMT>Pt@enMO#~r@zWk*-(uags~kV zlArMlop^~AT= zUt%pk`LZ-W#v@Yt!A2I(*p1~e$`f_GC@=iMM$W`GD{(u_lMgn^q#{!*KG^s*RLeWU zWhJzy?`4AW-v{|4Cf*OCD_n!P2hNiG2;F1RO|tqeX#BI{Jo+dV>HCoP z+~9o>Y;8!KM^}h(9-|Y+dGsL|=h49O41=>M0=}<9ydd5V0zN8@fRCsS_zr-A2>3`y zKLAcSnC1Q463&1{7V@{PpgBC7w}aQsZxuK!a2ut+gic}qF4tR8F*sL=+;5qH z-{qnletU_6_{}IvM)9k#l=Xj#>33kwJqR^IKhyOl=$P&W$m~H9^iF@n(-dX!cb=MY z6&?B8QIpJ1b-@kL3i;Imum0_;P<=+Aft$|=90laF98(kKjpYirXJ)+Jt%;B zP{P;$`F~4){o7Z*{`$ACu!x7XFRS}mDBaCtrx-8?$SI{rcVv{v{lVx?e&|jC=uQb= z_dovUbVsKuuR9WgeuV8PXgx0QY(Ng8BHhvQiQEfDck)Ab3P5*C_`3gzx<6FhZxA!| zq?fVZJZ$>SH$(kK+g)@Desc^(7VEBmj}9F$&>e9#bl(oh@ny8ueeoFd7nGdH{n_YE zUg%9`U*W${;cpcyd=M30PKCd16#h=2u=jg(qKE(cZotCo`h7g4?+(%TT!DE&j`bp2 z!%&IbUyaV>ht3p$ttsKF{^A=~UFMNS*u~S`{JtB^6jr|I_uce-vlFGe`2t`Xz!&^OK#ea{!T3own2S!C;j zsq^2B&g6&A6o9QM;j8`51&bCeS+ry^T0^Ob8U}n3lTr71N^Qaf{t6bb?hRwvp^-Ck2o!p zov=Zz*($$}sJah7Vci;}Z3O;63({5%XEu`=|FG^kCv|+FCWZx4{bS}5PSz}a0Dn+Q zp~4FFR86>|Q55Q;u-z%?sHv=nD{vjdUn~CRAr3>}U)ZTzQaMeX)Vit_?`E_f)pWnQ6h@1xFXH}Nau1$X<~*m3dG@yL zj!jqV0Hf-yLb(z5&FYtJ%(=6@y1iK)3OHSz*}kHxT}qs8Y(+}5dZN7pbn4KoS|`(< zt0w=Y0{no})U}gWwZ_$*lOwS9qm!%KXQ@e3+$m8>jjHuiSi6BKtk=dk`F}cuy#rbW_{d4AyQ6;54;z2Klue?wR!$#-*l*aqQdw-;EhYR*JusW2qUa)@%mQcqER^zUBdNElYC)hM#%kj&b zCn*O*YB8`b)uc|9v_pW^;g?u7wgK2wHBG%$(#8bqRGS660oV%Fr3MB2jL4zA1$!9S za(p*)TuOKvSQk9vos#xv;ap&_$_kdZP@OMnGX-0wt`}^HU<4-0k;u&J=v#{~OC#Tls2O7(GRhpz#vLo0qt+Tl^bR;#;J1={aY%u%Pf*y1$#j~E!cYni#k6S?CZ10Io0{4 zU@y%kw!iah!QL^4*s;!U1k-xH-TAFxTF(*Z_kw9X&vO1CnAUU5c|ov^SPSaZInJL2 z%L=x``Kw^N1>5QTk6_;s>^$f1u>5(^Er6FtPY1j<`gXwG(GkE01U@UNFAJ=yIt%n< z6?%(msQwG!!LhHPYigLR`Z4Zz#+cjvvFCCB=U9X5sCb-|DFT-YBu_MYN_<3}xT`-t z!##1=kicyM&k{H;aHqg40Uh;Tk$ozD6z;2QP6Aw4lL6dab0Oe;HFp5MSi{s=wVwst zT+4EA7xYzji;2jBSOM6Du@0&*e>swC8j6bDi z6!7LG^i+2w$8dj7ay#IxmOEUm1TCZ=CGfPCouFss{@Rv{aDR8pWq{ANyc;mudM#jm z>-zwwv{LGAtskj$)NQT*1^9{9PXm6h^|OFKZ~Y2*JRR=B+^uzZB>6N-v~~FG6zZ^N z3Um9Zz+X?H4zCETpGx|)snlfgRBEzzDm6K2DmCe!`W57y5uQt?Qj;5}2AX_qDmA%# z>fSVYqQoX|pGJKO(^&2`0&kf{eLgF2k5GO%jru${jrzPYjrvULpgye~)Mr))We@J4 zKF4(g`fTc;KBFDBK6`7O4|PzJFGz0R68NJIYVrrUf2D&u)OS*c?oR5ke)`JX3)-O&0wAv3%q&;?RxoCQDy7lcgUc@RXS>{q=ep?eIo=+ROFj+RL`XzuVv3hJEXAe$PpGn#59^ zqih{MBG$ND?C>3dKNf4eAkdvfD`Us?RTGv334O@{G-9>5a45Iz0jp5z5iCsn4d_)Msoq^|@p= z^|^XB^|?)WJ~x~CJTyDd=f|_D&vUbFee`U=F;$m(DH*m5KD!7_=A@~^!2*v+QONOF)54yroNHl!tXybeO_3!Qwmh;>P7LWh`;q4Qd0rCf zQWB_uvZwBrNUw$cH_|G7&ij!TU_Xc)jJRL_+f(<8$SPpRbrOFzMy(_2OoLJDh}vZ^ zY8_GUGZ?jws81V=T1V792BX$d^#g-Z>!^ChVAQ%wy<{+IU8PVc{yiI`*41i?!Kih$ zN(;6pMy+FNg~6zGOr0#)C9Q2$JAmEeV+CNR!N*pLY43y&`@E064^hK$-Co*lh>c$K zu{*I@aS^<6>}sfGRd>l=1hGAl3#z`VCi52m_C!8f^&P}U`rn?&o~kF56fJ3g1?NoF z2v1$93sL&>h=zECh4pK#{u}n!pIac9!#wAx>$vHmo^_b#Jax-@jWN%K>e3T6#ypp( z&Xb5;ujW=O=K!_SU>8)?I0vfl8f<-aJL0c-Cu`1+R?Tz{RTmj-uzIPpNNN|K6ZC?zjK0*JqS#MK-m*{qSMP!XZqNz*vFl%>Wh-mCDrR<_ckytUAue9&@tlLx%Ggktdunb&tWav7ZCm<8$snEc*kK zc1f%Y*z*RvHr5O5C4+q{_M&sPYIuv*kam5tPR+S z7Uy==AHs$W=cIU-+O94#SW~qXxt8&;Yy3V9StpuKKpYRwM0P^&^dm zW_k51lg9ex)hh;L{qib$n$$=*cdAB>ReuC|?o{&(_9f)GQypM&7StM(_Ph8oZb6-9 zu$SY<13S}Ttu=3P&r`b$)>E?y*yS3N^3GT9Gid`gIrn_^X@k9^W;?JiS)9AnLniHx zns>Ro)H4SAOwDz`erIuBpem({UQ+$tnmgSK)D(mLqUMvp(gt&Ck8$6jRv0W%dpxl9 z2J5Z;f_tGFFxb(x_W&C;*m!N1x=3AWuy@t=0=v#&pF-Nj>f;8x7ikx(FB(U?<0Z0Bn)LE{EJ@ z>Ij3~2)WDD@fwp7E?1jO+K<3_x!P{9XTf>7dWXgNE_JoV`7ZTQi}PLTE`zZ~SEz3r zj5WGK{n%hlle*NE>Q4sinbZsH6@#6Cw0EmU>^gHy4@SdekNUL1;`LqXTJ?~@ z+Uk3O{lH+$>wn{3r=B<1k@e35d&yw^NPDkp*re;Q4QcOH?HUtXU$4?8jpO!uwZdQ= zx7Vv9EzTR%$tLYN=yHP^HP}ngV4`ugDq_61$LXpq`Vu|$4y!eoHwcm z40b6vZ&Z(1oHwZ_OxlAD|8#FsFBFpoV!(Qv%){U`tDX!1kl)*#c8~g^VArc>5=$!XRWt5q z+V$$g)hj99h*xLmE@NyN<=?*iqv5=(I{_qsG+tkXGqb`~JiZ6>%Cgrc%@I zj7OZM(tETnQD>+09<58%QD+79t8!|kFX^-@=Td{Qe$~#>i-WpXJD)Zf(_+r^($BP9 z%sKPwAkVlnEWJ*r#hqsiM!6cNSNfn%t8wl!7}IKa+%@R%5CMX${W3R$9V&$fWJx zb4*jh*(v=~%O#zQG^Wnzxv44X^hl4?X(?x^#?&Q9OF7S3X^qaGOxj&Ncg7o?8>D|~ zxh7|~#?;SyqRo8Di2b+Z8-pi;-$g{J5K)Z-R;mjmhhn;;E-Opd{E-P$wbXSYdo!Sm z2%2TxBa}xbpgbWw zy(s0r>gS0_6!(s_pqFaf&6e61dJGS$!)>Hhy1H6Yq3*yWM!MkE|z>&iZ8fQ ze8AhCXxoF8w>yn(4_AK7S=iR4rU>U0wYKetpr6$CY~_81IE{nen@V3bV(H-i_$y=iby7x{#E8345ZIAxk`Q_yE z0H2?HVRW6_Hswm>ke+fIQs*PYIYr<+wf~e4MdztiQ=*YmT(&3C#n#d3$G#9=9MSjrlfQii3JVJYP?=Z?<%s;&`z9JjgaYw?R zktft0H4D)S3)|jN`)Bvr?kj6whU~Sqr#S!Wz8O%r`;zt#)W#~Vocz&Rr(*GpPu0#* z+^w6#--ia|4&1LK=R^hL|3t+dH9x6+UPiR85`8`zc}1jN5vf;1>J^cCMWkL4sal6UpRM_$RIS54 zQ|qwL)XIpiMgKgns@7pYsdd;-8ZpYgAD@D;(^E48L%P@C_G!#Ww@_VZvlOY@EoN!fzqQo0Vk^;fPRo#g8S8KRm(3$ zYD*<$FRc7o#eDaJ0`C|2OMxoVQ!%MZMScmMiU@f+L3ymYQz+d+St0i;Kp&5-7Rn~v zr{kN1zC|dzB2tRn@0R-y%Kg1^f4|&6Blo|Qdle;rMN~?Z`);{kA@{50ev{m9k^2h; zeo)~30)Hv6qKY|m3tTO5i@?ri)~K_&r{apb6>`4<_d6zS0=%YvlTdaU*i&(H!*03X zjno$t_sadfxZjn02CyUbj8GITI^R_-Jr%=^oh{UVg}_Y$cM04r@Lqw>2vn`)>=d{{ z;3k2)1nw4iufS&nsy4~FZ8GY$OW?f%RXZswCJSBQy#mz~p$pt4@LqvxD(Qc(_-BQ} zNzz#5q{>5aTJ+S)|BAl9s=NBo*k5ArjejnFNX;oVSJd2Gb7#$$YwoRiu;xcKKdX7V z=2tbpt@%gIYc-X%vD!(ssoLMv{=Tkj(qogV>YuG&+z?5eoH#Q1>*PC9Po*Ah{9|KR z)1szBn@(3^CM%||x7@KP$oS4iPGRwM3sDzF(Va|@niwW)eMmukSt zwj`cGrSOfdMm&9Lf=AJ;y1{`N5c7JwnvY)Hi`Di(a2^EC<={LRUdJKeJ`~(5unF*d zSs?J(C{z0djzqaBvOUU8+J8@~yZWDyJtOvQMC2N7kNyVt zKaa7L-^Hq2o>=YxTpuUpSb-Y_YMw{r{*ao}!Ly{|?SMD9=K+4XhTmav>b?$GU&qwR zb$bBk)iIyNF5w|^|51Tw#D0p@&&&PaEU0;Q)RX^R0&f%eDS^7&&&&N+1wLH=7v%GO zfm+)&4U|1j;H?5zRYWV4`m@^(SXr?E@COO%Mr-JHc5#j1uL93OUHHo}w0=Zj6mUlp{!+jh*zyY-$_qBL_>4J*a5pfo^39uf0z(xOP15BU~;CvmR3y!I{Zv=F~ z*Ma+HfvxBd7@7jx(1Tp`otc2M@gL5%p+C9kJ9BWq60@bNRtQ{!{^h8(0*`>V>f$Ua z;X16k4u0QeG49u6rghZOfG*CT?vML73*4aI1j_LOH==(!c<1IoP)QP|+XW7* zqd?y#Fay0@H6n0S&dQzz=&CGqbg*)~8TaE@O&oPLpsUV-jt-u;5uOW8T|8eS+=+9d zjw%S;1$|wdXC=HqPR_mq(8XHP2cC-nT|DvW$NeP&FNN+dp5E{*-{q)*3lE?0T{to9 z;AsiryHO7pPe%x^!b<1hsm4~^UxRu$cv7(q_t&Zn?ynPg1GXex?9CG1h+S`J zTi)Xw1bCfuFnY@MxSy%shx=LTCfv_bx8Q!Z+AZ)lQ0A%s7I+sZ^VJsxejbzs>K@!L zP+!9RLiJUF_kyxWJs|Mwpe$B<1U>}He(IaJ-%ouT_e<0xxL=~ai~AIM>~|_(t2{k& zQ{)qodm}GJUX4Vewb5@>RaVzkKN#<>*}rCUO`+zZnn!B>QnRG?#M*7O=hl9=_UYPa z!_35Si91t&Z%j6|HT5^`Y`U=N6HN~_J=!$6`M~Ct&6T?tG1~v`!TJ44i+~syV>-+g zR}o>sF!%q(6~EbDEUV9%+xcCkI;zOWIl%kp(V`v!*IO(1LzK&1DeflVAJlxZQtM*p z=cvC;X7UWoBQxM_Wus8%&4or^DLQVdd#K zq27(L+pP}3-<$B)i@yW$w+w#=;cuZ@R#{NzMhfa-{B=jatZs@vs;;hjTs?}vALH-Y zsz0j(V~?xj@%I+|4aNSfo{tq&BwkRH@HZv?sJbfdIIqPkoT)XAlfj<-_L>gopxO@S z^Z0w9_9W-mbsf&D_^X=K;WSM;$@vzpzrx=i@b^#P&(y!gnbhzWrv-mA8wQ=%8n!y~ z6I-1F@V6#$j@CyMsPg`*Dv9EKdy6{E1V_GFzxcAGXvwpgNLZ2hqh!hxyff?;e00NL_Uxf8gE=cZ_OZc{+)!pDr`D~`jEwaUjSOaw9UaW}j|p)fX?8YJLn{k0lcmbOS8@StJ~*6H z#W}3b4)%`?9-BR3bO6`m`m_Dp2FC`orHqFUjvYUk8%6B~OEOtMl$$v5xNHVC7#kYQ z8AGq?&kY{C`R#*S#w>!Lx2|0%$JOJxvCOu??8Y6VgGwXE51utXm>WA{uz!HcYUMKH z*)4+`#xhxSA{hJhp)>qkncva<*<5KGOw8h^gaobXgy`kDMdjoB&sj|ioIbP#HeS<@ z$GPAZZ7urBk%5(~H>?>%zd<`~*g9^NWGdw+>N+xWi%B=39uxtCv6K=zT6^Gx(cw)0 z01Mu0l4)wc^ZE5F?vq8h)qS_+wq&xyLz~rx9l5c=ZED?`A>^9t-#k31j@Z$^b;0V) zwr%+J6*GkOxZSi^na;7!(0vthNGqN)Ocq6C-@fc?qS3(MK!~XOu%ESGyR{?Z+te9@ zV|^<}hfYM-!pK!8WQT;r%y_?Hd~51>me*w~-jnp1=rAbPAV@Ke?5{*f(%!^5%&ZOm*P98qgWI0TDkuk7F% zm?QOCwKBJ3WQ!`9GjpqUaLRd|)RBS1vRHrzhIg=Zu7dQ|P7Ex~LUhGdPU3QQsdvIOgAY{VlZg=v3M;xLdWuW0g*! z6ZEugWCQyK)3jMPGhpdlXwLxvb-J-z8aet7TJiHbMN^uMA%js3x zTh&=&(Lzs&B9fiKaIsf|MD3w5uafcWr!w1#Q_;AvqZr^sxg)#2)39$#|H$!!$IFB< znAMgFQ7C|E$KnYlJI}P<MR|F7#3EU5{r1Zc zK2l4iN$uNWJDk!HY=Q{cguc_Q2~W%snqtTwB7{xjYlSNM_g+oH1S%KGDX6Fn08!O5 zhCfjJJcQCWJ~9N~Sw;={PY6&dYN25{E8*z=EoUOOft>=cR`&u67b{t~<>{)vGw}6; z{^6Bdaz|uxW409!d+rHem4sB>#IEoVHFx|WF8#{A++vZVxEn-Y;wlP4-W}yfa2I{8#2_>n1p-X7ZOllvLdLz%f_uMyzSVt7U>cv~)z?(a)8A4sDB3H{o6`K= zXf11^ijCXM=Q<2vZa9_^C=S_GLtf7e{r!!Q#fvv{9Z4(l-ysBsW0PgU6{Ey2wn72X5;pK z*mY9cYhs8#VVEx7nt&n?NtHN9pm^b{@r%^ivPfl3eb|$ghXlU2?cjS}|Cxbjy+!+- zTfE5=Ro07uS^T|?2CRHV&a^Kg9WAsH_y){DM>zPR+Gw!FGL{)t# z9K&~RHjiVhdLo0T8!u6<%;g5RZ5~D#IyO8QFnZ)QgMQFlnrKQaO*m|5cyPi*tWenG z88<* zI6+~TNH$g$cTUm~*AeKwo2DA%2nas8ggBU*pI(qQ7FIHyH80Q}FG2_F-YqxJ1lzkSJ8SPtp z);N~Fu^p;p)5Yu=44pd|+DkGfgh9pzM-dTc#?Lr2sLS%#4KF3+I%J@)ZxJ>R;1kOb zUnf*qX*@^h=*-!J40^DWH5N)(e#qiJEFfIlM2a!`(Su`WW(HP`4-I4M60y|sL&p00 zHft2f(mr?yLpilPcV=dMcmUmQ%itmV_w|8sXyj}&$kz>!w4Yi&o*m}h5}7=i8C<*U zj$j*?iA&XTJ>v=M{<5K9CYYlKb2)}Z%Q+Pq8buB;Ogfq<;?hL2y~*o<*sKr3t ztOLlB)zShd|bH)&c@vFma>S&Wa2%)Rr#E4nP4p^!- zX7snk)S4lQ#{087HtnZY4h(QV)uOD0!LWNI-yx%}SPrBRIBx#Li)C$XZcG2DY(g7W zdJL;GnEBN@Zhqo%1!f#n>d4H{h-9#Gb1pNCDc=jD)(?)HF?OaTtv(Zb>ariIi#>jD zbeP^ahr90Q;`Ld#rjs!*GkJL%T?@Q5mcoY3BT+~1p2^-l$MiYtPDeoHugXRe+r4aU zg{dCTk8)O?G7y8tl>R`^L~i_s;grbTo&hEF6Gn3Vrw<-G5|AN*>73hk8?f1BN;MUi zLB*!r$`(PgF7x=oErUa6BXG8YbZf*=N7L=KarF?uwsk);(5fu(!OWs ztF0YeZ*YfZ3a?#Qjs77#2!oYm=Jc1U)tRjCJIJsN`kXp!D4QEQHoIocZ(R}qDxd%|pa6YH(H3Y6 zKcqnoBrOUw4}ECU?>jSdckbP#rI=1%5=wh_e$Slw&Y3f3@66mAn&Ui7ZXH9MFRCY3 z=CJ$&rv_t{)+s+6G0yps8dIDfwMkXGizgAr%xfN|QybL$jB8Qzvvo~s9)@i#YA5qC zyOlo|wPS<1SX?U|1RScIdUkAWZF)1bBk(?9M^M7Z7;!0kXk%>+wwSrSA!uqO z4pg?d=N%$91W01Y4FQ@saznty`X9if4st`l#er!k!~|taGPe%_k~mC503{035Wvwe z4QXHuOhXPH4on4L5`(D_gQXCIr2tr5mNG0X5jF zMr^f(1fWQ90#J)BRFV}Q7Z+mO{=6NZetnb8k#{|>+06@~{)+fT#T=yomuq^{fEhWX z>RGeU{NyxupE%npqI9d?v`l3jh|ufm&+ITYRPXALuNm>-fRBv#`orDPZo_jvHrhEg zxoVq_sWs*#Dp3d?BNJw|nT`X0RXqboM`n9wPEIeB)N}Kj(x-{(r8T35NK$mY0q8~C z)P)uvU0FLny}r(S1jcet@)yvN3$rU+l$3T)PaYjL9;uOp$kK)#hsQb&$LHskrs;?1 z1YyIiBQDCbaO$|FWK%uqEXm1KU2C~G!^SNar&(jUIK9@fT%2JY%f;z6X5cx`#w{0T z+oP!-Vx4NcJe}>>U4xN6$n3X?mU=#OppL> zoP-002A^XpOelbEtoZ`y$D1#JxM{us!0I$#0C2In6UW0{XbZqB25kYL#i1<#z9_T> z3=a)$QQLbnDHJg#to1jV#vxk-!Zz8Aree(K7Xi9Enu>rW5+CMIGR~+3D|V|g#I6WX zV%QY{P8_=;kTKX5fk++fia;iYT@lDQYFPv*G3<&!C63)N@QGqK42(2(!x|QY-7pZb zAUW9KS7?}Qup5qHGfcbg_#MMgmq;9_)ZEMsF&hRLG0cVmN*uFcAYw2Z1`>5J8wMf{ zK*J##D62h=k@~ZPD2)^{9UK8LAA55)H2Wg}tD8trRyC3bZ2)%yn_g_NV9OAE{PCvr)D522aijQCc5#xl~6BgE80HB?E1 zJzGFKq_T#R>>pbnL&_$;XStL8(E*&f*Z{o};_T~cSgwSAs(k}O$3?h`qm+1P0CkA$ zMbsve z47^ach)o~P+EDfj;8e@sYb8H@h~o@M-)jh+N2m`qmcfJ8jXrSYO0`e0@_x0pkCTwi zD$1%S#!-f{+gi%l7md=kh9g&CL=Cn`*Xjo}seRqF6bNSl&mcA6lkI}6mP87~5|0jQ zy$D*%=pVT1*g#*GjDCh=twU=7`CbFZ>@`~0a}F_$z#QstR>$4G+J2uxJ&xQ}JtFph zTnRHOfgUAMR|EFABZ^#EloZaQW5l&kgTzj>SR7QAqx3cKLF6w$OVx`%y9_w$k8aU# zS3+B1<4B`5kp9gn=;h<5!4Y-H)$^@2!)dAe{mUB+l8^46ZH z$Ec;We0n@sq$iNFBD(D8L^n&lig9H%g}SDx&Et&=q&f}Vq{eAW;OZEyotE0V)Q66J zeibS4)P6`X&SU*@b$R^!AyA~%Wh*BUK8;??nYe>&vLu#FL4(+HaPt)H&Z>-i7oh>1 zilYs@fb%;6db=n*bADOJ_}akr9PGuY@*X;jG+K7H?6j19TGE`9Cv*yR-?hygMO8^? z=@H=tm)fBL)N#w{v8Kxnz-C(Pw=ShRh>+W|%wrElYgkQC`|78k0v8%(g=ZX4S5&(l zaZX=5YUdze{Tp!(Y-`mKbiWyBATl3SXCGL>)-FM4mG#Hpk^tojaZW zJ;B+~>Q|KuqEnTn?Hwsry#uxI$?Nh2f4vs!j)^{Z4AigZ^k`3Y7L3loUQ82?qlfev zmaF!8-~GmrdX#gqwkfXl2rWgis=<0B&ⅆ-J&ODZBGozuY8hP{gChj*fT*d-u{xz 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 Date: Mon, 20 Jul 2015 17:05:47 +0530 Subject: [PATCH 3/5] wxi file --- setup/azurecmdfiles.wxi | 710 +++++++++++++++++++++------------------- 1 file changed, 374 insertions(+), 336 deletions(-) diff --git a/setup/azurecmdfiles.wxi b/setup/azurecmdfiles.wxi index ef6737be3aae..4ac014cca846 100644 --- a/setup/azurecmdfiles.wxi +++ b/setup/azurecmdfiles.wxi @@ -44,15 +44,6 @@ - - - - - - - - - @@ -98,9 +89,6 @@ - - - @@ -159,6 +147,15 @@ + + + + + + + + + @@ -189,6 +186,9 @@ + + + @@ -198,24 +198,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -225,6 +288,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -257,15 +533,6 @@ - - - - - - - - - @@ -305,9 +572,6 @@ - - - @@ -418,15 +682,6 @@ - - - - - - - - - @@ -514,9 +769,6 @@ - - - @@ -759,15 +1011,6 @@ - - - - - - - - - @@ -825,9 +1068,6 @@ - - - @@ -860,15 +1100,6 @@ - - - - - - - - - @@ -896,9 +1127,6 @@ - - - @@ -925,15 +1153,6 @@ - - - - - - - - - @@ -955,9 +1174,6 @@ - - - @@ -1026,15 +1242,6 @@ - - - - - - - - - @@ -1077,9 +1284,6 @@ - - - @@ -1429,15 +1633,6 @@ - - - - - - - - - @@ -1492,9 +1687,6 @@ - - - @@ -1521,15 +1713,6 @@ - - - - - - - - - @@ -1566,9 +1749,6 @@ - - - @@ -1586,15 +1766,6 @@ - - - - - - - - - @@ -1658,9 +1829,6 @@ - - - @@ -1797,15 +1965,6 @@ - - - - - - - - - @@ -1851,9 +2010,6 @@ - - - @@ -1880,15 +2036,6 @@ - - - - - - - - - @@ -1940,9 +2087,6 @@ - - - @@ -2215,15 +2359,6 @@ - - - - - - - - - @@ -2365,9 +2500,6 @@ - - - @@ -2453,15 +2585,6 @@ - - - - - - - - - @@ -2525,9 +2648,6 @@ - - - @@ -2581,15 +2701,6 @@ - - - - - - - - - @@ -2701,9 +2812,6 @@ - - - @@ -2730,15 +2838,6 @@ - - - - - - - - - @@ -2862,9 +2961,6 @@ - - - @@ -3165,15 +3261,6 @@ - - - - - - - - - @@ -3228,9 +3315,6 @@ - - - @@ -3278,15 +3362,6 @@ - - - - - - - - - @@ -3407,9 +3482,6 @@ - - - @@ -3670,15 +3742,6 @@ - - - - - - - - - @@ -3820,9 +3883,6 @@ - - - @@ -3840,15 +3900,6 @@ - - - - - - - - - @@ -3912,9 +3963,6 @@ - - - @@ -4000,15 +4048,6 @@ - - - - - - - - - @@ -4054,9 +4093,6 @@ - - - @@ -4077,9 +4113,6 @@ - - - @@ -4095,7 +4128,6 @@ - @@ -4114,6 +4146,9 @@ + + + @@ -4124,18 +4159,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4146,9 +4264,6 @@ - - - @@ -4162,7 +4277,6 @@ - @@ -4199,9 +4313,6 @@ - - - @@ -4231,7 +4342,6 @@ - @@ -4302,9 +4412,6 @@ - - - @@ -4324,7 +4431,6 @@ - @@ -4335,9 +4441,6 @@ - - - @@ -4347,7 +4450,6 @@ - @@ -4356,9 +4458,6 @@ - - - @@ -4366,7 +4465,6 @@ - @@ -4389,9 +4487,6 @@ - - - @@ -4406,7 +4501,6 @@ - @@ -4520,9 +4614,6 @@ - - - @@ -4541,7 +4632,6 @@ - @@ -4550,9 +4640,6 @@ - - - @@ -4565,15 +4652,11 @@ - - - - @@ -4595,7 +4678,6 @@ - @@ -4640,9 +4722,6 @@ - - - @@ -4658,7 +4737,6 @@ - @@ -4667,9 +4745,6 @@ - - - @@ -4687,7 +4762,6 @@ - @@ -4774,9 +4848,6 @@ - - - @@ -4824,7 +4895,6 @@ - @@ -4852,9 +4922,6 @@ - - - @@ -4876,7 +4943,6 @@ - @@ -4894,9 +4960,6 @@ - - - @@ -4934,7 +4997,6 @@ - @@ -4943,9 +5005,6 @@ - - - @@ -4987,7 +5046,6 @@ - @@ -5076,9 +5134,6 @@ - - - @@ -5097,7 +5152,6 @@ - @@ -5113,9 +5167,6 @@ - - - @@ -5156,7 +5207,6 @@ - @@ -5233,9 +5283,6 @@ - - - @@ -5283,15 +5330,11 @@ - - - - @@ -5313,7 +5356,6 @@ - @@ -5341,9 +5383,6 @@ - - - @@ -5359,7 +5398,6 @@ - From fcffeff3abc01c4cc20da9471c55f794ea11ec53 Mon Sep 17 00:00:00 2001 From: dragonfly91 Date: Mon, 20 Jul 2015 17:59:26 +0530 Subject: [PATCH 4/5] wxi generated after upstream pull --- setup/azurecmdfiles.wxi | 710 +++++++++++++++++++++------------------- 1 file changed, 374 insertions(+), 336 deletions(-) diff --git a/setup/azurecmdfiles.wxi b/setup/azurecmdfiles.wxi index 381c13af438d..403104afdfa9 100644 --- a/setup/azurecmdfiles.wxi +++ b/setup/azurecmdfiles.wxi @@ -44,15 +44,6 @@ - - - - - - - - - @@ -98,9 +89,6 @@ - - - @@ -159,6 +147,15 @@ + + + + + + + + + @@ -189,6 +186,9 @@ + + + @@ -198,24 +198,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -225,6 +288,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -257,15 +533,6 @@ - - - - - - - - - @@ -305,9 +572,6 @@ - - - @@ -418,15 +682,6 @@ - - - - - - - - - @@ -514,9 +769,6 @@ - - - @@ -759,15 +1011,6 @@ - - - - - - - - - @@ -822,9 +1065,6 @@ - - - @@ -857,15 +1097,6 @@ - - - - - - - - - @@ -893,9 +1124,6 @@ - - - @@ -922,15 +1150,6 @@ - - - - - - - - - @@ -952,9 +1171,6 @@ - - - @@ -1023,15 +1239,6 @@ - - - - - - - - - @@ -1074,9 +1281,6 @@ - - - @@ -1426,15 +1630,6 @@ - - - - - - - - - @@ -1489,9 +1684,6 @@ - - - @@ -1518,15 +1710,6 @@ - - - - - - - - - @@ -1563,9 +1746,6 @@ - - - @@ -1583,15 +1763,6 @@ - - - - - - - - - @@ -1655,9 +1826,6 @@ - - - @@ -1794,15 +1962,6 @@ - - - - - - - - - @@ -1848,9 +2007,6 @@ - - - @@ -1877,15 +2033,6 @@ - - - - - - - - - @@ -1937,9 +2084,6 @@ - - - @@ -2212,15 +2356,6 @@ - - - - - - - - - @@ -2362,9 +2497,6 @@ - - - @@ -2450,15 +2582,6 @@ - - - - - - - - - @@ -2522,9 +2645,6 @@ - - - @@ -2578,15 +2698,6 @@ - - - - - - - - - @@ -2698,9 +2809,6 @@ - - - @@ -2727,15 +2835,6 @@ - - - - - - - - - @@ -2859,9 +2958,6 @@ - - - @@ -3162,15 +3258,6 @@ - - - - - - - - - @@ -3225,9 +3312,6 @@ - - - @@ -3275,15 +3359,6 @@ - - - - - - - - - @@ -3404,9 +3479,6 @@ - - - @@ -3667,15 +3739,6 @@ - - - - - - - - - @@ -3817,9 +3880,6 @@ - - - @@ -3837,15 +3897,6 @@ - - - - - - - - - @@ -3909,9 +3960,6 @@ - - - @@ -3997,15 +4045,6 @@ - - - - - - - - - @@ -4051,9 +4090,6 @@ - - - @@ -4074,9 +4110,6 @@ - - - @@ -4092,7 +4125,6 @@ - @@ -4111,6 +4143,9 @@ + + + @@ -4121,18 +4156,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4143,9 +4261,6 @@ - - - @@ -4159,7 +4274,6 @@ - @@ -4196,9 +4310,6 @@ - - - @@ -4228,7 +4339,6 @@ - @@ -4299,9 +4409,6 @@ - - - @@ -4320,7 +4427,6 @@ - @@ -4331,9 +4437,6 @@ - - - @@ -4343,7 +4446,6 @@ - @@ -4352,9 +4454,6 @@ - - - @@ -4362,7 +4461,6 @@ - @@ -4385,9 +4483,6 @@ - - - @@ -4402,7 +4497,6 @@ - @@ -4516,9 +4610,6 @@ - - - @@ -4537,7 +4628,6 @@ - @@ -4546,9 +4636,6 @@ - - - @@ -4561,15 +4648,11 @@ - - - - @@ -4591,7 +4674,6 @@ - @@ -4636,9 +4718,6 @@ - - - @@ -4654,7 +4733,6 @@ - @@ -4663,9 +4741,6 @@ - - - @@ -4683,7 +4758,6 @@ - @@ -4770,9 +4844,6 @@ - - - @@ -4820,7 +4891,6 @@ - @@ -4848,9 +4918,6 @@ - - - @@ -4872,7 +4939,6 @@ - @@ -4890,9 +4956,6 @@ - - - @@ -4930,7 +4993,6 @@ - @@ -4939,9 +5001,6 @@ - - - @@ -4983,7 +5042,6 @@ - @@ -5072,9 +5130,6 @@ - - - @@ -5093,7 +5148,6 @@ - @@ -5109,9 +5163,6 @@ - - - @@ -5152,7 +5203,6 @@ - @@ -5229,9 +5279,6 @@ - - - @@ -5279,15 +5326,11 @@ - - - - @@ -5309,7 +5352,6 @@ - @@ -5337,9 +5379,6 @@ - - - @@ -5355,7 +5394,6 @@ - From bf2bf42208c5c1db55ad890f71440a16b9b7e47a Mon Sep 17 00:00:00 2001 From: dragonfly91 Date: Mon, 20 Jul 2015 19:46:26 +0530 Subject: [PATCH 5/5] Excluding Enable-Reregister functionality --- .../AzureBackupContainerTests.ps1 | 4 +- .../ContainerAdapter.cs | 10 -- ...nableAzureBackupContainerReregistration.cs | 58 ---------- .../Commands.AzureBackup.csproj | 1 - ...ft.Azure.Commands.AzureBackup.dll-help.xml | 101 ------------------ 5 files changed, 1 insertion(+), 173 deletions(-) delete mode 100644 src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 index 73ec09b22dde..466e97accd08 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup.Test/ScenarioTests/AzureBackupContainerTests.ps1 @@ -40,9 +40,7 @@ function Test-AzureBackupMarsContainerScenario Assert-AreEqual $container.Name $ContainerName; Assert-AreEqual $container.ResourceGroupName $vault.ResourceGroupName; Assert-AreEqual $container.ResourceName $vault.Name; - Assert-AreEqual $container.Status $ContainerStatus; - - #Enable-AzureBackupContainerReregistration -Container $container + Assert-AreEqual $container.Status $ContainerStatus; Unregister-AzureBackupContainer -Container $container -Force diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs index 4f8ef0ee1a45..26376ea2dda3 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/AzureBackupClientAdapter/ContainerAdapter.cs @@ -54,16 +54,6 @@ public IEnumerable ListMachineContainers(string friendlyN return listResponse.ListMarsContainerResponse.Value; } - /// - /// Enable container reregistration - /// - /// - /// - public void EnableMachineContainerReregistration(long containerId) - { - AzureBackupVaultClient.Container.EnableMarsContainerReregistration(containerId.ToString(), GetCustomRequestHeaders()); - } - /// /// UnRegister container /// diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs deleted file mode 100644 index 4ae62420fa63..000000000000 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Cmdlets/Container/EnableAzureBackupContainerReregistration.cs +++ /dev/null @@ -1,58 +0,0 @@ -// ---------------------------------------------------------------------------------- -// -// 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.Web; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Linq; -using System.Management.Automation; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Azure.Management.BackupServices.Models; -using MBS = Microsoft.Azure.Management.BackupServices; -using Microsoft.WindowsAzure.Commands.ServiceManagement.Model; -using Microsoft.Azure.Commands.AzureBackup.Properties; -using Microsoft.Azure.Commands.AzureBackup.Models; -using Microsoft.Azure.Commands.AzureBackup.Helpers; -using Microsoft.Azure.Management.BackupServices; - -namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets -{ - /// - /// Enables reregistration of a machine container - /// - [Cmdlet(VerbsLifecycle.Enable, "AzureBackupContainerReregistration")] - public class EnableAzureBackupContainerReregistration : AzureBackupContainerCmdletBase - { - public override void ExecuteCmdlet() - { - ExecutionBlock(() => - { - base.ExecuteCmdlet(); - - AzureBackupContainerType containerType = (AzureBackupContainerType)Enum.Parse(typeof(AzureBackupContainerType), Container.ContainerType); - switch (containerType) - { - case AzureBackupContainerType.Windows: - case AzureBackupContainerType.SCDPM: - AzureBackupClient.EnableMachineContainerReregistration(Container.Id); - break; - default: - throw new ArgumentException("Reregistration can be enable only for machine containers."); - } - }); - } - } -} diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj index 47f9c3cc3e6f..b7a89c251bc2 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Commands.AzureBackup.csproj @@ -123,7 +123,6 @@ - diff --git a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml index 31d0e6ad6ee9..3308e22c0faa 100644 --- a/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml +++ b/src/ResourceManager/AzureBackup/Commands.AzureBackup/Microsoft.Azure.Commands.AzureBackup.dll-help.xml @@ -1,106 +1,5 @@  - - - Enable-AzureBackupContainerReregistration - - Allow re-registration of the server to connect the server back to the vault and continue the backup points chain. - - - - - Enable - AzureBackupContainerReregistration - - - - When a server is destroyed, all its cloud backup points remain in the Azure Backup vault. If the server is rebuilt and given the same FQDN, it is possible to connect it back to the same vault. This will allow the server to continue taking backups and adding new backup points to the existing set - essentially continuing where it was left off in the backup chain. - To make this connection, the AzureBackupContainer has to be primed for "re-registration". Without this step, you can lose all the existing data as a part of the registration process. The commandlet tells the service that the next time the container is registered, it should continue the backup chain. - - - - Enable-AzureBackupContainerReregistration - - Container - - An object referencing the container for which re-registration is being requested - - AzureBackupContainer - - - Profile - - Non-mandatory AzureProfile input object - - AzureProfile - - - - - - Container - - An object referencing the container for which re-registration is being requested - - AzureBackupContainer - - AzureBackupContainer - - - - - - Profile - - Non-mandatory AzureProfile input object - - AzureProfile - - AzureProfile - - - - - - - - - AzureBackupContainer - - - - - This section details out the type of the objects that you can pipe to the cmdlet. - - - - - - - - None - - - - - This section details out the type of the objects that the cmdlet emits. - - - - - - - - - None - - - - - - - - Get-AzureBackupContainer