Skip to content

Commit 3e2d09f

Browse files
authored
Fixed a bug to continue visting NextPageLink when listing key vaults from ARM API (Azure#17618)
* Fixed a bug to continue visting NextPageLink when listing key vaults from ARM API * refactor code * minor fix
1 parent 06b6565 commit 3e2d09f

File tree

3 files changed

+43
-25
lines changed

3 files changed

+43
-25
lines changed

src/KeyVault/KeyVault/ChangeLog.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21-
21+
* Fixed a bug to continue visting `NextPageLink` when listing key vaults from ARM API
22+
2223
## Version 4.3.0
2324
* `New-AzKeyVaultManagedHsm`: supported specifying how long a deleted managed hsm is retained by `SoftDeleteRetentionInDays` and enabling purge protection by `EnablePurgeProtection`
2425
* `Update-AzKeyVaultManagedHsm`: supported enabling purge protection by `EnablePurgeProtection`

src/KeyVault/KeyVault/Commands/GetAzureKeyVault.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
using System;
1616
using System.Collections;
17+
using System.Collections.Generic;
18+
using System.Linq;
1719
using System.Management.Automation;
1820
using Microsoft.Azure.Commands.KeyVault.Helpers;
1921
using Microsoft.Azure.Commands.KeyVault.Models;
@@ -103,7 +105,13 @@ public override void ExecuteCmdlet()
103105
switch (ParameterSetName)
104106
{
105107
case GetVaultParameterSet:
106-
ResourceGroupName = string.IsNullOrWhiteSpace(ResourceGroupName) ? GetResourceGroupName(VaultName) : ResourceGroupName;
108+
List<PSKeyVaultIdentityItem> vaults = null;
109+
110+
if (string.IsNullOrWhiteSpace(ResourceGroupName))
111+
{
112+
vaults = ListVaults(ResourceGroupName, Tag);
113+
ResourceGroupName = vaults?.FirstOrDefault(r => r.VaultName.Equals(VaultName, StringComparison.OrdinalIgnoreCase))?.ResourceGroupName;
114+
}
107115

108116
if (ShouldGetByName(ResourceGroupName, VaultName))
109117
{
@@ -115,7 +123,7 @@ public override void ExecuteCmdlet()
115123
}
116124
else
117125
{
118-
WriteObject(TopLevelWildcardFilter(ResourceGroupName, VaultName, ListVaults(ResourceGroupName, Tag)), true);
126+
WriteObject(TopLevelWildcardFilter(ResourceGroupName, VaultName, vaults ?? ListVaults(ResourceGroupName, Tag)), true);
119127
}
120128

121129
break;

src/KeyVault/KeyVault/Models/KeyVaultManagementCmdletBase.cs

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -135,21 +135,12 @@ protected List<PSKeyVaultIdentityItem> ListVaults(string resourceGroupName, Hash
135135
return vaults;
136136
}
137137

138-
IEnumerable<PSKeyVaultIdentityItem> listResult;
139138
var resourceType = resourceTypeName.Equals(ResourceTypeName.Hsm) ?
140139
KeyVaultManagementClient.ManagedHsmResourceType : KeyVaultManagementClient.VaultsResourceType;
141-
if (ShouldListByResourceGroup(resourceGroupName, null))
142-
{
143-
listResult = ListByResourceGroup(resourceGroupName,
144-
new Rest.Azure.OData.ODataQuery<GenericResourceFilter>(
145-
r => r.ResourceType == resourceType));
146-
}
147-
else
148-
{
149-
listResult = ListResources(
150-
new Rest.Azure.OData.ODataQuery<GenericResourceFilter>(
151-
r => r.ResourceType == resourceType));
152-
}
140+
141+
IEnumerable<PSKeyVaultIdentityItem> listResult = ListPagable(resourceGroupName,
142+
new Rest.Azure.OData.ODataQuery<GenericResourceFilter>(
143+
r => r.ResourceType == resourceType));
153144

154145
if (listResult != null)
155146
{
@@ -161,22 +152,40 @@ protected List<PSKeyVaultIdentityItem> ListVaults(string resourceGroupName, Hash
161152
return vaults;
162153
}
163154

164-
public virtual IEnumerable<PSKeyVaultIdentityItem> ListResources(Rest.Azure.OData.ODataQuery<GenericResourceFilter> filter = null, ulong first = ulong.MaxValue, ulong skip = ulong.MinValue)
155+
IEnumerable<PSKeyVaultIdentityItem> ListPagable(string resourceGroupName, Rest.Azure.OData.ODataQuery<GenericResourceFilter> filter = null)
165156
{
166-
IResourceManagementClient armClient = ResourceClient;
157+
string nextPageLink = null;
158+
var results = new List<PSKeyVaultIdentityItem>();
159+
do
160+
{
161+
var response = ShouldListByResourceGroup(resourceGroupName, null) ?
162+
ListByResourceGroup(resourceGroupName, filter, nextPageLink) :
163+
ListResources(filter, nextPageLink);
164+
results.AddRange(response.Select(r => new PSKeyVaultIdentityItem(r)));
165+
nextPageLink = response?.NextPageLink;
166+
} while (!string.IsNullOrEmpty(nextPageLink));
167+
return results;
168+
}
167169

168-
return new GenericPageEnumerable<GenericResource>(() => armClient.Resources.List(filter), armClient.Resources.ListNext, first, skip).Select(r => new PSKeyVaultIdentityItem(r));
170+
public virtual Rest.Azure.IPage<GenericResource> ListResources(
171+
Rest.Azure.OData.ODataQuery<GenericResourceFilter> filter = null,
172+
string NextPageLink = null)
173+
{
174+
IResourceManagementClient armClient = ResourceClient;
175+
return string.IsNullOrEmpty(NextPageLink) ?
176+
armClient.Resources.List(filter) :
177+
armClient.Resources.ListNext(NextPageLink);
169178
}
170179

171-
private IEnumerable<PSKeyVaultIdentityItem> ListByResourceGroup(
180+
private Rest.Azure.IPage<GenericResource> ListByResourceGroup(
172181
string resourceGroupName,
173-
Rest.Azure.OData.ODataQuery<GenericResourceFilter> filter,
174-
ulong first = ulong.MaxValue,
175-
ulong skip = ulong.MinValue)
182+
Rest.Azure.OData.ODataQuery<GenericResourceFilter> filter = null,
183+
string NextPageLink = null)
176184
{
177185
IResourceManagementClient armClient = ResourceClient;
178-
179-
return new GenericPageEnumerable<GenericResource>(() => armClient.ResourceGroups.ListResources(resourceGroupName, filter), armClient.ResourceGroups.ListResourcesNext, first, skip).Select(r => new PSKeyVaultIdentityItem(r));
186+
return string.IsNullOrEmpty(NextPageLink) ?
187+
armClient.ResourceGroups.ListResources(resourceGroupName, filter) :
188+
armClient.ResourceGroups.ListResourcesNext(NextPageLink);
180189
}
181190

182191
protected string GetResourceGroupName(string name, bool isHsm = false)

0 commit comments

Comments
 (0)