Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void Query()
{
TestController.NewInstance.RunPowerShellTest(_logger, "Search-AzureRmGraph-Query");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void PagedQuery()
Expand All @@ -50,7 +50,14 @@ public void Subscriptions()
{
TestController.NewInstance.RunPowerShellTest(_logger, "Search-AzureRmGraph-Subscriptions");
}


[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void InlcudeSubscriptionNames()
{
TestController.NewInstance.RunPowerShellTest(_logger, "Search-AzureRmGraph-IncludeSubscriptionNames");
}

[Fact(Skip = "Fails on Linux. Equality assertion fails. Investigation needed.")]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void QueryError()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,26 @@ function Search-AzureRmGraph-Subscriptions
Assert-AreEqual $queryResultMultipleSubs[1].subscriptionId $testSubId2
}

<#
.SYNOPSIS
Run query with subscriptions explicitly passed
#>
function Search-AzureRmGraph-IncludeSubscriptionNames
{
$mockedScopeId = "00000000-0000-0000-0000-000000000000"
$mockedSubscriptionName = "Test Subscription"
$mockedTenantName = "Test Tenant"
$query = "project subscriptionId, tenantId, subscriptionDisplayName, tenantDisplayName"

$queryResult = Search-AzGraph $query -Include "DisplayNames"

Assert-IsInstance $queryResult System.Management.Automation.PSCustomObject
Assert-AreEqual $queryResult.subscriptionId $mockedScopeId
Assert-AreEqual $queryResult.tenantId $mockedScopeId
Assert-AreEqual $queryResult.subscriptionDisplayName $mockedSubscriptionName
Assert-AreEqual $queryResult.tenantDisplayName $mockedTenantName
}

<#
.SYNOPSIS
Run malformed query
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// ----------------------------------------------------------------------------------

using Microsoft.Azure.Commands.Common.Authentication;
using Microsoft.Azure.Internal.Subscriptions;
using Microsoft.Azure.Internal.Subscriptions.Version2018_06_01;
using Microsoft.Azure.Management.ResourceGraph;
using Microsoft.Azure.Test.HttpRecorder;
using Microsoft.Rest.ClientRuntime.Azure.TestFramework;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
{
"Entries": [
{
"RequestUri": "/subscriptions?api-version=2016-06-01",
"EncodedRequestUri": "L3N1YnNjcmlwdGlvbnM/YXBpLXZlcnNpb249MjAxNi0wNi0wMQ==",
"RequestMethod": "GET",
"RequestBody": "",
"RequestHeaders": {
"x-ms-client-request-id": [
"31537677-7032-4654-becb-372f2eeebf21"
],
"accept-language": [
"en-US"
],
"User-Agent": [
"FxVersion/4.7.3163.0",
"OSName/Windows10Enterprise",
"OSVersion/6.3.17134",
"Microsoft.Azure.Internal.Subscriptions.SubscriptionClient/4.1.0"
]
},
"ResponseBody": "{\"value\": [{\"id\": \"/subscriptions/00000000-0000-0000-0000-000000000000\", \"subscriptionId\": \"00000000-0000-0000-0000-000000000000\", \"displayName\": \"Test Subscription\", \"state\": \"Enabled\", \"authorizationSource\": \"RoleBased\"}]}",
"ResponseHeaders": {
"Content-Length": [
"987"
],
"Content-Type": [
"application/json; charset=utf-8"
],
"Expires": [
"-1"
],
"Pragma": [
"no-cache"
],
"x-ms-ratelimit-remaining-tenant-reads": [
"11999"
],
"x-ms-request-id": [
"dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"x-ms-correlation-request-id": [
"dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"x-ms-routing-request-id": [
"WESTUS2:20180926T232942Z:dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"Strict-Transport-Security": [
"max-age=31536000; includeSubDomains"
],
"X-Content-Type-Options": [
"nosniff"
],
"Cache-Control": [
"no-cache"
],
"Date": [
"Wed, 26 Sep 2018 23:29:41 GMT"
]
},
"StatusCode": 200
},
{
"RequestUri": "/tenants?api-version=2019-05-10",
"EncodedRequestUri": "L3N1YnNjcmlwdGlvbnM/YXBpLXZlcnNpb249MjAxNi0wNi0wMQ==",
"RequestMethod": "GET",
"RequestBody": "",
"RequestHeaders": {
"x-ms-client-request-id": [
"31537677-7032-4654-becb-372f2eeebf21"
],
"accept-language": [
"en-US"
],
"User-Agent": [
"FxVersion/4.7.3163.0",
"OSName/Windows10Enterprise",
"OSVersion/6.3.17134",
"Microsoft.Azure.Internal.Subscriptions.SubscriptionClient/4.1.0"
]
},
"ResponseBody": "{\"value\":[{\"id\":\"/tenants/00000000-0000-0000-0000-000000000000\",\"tenantId\":\"00000000-0000-0000-0000-000000000000\",\"countryCode\":\"US\",\"displayName\":\"Test Tenant\",\"domains\":[]}]}",
"ResponseHeaders": {
"Content-Length": [
"987"
],
"Content-Type": [
"application/json; charset=utf-8"
],
"Expires": [
"-1"
],
"Pragma": [
"no-cache"
],
"x-ms-ratelimit-remaining-tenant-reads": [
"11999"
],
"x-ms-request-id": [
"dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"x-ms-correlation-request-id": [
"dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"x-ms-routing-request-id": [
"WESTUS2:20180926T232942Z:dc5b4ea5-4059-44fa-9d49-5c48f46224f4"
],
"Strict-Transport-Security": [
"max-age=31536000; includeSubDomains"
],
"X-Content-Type-Options": [
"nosniff"
],
"Cache-Control": [
"no-cache"
],
"Date": [
"Wed, 26 Sep 2018 23:29:41 GMT"
]
},
"StatusCode": 200
},
{
"RequestUri": "/providers/Microsoft.ResourceGraph/resources?api-version=2019-04-01",
"EncodedRequestUri": "L3Byb3ZpZGVycy9NaWNyb3NvZnQuUmVzb3VyY2VHcmFwaC9yZXNvdXJjZXM/YXBpLXZlcnNpb249MjAxOS0wNC0wMQ==",
"RequestMethod": "POST",
"RequestBody": "",
"RequestHeaders": {
"Content-Type": [
"application/json; charset=utf-8"
],
"Content-Length": [
"200"
],
"x-ms-client-request-id": [
"734561a3-74bf-4762-a941-20d98158229c"
],
"accept-language": [
"en-US"
],
"User-Agent": [
"FxVersion/4.7.3163.0",
"OSName/Windows10Enterprise",
"OSVersion/6.3.17134",
"Microsoft.Azure.Management.ResourceGraph.ResourceGraphClient/0.9.0.0"
]
},
"ResponseBody": "{\"totalRecords\":1,\"count\":1,\"data\":[{\"subscriptionId\":\"00000000-0000-0000-0000-000000000000\",\"tenantId\":\"00000000-0000-0000-0000-000000000000\",\"subscriptionDisplayName\":\"Test Subscription\",\"tenantDisplayName\":\"Test Tenant\"}],\"facets\":[],\"resultTruncated\":\"false\"}",
"ResponseHeaders": {
"Content-Length": [
"179"
],
"Content-Type": [
"application/json; charset=utf-8"
],
"Expires": [
"-1"
],
"Pragma": [
"no-cache"
],
"Strict-Transport-Security": [
"max-age=31536000; includeSubDomains"
],
"x-ms-ratelimit-remaining-tenant-writes": [
"1199"
],
"x-ms-request-id": [
"e475050e-cb2f-4051-945e-0e1aed50d631"
],
"x-ms-correlation-request-id": [
"e475050e-cb2f-4051-945e-0e1aed50d631"
],
"x-ms-routing-request-id": [
"WESTUS2:20180913T223146Z:e475050e-cb2f-4051-945e-0e1aed50d631"
],
"X-Content-Type-Options": [
"nosniff"
],
"Cache-Control": [
"no-cache"
],
"Date": [
"Thu, 13 Sep 2018 22:31:46 GMT"
],
"Server": [
"Microsoft-HTTPAPI/2.0"
]
},
"StatusCode": 200
}
],
"Names": {},
"Variables": {
"SubscriptionId": "00000000-0000-0000-0000-000000000000"
}
}
1 change: 1 addition & 0 deletions src/ResourceGraph/ResourceGraph/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
- Additional information about change #1
-->
## Upcoming Release
* Adding param to extend query result with subscription and tenant names

## Version 0.7.4
* Updated package Microsoft.Azure.Management.ResourceGraph to version 2.0
Expand Down
83 changes: 82 additions & 1 deletion src/ResourceGraph/ResourceGraph/Cmdlets/SearchAzureRmGraph.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@

namespace Microsoft.Azure.Commands.ResourceGraph.Cmdlets
{
using Microsoft.Azure.Commands.Common.Authentication;
using Microsoft.Azure.Commands.Common.Authentication.Abstractions;
using Microsoft.Azure.Commands.ResourceGraph.Utilities;
using Microsoft.Azure.Internal.Subscriptions.Version2018_06_01;
using Microsoft.Azure.Management.ResourceGraph.Models;
using System;
using System.Collections.Generic;
Expand All @@ -29,6 +31,16 @@ namespace Microsoft.Azure.Commands.ResourceGraph.Cmdlets
[Cmdlet(VerbsCommon.Search, ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "Graph"), OutputType(typeof(PSObject))]
public class SearchAzureRmGraph : ResourceGraphBaseCmdlet
{
/// <summary>
/// The synchronize root
/// </summary>
private static readonly object SyncRoot = new object();

/// <summary>
/// Query extension with subscription names
/// </summary>
private static string queryExtensionToIncludeNames = null;

/// <summary>
/// The rows per page
/// </summary>
Expand Down Expand Up @@ -81,6 +93,17 @@ public int Skip
set;
}

/// <summary>
/// Gets or sets if result should be extended with subcription and tenant names.
/// </summary>s
[Parameter(Mandatory = false, HelpMessage = "Indicates if result should be extended with subcription and tenants names")]
[PSDefaultValue(Value = IncludeOptionsEnum.None)]
public IncludeOptionsEnum Include
{
get;
set;
}

/// <summary>
/// Executes the cmdlet.
/// </summary>
Expand Down Expand Up @@ -120,7 +143,11 @@ public override void ExecuteCmdlet()
skipToken: requestSkipToken,
resultFormat: ResultFormat.ObjectArray);

var request = new QueryRequest(subscriptions, this.Query, options: requestOptions);
var queryExtenstion = (this.Include == IncludeOptionsEnum.DisplayNames && this.QueryExtensionInitizalized()) ?
(queryExtensionToIncludeNames + (this.Query.Length != 0 ? "| " : string.Empty)) :
string.Empty;

var request = new QueryRequest(subscriptions, queryExtenstion + this.Query, options: requestOptions);
response = this.ResourceGraphClient.ResourcesWithHttpMessagesAsync(request)
.Result
.Body;
Expand Down Expand Up @@ -187,5 +214,59 @@ private IEnumerable<string> GetSubscriptions()

return SubscriptionCache.GetSubscriptions(this.DefaultContext);
}

