From 56040fae6174b0350a76071f60732dc8d268c4dd Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Thu, 16 Apr 2020 09:01:23 +0200 Subject: [PATCH] Provide description of Azure landscape --- .../Configuration/AzureLandscape.cs | 10 ++++ .../Configuration/ResourceDeclaration.cs | 1 + .../Graph/AzureResourceGraph.cs | 18 +++++-- .../Startup.cs | 1 - src/docker-compose.yml | 2 +- src/resource-config.yaml | 27 ---------- tests/discovery-config.yaml | 54 ++++++++++++++++++- 7 files changed, 79 insertions(+), 34 deletions(-) create mode 100644 src/Promitor.ResourceDiscovery.Agent/Configuration/AzureLandscape.cs delete mode 100644 src/resource-config.yaml diff --git a/src/Promitor.ResourceDiscovery.Agent/Configuration/AzureLandscape.cs b/src/Promitor.ResourceDiscovery.Agent/Configuration/AzureLandscape.cs new file mode 100644 index 0000000..795fab8 --- /dev/null +++ b/src/Promitor.ResourceDiscovery.Agent/Configuration/AzureLandscape.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Promitor.ResourceDiscovery.Agent.Configuration +{ + public class AzureLandscape + { + public string TenantId { get; set; } + public List Subscriptions { get; set; } + } +} diff --git a/src/Promitor.ResourceDiscovery.Agent/Configuration/ResourceDeclaration.cs b/src/Promitor.ResourceDiscovery.Agent/Configuration/ResourceDeclaration.cs index bb4c49f..e3badcd 100644 --- a/src/Promitor.ResourceDiscovery.Agent/Configuration/ResourceDeclaration.cs +++ b/src/Promitor.ResourceDiscovery.Agent/Configuration/ResourceDeclaration.cs @@ -4,6 +4,7 @@ namespace Promitor.ResourceDiscovery.Agent.Configuration { public class ResourceDeclaration { + public AzureLandscape AzureLandscape { get; set; } public List ResourceCollections { get; set; } } } \ No newline at end of file diff --git a/src/Promitor.ResourceDiscovery.Agent/Graph/AzureResourceGraph.cs b/src/Promitor.ResourceDiscovery.Agent/Graph/AzureResourceGraph.cs index b735caa..9ea7fdd 100644 --- a/src/Promitor.ResourceDiscovery.Agent/Graph/AzureResourceGraph.cs +++ b/src/Promitor.ResourceDiscovery.Agent/Graph/AzureResourceGraph.cs @@ -4,6 +4,7 @@ using Microsoft.Azure.Management.ResourceGraph; using Microsoft.Azure.Management.ResourceGraph.Models; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Options; using Newtonsoft.Json.Linq; using Promitor.ResourceDiscovery.Agent.Configuration; using Promitor.ResourceDiscovery.Agent.Model; @@ -12,11 +13,21 @@ namespace Promitor.ResourceDiscovery.Agent.Graph { public class AzureResourceGraph { + private readonly IOptionsMonitor _resourceDeclarationMonitor; private readonly IConfiguration _configuration; private ResourceGraphClient _graphClient; - public AzureResourceGraph(IConfiguration configuration) + public string TenantId => _resourceDeclarationMonitor.CurrentValue?.AzureLandscape?.TenantId; + public List Subscriptions => _resourceDeclarationMonitor.CurrentValue?.AzureLandscape?.Subscriptions; + + public AzureResourceGraph(IOptionsMonitor resourceDeclarationMonitor, IConfiguration configuration) { + Guard.NotNull(resourceDeclarationMonitor, nameof(resourceDeclarationMonitor)); + Guard.NotNull(resourceDeclarationMonitor.CurrentValue, nameof(resourceDeclarationMonitor.CurrentValue)); + Guard.NotNull(resourceDeclarationMonitor.CurrentValue.AzureLandscape, nameof(resourceDeclarationMonitor.CurrentValue.AzureLandscape)); + Guard.NotNull(configuration, nameof(configuration)); + + _resourceDeclarationMonitor = resourceDeclarationMonitor; _configuration = configuration; } @@ -39,7 +50,7 @@ public async Task> QueryAsync(string resourceType, ResourceCriter .LimitTo(5) .Build(); - var queryRequest = new QueryRequest(criteria.Subscriptions, query); + var queryRequest = new QueryRequest(Subscriptions, query); var response = await graphClient.ResourcesAsync(queryRequest); var result = response.Data as JObject; @@ -66,11 +77,10 @@ private async Task GetOrCreateClient() private async Task CreateClientAsync() { - var tenantId = "c8819874-9e56-4e3f-b1a8-1c0325138f27"; var appId = _configuration["DISCOVERY_APPID"]; var appSecret = _configuration["DISCOVERY_APPSECRET"]; - var credentials = await Authentication.GetServiceClientCredentialsAsync("https://management.core.windows.net", appId, appSecret, tenantId); + var credentials = await Authentication.GetServiceClientCredentialsAsync("https://management.core.windows.net", appId, appSecret, TenantId); return new ResourceGraphClient(credentials); } } diff --git a/src/Promitor.ResourceDiscovery.Agent/Startup.cs b/src/Promitor.ResourceDiscovery.Agent/Startup.cs index da5d2e7..8a67642 100644 --- a/src/Promitor.ResourceDiscovery.Agent/Startup.cs +++ b/src/Promitor.ResourceDiscovery.Agent/Startup.cs @@ -51,7 +51,6 @@ public void ConfigureServices(IServiceCollection services) RestrictToJsonContentType(options); AddEnumAsStringRepresentation(options); - }); services.AddHealthChecks(); diff --git a/src/docker-compose.yml b/src/docker-compose.yml index 1e15b86..fa30694 100644 --- a/src/docker-compose.yml +++ b/src/docker-compose.yml @@ -7,4 +7,4 @@ services: context: . dockerfile: Promitor.ResourceDiscovery.Agent/Dockerfile volumes: - - "./resource-config.yaml:/config/resource-declaration.yaml" + - "./../tests/discovery-config.yaml:/config/resource-declaration.yaml" diff --git a/src/resource-config.yaml b/src/resource-config.yaml deleted file mode 100644 index c5f7ee9..0000000 --- a/src/resource-config.yaml +++ /dev/null @@ -1,27 +0,0 @@ -resourceCollections: -- name: service-bus - type: microsoft.servicebus/namespaces - criteria: - subscriptions: - - 0329dd2a-59dc-4493-aa54-cb01cb027dc2 -- name: app-services-north-europe - type: microsoft.web/sites - criteria: - regions: - - northeurope -- name: app-services - type: microsoft.web/sites - criteria: - regions: - - northeurope - - westeurope -- criteria: - resourceGroups: - - promitor-sources - name: app-services-filtered - type: microsoft.web/sites -- criteria: - tags: - app: promitor-sample - name: logic-apps - type: microsoft.logic/workflows \ No newline at end of file diff --git a/tests/discovery-config.yaml b/tests/discovery-config.yaml index c5f7ee9..1b8c370 100644 --- a/tests/discovery-config.yaml +++ b/tests/discovery-config.yaml @@ -1,3 +1,8 @@ +azureLandscape: + tenantId: c8819874-9e56-4e3f-b1a8-1c0325138f27 + subscriptions: + - 0329dd2a-59dc-4493-aa54-cb01cb027dc2 + - 0f9d7fea-99e8-4768-8672-06a28514f77e resourceCollections: - name: service-bus type: microsoft.servicebus/namespaces @@ -24,4 +29,51 @@ resourceCollections: tags: app: promitor-sample name: logic-apps - type: microsoft.logic/workflows \ No newline at end of file + type: microsoft.logic/workflows +# The following are used for integration testing: +- name: no-filter + type: microsoft.logic/workflows +- name: one-resource-group-scenario + type: microsoft.logic/workflows + criteria: + resourceGroups: + - promitor-testing-resource-discovery-eu +- name: two-resource-group-scenario + type: microsoft.logic/workflows + criteria: + resourceGroups: + - promitor-testing-resource-discovery-eu + - promitor-testing-resource-discovery-us +- name: one-subscriptions-scenario + type: microsoft.logic/workflows + criteria: + subscriptions: + - 0329dd2a-59dc-4493-aa54-cb01cb027dc2 +- name: two-subscriptions-scenario + type: microsoft.logic/workflows + criteria: + subscriptions: + - 0329dd2a-59dc-4493-aa54-cb01cb027dc2 + - 0f9d7fea-99e8-4768-8672-06a28514f77e +- name: one-tag-scenario + type: microsoft.logic/workflows + criteria: + tags: + app: promitor-resource-discovery-tests +- name: two-tag-scenario + type: microsoft.logic/workflows + criteria: + tags: + app: promitor-resource-discovery-tests + region: europe +- name: one-region-scenario + type: microsoft.logic/workflows + criteria: + regions: + - northeurope +- name: two-region-scenario + type: microsoft.logic/workflows + criteria: + regions: + - northeurope + - westeurope \ No newline at end of file