diff options
Diffstat (limited to 'bpmn/so-bpmn-tasks/src/main')
7 files changed, 459 insertions, 54 deletions
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/AbstractServiceLevelPreparable.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelPreparable.java index 36db549486..e26195158d 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/AbstractServiceLevelPreparable.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/ServiceLevelPreparable.java @@ -20,40 +20,58 @@ package org.onap.so.bpmn.infrastructure.service.level; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.onap.so.bpmn.infrastructure.service.level.impl.ServiceLevelConstants; import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.db.catalog.beans.Workflow; +import org.onap.so.db.catalog.client.CatalogDbClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import java.util.ArrayList; -import java.util.List; /** - * Abstract class for Service level upgrade Execution, it should be extended for service level upgrade tasks. + * Parent class for Service level upgrade Execution, it should be extended for service level upgrade tasks. */ -public abstract class AbstractServiceLevelPreparable { +public class ServiceLevelPreparable { - protected static final String WORKFLOW_TO_INVOKE = "healthCheckWorkflow"; - protected static final String GENERIC_PNF_HEALTH_CHECK_WORKFLOW = "GenericPnfHealthCheck"; - protected static final String GENERIC_PNF_SOFTWARE_UPGRADE_WORKFLOW = "GenericPnfSoftwareUpgrade"; - protected static final String RESOURCE_TYPE = "RESOURCE_TYPE"; - protected static final int ERROR_CODE = 601; - - // TODO This value needs to be updated once vnf health check workflow is available - protected static final String GENERIC_VNF_HEALTH_CHECK_WORKFLOW = "GenericVNFHealthCheck"; - - protected static final Logger LOG = LoggerFactory.getLogger(AbstractServiceLevelPreparable.class); + protected static final Logger LOG = LoggerFactory.getLogger(ServiceLevelPreparable.class); @Autowired protected ExceptionBuilder exceptionBuilder; + @Autowired + protected CatalogDbClient catalogDbClient; + /** - * This method fetches workflow names to be invoked based on the controller scope . + * Fetches workflow names based on the controller scope and operation name. * * @param scope Controller scope + * @param operationName healthcheck/softwareUpgrade * @return String value of Workflow name */ - protected abstract String fetchWorkflowUsingScope(DelegateExecution execution, final String scope); + protected String fetchWorkflowUsingScope(final String scope, String operationName) { + Optional<String> wflName = Optional.empty(); + try { + List<Workflow> workflows = catalogDbClient.findWorkflowByOperationName(operationName); + if (!workflows.isEmpty()) { + wflName = Optional.ofNullable( + workflows.stream().filter(workflow -> workflow.getResourceTarget().equalsIgnoreCase(scope)) + .findFirst().get().getName()); + } + } catch (Exception e) { + // do nothing and assign the default workflow in finally + LOG.error("Error occurred while fetching workflow name from CatalogDb {}", e); + } finally { + if (wflName.isEmpty()) { + wflName = Optional.of(ServiceLevelConstants.WORKFLOW_OPERATIONS_MAP.get(operationName).get(scope)); + } + } + return wflName.get(); + + } /** * This method validates the execution parameters to be passed for health check workflow. @@ -61,8 +79,7 @@ public abstract class AbstractServiceLevelPreparable { * @param execution Delegate execution obj * @param scope Controller scope * Throws workflow exception if validation fails */ - protected void validateParamsWithScope(DelegateExecution execution, final String scope, List<String> params) - throws Exception { + protected void validateParamsWithScope(DelegateExecution execution, final String scope, List<String> params) { List<String> invalidVariables = new ArrayList<>(); for (String param : params) { if (!execution.hasVariable(param) || execution.getVariable(param) == null @@ -72,7 +89,7 @@ public abstract class AbstractServiceLevelPreparable { } if (invalidVariables.size() > 0) { LOG.error("Validation error for the {} health check attributes: {}", scope, invalidVariables); - exceptionBuilder.buildAndThrowWorkflowException(execution, ERROR_CODE, + exceptionBuilder.buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, "Validation of health check workflow parameters failed for the scope: " + scope); } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelConstants.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelConstants.java new file mode 100644 index 0000000000..d94641846d --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelConstants.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.infrastructure.service.level.impl; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class ServiceLevelConstants { + public static final String BPMN_REQUEST = "bpmnRequest"; + public static final String RESOURCE_TYPE = "resourceType"; + public static final String SERVICE_INSTANCE_ID = "serviceInstanceId"; + public static final String PNF_NAME = "pnfName"; + public static final String PNF = "pnf"; + public static final String VNF = "vnf"; + public static final String EMPTY_STRING = ""; + public static final String HEALTH_CHECK_WORKFLOW_TO_INVOKE = "healthCheckWorkflow"; + public static final String SOFTWARE_WORKFLOW_TO_INVOKE = "softwareUpgradeWorkflow"; + public static final String HEALTH_CHECK_OPERATION = "ResourceHealthCheck"; + public static final String SW_UP_OPERATION = "ResourceSoftwareUpgrade"; + public static final String CONTROLLER_STATUS = "ControllerStatus"; + public static final int ERROR_CODE = 601; + + // TODO GenericVNFHealthCheck and GenericVnfSoftwareUpgrade workflow names should be updated once the workflow is + // implemented. + public static final Map<String, String> DEFAULT_HEALTH_CHECK_WORKFLOWS = + Map.of(PNF, "GenericPnfHealthCheck", VNF, "GenericVNFHealthCheck"); + + public static final Map<String, String> DEFAULT_SOFTWARE_UP_WORKFLOWS = + Map.of(PNF, "PNFSoftwareUpgrade", VNF, "GenericVnfSoftwareUpgrade"); + + // Maps operation name with workflows + public static final Map<String, Map<String, String>> WORKFLOW_OPERATIONS_MAP = Map.of(HEALTH_CHECK_OPERATION, + DEFAULT_HEALTH_CHECK_WORKFLOWS, SW_UP_OPERATION, DEFAULT_SOFTWARE_UP_WORKFLOWS); + + public static final List<String> VALID_CONTROLLER_SCOPE = Arrays.asList(PNF, VNF); + + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPostcheck.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPostcheck.java new file mode 100644 index 0000000000..fad28e315e --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPostcheck.java @@ -0,0 +1,13 @@ +package org.onap.so.bpmn.infrastructure.service.level.impl; + +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.springframework.stereotype.Component; + +@Component +public class ServiceLevelPostcheck implements JavaDelegate { + @Override + public void execute(DelegateExecution delegateExecution) throws Exception { + // TODO : Set serviceInstance to aai + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPreparation.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPreparation.java index 52521ce16b..59884ecbc2 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPreparation.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelPreparation.java @@ -20,12 +20,14 @@ package org.onap.so.bpmn.infrastructure.service.level.impl; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; -import org.onap.so.bpmn.infrastructure.service.level.AbstractServiceLevelPreparable; +import org.onap.so.bpmn.infrastructure.service.level.ServiceLevelPreparable; import org.springframework.stereotype.Component; -import java.util.Arrays; -import java.util.List; /** @@ -33,45 +35,39 @@ import java.util.List; * validation. */ @Component("ServiceLevelPreparation") -public class ServiceLevelPreparation extends AbstractServiceLevelPreparable implements JavaDelegate { +public class ServiceLevelPreparation extends ServiceLevelPreparable implements JavaDelegate { + + private static final List<String> PNF_HEALTH_CHECK_PARAMS = Arrays.asList(ServiceLevelConstants.SERVICE_INSTANCE_ID, + ServiceLevelConstants.RESOURCE_TYPE, ServiceLevelConstants.BPMN_REQUEST, ServiceLevelConstants.PNF_NAME); - // Health check parameters to be validated for pnf resource - private static final List<String> PNF_HC_PARAMS = Arrays.asList("SERVICE_MODEL_INFO", "SERVICE_INSTANCE_NAME", - "PNF_CORRELATION_ID", "MODEL_UUID", "PNF_UUID", "PRC_BLUEPRINT_NAME", "PRC_BLUEPRINT_VERSION", - "PRC_CUSTOMIZATION_UUID", "RESOURCE_CUSTOMIZATION_UUID_PARAM", "PRC_INSTANCE_NAME", "PRC_CONTROLLER_ACTOR", - "REQUEST_PAYLOAD"); + // TODO Update the list with vnf health check parameters if any validation needed + private static final List<String> VNF_HEALTH_CHECK_PARAMS = Collections.emptyList(); + + private static final Map<String, List<String>> HEALTH_CHECK_PARAMS_MAP = Map.of(ServiceLevelConstants.PNF, + PNF_HEALTH_CHECK_PARAMS, ServiceLevelConstants.VNF, VNF_HEALTH_CHECK_PARAMS); @Override public void execute(DelegateExecution execution) throws Exception { - if (execution.hasVariable(RESOURCE_TYPE) && execution.getVariable(RESOURCE_TYPE) != null) { - final String controllerScope = (String) execution.getVariable(RESOURCE_TYPE); + if (execution.hasVariable(ServiceLevelConstants.RESOURCE_TYPE) + && execution.getVariable(ServiceLevelConstants.RESOURCE_TYPE) != null) { + final String controllerScope = (String) execution.getVariable(ServiceLevelConstants.RESOURCE_TYPE); LOG.debug("Scope retrieved from delegate execution: " + controllerScope); - final String wflName = fetchWorkflowUsingScope(execution, controllerScope); - LOG.debug("Health check workflow fetched for the scope: {}", wflName); - validateParamsWithScope(execution, controllerScope, PNF_HC_PARAMS); - LOG.info("Parameters validated successfully for {}", wflName); - execution.setVariable(WORKFLOW_TO_INVOKE, wflName); + if (ServiceLevelConstants.VALID_CONTROLLER_SCOPE.contains(controllerScope)) { + final String wflName = + fetchWorkflowUsingScope(controllerScope, ServiceLevelConstants.HEALTH_CHECK_OPERATION); + LOG.debug("Health check workflow fetched for the scope: {} is: {}", controllerScope, wflName); + validateParamsWithScope(execution, controllerScope, HEALTH_CHECK_PARAMS_MAP.get(controllerScope)); + LOG.info("Parameters validated successfully for {}", wflName); + execution.setVariable(ServiceLevelConstants.HEALTH_CHECK_WORKFLOW_TO_INVOKE, wflName); + execution.setVariable(ServiceLevelConstants.CONTROLLER_STATUS, ServiceLevelConstants.EMPTY_STRING); + } else { + exceptionBuilder.buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, + "Invalid Controller scope to prepare resource level health check"); + } } else { - exceptionBuilder.buildAndThrowWorkflowException(execution, ERROR_CODE, - "Controller scope not found to invoke resource level health check"); - } - } - - @Override - public String fetchWorkflowUsingScope(DelegateExecution execution, final String scope) { - String wflName = null; - switch (scope.toLowerCase()) { - case "pnf": - wflName = GENERIC_PNF_HEALTH_CHECK_WORKFLOW; - break; - case "vnf": - wflName = GENERIC_VNF_HEALTH_CHECK_WORKFLOW; - break; - default: - exceptionBuilder.buildAndThrowWorkflowException(execution, ERROR_CODE, - "No valid health check work flow retrieved for the scope: " + scope); + exceptionBuilder.buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, + "Resource type not found in the execution to invoke resource level health check"); } - return wflName; } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelRequestDispatcher.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelRequestDispatcher.java new file mode 100644 index 0000000000..5b20a86cb7 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelRequestDispatcher.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.infrastructure.service.level.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aaiclient.client.aai.AAIRestClientI; +import org.onap.aaiclient.client.aai.AAIRestClientImpl; +import org.onap.so.bpmn.core.json.JsonUtils; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.serviceinstancebeans.RequestDetails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.util.Optional; +import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*; + +/** + * This implementation of {@link JavaDelegate} is used to populate the execution object for Service level upgrade + */ +@Component +public class ServiceLevelRequestDispatcher implements JavaDelegate { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private ExceptionBuilder exceptionUtil; + + @Autowired + private ObjectMapper mapper; + + @Override + public void execute(DelegateExecution delegateExecution) throws Exception { + logger.debug("Running execute block for activity id: {}, name: {}", delegateExecution.getCurrentActivityId(), + delegateExecution.getCurrentActivityName()); + + RequestDetails bpmnRequestDetails = requestVerification(delegateExecution); + + final String serviceInstanceId = String.valueOf(delegateExecution.getVariable(SERVICE_INSTANCE_ID)); + final String serviceType = bpmnRequestDetails.getRequestParameters().getSubscriptionServiceType(); + final String globalSubscriberId = bpmnRequestDetails.getSubscriberInfo().getGlobalSubscriberId(); + + final String modelInvariantId = bpmnRequestDetails.getModelInfo().getModelInvariantId(); + final String modelId = bpmnRequestDetails.getModelInfo().getModelUuid(); + final String modelVersion = bpmnRequestDetails.getModelInfo().getModelVersion(); + + if (ServiceLevelConstants.PNF.equalsIgnoreCase(serviceType)) { + getAndSetPnfNameFromServiceInstance(serviceInstanceId, serviceType, globalSubscriberId, delegateExecution); + } + + // TODO : handling for vnf + + logger.trace("Completed dispatcher request for ServiceLevelUpgrade."); + } + + private void getAndSetPnfNameFromServiceInstance(final String serviceInstanceId, final String serviceType, + final String globalSubscriberId, DelegateExecution delegateExecution) { + + AAIRestClientI restClient = new AAIRestClientImpl(); + + Optional<ServiceInstance> optionalSi = + restClient.getServiceInstanceById(serviceInstanceId, serviceType, globalSubscriberId); + + if (!optionalSi.isPresent()) { + + } + + optionalSi.ifPresentOrElse(serviceInstance -> { + final String pnfName = serviceInstance.getRelationshipList().getRelationship().stream() + .filter(x -> x.getRelatedTo().contains("pnf")).findFirst().get().getRelationshipData().stream() + .filter(data -> data.getRelationshipKey().contains("pnf.pnf-name")).findFirst().get() + .getRelationshipValue(); + if (pnfName == null || pnfName.isEmpty()) { + logger.warn( + "Unable to find the PNF for service instance id: " + serviceInstance.getServiceInstanceId()); + return; + } + delegateExecution.setVariable(ServiceLevelConstants.PNF_NAME, pnfName); + delegateExecution.setVariable(ServiceLevelConstants.RESOURCE_TYPE, ServiceLevelConstants.PNF); + }, () -> { + throwExceptionWithWarn(delegateExecution, "Unable to find the service instance: " + serviceInstanceId); + }); + } + + private RequestDetails requestVerification(DelegateExecution delegateExecution) throws IOException { + RequestDetails bpmnRequestDetails = mapper.readValue(JsonUtils.getJsonValue( + String.valueOf(delegateExecution.getVariable(ServiceLevelConstants.BPMN_REQUEST)), "requestDetails"), + RequestDetails.class); + + throwIfNull(delegateExecution, bpmnRequestDetails.getModelInfo(), SERVICE_MODEL_INFO); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestInfo(), "RequestInfo"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters(), "RequestParameters"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters().getUserParams(), "UserParams"); + + return bpmnRequestDetails; + } + + private void throwIfNull(DelegateExecution delegateExecution, Object obj, String param) { + if (obj == null) { + throwExceptionWithWarn(delegateExecution, + "Unable to find the parameter: " + param + " in the execution context"); + } + } + + private void throwExceptionWithWarn(DelegateExecution delegateExecution, String exceptionMsg) { + logger.warn(exceptionMsg); + exceptionUtil.buildAndThrowWorkflowException(delegateExecution, ServiceLevelConstants.ERROR_CODE, exceptionMsg); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelUpgrade.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelUpgrade.java new file mode 100644 index 0000000000..9d7d8efb65 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/ServiceLevelUpgrade.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.infrastructure.service.level.impl; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.onap.so.bpmn.infrastructure.service.level.ServiceLevelPreparable; +import org.springframework.stereotype.Component; + +@Component +public class ServiceLevelUpgrade extends ServiceLevelPreparable implements JavaDelegate { + + private static final List<String> PNF_SOFTWARE_UP_PARAMS = Arrays.asList(ServiceLevelConstants.SERVICE_INSTANCE_ID, + ServiceLevelConstants.RESOURCE_TYPE, ServiceLevelConstants.BPMN_REQUEST, ServiceLevelConstants.PNF_NAME); + + // TODO Update the list with vnf software upgrade parameters if any validation needed + private static final List<String> VNF_SOFTWARE_UP_PARAMS = Collections.emptyList(); + + private static final Map<String, List<String>> SOFTWARE_UP_PARAMS_MAP = Map.of(ServiceLevelConstants.PNF, + PNF_SOFTWARE_UP_PARAMS, ServiceLevelConstants.VNF, VNF_SOFTWARE_UP_PARAMS); + + + @Override + public void execute(DelegateExecution execution) throws Exception { + if (execution.hasVariable(ServiceLevelConstants.RESOURCE_TYPE) + && execution.getVariable(ServiceLevelConstants.RESOURCE_TYPE) != null) { + final String controllerScope = (String) execution.getVariable(ServiceLevelConstants.RESOURCE_TYPE); + LOG.debug("Scope retrieved from delegate execution: " + controllerScope); + if (ServiceLevelConstants.VALID_CONTROLLER_SCOPE.contains(controllerScope)) { + final String wflName = fetchWorkflowUsingScope(controllerScope, ServiceLevelConstants.SW_UP_OPERATION); + LOG.debug("Software Upgrade workflow fetched for the scope: {} is: {}", controllerScope, wflName); + validateParamsWithScope(execution, controllerScope, SOFTWARE_UP_PARAMS_MAP.get(controllerScope)); + LOG.info("Parameters validated successfully for {}", wflName); + execution.setVariable(ServiceLevelConstants.SOFTWARE_WORKFLOW_TO_INVOKE, wflName); + execution.setVariable(ServiceLevelConstants.CONTROLLER_STATUS, ""); + } else { + exceptionBuilder.buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, + "Invalid Controller scope for resource level software upgrade"); + } + } else { + exceptionBuilder.buildAndThrowWorkflowException(execution, ServiceLevelConstants.ERROR_CODE, + "Resource type not found in the execution to invoke resource level software upgrade"); + } + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/UpdateServiceInstanceInAai.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/UpdateServiceInstanceInAai.java new file mode 100644 index 0000000000..c9bd607b8b --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/service/level/impl/UpdateServiceInstanceInAai.java @@ -0,0 +1,123 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ +package org.onap.so.bpmn.infrastructure.service.level.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.onap.aai.domain.yang.ServiceInstance; +import org.onap.aaiclient.client.aai.AAIRestClientI; +import org.onap.aaiclient.client.aai.AAIRestClientImpl; +import org.onap.so.bpmn.core.json.JsonUtils; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.serviceinstancebeans.RequestDetails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.util.Optional; +import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.SERVICE_MODEL_INFO; + +@Component +public class UpdateServiceInstanceInAai implements JavaDelegate { + + @Autowired + private ExceptionBuilder exceptionUtil; + + private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final String BPMN_REQUEST = "bpmnRequest"; + private static final String PNF_RESOURCE = "pnf"; + private static final String SERVICE_INSTANCE_ID = "serviceInstanceId"; + + // ERROR CODE for variable not found in the delegation Context + private static final int ERROR_CODE = 601; + + @Autowired + private ObjectMapper mapper; + + @Override + public void execute(DelegateExecution delegateExecution) throws Exception { + logger.debug("Running execute block for activity id: {}, name: {}", delegateExecution.getCurrentActivityId(), + delegateExecution.getCurrentActivityName()); + + RequestDetails bpmnRequestDetails = requestVerification(delegateExecution); + + final String serviceInstanceId = String.valueOf(delegateExecution.getVariable(SERVICE_INSTANCE_ID)); + final String serviceType = bpmnRequestDetails.getRequestParameters().getSubscriptionServiceType(); + final String globalSubscriberId = bpmnRequestDetails.getSubscriberInfo().getGlobalSubscriberId(); + + final String modelId = bpmnRequestDetails.getModelInfo().getModelUuid(); + + if (PNF_RESOURCE.equalsIgnoreCase(serviceType)) { + getAndSetServiceInstance(serviceInstanceId, serviceType, globalSubscriberId, modelId); + } + + // TODO : handling for vnf + + logger.trace("Completed updating request for ServiceLevelUpgrade."); + } + + private void getAndSetServiceInstance(final String serviceInstanceId, final String serviceType, + final String globalSubscriberId, String modelVersionId) { + + AAIRestClientI restClient = new AAIRestClientImpl(); + + Optional<ServiceInstance> optionalSi = + restClient.getServiceInstanceById(serviceInstanceId, serviceType, globalSubscriberId); + + if (!optionalSi.isPresent()) { + // throwExceptionWithWarn(delegateExecution, "Unable to find the service instance: " + serviceInstanceId); + } + + ServiceInstance serviceInstance = optionalSi.get(); + + serviceInstance.setModelVersionId(modelVersionId); + + restClient.updateServiceInstance(serviceInstanceId, serviceType, globalSubscriberId, serviceInstance); + + } + + private RequestDetails requestVerification(DelegateExecution delegateExecution) throws IOException { + RequestDetails bpmnRequestDetails = mapper.readValue( + JsonUtils.getJsonValue(String.valueOf(delegateExecution.getVariable(BPMN_REQUEST)), "requestDetails"), + RequestDetails.class); + + throwIfNull(delegateExecution, bpmnRequestDetails.getModelInfo(), SERVICE_MODEL_INFO); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestInfo(), "RequestInfo"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters(), "RequestParameters"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters().getUserParams(), "UserParams"); + + return bpmnRequestDetails; + } + + private void throwIfNull(DelegateExecution delegateExecution, Object obj, String param) { + if (obj == null) { + throwExceptionWithWarn(delegateExecution, + "Unable to find the parameter: " + param + " in the execution context"); + } + } + + private void throwExceptionWithWarn(DelegateExecution delegateExecution, String exceptionMsg) { + logger.warn(exceptionMsg); + exceptionUtil.buildAndThrowWorkflowException(delegateExecution, ERROR_CODE, exceptionMsg); + } + +} |