1 package org.onap.so.bpmn.infrastructure.workflow.tasks.validators;
3 import com.fasterxml.jackson.databind.ObjectMapper;
4 import java.io.IOException;
6 import java.util.Optional;
8 import java.util.function.Function;
9 import java.util.function.Predicate;
10 import java.util.stream.Collectors;
11 import org.onap.so.bpmn.common.BBConstants;
12 import org.onap.so.bpmn.common.BuildingBlockExecution;
13 import org.onap.so.bpmn.common.listener.validation.PreWorkflowValidator;
14 import org.onap.so.bpmn.infrastructure.workflow.tasks.Resource;
15 import org.onap.so.bpmn.infrastructure.workflow.tasks.WorkflowType;
16 import org.onap.so.db.catalog.beans.Service;
17 import org.onap.so.db.catalog.beans.VnfResourceCustomization;
18 import org.onap.so.db.catalog.client.CatalogDbClient;
19 import org.onap.so.serviceinstancebeans.RequestDetails;
20 import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
21 import org.springframework.stereotype.Component;
24 public class UpgradePreWorkflowValidator implements PreWorkflowValidator {
26 private static final String ERR_MSG_INVARIANT_MISMATCH =
27 "Request service modelInvariantId: %s does not match AAI service modelInvariantId: %s";
28 private static final String ERR_MSG_EXISTING_VNFS_NOT_SUPPORTED =
29 "Existing vnfs in AAI are not supported by service model. Unsupported vnfCustomizationIds: %s";
31 private final CatalogDbClient catalogDbClient;
33 private static final Function<WorkflowType, Predicate<Resource>> resourceType =
34 workflowType -> resource -> resource.getResourceType() == workflowType;
36 public UpgradePreWorkflowValidator(CatalogDbClient catalogDbClient) {
37 this.catalogDbClient = catalogDbClient;
41 public boolean shouldRunFor(String requestAction) {
42 return "upgradeInstance".equalsIgnoreCase(requestAction);
46 public Optional<String> validate(BuildingBlockExecution execution) {
47 final String bpmnRequest = execution.getVariable(BBConstants.G_BPMN_REQUEST);
48 List<Resource> resources = execution.getVariable("resources");
50 Optional<ServiceInstancesRequest> sir = parseBpmnRequest(bpmnRequest);
52 return Optional.of("Failed to parse bpmnRequest");
54 var requestDetails = sir.get().getRequestDetails();
55 String requestModelInvariantId = requestDetails.getModelInfo().getModelInvariantId();
57 Optional<String> modelInvariantMismatch = validateInvariantId(resources, requestModelInvariantId);
58 if (modelInvariantMismatch.isPresent()) {
59 return modelInvariantMismatch;
62 List<Resource> aaiVnfResources = getVnfResources(resources);
63 if (aaiVnfResources.isEmpty()) {
64 return Optional.empty();
67 String serviceModelUuid = requestDetails.getModelInfo().getModelUuid();
68 Optional<List<VnfResourceCustomization>> vnfResourceCustomizations =
69 getVnfResourceCustomizations(serviceModelUuid);
70 if (vnfResourceCustomizations.isEmpty()) {
71 return Optional.of(String.format("Service model: %s does not exist in catalog db.", serviceModelUuid));
74 return validateExistingVnfsSupported(aaiVnfResources, vnfResourceCustomizations.get());
77 private Optional<ServiceInstancesRequest> parseBpmnRequest(String bpmnRequest) {
79 return Optional.of(new ObjectMapper().readValue(bpmnRequest, ServiceInstancesRequest.class));
80 } catch (IOException e) {
81 return Optional.empty();
85 private Optional<String> validateInvariantId(List<Resource> resources, String requestModelInvariantId) {
86 return resources.stream().filter(resourceType.apply(WorkflowType.SERVICE)).findFirst()
87 .filter(r -> !r.getModelInvariantId().equals(requestModelInvariantId))
88 .map(r -> String.format(ERR_MSG_INVARIANT_MISMATCH, requestModelInvariantId, r.getModelInvariantId()));
91 private Optional<List<VnfResourceCustomization>> getVnfResourceCustomizations(String serviceModelUuid) {
92 return Optional.ofNullable(catalogDbClient.getServiceByModelUUID(serviceModelUuid))
93 .map(Service::getVnfCustomizations);
96 private List<Resource> getVnfResources(List<Resource> resources) {
97 return resources.stream().filter(resourceType.apply(WorkflowType.VNF)).collect(Collectors.toList());
100 private Optional<String> validateExistingVnfsSupported(List<Resource> vnfResources,
101 List<VnfResourceCustomization> vnfResourceCustomizations) {
102 Set<String> modeledVnfCustomizationIds = vnfResourceCustomizations.stream()
103 .map(VnfResourceCustomization::getModelCustomizationUUID).collect(Collectors.toSet());
105 String unsupportedVnfCustomizationIds = vnfResources.stream().map(Resource::getVnfCustomizationId)
106 .filter(id -> !modeledVnfCustomizationIds.contains(id)).collect(Collectors.joining(","));
108 if (unsupportedVnfCustomizationIds.isEmpty()) {
109 return Optional.empty();
111 return Optional.of(String.format(ERR_MSG_EXISTING_VNFS_NOT_SUPPORTED, unsupportedVnfCustomizationIds));