Skip to content

Commit 202c1d4

Browse files
NoriZCNori Zhang
andauthored
[Az.Accounts] Fixed returning duplicate subscription ids. (#19450)
* Fix the same subscription ids should not be returned in GetSubscriptionListByName issue. * ChangLog update. * Changelog Update. * Polished code. * Polish ChageLog. Co-authored-by: Nori Zhang <“[email protected]”>
1 parent 0688cd4 commit 202c1d4

File tree

4 files changed

+54
-5
lines changed

4 files changed

+54
-5
lines changed

src/Accounts/Accounts.Test/AzureRMProfileTests.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ public void SingleTenantSubscriptionListSucceed()
500500

501501
[Fact]
502502
[Trait(Category.AcceptanceType, Category.CheckIn)]
503-
public void GetSubscriptionListByNameCorrect()
503+
public void GetSubscriptionListByNameSameIdCorrect()
504504
{
505505
var tenants = new List<string> { DefaultTenant.ToString() };
506506
var firstList = new List<string> { DefaultSubscription.ToString() };
@@ -514,6 +514,29 @@ public void GetSubscriptionListByNameCorrect()
514514
client.TryGetSubscriptionListByName(DefaultTenant.ToString(),
515515
MockSubscriptionClientFactory.GetSubscriptionNameFromId(DefaultSubscription.ToString()),
516516
out subValueList);
517+
Assert.Single(subValueList);
518+
}
519+
520+
521+
[Fact]
522+
[Trait(Category.AcceptanceType, Category.CheckIn)]
523+
public void GetSubscriptionListByNameCorrect()
524+
{
525+
var subId1 = "a11a11aa-aaaa-aaaa-aaaa-aaaa1111aaaa";
526+
var subId2 = "aaaa11aa-aaaa-aaaa-aaaa-aaaa1111aaaa";
527+
528+
var tenants = new List<string> { DefaultTenant.ToString() };
529+
var firstList = new List<string> { subId1 };
530+
var secondList = new List<string> { subId2 };
531+
var thirdList = firstList;
532+
var fourthList = firstList;
533+
var client = SetupTestEnvironment(tenants, firstList, secondList, thirdList, fourthList);
534+
var tenantResults = client.ListTenants();
535+
Assert.Single(tenantResults);
536+
IEnumerable<IAzureSubscription> subValueList;
537+
client.TryGetSubscriptionListByName(DefaultTenant.ToString(),
538+
"SameNameForGetSubscriptionByName",
539+
out subValueList);
517540
Assert.Equal(2, subValueList.Count());
518541
}
519542

src/Accounts/Accounts.Test/Mocks/MockSubscriptionClientFactory.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ public MockSubscriptionClientFactory()
5454

5555
public static string GetSubscriptionNameFromId(string id)
5656
{
57+
if(id == "a11a11aa-aaaa-aaaa-aaaa-aaaa1111aaaa" || id == "aaaa11aa-aaaa-aaaa-aaaa-aaaa1111aaaa")
58+
{
59+
return "SameNameForGetSubscriptionByName";
60+
}
5761
return "Sub-" + id;
5862
}
5963

src/Accounts/Accounts/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
-->
2020

2121
## Upcoming Release
22+
* Deduplicated subscriptions belonging to multiple tenants while using `Get-AzSubscription` with parameter `SubscriptionName`. [#19427]
2223

2324
## Version 2.10.0
2425
* Supported returning all subscriptions with specified name while using `Get-AzSubscription` with parameter `SubscriptionName`. [#19295]

src/Accounts/Accounts/Models/RMProfileClient.cs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,11 +421,32 @@ public bool TryGetSubscriptionByName(string tenantId, string subscriptionName, o
421421
return subscription != null;
422422
}
423423

424-
public bool TryGetSubscriptionListByName(string tenantId, string subscriptionName, out IEnumerable<IAzureSubscription> subscriptionList)
424+
public bool TryGetSubscriptionListByName(string tenantId, string subscriptionName, out IEnumerable<IAzureSubscription> subscriptions)
425425
{
426-
subscriptionList = ListSubscriptions(tenantId);
427-
subscriptionList = subscriptionList.Where(s => s.Name.Equals(subscriptionName, StringComparison.OrdinalIgnoreCase));
428-
return subscriptionList.Any();
426+
subscriptions = ListSubscriptions(tenantId).Where(s => s.Name.Equals(subscriptionName, StringComparison.OrdinalIgnoreCase));
427+
List<IAzureSubscription> subscriptionList = new List<IAzureSubscription>();
428+
HashSet<Guid> existedSubscriptionIds = new HashSet<Guid>();
429+
430+
// Consider subscription in Home tenant first, exclude duplicate subscriptions by id.
431+
foreach(IAzureSubscription subscription in subscriptions)
432+
{
433+
if (subscription is PSAzureSubscription && subscription.GetTenant() != null
434+
&& subscription.GetHomeTenant().Equals(subscription.GetTenant()) && existedSubscriptionIds.Add(subscription.GetId()))
435+
{
436+
subscriptionList.Add(subscription);
437+
}
438+
439+
}
440+
// Consider other subscriptions.
441+
foreach (IAzureSubscription subscription in subscriptions)
442+
{
443+
if (existedSubscriptionIds.Add(subscription.GetId()))
444+
{
445+
subscriptionList.Add(subscription);
446+
}
447+
}
448+
subscriptions = subscriptionList;
449+
return subscriptions.Any();
429450
}
430451

431452
private IAzureSubscription GetFirstSubscription(string tenantId)

0 commit comments

Comments
 (0)