@@ -30,7 +30,7 @@ public async Task<string> GetBackend(string ApiManagementName, string ResourceGr
30
30
return await CallApiManagement ( azToken , requestUrl ) ;
31
31
}
32
32
33
- public async Task < Template > GenerateBackendsARMTemplate ( string apimname , string resourceGroup , string singleApiName , List < TemplateResource > apiTemplateResources )
33
+ public async Task < Template > GenerateBackendsARMTemplate ( string apimname , string resourceGroup , string singleApiName , List < TemplateResource > apiTemplateResources , List < TemplateResource > propertyResources )
34
34
{
35
35
Console . WriteLine ( "------------------------------------------" ) ;
36
36
Console . WriteLine ( "Getting backends from service" ) ;
@@ -40,6 +40,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
40
40
41
41
// isolate api and operation policy resources in the case of a single api extraction, as they may reference backends
42
42
var policyResources = apiTemplateResources . Where ( resource => ( resource . type == ResourceTypeConstants . APIPolicy || resource . type == ResourceTypeConstants . APIOperationPolicy ) ) ;
43
+ var namedValueResources = propertyResources . Where ( resource => ( resource . type == ResourceTypeConstants . Property ) ) ;
43
44
44
45
string backends = await GetBackends ( apimname , resourceGroup ) ;
45
46
JObject oBackends = JObject . Parse ( backends ) ;
@@ -53,40 +54,59 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
53
54
backendTemplateResource . name = $ "[concat(parameters('ApimServiceName'), '/{ backendName } ')]";
54
55
backendTemplateResource . apiVersion = "2018-06-01-preview" ;
55
56
56
- // extract all the backends in both cases for the time being
57
- Console . WriteLine ( "'{0}' Backend found" , backendName ) ;
58
- templateResources . Add ( backendTemplateResource ) ;
59
-
60
- // only extract the backend if this is a full extraction, or in the case of a single api, if it is referenced by one of the policies
61
- //if (singleApiName == null)
62
- //{
63
- // // if the user is extracting all apis, extract all the backends
64
- // Console.WriteLine("'{0}' Backend found", backendName);
65
- // templateResources.Add(backendTemplateResource);
66
- //}
67
- //else
68
- //{
69
- // bool isReferencedInPolicy = false;
70
- // foreach (PolicyTemplateResource policyTemplateResource in policyResources)
71
- // {
72
- // // the backend is used in a policy if the xml contains a set-backend-service policy, which will reference the backend's url or id
73
- // string policyContent = policyTemplateResource.properties.policyContent;
74
- // if (policyContent.Contains(backendName) || policyContent.Contains(backendTemplateResource.properties.url) || policyContent.Contains(backendTemplateResource.properties.resourceId))
75
- // {
76
- // isReferencedInPolicy = true;
77
- // }
78
- // }
79
- // if (isReferencedInPolicy == true)
80
- // {
81
- // // backend was used in policy, extract it
82
- // Console.WriteLine("'{0}' Backend found", backendName);
83
- // templateResources.Add(backendTemplateResource);
84
- // }
85
- //}
57
+ //only extract the backend if this is a full extraction, or in the case of a single api, if it is referenced by one of the policies
58
+ if ( singleApiName == null )
59
+ {
60
+ // if the user is extracting all apis, extract all the backends
61
+ Console . WriteLine ( "'{0}' Backend found" , backendName ) ;
62
+ templateResources . Add ( backendTemplateResource ) ;
63
+ }
64
+ else
65
+ {
66
+ bool isReferencedInPolicy = false ;
67
+ foreach ( PolicyTemplateResource policyTemplateResource in policyResources )
68
+ {
69
+ // the backend is used in a policy if the xml contains a set-backend-service policy, which will reference the backend's url or id
70
+ string policyContent = policyTemplateResource . properties . policyContent ;
71
+ isReferencedInPolicy = DoesPolicyReferenceBackend ( policyContent , namedValueResources , backendName , backendTemplateResource ) ;
72
+ }
73
+ if ( isReferencedInPolicy == true )
74
+ {
75
+ // backend was used in policy, extract it
76
+ Console . WriteLine ( "'{0}' Backend found" , backendName ) ;
77
+ templateResources . Add ( backendTemplateResource ) ;
78
+ }
79
+ }
86
80
}
87
81
88
82
armTemplate . resources = templateResources . ToArray ( ) ;
89
83
return armTemplate ;
90
84
}
85
+
86
+ public bool DoesPolicyReferenceBackend ( string policyContent , IEnumerable < TemplateResource > namedValueResources , string backendName , BackendTemplateResource backendTemplateResource )
87
+ {
88
+ var namedValueResourcesUsedByBackend = namedValueResources . Where ( resource => DoesBackendReferenceNamedValue ( resource , backendTemplateResource ) ) ;
89
+ if ( policyContent . Contains ( backendName ) || policyContent . Contains ( backendTemplateResource . properties . url ) || policyContent . Contains ( backendTemplateResource . properties . resourceId ) )
90
+ {
91
+ return true ;
92
+ }
93
+ foreach ( PropertyTemplateResource namedValueResource in namedValueResourcesUsedByBackend )
94
+ {
95
+ if ( policyContent . Contains ( namedValueResource . properties . displayName ) || policyContent . Contains ( namedValueResource . properties . value ) )
96
+ {
97
+ return true ;
98
+ }
99
+
100
+ }
101
+ return false ;
102
+ }
103
+
104
+ public bool DoesBackendReferenceNamedValue ( TemplateResource namedValueResource , BackendTemplateResource backendTemplateResource )
105
+ {
106
+ string namedValue = ( namedValueResource as PropertyTemplateResource ) . properties . value ;
107
+ return ( namedValue == backendTemplateResource . properties . url
108
+ || namedValue == backendTemplateResource . properties . description
109
+ || namedValue == backendTemplateResource . properties . title ) ;
110
+ }
91
111
}
92
112
}
0 commit comments