Merge "Workflow Recipe Lookup"
[so.git] / mso-catalog-db / src / main / java / org / onap / so / db / catalog / client / CatalogDbClient.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.db.catalog.client;
22
23 import java.net.URI;
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.stream.Collectors;
28
29 import javax.annotation.PostConstruct;
30 import javax.persistence.EntityNotFoundException;
31 import javax.ws.rs.core.UriBuilder;
32
33 import org.onap.so.db.catalog.beans.BuildingBlockDetail;
34 import org.onap.so.db.catalog.beans.CloudSite;
35 import org.onap.so.db.catalog.beans.CloudifyManager;
36 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
37 import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
38 import org.onap.so.db.catalog.beans.ControllerSelectionReference;
39 import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
40 import org.onap.so.db.catalog.beans.CvnfcCustomization;
41 import org.onap.so.db.catalog.beans.ExternalServiceToInternalService;
42 import org.onap.so.db.catalog.beans.HomingInstance;
43 import org.onap.so.db.catalog.beans.InstanceGroup;
44 import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization;
45 import org.onap.so.db.catalog.beans.NetworkRecipe;
46 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
47 import org.onap.so.db.catalog.beans.OrchestrationAction;
48 import org.onap.so.db.catalog.beans.OrchestrationStatus;
49 import org.onap.so.db.catalog.beans.OrchestrationStatusStateTransitionDirective;
50 import org.onap.so.db.catalog.beans.PnfResource;
51 import org.onap.so.db.catalog.beans.PnfResourceCustomization;
52 import org.onap.so.db.catalog.beans.ResourceType;
53 import org.onap.so.db.catalog.beans.Service;
54 import org.onap.so.db.catalog.beans.ServiceRecipe;
55 import org.onap.so.db.catalog.beans.VfModule;
56 import org.onap.so.db.catalog.beans.VfModuleCustomization;
57 import org.onap.so.db.catalog.beans.VnfComponentsRecipe;
58 import org.onap.so.db.catalog.beans.VnfRecipe;
59 import org.onap.so.db.catalog.beans.VnfResource;
60 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
61 import org.onap.so.db.catalog.beans.VnfcInstanceGroupCustomization;
62 import org.onap.so.db.catalog.beans.Workflow;
63 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
64 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
65 import org.onap.so.db.catalog.beans.macro.RainyDayHandlerStatus;
66 import org.onap.so.logger.LogConstants;
67 import org.onap.so.logging.jaxrs.filter.SpringClientFilter;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.beans.factory.annotation.Value;
72 import org.springframework.http.HttpHeaders;
73 import org.springframework.http.client.BufferingClientHttpRequestFactory;
74 import org.springframework.http.client.ClientHttpRequestFactory;
75 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
76 import org.springframework.stereotype.Component;
77 import org.springframework.web.client.RestTemplate;
78
79 import uk.co.blackpepper.bowman.Client;
80 import uk.co.blackpepper.bowman.ClientFactory;
81 import uk.co.blackpepper.bowman.Configuration;
82
83 @Component("CatalogDbClient")
84 public class CatalogDbClient {
85     
86     private static final Logger logger = LoggerFactory.getLogger(CatalogDbClient.class);
87
88     private static final String CLOUD_SITE = "/cloudSite";
89     private static final String CLOUDIFY_MANAGER = "/cloudifyManager";
90     private static final String CVNFC_CUSTOMZIATION = "/cvnfcCustomization";
91     private static final String RAINY_DAY_HANDLER_MACRO = "/rainy_day_handler_macro";
92     private static final String NORTHBOUND_REQUEST_REF_LOOKUP = "/northbound_request_ref_lookup";
93     private static final String NETWORK_RESOURCE_CUSTOMIZATION = "/networkResourceCustomization";
94     private static final String COLLECTION_RESOURCE_INSTANCE_GROUP_CUSTOMIZATION = "/collectionResourceInstanceGroupCustomization";
95     private static final String VNFC_INSTANCE_GROUP_CUSTOMIZATION = "/vnfcInstanceGroupCustomization";
96     private static final String ORCHESTRATION_FLOW = "/orchestrationFlow";
97     private static final String ORCHESTRATION_STATUS_STATE_TRANSITION_DIRECTIVE = "/orchestrationStatusStateTransitionDirective";
98     private static final String INSTANCE_GROUP = "/instanceGroup";
99     private static final String COLLECTION_NETWORK_RESOURCE_CUSTOMIZATION = "/collectionNetworkResourceCustomization";
100     private static final String BUILDING_BLOCK_DETAIL = "/buildingBlockDetail";
101     private static final String NETWORK_COLLECTION_RESOURCE_CUSTOMIZATION = "/networkCollectionResourceCustomization";
102     private static final String VNF_RESOURCE_CUSTOMIZATION = "/vnfResourceCustomization";
103     private static final String SERVICE = "/service";
104     private static final String EXTERNAL_SERVICE_TO_INTERNAL_MODEL_MAPPING = "/externalServiceToInternalService";
105     private static final String VNF_RESOURCE = "/vnfResource";
106     private static final String VNF_RECIPE = "/vnfRecipe";
107     private static final String VFMODULE = "/vfModule";
108     private static final String VFMODULE_CUSTOMIZATION = "/vfModuleCustomization";
109     private static final String VNF_COMPONENTS_RECIPE = "/vnfComponentsRecipe";
110     private static final String SERVICE_RECIPE = "/serviceRecipe";
111     private static final String NETWORK_RECIPE = "/networkRecipe";
112     private static final String PNF_RESOURCE = "/pnfResource";
113     private static final String PNF_RESOURCE_CUSTOMIZATION = "/pnfResourceCustomization";
114     private static final String WORKFLOW = "/workflow";
115
116
117     private static final String SEARCH = "/search";
118     private static final String URI_SEPARATOR = "/";
119
120     private static final String SERVICE_MODEL_UUID = "serviceModelUUID";
121     private static final String SERVICE_NAME = "serviceName";
122     private static final String MODEL_UUID = "modelUUID";
123     private static final String MODEL_CUSTOMIZATION_UUID = "modelCustomizationUUID";
124     private static final String ACTION = "action";
125     private static final String MODEL_NAME = "modelName";
126     private static final String MODEL_VERSION = "modelVersion";
127     private static final String MODEL_INVARIANT_UUID = "modelInvariantUUID";
128     private static final String MODEL_INSTANCE_NAME = "modelInstanceName";
129     private static final String VNF_RESOURCE_MODEL_UUID = "vnfResourceModelUUID";
130     private static final String NF_ROLE = "nfRole";
131     private static final String VF_MODULE_MODEL_UUID = "vfModuleModelUUID";
132     private static final String VNF_COMPONENT_TYPE = "vnfComponentType";
133     private static final String BUILDING_BLOCK_NAME = "buildingBlockName";
134     private static final String RESOURCE_TYPE = "resourceType";
135     private static final String ORCHESTRATION_STATUS = "orchestrationStatus";
136     private static final String TARGET_ACTION = "targetAction";
137     private static final String REQUEST_SCOPE = "requestScope";
138     private static final String IS_ALACARTE = "isALaCarte";
139     private static final String CLOUD_OWNER = "cloudOwner";
140     private static final String FLOW_NAME = "flowName";
141     private static final String SERVICE_TYPE = "serviceType";
142     private static final String VNF_TYPE = "vnfType";
143     private static final String ERROR_CODE = "errorCode";
144     private static final String WORK_STEP = "workStep";
145     private static final String CLLI = "clli";
146     private static final String CLOUD_VERSION = "cloudVersion";
147     private static final String HOMING_INSTANCE = "/homingInstance";
148     private static final String ARTIFACT_UUID = "artifactUUID";
149     
150     private static final String TARGET_ENTITY = "SO:CatalogDB";
151     private static final String ASTERISK = "*";
152
153     private String findExternalToInternalServiceByServiceName = "/findByServiceName";
154     private String findServiceByModelName = "/findOneByModelName";
155     private String findServiceRecipeByActionAndServiceModelUUID = "/findByActionAndServiceModelUUID";
156     private String findServiceByModelUUID = "/findOneByModelUUID";
157     private String findFirstByModelNameURI = "/findFirstByModelNameOrderByModelVersionDesc";
158     private String findFirstByServiceModelUUIDAndActionURI = "/findFirstByServiceModelUUIDAndAction";
159     private String findFirstByModelVersionAndModelInvariantUUIDURI = "/findFirstByModelVersionAndModelInvariantUUID";
160     private String findByModelInvariantUUIDURI = "/findByModelInvariantUUIDOrderByModelVersionDesc";
161     private String findFirstByModelNameAndAction = "/findFirstByModelNameAndAction";
162     private String findFirstResourceByModelInvariantUUIDAndModelVersion = "/findFirstResourceByModelInvariantUUIDAndModelVersion";
163     private String findByModelInstanceNameAndVnfResources = "/findByModelInstanceNameAndVnfResources";
164     private String findFirstVnfRecipeByNfRoleAndAction = "/findFirstVnfRecipeByNfRoleAndAction";
165     private String findByModelCustomizationUUIDAndVfModuleModelUUID = "/findFirstByModelCustomizationUUIDAndVfModuleModelUUIDOrderByCreatedDesc";
166     private String findFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction = "/findFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction";
167     private String findFirstVnfComponentsRecipeByVnfComponentTypeAndAction = "/findFirstVnfComponentsRecipeByVnfComponentTypeAndAction";
168     private String findVfModuleByModelInvariantUUIDOrderByModelVersionDesc = "/findByModelInvariantUUIDOrderByModelVersionDesc";
169     private String findFirstVfModuleByModelInvariantUUIDAndModelVersion = "/findFirstVfModuleByModelInvariantUUIDAndModelVersion";
170     private String findOneByBuildingBlockName = "/findOneByBuildingBlockName";
171     private String findOneByResourceTypeAndOrchestrationStatusAndTargetAction = "/findOneByResourceTypeAndOrchestrationStatusAndTargetAction";
172     private String findByAction = "/findByAction";
173     private String findVnfcInstanceGroupCustomizationByModelCustomizationUUID = "/findByModelCustomizationUUID";
174     private String findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID = "/findByModelCustomizationUUID";
175     private String findOneByActionAndRequestScopeAndIsAlacarte = "/findOneByActionAndRequestScopeAndIsAlacarte";
176     private String findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner = "/findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner";
177     private String findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType = "/findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType";
178     private String findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep = "/findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep";
179     private String findByClliAndCloudVersion = "/findByClliAndCloudVersion";
180     private String findServiceByServiceInstanceId = "/findServiceByServiceInstanceId";
181     private String findPnfResourceCustomizationByModelUuid = "/findPnfResourceCustomizationByModelUuid";
182     private String findWorkflowByArtifactUUID = "/findByArtifactUUID";
183
184     private String serviceURI;
185     private String vfModuleURI;
186     private String vnfResourceURI;
187     private String vfModuleCustomizationURI;
188     private String networkCollectionResourceCustomizationURI;
189     private String networkResourceCustomizationURI;
190     private String vnfResourceCustomizationURI;
191     private String collectionNetworkResourceCustomizationURI;
192     private String instanceGroupURI;
193     private String cloudifyManagerURI;
194     private String cloudSiteURI;
195     private String homingInstanceURI;
196     private String cvnfcResourceCustomizationURI;
197     private String pnfResourceURI;
198     private String pnfResourceCustomizationURI;
199     private String workflowURI;
200
201     private final Client<Service> serviceClient;
202
203     private final Client<NetworkRecipe> networkRecipeClient;
204
205     private final Client<NetworkResourceCustomization> networkResourceCustomizationClient;
206
207     private final Client<VnfResource> vnfResourceClient;
208
209     private final Client<VnfResourceCustomization> vnfResourceCustomizationClient;
210
211     private final Client<VnfRecipe> vnfRecipeClient;
212
213     private final Client<VfModuleCustomization> vfModuleCustomizationClient;
214
215     private final Client<VfModule> vfModuleClient;
216
217     private final Client<VnfComponentsRecipe> vnfComponentsRecipeClient;
218
219     private final Client<OrchestrationFlow> orchestrationClient;
220
221     private final Client<NorthBoundRequest> northBoundRequestClient;
222
223     private final Client<RainyDayHandlerStatus> rainyDayHandlerStatusClient;
224
225     private final Client<BuildingBlockDetail> buildingBlockDetailClient;
226
227     private final Client<OrchestrationStatusStateTransitionDirective> orchestrationStatusStateTransitionDirectiveClient;
228
229     private final Client<VnfcInstanceGroupCustomization> vnfcInstanceGroupCustomizationClient;
230
231     private final Client<CollectionResourceInstanceGroupCustomization> collectionResourceInstanceGroupCustomizationClient;
232
233     private final Client<InstanceGroup> instanceGroupClient;
234
235     private final Client<NetworkCollectionResourceCustomization> networkCollectionResourceCustomizationClient;
236
237     private final Client<CollectionNetworkResourceCustomization> collectionNetworkResourceCustomizationClient;
238
239     private final Client<ServiceRecipe> serviceRecipeClient;
240
241     private final Client<ExternalServiceToInternalService> externalServiceToInternalServiceClient;
242
243     private final Client<CloudSite> cloudSiteClient;
244
245     private final Client<HomingInstance> homingInstanceClient;
246
247     private final Client<CloudifyManager> cloudifyManagerClient;
248     
249     private final Client<CvnfcCustomization> cvnfcCustomizationClient;
250
251     private final Client<ControllerSelectionReference> controllerSelectionReferenceClient;
252
253     private final Client<PnfResource> pnfResourceClient;
254
255     private final Client<PnfResourceCustomization> pnfResourceCustomizationClient;
256     
257     private final Client<Workflow> workflowClient;
258
259     @Value("${mso.catalog.db.spring.endpoint:#{null}}")
260     private String endpoint;
261
262     @Value("${mso.db.auth:#{null}}")
263     private String msoAdaptersAuth;
264
265     @Autowired
266     RestTemplate restTemplate;
267
268     @PostConstruct
269     public void init(){
270         findExternalToInternalServiceByServiceName = endpoint + EXTERNAL_SERVICE_TO_INTERNAL_MODEL_MAPPING + SEARCH + findExternalToInternalServiceByServiceName;
271         findServiceByModelName =  endpoint + SERVICE + SEARCH + findServiceByModelName;
272         findServiceRecipeByActionAndServiceModelUUID = endpoint + SERVICE_RECIPE + SEARCH + findServiceRecipeByActionAndServiceModelUUID;
273         findServiceByModelUUID =  endpoint + SERVICE + SEARCH + findServiceByModelUUID;
274         findFirstByModelNameURI = endpoint + SERVICE + SEARCH + findFirstByModelNameURI;
275         findFirstByModelVersionAndModelInvariantUUIDURI = endpoint + SERVICE + SEARCH + findFirstByModelVersionAndModelInvariantUUIDURI;
276         findByModelInvariantUUIDURI = endpoint + SERVICE + SEARCH + findByModelInvariantUUIDURI;
277         findFirstByServiceModelUUIDAndActionURI = endpoint + SERVICE_RECIPE + SEARCH + findFirstByServiceModelUUIDAndActionURI;
278         findFirstByModelNameAndAction = endpoint + NETWORK_RECIPE + SEARCH + findFirstByModelNameAndAction;
279         findFirstResourceByModelInvariantUUIDAndModelVersion =  endpoint + VNF_RESOURCE + SEARCH + findFirstResourceByModelInvariantUUIDAndModelVersion;
280         findByModelInstanceNameAndVnfResources =  endpoint + VNF_RESOURCE_CUSTOMIZATION + SEARCH + findByModelInstanceNameAndVnfResources;
281         findFirstVnfRecipeByNfRoleAndAction = endpoint + VNF_RECIPE + SEARCH + findFirstVnfRecipeByNfRoleAndAction;
282         findByModelCustomizationUUIDAndVfModuleModelUUID = endpoint + VFMODULE_CUSTOMIZATION + SEARCH + findByModelCustomizationUUIDAndVfModuleModelUUID;
283         findFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction = endpoint + VNF_COMPONENTS_RECIPE + SEARCH + findFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction;
284         findFirstVnfComponentsRecipeByVnfComponentTypeAndAction = endpoint + VNF_COMPONENTS_RECIPE + SEARCH + findFirstVnfComponentsRecipeByVnfComponentTypeAndAction;
285         findVfModuleByModelInvariantUUIDOrderByModelVersionDesc = endpoint + VFMODULE + SEARCH +findVfModuleByModelInvariantUUIDOrderByModelVersionDesc;
286         findFirstVfModuleByModelInvariantUUIDAndModelVersion = endpoint + VFMODULE + SEARCH + findFirstVfModuleByModelInvariantUUIDAndModelVersion;
287         findOneByBuildingBlockName = endpoint + BUILDING_BLOCK_DETAIL + SEARCH + findOneByBuildingBlockName;
288         findOneByResourceTypeAndOrchestrationStatusAndTargetAction = endpoint + ORCHESTRATION_STATUS_STATE_TRANSITION_DIRECTIVE + SEARCH + findOneByResourceTypeAndOrchestrationStatusAndTargetAction;
289         findByAction = endpoint + ORCHESTRATION_FLOW + SEARCH + findByAction;
290         findVnfcInstanceGroupCustomizationByModelCustomizationUUID = endpoint + VNFC_INSTANCE_GROUP_CUSTOMIZATION + SEARCH + findVnfcInstanceGroupCustomizationByModelCustomizationUUID;
291         findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID = endpoint + COLLECTION_RESOURCE_INSTANCE_GROUP_CUSTOMIZATION + SEARCH + findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID;
292         findOneByActionAndRequestScopeAndIsAlacarte = endpoint + NORTHBOUND_REQUEST_REF_LOOKUP + SEARCH + findOneByActionAndRequestScopeAndIsAlacarte;
293         findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner = endpoint + NORTHBOUND_REQUEST_REF_LOOKUP + SEARCH + findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwner;
294         findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType = endpoint + NORTHBOUND_REQUEST_REF_LOOKUP + SEARCH + findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType;
295         findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep = endpoint + RAINY_DAY_HANDLER_MACRO + SEARCH + findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep;
296         findByClliAndCloudVersion = endpoint + CLOUD_SITE + SEARCH + findByClliAndCloudVersion;
297
298         findPnfResourceCustomizationByModelUuid =
299             endpoint + PNF_RESOURCE_CUSTOMIZATION + SEARCH + findPnfResourceCustomizationByModelUuid;
300         
301         findWorkflowByArtifactUUID = endpoint + WORKFLOW + SEARCH + findWorkflowByArtifactUUID;
302
303         serviceURI = endpoint + SERVICE + URI_SEPARATOR;
304         vfModuleURI = endpoint + VFMODULE + URI_SEPARATOR;
305         vnfResourceURI = endpoint + VNF_RESOURCE + URI_SEPARATOR;
306         vfModuleCustomizationURI = endpoint + VFMODULE_CUSTOMIZATION + URI_SEPARATOR;
307         networkCollectionResourceCustomizationURI = endpoint + NETWORK_COLLECTION_RESOURCE_CUSTOMIZATION + URI_SEPARATOR;
308         networkResourceCustomizationURI = endpoint + NETWORK_RESOURCE_CUSTOMIZATION + URI_SEPARATOR;
309         cvnfcResourceCustomizationURI = endpoint + CVNFC_CUSTOMZIATION + URI_SEPARATOR;
310         vnfResourceCustomizationURI = endpoint + VNF_RESOURCE_CUSTOMIZATION + URI_SEPARATOR;
311         collectionNetworkResourceCustomizationURI = endpoint + COLLECTION_NETWORK_RESOURCE_CUSTOMIZATION + URI_SEPARATOR;
312         instanceGroupURI = endpoint + INSTANCE_GROUP + URI_SEPARATOR;
313         cloudifyManagerURI = endpoint + CLOUDIFY_MANAGER + URI_SEPARATOR;
314         cloudSiteURI = endpoint + CLOUD_SITE + URI_SEPARATOR;
315         homingInstanceURI = endpoint + HOMING_INSTANCE + URI_SEPARATOR;
316         pnfResourceURI = endpoint + PNF_RESOURCE + URI_SEPARATOR;
317         pnfResourceCustomizationURI = endpoint + PNF_RESOURCE_CUSTOMIZATION + URI_SEPARATOR;
318         workflowURI = endpoint + WORKFLOW + URI_SEPARATOR;
319
320     }
321
322     public CatalogDbClient() {
323         ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory());
324
325         ClientFactory clientFactory = Configuration.builder().setClientHttpRequestFactory(factory).setRestTemplateConfigurer(restTemplate -> {
326             restTemplate.getInterceptors().add((new SpringClientFilter()));
327
328             restTemplate.getInterceptors().add((request, body, execution) -> {
329
330                 request.getHeaders().add(HttpHeaders.AUTHORIZATION, msoAdaptersAuth);
331                 request.getHeaders().add(LogConstants.TARGET_ENTITY_HEADER,TARGET_ENTITY);
332                 return execution.execute(request, body);
333             });
334         }).build().buildClientFactory();
335         serviceClient = clientFactory.create(Service.class);
336         networkRecipeClient = clientFactory.create(NetworkRecipe.class);
337         networkResourceCustomizationClient = clientFactory.create(NetworkResourceCustomization.class);
338         vnfResourceClient = clientFactory.create(VnfResource.class);
339         vnfResourceCustomizationClient = clientFactory.create(VnfResourceCustomization.class);
340         vnfRecipeClient = clientFactory.create(VnfRecipe.class);
341         orchestrationClient = clientFactory.create(OrchestrationFlow.class);
342         vfModuleCustomizationClient = clientFactory.create(VfModuleCustomization.class);
343         vfModuleClient = clientFactory.create(VfModule.class);
344         vnfComponentsRecipeClient = clientFactory.create(VnfComponentsRecipe.class);
345         northBoundRequestClient = clientFactory.create(NorthBoundRequest.class);
346         rainyDayHandlerStatusClient = clientFactory.create(RainyDayHandlerStatus.class);
347         buildingBlockDetailClient = clientFactory.create(BuildingBlockDetail.class);
348         orchestrationStatusStateTransitionDirectiveClient = clientFactory
349                 .create(OrchestrationStatusStateTransitionDirective.class);
350         vnfcInstanceGroupCustomizationClient = clientFactory.create(VnfcInstanceGroupCustomization.class);
351         collectionResourceInstanceGroupCustomizationClient = clientFactory
352                 .create(CollectionResourceInstanceGroupCustomization.class);
353         instanceGroupClient = clientFactory.create(InstanceGroup.class);
354         networkCollectionResourceCustomizationClient = clientFactory.create(NetworkCollectionResourceCustomization.class);
355         collectionNetworkResourceCustomizationClient = clientFactory.create(CollectionNetworkResourceCustomization.class);
356         cloudSiteClient = clientFactory.create(CloudSite.class);
357         homingInstanceClient = clientFactory.create(HomingInstance.class);
358         cloudifyManagerClient = clientFactory.create(CloudifyManager.class);
359         serviceRecipeClient = clientFactory.create(ServiceRecipe.class);
360         cvnfcCustomizationClient = clientFactory.create(CvnfcCustomization.class);
361         controllerSelectionReferenceClient = clientFactory.create(ControllerSelectionReference.class);
362         externalServiceToInternalServiceClient = clientFactory.create(ExternalServiceToInternalService.class);
363         pnfResourceClient = clientFactory.create(PnfResource.class);
364         pnfResourceCustomizationClient = clientFactory.create(PnfResourceCustomization.class);
365         workflowClient = clientFactory.create(Workflow.class);
366     }
367
368     public CatalogDbClient(String baseUri, String auth) {
369         ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new HttpComponentsClientHttpRequestFactory());
370
371         ClientFactory clientFactory = Configuration.builder().setBaseUri(baseUri).setClientHttpRequestFactory(factory).setRestTemplateConfigurer(restTemplate -> {
372             restTemplate.getInterceptors().add((new SpringClientFilter()));
373
374             restTemplate.getInterceptors().add((request, body, execution) -> {
375
376                 request.getHeaders().add(HttpHeaders.AUTHORIZATION, auth);
377                 request.getHeaders().add(LogConstants.TARGET_ENTITY_HEADER,TARGET_ENTITY);
378                 return execution.execute(request, body);
379             });
380         }).build().buildClientFactory();
381         serviceClient = clientFactory.create(Service.class);
382         networkRecipeClient = clientFactory.create(NetworkRecipe.class);
383         networkResourceCustomizationClient = clientFactory.create(NetworkResourceCustomization.class);
384         vnfResourceClient = clientFactory.create(VnfResource.class);
385         vnfResourceCustomizationClient = clientFactory.create(VnfResourceCustomization.class);
386         vnfRecipeClient = clientFactory.create(VnfRecipe.class);
387         orchestrationClient = clientFactory.create(OrchestrationFlow.class);
388         vfModuleCustomizationClient = clientFactory.create(VfModuleCustomization.class);
389         vfModuleClient = clientFactory.create(VfModule.class);
390         vnfComponentsRecipeClient = clientFactory.create(VnfComponentsRecipe.class);
391         northBoundRequestClient = clientFactory.create(NorthBoundRequest.class);
392         rainyDayHandlerStatusClient = clientFactory.create(RainyDayHandlerStatus.class);
393         buildingBlockDetailClient = clientFactory.create(BuildingBlockDetail.class);
394         orchestrationStatusStateTransitionDirectiveClient = clientFactory
395                 .create(OrchestrationStatusStateTransitionDirective.class);
396         vnfcInstanceGroupCustomizationClient = clientFactory.create(VnfcInstanceGroupCustomization.class);
397         collectionResourceInstanceGroupCustomizationClient = clientFactory
398                 .create(CollectionResourceInstanceGroupCustomization.class);
399         instanceGroupClient = clientFactory.create(InstanceGroup.class);
400         networkCollectionResourceCustomizationClient = clientFactory.create(NetworkCollectionResourceCustomization.class);
401         collectionNetworkResourceCustomizationClient = clientFactory.create(CollectionNetworkResourceCustomization.class);
402         cloudSiteClient = clientFactory.create(CloudSite.class);
403         homingInstanceClient = clientFactory.create(HomingInstance.class);
404         cloudifyManagerClient = clientFactory.create(CloudifyManager.class);
405         serviceRecipeClient = clientFactory.create(ServiceRecipe.class);
406         cvnfcCustomizationClient = clientFactory.create(CvnfcCustomization.class);
407         controllerSelectionReferenceClient = clientFactory.create(ControllerSelectionReference.class);
408         externalServiceToInternalServiceClient = clientFactory.create(ExternalServiceToInternalService.class);
409         pnfResourceClient = clientFactory.create(PnfResource.class);
410         pnfResourceCustomizationClient = clientFactory.create(PnfResourceCustomization.class);
411         workflowClient = clientFactory.create(Workflow.class);
412     }
413
414     public NetworkCollectionResourceCustomization getNetworkCollectionResourceCustomizationByID(String modelCustomizationUUID) {
415         NetworkCollectionResourceCustomization networkCollectionResourceCustomization =
416                 this.getSingleResource(networkCollectionResourceCustomizationClient, getUri(networkCollectionResourceCustomizationURI + modelCustomizationUUID));
417         if (networkCollectionResourceCustomization != null) {
418             networkCollectionResourceCustomization.setModelCustomizationUUID(modelCustomizationUUID);
419         }
420         return networkCollectionResourceCustomization;
421     }
422
423     public Service getServiceByID(String modelUUID) {
424         Service service = getSingleResource(serviceClient,getUri(serviceURI + modelUUID));
425         if (service != null) {
426             service.setModelUUID(modelUUID);
427         }
428         return service;
429     }
430
431     public VfModule getVfModuleByModelUUID(String modelUUID) {
432         VfModule vfModule = getSingleResource(vfModuleClient,getUri(vfModuleURI + modelUUID));
433         if (vfModule != null) {
434             vfModule.setModelUUID(modelUUID);
435         }
436         return vfModule;
437     }
438
439     public VnfResource getVnfResourceByModelUUID(String modelUUID){
440
441         VnfResource vnfResource = this.getSingleResource(vnfResourceClient, getUri(vnfResourceURI + modelUUID));
442         if (vnfResource != null) {
443             vnfResource.setModelUUID(modelUUID);
444         }
445         return vnfResource;
446     }
447
448     //A VNFResource customization UUID is the same object across services, so we can return anyone from the list
449     // In the future the client should query starting at a service model uuid
450     public VnfResourceCustomization getVnfResourceCustomizationByModelCustomizationUUID(String modelCustomizationUUID){
451         List<VnfResourceCustomization> vnfResourceCustomization = this.getMultipleResources(vnfResourceCustomizationClient,getUri(endpoint + VNF_RESOURCE_CUSTOMIZATION  + SEARCH + "/findByModelCustomizationUUID" + "?MODEL_CUSTOMIZATION_UUID="+ modelCustomizationUUID));
452         if(vnfResourceCustomization != null && !vnfResourceCustomization.isEmpty()){
453             return vnfResourceCustomization.get(0);
454         }
455         else{
456             return null;
457         }
458     }
459     public PnfResource getPnfResourceByModelUUID(String modelUUID) {
460         PnfResource PnfResource = this.getSingleResource(pnfResourceClient, getUri(pnfResourceURI + modelUUID));
461         if (PnfResource != null) {
462             PnfResource.setModelUUID(modelUUID);
463         }
464         return PnfResource;
465     }
466
467     public PnfResourceCustomization getPnfResourceCustomizationByModelCustomizationUUID(String modelCustomizationUUID) {
468         PnfResourceCustomization pnfResourceCustomization = getSingleResource(pnfResourceCustomizationClient,
469             getUri(pnfResourceCustomizationURI + modelCustomizationUUID));
470         if (pnfResourceCustomization != null) {
471             pnfResourceCustomization.setModelCustomizationUUID(modelCustomizationUUID);
472         }
473         return pnfResourceCustomization;
474     }
475
476     public List<PnfResourceCustomization> getPnfResourceCustomizationByModelUuid(String modelUuid) {
477         return this.getMultipleResources(pnfResourceCustomizationClient, getUri(
478             UriBuilder.fromUri(findPnfResourceCustomizationByModelUuid).queryParam("SERVICE_MODEL_UUID", modelUuid)
479                 .build().toString()));
480     }
481
482     public CollectionNetworkResourceCustomization getCollectionNetworkResourceCustomizationByID(String modelCustomizationUUID) {
483         CollectionNetworkResourceCustomization collectionNetworkResourceCustomization =
484                 this.getSingleResource(collectionNetworkResourceCustomizationClient,getUri(UriBuilder
485                         .fromUri(collectionNetworkResourceCustomizationURI + modelCustomizationUUID).build().toString()));
486         if (collectionNetworkResourceCustomization != null) {
487             collectionNetworkResourceCustomization.setModelCustomizationUUID(modelCustomizationUUID);
488         }
489         return collectionNetworkResourceCustomization;
490     }
491
492     public InstanceGroup getInstanceGroupByModelUUID(String modelUUID) {
493         InstanceGroup instanceGroup = this.getSingleResource(instanceGroupClient, getUri(instanceGroupURI + modelUUID));
494         if (instanceGroup != null) {
495             instanceGroup.setModelUUID(modelUUID);
496         }
497         return instanceGroup;
498     }
499
500     public VfModuleCustomization getVfModuleCustomizationByModelCuztomizationUUID(String modelCustomizationUUID) {
501         return this.getSingleResource(vfModuleCustomizationClient, getUri(endpoint + VFMODULE_CUSTOMIZATION + SEARCH + "/findFirstByModelCustomizationUUIDOrderByCreatedDesc" + "?MODEL_CUSTOMIZATION_UUID="+ modelCustomizationUUID));
502     }
503
504     public NetworkResourceCustomization getNetworkResourceCustomizationByModelCustomizationUUID(String modelCustomizationUUID){
505         NetworkResourceCustomization networkResourceCustomization =
506                 this.getSingleResource(networkResourceCustomizationClient, getUri(networkResourceCustomizationURI + modelCustomizationUUID));
507         if (networkResourceCustomization != null) {
508             networkResourceCustomization.setModelCustomizationUUID(modelCustomizationUUID);
509         }
510         return networkResourceCustomization;
511     }
512
513
514     public BuildingBlockDetail getBuildingBlockDetail(String buildingBlockName) {
515         BuildingBlockDetail buildingBlockDetail = getSingleResource(buildingBlockDetailClient, getUri(UriBuilder
516                 .fromUri(findOneByBuildingBlockName).queryParam(BUILDING_BLOCK_NAME, buildingBlockName).build().toString()));
517         if (buildingBlockDetail != null) {
518             buildingBlockDetail.setBuildingBlockName(buildingBlockName);
519         }
520         return buildingBlockDetail;
521     }
522
523
524     public OrchestrationStatusStateTransitionDirective getOrchestrationStatusStateTransitionDirective(
525             ResourceType resourceType, OrchestrationStatus orchestrationStatus, OrchestrationAction targetAction) {
526         return getSingleResource(orchestrationStatusStateTransitionDirectiveClient, UriBuilder
527                 .fromUri(findOneByResourceTypeAndOrchestrationStatusAndTargetAction)
528                 .queryParam(RESOURCE_TYPE, resourceType.name())
529                 .queryParam(ORCHESTRATION_STATUS, orchestrationStatus.name())
530                 .queryParam(TARGET_ACTION, targetAction.name()).build());
531     }
532
533     public List<OrchestrationFlow> getOrchestrationFlowByAction(String action) {
534         return this.getMultipleResources(orchestrationClient, UriBuilder
535                 .fromUri(findByAction).queryParam(ACTION, action).build());
536     }
537
538     public List<VnfcInstanceGroupCustomization> getVnfcInstanceGroupsByVnfResourceCust(String modelCustomizationUUID) {
539         return this.getMultipleResources(vnfcInstanceGroupCustomizationClient, UriBuilder
540                 .fromUri(findVnfcInstanceGroupCustomizationByModelCustomizationUUID)
541                 .queryParam(MODEL_CUSTOMIZATION_UUID, modelCustomizationUUID).build());
542     }
543
544     public List<CollectionResourceInstanceGroupCustomization> getCollectionResourceInstanceGroupCustomizationByModelCustUUID(
545             String modelCustomizationUUID) {
546         return this.getMultipleResources(collectionResourceInstanceGroupCustomizationClient, UriBuilder
547                 .fromUri(findCollectionResourceInstanceGroupCustomizationByModelCustomizationUUID)
548                 .queryParam(MODEL_CUSTOMIZATION_UUID, modelCustomizationUUID).build());
549     }
550
551     public VfModuleCustomization getVfModuleCustomizationByModelCustomizationUUIDAndVfModuleModelUUID(String modelCustomizationUUID, String vfModuleModelUUID) {
552         return this.getSingleResource(vfModuleCustomizationClient, getUri(UriBuilder
553                 .fromUri(findByModelCustomizationUUIDAndVfModuleModelUUID)
554                 .queryParam("MODEL_CUSTOMIZATION_UUID",modelCustomizationUUID)
555                 .queryParam("MODEL_UUID",vfModuleModelUUID).build().toString()));
556     }
557
558     public NorthBoundRequest getNorthBoundRequestByActionAndIsALaCarteAndRequestScope(String requestAction,
559             String resourceName, boolean aLaCarte) {
560         return this.getSingleResource(northBoundRequestClient, UriBuilder
561                 .fromUri(findOneByActionAndRequestScopeAndIsAlacarte)
562                 .queryParam(ACTION, requestAction).queryParam(REQUEST_SCOPE, resourceName)
563                 .queryParam(IS_ALACARTE, aLaCarte).build());
564     }
565     
566     public NorthBoundRequest getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(String requestAction,
567             String resourceName, boolean aLaCarte, String cloudOwner) {
568         return this.getSingleResource(northBoundRequestClient, getUri(UriBuilder
569                 .fromUri(findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType)
570                 .queryParam(ACTION, requestAction).queryParam(REQUEST_SCOPE, resourceName)
571                 .queryParam(IS_ALACARTE, aLaCarte)
572                 .queryParam(CLOUD_OWNER, cloudOwner)
573                 .queryParam(SERVICE_TYPE, ASTERISK).build().toString()));
574     }
575     
576     public NorthBoundRequest getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwnerAndServiceType(String requestAction,
577             String resourceName, boolean aLaCarte, String cloudOwner, String serviceType) {
578         return this.getSingleResource(northBoundRequestClient, getUri(UriBuilder
579                 .fromUri(findOneByActionAndRequestScopeAndIsAlacarteAndCloudOwnerAndServiceType)
580                 .queryParam(ACTION, requestAction).queryParam(REQUEST_SCOPE, resourceName)
581                 .queryParam(IS_ALACARTE, aLaCarte)
582                 .queryParam(CLOUD_OWNER, cloudOwner)
583                 .queryParam(SERVICE_TYPE, serviceType).build().toString()));
584     }
585
586     public RainyDayHandlerStatus getRainyDayHandlerStatusByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep(
587             String flowName, String serviceType, String vnfType, String errorCode, String workStep) {
588         return this.getSingleResource(rainyDayHandlerStatusClient, getUri(UriBuilder
589                 .fromUri(findOneByFlowNameAndServiceTypeAndVnfTypeAndErrorCodeAndWorkStep)
590                 .queryParam(FLOW_NAME, flowName).queryParam(SERVICE_TYPE, serviceType)
591                 .queryParam(VNF_TYPE, vnfType).queryParam(ERROR_CODE, errorCode).queryParam(WORK_STEP, workStep)
592                 .build().toString()));
593     }
594
595     public  ServiceRecipe getFirstByServiceModelUUIDAndAction(String modelUUID, String action){
596         return this.getSingleResource(serviceRecipeClient, getUri(UriBuilder
597                 .fromUri(findFirstByServiceModelUUIDAndActionURI)
598                 .queryParam(SERVICE_MODEL_UUID,modelUUID)
599                 .queryParam(ACTION,action).build().toString()));
600     }
601
602     public  NetworkRecipe getFirstNetworkRecipeByModelNameAndAction(String modelName, String action){
603         return this.getSingleResource(networkRecipeClient, UriBuilder
604                 .fromUri(findFirstByModelNameAndAction)
605                 .queryParam(MODEL_NAME,modelName)
606                 .queryParam(ACTION,action).build());
607     }
608     
609     public ControllerSelectionReference getControllerSelectionReferenceByVnfTypeAndActionCategory(String vnfType, String actionCategory) {
610         return this.getSingleResource(controllerSelectionReferenceClient, UriBuilder
611                 .fromUri(endpoint + "/controllerSelectionReference/search/findControllerSelectionReferenceByVnfTypeAndActionCategory")
612                         .queryParam("VNF_TYPE", vnfType).queryParam("ACTION_CATEGORY", actionCategory).build());
613     }
614
615     public Service getFirstByModelNameOrderByModelVersionDesc(String modelName){
616         return this.getSingleResource(serviceClient,UriBuilder
617                 .fromUri(findFirstByModelNameURI)
618                 .queryParam(MODEL_NAME,modelName).build());
619     }
620
621     public ExternalServiceToInternalService findExternalToInternalServiceByServiceName(String serviceName){
622         return this.getSingleResource(externalServiceToInternalServiceClient, getUri(UriBuilder
623                 .fromUri(findExternalToInternalServiceByServiceName)
624                 .queryParam(SERVICE_NAME,serviceName).build().toString()));
625     }
626
627     public  ServiceRecipe findServiceRecipeByActionAndServiceModelUUID(String action,String modelUUID){
628         return this.getSingleResource(serviceRecipeClient, getUri(UriBuilder
629                 .fromUri(findServiceRecipeByActionAndServiceModelUUID)
630                 .queryParam(ACTION,action)
631                 .queryParam(SERVICE_MODEL_UUID,modelUUID).build().toString()));
632     }
633
634     public Service getServiceByModelName(String modelName){
635         return this.getSingleResource(serviceClient,getUri(UriBuilder
636                 .fromUri(findServiceByModelName)
637                 .queryParam(MODEL_NAME,modelName).build().toString()));
638     }
639
640     public Service getServiceByModelUUID(String modelModelUUID){
641         return this.getSingleResource(serviceClient,getUri(UriBuilder
642                 .fromUri(findServiceByModelUUID)
643                 .queryParam(MODEL_UUID,modelModelUUID).build().toString()));
644     }
645
646     public VnfResource getFirstVnfResourceByModelInvariantUUIDAndModelVersion(String modelInvariantUUID, String modelVersion){
647         return this.getSingleResource(vnfResourceClient, getUri(UriBuilder
648                 .fromUri(findFirstResourceByModelInvariantUUIDAndModelVersion)
649                 .queryParam(MODEL_INVARIANT_UUID,modelInvariantUUID)
650                 .queryParam(MODEL_VERSION,modelVersion).build().toString()));
651     }
652
653
654     public VnfResourceCustomization getFirstVnfResourceCustomizationByModelInstanceNameAndVnfResources(String modelInstanceName, VnfResource vnfResource){
655         return this.getSingleResource(vnfResourceCustomizationClient, getUri(UriBuilder
656                 .fromUri(findByModelInstanceNameAndVnfResources)
657                 .queryParam("MODEL_INSTANCE_NAME",modelInstanceName)
658                 .queryParam("VNF_RESOURCE_MODEL_UUID",vnfResource.getModelUUID()).build().toString()));
659     }
660
661     public VnfRecipe getFirstVnfRecipeByNfRoleAndAction(String nfRole, String action){
662         return this.getSingleResource(vnfRecipeClient,getUri(UriBuilder
663                 .fromUri(findFirstVnfRecipeByNfRoleAndAction)
664                 .queryParam(NF_ROLE,nfRole)
665                 .queryParam(ACTION,action).build().toString()));
666     }
667
668     public VnfComponentsRecipe getFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction(String vfModuleModelUUID, String vnfComponentType, String action){
669         return this.getSingleResource(vnfComponentsRecipeClient,getUri(UriBuilder
670                 .fromUri(findFirstVnfComponentsRecipeByVfModuleModelUUIDAndVnfComponentTypeAndAction)
671                 .queryParam(VF_MODULE_MODEL_UUID,vfModuleModelUUID)
672                 .queryParam(VNF_COMPONENT_TYPE,vnfComponentType)
673                 .queryParam(ACTION,action).build().toString()));
674     }
675
676     public VnfComponentsRecipe getFirstVnfComponentsRecipeByVnfComponentTypeAndAction(String vnfComponentType, String action) {
677         return this.getSingleResource(vnfComponentsRecipeClient,getUri(UriBuilder
678                 .fromUri(findFirstVnfComponentsRecipeByVnfComponentTypeAndAction)
679                 .queryParam(VNF_COMPONENT_TYPE,vnfComponentType)
680                 .queryParam(ACTION,action).build().toString()));
681     }
682     protected URI getUri(String template){
683         return URI.create(template);
684     }
685
686     public CloudifyManager getCloudifyManager(String id) {
687         return this.getSingleResource(cloudifyManagerClient,getUri(cloudifyManagerURI + id));
688     }
689
690     public CloudSite getCloudSite(String id){
691         return this.getSingleResource(cloudSiteClient,
692                 getUri(cloudSiteURI + id));
693     }
694
695     public CloudSite getCloudSite(String id, String uri){
696         return this.getSingleResource(cloudSiteClient,
697                 getUri(uri + id));
698     }
699
700     public void postCloudSite(CloudSite cloudSite){
701         this.postSingleResource(cloudSiteClient, cloudSite);
702     }
703
704     public CloudSite getCloudSiteByClliAndAicVersion (String clli, String cloudVersion){
705         return this.getSingleResource(cloudSiteClient, getUri(UriBuilder
706                 .fromUri(findByClliAndCloudVersion)
707                 .queryParam(CLLI,clli).queryParam(CLOUD_VERSION,cloudVersion).build().toString()));
708     }
709
710     public HomingInstance getHomingInstance (String serviceInstanceId){
711         return this.getSingleResource(homingInstanceClient,
712                 getUri(homingInstanceURI + serviceInstanceId));
713     }
714
715     public HomingInstance getHomingInstance (String serviceInstanceId, String uri){
716         return this.getSingleResource(homingInstanceClient,
717                 getUri(uri + serviceInstanceId));
718     }
719
720     public void postHomingInstance(HomingInstance homingInstance){
721         this.postSingleResource(homingInstanceClient, homingInstance);
722     }
723
724     public Service getServiceByModelVersionAndModelInvariantUUID(String modelVersion, String modelInvariantUUID) {
725         return this.getSingleResource(serviceClient, getUri(UriBuilder
726                 .fromUri(findFirstByModelVersionAndModelInvariantUUIDURI)
727                 .queryParam(MODEL_VERSION, modelVersion)
728                 .queryParam(MODEL_INVARIANT_UUID, modelInvariantUUID).build().toString()));
729     }
730
731     public VfModule getVfModuleByModelInvariantUUIDAndModelVersion(String modelInvariantUUID, String modelVersion){
732         return this.getSingleResource(vfModuleClient,getUri(UriBuilder
733                 .fromUri(findFirstVfModuleByModelInvariantUUIDAndModelVersion)
734                 .queryParam(MODEL_INVARIANT_UUID, modelInvariantUUID)
735                 .queryParam(MODEL_VERSION, modelVersion).build().toString()));
736     }
737
738     public List<Service> getServiceByModelInvariantUUIDOrderByModelVersionDesc(String modelInvariantUUID) {
739         return this.getMultipleResources(serviceClient, getUri(UriBuilder
740                 .fromUri(findByModelInvariantUUIDURI)
741                 .queryParam(MODEL_INVARIANT_UUID, modelInvariantUUID).build().toString()));
742     }
743
744     public List<VfModule> getVfModuleByModelInvariantUUIDOrderByModelVersionDesc(String modelInvariantUUID) {
745         return this.getMultipleResources(vfModuleClient, getUri(UriBuilder
746                 .fromUri(findVfModuleByModelInvariantUUIDOrderByModelVersionDesc)
747                 .queryParam(MODEL_INVARIANT_UUID, modelInvariantUUID).build().toString()));
748     }
749
750     private <T> T getSingleResource(Client<T> client, URI uri) {
751         return client.get(uri);
752     }
753
754     private <T> List<T> getMultipleResources(Client<T> client, URI uri) {
755         Iterable<T> iterator = client.getAll(uri);
756         List<T> list = new ArrayList<>();
757         Iterator<T> it = iterator.iterator();
758         it.forEachRemaining(list::add);
759         return list;
760     }
761
762     private <T> URI postSingleResource(Client<T> client, T type){
763         return client.post(type);
764     }
765     
766     public List<CvnfcCustomization> getCvnfcCustomization(String serviceModelUUID, String vnfCustomizationUUID,
767             String vfModuleCustomizationUUID) {    
768         Service service = this.getServiceByID(serviceModelUUID);
769         VnfResourceCustomization vnfResourceCust = findVnfResourceCustomizationInList(vnfCustomizationUUID, service.getVnfCustomizations());
770         VfModuleCustomization vfModuleCust = findVfModuleCustomizationInList(vfModuleCustomizationUUID , vnfResourceCust.getVfModuleCustomizations());
771         return vfModuleCust.getCvnfcCustomization().stream().collect(Collectors.toList());
772     }
773     
774     private VnfResourceCustomization findVnfResourceCustomizationInList(String vnfCustomizationUUID , List<VnfResourceCustomization> vnfResourceCusts){
775         List<VnfResourceCustomization> filtered = vnfResourceCusts.stream()
776                 .filter(vnfCustRes -> vnfCustomizationUUID.equals(vnfCustRes.getModelCustomizationUUID()))
777                 .collect(Collectors.toList());
778         if(filtered != null && !filtered.isEmpty() && filtered.size() == 1){
779             return filtered.get(0);
780         }else
781             throw new EntityNotFoundException("Unable to find VnfResourceCustomization ModelCustomizationUUID:" + vnfCustomizationUUID);
782     }
783     
784     private VfModuleCustomization findVfModuleCustomizationInList(String vfModuleCustomizationUUID , List<VfModuleCustomization> vfModuleList){
785         List<VfModuleCustomization> filtered = vfModuleList.stream()
786                 .filter(vfModuleCust -> vfModuleCustomizationUUID.equals(vfModuleCust.getModelCustomizationUUID()))
787                 .collect(Collectors.toList());
788         if(filtered != null && !filtered.isEmpty() && filtered.size() == 1){
789             return filtered.get(0);
790         }else
791             throw new EntityNotFoundException("Unable to find VfModuleCustomization ModelCustomizationUUID:" + vfModuleCustomizationUUID);
792     }
793     
794     private CvnfcCustomization findCvnfcCustomizationInAList(String cvnfcCustomizationUuid , List<CvnfcCustomization> cvnfcCustomList){
795         List<CvnfcCustomization> filtered = cvnfcCustomList.stream()
796                 .filter(cvnfc -> cvnfcCustomizationUuid.equals(cvnfc.getModelCustomizationUUID()))
797                 .collect(Collectors.toList());
798         if(filtered != null && !filtered.isEmpty() && filtered.size() == 1){
799             logger.debug("Found CvnfcCustomization: {}", filtered.get(0));
800             return filtered.get(0);
801         }else
802             throw new EntityNotFoundException("Unable to find CvnfcCustomization ModelCustomizationUUID:" + cvnfcCustomizationUuid);
803     }
804     
805     public CvnfcConfigurationCustomization getCvnfcCustomization(String serviceModelUUID, String vnfCustomizationUuid,
806             String vfModuleCustomizationUuid, String cvnfcCustomizationUuid) {
807         List<CvnfcCustomization> cvnfcCustomization =  getCvnfcCustomization(serviceModelUUID,vnfCustomizationUuid,vfModuleCustomizationUuid);
808         CvnfcCustomization cvnfc = findCvnfcCustomizationInAList(cvnfcCustomizationUuid,cvnfcCustomization );
809         List<CvnfcConfigurationCustomization> fabricConfigs  = cvnfc.getCvnfcConfigurationCustomization().stream().filter(cvnfcCustom -> cvnfcCustom.getConfigurationResource().getToscaNodeType().contains("FabricConfiguration")).collect(Collectors.toList());
810         if(fabricConfigs != null && !fabricConfigs.isEmpty() && fabricConfigs.size() == 1){
811             logger.debug("Found Fabric Configuration: {}", fabricConfigs.get(0));
812             return fabricConfigs.get(0);
813         }else
814             throw new EntityNotFoundException("Unable to find CvnfcConfigurationCustomization ModelCustomizationUUID:" + cvnfcCustomizationUuid);
815     }
816     
817     public Workflow findWorkflowByArtifactUUID (String artifactUUID) {
818         return this.getSingleResource(workflowClient,getUri(UriBuilder
819                 .fromUri(findWorkflowByArtifactUUID)
820                 .queryParam(ARTIFACT_UUID, artifactUUID).build().toString()));                
821     }
822 }