/// <summary>
/// Ensure that this.queryExtensionToIncludeNames is initialized
/// </summary>
/// <returns></returns>
private bool QueryExtensionInitizalized()
{
if (queryExtensionToIncludeNames == null)
{
lock (SyncRoot)
{
if (queryExtensionToIncludeNames == null)
{
this.InitializeQueryExtension();
}
}
}

return queryExtensionToIncludeNames != null && queryExtensionToIncludeNames.Length > 0;
}

/// <summary>
/// Initialize this.queryExtensionToIncludeNames
/// </summary>
private void InitializeQueryExtension()
{
queryExtensionToIncludeNames = string.Empty;

// Query extension with subscription names
var subscriptionList = this.DefaultContext.Account.GetSubscriptions(this.DefaultProfile);
if (subscriptionList != null && subscriptionList.Count != 0)
{
queryExtensionToIncludeNames =
$"extend subscriptionDisplayName=case({string.Join(",", subscriptionList.Select(sub => $"subscriptionId=='{sub.Id}', '{sub.Name}'"))},'')";
}

// Query extension with tenant names
using (var subscriptionsClient =
AzureSession.Instance.ClientFactory.CreateArmClient<SubscriptionClient>(
this.DefaultContext, AzureEnvironment.Endpoint.ResourceManager))
{
var tenantList = subscriptionsClient.Tenants.List().ToList();
if (tenantList != null && tenantList.Count != 0)
{
if (queryExtensionToIncludeNames.Length > 0)
{
queryExtensionToIncludeNames += "| ";
}

queryExtensionToIncludeNames +=
$"extend tenantDisplayName=case({string.Join(",", tenantList.Select(tenant => $"tenantId=='{tenant.TenantId}', '{tenant.DisplayName}'"))},'')";
}
}
}
}
}
2 changes: 1 addition & 1 deletion src/ResourceGraph/ResourceGraph/ResourceGraph.csproj
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<PsModuleName>ResourceGraph</PsModuleName>
Expand Down
Loading