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

Commit a0c2f81

Browse files
alanrrobertsRupengLiu
authored andcommitted
Sastoken (#322)
* initial commit after adding Sas Token support I need support for SAS Tokens when using ARM in Azure DevOps to connect to Azure Storage using a microsoft hosted agent. This commit adds support for two new parameters to support this. linkedTemplatesSasToken (works with linkedTemplatesBaseUrl urls) policyXMLSasToken (works with policyXMLBaseUrl urls) * fixing error introduced into APIExtractor.cs
1 parent a2fd25e commit a0c2f81

13 files changed

+172
-65
lines changed

src/APIM_ARMTemplate/apimtemplate/Creator/Models/ExtractorConfiguration.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ public class ExtractorConfig
99
public string apiName { get; set; }
1010
public string mutipleAPIs { get; set; }
1111
public string linkedTemplatesBaseUrl { get; set; }
12+
public string linkedTemplatesSasToken { get; set; }
1213
public string linkedTemplatesUrlQueryString { get; set; }
1314
public string policyXMLBaseUrl { get; set; }
15+
public string policyXMLSasToken { get; set; }
1416
public string splitAPIs { get; set; }
1517
public string apiVersionSetName { get; set; }
1618
public string includeAllRevisions { get; set; }
@@ -23,8 +25,10 @@ public class Extractor
2325
public string resourceGroup { get; private set; }
2426
public string fileFolder { get; private set; }
2527
public string linkedTemplatesBaseUrl { get; private set; }
28+
public string linkedTemplatesSasToken { get; private set; }
2629
public string linkedTemplatesUrlQueryString { get; private set; }
2730
public string policyXMLBaseUrl { get; private set; }
31+
public string policyXMLSasToken { get; private set; }
2832
public string apiVersionSetName { get; private set; }
2933
public bool includeAllRevisions { get; private set; }
3034

@@ -35,8 +39,10 @@ public Extractor(ExtractorConfig exc, string dirName)
3539
this.resourceGroup = exc.resourceGroup;
3640
this.fileFolder = dirName;
3741
this.linkedTemplatesBaseUrl = exc.linkedTemplatesBaseUrl;
42+
this.linkedTemplatesSasToken = exc.linkedTemplatesSasToken;
3843
this.linkedTemplatesUrlQueryString = exc.linkedTemplatesUrlQueryString;
3944
this.policyXMLBaseUrl = exc.policyXMLBaseUrl;
45+
this.policyXMLSasToken = exc.policyXMLSasToken;
4046
this.apiVersionSetName = exc.apiVersionSetName;
4147
this.includeAllRevisions = checkIncludeRevision(exc.includeAllRevisions);
4248
}
@@ -48,8 +54,10 @@ public Extractor(ExtractorConfig exc)
4854
this.resourceGroup = exc.resourceGroup;
4955
this.fileFolder = exc.fileFolder;
5056
this.linkedTemplatesBaseUrl = exc.linkedTemplatesBaseUrl;
57+
this.linkedTemplatesSasToken = exc.linkedTemplatesSasToken;
5158
this.linkedTemplatesUrlQueryString = exc.linkedTemplatesUrlQueryString;
5259
this.policyXMLBaseUrl = exc.policyXMLBaseUrl;
60+
this.policyXMLSasToken = exc.policyXMLSasToken;
5361
this.apiVersionSetName = exc.apiVersionSetName;
5462
this.includeAllRevisions = checkIncludeRevision(exc.includeAllRevisions);
5563
}

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/APIExtractor.cs

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public async Task<string> GetAPISchemaDetailsAsync(string ApiManagementName, str
187187
return await CallApiManagementAsync(azToken, requestUrl);
188188
}
189189

190-
public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string apiName, string apimname, string resourceGroup, string fileFolder, string policyXMLBaseUrl)
190+
public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string apiName, string apimname, string resourceGroup, string fileFolder, string policyXMLBaseUrl, string policyXMLSasToken)
191191
{
192192
List<TemplateResource> templateResources = new List<TemplateResource>();
193193
string apiDetails = await GetAPIDetailsAsync(apimname, resourceGroup, apiName);
@@ -286,7 +286,14 @@ public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string
286286
this.fileWriter.CreateFolderIfNotExists(policyFolder);
287287
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, operationPolicyFileName));
288288
operationPolicyResource.properties.format = "rawxml-link";
289-
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]";
289+
if (policyXMLSasToken != null)
290+
{
291+
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}', parameters('PolicyXMLSasToken'))]";
292+
}
293+
else
294+
{
295+
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]";
296+
}
290297
}
291298

