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

Commit 6e0f6f1

Browse files
committed
Started implement Operations.
1 parent 32cbb3a commit 6e0f6f1

File tree

14 files changed

+568
-122
lines changed

14 files changed

+568
-122
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 109 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Newtonsoft.Json;
44
using System.Collections.Generic;
55
using System.IO;
6+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
7+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract.Operation;
68

79
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
810
{
@@ -27,10 +29,11 @@ public ExtractCommand()
2729
string apimname = apiManagementName.Values[0].ToString();
2830
Api api = new Api();
2931
string apis = api.GetAPIs(apimname, resourceGroup).Result;
30-
32+
3133
ExtractedAPI extractedAPI = JsonConvert.DeserializeObject<ExtractedAPI>(apis);
3234
Console.WriteLine("{0} API's found!", extractedAPI.value.Count.ToString());
33-
35+
FileReader fileReader = new FileReader();
36+
3437
for (int i = 0; i < extractedAPI.value.Count; i++)
3538
{
3639
APIConfig apiConfig = new APIConfig();
@@ -42,13 +45,27 @@ public ExtractCommand()
4245
apimServiceName = apimname,
4346
api = apiConfig
4447
};
45-
creatorConfig.api.openApiSpec = null;
48+
creatorConfig.api.openApiSpec = "2.0";
4649
creatorConfig.api.name = extractedAPI.value[i].name;
4750
creatorConfig.api.apiVersion = extractedAPI.value[i].properties.apiVersion;
4851
creatorConfig.api.apiVersionDescription = extractedAPI.value[i].properties.apiVersionDescription;
49-
creatorConfig.api.suffix = extractedAPI.value[i].properties.path;
52+
creatorConfig.api.suffix = extractedAPI.value[i].properties.path;
5053
creatorConfig.linked = false;
5154

55+
Dictionary<string, OperationsConfig> operationsDic = new Dictionary<string, OperationsConfig>();
56+
//operation list
57+
string operations = api.GetAPIOperations(apimname, resourceGroup, creatorConfig.api.name).Result;
58+
var o = JsonConvert.DeserializeObject<Operation.Operation>(operations);
59+
OperationsConfig op = new OperationsConfig();
60+
foreach (var item in o.value)
61+
{
62+
string pol = api.GetOperationPolicy(apimname, resourceGroup, creatorConfig.api.name, item.name).Result;
63+
var p = JsonConvert.DeserializeObject<Operation.Operation>(pol);
64+
operationsDic.Add(item.name, p.value[0].properties.policyContent);
65+
creatorConfig.api.operations = operationsDic;
66+
67+
}
68+
5269
if (extractedAPI.value[i].properties.apiVersionSetId != null)
5370
{
5471
string APIVersionSetFull = extractedAPI.value[i].properties.apiVersionSetId;
@@ -59,34 +76,104 @@ public ExtractCommand()
5976
creatorConfig.apiVersionSet = apiv.properties;
6077
}
6178

79+
FileWriter fileWriter = new FileWriter();
6280
TemplateCreator templateCreator = new TemplateCreator();
81+
6382
APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(templateCreator);
6483
ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator();
65-
//PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader);
66-
APITemplateCreator apiTemplateCreator = new APITemplateCreator(templateCreator);
67-
//MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(templateCreator);
84+
PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator();
85+
APITemplateCreatorEx apiTemplateCreator = new APITemplateCreatorEx(templateCreator, policyTemplateCreator, productAPITemplateCreator);
86+
MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(templateCreator);
6887

6988
// create templates from provided configuration
70-
Template apiVersionSetTemplate = creatorConfig.apiVersionSet != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null;
71-
Template apiTemplate = await apiTemplateCreator.CreateAPITemplateAsync(creatorConfig);
72-
73-
FileWriter fileWriter = new FileWriter();
7489
CreatorFileNames creatorFileNames = fileWriter.GenerateCreatorFileNames();
75-
76-
if (extractedAPI.value[i].properties.apiVersionSetId != null)
90+
Template apiVersionSetTemplate = creatorConfig.apiVersionSet != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null;
91+
Template initialAPITemplate = await apiTemplateCreator.CreateInitialAPITemplateAsync(creatorConfig);
92+
Template subsequentAPITemplate = await apiTemplateCreator.CreateSubsequentAPITemplateAsync(creatorConfig);
93+
if (creatorConfig.linked == true)
7794
{
78-
Console.WriteLine("Writing API Version Set File for {0} API ...", extractedAPI.value[i].name);
79-
fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(creatorConfig.outputLocation, extractedAPI.value[i].name, "-", creatorFileNames.apiVersionSet));
80-
}
81-
else Console.WriteLine("{0} has no API version set.", extractedAPI.value[i].name);
95+
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(apiVersionSetTemplate, initialAPITemplate, subsequentAPITemplate, creatorFileNames);
96+
Template masterTemplateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig);
8297

