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

Commit f008b26

Browse files
committed
enable creation of product policies
1 parent 306791c commit f008b26

File tree

9 files changed

+76
-8
lines changed

9 files changed

+76
-8
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Create.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public CreateCommand()
4040
// initialize template creator classes
4141
APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator();
4242
LoggerTemplateCreator loggerTemplateCreator = new LoggerTemplateCreator();
43-
ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator();
4443
BackendTemplateCreator backendTemplateCreator = new BackendTemplateCreator();
4544
AuthorizationServerTemplateCreator authorizationServerTemplateCreator = new AuthorizationServerTemplateCreator();
4645
ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator();
4746
PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader);
4847
DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator();
48+
ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator(policyTemplateCreator);
4949
APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, policyTemplateCreator, productAPITemplateCreator, diagnosticTemplateCreator);
5050
MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator();
5151

src/APIM_ARMTemplate/apimtemplate/Common/Constants/ResourceTypeConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ internal static class ResourceTypeConstants
1515
public const string Logger = "Microsoft.ApiManagement/service/loggers";
1616
public const string ProductAPI = "Microsoft.ApiManagement/service/products/apis";
1717
public const string Product = "Microsoft.ApiManagement/service/products";
18+
public const string ProductPolicy = "Microsoft.ApiManagement/service/products/policies";
1819
public const string Property = "Microsoft.ApiManagement/service/properties";
1920
}
2021
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<policies>
2+
<inbound>
3+
<set-backend-service backend-id="myBackend" />
4+
<rate-limit-by-key calls="3" renewal-period="15" counter-key="@(context.Subscription.Id)" />
5+
<base />
6+
</inbound>
7+
<backend>
8+
<base />
9+
</backend>
10+
<outbound>
11+
<base />
12+
</outbound>
13+
<on-error>
14+
<base />
15+
</on-error>
16+
</policies>

src/APIM_ARMTemplate/apimtemplate/Creator/ExampleFiles/YAMLConfigs/valid.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ products:
7272
approvalRequired: true
7373
subscriptionsLimit: 1
7474
state: notPublished
75+
policy: C:\Users\myUsername\Projects\azure-api-management-devops-example\src\APIM_ARMTemplate\apimtemplate\Creator\ExampleFile\XMLPolicies\productSetBodyBasic.xml # Optional, can be url or local file
7576
loggers:
7677
- name: myAppInsights
7778
loggerType: applicationInsights

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class CreatorConfig
1414
public string apimServiceName { get; set; }
1515
public List<APIVersionSetConfig> apiVersionSets { get; set; }
1616
public List<APIConfig> apis { get; set; }
17-
public List<ProductsTemplateProperties> products { get; set; }
17+
public List<ProductConfig> products { get; set; }
1818
public List<LoggerConfig> loggers { get; set; }
1919
public List<AuthorizationServerTemplateProperties> authorizationServers { get; set; }
2020
public List<BackendTemplateProperties> backends { get; set; }
@@ -72,5 +72,10 @@ public class LoggerConfig : LoggerTemplateProperties
7272
public string name { get; set; }
7373
}
7474

75-
75+
public class ProductConfig : ProductsTemplateProperties
76+
{
77+
// policy file location (local or url)
78+
public string policy { get; set; }
79+
}
80+
7681
}

src/APIM_ARMTemplate/apimtemplate/Creator/TemplateCreators/PolicyTemplateCreator.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,27 @@ public PolicyTemplateResource CreateAPIPolicyTemplateResource(APIConfig api, str
3535
return policyTemplateResource;
3636
}
3737

