2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Modifications Copyright (c) 2019 Samsung
8 * ================================================================================
9 * Modifications Copyright (c) 2020 Nokia
10 * ================================================================================
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 * ============LICENSE_END=========================================================
25 package org.onap.so.bpmn.infrastructure.workflow.tasks;
27 import org.onap.so.bpmn.common.BuildingBlockExecution;
28 import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
29 import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
30 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
31 import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
32 import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
33 import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
34 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
35 import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
36 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
37 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
38 import org.onap.so.client.exception.BBObjectNotFoundException;
39 import org.onap.so.client.exception.ExceptionBuilder;
40 import org.onap.so.client.exception.OrchestrationStatusValidationException;
41 import org.onap.so.db.catalog.beans.BuildingBlockDetail;
42 import org.onap.so.db.catalog.beans.OrchestrationStatus;
43 import org.onap.so.db.catalog.beans.OrchestrationStatusStateTransitionDirective;
44 import org.onap.so.db.catalog.beans.OrchestrationStatusValidationDirective;
45 import org.onap.so.db.catalog.beans.ResourceType;
46 import org.onap.so.db.catalog.client.CatalogDbClient;
47 import org.onap.so.db.request.beans.InfraActiveRequests;
48 import org.onap.so.db.request.client.RequestsDbClient;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51 import org.springframework.beans.factory.annotation.Autowired;
52 import org.springframework.stereotype.Component;
53 import org.springframework.web.client.HttpClientErrorException;
54 import java.util.EnumSet;
58 public class OrchestrationStatusValidator {
59 private static final Logger logger = LoggerFactory.getLogger(OrchestrationStatusValidator.class);
61 private static final String BUILDING_BLOCK_DETAIL_NOT_FOUND =
62 "Building Block (%s) not set up in Orchestration_Status_Validation table in CatalogDB.";
63 private static final String UNKNOWN_RESOURCE_TYPE =
64 "Building Block (%s) not set up correctly in Orchestration_Status_Validation table in CatalogDB. ResourceType=(%s), TargetAction=(%s)";
65 private static final String ORCHESTRATION_VALIDATION_FAIL =
66 "Orchestration Status Validation failed. ResourceType=(%s), TargetAction=(%s), OrchestrationStatus=(%s)";
67 private static final String ORCHESTRATION_STATUS_VALIDATION_RESULT = "orchestrationStatusValidationResult";
68 private static final String RESOURCE_EXIST_STATUS_MESSAGE =
69 "The %s was found to already exist, thus no new %s was created in the cloud via this request";
70 private static final String RESOURCE_NOT_EXIST_STATUS_MESSAGE =
71 "The %s was not found, thus no %s was deleted in the cloud via this request";
72 private static final Set<ResourceType> cloudResources =
73 EnumSet.of(ResourceType.VF_MODULE, ResourceType.VOLUME_GROUP, ResourceType.NETWORK);
76 private ExtractPojosForBB extractPojosForBB;
78 private ExceptionBuilder exceptionBuilder;
80 private CatalogDbClient catalogDbClient;
82 RequestsDbClient requestDBClient;
86 * This method validate's the status of the OrchestrationStatus against the buildingBlockDetail ResourceType
88 public void validateOrchestrationStatus(BuildingBlockExecution execution) {
90 execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT, null);
91 String buildingBlockFlowName = execution.getFlowToBeCalled();
92 BuildingBlockDetail buildingBlockDetail = catalogDbClient.getBuildingBlockDetail(buildingBlockFlowName);
94 if (buildingBlockDetail == null) {
95 throw new OrchestrationStatusValidationException(
96 String.format(BUILDING_BLOCK_DETAIL_NOT_FOUND, buildingBlockFlowName));
99 OrchestrationStatus orchestrationStatus =
100 getOrchestrationStatus(execution, buildingBlockFlowName, buildingBlockDetail);
101 if (buildingBlockDetail.getResourceType().equals(ResourceType.NO_VALIDATE)) {
105 if (orchestrationStatus == null) {
106 throw new OrchestrationStatusValidationException(
107 "The resource's orchstration status is null. Cannot perform task on a null orchestration status");
109 OrchestrationStatusStateTransitionDirective orchestrationStatusStateTransitionDirective = catalogDbClient
110 .getOrchestrationStatusStateTransitionDirective(buildingBlockDetail.getResourceType(),
111 orchestrationStatus, buildingBlockDetail.getTargetAction());
113 if (orchestrationStatusStateTransitionDirective
114 .getFlowDirective() == OrchestrationStatusValidationDirective.FAIL) {
115 throw new OrchestrationStatusValidationException(
116 String.format(ORCHESTRATION_VALIDATION_FAIL, buildingBlockDetail.getResourceType(),
117 buildingBlockDetail.getTargetAction(), orchestrationStatus));
120 execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT,
121 orchestrationStatusStateTransitionDirective.getFlowDirective());
123 if (buildingBlockFlowName.matches("Create(.*)|Delete(.*)") && orchestrationStatusStateTransitionDirective
124 .getFlowDirective() == OrchestrationStatusValidationDirective.SILENT_SUCCESS) {
126 updatedResourceStatus(execution, buildingBlockDetail);
129 } catch (BBObjectNotFoundException ex) {
131 "Error occurred for bb object notfound in OrchestrationStatusValidator validateOrchestrationStatus ",
133 if (execution.getFlowToBeCalled().contains("Unassign")) {
134 execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT,
135 OrchestrationStatusValidationDirective.SILENT_SUCCESS);
137 exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, ex);
139 } catch (Exception e) {
140 logger.error("Exception occurred", e);
141 exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e);
145 private OrchestrationStatus getOrchestrationStatus(BuildingBlockExecution execution, String buildingBlockFlowName,
146 BuildingBlockDetail buildingBlockDetail)
147 throws BBObjectNotFoundException, OrchestrationStatusValidationException {
148 OrchestrationStatus orchestrationStatus = null;
150 switch (buildingBlockDetail.getResourceType()) {
152 ServiceInstance serviceInstance =
153 extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
154 orchestrationStatus = serviceInstance.getOrchestrationStatus();
158 GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
159 orchestrationStatus = genericVnf.getOrchestrationStatus();
162 VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
163 orchestrationStatus = vfModule.getOrchestrationStatus();
166 VolumeGroup volumeGroup = extractPojosForBB.extractByKey(execution, ResourceKey.VOLUME_GROUP_ID);
167 orchestrationStatus = volumeGroup.getOrchestrationStatus();
170 L3Network network = extractPojosForBB.extractByKey(execution, ResourceKey.NETWORK_ID);
171 orchestrationStatus = network.getOrchestrationStatus();
173 case NETWORK_COLLECTION:
174 Collection networkCollection = getNetworkCollection(execution);
175 orchestrationStatus = networkCollection.getOrchestrationStatus();
178 Configuration configuration = extractPojosForBB.extractByKey(execution, ResourceKey.CONFIGURATION_ID);
179 orchestrationStatus = configuration.getOrchestrationStatus();
182 InstanceGroup instanceGroup = extractPojosForBB.extractByKey(execution, ResourceKey.INSTANCE_GROUP_ID);
183 orchestrationStatus = instanceGroup.getOrchestrationStatus();
186 // short circuit and exit method
187 execution.setVariable(ORCHESTRATION_STATUS_VALIDATION_RESULT,
188 OrchestrationStatusValidationDirective.VALIDATION_SKIPPED);
191 // can't currently get here, so not tested. Added in case enum is expanded
192 // without a change to this
194 throw new OrchestrationStatusValidationException(
195 String.format(UNKNOWN_RESOURCE_TYPE, buildingBlockFlowName,
196 buildingBlockDetail.getResourceType(), buildingBlockDetail.getTargetAction()));
198 return orchestrationStatus;
201 private Collection getNetworkCollection(BuildingBlockExecution execution) throws BBObjectNotFoundException {
202 ServiceInstance serviceInst = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID);
203 return serviceInst.getCollection();
206 private void updatedResourceStatus(BuildingBlockExecution execution, BuildingBlockDetail buildingBlockDetail) {
208 if (cloudResources.contains(buildingBlockDetail.getResourceType())) {
209 String resource = buildingBlockDetail.getResourceType().toString();
211 String resourceId = execution.getLookupMap()
212 .get(ResourceKey.valueOf(buildingBlockDetail.getResourceType().getResourceKey()));
214 String resourceStatusMessage = RESOURCE_NOT_EXIST_STATUS_MESSAGE;
215 if (execution.getFlowToBeCalled().matches("Create(.*)")) {
216 resourceStatusMessage = RESOURCE_EXIST_STATUS_MESSAGE;
219 updateRequestsDb(resourceId, String.format(resourceStatusMessage, resource, resource));
224 private void updateRequestsDb(String requestId, String resourceStatusMessage) {
225 InfraActiveRequests request = new InfraActiveRequests();
226 request.setRequestId(requestId);
227 request.setResourceStatusMessage(resourceStatusMessage);
229 requestDBClient.patchInfraActiveRequests(request);
230 } catch (HttpClientErrorException e) {
231 logger.warn("Unable to update active request resource status");