292299
templateResources.Add(operationPolicyResource);
@@ -340,7 +347,14 @@ public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string
340347
this.fileWriter.CreateFolderIfNotExists(policyFolder);
341348
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, apiPolicyFileName));
342349
apiPoliciesResource.properties.format = "rawxml-link";
343-
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]";
350+
if (policyXMLSasToken != null)
351+
{
352+
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}', parameters('PolicyXMLSasToken'))]";
353+
}
354+
else
355+
{
356+
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]";
357+
}
344358
}
345359
templateResources.Add(apiPoliciesResource);
346360
}
@@ -432,11 +446,11 @@ public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string
432446
public async Task<Template> GenerateAPIRevisionTemplateAsync(string currentRevision, List<string> revList, string apiName, Extractor exc)
433447
{
434448
// generate apiTemplate
435-
Template armTemplate = GenerateEmptyTemplateWithParameters(exc.policyXMLBaseUrl);
449+
Template armTemplate = GenerateEmptyTemplateWithParameters(exc.policyXMLBaseUrl, exc.policyXMLSasToken);
436450
List<TemplateResource> templateResources = new List<TemplateResource>();
437451
Console.WriteLine("{0} APIs found ...", revList.Count().ToString());
438452

439-
List<TemplateResource> apiResources = await GenerateSingleAPIResourceAsync(apiName, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl);
453+
List<TemplateResource> apiResources = await GenerateSingleAPIResourceAsync(apiName, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl, exc.policyXMLSasToken);
440454
templateResources.AddRange(apiResources);
441455

442456
foreach (string curApi in revList)
@@ -445,14 +459,14 @@ public async Task<Template> GenerateAPIRevisionTemplateAsync(string currentRevis
445459
if (curApi.Equals(currentRevision))
446460
{
447461
// add current API revision resource to template
448-
apiResources = await GenerateCurrentRevisionAPIResourceAsync(curApi, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl);
462+
apiResources = await GenerateCurrentRevisionAPIResourceAsync(curApi, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl, exc.policyXMLSasToken);
449463
templateResources.AddRange(apiResources);
450464
}
451465
else
452466
{
453467
// add other API revision resources to template
454-
apiResources = await GenerateSingleAPIResourceAsync(curApi, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl);
455-
468+
apiResources = await GenerateSingleAPIResourceAsync(curApi, exc.sourceApimName, exc.resourceGroup, exc.fileFolder, exc.policyXMLBaseUrl, exc.policyXMLSasToken);
469+
456470
// make current API a dependency to other revisions, in case destination apim doesn't have the this API
457471
TemplateResource apiResource = apiResources.FirstOrDefault(resource => resource.type == ResourceTypeConstants.API) as TemplateResource;
458472
List<TemplateResource> newResourcesList = ExtractorUtils.removeResourceType(ResourceTypeConstants.API, apiResources);
@@ -470,7 +484,7 @@ public async Task<Template> GenerateAPIRevisionTemplateAsync(string currentRevis
470484
}
471485

472486
// this function will get the current revision of this api and will remove "isCurrent" paramter
473-
public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsync(string apiName, string apimname, string resourceGroup, string fileFolder, string policyXMLBaseUrl)
487+
public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsync(string apiName, string apimname, string resourceGroup, string fileFolder, string policyXMLBaseUrl, string policyXMLSasToken)
474488
{
475489
List<TemplateResource> templateResources = new List<TemplateResource>();
476490
string apiDetails = await GetAPIDetailsAsync(apimname, resourceGroup, apiName);
@@ -568,7 +582,14 @@ public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsyn
568582
this.fileWriter.CreateFolderIfNotExists(policyFolder);
569583
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, operationPolicyFileName));
570584
operationPolicyResource.properties.format = "rawxml-link";
571-
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]";
585+
if (policyXMLSasToken != null)
586+
{
587+
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}', parameters('PolicyXMLSasToken'))]";
588+
}
589+
else
590+
{
591+
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]";
592+
}
572593
}
573594

574595
templateResources.Add(operationPolicyResource);
@@ -622,7 +643,14 @@ public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsyn
622643
this.fileWriter.CreateFolderIfNotExists(policyFolder);
623644
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, apiPolicyFileName));
624645
apiPoliciesResource.properties.format = "rawxml-link";
625-
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]";
646+
if (policyXMLSasToken != null)
647+
{
648+
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}', parameters('PolicyXMLSasToken'))]";
649+
}
650+
else
651+
{
652+
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]";
653+
}
626654
}
627655
templateResources.Add(apiPoliciesResource);
628656
}
@@ -710,10 +738,10 @@ public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsyn
710738
return templateResources;
711739
}
712740

