diff --git a/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs b/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs index 819460f20a19..061b0e1c08f2 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Providers/Providers/AzureWorkloadPsBackupProvider.cs @@ -970,6 +970,7 @@ public void RegisterContainer() string containerName = (string)ProviderData[ContainerParams.Name]; string backupManagementType = (string)ProviderData[ContainerParams.BackupManagementType]; string workloadType = (string)ProviderData[ContainerParams.ContainerType]; + string vmResourceGroupName = (string)ProviderData[ContainerParams.ResourceGroupName]; ContainerBase containerBase = (ContainerBase)ProviderData[ContainerParams.Container]; AzureVmWorkloadContainer container = (AzureVmWorkloadContainer)ProviderData[ContainerParams.Container]; @@ -985,8 +986,14 @@ public void RegisterContainer() List unregisteredVmContainers = GetUnRegisteredVmContainers(vaultName, vaultResourceGroupName); ProtectableContainerResource unregisteredVmContainer = unregisteredVmContainers.Find( - vmContainer => string.Compare(vmContainer.Name.Split(';').Last(), - containerName, true) == 0); + vmContainer => { + string[] containerNameSplit = vmContainer.Name.Split(';'); + int containerNameSplitLen = containerNameSplit.Length; + bool vmNameMatch = string.Compare(containerNameSplit[containerNameSplitLen - 1], containerName, true) == 0; + bool rgNameMatch = string.Compare(containerNameSplit[containerNameSplitLen - 2], vmResourceGroupName, true) == 0; + + return vmNameMatch && rgNameMatch; + }); if (unregisteredVmContainer != null || container != null) { diff --git a/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.cs b/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.cs index dfa7cbd43c7a..b7e7e5c99558 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.cs +++ b/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.cs @@ -47,7 +47,7 @@ public void UnregisterAzureWorkloadContainer() "Unregister-AzureWorkloadContainer" ); } - + [Fact] [Trait(Category.AcceptanceType, Category.CheckIn)] [Trait(TestConstants.Workload, TestConstants.AzureVmWorkload)] @@ -59,5 +59,17 @@ public void TestAzureVmWorkloadUnDeleteContainer() "Test-AzureVmWorkloadUnDeleteContainer" ); } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + [Trait(TestConstants.Workload, TestConstants.AzureVmWorkload)] + public void TestSQLContainerRegError() + { + TestRunner.RunTestScript( + $"Import-Module {_AzureWorkloadcommonModule.AsAbsoluteLocation()}", + $"Import-Module {_AzureWorkloadtestModule.AsAbsoluteLocation()}", + "Test-SQLContainerRegError" + ); + } } } diff --git a/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.ps1 b/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.ps1 index bdcbdc774a29..d45acabf56e6 100644 --- a/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.ps1 +++ b/src/RecoveryServices/RecoveryServices.Backup.Test/ScenarioTests/AzureWorkload/ContainerTests.ps1 @@ -16,6 +16,40 @@ $containerName = "psbvtsqlvm" $resourceGroupName = "pstestwlRG1bca8" $vaultName = "pstestwlRSV1bca8" $resourceId = "/subscriptions/38304e13-357e-405e-9e9a-220351dcce8c/resourceGroups/pscloudtestrg/providers/Microsoft.Compute/virtualMachines/psbvtsqlvm" +$sqlRegTestVlt = "utkvlt" +$sqlRegTestVm = "utkvm" +$sqlRegTestRg1 = "rg1" +$sqlRegTestRg2 = "rg2" +$sqlRegTestVM2Id = "/subscriptions/af95aa3c-30fd-41c6-a938-4b3676fc36fb/resourceGroups/rg2/providers/Microsoft.Compute/virtualMachines/utkvm" + +function Test-SQLContainerRegError +{ + $vault1 = Get-AzRecoveryServicesVault -ResourceGroupName $sqlRegTestRg1 -Name $sqlRegTestVlt + $vault2 = Get-AzRecoveryServicesVault -ResourceGroupName $sqlRegTestRg2 -Name $sqlRegTestVlt + + #$Unregister containers if already registered + Get-AzRecoveryServicesBackupContainer ` + -VaultId $vault1.ID ` + -ContainerType AzureVMAppContainer ` + -FriendlyName $sqlRegTestVm | Unregister-AzRecoveryServicesBackupContainer -VaultId $vault1.ID -Force + + Get-AzRecoveryServicesBackupContainer ` + -VaultId $vault2.ID ` + -ContainerType AzureVMAppContainer ` + -FriendlyName $sqlRegTestVm | Unregister-AzRecoveryServicesBackupContainer -VaultId $vault2.ID -Force + + $v = get-azrecoveryservicesvault -ResourceGroupName $sqlRegTestRg2 -Name $sqlRegTestVlt + Set-AzRecoveryServicesVaultContext -Vault $v + + Register-AzRecoveryServicesBackupContainer -ResourceId $sqlRegTestVM2Id -VaultId $v.Id -WorkloadType "MSSQL" -BackupManagementType "AzureWorkload" -Force + + $container = Get-AzRecoveryServicesBackupContainer ` + -VaultId $vault2.ID ` + -ContainerType AzureVMAppContainer ` + -FriendlyName $sqlRegTestVm + + Assert-True { $container.FriendlyName -eq $sqlRegTestVm } +} function Test-AzureVmWorkloadUnDeleteContainer { diff --git a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Container/RegisterAzureRmRecoveryServicesBackupContainer.cs b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Container/RegisterAzureRmRecoveryServicesBackupContainer.cs index 7b5837363590..719e63c39037 100644 --- a/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Container/RegisterAzureRmRecoveryServicesBackupContainer.cs +++ b/src/RecoveryServices/RecoveryServices.Backup/Cmdlets/Container/RegisterAzureRmRecoveryServicesBackupContainer.cs @@ -88,7 +88,7 @@ public override void ExecuteCmdlet() { ExecutionBlock(() => { - string containerName = Container != null ? Container.Name : ResourceId.Split('/')[8]; + string containerName = Container != null ? Container.Name : ResourceId.Split('/')[8]; ConfirmAction( Force.IsPresent, @@ -98,10 +98,30 @@ public override void ExecuteCmdlet() { base.ExecuteCmdlet(); + string vmResourceGroupParsed = null; ResourceIdentifier resourceIdentifier = new ResourceIdentifier(VaultId); string vaultName = resourceIdentifier.ResourceName; string vaultResourceGroupName = resourceIdentifier.ResourceGroupName; + if (Container != null) + { + if (Container is AzureVmWorkloadContainer) + { + AzureVmWorkloadContainer azureVmWorkloadContainer = (AzureVmWorkloadContainer)Container; + Dictionary keyValueDict = HelperUtils.ParseUri(azureVmWorkloadContainer.SourceResourceId); + vmResourceGroupParsed = HelperUtils.GetResourceGroupNameFromId(keyValueDict, ResourceId); + } + else + { + vmResourceGroupParsed = vaultResourceGroupName; + } + } + else + { + Dictionary keyValueDict = HelperUtils.ParseUri(ResourceId); + vmResourceGroupParsed = HelperUtils.GetResourceGroupNameFromId(keyValueDict, ResourceId); + } + PsBackupProviderManager providerManager = new PsBackupProviderManager(new Dictionary() { @@ -110,7 +130,8 @@ public override void ExecuteCmdlet() { ContainerParams.Name, containerName }, { ContainerParams.ContainerType, ServiceClientHelpers.GetServiceClientWorkloadType(WorkloadType).ToString() }, { ContainerParams.BackupManagementType, BackupManagementType.ToString() }, - { ContainerParams.Container, Container} + { ContainerParams.Container, Container}, + { ContainerParams.ResourceGroupName, vmResourceGroupParsed }, }, ServiceClientAdapter); IPsBackupProvider psBackupProvider = diff --git a/src/RecoveryServices/RecoveryServices/ChangeLog.md b/src/RecoveryServices/RecoveryServices/ChangeLog.md index 7af18370a5b9..e96f9d5e7af4 100644 --- a/src/RecoveryServices/RecoveryServices/ChangeLog.md +++ b/src/RecoveryServices/RecoveryServices/ChangeLog.md @@ -19,6 +19,9 @@ --> ## Upcoming Release +## Version 7.8.0 +* Added check to compare the VM resource group in the list of VMs returned for registration + ## Version 7.7.0 * Fix for reprotect cmdlet in Azure Site Recovery for Azure to Azure provider. * Deprecated the `Token` parameter for cross-tenant authentication in MUA scenarios for handling breaking change in Get-AzAccessToken cmdlet, use parameter `SecureToken` going forward.