38+
public PolicyTemplateResource CreateProductPolicyTemplateResource(ProductConfig product, string[] dependsOn)
39+
{
40+
Uri uriResult;
41+
bool isUrl = Uri.TryCreate(product.policy, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
42+
// create policy resource with properties
43+
PolicyTemplateResource policyTemplateResource = new PolicyTemplateResource()
44+
{
45+
name = $"[concat(parameters('ApimServiceName'), '/{product.displayName}/policy')]",
46+
type = ResourceTypeConstants.ProductPolicy,
47+
apiVersion = GlobalConstants.APIVersion,
48+
properties = new PolicyTemplateProperties()
49+
{
50+
// if policy is a url inline the url, if it is a local file inline the file contents
51+
format = isUrl ? "rawxml-link" : "rawxml",
52+
value = isUrl ? product.policy : this.fileReader.RetrieveLocalFileContents(product.policy)
53+
},
54+
dependsOn = dependsOn
55+
};
56+
return policyTemplateResource;
57+
}
58+
3859
public PolicyTemplateResource CreateOperationPolicyTemplateResource(KeyValuePair<string, OperationsConfig> policyPair, string apiName, string[] dependsOn)
3960
{
4061
Uri uriResult;

src/APIM_ARMTemplate/apimtemplate/Creator/TemplateCreators/ProductTemplateCreator.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create
55
{
66
public class ProductTemplateCreator : TemplateCreator
77
{
8+
private PolicyTemplateCreator policyTemplateCreator;
9+
10+
public ProductTemplateCreator(PolicyTemplateCreator policyTemplateCreator)
11+
{
12+
this.policyTemplateCreator = policyTemplateCreator;
13+
}
14+
815
public Template CreateProductTemplate(CreatorConfig creatorConfig)
916
{
1017
// create empty template
@@ -17,18 +24,35 @@ public Template CreateProductTemplate(CreatorConfig creatorConfig)
1724
};
1825

1926
List<TemplateResource> resources = new List<TemplateResource>();
20-
foreach (ProductsTemplateProperties productTemplateProperties in creatorConfig.products)
27+
foreach (ProductConfig product in creatorConfig.products)
2128
{
2229
// create product resource with properties
2330
ProductsTemplateResource productsTemplateResource = new ProductsTemplateResource()
2431
{
25-
name = $"[concat(parameters('ApimServiceName'), '/{productTemplateProperties.displayName}')]",
32+
name = $"[concat(parameters('ApimServiceName'), '/{product.displayName}')]",
2633
type = ResourceTypeConstants.Product,
2734
apiVersion = GlobalConstants.APIVersion,
28-
properties = productTemplateProperties,
35+
properties = new ProductsTemplateProperties()
36+
{
37+
description = product.description,
38+
terms = product.terms,
39+
subscriptionRequired = product.subscriptionRequired,
40+
approvalRequired = product.approvalRequired,
41+
subscriptionsLimit = product.subscriptionsLimit,
42+
state = product.state,
43+
displayName = product.displayName
44+
},
2945
dependsOn = new string[] { }
3046
};
3147
resources.Add(productsTemplateResource);
48+
49+
// create product policy resource that depends on the product, if provided
50+
if (product.policy != null)
51+
{
52+
string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('ApimServiceName'), '{product.displayName}')]" };
53+
PolicyTemplateResource productPolicy = this.policyTemplateCreator.CreateProductPolicyTemplateResource(product, dependsOn);
54+
resources.Add(productPolicy);
55+
}
3256
}
3357

3458
productTemplate.resources = resources.ToArray();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
3939
List<TemplateResource> templateResources = new List<TemplateResource>();
4040

4141
// isolate api and operation policy resources in the case of a single api extraction, as they may reference backends
42-
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy));
42+
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy || resource.type == ResourceTypeConstants.ProductPolicy));
4343
var namedValueResources = propertyResources.Where(resource => (resource.type == ResourceTypeConstants.Property));
4444

4545
// pull all backends for service

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public async Task<Template> GenerateLoggerTemplate(string apimname, string resou
3838

3939
// isolate product api associations in the case of a single api extraction
4040
var diagnosticResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.APIDiagnostic);
41-
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy));
41+
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy || resource.type == ResourceTypeConstants.ProductPolicy));
4242

4343
List<TemplateResource> templateResources = new List<TemplateResource>();
4444

0 commit comments

Comments
 (0)