Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Commit 4a7b828

Browse files
f-alizadaFarhad Alizada
andauthored
Feature/extract/openid providers (#771)
* Add openIdConnectProvider resources, extractor, client, dataProcessor * Add openIdConnectProviders to main template, generate secret values for openIdConnectProviders * Add openIdConnectProvider extractor tests * Update supported resources document Co-authored-by: Farhad Alizada <falizada@microsoft.com>
1 parent 4636be8 commit 4a7b828

28 files changed

+730
-39
lines changed

docs/SupportedResources/2021-08-01.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Some of operations could be skipped (not needed for extraction), because they ar
1212
| API Issue Attachment || | |
1313
| API Issue Comment || | |
1414
| API Management Operations | - | | |
15-
| API Management Service || [main](https://github.com/Azure/azure-api-management-devops-resource-kit) | we can load service description |
15+
| API Management Service || [1.0.0-beta.8](https://github.com/Azure/azure-api-management-devops-resource-kit/releases/tag/1.0.0-beta.8) | we can load service description |
1616
| API Management Service Skus | - | | |
1717
| Api Operation || [1.0.0-beta.2](https://github.com/Azure/azure-api-management-devops-resource-kit/releases/tag/1.0.0-beta.2) | |
1818
| Api Operation Policy || [1.0.0-beta.2](https://github.com/Azure/azure-api-management-devops-resource-kit/releases/tag/1.0.0-beta.2) | |
@@ -48,7 +48,7 @@ Some of operations could be skipped (not needed for extraction), because they ar
4848
| Notification Recipient Email || | |
4949
| Notification Recipient User || | |
5050
| Notification Recipient User || | |
51-
| OpenId Connect Provider | | | |
51+
| OpenId Connect Provider | | [main](https://github.com/Azure/azure-api-management-devops-resource-kit) | |
5252
| Operation || | |
5353
| Policy || [1.0.0-beta.2](https://github.com/Azure/azure-api-management-devops-resource-kit/releases/tag/1.0.0-beta.2) | |
5454
| Policy Description | - | | |

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Logger;
2323
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Master;
2424
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues;
25+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders;
2526
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
2627
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis;
2728
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
@@ -66,6 +67,7 @@ public class ExtractorExecutor
6667
readonly IIdentityProviderExtractor identityProviderExtractor;
6768
readonly IApiManagementServiceExtractor apiManagementServiceExtractor;
6869
readonly ISchemaExtractor schemaExtractor;
70+
readonly IOpenIdConnectProviderExtractor openIdConnectProviderExtractor;
6971

7072
public ExtractorExecutor(
7173
ILogger<ExtractorExecutor> logger,
@@ -89,7 +91,8 @@ public ExtractorExecutor(
8991
IGatewayApiExtractor gatewayApiExtractor,
9092
IIdentityProviderExtractor identityProviderExtractor,
9193
IApiManagementServiceExtractor apiManagementServiceExtractor,
92-
ISchemaExtractor schemaExtractor)
94+
ISchemaExtractor schemaExtractor,
95+
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor)
9396
{
9497
this.logger = logger;
9598
this.apisClient = apisClient;
@@ -113,6 +116,7 @@ public ExtractorExecutor(
113116
this.identityProviderExtractor = identityProviderExtractor;
114117
this.apiManagementServiceExtractor = apiManagementServiceExtractor;
115118
this.schemaExtractor = schemaExtractor;
119+
this.openIdConnectProviderExtractor = openIdConnectProviderExtractor;
116120
}
117121

118122
/// <summary>
@@ -141,7 +145,8 @@ public static ExtractorExecutor BuildExtractorExecutor(
141145
IGatewayApiExtractor gatewayApiExtractor = null,
142146
IIdentityProviderExtractor identityProviderExtractor = null,
143147
IApiManagementServiceExtractor apiManagementServiceExtractor = null,
144-
ISchemaExtractor schemaExtractor = null)
148+
ISchemaExtractor schemaExtractor = null,
149+
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor = null)
145150
=> new ExtractorExecutor(
146151
logger,
147152
apisClient,
@@ -164,7 +169,8 @@ public static ExtractorExecutor BuildExtractorExecutor(
164169
gatewayApiExtractor,
165170
identityProviderExtractor,
166171
apiManagementServiceExtractor,
167-
schemaExtractor);
172+
schemaExtractor,
173+
openIdConnectProviderExtractor);
168174

169175
public void SetExtractorParameters(ExtractorParameters extractorParameters)
170176
{
@@ -420,6 +426,7 @@ public async Task<Template> GenerateParametersTemplateAsync(
420426
BackendTemplateResources backendResources,
421427
NamedValuesResources namedValuesResources,
422428
IdentityProviderResources identityProviderResources,
429+
OpenIdConnectProviderResources openIdConnectProviderResources,
423430
string baseFilesGenerationDirectory)
424431
{
425432
this.logger.LogInformation("Started generation of parameters template...");
@@ -431,6 +438,7 @@ public async Task<Template> GenerateParametersTemplateAsync(
431438
backendResources,
432439
namedValuesResources,
433440
identityProviderResources,
441+
openIdConnectProviderResources,
434442
this.extractorParameters);
435443

436444
if (!templateParameters.Parameters.IsNullOrEmpty())
@@ -460,7 +468,8 @@ public async Task<Template<MasterTemplateResources>> GenerateMasterTemplateAsync
460468
TagTemplateResources tagTemplateResources = null,
461469
GroupTemplateResources groupTemplateResources = null,
462470
IdentityProviderResources identityProviderTemplateResources = null,
463-
SchemaTemplateResources schemaTemplateResources = null)
471+
SchemaTemplateResources schemaTemplateResources = null,
472+
OpenIdConnectProviderResources openIdConnectProviderResources = null)
464473
{
465474
if (string.IsNullOrEmpty(this.extractorParameters.LinkedTemplatesBaseUrl))
466475
{
@@ -474,7 +483,7 @@ public async Task<Template<MasterTemplateResources>> GenerateMasterTemplateAsync
474483
this.extractorParameters, apiTemplateResources, policyTemplateResources, apiVersionSetTemplateResources,
475484
productsTemplateResources, productApisTemplateResources, apiTagsTemplateResources, loggersTemplateResources,
476485
backendsTemplateResources, authorizationServersTemplateResources, namedValuesTemplateResources, tagTemplateResources,
477-
groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources);
486+
groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources, openIdConnectProviderResources);
478487

479488
if (masterTemplate?.HasResources() == true)
480489
{
@@ -708,6 +717,29 @@ await FileWriter.SaveAsJsonAsync(
708717
return identityProviderTemplate;
709718
}
710719

720+
/// <summary>
721+
/// Generates openId connect providers template in the desired folder
722+
/// </summary>
723+
/// <param name="baseFilesGenerationDirectory">name of base folder where to save output files</param>
724+
/// <returns>generated openId connect provider template</returns>
725+
public async Task<Template<OpenIdConnectProviderResources>> GenerateOpenIdConnectProviderTemplateAsync(string baseFilesGenerationDirectory)
726+
{
727+
this.logger.LogInformation("Started generation of openId connect provider template...");
728+
729+
var openIdConnectProviderTemplate = await this.openIdConnectProviderExtractor.GenerateOpenIdConnectProvidersTemplateAsync(this.extractorParameters);
730+
731+
if (openIdConnectProviderTemplate?.HasResources() == true)
732+
{
733+
await FileWriter.SaveAsJsonAsync(
734+
openIdConnectProviderTemplate,
735+
directory: baseFilesGenerationDirectory,
736+
fileName: this.extractorParameters.FileNames.OpenIdConnectProviders);
737+
}
738+
739+
this.logger.LogInformation("Finished generation of openId connect providers template...");
740+
return openIdConnectProviderTemplate;
741+
}
742+
711743
/// <summary>
712744
/// Generates gateway-api template in the desired folder
713745
/// </summary>
@@ -961,11 +993,12 @@ async Task GenerateTemplates(
961993
var backendTemplate = await this.GenerateBackendTemplateAsync(singleApiName, apiTemplate.TypedResources.GetAllPolicies(), namedValueTemplate.TypedResources.NamedValues, baseFilesGenerationDirectory);
962994
var groupTemplate = await this.GenerateGroupsTemplateAsync(baseFilesGenerationDirectory);
963995
var identityProviderTemplate = await this.GenerateIdentityProviderTemplateAsync(baseFilesGenerationDirectory);
996+
var openIdConnectProviderTemplate = await this.GenerateOpenIdConnectProviderTemplateAsync(baseFilesGenerationDirectory);
964997
var schemasTempate = await this.GenerateSchemasTemplateAsync(baseFilesGenerationDirectory);
965998
await this.GenerateGatewayTemplateAsync(singleApiName, baseFilesGenerationDirectory);
966999
await this.GenerateGatewayApiTemplateAsync(singleApiName, multipleApiNames, baseFilesGenerationDirectory);
9671000
await this.GenerateApiManagementServiceTemplate(baseFilesGenerationDirectory);
968-
await this.GenerateParametersTemplateAsync(apisToExtract, loggerTemplate.TypedResources, backendTemplate.TypedResources, namedValueTemplate.TypedResources, identityProviderTemplate.TypedResources, baseFilesGenerationDirectory);
1001+
await this.GenerateParametersTemplateAsync(apisToExtract, loggerTemplate.TypedResources, backendTemplate.TypedResources, namedValueTemplate.TypedResources, identityProviderTemplate.TypedResources, openIdConnectProviderTemplate.TypedResources, baseFilesGenerationDirectory);
9691002

9701003
await this.GenerateMasterTemplateAsync(
9711004
baseFilesGenerationDirectory,
@@ -982,7 +1015,8 @@ await this.GenerateMasterTemplateAsync(
9821015
tagTemplateResources: tagTemplate.TypedResources,
9831016
groupTemplateResources: groupTemplate.TypedResources,
9841017
identityProviderTemplateResources: identityProviderTemplate.TypedResources,
985-
schemaTemplateResources: schemasTempate.TypedResources);
1018+
schemaTemplateResources: schemasTempate.TypedResources,
1019+
openIdConnectProviderResources: openIdConnectProviderTemplate.TypedResources);
9861020
}
9871021

9881022

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using System.Threading.Tasks;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders;
9+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
10+
11+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions
12+
{
13+
public interface IOpenIdConnectProvidersClient
14+
{
15+
Task<List<OpenIdConnectProviderResource>> GetAllAsync(ExtractorParameters extractorParameters);
16+
17+
Task<OpenIdConnectProviderSecret> ListOpenIdConnectProviderSecretsAsync(string openIdConnectProviderName, ExtractorParameters extractorParameters);
18+
}
19+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using System.Net.Http;
8+
using System.Threading.Tasks;
9+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions;
10+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Models;
11+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
12+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders;
13+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
14+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction;
15+
16+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.OpenIdConnectProviders
17+
{
18+
public class OpenIdConnectProviderClient : ApiClientBase, IOpenIdConnectProvidersClient
19+
{
20+
const string GetAllOpenIdConnectProvidersProvidersRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/openidConnectProviders?api-version={4}";
21+
const string ListOpenIdConnectProviderSecret = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/openidConnectProviders/{4}/listSecrets?api-version={5}";
22+
23+
readonly IOpenIdConnectProviderProcessor openIdConnectProviderProcessor;
24+
25+
public OpenIdConnectProviderClient(
26+
IHttpClientFactory httpClientFactory,
27+
IOpenIdConnectProviderProcessor openIdConnectProviderProcessor) : base(httpClientFactory)
28+
{
29+
this.openIdConnectProviderProcessor = openIdConnectProviderProcessor;
30+
}
31+
32+
public async Task<List<OpenIdConnectProviderResource>> GetAllAsync(ExtractorParameters extractorParameters)
33+
{
34+
var (azToken, azSubId) = await this.Auth.GetAccessToken();
35+
36+
string requestUrl = string.Format(GetAllOpenIdConnectProvidersProvidersRequest,
37+
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersion);
38+
39+
var openIdConnectProviderResources = await this.GetPagedResponseAsync<OpenIdConnectProviderResource>(azToken, requestUrl);
40+
this.openIdConnectProviderProcessor.ProcessData(openIdConnectProviderResources, extractorParameters);
41+
42+
return openIdConnectProviderResources;
43+
}
44+
45+
public async Task<OpenIdConnectProviderSecret> ListOpenIdConnectProviderSecretsAsync(string openIdConnectProviderName, ExtractorParameters extractorParameters)
46+
{
47+
var (azToken, azSubId) = await this.Auth.GetAccessToken();
48+
49+
string requestUrl = string.Format(ListOpenIdConnectProviderSecret,
50+
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, openIdConnectProviderName, GlobalConstants.ApiVersion);
51+
52+
return await this.GetResponseAsync<OpenIdConnectProviderSecret>(azToken, requestUrl, useCache: false, method: ClientHttpMethod.POST);
53+
}
54+
}
55+
}

src/ArmTemplates/Common/Constants/GlobalConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public static class ParameterNames
4242
public const string ApiOauth2ScopeSettings = "apiOauth2ScopeSettings";
4343
public const string SecretValues = "secretValues";
4444
public const string IdentityProvidersSecretValues = "identityProviders";
45+
public const string OpenIdConnectProvidersSecretValues = "openIdConnectProviders";
4546
}
4647

4748
public static class ParameterPrefix

src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,6 @@ public static class ResourceTypeConstants
3737
public const string IdentityProviders = "Microsoft.ApiManagement/service/identityProviders";
3838
public const string ApiManagementService = "Microsoft.ApiManagement/service";
3939
public const string Schema = "Microsoft.ApiManagement/service/schemas";
40+
public const string OpenIdConnectProvider = "Microsoft.ApiManagement/service/openidConnectProviders";
4041
}
4142
}

src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public static FileNames GenerateFileNames(string baseFileName)
3535
Gateway = $@"{baseFileName}gateways.template.json",
3636
GatewayApi = $@"{baseFileName}gateways-apis.template.json",
3737
IdentityProviders = $@"{baseFileName}identity-providers.template.json",
38+
OpenIdConnectProviders = $@"{baseFileName}openid-connect-providers.template.json",
3839
ApiManagementService = $@"{baseFileName}api-management-service.template.json",
3940
TagApi = $@"{baseFileName}apiTags.template.json",
4041
Schema = $@"{baseFileName}schemas.template.json",

src/ArmTemplates/Common/FileHandlers/FileNames.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public class FileNames
3535

3636
public string IdentityProviders { get; set; }
3737

38+
public string OpenIdConnectProviders { get; set; }
39+
3840
public string ApiManagementService { get; set; }
3941

4042
public string Schema { get; set; }

src/ArmTemplates/Common/Templates/Builders/Abstractions/ITemplateBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,6 @@ public Template<TTemplateResources> Build<TTemplateResources>()
4040

4141
TemplateBuilder AddParameterizedLogResourceIdProperty(ExtractorParameters extractorParameters);
4242

43-
TemplateBuilder AddParametrizedIdentityProvidersSecrets();
43+
TemplateBuilder AddParametrizedSecrets();
4444
}
4545
}

src/ArmTemplates/Common/Templates/Builders/TemplateBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public TemplateBuilder AddParameterizedApiLoggerIdProperty(ExtractorParameters e
145145
return this;
146146
}
147147

148-
public TemplateBuilder AddParametrizedIdentityProvidersSecrets()
148+
public TemplateBuilder AddParametrizedSecrets()
149149
{
150150
var secretValuesProperty = new TemplateParameterProperties()
151151
{
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
7+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders
8+
{
9+
public class OpenIdConnectProviderProperties
10+
{
11+
public string DisplayName { get; set; }
12+
13+
public string Description { get; set; }
14+
15+
public string MetadataEndpoint { get; set; }
16+
17+
public string ClientId { get; set; }
18+
19+
public string ClientSecret { get; set; }
20+
}
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
7+
using Newtonsoft.Json;
8+
9+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders
10+
{
11+
public class OpenIdConnectProviderResource : TemplateResource
12+
{
13+
[JsonIgnore]
14+
public string OriginalName { get; set; }
15+
16+
public OpenIdConnectProviderProperties Properties { get; set; }
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
9+
10+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders
11+
{
12+
public class OpenIdConnectProviderResources: TemplateResourcesBase, ITemplateResources
13+
{
14+
public List<OpenIdConnectProviderResource> OpenIdConnectProviders { get; set; } = new();
15+
16+
public TemplateResource[] BuildTemplateResources()
17+
{
18+
return this.OpenIdConnectProviders.ToArray();
19+
}
20+
21+
public bool HasContent()
22+
{
23+
return !this.OpenIdConnectProviders.IsNullOrEmpty();
24+
}
25+
}
26+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders
7+
{
8+
public class OpenIdConnectProviderSecret
9+
{
10+
public string ClientSecret { get; set; }
11+
}
12+
}

0 commit comments

Comments
 (0)