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