713-
public async Task<Template> GenerateAPIsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<string> multipleApiNames, string policyXMLBaseUrl, string fileFolder)
741+
public async Task<Template> GenerateAPIsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<string> multipleApiNames, string policyXMLBaseUrl, string policyXMLSasToken, string fileFolder)
714742
{
715743
// initialize arm template
716-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
744+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
717745
List<TemplateResource> templateResources = new List<TemplateResource>();
718746

719747
// when extract single API
@@ -724,7 +752,7 @@ public async Task<Template> GenerateAPIsARMTemplateAsync(string apimname, string
724752
{
725753
string apiDetails = await GetAPIDetailsAsync(apimname, resourceGroup, singleApiName);
726754
Console.WriteLine("{0} API found ...", singleApiName);
727-
templateResources.AddRange(await GenerateSingleAPIResourceAsync(singleApiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl));
755+
templateResources.AddRange(await GenerateSingleAPIResourceAsync(singleApiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl, policyXMLSasToken));
728756
}
729757
catch (Exception)
730758
{
@@ -737,7 +765,7 @@ public async Task<Template> GenerateAPIsARMTemplateAsync(string apimname, string
737765
Console.WriteLine("{0} APIs found ...", multipleApiNames.Count().ToString());
738766
foreach (string apiName in multipleApiNames)
739767
{
740-
templateResources.AddRange(await GenerateSingleAPIResourceAsync(apiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl));
768+
templateResources.AddRange(await GenerateSingleAPIResourceAsync(apiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl, policyXMLSasToken));
741769
}
742770
}
743771
// when extract all APIs and generate one master template
@@ -749,7 +777,7 @@ public async Task<Template> GenerateAPIsARMTemplateAsync(string apimname, string
749777
foreach (JToken oApi in oApis)
750778
{
751779
string apiName = ((JValue)oApi["name"]).Value.ToString();
752-
templateResources.AddRange(await GenerateSingleAPIResourceAsync(apiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl));
780+
templateResources.AddRange(await GenerateSingleAPIResourceAsync(apiName, apimname, resourceGroup, fileFolder, policyXMLBaseUrl, policyXMLSasToken));
753781
}
754782
}
755783
armTemplate.resources = templateResources.ToArray();

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/APIVersionSetExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetAPIVersionSetDetailsAsync(string ApiManagementName,
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateAPIVersionSetsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl)
33+
public async Task<Template> GenerateAPIVersionSetsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting API version sets from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
37+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
3838

3939
// isolate apis in the case of a single api extraction
4040
var apiResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.API);

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/AuthorizationServerExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetAuthorizationServerDetailsAsync(string ApiManagemen
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateAuthorizationServersARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl)
33+
public async Task<Template> GenerateAuthorizationServersARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting authorization servers from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
37+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
3838

3939
List<TemplateResource> templateResources = new List<TemplateResource>();
4040

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/BackendExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetBackendDetailsAsync(string ApiManagementName, strin
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, string policyXMLBaseUrl)
33+
public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, string policyXMLBaseUrl, string policyXMLSasToken)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting backends from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
37+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
3838

3939
List<TemplateResource> templateResources = new List<TemplateResource>();
4040

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/EntityExtractor.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,18 @@ public Template GenerateEmptyTemplate()
3535
return armTemplate;
3636
}
3737

38-
public Template GenerateEmptyTemplateWithParameters(string policyXMLBaseUrl)
38+
public Template GenerateEmptyTemplateWithParameters(string policyXMLBaseUrl, string policyXMLSasToken)
3939
{
4040
Template armTemplate = GenerateEmptyTemplate();
4141
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } };
42+
if (policyXMLBaseUrl != null && policyXMLSasToken != null)
43+
{
44+
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
45+
{
46+
type = "string"
47+
};
48+
armTemplate.parameters.Add("PolicyXMLSasToken", policyTemplateSasTokenParameterProperties);
49+
}
4250
if (policyXMLBaseUrl != null)
4351
{
4452
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/LoggerExtractor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetLoggerDetailsAsync(string ApiManagementName, string
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateLoggerTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl)
33+
public async Task<Template> GenerateLoggerTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting loggers from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
37+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
3838

3939
// isolate product api associations in the case of a single api extraction
4040
var diagnosticResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.APIDiagnostic);

0 commit comments

Comments
 (0)