From 36bcd566167f2f91c0e8e7a304fce5f6bc150776 Mon Sep 17 00:00:00 2001 From: Anand Date: Thu, 4 Jan 2018 19:35:51 -0500 Subject: Include impacted changes for APPC-346,APPC-348 Issue-ID: APPC-347 Change-Id: I399bc2a1e0dfd481e103032a373bb80fce5baf41 Signed-off-by: Anand --- .../activator/TransactionAbortedMarker.java | 158 +++++++++++ ...ransactionRecorderServiceNotFoundException.java | 32 +++ .../activator/WorkflowManagerActivator.java | 49 ++++ .../appc/workflow/impl/WorkFlowManagerImpl.java | 311 +++++++++++---------- .../onap/appc/workflow/impl/WorkflowResolver.java | 13 +- .../resources/org/onap/appc/default.properties | 4 +- 6 files changed, 403 insertions(+), 164 deletions(-) create mode 100644 appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionAbortedMarker.java create mode 100644 appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionRecorderServiceNotFoundException.java create mode 100644 appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/WorkflowManagerActivator.java (limited to 'appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main') diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionAbortedMarker.java b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionAbortedMarker.java new file mode 100644 index 000000000..6e061e15a --- /dev/null +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionAbortedMarker.java @@ -0,0 +1,158 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * 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. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.workflow.activator; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.onap.appc.transactionrecorder.TransactionRecorder; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; + +import java.io.*; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class TransactionAbortedMarker implements Runnable { + + private ScheduledExecutorService executor = null; + + public static final String PREFIX = "APPC"; + public static final String SUFFIX = "VM"; + private final EELFLogger logger = EELFManager.getInstance().getLogger(TransactionAbortedMarker.class); + + public TransactionAbortedMarker(ScheduledExecutorService executor){ + this.executor = executor; + } + + @Override + public void run() { + try { + TransactionRecorder recorder = lookupTransactionRecorder(); + + File newAppcInstanceIdFile = File.createTempFile(PREFIX, SUFFIX); + File parentDirectory = newAppcInstanceIdFile.getParentFile(); + if (logger.isDebugEnabled()) { + logger.debug("New instance id file path" + newAppcInstanceIdFile.getAbsolutePath()); + } + + File[] allInstanceIdFiles = getAllInstanceIdFiles(parentDirectory); + + if (allInstanceIdFiles.length > 0) { + File lastModifiedFile = getLastModifiedFile(allInstanceIdFiles); + if (logger.isDebugEnabled()) { + logger.debug("Last Modified File" + lastModifiedFile.getName()); + } + String prevAppcInstanceId = readInstanceId(lastModifiedFile); + recorder.markTransactionsAborted(prevAppcInstanceId); + boolean isFileDeleted = lastModifiedFile.delete(); + logger.debug("Previous file deleted " + isFileDeleted); + } + String newAppcInstanceId = writeNewInstanceId(newAppcInstanceIdFile); + recorder.setAppcInstanceId(newAppcInstanceId); + } catch (TransactionRecorderServiceNotFoundException e) { + logger.warn("Transaction Recorder Service Not Found, Next attempt after 30 seconds"); + executor.schedule(this,30, TimeUnit.SECONDS); + } catch (Exception e) { + logger.error("Error on workflow manager bundle start-up" + e.getMessage(), e); + throw new RuntimeException(e); + } + } + + + + protected TransactionRecorder lookupTransactionRecorder() throws TransactionRecorderServiceNotFoundException { + String message = null; + BundleContext bctx = FrameworkUtil.getBundle(TransactionRecorder.class).getBundleContext(); + if(bctx!=null){ + ServiceReference sref= bctx.getServiceReference(TransactionRecorder.class.getName()); + TransactionRecorder transactionRecorder; + if (sref != null) { + transactionRecorder = (TransactionRecorder) bctx.getService(sref); + if (transactionRecorder != null) { + return transactionRecorder; + } + } + } + message = "Cannot find service org.onap.appc.transactionrecorder.TransactionRecorder"; + logger.warn(message); + throw new TransactionRecorderServiceNotFoundException(message); + } + + private String writeNewInstanceId(File newInstanceIdFile) throws IOException { + String newAppcInstanceId = UUID.randomUUID().toString(); + try (FileWriter writer = new FileWriter(newInstanceIdFile)) { + writer.write(newAppcInstanceId); + } + catch (IOException e){ + String message = "Error writing appc-instance-id"; + logger.error(message,e); + throw new RuntimeException(message); + } + logger.debug("new appc-instance-id = " + newAppcInstanceId); + return newAppcInstanceId; + } + + private String readInstanceId(File lastModifiedFile) { + String prevAppcInstanceId = null; + BufferedReader buffReader; + try (FileReader reader = new FileReader(lastModifiedFile)) { + buffReader = new BufferedReader(reader); + prevAppcInstanceId = buffReader.readLine(); + } + catch (IOException e){ + String message ="Error reading previous appc-instance-id"; + logger.error(message,e); + throw new RuntimeException(message); + } + logger.debug("previous appc-instance-id " + prevAppcInstanceId); + return prevAppcInstanceId; + } + + private File[] getAllInstanceIdFiles(File directory) { + return directory.listFiles(pathname -> { + if (pathname.getName().startsWith(PREFIX) + && pathname.getName().endsWith(SUFFIX) + && pathname.length()>0) + return true; + return false; + }); + } + + private File getLastModifiedFile(File[] allInstanceIdFiles) { + File lastModifiedFile = allInstanceIdFiles[0]; + long lastModified = allInstanceIdFiles[0].lastModified(); + for(File file:allInstanceIdFiles){ + if(file.lastModified() > lastModified){ + lastModified = file.lastModified(); + lastModifiedFile = file; + } + } + return lastModifiedFile; + } +} diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionRecorderServiceNotFoundException.java b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionRecorderServiceNotFoundException.java new file mode 100644 index 000000000..f8b0a8426 --- /dev/null +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/TransactionRecorderServiceNotFoundException.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * 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. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.workflow.activator; + +public class TransactionRecorderServiceNotFoundException extends Exception { + + public TransactionRecorderServiceNotFoundException(String message){ + super(message); + } +} diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/WorkflowManagerActivator.java b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/WorkflowManagerActivator.java new file mode 100644 index 000000000..b91a8f7ed --- /dev/null +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/activator/WorkflowManagerActivator.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Copyright (C) 2017 Amdocs + * ============================================================================= + * 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. + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * ============LICENSE_END========================================================= + */ + +package org.onap.appc.workflow.activator; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class WorkflowManagerActivator implements BundleActivator{ + + private ScheduledExecutorService executor = null; + + @Override + public void start(BundleContext bundleContext) { + executor = Executors.newSingleThreadScheduledExecutor(); + TransactionAbortedMarker runnable = new TransactionAbortedMarker(executor); + executor.schedule(runnable, 30, TimeUnit.SECONDS); + } + + @Override + public void stop(BundleContext bundleContext) throws Exception { + executor.shutdown(); + } +} diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkFlowManagerImpl.java b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkFlowManagerImpl.java index ceae5677c..483668031 100644 --- a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkFlowManagerImpl.java +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkFlowManagerImpl.java @@ -31,7 +31,6 @@ import org.onap.appc.configuration.Configuration; import org.onap.appc.configuration.ConfigurationFactory; import org.onap.appc.domainmodel.lcm.RequestContext; import org.onap.appc.domainmodel.lcm.ResponseContext; -import org.onap.appc.domainmodel.lcm.Status; import org.onap.appc.util.ObjectMapper; import org.onap.appc.workflow.WorkFlowManager; import org.onap.appc.workflow.objects.WorkflowExistsOutput; @@ -43,71 +42,74 @@ import org.onap.ccsdk.sli.core.sli.SvcLogicException; import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.Arrays; import java.util.Enumeration; import java.util.Map; import java.util.Properties; public class WorkFlowManagerImpl implements WorkFlowManager{ - private SvcLogicService svcLogic = null; - private static final EELFLogger logger = EELFManager.getInstance().getLogger(WorkFlowManagerImpl.class); - private static final Configuration configuration = ConfigurationFactory.getConfiguration(); - - private final WorkflowResolver workflowResolver = new WorkflowResolver( - configuration.getIntegerProperty("org.onap.appc.workflow.resolver.refresh_interval", 300) - ); - - public void setSvcLogicServiceRef(SvcLogicService svcLogic) { - this.svcLogic = svcLogic; - } - - /** - * Execute workflow and return response. - * This method execute workflow with following steps. - * Retrieve workflow(DG) details - module, version and mode from database based on command and vnf Type from incoming request. - * Execute workflow (DG) using SVC Logic Service reference - * Return response of workflow (DG) to caller. + private SvcLogicService svcLogic = null; + private final EELFLogger logger = EELFManager.getInstance().getLogger(WorkFlowManagerImpl.class); + private final Configuration configuration = ConfigurationFactory.getConfiguration(); + + private WorkflowResolver workflowResolver = new WorkflowResolver( + configuration.getIntegerProperty("org.onap.appc.workflow.resolver.refresh_interval", 300) + ); + + public void setWorkflowResolver(WorkflowResolver workflowResolver){ + this.workflowResolver=workflowResolver; + } + + public void setSvcLogicServiceRef(SvcLogicService svcLogic) { + this.svcLogic = svcLogic; + } + + /** + * Execute workflow and return response. + * This method execute workflow with following steps. + * Retrieve workflow(DG) details - module, version and mode from database based on command and vnf Type from incoming request. + * Execute workflow (DG) using SVC Logic Service reference + * Return response of workflow (DG) to caller. * - * @param workflowRequest workflow execution request which contains vnfType, command, requestId, targetId, payload and (optional) confID; - * @return Workflow Response which contains execution status and payload from DG if any - */ - - @Override - public WorkflowResponse executeWorkflow(WorkflowRequest workflowRequest) { - if (logger.isTraceEnabled()) { - logger.trace("Entering to executeWorkflow with WorkflowRequest = "+ ObjectUtils.toString(workflowRequest.toString())); - } - WorkflowResponse workflowResponse = new WorkflowResponse(); + * @param workflowRequest workflow execution request which contains vnfType, command, requestId, targetId, payload and (optional) confID; + * @return Workflow Response which contains execution status and payload from DG if any + */ + + @Override + public WorkflowResponse executeWorkflow(WorkflowRequest workflowRequest) { + if (logger.isTraceEnabled()) { + logger.trace("Entering to executeWorkflow with WorkflowRequest = "+ ObjectUtils.toString(workflowRequest.toString())); + } + WorkflowResponse workflowResponse = new WorkflowResponse(); workflowResponse.setResponseContext(workflowRequest.getResponseContext()); - try { + try { WorkflowKey workflowKey = workflowResolver.resolve(workflowRequest.getRequestContext().getAction().name(), workflowRequest.getVnfContext().getType(), null,workflowRequest.getRequestContext().getCommonHeader().getApiVer()); - Properties workflowParams = new Properties(); - String actionProperty = null; - String requestIdProperty=null; - String vfIdProperty =null; + Properties workflowParams = new Properties(); + String actionProperty; + String requestIdProperty; + String vfIdProperty; if(!workflowRequest.getRequestContext().getCommonHeader().getApiVer().startsWith("1.")){ - /* - The following method call (populateDGContext) populates DG context with the - request parameters to maintain backward compatibility with old DGs, - we are not altering the old way of passing (org.onap.appc.vnfId and so on..) - This is still a temporary solution, the end solution should be agreed with - all stakeholders and implemented. - */ - populateDGContext(workflowParams,workflowRequest); + /* + The following method call (populateDGContext) populates DG context with the + request parameters to maintain backward compatibility with old DGs, + we are not altering the old way of passing (org.onap.appc.vnfId and so on..) + This is still a temporary solution, the end solution should be agreed with + all stakeholders and implemented. + */ + populateDGContext(workflowParams,workflowRequest); } else { - actionProperty = configuration.getProperty("org.onap.appc.workflow.action", String.valueOf(Constants.ACTION)); - requestIdProperty = configuration.getProperty("org.onap.appc.workflow.request.id", String.valueOf(Constants.REQUEST_ID)); - vfIdProperty = configuration.getProperty("org.onap.appc.workflow.vfid", String.valueOf(Constants.VF_ID)); - String payloadProperty = configuration.getProperty("org.onap.appc.workflow.payload", String.valueOf(Constants.PAYLOAD)); - String vfTypeProperty = configuration.getProperty("org.onap.appc.workflow.vftype", String.valueOf(Constants.VF_TYPE)); - String apiVerProperty = configuration.getProperty("org.onap.appc.workflow.apiVersion", String.valueOf(Constants.API_VERSION)); - String originatorIdProperty = configuration.getProperty("org.onap.appc.workflow.originatorId",Constants.ORIGINATOR_ID); - String subRequestId = configuration.getProperty("org.onap.appc.workflow.subRequestId",Constants.SUB_REQUEST_ID); + actionProperty = configuration.getProperty("org.onap.appc.workflow.action", String.valueOf(Constants.ACTION)); + requestIdProperty = configuration.getProperty("org.onap.appc.workflow.request.id", String.valueOf(Constants.REQUEST_ID)); + vfIdProperty = configuration.getProperty("org.onap.appc.workflow.vfid", String.valueOf(Constants.VF_ID)); + String vfTypeProperty = configuration.getProperty("org.onap.appc.workflow.vftype", String.valueOf(Constants.VF_TYPE)); + String apiVerProperty = configuration.getProperty("org.onap.appc.workflow.apiVersion", String.valueOf(Constants.API_VERSION)); + String originatorIdProperty = configuration.getProperty("org.onap.appc.workflow.originatorId",Constants.ORIGINATOR_ID); + String subRequestId = configuration.getProperty("org.onap.appc.workflow.subRequestId",Constants.SUB_REQUEST_ID); workflowParams.put(actionProperty,workflowRequest.getRequestContext().getAction().name()); workflowParams.put(requestIdProperty, workflowRequest.getRequestContext().getCommonHeader().getRequestId()); @@ -118,33 +120,33 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ workflowParams.put(subRequestId,workflowRequest.getRequestContext().getCommonHeader().getSubRequestId()); Object payloadJson = workflowRequest.getRequestContext().getPayload(); - if(payloadJson!=null) { - try { - Map payloadProperties = ObjectMapper.map(payloadJson); - workflowParams.putAll(payloadProperties); - - if (logger.isDebugEnabled()) { - logger.debug("DG properties: " + workflowParams); - } - } catch (Exception e) { - logger.error("Error parsing payload json string", e); - Properties workflowPrp = new Properties(); - workflowPrp.setProperty("error-message", "Error parsing payload json string"); + if(payloadJson!=null) { + try { + Map payloadProperties = ObjectMapper.map(payloadJson); + workflowParams.putAll(payloadProperties); + + if (logger.isDebugEnabled()) { + logger.debug("DG properties: " + workflowParams); + } + } catch (Exception e) { + logger.error("Error parsing payload json string", e); + Properties workflowPrp = new Properties(); + workflowPrp.setProperty("error-message", "Error parsing payload json string"); fillStatus(501, "Error parsing payload json string: "+e.getMessage(), workflowRequest.getResponseContext()); - if (logger.isTraceEnabled()) { - logger.trace("Exiting from executeWorkflow with (workflowResponse = "+ObjectUtils.toString(workflowResponse)+")"); - } - return workflowResponse; - } - } - if (logger.isDebugEnabled()) { + if (logger.isTraceEnabled()) { + logger.trace("Exiting from executeWorkflow with (workflowResponse = "+ObjectUtils.toString(workflowResponse)+")"); + } + return workflowResponse; + } + } + if (logger.isDebugEnabled()) { logger.debug("DG parameters "+ actionProperty +":"+ workflowRequest.getRequestContext().getAction().name()+", "+ requestIdProperty +":"+ workflowRequest.getRequestContext().getCommonHeader().getRequestId()+", "+ vfIdProperty +":"+ workflowRequest.getVnfContext().getId()); logger.debug("Starting DG Execution for request "+workflowRequest.getRequestContext().getCommonHeader().getRequestId()); - } - } + } + } if (workflowRequest.getRequestContext().getCommonHeader().getApiVer().startsWith("1.")){ workflowParams.put("isBwcMode","true"); } else { @@ -152,21 +154,21 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ } SVCLogicServiceExecute(workflowKey, workflowRequest.getRequestContext(), workflowParams , workflowResponse); - if (logger.isTraceEnabled()) { + if (logger.isTraceEnabled()) { logger.trace("Completed DG Execution for Request id: " + workflowRequest.getRequestContext().getCommonHeader().getRequestId() + "with response code: " + workflowResponse.getResponseContext().getStatus().getCode()); - } - }catch (Exception e){ - logger.error("Error Executing DG " +e.getMessage()); + } + }catch (Exception e){ + logger.error("Error Executing DG " +e.getMessage(),e); fillStatus(501, "Error Executing DG "+e.getMessage(), workflowRequest.getResponseContext()); - } - if (logger.isTraceEnabled()) { + } + if (logger.isTraceEnabled()) { logger.trace("Exiting from executeWorkflow with (workflowResponse = "+ ObjectUtils.toString(workflowResponse.getResponseContext().getStatus().getMessage())+")"); - } - return workflowResponse; - } + } + return workflowResponse; + } - private void populateDGContext(Properties workflowParams, WorkflowRequest workflowRequest) { - workflowParams.put("input.common-header.timestamp",new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(Date.from(workflowRequest.getRequestContext().getCommonHeader().getTimeStamp()))); + private void populateDGContext(Properties workflowParams, WorkflowRequest workflowRequest) { + workflowParams.put("input.common-header.timestamp",new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").format(workflowRequest.getRequestContext().getCommonHeader().getTimeStamp())); workflowParams.put("input.common-header.api-ver",workflowRequest.getRequestContext().getCommonHeader().getApiVer()); workflowParams.put("input.common-header.request-id",workflowRequest.getRequestContext().getCommonHeader().getRequestId()); workflowParams.put("input.common-header.originator-id",workflowRequest.getRequestContext().getCommonHeader().getOriginatorId()); @@ -176,86 +178,86 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ workflowParams.put("input.action-identifiers.vnf-id",workflowRequest.getVnfContext().getId()); workflowParams.put("input.action-identifiers.vnfc-name",workflowRequest.getRequestContext().getActionIdentifiers().getVnfcName()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getVnfcName():""); workflowParams.put("input.action-identifiers.service-instance-id",workflowRequest.getRequestContext().getActionIdentifiers().getServiceInstanceId()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getServiceInstanceId():""); - workflowParams.put("input.action-identifiers.vf-module-id",workflowRequest.getRequestContext().getActionIdentifiers().getVfModuleId()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getVfModuleId():""); - workflowParams.put("input.action-identifiers.vserver-id",workflowRequest.getRequestContext().getActionIdentifiers().getVserverId()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getVserverId():""); + workflowParams.put("input.action-identifiers.vserver-id",workflowRequest.getRequestContext().getActionIdentifiers().getVserverId()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getVserverId():""); + workflowParams.put("input.action-identifiers.vf-module-id",workflowRequest.getRequestContext().getActionIdentifiers().getVfModuleId()!=null?workflowRequest.getRequestContext().getActionIdentifiers().getVfModuleId():""); final Map additionalContext; if ((additionalContext = workflowRequest.getRequestContext().getAdditionalContext())!=null) { for (Map.Entry entry : additionalContext.entrySet()) { workflowParams.put("input." + entry.getKey(), null != entry.getValue() ? entry.getValue() : ""); - } + } } } - /** - * Check if workflow (DG) exists in database + /** + * Check if workflow (DG) exists in database * - * @param workflowQueryParams workflow request with command and vnf Type - * @return True if workflow exists else False. - */ - @Override - public WorkflowExistsOutput workflowExists(WorkflowRequest workflowQueryParams) { - WorkflowExistsOutput workflowExistsOutput = new WorkflowExistsOutput(false,false); - if (logger.isTraceEnabled()) { - logger.trace("Entering to workflowExists with WorkflowRequest = "+ObjectUtils.toString(workflowQueryParams.toString())); - } - - try { + * @param workflowQueryParams workflow request with command and vnf Type + * @return True if workflow exists else False. + */ + @Override + public WorkflowExistsOutput workflowExists(WorkflowRequest workflowQueryParams) { + WorkflowExistsOutput workflowExistsOutput = new WorkflowExistsOutput(false,false); + if (logger.isTraceEnabled()) { + logger.trace("Entering to workflowExists with WorkflowRequest = "+ObjectUtils.toString(workflowQueryParams.toString())); + } + + try { WorkflowKey workflowKey = workflowResolver.resolve( workflowQueryParams.getRequestContext().getAction().name(), workflowQueryParams.getVnfContext().getType(), workflowQueryParams.getVnfContext().getVersion(), workflowQueryParams.getRequestContext().getCommonHeader().getApiVer()); - if (workflowKey != null) { - workflowExistsOutput.setMappingExist(true); - workflowExistsOutput.setWorkflowModule(workflowKey.module()); - workflowExistsOutput.setWorkflowName(workflowKey.name()); - workflowExistsOutput.setWorkflowVersion(workflowKey.version()); - if (isDGExists(workflowKey)) { - workflowExistsOutput.setDgExist(true); - }else{ - logger.warn( - String.format("SLI doesn't have DG for resolved mapping entry: DG module - '%s', DG name - '%s', DG version - '%s'", - workflowKey.module(), workflowKey.name(), workflowKey.version())); - } - }else{ - logger.warn( - String.format("Unable to resolve recipe matching action '%s', VNF type '%s' and VNF version '%s'", + if (workflowKey != null) { + workflowExistsOutput.setMappingExist(true); + workflowExistsOutput.setWorkflowModule(workflowKey.module()); + workflowExistsOutput.setWorkflowName(workflowKey.name()); + workflowExistsOutput.setWorkflowVersion(workflowKey.version()); + if (isDGExists(workflowKey)) { + workflowExistsOutput.setDgExist(true); + }else{ + logger.warn( + String.format("SLI doesn't have DG for resolved mapping entry: DG module - '%s', DG name - '%s', DG version - '%s'", + workflowKey.module(), workflowKey.name(), workflowKey.version())); + } + }else{ + logger.warn( + String.format("Unable to resolve recipe matching action '%s', VNF type '%s' and VNF version '%s'", workflowQueryParams.getRequestContext().getAction().name(), workflowQueryParams.getVnfContext().getType(), null)); - } - } catch (RuntimeException e) { - logger.error("Error querying workflow from database"+e.getMessage()); - throw e; - }catch (SvcLogicException e) { - logger.error("Error querying workflow from database"+e.getMessage()); - throw new RuntimeException(e); - } - if (logger.isTraceEnabled()) { - logger.trace("Exiting workflowExists"); - } - return workflowExistsOutput; - } - - - private boolean isDGExists(WorkflowKey workflowKey) throws SvcLogicException { - return svcLogic.hasGraph(workflowKey.module(), workflowKey.name(), workflowKey.version(), "sync"); - } + } + } catch (RuntimeException e) { + logger.error("Error querying workflow from database"+e.getMessage()); + throw e; + }catch (SvcLogicException e) { + logger.error("Error querying workflow from database"+e.getMessage()); + throw new RuntimeException(e); + } + if (logger.isTraceEnabled()) { + logger.trace("Exiting workflowExists"); + } + return workflowExistsOutput; + } + + + private boolean isDGExists(WorkflowKey workflowKey) throws SvcLogicException { + return svcLogic.hasGraph(workflowKey.module(), workflowKey.name(), workflowKey.version(), "sync"); + } private void SVCLogicServiceExecute(WorkflowKey workflowKey, RequestContext requestContext, Properties workflowParams, WorkflowResponse workflowResponse) { - if (logger.isTraceEnabled()) { - logger.trace("Entering SVCLogicServiceExecute"); - } + if (logger.isTraceEnabled()) { + logger.trace("Entering SVCLogicServiceExecute"); + } Properties respProps = null; - try { + try { respProps = svcLogic.execute(workflowKey.module(), workflowKey.name(), workflowKey.version(), "sync", workflowParams); } catch (Exception e) { setWorkFlowResponseStatus(workflowResponse.getResponseContext(), "failure", "Unexpected SLI Adapter failure", 200); - if (logger.isDebugEnabled()) { + if (logger.isDebugEnabled()) { logger.debug("Error while executing DG " + e.getMessage() + e.getStackTrace()); } - logger.error("Error in DG", e.getMessage()+e.getStackTrace().toString()); + logger.error("Error in DG", e.getMessage()+ Arrays.toString(e.getStackTrace()),e); } if (respProps != null) { @@ -269,19 +271,19 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ int specificStatusCode = 0; if (dgOutputStatusCode != null) { specificStatusCode = Integer.parseInt(dgOutputStatusCode); - } + } setWorkFlowResponseStatus(workflowResponse.getResponseContext(), commonStatus, specificStatusMessage, specificStatusCode); - if (logger.isDebugEnabled()) { + if (logger.isDebugEnabled()) { logger.debug("DG Execution Status: " + commonStatus); - } - } + } + } - if (logger.isTraceEnabled()) { - logger.trace("Exiting from SVCLogicServiceExecute"); - } - } + if (logger.isTraceEnabled()) { + logger.trace("Exiting from SVCLogicServiceExecute"); + } + } /** * Filling response context by output.* fields from DG context. Works only for 2.* API version @@ -301,7 +303,7 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ responseContext.setPayload(respProps.getProperty(key)); } else { responseContext.addKeyValueToAdditionalContext(key, respProps.getProperty(key)); - } + } } } } @@ -316,22 +318,21 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ * @param specificStatusCode specific status code from specific DG node */ private void setWorkFlowResponseStatus(ResponseContext responseContext, String commonStatus, String specificStatusMessage, int specificStatusCode) { - if (null == specificStatusMessage) { specificStatusMessage = ""; } - if (commonStatus.equalsIgnoreCase(Constants.DG_STATUS_SUCCESS)){ - if (specificStatusCode != 0 ){ + if (null == specificStatusMessage) { specificStatusMessage = ""; } + if (commonStatus.equalsIgnoreCase(Constants.DG_STATUS_SUCCESS)){ + if (specificStatusCode != 0 ){ fillStatus(specificStatusCode, specificStatusMessage, responseContext); } else { fillStatus(400, commonStatus, responseContext); } } else { - String errorMsg = StringUtils.isEmpty(specificStatusMessage) ? "DG execution failure" : specificStatusMessage; if (specificStatusCode != 0){ fillStatus(specificStatusCode, specificStatusMessage, responseContext); } else { fillStatus(401, specificStatusMessage, responseContext); } - } - } + } + } /** * filling responseContext by status code and status message @@ -341,7 +342,9 @@ public class WorkFlowManagerImpl implements WorkFlowManager{ * @param responceContext response context which will be store status code and status message */ private void fillStatus(int code, String message, ResponseContext responceContext) { - responceContext.setStatus(new Status(code, message)); + responceContext.getStatus().setCode(code); + responceContext.getStatus().setMessage(message); } + } diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkflowResolver.java b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkflowResolver.java index 1f4a5b406..3dabb5404 100644 --- a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkflowResolver.java +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/java/org/onap/appc/workflow/impl/WorkflowResolver.java @@ -33,17 +33,17 @@ import com.att.eelf.configuration.EELFManager; class WorkflowResolver { - private static final EELFLogger logger = EELFManager.getInstance().getLogger(WorkFlowManagerImpl.class); + private final EELFLogger logger = EELFManager.getInstance().getLogger(WorkFlowManagerImpl.class); private long interval; - private volatile long lastUpdate = 0l; + private volatile long lastUpdate = 0L; private volatile boolean isUpdateInProgress = false; private volatile RankedAttributesResolver dgResolver; private final ReentrantLock INIT_LOCK = new ReentrantLock(); - WorkflowResolver(long interval) { + WorkflowResolver(int interval) { this.interval = interval * 1000; } @@ -96,8 +96,7 @@ class WorkflowResolver { logger.info("DG resolver configuration data has expired - initiating refresh"); try { - RankedAttributesResolver temp = createResolver(); - dgResolver = temp; + dgResolver = createResolver(); lastUpdate = System.currentTimeMillis(); logger.info("DG resolver configuration data has been refreshed successfully"); @@ -135,8 +134,6 @@ class WorkflowResolver { } }; - WorkflowKey wfKey = resolver().resolve(context); - - return wfKey; + return resolver().resolve(context); } } diff --git a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/resources/org/onap/appc/default.properties b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/resources/org/onap/appc/default.properties index 3dd30a87b..fce3e2122 100644 --- a/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/resources/org/onap/appc/default.properties +++ b/appc-dispatcher/appc-workflow-management/appc-workflow-management-core/src/main/resources/org/onap/appc/default.properties @@ -33,8 +33,8 @@ appc.LCM.poolMembers=:3904 appc.LCM.service=dmaap appc.LCM.topic.write=APPC-TEST2 appc.LCM.client.name=APPC-TEST-CLIENT-WF-MGMT-MAIN -appc.LCM.provider.user=test -appc.LCM.provider.pass=test +appc.LCM.provider.user=admin +appc.LCM.provider.pass=admin -- cgit 1.2.3-korg