83-
Console.WriteLine("Writing API File for {0} API ...", extractedAPI.value[i].name);
84-
fileWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, extractedAPI.value[i].name, "-", creatorFileNames.api));
98+
// write templates to outputLocation
99+
if (apiVersionSetTemplate != null)
100+
{
101+
fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.apiVersionSet));
102+
}
103+
fileWriter.WriteJSONToFile(initialAPITemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.initialAPI));
104+
fileWriter.WriteJSONToFile(subsequentAPITemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.subsequentAPI));
105+
fileWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, "/master.template.json"));
106+
fileWriter.WriteJSONToFile(masterTemplateParameters, String.Concat(creatorConfig.outputLocation, "/master.parameters.json"));
107+
}
108+
else
109+
{
110+
Template initialMasterTemplate = masterTemplateCreator.CreateInitialUnlinkedMasterTemplate(apiVersionSetTemplate, initialAPITemplate);
111+
Template subsequentMasterTemplate = masterTemplateCreator.CreateSubsequentUnlinkedMasterTemplate(subsequentAPITemplate);
112+
Template masterTemplateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig);
113+
fileWriter.WriteJSONToFile(initialMasterTemplate, String.Concat(creatorConfig.outputLocation, creatorConfig.api.name , "-master1.template.json"));
114+
fileWriter.WriteJSONToFile(subsequentMasterTemplate, String.Concat(creatorConfig.outputLocation, creatorConfig.api.name, "-master2.template.json"));
115+
fileWriter.WriteJSONToFile(masterTemplateParameters, String.Concat(creatorConfig.outputLocation, creatorConfig.api.name, "-master.parameters.json"));
116+
}
85117
}
86-
Console.WriteLine("All files are saved on {0} folder! Press any key.", Directory.GetCurrentDirectory());
118+
Console.WriteLine("Templates written to output location");
87119
Console.ReadKey();
88-
return 0;
89120
});
90121
}
91122
}
92-
}
123+
}
124+
125+
// for (int i = 0; i<extractedAPI.value.Count; i++)
126+
// {
127+
// APIConfig apiConfig = new APIConfig();
128+
129+
//CreatorConfig creatorConfig = new CreatorConfig
130+
//{
131+
// version = "1.0.0",
132+
// outputLocation = @"",
133+
// apimServiceName = apimname,
134+
// api = apiConfig
135+
//};
136+
//creatorConfig.api.openApiSpec = null;
137+
// creatorConfig.api.name = extractedAPI.value[i].name;
138+
// creatorConfig.api.apiVersion = extractedAPI.value[i].properties.apiVersion;
139+
// creatorConfig.api.apiVersionDescription = extractedAPI.value[i].properties.apiVersionDescription;
140+
// creatorConfig.api.suffix = extractedAPI.value[i].properties.path;
141+
// creatorConfig.linked = false;
142+
143+
// if (extractedAPI.value[i].properties.apiVersionSetId != null)
144+
// {
145+
// string APIVersionSetFull = extractedAPI.value[i].properties.apiVersionSetId;
146+
//string APIVersionSetId = APIVersionSetFull.Substring(APIVersionSetFull.LastIndexOf('/') + 1);
147+
//APIVersionSetId = api.GetAPIVersionSet(apimname, resourceGroup, APIVersionSetId).Result;
148+
// APIVersionSetTemplateResource apiv = JsonConvert.DeserializeObject<APIVersionSetTemplateResource>(APIVersionSetId);
149+
150+
//creatorConfig.apiVersionSet = apiv.properties;
151+
// }
152+
153+
// TemplateCreator templateCreator = new TemplateCreator();
154+
//APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(templateCreator);
155+
//ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator();
156+
////PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader);
157+
//APITemplateCreator apiTemplateCreator = new APITemplateCreator(templateCreator);
158+
////MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(templateCreator);
159+
160+
//// create templates from provided configuration
161+
//Template apiVersionSetTemplate = creatorConfig.apiVersionSet != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null;
162+
//Template apiTemplate = await apiTemplateCreator.CreateAPITemplateAsync(creatorConfig);
163+
164+
//FileWriter fileWriter = new FileWriter();
165+
//CreatorFileNames creatorFileNames = fileWriter.GenerateCreatorFileNames();
166+
167+
// if (extractedAPI.value[i].properties.apiVersionSetId != null)
168+
// {
169+
// Console.WriteLine("Writing API Version Set File for {0} API ...", extractedAPI.value[i].name);
170+
// fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(creatorConfig.outputLocation, extractedAPI.value[i].name, "-", creatorFileNames.apiVersionSet));
171+
// }
172+
// else Console.WriteLine("{0} has no API version set.", extractedAPI.value[i].name);
173+
174+
// Console.WriteLine("Writing API File for {0} API ...", extractedAPI.value[i].name);
175+
// fileWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, extractedAPI.value[i].name, "-", creatorFileNames.initialAPI));
176+
// }
177+
// Console.WriteLine("All files are saved on {0} folder! Press any key.", Directory.GetCurrentDirectory());
178+
// Console.ReadKey();
179+
// return 0;

