/*- * ============LICENSE_START======================================================= * ONAP - SO * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Modifications Copyright (c) 2019 Samsung * ================================================================================ * 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. * ============LICENSE_END========================================================= */ package org.onap.so.bpmn.infrastructure.scripts import org.onap.so.logger.LoggingAnchor import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.common.scripts.MsoUtils import org.onap.so.bpmn.core.WorkflowException import org.onap.logging.filter.base.ErrorCode import org.onap.so.logger.MessageEnum import org.slf4j.Logger import org.slf4j.LoggerFactory public class UpdateVfModule extends AbstractServiceTaskProcessor { private static final Logger logger = LoggerFactory.getLogger( UpdateVfModule.class); ExceptionUtil exceptionUtil = new ExceptionUtil() /** * Initialize the flow's variables. * * @param execution The flow's execution instance. */ public void initProcessVariables(DelegateExecution execution) { execution.setVariable('prefix', 'UPDVfMod_') execution.setVariable('UPDVfMod_Request', null) execution.setVariable('UPDVfMod_requestInfo', null) execution.setVariable('UPDVfMod_requestId', null) execution.setVariable('UPDVfMod_source', null) execution.setVariable('UPDVfMod_vnfInputs', null) execution.setVariable('UPDVfMod_vnfId', null) execution.setVariable('UPDVfMod_vfModuleId', null) execution.setVariable('UPDVfMod_tenantId', null) execution.setVariable('UPDVfMod_volumeGroupId', null) execution.setVariable('UPDVfMod_vnfParams', null) execution.setVariable('UPDVfMod_updateInfraRequest', null) execution.setVariable('UpdateVfModuleSuccessIndicator', false) } /** * Check for missing elements in the received request. * * @param execution The flow's execution instance. */ public void preProcessRequest(DelegateExecution execution) { def method = getClass().getSimpleName() + '.preProcessRequest(' + 'execution=' + execution.getId() + ')' logger.trace('Entered ' + method) try { initProcessVariables(execution) String request = validateRequest(execution) logger.debug("UpdateVfModule request: " + request) def requestInfo = getRequiredNodeXml(execution, request, 'request-info') execution.setVariable('UPDVfMod_requestInfo', requestInfo) execution.setVariable('UPDVfMod_requestId', getRequiredNodeText(execution, requestInfo, 'request-id')) execution.setVariable('UPDVfMod_source', getNodeTextForce(requestInfo, 'source')) def vnfInputs = getRequiredNodeXml(execution, request, 'vnf-inputs') execution.setVariable('UPDVfMod_vnfInputs', vnfInputs) execution.setVariable('UPDVfMod_vnfId', getRequiredNodeText(execution, vnfInputs, 'vnf-id')) execution.setVariable('UPDVfMod_vfModuleId', getRequiredNodeText(execution, vnfInputs, 'vf-module-id')) execution.setVariable('UPDVfMod_tenantId', getRequiredNodeText(execution, vnfInputs, 'tenant-id')) execution.setVariable('UPDVfMod_volumeGroupId', getNodeTextForce(vnfInputs, 'volume-group-id')) def vnfParams = utils.getNodeXml(request, 'vnf-params') execution.setVariable('UPDVfMod_vnfParams', vnfParams) logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in preProcessRequest(): ' + e.getMessage()) } } /** * Prepare and send the synchronous response for this flow. * * @param execution The flow's execution instance. */ public void sendSynchResponse(DelegateExecution execution) { def method = getClass().getSimpleName() + '.sendSynchResponse(' + 'execution=' + execution.getId() + ')' logger.trace('Entered ' + method) try { def requestInfo = execution.getVariable('UPDVfMod_requestInfo') def requestId = execution.getVariable('UPDVfMod_requestId') def source = execution.getVariable('UPDVfMod_source') def progress = getNodeTextForce(requestInfo, 'progress') if (progress.isEmpty()) { progress = '0' } def startTime = getNodeTextForce(requestInfo, 'start-time') if (startTime.isEmpty()) { startTime = System.currentTimeMillis() } def vnfInputs = execution.getVariable('UPDVfMod_vnfInputs') String synchResponse = """ ${MsoUtils.xmlEscape(requestId)} UPDATE_VF_MODULE IN_PROGRESS ${MsoUtils.xmlEscape(progress)} ${MsoUtils.xmlEscape(startTime)} ${MsoUtils.xmlEscape(source)} ${vnfInputs} """ synchResponse = utils.formatXml(synchResponse) sendWorkflowResponse(execution, 200, synchResponse) logger.debug("UpdateVfModule Synch Response: " + synchResponse) logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in sendSynchResponse(): ' + e.getMessage()) } } /** * Prepare the Request for invoking the DoUpdateVfModule subflow. * * NOTE: Currently, the method just logs passing through as the * incoming Request to this main flow is used as the Request to * the DoUpdateVfModule subflow. No preparation processing is * necessary. * * @param execution The flow's execution instance. */ public void prepDoUpdateVfModule(DelegateExecution execution) { def method = getClass().getSimpleName() + '.prepDoUpdateVfModule(' + 'execution=' + execution.getId() + ')' logger.trace('Entered ' + method) try { logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in prepDoUpdateVfModule(): ' + e.getMessage()) } } /** * Prepare the Request for updating the DB for this Infra Request. * * @param execution The flow's execution instance. */ public void prepUpdateInfraRequest(DelegateExecution execution) { def method = getClass().getSimpleName() + '.prepUpdateInfraRequest(' + 'execution=' + execution.getId() + ')' logger.trace('Entered ' + method) try { def requestId = execution.getVariable('UPDVfMod_requestId') def vnfId = execution.getVariable('UPDVfMod_vnfId') def vfModuleId = execution.getVariable('UPDVfMod_vfModuleId') def tenantId = execution.getVariable('UPDVfMod_tenantId') def volumeGroupId = execution.getVariable('UPDVfMod_volumeGroupId') String updateInfraRequest = """ ${MsoUtils.xmlEscape(requestId)} BPEL COMPLETE 100 ${MsoUtils.xmlEscape(vnfId)} ${MsoUtils.xmlEscape(vfModuleId)} ${MsoUtils.xmlEscape(tenantId)} ${MsoUtils.xmlEscape(volumeGroupId)} """ updateInfraRequest = utils.formatXml(updateInfraRequest) execution.setVariable('UPDVfMod_updateInfraRequest', updateInfraRequest) logger.debug('Request for Update Infra Request:\n' + updateInfraRequest) logger.debug("UpdateVfModule Infra Request: " + updateInfraRequest) logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildAndThrowWorkflowException(execution, 1002, 'Error in prepUpdateInfraRequest(): ' + e.getMessage()) } } /** * Builds a "CompletionHandler" request and stores it in the specified execution variable. * * @param execution the execution * @param resultVar the execution variable in which the result will be stored */ public void completionHandlerPrep(DelegateExecution execution, String resultVar) { def method = getClass().getSimpleName() + '.completionHandlerPrep(' + 'execution=' + execution.getId() + ', resultVar=' + resultVar + ')' logger.trace('Entered ' + method) try { def requestInfo = getVariable(execution, 'UPDVfMod_requestInfo') String content = """ ${requestInfo} MSO_ACTIVATE_BPEL """ content = utils.formatXml(content) logger.debug(resultVar + ' = ' + System.lineSeparator() + content) execution.setVariable(resultVar, content) logger.debug("UpdateVfModule CompletionHandler Request: " + content) logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildAndThrowWorkflowException(execution, 2000, 'Internal Error') } } /** * Builds a "FalloutHandler" request and stores it in the specified execution variable. * * @param execution the execution * @param resultVar the execution variable in which the result will be stored */ public void falloutHandlerPrep(DelegateExecution execution, String resultVar) { def method = getClass().getSimpleName() + '.falloutHandlerPrep(' + 'execution=' + execution.getId() + ', resultVar=' + resultVar + ')' logger.trace('Entered ' + method) try { def prefix = execution.getVariable('prefix') def request = getVariable(execution, prefix+'Request') def requestInformation = utils.getNodeXml(request, 'request-information', false) def WorkflowException workflowException = execution.getVariable("WorkflowException") def errorResponseCode = workflowException.getErrorCode() def errorResponseMsg = workflowException.getErrorMessage() def encErrorResponseMsg = "" if (errorResponseMsg != null) { encErrorResponseMsg = errorResponseMsg } String content = """ ${requestInformation} ${MsoUtils.xmlEscape(encErrorResponseMsg)} ${MsoUtils.xmlEscape(errorResponseCode)} """ content = utils.formatXml(content) logger.debug(resultVar + ' = ' + System.lineSeparator() + content) execution.setVariable(resultVar, content) logger.debug("UpdateVfModule fallOutHandler Request: " + content) logger.trace('Exited ' + method) } catch (BpmnError e) { throw e; } catch (Exception e) { logger.error(LoggingAnchor.FIVE, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), 'Caught exception in ' + method, "BPMN", ErrorCode.UnknownError.getValue(), "Exception is:\n" + e); exceptionUtil.buildWorkflowException(execution, 2000, 'Internal Error') } } }