068c287ee7fac1c3754a89721518fd6ff36c70ec
[so.git] / bpmn / so-bpmn-tasks / src / main / java / org / onap / so / bpmn / infrastructure / workflow / tasks / ebb / loader / ServiceEBBLoader.java
1 package org.onap.so.bpmn.infrastructure.workflow.tasks.ebb.loader;
2
3 import com.fasterxml.jackson.core.JsonProcessingException;
4 import org.camunda.bpm.engine.delegate.DelegateExecution;
5 import org.javatuples.Pair;
6 import org.onap.aai.domain.yang.Relationship;
7 import org.onap.aai.domain.yang.ServiceInstance;
8 import org.onap.aai.domain.yang.VpnBinding;
9 import org.onap.aaiclient.client.aai.AAICommonObjectMapperProvider;
10 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper;
11 import org.onap.aaiclient.client.aai.entities.Relationships;
12 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
13 import org.onap.so.bpmn.infrastructure.workflow.tasks.Resource;
14 import org.onap.so.bpmn.infrastructure.workflow.tasks.VrfBondingServiceException;
15 import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowType;
16 import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
17 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
18 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetup;
19 import org.onap.so.bpmn.servicedecomposition.tasks.BBInputSetupUtils;
20 import org.onap.so.client.exception.ExceptionBuilder;
21 import org.onap.so.client.orchestration.AAIConfigurationResources;
22 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
23 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
24 import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
25 import org.onap.so.db.catalog.beans.InstanceGroup;
26 import org.onap.so.db.catalog.client.CatalogDbClient;
27 import org.onap.so.serviceinstancebeans.ModelType;
28 import org.onap.so.serviceinstancebeans.RelatedInstance;
29 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32 import org.springframework.stereotype.Component;
33 import java.io.IOException;
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Map;
37 import java.util.Optional;
38 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.WORKFLOW_ACTION_ERROR_MESSAGE;
39 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.CREATE_INSTANCE;
40 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.FABRIC_CONFIGURATION;
41 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.NETWORKCOLLECTION;
42 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.USER_PARAM_SERVICE;
43 import static org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowActionConstants.ASSIGNINSTANCE;
44
45
46 @Component
47 public class ServiceEBBLoader {
48
49     private static final Logger logger = LoggerFactory.getLogger(ServiceEBBLoader.class);
50
51     private final UserParamsServiceTraversal userParamsServiceTraversal;
52     private final CatalogDbClient catalogDbClient;
53     private final VrfValidation vrfValidation;
54     private final AAIConfigurationResources aaiConfigurationResources;
55     private final WorkflowActionExtractResourcesAAI workflowActionUtils;
56     private final BBInputSetupUtils bbInputSetupUtils;
57     private final BBInputSetup bbInputSetup;
58     private final ExceptionBuilder exceptionBuilder;
59
60     public ServiceEBBLoader(UserParamsServiceTraversal userParamsServiceTraversal, CatalogDbClient catalogDbClient,
61             VrfValidation vrfValidation, AAIConfigurationResources aaiConfigurationResources,
62             WorkflowActionExtractResourcesAAI workflowActionUtils, BBInputSetupUtils bbInputSetupUtils,
63             BBInputSetup bbInputSetup, ExceptionBuilder exceptionBuilder) {
64         this.userParamsServiceTraversal = userParamsServiceTraversal;
65         this.catalogDbClient = catalogDbClient;
66         this.vrfValidation = vrfValidation;
67         this.aaiConfigurationResources = aaiConfigurationResources;
68         this.workflowActionUtils = workflowActionUtils;
69         this.bbInputSetupUtils = bbInputSetupUtils;
70         this.bbInputSetup = bbInputSetup;
71         this.exceptionBuilder = exceptionBuilder;
72     }
73
74     public List<Resource> getResourceListForService(ServiceInstancesRequest sIRequest, String requestAction,
75             DelegateExecution execution, String serviceInstanceId, String resourceId,
76             List<Pair<WorkflowType, String>> aaiResourceIds) throws IOException, VrfBondingServiceException {
77         boolean containsService = false;
78         List<Resource> resourceList = new ArrayList<>();
79         List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters().getUserParams();
80         if (requestAction.equalsIgnoreCase(ASSIGNINSTANCE)) {
81             // SERVICE-MACRO-ASSIGN will always get user params with a
82             // service.
83
84             if (userParams != null) {
85                 containsService = isContainsService(sIRequest);
86                 if (containsService) {
87                     resourceList = userParamsServiceTraversal.getResourceListFromUserParams(execution, userParams,
88                             serviceInstanceId, requestAction);
89                 }
90             } else {
91                 buildAndThrowException(execution,
92                         "Service-Macro-Assign request details must contain user params with a service");
93             }
94         } else if (requestAction.equalsIgnoreCase(CREATE_INSTANCE)) {
95             // SERVICE-MACRO-CREATE will get user params with a service,
96             // a service with a network, a service with a
97             // network collection, OR an empty service.
98             // If user params is just a service or null and macro
99             // queries the SI and finds a VNF, macro fails.
100
101             if (userParams != null) {
102                 containsService = isContainsService(sIRequest);
103             }
104             if (containsService) {
105                 resourceList = userParamsServiceTraversal.getResourceListFromUserParams(execution, userParams,
106                         serviceInstanceId, requestAction);
107             }
108             if (!foundRelated(resourceList)) {
109                 traverseCatalogDbService(execution, sIRequest, resourceList, aaiResourceIds);
110             }
111         } else if (("activateInstance".equalsIgnoreCase(requestAction)
112                 || "unassignInstance".equalsIgnoreCase(requestAction)
113                 || "deleteInstance".equalsIgnoreCase(requestAction)
114                 || requestAction.equalsIgnoreCase("activate" + FABRIC_CONFIGURATION))) {
115             // SERVICE-MACRO-ACTIVATE, SERVICE-MACRO-UNASSIGN, and
116             // SERVICE-MACRO-DELETE
117             // Will never get user params with service, macro will have
118             // to query the SI in AAI to find related instances.
119             traverseAAIService(execution, resourceList, resourceId, aaiResourceIds);
120         } else if ("deactivateInstance".equalsIgnoreCase(requestAction)) {
121             resourceList.add(new Resource(WorkflowType.SERVICE, "", false));
122         }
123         return resourceList;
124     }
125
126     private boolean isContainsService(ServiceInstancesRequest sIRequest) {
127         boolean containsService;
128         List<Map<String, Object>> userParams = sIRequest.getRequestDetails().getRequestParameters().getUserParams();
129         containsService = userParams.stream().anyMatch(param -> param.containsKey(USER_PARAM_SERVICE));
130         return containsService;
131     }
132
133     public void traverseCatalogDbService(DelegateExecution execution, ServiceInstancesRequest sIRequest,
134             List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds)
135             throws JsonProcessingException, VrfBondingServiceException {
136         String modelUUID = sIRequest.getRequestDetails().getModelInfo().getModelVersionId();
137         org.onap.so.db.catalog.beans.Service service = catalogDbClient.getServiceByID(modelUUID);
138
139         if (service == null) {
140             buildAndThrowException(execution, "Could not find the service model in catalog db.");
141         } else {
142             resourceList.add(new Resource(WorkflowType.SERVICE, service.getModelUUID(), false));
143             RelatedInstance relatedVpnBinding =
144                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.vpnBinding);
145             RelatedInstance relatedLocalNetwork =
146                     bbInputSetupUtils.getRelatedInstanceByType(sIRequest.getRequestDetails(), ModelType.network);
147
148             if (relatedVpnBinding != null && relatedLocalNetwork != null) {
149                 traverseVrfConfiguration(aaiResourceIds, resourceList, service, relatedVpnBinding, relatedLocalNetwork);
150             } else {
151                 traverseNetworkCollection(execution, resourceList, service);
152             }
153         }
154     }
155
156     public boolean foundRelated(List<Resource> resourceList) {
157         return (containsWorkflowType(resourceList, WorkflowType.VNF)
158                 || containsWorkflowType(resourceList, WorkflowType.PNF)
159                 || containsWorkflowType(resourceList, WorkflowType.NETWORK)
160                 || containsWorkflowType(resourceList, WorkflowType.NETWORKCOLLECTION));
161     }
162
163     public void traverseAAIService(DelegateExecution execution, List<Resource> resourceList, String resourceId,
164             List<Pair<WorkflowType, String>> aaiResourceIds) {
165         try {
166             ServiceInstance serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(resourceId);
167             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO =
168                     bbInputSetup.getExistingServiceInstance(serviceInstanceAAI);
169             resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false));
170             traverseServiceInstanceMSOVnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
171             traverseServiceInstanceMSOPnfs(resourceList, aaiResourceIds, serviceInstanceMSO);
172             if (serviceInstanceMSO.getNetworks() != null) {
173                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO
174                         .getNetworks()) {
175                     aaiResourceIds.add(new Pair<>(WorkflowType.NETWORK, network.getNetworkId()));
176                     resourceList.add(new Resource(WorkflowType.NETWORK, network.getNetworkId(), false));
177                 }
178             }
179             if (serviceInstanceMSO.getCollection() != null) {
180                 logger.debug("found networkcollection");
181                 aaiResourceIds
182                         .add(new Pair<>(WorkflowType.NETWORKCOLLECTION, serviceInstanceMSO.getCollection().getId()));
183                 resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
184                         serviceInstanceMSO.getCollection().getId(), false));
185             }
186             if (serviceInstanceMSO.getConfigurations() != null) {
187                 for (Configuration config : serviceInstanceMSO.getConfigurations()) {
188                     Optional<org.onap.aai.domain.yang.Configuration> aaiConfig =
189                             aaiConfigurationResources.getConfiguration(config.getConfigurationId());
190                     if (aaiConfig.isPresent() && aaiConfig.get().getRelationshipList() != null) {
191                         for (Relationship relationship : aaiConfig.get().getRelationshipList().getRelationship()) {
192                             if (relationship.getRelatedTo().contains("vnfc")
193                                     || relationship.getRelatedTo().contains("vpn-binding")) {
194                                 aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, config.getConfigurationId()));
195                                 resourceList.add(
196                                         new Resource(WorkflowType.CONFIGURATION, config.getConfigurationId(), false));
197                                 break;
198                             }
199                         }
200                     }
201                 }
202             }
203         } catch (Exception ex) {
204             logger.error("Exception in traverseAAIService", ex);
205             buildAndThrowException(execution,
206                     "Could not find existing Service Instance or related Instances to execute the request on.");
207         }
208     }
209
210     private void traverseServiceInstanceMSOVnfs(List<Resource> resourceList,
211             List<Pair<WorkflowType, String>> aaiResourceIds,
212             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
213         if (serviceInstanceMSO.getVnfs() == null) {
214             return;
215         }
216         for (org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf : serviceInstanceMSO.getVnfs()) {
217             aaiResourceIds.add(new Pair<>(WorkflowType.VNF, vnf.getVnfId()));
218             resourceList.add(new Resource(WorkflowType.VNF, vnf.getVnfId(), false));
219             traverseVnfModules(resourceList, aaiResourceIds, vnf);
220             if (vnf.getVolumeGroups() != null) {
221                 for (org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup volumeGroup : vnf.getVolumeGroups()) {
222                     aaiResourceIds.add(new Pair<>(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId()));
223                     resourceList.add(new Resource(WorkflowType.VOLUMEGROUP, volumeGroup.getVolumeGroupId(), false));
224                 }
225             }
226         }
227     }
228
229     private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList,
230             List<Pair<WorkflowType, String>> aaiResourceIds,
231             org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) {
232         if (serviceInstanceMSO.getPnfs() == null) {
233             return;
234         }
235         for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) {
236             aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId()));
237             resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false));
238         }
239     }
240
241     protected void traverseVrfConfiguration(List<Pair<WorkflowType, String>> aaiResourceIds,
242             List<Resource> resourceList, org.onap.so.db.catalog.beans.Service service,
243             RelatedInstance relatedVpnBinding, RelatedInstance relatedLocalNetwork)
244             throws VrfBondingServiceException, JsonProcessingException {
245         org.onap.aai.domain.yang.L3Network aaiLocalNetwork =
246                 bbInputSetupUtils.getAAIL3Network(relatedLocalNetwork.getInstanceId());
247         vrfValidation.vrfServiceValidation(service);
248         vrfValidation.vrfCatalogDbChecks(service);
249         vrfValidation.aaiVpnBindingValidation(relatedVpnBinding.getInstanceId(),
250                 bbInputSetupUtils.getAAIVpnBinding(relatedVpnBinding.getInstanceId()));
251         vrfValidation.aaiNetworkValidation(relatedLocalNetwork.getInstanceId(), aaiLocalNetwork);
252         vrfValidation.aaiSubnetValidation(aaiLocalNetwork);
253         vrfValidation.aaiAggregateRouteValidation(aaiLocalNetwork);
254         vrfValidation.aaiRouteTargetValidation(aaiLocalNetwork);
255         String existingAAIVrfConfiguration = getExistingAAIVrfConfiguration(relatedVpnBinding, aaiLocalNetwork);
256         if (existingAAIVrfConfiguration != null) {
257             aaiResourceIds.add(new Pair<>(WorkflowType.CONFIGURATION, existingAAIVrfConfiguration));
258         }
259         resourceList.add(new Resource(WorkflowType.CONFIGURATION,
260                 service.getConfigurationCustomizations().get(0).getModelCustomizationUUID(), false));
261
262     }
263
264     protected void traverseNetworkCollection(DelegateExecution execution, List<Resource> resourceList,
265             org.onap.so.db.catalog.beans.Service service) {
266         if (isVnfCustomizationsInTheService(service)) {
267             buildAndThrowException(execution,
268                     "Cannot orchestrate Service-Macro-Create without user params with a vnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows");
269         }
270         if (isPnfCustomizationsInTheService(service)) {
271             buildAndThrowException(execution,
272                     "Cannot orchestrate Service-Macro-Create without user params with a pnf. Please update ASDC model for new macro orchestration support or add service_recipe records to route to old macro flows");
273         }
274         List<CollectionResourceCustomization> customizations = service.getCollectionResourceCustomizations();
275         if (customizations.isEmpty()) {
276             logger.debug("No Collections found. CollectionResourceCustomization list is empty.");
277         } else {
278             CollectionResourceCustomization collectionResourceCustomization =
279                     findCatalogNetworkCollection(execution, service);
280             traverseNetworkCollectionResourceCustomization(resourceList, collectionResourceCustomization);
281         }
282         traverseNetworkCollectionCustomization(resourceList, service);
283     }
284
285     private void traverseNetworkCollectionResourceCustomization(List<Resource> resourceList,
286             CollectionResourceCustomization collectionResourceCustomization) {
287         if (collectionResourceCustomizationShouldNotBeProcessed(resourceList, collectionResourceCustomization))
288             return;
289         int minNetworks = 0;
290         org.onap.so.db.catalog.beans.InstanceGroup instanceGroup =
291                 collectionResourceCustomization.getCollectionResource().getInstanceGroup();
292         CollectionResourceInstanceGroupCustomization collectionInstCust = null;
293         if (!instanceGroup.getCollectionInstanceGroupCustomizations().isEmpty()) {
294             for (CollectionResourceInstanceGroupCustomization collectionInstanceGroupTemp : instanceGroup
295                     .getCollectionInstanceGroupCustomizations()) {
296                 if (collectionInstanceGroupTemp.getModelCustomizationUUID()
297                         .equalsIgnoreCase(collectionResourceCustomization.getModelCustomizationUUID())) {
298                     collectionInstCust = collectionInstanceGroupTemp;
299                     break;
300                 }
301             }
302             if (interfaceNetworkQuantityIsAvailableInCollection(collectionInstCust)) {
303                 minNetworks = collectionInstCust.getSubInterfaceNetworkQuantity();
304             }
305         }
306         logger.debug("minNetworks: {}", minNetworks);
307         CollectionNetworkResourceCustomization collectionNetworkResourceCust =
308                 getCollectionNetworkResourceCustomization(collectionResourceCustomization, instanceGroup);
309         for (int i = 0; i < minNetworks; i++) {
310             if (collectionNetworkResourceCust != null) {
311                 Resource resource = new Resource(WorkflowType.VIRTUAL_LINK,
312                         collectionNetworkResourceCust.getModelCustomizationUUID(), false);
313                 resource.setVirtualLinkKey(Integer.toString(i));
314                 resourceList.add(resource);
315             }
316         }
317     }
318
319     private CollectionNetworkResourceCustomization getCollectionNetworkResourceCustomization(
320             CollectionResourceCustomization collectionResourceCustomization, InstanceGroup instanceGroup) {
321         CollectionNetworkResourceCustomization collectionNetworkResourceCust = null;
322         for (CollectionNetworkResourceCustomization collectionNetworkTemp : instanceGroup
323                 .getCollectionNetworkResourceCustomizations()) {
324             if (collectionNetworkTemp.getNetworkResourceCustomization().getModelCustomizationUUID()
325                     .equalsIgnoreCase(collectionResourceCustomization.getModelCustomizationUUID())) {
326                 collectionNetworkResourceCust = collectionNetworkTemp;
327                 break;
328             }
329         }
330         return collectionNetworkResourceCust;
331     }
332
333     private boolean collectionResourceCustomizationShouldNotBeProcessed(List<Resource> resourceList,
334             CollectionResourceCustomization collectionResourceCustomization) {
335         if (collectionResourceCustomization == null) {
336             logger.debug("No Network Collection Customization found");
337             return true;
338         }
339         resourceList.add(new Resource(WorkflowType.NETWORKCOLLECTION,
340                 collectionResourceCustomization.getModelCustomizationUUID(), false));
341         logger.debug("Found a network collection");
342         if (collectionResourceCustomization.getCollectionResource() == null) {
343             logger.debug("No Network Collection found. collectionResource is null");
344             return true;
345         }
346         if (collectionResourceCustomization.getCollectionResource().getInstanceGroup() == null) {
347             logger.debug("No Instance Group found for network collection.");
348             return true;
349         }
350         String toscaNodeType =
351                 collectionResourceCustomization.getCollectionResource().getInstanceGroup().getToscaNodeType();
352         if (!toscaNodeTypeHasNetworkCollection(toscaNodeType)) {
353             logger.debug("Instance Group tosca node type does not contain NetworkCollection:  {}", toscaNodeType);
354             return true;
355         }
356         return false;
357     }
358
359     private boolean interfaceNetworkQuantityIsAvailableInCollection(
360             CollectionResourceInstanceGroupCustomization collectionInstCust) {
361         return collectionInstCust != null && collectionInstCust.getSubInterfaceNetworkQuantity() != null;
362     }
363
364     private boolean toscaNodeTypeHasNetworkCollection(String toscaNodeType) {
365         return toscaNodeType != null && toscaNodeType.contains(NETWORKCOLLECTION);
366     }
367
368     private void traverseNetworkCollectionCustomization(List<Resource> resourceList,
369             org.onap.so.db.catalog.beans.Service service) {
370         if (isNetworkCollectionInTheResourceList(resourceList)) {
371             return;
372         }
373         if (service.getNetworkCustomizations() == null) {
374             logger.debug("No networks were found on this service model");
375             return;
376         }
377         for (int i = 0; i < service.getNetworkCustomizations().size(); i++) {
378             resourceList.add(new Resource(WorkflowType.NETWORK,
379                     service.getNetworkCustomizations().get(i).getModelCustomizationUUID(), false));
380         }
381     }
382
383     private boolean isVnfCustomizationsInTheService(org.onap.so.db.catalog.beans.Service service) {
384         return !(service.getVnfCustomizations() == null || service.getVnfCustomizations().isEmpty());
385     }
386
387     private boolean isPnfCustomizationsInTheService(org.onap.so.db.catalog.beans.Service service) {
388         return !(service.getPnfCustomizations() == null || service.getPnfCustomizations().isEmpty());
389     }
390
391     private void traverseVnfModules(List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds,
392             org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) {
393         if (vnf.getVfModules() == null) {
394             return;
395         }
396         for (VfModule vfModule : vnf.getVfModules()) {
397             aaiResourceIds.add(new Pair<>(WorkflowType.VFMODULE, vfModule.getVfModuleId()));
398             Resource resource = new Resource(WorkflowType.VFMODULE, vfModule.getVfModuleId(), false);
399             resource.setBaseVfModule(vfModule.getModelInfoVfModule().getIsBaseBoolean());
400             resourceList.add(resource);
401         }
402     }
403
404
405     protected String getExistingAAIVrfConfiguration(RelatedInstance relatedVpnBinding,
406             org.onap.aai.domain.yang.L3Network aaiLocalNetwork)
407             throws JsonProcessingException, VrfBondingServiceException {
408         Optional<Relationships> relationshipsOp = new AAIResultWrapper(
409                 new AAICommonObjectMapperProvider().getMapper().writeValueAsString(aaiLocalNetwork)).getRelationships();
410         if (relationshipsOp.isPresent()) {
411             List<AAIResultWrapper> configurationsRelatedToLocalNetwork =
412                     relationshipsOp.get().getByType(AAIFluentTypeBuilder.Types.CONFIGURATION);
413             if (configurationsRelatedToLocalNetwork.size() > 1) {
414                 throw new VrfBondingServiceException(
415                         "Network: " + aaiLocalNetwork.getNetworkId() + " has more than 1 configuration related to it");
416             }
417             if (configurationsRelatedToLocalNetwork.size() == 1) {
418                 AAIResultWrapper configWrapper = configurationsRelatedToLocalNetwork.get(0);
419                 Optional<Configuration> relatedConfiguration = configWrapper.asBean(Configuration.class);
420                 if (relatedConfiguration.isPresent() && vrfConfigurationAlreadyExists(relatedVpnBinding,
421                         relatedConfiguration.get(), configWrapper)) {
422                     return relatedConfiguration.get().getConfigurationId();
423                 }
424             }
425         }
426         return null;
427     }
428
429     protected boolean vrfConfigurationAlreadyExists(RelatedInstance relatedVpnBinding, Configuration vrfConfiguration,
430             AAIResultWrapper configWrapper) throws VrfBondingServiceException {
431         if ("VRF-ENTRY".equalsIgnoreCase(vrfConfiguration.getConfigurationType())) {
432             Optional<Relationships> relationshipsConfigOp = configWrapper.getRelationships();
433             if (relationshipsConfigOp.isPresent()) {
434                 Optional<VpnBinding> relatedInfraVpnBindingOp =
435                         workflowActionUtils.extractRelationshipsVpnBinding(relationshipsConfigOp.get());
436                 if (relatedInfraVpnBindingOp.isPresent()) {
437                     VpnBinding relatedInfraVpnBinding = relatedInfraVpnBindingOp.get();
438                     if (!relatedInfraVpnBinding.getVpnId().equalsIgnoreCase(relatedVpnBinding.getInstanceId())) {
439                         throw new VrfBondingServiceException("Configuration: " + vrfConfiguration.getConfigurationId()
440                                 + " is not connected to the same vpn binding id provided in request: "
441                                 + relatedVpnBinding.getInstanceId());
442                     } else {
443                         return true;
444                     }
445                 }
446             }
447         }
448         return false;
449     }
450
451     public boolean containsWorkflowType(List<Resource> resourceList, WorkflowType workflowType) {
452         return resourceList.stream().anyMatch(resource -> resource.getResourceType().equals(workflowType));
453     }
454
455     public boolean isNetworkCollectionInTheResourceList(List<Resource> resourceList) {
456         return resourceList.stream().anyMatch(x -> WorkflowType.NETWORKCOLLECTION == x.getResourceType());
457     }
458
459     public CollectionResourceCustomization findCatalogNetworkCollection(DelegateExecution execution,
460             org.onap.so.db.catalog.beans.Service service) {
461         CollectionResourceCustomization networkCollection = null;
462         int count = 0;
463         for (CollectionResourceCustomization collectionCust : service.getCollectionResourceCustomizations()) {
464             if (catalogDbClient.getNetworkCollectionResourceCustomizationByID(
465                     collectionCust.getModelCustomizationUUID()) != null) {
466                 networkCollection = collectionCust;
467                 count++;
468             }
469         }
470         if (count == 0) {
471             return null;
472         } else if (count > 1) {
473             buildAndThrowException(execution,
474                     "Found multiple Network Collections in the Service model, only one per Service is supported.");
475         }
476         return networkCollection;
477     }
478
479     protected void buildAndThrowException(DelegateExecution execution, String msg) {
480         logger.error(msg);
481         execution.setVariable(WORKFLOW_ACTION_ERROR_MESSAGE, msg);
482         exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, msg);
483     }
484 }