src/APIM_ARMTemplate/apimtemplate/Common/Api.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ public async Task<string> GetAPIOperations(string ApiManagementName, string Reso
2020

2121
return await CallApiManagement(azToken, requestUrl);
2222
}
23+
public async Task<string> GetOperationPolicy(string ApiManagementName, string ResourceGroupName, string ApiName, string OperationId)
24+
{
25+
(string azToken, string azSubId) = await auth.GetAccessToken();
26+
27+
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/operations/{5}/policies?api-version={6}",
28+
baseUrl, azSubId, ResourceGroupName, ApiManagementName, ApiName, OperationId, Constants.APIVersion);
29+
30+
return await CallApiManagement(azToken, requestUrl);
31+
}
2332
public async Task<string> GetAPIDetails(string ApiManagementName, string ResourceGroupName, string ApiName)
2433
{
2534
(string azToken, string azSubId) = await auth.GetAccessToken();

src/APIM_ARMTemplate/apimtemplate/Extractor/FileHandlers/FileReader.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
using Newtonsoft.Json;
2-
using Newtonsoft.Json.Linq;
32
using System;
4-
using System.Collections.Generic;
53
using System.IO;
6-
using System.Linq;
74
using System.Net.Http;
85
using System.Threading.Tasks;
9-
using YamlDotNet.RepresentationModel;
106
using YamlDotNet.Serialization;
117

128
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
@@ -37,7 +33,9 @@ public async Task<CreatorConfig> ConvertConfigYAMLToCreatorConfigAsync(string co
3733
CreatorConfig yamlObject = JsonConvert.DeserializeObject<CreatorConfig>(jsonText);
3834
return yamlObject;
3935
}
40-
} else {
36+
}
37+
else
38+
{
4139
throw new Exception("Unable to fetch remote config YAML file.");
4240
}
4341
}

src/APIM_ARMTemplate/apimtemplate/Extractor/FileHandlers/FileWriter.cs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
using Newtonsoft.Json;
2-
using Newtonsoft.Json.Linq;
1+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
2+
using Newtonsoft.Json;
33
using System.IO;
4-
using System.Collections.Generic;
5-
using System;
64

