Merge "[SO] create generic pnf healthcheck workflow"
authorByung-Woo Jun <byung-woo.jun@est.tech>
Fri, 31 Jul 2020 01:13:18 +0000 (01:13 +0000)
committerGerrit Code Review <gerrit@onap.org>
Fri, 31 Jul 2020 01:13:18 +0000 (01:13 +0000)
bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java [new file with mode: 0644]
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java

diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/GenericPnfTaskProcessor.groovy
new file mode 100644 (file)
index 0000000..727a750
--- /dev/null
@@ -0,0 +1,127 @@
+/*-
+ * ============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.scripts
+
+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.common.workflow.context.WorkflowContext
+import org.onap.so.bpmn.common.workflow.context.WorkflowContextHolder
+import org.onap.so.bpmn.core.WorkflowException
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_CORRELATION_ID
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.REQUEST_ID
+
+class GenericPnfTaskProcessor extends AbstractServiceTaskProcessor {
+    private static final Logger logger = LoggerFactory.getLogger(GenericPnfTaskProcessor.class)
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    String prefix = "Generic_"
+
+    @Override
+    void preProcessRequest(DelegateExecution execution) {
+    }
+
+    void sendResponse(DelegateExecution execution) {
+        def requestId = execution.getVariable(REQUEST_ID)
+        def instanceId = execution.getVariable(PNF_CORRELATION_ID)
+        logger.debug("Send response for requestId: {}, instanceId: {}", requestId, instanceId)
+
+        String response = """{"requestReferences":{"requestId":"${requestId}", "instanceId":"${instanceId}"}}""".trim()
+        sendWorkflowResponse(execution, 200, response)
+    }
+
+    static WorkflowContext getWorkflowContext(DelegateExecution execution) {
+        String requestId = execution.getVariable(REQUEST_ID)
+        return WorkflowContextHolder.getInstance().getWorkflowContext(requestId)
+    }
+
+    void prepareCompletion(DelegateExecution execution) {
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare Completion of PNF for requestId: {}", requestId)
+
+            String msoCompletionRequest =
+                    """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:status-message>Activity is successful.</aetgt:status-message>
+                        <aetgt:mso-bpel-name>${execution.getProcessDefinitionId()}</aetgt:mso-bpel-name>
+                    </aetgt:MsoCompletionRequest>"""
+            String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
+
+            execution.setVariable(prefix + "CompleteMsoProcessRequest", xmlMsoCompletionRequest)
+
+            logger.debug("CompleteMsoProcessRequest of PNF - " + "\n" + xmlMsoCompletionRequest)
+        } catch (Exception e) {
+            String msg = "Prepare Completion error for PNF - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+
+    void prepareFalloutHandler(DelegateExecution execution) {
+        WorkflowContext workflowContext = getWorkflowContext(execution)
+        if (workflowContext == null) {
+            logger.debug("Error occurred before sending response to API handler, and send it now")
+            sendResponse(execution)
+        }
+
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare FalloutHandler of PNF for requestId: {}", requestId)
+
+            WorkflowException workflowException = execution.getVariable("WorkflowException")
+            String errorCode = String.valueOf(workflowException.getErrorCode())
+            String errorMessage = workflowException.getErrorMessage()
+            String falloutHandlerRequest =
+                    """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
+                            <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
+                            <aetgt:ErrorCode>${MsoUtils.xmlEscape(errorCode)}</aetgt:ErrorCode>
+                        </aetgt:WorkflowException>
+                    </aetgt:FalloutHandlerRequest>"""
+            String xmlFalloutHandlerRequest = utils.formatXml(falloutHandlerRequest)
+
+            execution.setVariable(prefix + "FalloutHandlerRequest", xmlFalloutHandlerRequest)
+
+            logger.debug("FalloutHandlerRequest of PNF - " + "\n" + xmlFalloutHandlerRequest)
+        } catch (Exception e) {
+            String msg = "Prepare FalloutHandler error for PNF - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/GenericPnfHealthCheck.bpmn
new file mode 100644 (file)
index 0000000..1722137
--- /dev/null
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1yd8m0g" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.0.0">
+  <bpmn:process id="GenericPnfHealthCheck" name="GenericPnfHealthCheck" isExecutable="true">
+    <bpmn:startEvent id="pnfHealthCheck_startEvent" name="Start Flow">
+      <bpmn:outgoing>SequenceFlow_1ng4b6l</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:serviceTask id="ServiceTask_042uz7m" name="PNF Request Dispatcher" camunda:delegateExpression="${GenericPnfDispatcher}">
+      <bpmn:incoming>SequenceFlow_1ng4b6l</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_12ejx4m</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_12ejx4m" sourceRef="ServiceTask_042uz7m" targetRef="ScriptTask_10klpg9" />
+    <bpmn:endEvent id="pnfHealthCheck_endEvent" name="End">
+      <bpmn:incoming>SequenceFlow_0tle5zb</bpmn:incoming>
+      <bpmn:terminateEventDefinition />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_1ng4b6l" sourceRef="pnfHealthCheck_startEvent" targetRef="ServiceTask_042uz7m" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_0x6h0yi" default="SequenceFlow_0piri91">
+      <bpmn:incoming>SequenceFlow_0j26xlx</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0piri91</bpmn:outgoing>
+      <bpmn:outgoing>Flow_015z1h4</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:endEvent id="EndEvent_180lm4y">
+      <bpmn:incoming>SequenceFlow_0piri91</bpmn:incoming>
+      <bpmn:errorEventDefinition id="ErrorEventDefinition_0fm5he7" errorRef="Error_12cpov5" />
+    </bpmn:endEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_0piri91" name="Failure" sourceRef="ExclusiveGateway_0x6h0yi" targetRef="EndEvent_180lm4y" />
+    <bpmn:scriptTask id="ScriptTask_10klpg9" name="Send Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_12ejx4m</bpmn:incoming>
+      <bpmn:outgoing>Flow_12uv2m0</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def taskProcessor = new GenericPnfTaskProcessor()
+taskProcessor.sendResponse(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:scriptTask id="ScriptTask_1igtc83" name="Prepare Completion" scriptFormat="groovy">
+      <bpmn:incoming>Flow_015z1h4</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0ipc3nt</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def taskProcessor = new GenericPnfTaskProcessor()
+taskProcessor.prepareCompletion(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0ipc3nt" sourceRef="ScriptTask_1igtc83" targetRef="CallActivity_0o1mi8u" />
+    <bpmn:callActivity id="CallActivity_0o1mi8u" name="Complete Process" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="PnfSwUpgrade_CompleteMsoProcessRequest" target="CompleteMsoProcessRequest" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0ipc3nt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0tle5zb</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0tle5zb" sourceRef="CallActivity_0o1mi8u" targetRef="pnfHealthCheck_endEvent" />
+    <bpmn:subProcess id="SubProcess_02p6q4s" name="Subprocess for FalloutHandler" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_149ecdm" name="Catch All Errors">
+        <bpmn:outgoing>SequenceFlow_05haut5</bpmn:outgoing>
+        <bpmn:errorEventDefinition id="ErrorEventDefinition_1" />
+      </bpmn:startEvent>
+      <bpmn:scriptTask id="ScriptTask_0gov132" name="Prepare FalloutHandler" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_05haut5</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_09y0mpc</bpmn:outgoing>
+        <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareFalloutHandler(execution)</bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_00psvtk" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="PnfSwUpgrade_FalloutHandlerRequest" target="FalloutHandlerRequest" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_09y0mpc</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1tcjlty</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:endEvent id="EndEvent_1vq2glg" name="End">
+        <bpmn:incoming>SequenceFlow_1tcjlty</bpmn:incoming>
+        <bpmn:terminateEventDefinition id="TerminateEventDefinition_0994ojb" />
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_05haut5" sourceRef="StartEvent_149ecdm" targetRef="ScriptTask_0gov132" />
+      <bpmn:sequenceFlow id="SequenceFlow_09y0mpc" sourceRef="ScriptTask_0gov132" targetRef="CallActivity_00psvtk" />
+      <bpmn:sequenceFlow id="SequenceFlow_1tcjlty" sourceRef="CallActivity_00psvtk" targetRef="EndEvent_1vq2glg" />
+    </bpmn:subProcess>
+    <bpmn:serviceTask id="ServiceTask_0slpaht" name="HealthCheck" camunda:delegateExpression="${ControllerExecutionDE}">
+      <bpmn:extensionElements>
+        <camunda:inputOutput>
+          <camunda:inputParameter name="action">healthCheck</camunda:inputParameter>
+          <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">async</camunda:inputParameter>
+        </camunda:inputOutput>
+      </bpmn:extensionElements>
+      <bpmn:incoming>Flow_12uv2m0</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0j26xlx</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0j26xlx" sourceRef="ServiceTask_0slpaht" targetRef="ExclusiveGateway_0x6h0yi" />
+    <bpmn:sequenceFlow id="Flow_015z1h4" name="Success" sourceRef="ExclusiveGateway_0x6h0yi" targetRef="ScriptTask_1igtc83">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="Flow_12uv2m0" sourceRef="ScriptTask_10klpg9" targetRef="ServiceTask_0slpaht" />
+  </bpmn:process>
+  <bpmn:error id="Error_12cpov5" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="GenericPnfHealthCheck">
+      <bpmndi:BPMNEdge id="Flow_12uv2m0_di" bpmnElement="Flow_12uv2m0">
+        <di:waypoint x="530" y="120" />
+        <di:waypoint x="590" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_015z1h4_di" bpmnElement="Flow_015z1h4">
+        <di:waypoint x="825" y="120" />
+        <di:waypoint x="900" y="120" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="842" y="102" width="43" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0j26xlx_di" bpmnElement="SequenceFlow_0j26xlx">
+        <di:waypoint x="690" y="120" />
+        <di:waypoint x="775" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0tle5zb_di" bpmnElement="SequenceFlow_0tle5zb">
+        <di:waypoint x="1180" y="120" />
+        <di:waypoint x="1262" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ipc3nt_di" bpmnElement="SequenceFlow_0ipc3nt">
+        <di:waypoint x="1000" y="120" />
+        <di:waypoint x="1080" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0piri91_di" bpmnElement="SequenceFlow_0piri91">
+        <di:waypoint x="800" y="145" />
+        <di:waypoint x="800" y="202" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="793" y="145" width="35" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ng4b6l_di" bpmnElement="SequenceFlow_1ng4b6l">
+        <di:waypoint x="178" y="120" />
+        <di:waypoint x="270" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_12ejx4m_di" bpmnElement="SequenceFlow_12ejx4m">
+        <di:waypoint x="370" y="120" />
+        <di:waypoint x="430" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="pnfHealthCheck_startEvent">
+        <dc:Bounds x="142" y="102" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="137" y="145" width="51" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_042uz7n_di" bpmnElement="ServiceTask_042uz7m">
+        <dc:Bounds x="270" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1w3jv30_di" bpmnElement="pnfHealthCheck_endEvent">
+        <dc:Bounds x="1262" y="102" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1271" y="145" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_0x6h0ni_di" bpmnElement="ExclusiveGateway_0x6h0yi" isMarkerVisible="true">
+        <dc:Bounds x="775" y="95" width="50" height="50" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_180lm4y_di" bpmnElement="EndEvent_180lm4y">
+        <dc:Bounds x="782" y="202" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_10klpg8_di" bpmnElement="ScriptTask_10klpg9">
+        <dc:Bounds x="430" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1igtc83_di" bpmnElement="ScriptTask_1igtc83">
+        <dc:Bounds x="900" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0o1mi8u_di" bpmnElement="CallActivity_0o1mi8u">
+        <dc:Bounds x="1080" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_02p6q4s_di" bpmnElement="SubProcess_02p6q4s" isExpanded="true">
+        <dc:Bounds x="370" y="430" width="650" height="190" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1tcjlty_di" bpmnElement="SequenceFlow_1tcjlty">
+        <di:waypoint x="810" y="530" />
+        <di:waypoint x="882" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_09y0mpc_di" bpmnElement="SequenceFlow_09y0mpc">
+        <di:waypoint x="640" y="530" />
+        <di:waypoint x="710" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_05haut5_di" bpmnElement="SequenceFlow_05haut5">
+        <di:waypoint x="478" y="530" />
+        <di:waypoint x="540" y="530" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_1r4h504_di" bpmnElement="StartEvent_149ecdm">
+        <dc:Bounds x="442" y="512" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="421" y="553" width="78" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_0gov132_di" bpmnElement="ScriptTask_0gov132">
+        <dc:Bounds x="540" y="490" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_00psvtk_di" bpmnElement="CallActivity_00psvtk">
+        <dc:Bounds x="710" y="490" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1vq2glg_di" bpmnElement="EndEvent_1vq2glg">
+        <dc:Bounds x="882" y="512" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="891" y="555" width="20" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_0slpahe_di" bpmnElement="ServiceTask_0slpaht">
+        <dc:Bounds x="590" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
index 22cf72b..0bf14d7 100644 (file)
@@ -1,7 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation.
- *  Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PnfHealthCheckTest.java
new file mode 100644 (file)
index 0000000..2423ad8
--- /dev/null
@@ -0,0 +1,234 @@
+/*-
+ * ============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.process;
+
+import com.google.protobuf.Struct;
+import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.aaiclient.client.aai.AAIVersion;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.ActionIdentifiers;
+import org.onap.ccsdk.cds.controllerblueprints.common.api.CommonHeader;
+import org.onap.ccsdk.cds.controllerblueprints.processing.api.ExecutionServiceInput;
+import org.onap.so.BaseBPMNTest;
+import org.onap.so.GrpcNettyServer;
+import org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames;
+import org.onap.so.bpmn.mock.FileUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.assertj.core.api.Assertions.fail;
+import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions.assertThat;
+
+/**
+ * Basic Integration test for GenericPnfHealthCheck.bpmn workflow.
+ */
+public class PnfHealthCheckTest extends BaseBPMNTest {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private static final long WORKFLOW_WAIT_TIME = 1000L;
+
+    private static final String TEST_PROCESSINSTANCE_KEY = "GenericPnfHealthCheck";
+    private static final AAIVersion VERSION = AAIVersion.LATEST;
+    private static final Map<String, Object> executionVariables = new HashMap<>();
+    private static final String REQUEST_ID = "50ae41ad-049c-4fe2-9950-539f111120f5";
+    private static final String ACTION_NAME = "healthCheck";
+    private final String CLASS_NAME = getClass().getSimpleName();
+    private String requestObject;
+    private String responseObject;
+
+    @Autowired
+    private GrpcNettyServer grpcNettyServer;
+
+    @Before
+    public void setUp() {
+        executionVariables.clear();
+        grpcNettyServer.getDetailedMessages().clear();
+
+        requestObject = FileUtil.readResourceFile("request/" + CLASS_NAME + ".json");
+        responseObject = FileUtil.readResourceFile("response/" + CLASS_NAME + ".json");
+
+        executionVariables.put("bpmnRequest", requestObject);
+        executionVariables.put("requestId", REQUEST_ID);
+
+        /**
+         * This variable indicates that the flow was invoked asynchronously. It's injected by {@link WorkflowProcessor}.
+         */
+        executionVariables.put("isAsyncProcess", "true");
+        executionVariables.put(ExecutionVariableNames.PRC_CUSTOMIZATION_UUID, "38dc9a92-214c-11e7-93ae-92361f002680");
+
+        /**
+         * Temporary solution to add pnfCorrelationId to context. this value is getting from the request to SO api
+         * handler and then convert to CamundaInput
+         */
+        executionVariables.put(ExecutionVariableNames.PNF_CORRELATION_ID, "PNFDemo");
+    }
+
+
+    @Test
+    public void workflow_validInput_expectedOutput() throws InterruptedException {
+
+        mockCatalogDb();
+        mockRequestDb();
+        mockAai();
+
+        final String msoRequestId = UUID.randomUUID().toString();
+        executionVariables.put(ExecutionVariableNames.MSO_REQUEST_ID, msoRequestId);
+
+        final String testBusinessKey = UUID.randomUUID().toString();
+        logger.info("Test the process instance: {} with business key: {}", TEST_PROCESSINSTANCE_KEY, testBusinessKey);
+
+        ProcessInstance pi =
+                runtimeService.startProcessInstanceByKey(TEST_PROCESSINSTANCE_KEY, testBusinessKey, executionVariables);
+
+        int waitCount = 10;
+        while (!isProcessInstanceEnded() && waitCount >= 0) {
+            Thread.sleep(WORKFLOW_WAIT_TIME);
+            waitCount--;
+        }
+
+        // Layout is to reflect the bpmn visual layout
+        assertThat(pi).isEnded().hasPassedInOrder("pnfHealthCheck_startEvent", "ServiceTask_042uz7m",
+                "ScriptTask_10klpg9", "ServiceTask_0slpaht", "ExclusiveGateway_0x6h0yi", "ScriptTask_1igtc83",
+                "CallActivity_0o1mi8u", "pnfHealthCheck_endEvent");
+
+        List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
+        logger.debug("Size of detailedMessage is {}", detailedMessages.size());
+        assertThat(detailedMessages.size() == 1).isTrue();
+        int count = 0;
+        try {
+            for (ExecutionServiceInput eSI : detailedMessages) {
+                if (ACTION_NAME.equals(eSI.getActionIdentifiers().getActionName())
+                        && eSI.getCommonHeader().getRequestId().equals(msoRequestId)) {
+                    checkWithActionName(eSI, ACTION_NAME);
+                    count++;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("PNFHealthCheck request exception", e);
+        }
+        assertThat(count == 1).isTrue();
+    }
+
+    private boolean isProcessInstanceEnded() {
+        return runtimeService.createProcessInstanceQuery().processDefinitionKey(TEST_PROCESSINSTANCE_KEY)
+                .singleResult() == null;
+    }
+
+    private void checkWithActionName(ExecutionServiceInput executionServiceInput, String action) {
+
+        logger.info("Checking the " + action + " request");
+        ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
+
+        /**
+         * the fields of actionIdentifiers should match the one in the response/PnfHealthCheck_catalogdb.json.
+         */
+        assertThat(actionIdentifiers.getBlueprintName()).isEqualTo("test_pnf_health_check_restconf");
+        assertThat(actionIdentifiers.getBlueprintVersion()).isEqualTo("1.0.0");
+        assertThat(actionIdentifiers.getActionName()).isEqualTo(action);
+        assertThat(actionIdentifiers.getMode()).isEqualTo("async");
+
+        CommonHeader commonHeader = executionServiceInput.getCommonHeader();
+        assertThat(commonHeader.getOriginatorId()).isEqualTo("SO");
+
+        Struct payload = executionServiceInput.getPayload();
+        Struct requeststruct = payload.getFieldsOrThrow(action + "-request").getStructValue();
+
+        assertThat(requeststruct.getFieldsOrThrow("resolution-key").getStringValue()).isEqualTo("PNFDemo");
+        Struct propertiesStruct = requeststruct.getFieldsOrThrow(action + "-properties").getStructValue();
+
+        assertThat(propertiesStruct.getFieldsOrThrow("pnf-name").getStringValue()).isEqualTo("PNFDemo");
+        assertThat(propertiesStruct.getFieldsOrThrow("service-model-uuid").getStringValue())
+                .isEqualTo("32daaac6-5017-4e1e-96c8-6a27dfbe1421");
+        assertThat(propertiesStruct.getFieldsOrThrow("pnf-customization-uuid").getStringValue())
+                .isEqualTo("38dc9a92-214c-11e7-93ae-92361f002680");
+    }
+
+    private void mockAai() {
+
+        String aaiPnfEntry =
+                "{  \n" + "   \"pnf-name\":\"PNFDemo\",\n" + "   \"pnf-id\":\"testtest\",\n" + "   \"in-maint\":true,\n"
+                        + "   \"resource-version\":\"1541720264047\",\n" + "   \"swVersion\":\"demo-1.1\",\n"
+                        + "   \"ipaddress-v4-oam\":\"1.1.1.1\",\n" + "   \"ipaddress-v6-oam\":\"::/128\"\n" + "}";
+
+        /**
+         * PUT the PNF correlation ID to AAI.
+         */
+        wireMockServer.stubFor(put(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")));
+
+        /**
+         * Get the PNF entry from AAI.
+         */
+        wireMockServer.stubFor(
+                get(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")).willReturn(okJson(aaiPnfEntry)));
+
+        /**
+         * Post the pnf to AAI
+         */
+        wireMockServer.stubFor(post(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")));
+    }
+
+    private void mockRequestDb() {
+        /**
+         * Update Request DB
+         */
+        wireMockServer.stubFor(put(urlEqualTo("/infraActiveRequests/" + REQUEST_ID)));
+
+    }
+
+    /**
+     * Mock the catalobdb rest interface.
+     */
+    private void mockCatalogDb() {
+
+        String catalogdbClientResponse = FileUtil.readResourceFile("response/" + CLASS_NAME + "_catalogdb.json");
+
+
+        /**
+         * Return valid json for the model UUID in the request file.
+         */
+        wireMockServer
+                .stubFor(get(urlEqualTo("/v2/serviceResources?serviceModelUuid=32daaac6-5017-4e1e-96c8-6a27dfbe1421"))
+                        .willReturn(okJson(responseObject)));
+
+        /**
+         * Return valid json for the service model InvariantUUID as specified in the request file.
+         */
+        wireMockServer.stubFor(
+                get(urlEqualTo("/v2/serviceResources?serviceModelInvariantUuid=339b7a2f-9524-4dbf-9eee-f2e05521df3f"))
+                        .willReturn(okJson(responseObject)));
+
+        /**
+         * Return valid spring data rest json for the service model UUID as specified in the request file.
+         */
+        wireMockServer.stubFor(get(urlEqualTo(
+                "/pnfResourceCustomization/search/findPnfResourceCustomizationByModelUuid?SERVICE_MODEL_UUID=32daaac6-5017-4e1e-96c8-6a27dfbe1421"))
+                        .willReturn(okJson(catalogdbClientResponse)));
+    }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/request/PnfHealthCheckTest.json
new file mode 100644 (file)
index 0000000..7cfe9f5
--- /dev/null
@@ -0,0 +1,50 @@
+{
+  "requestDetails":{
+    "requestInfo":{
+      "source":"VID",
+      "suppressRollback":false,
+      "requestorId":"demo",
+      "productFamilyId":"SWUPid"
+    },
+    "modelInfo":{
+      "modelType":"service",
+      "modelInvariantUuid":"339b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelInvariantId":"339b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelUuid":"32daaac6-5017-4e1e-96c8-6a27dfbe1421",
+      "modelName":"PNF_int_service_2",
+      "modelVersion":"1.0"
+    },
+    "requestParameters":{
+      "userParams":[
+        {
+          "name":"aic_zone",
+          "value":"nova"
+        },
+        {
+          "name":"pnfId",
+          "value":"PNFDemo"
+        },
+        {
+          "name":"pnfName",
+          "value":"PNFDemo"
+        }
+      ],
+      "subscriptionServiceType":"SWUP",
+      "aLaCarte":false
+    },
+    "cloudConfiguration":{
+      "lcpCloudRegionId":"regionOne",
+      "tenantId":"09a63533072f4a579d5c99c3b8fe94c6"
+    },
+    "subscriberInfo":{
+      "globalSubscriberId":"ADemoCustomerInEric"
+    },
+    "project":{
+      "projectName":"Project-Demonstration"
+    },
+    "owningEntity":{
+      "owningEntityId":"5eae949c-1c50-4780-b8b5-7cbeb08856b4",
+      "owningEntityName":"OE-Demonstration"
+    }
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest.json
new file mode 100644 (file)
index 0000000..3253984
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "serviceResources":{
+    "modelInfo":{
+      "modelInvariantId":"439b7a2f-9524-4dbf-9eee-f2e05521df3f",
+      "modelUuid":"42daaac6-5017-4e1e-96c8-6a27dfbe1421",
+      "modelName":"PNF_int_service_2",
+      "modelVersion":"1.0"
+    },
+    "serviceType":"NA",
+    "environmentContext":"Luna",
+    "serviceRole":"NA",
+    "workloadContext":"Oxygen",
+    "serviceVnfs":[
+
+    ],
+    "serviceNetworks":[
+
+    ],
+    "serviceAllottedResources":[
+
+    ],
+    "configResource":[
+
+    ]
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/response/PnfHealthCheckTest_catalogdb.json
new file mode 100644 (file)
index 0000000..fc9399d
--- /dev/null
@@ -0,0 +1,39 @@
+{
+  "_embedded": {
+    "pnfResourceCustomization": [
+      {
+        "modelCustomizationUUID": "38dc9a92-214c-11e7-93ae-92361f002680",
+        "modelInstanceName": "PNF routing",
+        "created": "2019-03-08 12:00:29.000",
+        "nfFunction": "routing",
+        "nfType": "routing",
+        "nfRole": "routing",
+        "nfNamingCode": "routing",
+        "multiStageDesign": null,
+        "resourceInput": null,
+        "blueprintName": "test_pnf_health_check_restconf",
+        "blueprintVersion": "1.0.0",
+        "skipPostInstConf": false,
+        "softwareVersion": "1.0.0",
+        "creationTimestamp": "2019-03-08T12:00:29.000+0000",
+        "controllerActor": "cds",
+        "_links": {
+          "self": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680"
+          },
+          "pnfResourceCustomization": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680"
+          },
+          "pnfResources": {
+            "href": "http://localhost:41023/pnfResourceCustomization/38dc9a92-214c-11e7-93ae-92361f002680/pnfResources"
+          }
+        }
+      }
+    ]
+  },
+  "_links": {
+    "self": {
+      "href": "http://localhost:41023/pnfResourceCustomization/search/findPnfResourceCustomizationByModelUuid?SERVICE_MODEL_UUID=4df8b6de-2083-11e7-93ae-92361f002676"
+    }
+  }
+}
\ No newline at end of file
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java
new file mode 100644 (file)
index 0000000..72a8590
--- /dev/null
@@ -0,0 +1,174 @@
+/*-
+ * ============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.flowspecific.tasks;
+
+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.Pnf;
+import org.onap.so.bpmn.core.json.JsonUtils;
+import org.onap.so.bpmn.infrastructure.pnf.management.PnfManagement;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+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.List;
+import java.util.Map;
+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 pnf actions
+ */
+@Component
+public class GenericPnfDispatcher implements JavaDelegate {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+    private static final String SERVICE_INSTANCE_NAME = "serviceInstanceName";
+    private static final String BPMN_REQUEST = "bpmnRequest";
+    private static final String RESOURCE_CUSTOMIZATION_UUID_PARAM = "resource_customization_uuid";
+    private static final String PNF_NAME = "pnfName";
+
+    // ERROR CODE for variable not found in the delegation Context
+    private static final int ERROR_CODE = 601;
+
+    @Autowired
+    private PnfManagement pnfManagement;
+
+    @Autowired
+    private ExceptionBuilder exceptionUtil;
+
+    @Autowired
+    private CatalogDbClient catalogDbClient;
+
+    @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 serviceInstanceName = bpmnRequestDetails.getRequestInfo().getInstanceName();
+        final String pnfName;
+        if (delegateExecution.getVariable(PNF_NAME) == null
+                || String.valueOf(delegateExecution.getVariable(PNF_NAME)).trim().isEmpty()) {
+            pnfName = bpmnRequestDetails.getRequestParameters().getUserParamValue(PNF_NAME);
+        } else {
+            pnfName = String.valueOf(delegateExecution.getVariable(PNF_NAME));
+        }
+        final String serviceModelUuid = bpmnRequestDetails.getModelInfo().getModelUuid();
+        final List<Map<String, Object>> userParams = bpmnRequestDetails.getRequestParameters().getUserParams();
+        final Pnf pnf = getPnfByPnfName(delegateExecution, pnfName);
+        final List<PnfResourceCustomization> pnfCustomizations =
+                getPnfResourceCustomizations(delegateExecution, serviceModelUuid);
+        final PnfResourceCustomization pnfResourceCustomization = pnfCustomizations.get(0);
+        final String payload = bpmnRequestDetails.getRequestParameters().getPayload();
+
+        populateExecution(delegateExecution, bpmnRequestDetails, pnfResourceCustomization, pnf, serviceInstanceName,
+                pnfName, serviceModelUuid, userParams, payload);
+
+        logger.trace("Completed dispatcher request for PNF.");
+    }
+
+    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 populateExecution(DelegateExecution delegateExecution, RequestDetails bpmnRequestDetails,
+            PnfResourceCustomization pnfResourceCustomization, Pnf pnf, String serviceInstanceName, String pnfName,
+            String serviceModelUuid, List<Map<String, Object>> userParams, String payload) {
+
+        delegateExecution.setVariable(SERVICE_MODEL_INFO, bpmnRequestDetails.getModelInfo());
+        delegateExecution.setVariable(SERVICE_INSTANCE_NAME, serviceInstanceName);
+        delegateExecution.setVariable(PNF_CORRELATION_ID, pnfName);
+        delegateExecution.setVariable(MODEL_UUID, serviceModelUuid);
+        delegateExecution.setVariable(PNF_UUID, pnf.getPnfId());
+        delegateExecution.setVariable(PRC_BLUEPRINT_NAME, pnfResourceCustomization.getBlueprintName());
+        delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, pnfResourceCustomization.getBlueprintVersion());
+        delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, pnfResourceCustomization.getModelCustomizationUUID());
+        delegateExecution.setVariable(RESOURCE_CUSTOMIZATION_UUID_PARAM,
+                pnfResourceCustomization.getModelCustomizationUUID());
+        delegateExecution.setVariable(PRC_INSTANCE_NAME, pnfResourceCustomization.getModelInstanceName());
+        delegateExecution.setVariable(PRC_CONTROLLER_ACTOR, pnfResourceCustomization.getControllerActor());
+
+        for (Map<String, Object> param : userParams) {
+            if (param.containsKey("name") && param.containsKey("value")) {
+                delegateExecution.setVariable(param.get("name").toString(), param.get("value").toString());
+            }
+        }
+
+        delegateExecution.setVariable(REQUEST_PAYLOAD, payload);
+    }
+
+    private Pnf getPnfByPnfName(DelegateExecution delegateExecution, String pnfName) {
+        Optional<Pnf> pnfOptional = Optional.empty();
+        try {
+            pnfOptional = pnfManagement.getEntryFor(pnfName);
+        } catch (IOException e) {
+            throwExceptionWithWarn(delegateExecution, "Unable to fetch from AAI" + e.getMessage());
+        }
+        if (!pnfOptional.isPresent()) {
+            throwExceptionWithWarn(delegateExecution, "AAI entry for PNF: " + pnfName + " does not exist");
+        }
+        return pnfOptional.get();
+    }
+
+    private List<PnfResourceCustomization> getPnfResourceCustomizations(DelegateExecution delegateExecution,
+            String serviceModelUuid) {
+        List<PnfResourceCustomization> pnfCustomizations =
+                catalogDbClient.getPnfResourceCustomizationByModelUuid(serviceModelUuid);
+
+        if (pnfCustomizations == null || pnfCustomizations.isEmpty()) {
+            throwExceptionWithWarn(delegateExecution,
+                    "Unable to find the PNF resource customizations of model service UUID:  " + serviceModelUuid);
+        }
+        return pnfCustomizations;
+    }
+
+    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);
+    }
+}
index 1910b54..33d86a2 100644 (file)
@@ -1,8 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- * ONAP - SO
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ *  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.
@@ -15,6 +13,8 @@
  * 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=========================================================
  */