@@ -22,66 +22,72 @@ public ExtractCommand()
22
22
// convert config file to extractorConfig class
23
23
FileReader fileReader = new FileReader ( ) ;
24
24
ExtractorConfig extractorConfig = fileReader . ConvertConfigJsonToExtractorConfig ( ) ;
25
-
25
+
26
26
try
27
27
{
28
28
if ( extractorConfig . sourceApimName == null ) throw new Exception ( "Missing parameter <sourceApimName>." ) ;
29
29
if ( extractorConfig . destinationApimName == null ) throw new Exception ( "Missing parameter <destinationApimName>." ) ;
30
30
if ( extractorConfig . resourceGroup == null ) throw new Exception ( "Missing parameter <resourceGroup>." ) ;
31
31
if ( extractorConfig . fileFolder == null ) throw new Exception ( "Missing parameter <filefolder>." ) ;
32
32
33
- bool splitAPIs = extractorConfig . splitAPIs != null && extractorConfig . splitAPIs . Equals ( "true" ) ;
34
- string apiVersionSetName = extractorConfig . apiVersionSetName ;
35
33
string singleApiName = extractorConfig . apiName ;
34
+ bool splitAPIs = extractorConfig . splitAPIs != null && extractorConfig . splitAPIs . Equals ( "true" ) ;
35
+ bool hasVersionSetName = extractorConfig . apiVersionSetName != null ;
36
+ bool hasSingleApi = singleApiName != null ;
37
+ bool includeRevisions = extractorConfig . includeAllRevisions != null && extractorConfig . includeAllRevisions . Equals ( "true" ) ;
36
38
37
39
// validaion check
38
- if ( splitAPIs && singleApiName != null )
40
+ if ( splitAPIs && hasSingleApi )
39
41
{
40
- throw new Exception ( "Can't use -- splitAPIs and -- apiName at same time" ) ;
42
+ throw new Exception ( "Can't use splitAPIs and apiName at same time" ) ;
41
43
}
42
44
43
- if ( splitAPIs && apiVersionSetName != null )
45
+ if ( splitAPIs && hasVersionSetName )
44
46
{
45
- throw new Exception ( "Can't use -- splitAPIs and -- apiVersionSetName at same time" ) ;
47
+ throw new Exception ( "Can't use splitAPIs and apiVersionSetName at same time" ) ;
46
48
}
47
49
48
- if ( singleApiName != null && apiVersionSetName != null )
50
+ if ( hasSingleApi && hasVersionSetName )
49
51
{
50
- throw new Exception ( "Can't use -- apiName and -- apiVersionSetName at same time" ) ;
52
+ throw new Exception ( "Can't use apiName and apiVersionSetName at same time" ) ;
51
53
}
52
54
55
+ // start running extractor
53
56
Console . WriteLine ( "API Management Template" ) ;
54
- Console . WriteLine ( ) ;
55
57
Console . WriteLine ( "Connecting to {0} API Management Service on {1} Resource Group ..." , extractorConfig . sourceApimName , extractorConfig . resourceGroup ) ;
56
- if ( singleApiName != null )
57
- {
58
- Console . WriteLine ( "Executing extraction for {0} API ..." , singleApiName ) ;
59
- }
60
- else
61
- {
62
- Console . WriteLine ( "Executing full extraction ..." ) ;
63
- }
64
58
65
59
// initialize file helper classes
66
60
FileWriter fileWriter = new FileWriter ( ) ;
67
61
FileNameGenerator fileNameGenerator = new FileNameGenerator ( ) ;
68
62
FileNames fileNames = fileNameGenerator . GenerateFileNames ( extractorConfig . sourceApimName ) ;
69
63
70
- // create template folder with all apis and split api templates
71
64
if ( splitAPIs )
72
65
{
73
66
// create split api templates for all apis in the sourceApim
74
67
await this . GenerateSplitAPITemplates ( extractorConfig , fileNameGenerator , fileWriter , fileNames ) ;
75
68
}
76
- else if ( apiVersionSetName != null )
69
+ else if ( hasVersionSetName )
77
70
{
78
71
// create split api templates and aggregated api templates for this apiversionset
79
72
await this . GenerateAPIVersionSetTemplates ( extractorConfig , fileNameGenerator , fileNames , fileWriter ) ;
80
73
}
74
+ else if ( hasSingleApi && includeRevisions )
75
+ {
76
+ // handle singel API include Revision extraction
77
+ await this . GenerateSingleAPIWithRevisionsTemplates ( extractorConfig , singleApiName , fileNameGenerator , fileWriter , fileNames ) ;
78
+ }
81
79
else
82
80
{
83
81
// create single api template or create aggregated api templates for all apis within the sourceApim
84
- await this . GenerateTemplates ( new Extractor ( extractorConfig ) , fileNameGenerator , fileNames , fileWriter ) ;
82
+ if ( hasSingleApi )
83
+ {
84
+ Console . WriteLine ( "Executing extraction for {0} API ..." , singleApiName ) ;
85
+ }
86
+ else
87
+ {
88
+ Console . WriteLine ( "Executing full extraction ..." ) ;
89
+ }
90
+ await this . GenerateTemplates ( new Extractor ( extractorConfig ) , singleApiName , null , fileNameGenerator , fileNames , fileWriter , null ) ;
85
91
}
86
92
Console . WriteLine ( "Templates written to output location" ) ;
87
93
Console . WriteLine ( "Press any key to exit process:" ) ;
@@ -102,9 +108,16 @@ public ExtractCommand()
102
108
2. multipleApiNams is null, then generate separate folder and master template for each API
103
109
3. when both singleApiName and multipleApiNams is null, then generate one master template to link all apis in the sourceapim
104
110
*/
105
- private async Task GenerateTemplates ( Extractor exc , FileNameGenerator fileNameGenerator , FileNames fileNames , FileWriter fileWriter )
111
+ private async Task GenerateTemplates (
112
+ Extractor exc ,
113
+ string singleApiName ,
114
+ List < string > multipleAPINames ,
115
+ FileNameGenerator fileNameGenerator ,
116
+ FileNames fileNames ,
117
+ FileWriter fileWriter ,
118
+ Template apiTemplate )
106
119
{
107
- if ( exc . apiName != null && exc . multipleAPINames != null )
120
+ if ( singleApiName != null && multipleAPINames != null )
108
121
{
109
122
throw new Exception ( "can't specify single API and multiple APIs to extract at the same time" ) ;
110
123
}
@@ -123,17 +136,19 @@ private async Task GenerateTemplates(Extractor exc, FileNameGenerator fileNameGe
123
136
// read parameters
124
137
string sourceApim = exc . sourceApimName ;
125
138
string resourceGroup = exc . resourceGroup ;
126
- string singleApiName = exc . apiName ;
127
139
string destinationApim = exc . destinationApimName ;
128
140
string linkedBaseUrl = exc . linkedTemplatesBaseUrl ;
129
141
string policyXMLBaseUrl = exc . policyXMLBaseUrl ;
130
142
string dirName = exc . fileFolder ;
131
- List < string > multipleApiNames = exc . multipleAPINames ;
143
+ List < string > multipleApiNames = multipleAPINames ;
132
144
string linkedUrlQueryString = exc . linkedTemplatesUrlQueryString ;
133
145
134
146
// extract templates from apim service
135
147
Template globalServicePolicyTemplate = await policyExtractor . GenerateGlobalServicePolicyTemplateAsync ( sourceApim , resourceGroup , policyXMLBaseUrl , dirName ) ;
136
- Template apiTemplate = await apiExtractor . GenerateAPIsARMTemplateAsync ( sourceApim , resourceGroup , singleApiName , multipleApiNames , policyXMLBaseUrl , dirName ) ;
148
+ if ( apiTemplate == null )
149
+ {
150
+ apiTemplate = await apiExtractor . GenerateAPIsARMTemplateAsync ( sourceApim , resourceGroup , singleApiName , multipleApiNames , policyXMLBaseUrl , dirName ) ;
151
+ }
137
152
List < TemplateResource > apiTemplateResources = apiTemplate . resources . ToList ( ) ;
138
153
Template apiVersionSetTemplate = await apiVersionSetExtractor . GenerateAPIVersionSetsARMTemplateAsync ( sourceApim , resourceGroup , singleApiName , apiTemplateResources , policyXMLBaseUrl ) ;
139
154
Template authorizationServerTemplate = await authorizationServerExtractor . GenerateAuthorizationServersARMTemplateAsync ( sourceApim , resourceGroup , singleApiName , apiTemplateResources , policyXMLBaseUrl ) ;
@@ -183,7 +198,11 @@ private async Task GenerateTemplates(Extractor exc, FileNameGenerator fileNameGe
183
198
if ( linkedBaseUrl != null )
184
199
{
185
200
// create a master template that links to all other templates
186
- Template masterTemplate = masterTemplateExtractor . GenerateLinkedMasterTemplate ( apiTemplate , globalServicePolicyTemplate , apiVersionSetTemplate , productTemplate , loggerTemplate , backendTemplate , authorizationServerTemplate , namedValueTemplate , tagTemplate , fileNames , apiFileName , linkedUrlQueryString , policyXMLBaseUrl ) ;
201
+ Template masterTemplate = masterTemplateExtractor . GenerateLinkedMasterTemplate (
202
+ apiTemplate , globalServicePolicyTemplate , apiVersionSetTemplate , productTemplate ,
203
+ loggerTemplate , backendTemplate , authorizationServerTemplate , namedValueTemplate ,
204
+ tagTemplate , fileNames , apiFileName , linkedUrlQueryString , policyXMLBaseUrl ) ;
205
+
187
206
fileWriter . WriteJSONToFile ( masterTemplate , String . Concat ( @dirName , fileNames . linkedMaster ) ) ;
188
207
}
189
208
@@ -207,16 +226,13 @@ public async Task GenerateAPIVersionSetTemplates(ExtractorConfig exc, FileNameGe
207
226
// generate seperate folder for each API
208
227
string apiFileFolder = String . Concat ( @exc . fileFolder , $@ "/{ apiName } ") ;
209
228
System . IO . Directory . CreateDirectory ( apiFileFolder ) ;
210
- // config instance with singleApiName
211
- Extractor excConfig = new Extractor ( exc , apiName , apiFileFolder ) ;
212
- await this . GenerateTemplates ( excConfig , fileNameGenerator , fileNames , fileWriter ) ;
229
+ await this . GenerateTemplates ( new Extractor ( exc , apiFileFolder ) , apiName , null , fileNameGenerator , fileNames , fileWriter , null ) ;
213
230
}
214
231
215
232
// create master templates for this apiVersionSet
216
233
string versionSetFolder = String . Concat ( @exc . fileFolder , fileNames . versionSetMasterFolder ) ;
217
234
System . IO . Directory . CreateDirectory ( versionSetFolder ) ;
218
- Extractor versionConfig = new Extractor ( exc , apiDictionary [ exc . apiVersionSetName ] , versionSetFolder ) ;
219
- await this . GenerateTemplates ( versionConfig , fileNameGenerator , fileNames , fileWriter ) ;
235
+ await this . GenerateTemplates ( new Extractor ( exc , versionSetFolder ) , null , apiDictionary [ exc . apiVersionSetName ] , fileNameGenerator , fileNames , fileWriter , null ) ;
220
236
221
237
Console . WriteLine ( $@ "Finish extracting APIVersionSet { exc . apiVersionSetName } ") ;
222
238
@@ -247,8 +263,7 @@ public async Task GenerateSplitAPITemplates(ExtractorConfig exc, FileNameGenerat
247
263
// create master templates for each apiVersionSet
248
264
string versionSetFolder = String . Concat ( @apiFileFolder , fileNames . versionSetMasterFolder ) ;
249
265
System . IO . Directory . CreateDirectory ( versionSetFolder ) ;
250
- Extractor masterConfig = new Extractor ( exc , versionSetEntry . Value , versionSetFolder ) ;
251
- await this . GenerateTemplates ( masterConfig , fileNameGenerator , fileNames , fileWriter ) ;
266
+ await this . GenerateTemplates ( new Extractor ( exc , versionSetFolder ) , null , versionSetEntry . Value , fileNameGenerator , fileNames , fileWriter , null ) ;
252
267
253
268
Console . WriteLine ( $@ "Finish extracting APIVersionSet { versionSetEntry . Key } ") ;
254
269
}
@@ -259,15 +274,53 @@ public async Task GenerateSplitAPITemplates(ExtractorConfig exc, FileNameGenerat
259
274
// create folder for each API
260
275
string tempFileFolder = String . Concat ( @apiFileFolder , $@ "/{ apiName } ") ;
261
276
System . IO . Directory . CreateDirectory ( tempFileFolder ) ;
262
- Extractor excConfig = new Extractor ( exc , apiName , tempFileFolder ) ;
263
277
// generate templates for each API
264
- await this . GenerateTemplates ( excConfig , fileNameGenerator , fileNames , fileWriter ) ;
278
+ await this . GenerateTemplates ( new Extractor ( exc , tempFileFolder ) , apiName , null , fileNameGenerator , fileNames , fileWriter , null ) ;
265
279
266
280
Console . WriteLine ( $@ "Finish extracting API { apiName } ") ;
267
281
}
268
282
}
269
283
}
270
284
285
+ public async Task GenerateSingleAPIWithRevisionsTemplates ( ExtractorConfig exc , string apiName , FileNameGenerator fileNameGenerator , FileWriter fileWriter , FileNames fileNames )
286
+ {
287
+ Console . WriteLine ( "Extracting singleAPI {0} with revisions" , apiName ) ;
288
+
289
+ APIExtractor apiExtractor = new APIExtractor ( fileWriter ) ;
290
+ // Get all revisions for this api
291
+ string revisions = await apiExtractor . GetAPIRevisionsAsync ( exc . sourceApimName , exc . resourceGroup , apiName ) ;
292
+ JObject revs = JObject . Parse ( revisions ) ;
293
+ string currentRevision = null ;
294
+ List < string > revList = new List < string > ( ) ;
295
+
296
+ // Generate seperate folder for each API revision
297
+ for ( int i = 0 ; i < ( ( JContainer ) revs [ "value" ] ) . Count ; i ++ )
298
+ {
299
+ string apiID = ( ( JValue ) revs [ "value" ] [ i ] [ "apiId" ] ) . Value . ToString ( ) ;
300
+ string singleApiName = apiID . Split ( "/" ) [ 2 ] ;
301
+ if ( ( ( JValue ) revs [ "value" ] [ i ] [ "isCurrent" ] ) . Value . ToString ( ) . Equals ( "True" ) )
302
+ {
303
+ currentRevision = singleApiName ;
304
+ }
305
+
306
+ string revFileFolder = String . Concat ( @exc . fileFolder , $@ "/{ singleApiName } ") ;
307
+ System . IO . Directory . CreateDirectory ( revFileFolder ) ;
308
+ await this . GenerateTemplates ( new Extractor ( exc , revFileFolder ) , singleApiName , null , fileNameGenerator , fileNames , fileWriter , null ) ;
309
+ revList . Add ( singleApiName ) ;
310
+ }
311
+
312
+ if ( currentRevision == null )
313
+ {
314
+ throw new Exception ( $ "Revision { apiName } doesn't exist, something went wrong!") ;
315
+ }
316
+ // generate revisions master folder
317
+ string revMasterFolder = String . Concat ( @exc . fileFolder , fileNames . revisionMasterFolder ) ;
318
+ System . IO . Directory . CreateDirectory ( revMasterFolder ) ;
319
+ Extractor revExc = new Extractor ( exc , revMasterFolder ) ;
320
+ Template apiRevisionTemplate = await apiExtractor . GenerateAPIRevisionTemplateAsync ( currentRevision , revList , apiName , revExc ) ;
321
+ await GenerateTemplates ( revExc , null , null , fileNameGenerator , fileNames , fileWriter , apiRevisionTemplate ) ;
322
+ }
323
+
271
324
// this function will generate an api dictionary with apiName/versionsetName (if exist one) as key, list of apiNames as value
272
325
public async Task < Dictionary < string , List < string > > > GetAllAPIsDictionary ( string sourceApim , string resourceGroup , FileWriter fileWriter )
273
326
{
0 commit comments