Skip to content

Commit 951fcee

Browse files
authored
Merge pull request Azure#3257 from TianoMS/tiano-d3
Support ResourceGroupNameEquals and ResourceNameEquals as parameters in Find-AzureRmResource
2 parents e6ced83 + 133b43b commit 951fcee

File tree

8 files changed

+387
-298
lines changed

8 files changed

+387
-298
lines changed

src/ResourceManager/Resources/ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
- Additional information about change #1
1919
-->
2020
## Current Release
21+
* Support ResourceNameEquals and ResourceGroupNameEquals as parameters for Find-AzureRmResource
22+
- Users can now use ResourceNameEquals and ResourceGroupNameEquals with Find-AzureRmResource
2123

2224
## Version 3.3.0
2325
* Lookup of AAD group by Id now uses GetObjectsByObjectId AAD Graph call instead of Groups/<id>

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Components/QueryFilterBuilder.cs

Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ public static class QueryFilterBuilder
2727
/// <summary>
2828
/// Creates a filter from the given properties.
2929
/// </summary>
30-
/// <param name="subscriptionIds">The subscriptions to query.</param>
30+
/// <param name="subscriptionId">The subscription to query.</param>
3131
/// <param name="resourceGroup">The name of the resource group/</param>
3232
/// <param name="resourceType">The resource type.</param>
3333
/// <param name="resourceName">The resource name.</param>
3434
/// <param name="tagName">The tag name.</param>
3535
/// <param name="tagValue">The tag value.</param>
3636
/// <param name="filter">The filter.</param>
3737
public static string CreateFilter(
38-
Guid[] subscriptionIds,
38+
string subscriptionId,
3939
string resourceGroup,
4040
string resourceType,
4141
string resourceName,
@@ -47,21 +47,9 @@ public static string CreateFilter(
4747
{
4848
var filterStringBuilder = new StringBuilder();
4949

50-
if (subscriptionIds.CoalesceEnumerable().Any())
50+
if (!string.IsNullOrWhiteSpace(subscriptionId))
5151
{
52-
if (subscriptionIds.Length > 1)
53-
{
54-
filterStringBuilder.Append("(");
55-
}
56-
57-
filterStringBuilder.Append(subscriptionIds
58-
.Select(subscriptionId => string.Format("subscriptionId EQ '{0}'", subscriptionId))
59-
.ConcatStrings(" OR "));
60-
61-
if (subscriptionIds.Length > 1)
62-
{
63-
filterStringBuilder.Append(")");
64-
}
52+
filterStringBuilder.AppendFormat("subscriptionId EQ '{0}'", subscriptionId);
6553
}
6654

6755
if (!string.IsNullOrWhiteSpace(resourceGroup))
@@ -74,33 +62,13 @@ public static string CreateFilter(
7462
filterStringBuilder.AppendFormat("resourceGroup EQ '{0}'", resourceGroup);
7563
}
7664

77-
var remainderFilter = QueryFilterBuilder.CreateFilter(resourceType, resourceName, tagName, tagValue, filter, nameContains, resourceGroupNameContains);
78-
79-
if (filterStringBuilder.Length > 0 && !string.IsNullOrWhiteSpace(remainderFilter))
80-
{
81-
return filterStringBuilder.ToString() + " AND " + remainderFilter;
82-
}
83-
84-
return filterStringBuilder.Length > 0
85-
? filterStringBuilder.ToString()
86-
: remainderFilter;
87-
}
88-
89-
/// <summary>
90-
/// Creates a filter from the given properties.
91-
/// </summary>
92-
/// <param name="resourceType">The resource type.</param>
93-
/// <param name="resourceName">The resource name.</param>
94-
/// <param name="tagName">The tag name.</param>
95-
/// <param name="tagValue">The tag value.</param>
96-
/// <param name="filter">The filter.</param>
97-
public static string CreateFilter(string resourceType, string resourceName, string tagName, string tagValue, string filter, string nameContains = null, string resourceGroupNameContains = null)
98-
{
99-
var filterStringBuilder = new StringBuilder();
100-
var substringStringBuilder = new StringBuilder();
101-
10265
if (!string.IsNullOrWhiteSpace(resourceType))
10366
{
67+
if (filterStringBuilder.Length > 0)
68+
{
69+
filterStringBuilder.Append(" AND ");
70+
}
71+
10472
filterStringBuilder.AppendFormat("resourceType EQ '{0}'", resourceType);
10573
}
10674

@@ -134,24 +102,24 @@ public static string CreateFilter(string resourceType, string resourceName, stri
134102
filterStringBuilder.AppendFormat("tagValue EQ '{0}'", tagValue);
135103
}
136104

137-
if (!string.IsNullOrWhiteSpace(nameContains))
105+
if (!string.IsNullOrWhiteSpace(resourceGroupNameContains))
138106
{
139107
if (filterStringBuilder.Length > 0)
140108
{
141109
filterStringBuilder.Append(" AND ");
142110
}
143111

144-
filterStringBuilder.AppendFormat("substringof('{0}', name)", nameContains);
112+
filterStringBuilder.AppendFormat("substringof('{0}', resourceGroup)", resourceGroupNameContains);
145113
}
146114

147-
if (!string.IsNullOrWhiteSpace(resourceGroupNameContains))
115+
if (!string.IsNullOrWhiteSpace(nameContains))
148116
{
149117
if (filterStringBuilder.Length > 0)
150118
{
151119
filterStringBuilder.Append(" AND ");
152120
}
153121

154-
filterStringBuilder.AppendFormat("substringof('{0}', resourceGroup)", resourceGroupNameContains);
122+
filterStringBuilder.AppendFormat("substringof('{0}', name)", nameContains);
155123
}
156124

157125
if (!string.IsNullOrWhiteSpace(filter))

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Implementation/Resource/FindAzureResourceCmdlet.cs

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public sealed class FindAzureResourceCmdlet : ResourceManagerCmdletBase
5858
private readonly List<Guid> subscriptionIds = new List<Guid>();
5959

6060
/// <summary>
61-
/// Gets or sets the resource name parameter.
61+
/// Gets or sets the resource name for query as contains.
6262
/// </summary>
6363
[Alias("Name")]
6464
[Parameter(ParameterSetName = FindAzureResourceCmdlet.ListResourcesParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource name substring. e.g. if your resource name is testResource, you can specify test.")]
@@ -67,6 +67,15 @@ public sealed class FindAzureResourceCmdlet : ResourceManagerCmdletBase
6767
[ValidateNotNullOrEmpty]
6868
public string ResourceNameContains { get; set; }
6969

70+
/// <summary>
71+
/// Gets or sets the resource name for query as equals.
72+
/// </summary>
73+
[Parameter(ParameterSetName = FindAzureResourceCmdlet.ListResourcesParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource name for a full match. e.g. if your resource name is testResource, you can specify testResource.")]
74+
[Parameter(ParameterSetName = FindAzureResourceCmdlet.ListTenantResourcesParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource name for a full match. e.g. if your resource name is testResource, you can specify testResource.")]
75+
[Parameter(ParameterSetName = FindAzureResourceCmdlet.MultiSubscriptionListResourcesParameterSet, Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource name for a full match. e.g. if your resource name is testResource, you can specify testResource.")]
76+
[ValidateNotNullOrEmpty]
77+
public string ResourceNameEquals { get; set; }
78+
7079
/// <summary>
7180
/// Gets or sets the resource type parameter.
7281
/// </summary>
@@ -118,14 +127,22 @@ public sealed class FindAzureResourceCmdlet : ResourceManagerCmdletBase
118127
public string TagValue { get; set; }
119128

120129
/// <summary>
121-
/// Gets or sets the resource group name.
130+
/// Gets or sets the resource group name for query as contains.
122131
/// </summary>
123132
[Alias("ResourceGroupName")]
124133
[Parameter(Mandatory = false, ParameterSetName = FindAzureResourceCmdlet.ListResourcesParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name substring.")]
125134
[Parameter(Mandatory = false, ParameterSetName = FindAzureResourceCmdlet.MultiSubscriptionListResourcesParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name substring.")]
126135
[ValidateNotNullOrEmpty]
127136
public string ResourceGroupNameContains { get; set; }
128137

138+
/// <summary>
139+
/// Gets or sets the resource group name for query as equals.
140+
/// </summary>
141+
[Parameter(Mandatory = false, ParameterSetName = FindAzureResourceCmdlet.ListResourcesParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name for a full match.")]
142+
[Parameter(Mandatory = false, ParameterSetName = FindAzureResourceCmdlet.MultiSubscriptionListResourcesParameterSet, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name for a full match.")]
143+
[ValidateNotNullOrEmpty]
144+
public string ResourceGroupNameEquals { get; set; }
145+
129146
/// <summary>
130147
/// Gets or sets the expand properties property.
131148
/// </summary>
@@ -254,8 +271,10 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesTypeCollect
254271
extensionResourceName: null);
255272

256273
var odataQuery = QueryFilterBuilder.CreateFilter(
274+
subscriptionId: null,
275+
resourceGroup: this.ResourceGroupNameEquals,
257276
resourceType: null,
258-
resourceName: null,
277+
resourceName: this.ResourceNameEquals,
259278
tagName: this.TagName,
260279
tagValue: this.TagValue,
261280
filter: this.ODataQuery,
@@ -279,10 +298,10 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInTenant()
279298
{
280299
var filterQuery = QueryFilterBuilder
281300
.CreateFilter(
282-
subscriptionIds: new Guid[] { this.SubscriptionId.Value },
283-
resourceGroup: null,
301+
subscriptionId: this.SubscriptionId.HasValue ? this.SubscriptionId.Value.ToString() : null,
302+
resourceGroup: this.ResourceGroupNameEquals,
284303
resourceType: this.ResourceType,
285-
resourceName: null,
304+
resourceName: this.ResourceNameEquals,
286305
tagName: this.TagName,
287306
tagValue: this.TagValue,
288307
filter: this.ODataQuery,
@@ -306,8 +325,10 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInResourceG
306325
{
307326
var filterQuery = QueryFilterBuilder
308327
.CreateFilter(
328+
subscriptionId: null,
329+
resourceGroup: this.ResourceGroupNameEquals,
309330
resourceType: this.ResourceType,
310-
resourceName: null,
331+
resourceName: this.ResourceNameEquals,
311332
tagName: this.TagName,
312333
tagValue: this.TagValue,
313334
filter: this.ODataQuery,
@@ -333,8 +354,10 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInSubscript
333354
{
334355
var filterQuery = QueryFilterBuilder
335356
.CreateFilter(
357+
subscriptionId: null,
358+
resourceGroup: null,
336359
resourceType: this.ResourceType,
337-
resourceName: null,
360+
resourceName: this.ResourceNameEquals,
338361
tagName: this.TagName,
339362
tagValue: this.TagValue,
340363
filter: this.ODataQuery,
@@ -429,7 +452,7 @@ private bool IsResourceTypeCollectionGet()
429452
private bool IsSubscriptionLevelResourceTypeCollectionGet()
430453
{
431454
return this.SubscriptionId.HasValue &&
432-
this.ResourceGroupNameContains == null &&
455+
!this.ResourceGroupNameAvailable() &&
433456
(this.ResourceType != null || this.ExtensionResourceType != null);
434457
}
435458

@@ -439,7 +462,7 @@ private bool IsSubscriptionLevelResourceTypeCollectionGet()
439462
private bool IsResourceGroupLevelResourceTypeCollectionGet()
440463
{
441464
return this.SubscriptionId.HasValue &&
442-
this.ResourceGroupNameContains != null &&
465+
this.ResourceGroupNameAvailable() &&
443466
(this.ResourceType != null || this.ExtensionResourceType != null);
444467
}
445468

@@ -450,7 +473,7 @@ private bool IsResourceGroupLevelResourceTypeCollectionGet()
450473
private bool IsTenantLevelResourceTypeCollectionGet()
451474
{
452475
return this.SubscriptionId == null &&
453-
this.ResourceGroupNameContains == null &&
476+
!this.ResourceGroupNameAvailable() &&
454477
(this.ResourceType != null || this.ExtensionResourceType != null);
455478
}
456479

@@ -460,7 +483,7 @@ private bool IsTenantLevelResourceTypeCollectionGet()
460483
private bool IsSubscriptionLevelQuery()
461484
{
462485
return this.SubscriptionId.HasValue &&
463-
this.ResourceGroupNameContains == null;
486+
!this.ResourceGroupNameAvailable();
464487
}
465488

466489
/// <summary>
@@ -469,11 +492,19 @@ private bool IsSubscriptionLevelQuery()
469492
private bool IsResourceGroupLevelQuery()
470493
{
471494
return this.SubscriptionId.HasValue &&
472-
this.ResourceGroupNameContains != null &&
495+
this.ResourceGroupNameAvailable() &&
473496
(this.TagName != null ||
474497
this.TagValue != null ||
475498
this.ResourceType != null ||
476499
this.ExtensionResourceType != null);
477500
}
501+
502+
/// <summary>
503+
/// Returns true if resource group name is availabe in parameters.
504+
/// </summary>
505+
private bool ResourceGroupNameAvailable()
506+
{
507+
return this.ResourceGroupNameContains != null || this.ResourceGroupNameEquals != null;
508+
}
478509
}
479510
}

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Implementation/Resource/GetAzureResourceCmdlet.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ private async Task<JObject> GetResource()
309309
.ConfigureAwait(continueOnCapturedContext: false);
310310

311311
var odataQuery = QueryFilterBuilder.CreateFilter(
312+
subscriptionId: null,
313+
resourceGroup: null,
312314
resourceType: null,
313315
resourceName: null,
314316
tagName: null,
@@ -339,6 +341,8 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesTypeCollect
339341
extensionResourceName: this.ExtensionResourceName);
340342

341343
var odataQuery = QueryFilterBuilder.CreateFilter(
344+
subscriptionId: null,
345+
resourceGroup: null,
342346
resourceType: null,
343347
resourceName: null,
344348
tagName: null,
@@ -362,7 +366,7 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInTenant()
362366
{
363367
var filterQuery = QueryFilterBuilder
364368
.CreateFilter(
365-
subscriptionIds: null,
369+
subscriptionId: null,
366370
resourceGroup: this.ResourceGroupName,
367371
resourceType: this.ResourceType,
368372
resourceName: this.ResourceName,
@@ -387,6 +391,8 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInResourceG
387391
{
388392
var filterQuery = QueryFilterBuilder
389393
.CreateFilter(
394+
subscriptionId: null,
395+
resourceGroup: null,
390396
resourceType: this.ResourceType,
391397
resourceName: this.ResourceName,
392398
tagName: null,
@@ -412,6 +418,8 @@ private async Task<ResponseWithContinuation<JObject[]>> ListResourcesInSubscript
412418
{
413419
var filterQuery = QueryFilterBuilder
414420
.CreateFilter(
421+
subscriptionId: null,
422+
resourceGroup: null,
415423
resourceType: this.ResourceType,
416424
resourceName: this.ResourceName,
417425
tagName: null,

src/ResourceManager/Resources/Commands.Resources.Test/ScenarioTests/ResourceTests.ps1

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ function Test-FindAResource
354354
New-AzureRmResource -Name $rname2 -Location $rglocation -Tags @{testtag = "testval"} -ResourceGroupName $rgname -ResourceType $resourceType -PropertyObject @{"key" = "value"} -SkuObject @{ Name = "A0" } -ApiVersion $apiversion -Force
355355
$expected = Find-AzureRmResource -ResourceNameContains test -ResourceGroupNameContains $rgname
356356
Assert-AreEqual 2 @($expected).Count
357+
358+
$expected = Find-AzureRmResource -ResourceGroupNameEquals $rgname -ResourceNameEquals $rname
359+
Assert-NotNull $expected
360+
Assert-AreEqual $actual.ResourceId $expected[0].ResourceId
357361
}
358362

359363
<#

0 commit comments

Comments
 (0)