75
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
86
{
@@ -25,9 +23,10 @@ public CreatorFileNames GenerateCreatorFileNames()
2523
// generate useable object with file names for consistency throughout project
2624
return new CreatorFileNames()
2725
{
28-
apiVersionSet = $@"versionset.template.json",
29-
api = $@"api.template.json",
30-
master = @"master.template.json"
26+
apiVersionSet = $@"/versionset.template.json",
27+
initialAPI = $@"/initialAPI.template.json",
28+
subsequentAPI = $@"/subsequentAPI.template.json",
29+
master = @"/master.template.json"
3130
};
3231
}
3332
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Microsoft.OpenApi.Models;
2+
using Microsoft.OpenApi.Readers;
3+
using Newtonsoft.Json;
4+
using Newtonsoft.Json.Linq;
5+
using System;
6+
using System.IO;
7+
using System.Net.Http;
8+
using System.Threading.Tasks;
9+
10+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
11+
{
12+
public class OpenAPISpecReader
13+
{
14+
public OpenApiDocument ConvertToOpenAPISpec(string json)
15+
{
16+
// converts json string into OpenApiDocument class
17+
OpenApiStringReader reader = new OpenApiStringReader();
18+
OpenApiDocument doc = reader.Read(json, out var diagnostic);
19+
return doc;
20+
}
21+
22+
public OpenApiDocument ConvertLocalFileToOpenAPISpec(string jsonFile)
23+
{
24+
JObject jObject = JObject.Parse(File.ReadAllText(jsonFile));
25+
string json = JsonConvert.SerializeObject(jObject);
26+
OpenApiDocument document = ConvertToOpenAPISpec(json);
27+
return document;
28+
}
29+
30+
public async Task<OpenApiDocument> ConvertRemoteURLToOpenAPISpecAsync(Uri uriResult)
31+
{
32+
HttpClient client = new HttpClient();
33+
HttpResponseMessage response = await client.GetAsync(uriResult);
34+
if (response.IsSuccessStatusCode)
35+
{
36+
string json = await response.Content.ReadAsStringAsync();
37+
OpenApiDocument document = ConvertToOpenAPISpec(json);
38+
return document;
39+
}
40+
else
41+
{
42+
return new OpenApiDocument();
43+
}
44+
}
45+
46+
public async Task<OpenApiDocument> ConvertOpenAPISpecToDoc(string openApiSpecFileLocation)
47+
{
48+
// determine whether file location is local file path or remote url and convert appropriately
49+
Uri uriResult;
50+
bool isUrl = Uri.TryCreate(openApiSpecFileLocation, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
51+
if (isUrl)
52+
{
53+
return await this.ConvertRemoteURLToOpenAPISpecAsync(uriResult);
54+
}
55+
else
56+
{
57+
return null;
58+
}
59+
}
60+
}
61+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
5+
{
6+
public class CLICreatorArguments
7+
{
8+
public string configFile { get; set; }
9+
}
10+
11+
public class CreatorConfig
12+
{
13+
public string version { get; set; }
14+
public string apimServiceName { get; set; }
15+
public APIVersionSetProperties apiVersionSet { get; set; }
16+
public APIConfig api { get; set; }
17+
public string outputLocation { get; set; }
18+
public bool linked { get; set; }
19+
public string linkedTemplatesBaseUrl { get; set; }
20+
}
21+
22+
public class APIConfig
23+
{
24+
public string name { get; set; }
25+
// openApiSpec file location (local or url)
26+
public string openApiSpec { get; set; }
27+
// policy file location (local or url)
28+
public string policy { get; set; }
29+
public string suffix { get; set; }
30+
public string apiVersion { get; set; }
31+
public string apiVersionDescription { get; set; }
32+
public string apiVersionSetId { get; set; }
33+
public string revision { get; set; }
34+
public string revisionDescription { get; set; }
35+
public Dictionary<string, OperationsConfig> operations { get; set; }
36+
public APITemplateAuthenticationSettings authenticationSettings { get; set; }
37+
public string products { get; set; }
38+
}
39+
40+
public class OperationsConfig
41+
{
42+
// policy file location (local or url)
43+
public string policy { get; set; }
44+
}
45+
46+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract.Operation
6+
{
7+
public class Properties
8+
{
9+
public string policyContent { get; set; }
10+
}
11+
12+
public class Value
13+
{
14+
public string id { get; set; }
15+
public string type { get; set; }
16+
public string name { get; set; }
17+
public Properties properties { get; set; }
18+
}
19+
20+
public class Operation
21+
{
22+
public List<Value> value { get; set; }
23+
}
24+
}

0 commit comments

Comments
 (0)