SO-CDS PNF BB 21/99221/13
authortragait <rahul.tyagi@est.tech>
Thu, 5 Dec 2019 18:04:31 +0000 (18:04 +0000)
committertragait <rahul.tyagi@est.tech>
Thu, 20 Feb 2020 13:33:16 +0000 (13:33 +0000)
This commit implements code for PNF BB for pnf
software upgrade usecase.

Issue-ID: SO-2090
Signed-off-by: tragait <rahul.tyagi@est.tech>
Change-Id: I3da3ba965bc92fda0ecc542d42afe694f19e06e1
Signed-off-by: tragait <rahul.tyagi@est.tech>
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/GeneratePayloadForCds.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PayloadConstants.java
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/GeneratePayloadForCdsTest.java
bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/ConfigurePnfResource.bpmn
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDE.java [moved from bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDE.java with 73% similarity]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/ControllerExecutionDETestIT.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/PnfConfigCdsControllerDETest.java [moved from bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/cds/CdsControllerDETest.java with 61% similarity]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java [new file with mode: 0644]

index 0766dae..fb79880 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2019 Bell Canada
  * ================================================================================
+ * Modifications Copyright (c) 2020 Nordix
+ * ================================================================================
  * 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
@@ -20,6 +22,7 @@
 
 package org.onap.so.client.cds;
 
+import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
@@ -34,8 +37,9 @@ import java.util.UUID;
 public class GeneratePayloadForCds {
 
     private static final String ORIGINATOR_ID = "SO";
-    private static final String MODE = "sync";
     private static final String BUILDING_BLOCK = "buildingBlock";
+    private static final String DEFAULT_SYNC_MODE = "sync";
+    private static final String MSO_REQUEST_ID = "msoRequestId";
 
     @Autowired
     private VnfCDSRequestProvider vnfCDSRequestProvider;
@@ -49,8 +53,12 @@ public class GeneratePayloadForCds {
     @Autowired
     private ExtractPojosForBB extractPojosForBB;
 
+    @Autowired
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
     /**
-     * Build properties like (blueprint name, version, action etc..) along with the request payload.
+     * Build properties like (blueprint name, version, action etc..) along with the request payload for vnf, vf-module
+     * and service.
      *
      * @param execution - A building block execution object.
      * @return AbstractCDSPropertiesBean - A POJO which contains CDS related information.
@@ -61,8 +69,9 @@ public class GeneratePayloadForCds {
 
         ExecuteBuildingBlock executeBuildingBlock = execution.getVariable(BUILDING_BLOCK);
         BuildingBlock buildingBlock = executeBuildingBlock.getBuildingBlock();
-        String scope = buildingBlock.getBpmnScope();
-        String action = buildingBlock.getBpmnAction();
+        final String requestId = execution.getGeneralBuildingBlock().getRequestContext().getMsoRequestId();
+        final String scope = buildingBlock.getBpmnScope();
+        final String action = buildingBlock.getBpmnAction();
 
 
         CDSRequestProvider requestProvider = getRequestProviderByScope(scope);
@@ -71,7 +80,35 @@ public class GeneratePayloadForCds {
         final String requestPayload = requestProvider.buildRequestPayload(action)
                 .orElseThrow(() -> new PayloadGenerationException("Failed to build payload for CDS"));
 
-        final String requestId = execution.getGeneralBuildingBlock().getRequestContext().getMsoRequestId();
+        return prepareAndSetCdsPropertyBean(requestProvider, requestPayload, requestId, action, DEFAULT_SYNC_MODE);
+    }
+
+    /**
+     * Build properties like (blueprint name, version, action etc..) along with the request payload for pnf.
+     *
+     * @param execution - A building block execution object.
+     * @return AbstractCDSPropertiesBean - A POJO which contains CDS related information.
+     * @throws PayloadGenerationException - Throw an exception if it fails to build payload for CDS.
+     */
+    public AbstractCDSPropertiesBean buildCdsPropertiesBean(DelegateExecution execution)
+            throws PayloadGenerationException {
+
+        final String scope = String.valueOf(execution.getVariable(PayloadConstants.SCOPE));
+        final String action = String.valueOf(execution.getVariable(PayloadConstants.ACTION));
+        final String requestId = String.valueOf(execution.getVariable(MSO_REQUEST_ID));
+        final String mode = extractAndSetMode(execution);
+
+        CDSRequestProvider requestProvider = getRequestProviderByScope(scope);
+        requestProvider.setExecutionObject(execution);
+
+        final String requestPayload = requestProvider.buildRequestPayload(action)
+                .orElseThrow(() -> new PayloadGenerationException("Failed to build payload for CDS"));
+
+        return prepareAndSetCdsPropertyBean(requestProvider, requestPayload, requestId, action, mode);
+    }
+
+    private AbstractCDSPropertiesBean prepareAndSetCdsPropertyBean(CDSRequestProvider requestProvider,
+            String requestPayload, String requestId, String action, String mode) {
         final AbstractCDSPropertiesBean cdsPropertiesBean = new AbstractCDSPropertiesBean();
         cdsPropertiesBean.setRequestObject(requestPayload);
         cdsPropertiesBean.setBlueprintName(requestProvider.getBlueprintName());
@@ -80,23 +117,34 @@ public class GeneratePayloadForCds {
         cdsPropertiesBean.setOriginatorId(ORIGINATOR_ID);
         cdsPropertiesBean.setSubRequestId(UUID.randomUUID().toString());
         cdsPropertiesBean.setActionName(action);
-        cdsPropertiesBean.setMode(MODE);
-
+        cdsPropertiesBean.setMode(mode);
         return cdsPropertiesBean;
     }
 
+    private String extractAndSetMode(DelegateExecution execution) {
+        String mode = DEFAULT_SYNC_MODE;
+        Object obj = execution.getVariable(PayloadConstants.MODE);
+        if (obj != null && !String.valueOf(obj).isEmpty()) {
+            mode = String.valueOf(obj);
+        }
+        return mode;
+    }
+
     private CDSRequestProvider getRequestProviderByScope(String scope) throws PayloadGenerationException {
         CDSRequestProvider requestProvider;
         switch (scope) {
-            case "vnf":
+            case PayloadConstants.VNF_SCOPE:
                 requestProvider = vnfCDSRequestProvider;
                 break;
-            case "vfModule":
+            case PayloadConstants.VF_MODULE_SCOPE:
                 requestProvider = vfModuleCDSRequestProvider;
                 break;
-            case "service":
+            case PayloadConstants.SERVICE_SCOPE:
                 requestProvider = serviceCDSRequestProvider;
                 break;
+            case PayloadConstants.PNF_SCOPE:
+                requestProvider = pnfCDSRequestProvider;
+                break;
             default:
                 throw new PayloadGenerationException("No scope defined with " + scope);
         }
index e758f54..808d427 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2019 Bell Canada
  * ================================================================================
+ * Modifications Copyright (C) 2020 Nordix
+ * ================================================================================
  * 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
@@ -30,5 +32,22 @@ public final class PayloadConstants {
     public static final String PROPERTIES = "properties";
     public static final String SCOPE = "scope";
     public static final String ACTION = "action";
+    public static final String MODE = "mode";
     public static final String SEPARATOR = "-";
+    public static final String PNF_SCOPE = "pnf";
+    public static final String VNF_SCOPE = "vnf";
+    public static final String VF_MODULE_SCOPE = "vfModule";
+    public static final String SERVICE_SCOPE = "service";
+    public static final String RESOLUTION_KEY = "resolution-key";
+    public static final String CDS_ACTOR = "cds";
+
+    public static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    public static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    public static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    public static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+
+    public final static String PNF_CORRELATION_ID = "pnfCorrelationId";
+    public final static String PNF_UUID = "pnfUuid";
+    public final static String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    public final static String MODEL_UUID = "modelUuid";
 }
diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/client/cds/PnfCDSRequestProvider.java
new file mode 100644 (file)
index 0000000..86bca75
--- /dev/null
@@ -0,0 +1,78 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  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.client.cds;
+
+import com.google.gson.JsonObject;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import java.util.Optional;
+import static org.onap.so.client.cds.PayloadConstants.*;
+
+@Component
+@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class PnfCDSRequestProvider implements CDSRequestProvider {
+    private String blueprintName;
+    private String blueprintVersion;
+    private DelegateExecution execution;
+
+    @Override
+    public String getBlueprintName() {
+        return blueprintName;
+    }
+
+    @Override
+    public String getBlueprintVersion() {
+        return blueprintVersion;
+    }
+
+    @Override
+    public <T> void setExecutionObject(T executionObject) {
+        execution = (DelegateExecution) executionObject;
+    }
+
+    @Override
+    public Optional<String> buildRequestPayload(String action) {
+
+        final JsonObject pnfObject = new JsonObject();
+        final String resolutionKey = String.valueOf(execution.getVariable(PNF_CORRELATION_ID));
+        blueprintName = String.valueOf(execution.getVariable(PRC_BLUEPRINT_NAME));
+        blueprintVersion = String.valueOf(execution.getVariable(PRC_BLUEPRINT_VERSION));
+
+        extractAndSetExecutionVariable("service-instance-id", SERVICE_INSTANCE_ID, pnfObject);
+        extractAndSetExecutionVariable("service-model-uuid", MODEL_UUID, pnfObject);
+        extractAndSetExecutionVariable("pnf-id", PNF_UUID, pnfObject);
+        extractAndSetExecutionVariable("pnf-name", PNF_CORRELATION_ID, pnfObject);
+        extractAndSetExecutionVariable("pnf-customization-uuid", PRC_CUSTOMIZATION_UUID, pnfObject);
+        extractAndSetExecutionVariable("target-software-version", PRC_TARGET_SOFTWARE_VERSION, pnfObject);
+
+        final JsonObject cdsPropertyObject = new JsonObject();
+        cdsPropertyObject.addProperty(RESOLUTION_KEY, resolutionKey);
+        cdsPropertyObject.add(action + SEPARATOR + PROPERTIES, pnfObject);
+
+        return Optional.of(buildRequestJsonObject(cdsPropertyObject, action));
+    }
+
+    private void extractAndSetExecutionVariable(String jsonProperty, String executionProperty, JsonObject pnfObject) {
+        if (execution.getVariable(executionProperty) != null) {
+            pnfObject.addProperty(jsonProperty, String.valueOf(execution.getVariable(executionProperty)));
+        }
+    }
+}
index 471bdb7..24962a0 100644 (file)
@@ -19,9 +19,6 @@
  */
 package org.onap.so.client.cds;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.gson.JsonParser;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
 import org.junit.Before;
@@ -30,7 +27,6 @@ import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
-import org.omg.Messaging.SYNC_WITH_TRANSPORT;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.common.DelegateExecutionImpl;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
@@ -38,28 +34,19 @@ import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestParameters;
-import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
-import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.client.exception.PayloadGenerationException;
 import org.onap.so.serviceinstancebeans.*;
 import java.util.*;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.ThrowableAssert.catchThrowable;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 
 @RunWith(MockitoJUnitRunner.Silent.class)
 public class GeneratePayloadForCdsTest {
-    private static final String GENERIC_VNF_ID = "vnfId_configVnfTest1";
-    private static final String VF_MODULE_ID = "vf-module-id-1";
-    private static final String VF_MODULE_NAME = "vf-module-name-1";
     private static final String VF_MODULE_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce1";
-    private static final String GENERIC_VNF_NAME = "vnf-name-1";
-    private static final String SERVICE_INSTANCE_ID = "serviceInst_configTest";
-    private static final String SERVICE_MODEL_UUID = "b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4";
-    private static final String SERVICE_INSTANCE_NAME = "test-service-instance";
     private static final String VNF_MODEL_CUSTOMIZATION_UUID = "23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4";
     private static final String GENERAL_BLOCK_EXECUTION_MAP_KEY = "gBBInput";
     private static final String VNF_SCOPE = "vnf";
@@ -68,10 +55,34 @@ public class GeneratePayloadForCdsTest {
     private static final String VF_SCOPE = "vfModule";
     private static final String ASSIGN_ACTION = "configAssign";
     private static final String DEPLOY_ACTION = "configDeploy";
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
     private static final String MSO_REQUEST_ID = "1234";
     private static final String BUILDING_BLOCK = "buildingBlock";
     private static final String PUBLIC_NET_ID = "public-net-id";
     private static final String CLOUD_REGION = "acl-cloud-region";
+    private static final String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
+    private static final String TEST_SERVICE_INSTANCE_ID = "test_service_id";
+    private static final String TEST_PROCESS_KEY = "processKey1";
+    private static final String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
+    private static final String TEST_PNF_CORRELATION_ID = "PNFDemo";
+    private static final String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
+    private static final String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
+    private static final String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static final String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+    private static final String PNF_CORRELATION_ID = "pnfCorrelationId";
+    private static final String PNF_UUID = "pnfUuid";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String MODEL_UUID = "modelUuid";
+    private static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    private static final String PRC_INSTANCE_NAME = "PRC_instanceName";
+    private static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+    private static final String SCOPE = "scope";
+    private static final String ACTION = "action";
+    private static final String PROCESS_KEY = "testProcessKey";
+    private static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    private static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_NAME = "blueprintOnap";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
 
     private BuildingBlockExecution buildingBlockExecution;
     private ExecuteBuildingBlock executeBuildingBlock;
@@ -88,6 +99,9 @@ public class GeneratePayloadForCdsTest {
     @Mock
     private ServiceCDSRequestProvider serviceCDSRequestProvider;
 
+    @Mock
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
 
     @Before
     public void setup() {
@@ -100,9 +114,7 @@ public class GeneratePayloadForCdsTest {
         // given
         final String assignPayload =
                 "{\"configAssign-request\":{\"resolution-key\":\"vnf-name-1\",\"configAssign-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\",\"vnf-id\":\"vnfId_configVnfTest1\",\"vnf-name\":\"vnf-name-1\",\"vnf-customization-uuid\":\"23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4\",\"acl-cloud-region\":\"acl-cloud-region\",\"public_net_id\":\"public-net-id\"}}}";
-
         setScopeAndAction(VNF_SCOPE, ASSIGN_ACTION);
-
         doReturn(Optional.of(assignPayload)).when(vnfCDSRequestProvider).buildRequestPayload(ASSIGN_ACTION);
 
         // when
@@ -125,7 +137,6 @@ public class GeneratePayloadForCdsTest {
         final String deployPayload =
                 "{\"configDeploy-request\":{\"resolution-key\":\"vnf-name-1\",\"configDeploy-properties\":{\"service-instance-id\":\"serviceInst_configTest\",\"service-model-uuid\":\"b45b5780-e5dd-11e9-81b4-2a2ae2dbcce4\",\"vnf-id\":\"vnfId_configVnfTest1\",\"vnf-name\":\"vnf-name-1\",\"vnf-customization-uuid\":\"23ce9ac4-e5dd-11e9-81b4-2a2ae2dbcce4\",\"acl-cloud-region\":\"acl-cloud-region\",\"public_net_id\":\"public-net-id\"}}}";
         setScopeAndAction(VNF_SCOPE, DEPLOY_ACTION);
-
         doReturn(Optional.of(deployPayload)).when(vnfCDSRequestProvider).buildRequestPayload(DEPLOY_ACTION);
 
         // when
@@ -187,11 +198,36 @@ public class GeneratePayloadForCdsTest {
         assertThat(propertyBean.getMode().equalsIgnoreCase("sync"));
     }
 
+    @Test
+    public void testBuildCdsPropertiesBeanDownloadPnf() throws Exception {
+        // given
+        final String downloadPayload =
+                "{\"downloadNeSw-request\":{\"resolution-key\":\"PNFDemo\",\"downloadNeSw-properties\":{\"service-instance-id\":\"test_service_id\",\"service-model-uuid\":\"6bc0b04d-1873-4721-b53d-6615225b2a28\",\"pnf-id\":\"5df8b6de-2083-11e7-93ae-92361f002671\",\"pnf-name\":\"PNFDemo\",\"pnf-customization-uuid\":\"9acb3a83-8a52-412c-9a45-901764938144\",\"target-software-version\":\"demo-sw-ver2.0.0\"}}}";
+        DelegateExecution execution = prepareDelegateExecutionObj(PayloadConstants.PNF_SCOPE, DOWNLOAD_ACTION);
+        doReturn(Optional.of(downloadPayload)).when(pnfCDSRequestProvider).buildRequestPayload(DOWNLOAD_ACTION);
+        doReturn(TEST_PNF_RESOURCE_BLUEPRINT_NAME).when(pnfCDSRequestProvider).getBlueprintName();
+        doReturn(TEST_PNF_RESOURCE_BLUEPRINT_VERSION).when(pnfCDSRequestProvider).getBlueprintVersion();
+
+        // when
+        AbstractCDSPropertiesBean propertyBean = configurePayloadForCds.buildCdsPropertiesBean(execution);
+
+        // verify
+        assertNotNull(propertyBean);
+        String payload = propertyBean.getRequestObject();
+        assertThat(downloadPayload.equals(payload));
+        assertThat(propertyBean.getRequestId().equals(MSO_REQUEST_ID));
+        assertThat(propertyBean.getOriginatorId().equals("SO"));
+        assertNotNull(propertyBean.getSubRequestId());
+        assertThat(propertyBean.getActionName().equals(DOWNLOAD_ACTION));
+        assertThat(propertyBean.getMode().equalsIgnoreCase("async"));
+        assertThat(propertyBean.getBlueprintName().equalsIgnoreCase(TEST_PNF_RESOURCE_BLUEPRINT_NAME));
+        assertThat(propertyBean.getBlueprintVersion().equalsIgnoreCase(TEST_PNF_RESOURCE_BLUEPRINT_VERSION));
+    }
+
     @Test
     public void testFailureWhenServiceInstanceIsNotPresent() throws Exception {
         // given
         setScopeAndAction(VNF_SCOPE, ASSIGN_ACTION);
-
         doThrow(PayloadGenerationException.class).when(serviceCDSRequestProvider).buildRequestPayload(ASSIGN_ACTION);
 
         // when
@@ -284,4 +320,23 @@ public class GeneratePayloadForCdsTest {
         executeBuildingBlock.setBuildingBlock(buildingBlock);
         buildingBlockExecution.setVariable(BUILDING_BLOCK, executeBuildingBlock);
     }
+
+    private DelegateExecution prepareDelegateExecutionObj(String scope, String action) {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(PROCESS_KEY, TEST_PROCESS_KEY);
+        execution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
+        execution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
+        execution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
+        execution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
+        execution.setVariable(PNF_UUID, TEST_PNF_UUID);
+        execution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
+        execution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        execution.setVariable(PRC_TARGET_SOFTWARE_VERSION, TEST_SOFTWARE_VERSION);
+        execution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
+        execution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
+        execution.setVariable(SCOPE, scope);
+        execution.setVariable(ACTION, action);
+        execution.setVariable("mode", "async");
+        return execution;
+    }
 }
diff --git a/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java b/bpmn/MSOCommonBPMN/src/test/java/org/onap/so/client/cds/PnfCDSRequestProviderTest.java
new file mode 100644 (file)
index 0000000..e5cbc9a
--- /dev/null
@@ -0,0 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  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.client.cds;
+
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.JsonParser;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.junit.MockitoJUnitRunner;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class PnfCDSRequestProviderTest {
+
+    @InjectMocks
+    private PnfCDSRequestProvider pnfCDSRequestProvider;
+
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
+    private static final String TEST_SERVICE_INSTANCE_ID = "test_service_id";
+    private static final String TEST_PROCESS_KEY = "processKey1";
+    private static final String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
+    private static final String TEST_PNF_CORRELATION_ID = "PNFDemo";
+    private static final String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
+    private static final String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
+    private static final String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static final String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+    private static final String PNF_CORRELATION_ID = "pnfCorrelationId";
+    private static final String PNF_UUID = "pnfUuid";
+    private static final String SERVICE_INSTANCE_ID = "serviceInstanceId";
+    private static final String MSO_REQUEST_ID = "msoRequestId";
+    private static final String MODEL_UUID = "modelUuid";
+    private static final String PRC_CUSTOMIZATION_UUID = "PRC_customizationUuid";
+    private static final String PRC_INSTANCE_NAME = "PRC_instanceName";
+    private static final String PRC_TARGET_SOFTWARE_VERSION = "targetSoftwareVersion";
+    private static final String SCOPE = "scope";
+    private static final String ACTION = "action";
+    private static final String PROCESS_KEY = "testProcessKey";
+    private static final String PRC_BLUEPRINT_NAME = "PRC_blueprintName";
+    private static final String PRC_BLUEPRINT_VERSION = "PRC_blueprintVersion";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_NAME = "blueprintOnap";
+    private static final String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
+
+    @Test
+    public void testBuildRequestPayloadDownloadActionPnf() {
+        try {
+            runTest(DOWNLOAD_ACTION);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    @Test
+    public void testBuildRequestPayloadActivateActionPnf() {
+        try {
+            runTest(ACTIVATE_ACTION);
+        } catch (Exception e) {
+            Assert.fail(e.getMessage());
+        }
+    }
+
+    private void runTest(String action) throws Exception {
+        // given
+        DelegateExecution execution = prepareDelegateExecutionObj(PayloadConstants.PNF_SCOPE, action);
+
+        // when
+        pnfCDSRequestProvider.setExecutionObject(execution);
+        String payload = pnfCDSRequestProvider.buildRequestPayload(action).get();
+        System.out.println(payload);
+
+        // verify
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode payloadJson = mapper.readTree(payload);
+        JsonNode requestNode = payloadJson.findValue(action + "-request");
+        JsonNode propertiesNode = payloadJson.findValue(action + "-properties");
+
+        assertNotNull(payload);
+        assertTrue(verfiyJsonFromString(payload));
+        assertThat(requestNode.get("resolution-key").asText()).isEqualTo(TEST_PNF_CORRELATION_ID);
+        assertThat(propertiesNode.get("service-instance-id").asText()).isEqualTo(TEST_SERVICE_INSTANCE_ID);
+        assertThat(propertiesNode.get("service-model-uuid").asText()).isEqualTo(TEST_MODEL_UUID);
+        assertThat(propertiesNode.get("pnf-id").asText()).isEqualTo(TEST_PNF_UUID);
+        assertThat(propertiesNode.get("pnf-customization-uuid").asText())
+                .isEqualTo(TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        assertThat(propertiesNode.get("target-software-version").asText()).isEqualTo(TEST_SOFTWARE_VERSION);
+        assertThat(pnfCDSRequestProvider.getBlueprintName().equals(TEST_PNF_RESOURCE_BLUEPRINT_NAME));
+        assertThat(pnfCDSRequestProvider.getBlueprintVersion().equals(TEST_PNF_RESOURCE_BLUEPRINT_VERSION));
+    }
+
+    private DelegateExecution prepareDelegateExecutionObj(String scope, String action) {
+        DelegateExecution execution = new DelegateExecutionFake();
+        execution.setVariable(PROCESS_KEY, TEST_PROCESS_KEY);
+        execution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
+        execution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
+        execution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
+        execution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
+        execution.setVariable(PNF_UUID, TEST_PNF_UUID);
+        execution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
+        execution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        execution.setVariable(PRC_TARGET_SOFTWARE_VERSION, TEST_SOFTWARE_VERSION);
+        execution.setVariable(SCOPE, scope);
+        execution.setVariable(ACTION, action);
+        execution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
+        execution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
+        return execution;
+    }
+
+    private boolean verfiyJsonFromString(String payload) {
+        JsonParser parser = new JsonParser();
+        return parser.parse(payload).isJsonObject();
+    }
+
+}
index 6d5b2a2..693dd92 100644 (file)
@@ -1,5 +1,5 @@
 <?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:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_13i2vsn" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="2.2.4">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_13i2vsn" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.3.5">
   <bpmn:process id="ConfigurePnfResource" name="ConfigurePnfResource" isExecutable="true">
     <bpmn:startEvent id="ConfigurePnfResource_StartEvent">
       <bpmn:outgoing>SequenceFlow_069mxkg</bpmn:outgoing>
@@ -57,6 +57,7 @@
         <camunda:inputOutput>
           <camunda:inputParameter name="action">config-assign</camunda:inputParameter>
           <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">sync</camunda:inputParameter>
         </camunda:inputOutput>
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_0j3pm2g</bpmn:incoming>
@@ -68,6 +69,7 @@
         <camunda:inputOutput>
           <camunda:inputParameter name="action">config-deploy</camunda:inputParameter>
           <camunda:inputParameter name="scope">pnf</camunda:inputParameter>
+          <camunda:inputParameter name="mode">async</camunda:inputParameter>
         </camunda:inputOutput>
       </bpmn:extensionElements>
       <bpmn:incoming>SequenceFlow_1owbpsy</bpmn:incoming>
@@ -24,6 +24,7 @@ import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
 import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
 import org.onap.so.bpmn.infrastructure.decisionpoint.api.controller.ControllerPreparable;
 import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.PayloadConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -31,17 +32,23 @@ import org.springframework.stereotype.Component;
  * This implementation of {@ref ControllerRunnable} is used for Self service, i.e, blueprint based Controller.
  */
 @Component
-public class CdsControllerDE implements ControllerRunnable<DelegateExecution> {
+public class PnfConfigCdsControllerDE implements ControllerRunnable<DelegateExecution> {
+
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
 
     @Autowired(required = false)
     private List<ControllerPreparable<DelegateExecution>> prepareList;
 
     @Autowired
-    private AbstractCDSProcessingBBUtils abstractCDSProcessingBBUtils;
+    private AbstractCDSProcessingBBUtils cdsDispatcher;
 
     @Override
     public Boolean understand(ControllerContext<DelegateExecution> context) {
-        return context.getControllerActor().equalsIgnoreCase("cds");
+        return PayloadConstants.CDS_ACTOR.equalsIgnoreCase(context.getControllerActor())
+                && PayloadConstants.PNF_SCOPE.equalsIgnoreCase(context.getControllerScope())
+                && (ASSIGN_ACTION.equalsIgnoreCase(context.getControllerAction())
+                        || DEPLOY_ACTION.equalsIgnoreCase(context.getControllerAction())); // legacy behavior
     }
 
     @Override
@@ -58,7 +65,7 @@ public class CdsControllerDE implements ControllerRunnable<DelegateExecution> {
     @Override
     public void run(ControllerContext<DelegateExecution> context) {
         DelegateExecution execution = context.getExecution();
-        abstractCDSProcessingBBUtils.constructExecutionServiceInputObject(execution);
-        abstractCDSProcessingBBUtils.sendRequestToCDSClient(execution);
+        cdsDispatcher.constructExecutionServiceInputObject(execution);
+        cdsDispatcher.sendRequestToCDSClient(execution);
     }
 }
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDE.java
new file mode 100644 (file)
index 0000000..d5423b2
--- /dev/null
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  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 org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerRunnable;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.GeneratePayloadForCds;
+import org.onap.so.client.cds.PayloadConstants;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * For pnf, DelegateExecution is being used.
+ *
+ * @param - DelegateExecution
+ */
+@Component
+public class GenericPnfCDSProcessingDE implements ControllerRunnable<DelegateExecution> {
+    private static final Logger logger = LoggerFactory.getLogger(GenericPnfCDSProcessingDE.class);
+    private static final String EXECUTION_OBJECT = "executionObject";
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
+
+    @Autowired
+    private ExceptionBuilder exceptionBuilder;
+
+    @Autowired
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    @Autowired
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    @Override
+    public Boolean understand(ControllerContext<DelegateExecution> context) {
+        final String scope = context.getControllerScope();
+        return PayloadConstants.CDS_ACTOR.equalsIgnoreCase(context.getControllerActor())
+                && PayloadConstants.PNF_SCOPE.equalsIgnoreCase(scope)
+                && !(ASSIGN_ACTION.equalsIgnoreCase(context.getControllerAction())
+                        || DEPLOY_ACTION.equalsIgnoreCase(context.getControllerAction()));
+    }
+
+    @Override
+    public Boolean ready(ControllerContext<DelegateExecution> context) {
+        return true;
+    }
+
+    @Override
+    public void prepare(ControllerContext<DelegateExecution> context) {
+        DelegateExecution delegateExecution = context.getExecution();
+        try {
+            AbstractCDSPropertiesBean abstractCDSPropertiesBean =
+                    generatePayloadForCds.buildCdsPropertiesBean(delegateExecution);
+
+            delegateExecution.setVariable(EXECUTION_OBJECT, abstractCDSPropertiesBean);
+
+        } catch (Exception ex) {
+            logger.error("An exception occurred when creating payload for CDS request", ex);
+            exceptionBuilder.buildAndThrowWorkflowException(delegateExecution, 7000, ex);
+        }
+    }
+
+    @Override
+    public void run(ControllerContext<DelegateExecution> context) {
+        DelegateExecution obj = context.getExecution();
+        cdsDispather.constructExecutionServiceInputObject(obj);
+        cdsDispather.sendRequestToCDSClient(obj);
+    }
+}
index 860780a..275cd18 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.fail;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.MODEL_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.MSO_REQUEST_ID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_CORRELATION_ID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PNF_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_BLUEPRINT_NAME;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_BLUEPRINT_VERSION;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_CUSTOMIZATION_UUID;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.PRC_INSTANCE_NAME;
-import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.SERVICE_INSTANCE_ID;
 import com.google.protobuf.Struct;
-import java.util.List;
 import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 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.BaseIntegrationTest;
 import org.onap.so.GrpcNettyServer;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.client.aai.AAIVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.fail;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*;
 
+@RunWith(Parameterized.class)
 public class ControllerExecutionDETestIT extends BaseIntegrationTest {
 
     private Logger logger = LoggerFactory.getLogger(this.getClass());
 
+    @ClassRule
+    public static final SpringClassRule springClassRule = new SpringClassRule();
+
+    @Rule
+    public final SpringMethodRule smr = new SpringMethodRule();
+
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String PRECHECK_ACTION = "precheck";
+    private static final String POSTCHECK_ACTION = "postcheck";
+    private static final String ASSIGN_ACTION = "config-assign";
+    private static final String DEPLOY_ACTION = "config-deploy";
+    private static final String CDS_ACTOR = "cds";
+
     @Autowired
     private ControllerExecutionDE controllerExecutionDE;
 
     @Autowired
     private GrpcNettyServer grpcNettyServer;
 
-    private GenericVnf genericVnf;
-
     private static String TEST_MODEL_UUID = "6bc0b04d-1873-4721-b53d-6615225b2a28";
     private static String TEST_SERVICE_INSTANCE_ID = "test_service_id";
     private static String TEST_PROCESS_KEY = "processKey1";
     private static String TEST_MSO_REQUEST_ID = "ff874603-4222-11e7-9252-005056850d2e";
 
-    private static String TEST_CDS_ACTION = "config-assign";
-    private static String TEST_APPC_ACTION = "HealthCheck";
+    private static final AAIVersion VERSION = AAIVersion.LATEST;
 
     private static String TEST_PNF_RESOURCE_INSTANCE_NAME = "PNF_demo_resource";
     private static String TEST_PNF_CORRELATION_ID = "PNFDemo";
@@ -70,75 +83,112 @@ public class ControllerExecutionDETestIT extends BaseIntegrationTest {
     private static String TEST_PNF_RESOURCE_BLUEPRINT_VERSION = "1.0.1";
     private static String TEST_PNF_RESOURCE_CUSTOMIZATION_UUID = "9acb3a83-8a52-412c-9a45-901764938144";
     private static String TEST_PNF_UUID = "5df8b6de-2083-11e7-93ae-92361f002671";
+    private static String TEST_SOFTWARE_VERSION = "demo-sw-ver2.0.0";
+
+    private String description;
+    private String action;
+    private String scope;
+
+    public ControllerExecutionDETestIT(String desc, String action, String scope) {
+        this.description = desc;
+        this.action = action;
+        this.scope = scope;
+
+    }
+
+    @Parameterized.Parameters(name = "index {0}")
+    public static Collection<String[]> data() {
+        return Arrays.asList(
+                new String[][] {{"Test JSON for action:" + ACTIVATE_ACTION + " scope:pnf", ACTIVATE_ACTION, "pnf"},
+                        {"Test JSON for action:" + DOWNLOAD_ACTION + " scope:pnf", DOWNLOAD_ACTION, "pnf"},
+                        {"Test JSON for action:" + ASSIGN_ACTION + " scope:pnf", ASSIGN_ACTION, "pnf"},
+                        {"Test JSON for action:" + DEPLOY_ACTION + " scope:pnf", DEPLOY_ACTION, "pnf"},
+                        {"Test JSON for action:" + PRECHECK_ACTION + " scope:pnf", PRECHECK_ACTION, "pnf"},
+                        {"Test JSON for action:" + POSTCHECK_ACTION + " scope:pnf", POSTCHECK_ACTION, "pnf"}});
+    }
 
     @Before
     public void setUp() {
+        delegateExecution.setVariable("testProcessKey", TEST_PROCESS_KEY);
+        delegateExecution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
         delegateExecution.setVariable(MODEL_UUID, TEST_MODEL_UUID);
         delegateExecution.setVariable(SERVICE_INSTANCE_ID, TEST_SERVICE_INSTANCE_ID);
         delegateExecution.setVariable(MSO_REQUEST_ID, TEST_MSO_REQUEST_ID);
-        delegateExecution.setVariable("testProcessKey", TEST_PROCESS_KEY);
+        delegateExecution.setVariable(PNF_UUID, TEST_PNF_UUID);
+        delegateExecution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
+        delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        delegateExecution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
+        delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
+        delegateExecution.setVariable("targetSoftwareVersion", TEST_SOFTWARE_VERSION);
+
+        delegateExecution.setVariable("actor", CDS_ACTOR);
+        delegateExecution.setVariable("action", this.action);
+        delegateExecution.setVariable("scope", this.scope);
+
+
+        /**
+         * Get the PNF entry from AAI.
+         */
+        if (action.equalsIgnoreCase(DEPLOY_ACTION)) {
+            final String aaiPnfEntry = "{  \n" + "   \"pnf-name\":\"PNFDemo\",\n" + "   \"pnf-id\":\"testtest\",\n"
+                    + "   \"in-maint\":true,\n" + "   \"resource-version\":\"1541720264047\",\n"
+                    + "   \"ipaddress-v4-oam\":\"1.1.1.1\",\n" + "   \"ipaddress-v6-oam\":\"::/128\"\n" + "}";
+            wireMockServer.stubFor(
+                    get(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")).willReturn(okJson(aaiPnfEntry)));
+        }
 
         grpcNettyServer.cleanMessage();
     }
 
     @Test
-    public void testExecution_cdsConfigAssign_actionExecuted() {
-
-        configureCdsConfigAssign();
+    public void testExecution_cds_actions() {
 
         controllerExecutionDE.execute(delegateExecution);
         List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
         assertThat(detailedMessages).hasSize(1);
         try {
-            checkConfigAssign(detailedMessages.get(0));
+            verifyRequestContentForAction(detailedMessages.get(0));
         } catch (Exception e) {
             e.printStackTrace();
-            fail("ConfigAssign request exception", e);
+            fail(this.action + " request exception", e);
         }
     }
 
-    private void configureCdsConfigAssign() {
-        delegateExecution.setVariable("actor", "cds");
-        delegateExecution.setVariable("action", TEST_CDS_ACTION);
-        delegateExecution.setVariable("scope", "pnf");
+    private void verifyRequestContentForAction(ExecutionServiceInput executionServiceInput) {
 
-        delegateExecution.setVariable(PNF_CORRELATION_ID, TEST_PNF_CORRELATION_ID);
-        delegateExecution.setVariable(PNF_UUID, TEST_PNF_UUID);
-        delegateExecution.setVariable(PRC_INSTANCE_NAME, TEST_PNF_RESOURCE_INSTANCE_NAME);
-        delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
-        delegateExecution.setVariable(PRC_BLUEPRINT_NAME, TEST_PNF_RESOURCE_BLUEPRINT_NAME);
-        delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
-    }
-
-    private void checkConfigAssign(ExecutionServiceInput executionServiceInput) {
-
-        logger.info("Checking the configAssign request");
+        logger.info("Checking the " + this.action + " request");
         ActionIdentifiers actionIdentifiers = executionServiceInput.getActionIdentifiers();
 
-        /**
-         * the fields of actionIdentifiers should match the one in the
-         * response/createVcpeResCustServiceSimplifiedTest_catalogdb.json.
-         */
         assertThat(actionIdentifiers.getBlueprintName()).isEqualTo(TEST_PNF_RESOURCE_BLUEPRINT_NAME);
         assertThat(actionIdentifiers.getBlueprintVersion()).isEqualTo(TEST_PNF_RESOURCE_BLUEPRINT_VERSION);
-        assertThat(actionIdentifiers.getActionName()).isEqualTo(TEST_CDS_ACTION);
-        assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+        assertThat(actionIdentifiers.getActionName()).isEqualTo(this.action);
 
         CommonHeader commonHeader = executionServiceInput.getCommonHeader();
         assertThat(commonHeader.getOriginatorId()).isEqualTo("SO");
         assertThat(commonHeader.getRequestId()).isEqualTo(TEST_MSO_REQUEST_ID);
 
         Struct payload = executionServiceInput.getPayload();
-        Struct requeststruct = payload.getFieldsOrThrow("config-assign-request").getStructValue();
+        Struct requeststruct = payload.getFieldsOrThrow(this.action + "-request").getStructValue();
 
         assertThat(requeststruct.getFieldsOrThrow("resolution-key").getStringValue())
                 .isEqualTo(TEST_PNF_CORRELATION_ID);
-        Struct propertiesStruct = requeststruct.getFieldsOrThrow("config-assign-properties").getStructValue();
 
+        Struct propertiesStruct = requeststruct.getFieldsOrThrow(this.action + "-properties").getStructValue();
         assertThat(propertiesStruct.getFieldsOrThrow("pnf-name").getStringValue()).isEqualTo(TEST_PNF_CORRELATION_ID);
         assertThat(propertiesStruct.getFieldsOrThrow("service-model-uuid").getStringValue()).isEqualTo(TEST_MODEL_UUID);
         assertThat(propertiesStruct.getFieldsOrThrow("pnf-customization-uuid").getStringValue())
                 .isEqualTo(TEST_PNF_RESOURCE_CUSTOMIZATION_UUID);
+        if (action.equalsIgnoreCase(DEPLOY_ACTION)) {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("async");
+            assertThat(propertiesStruct.getFieldsOrThrow("pnf-ipv4-address").getStringValue()).isEqualTo("1.1.1.1");
+            assertThat(propertiesStruct.getFieldsOrThrow("pnf-ipv6-address").getStringValue()).isEqualTo("::/128");
+        } else if (!action.equalsIgnoreCase(ASSIGN_ACTION)) {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+            assertThat(propertiesStruct.getFieldsOrThrow("target-software-version").getStringValue())
+                    .isEqualTo(TEST_SOFTWARE_VERSION);
+        } else {
+            assertThat(actionIdentifiers.getMode()).isEqualTo("sync");
+        }
     }
 
 }
@@ -37,11 +37,12 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 @RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = {CdsControllerDE.class, ExceptionBuilder.class, AbstractCDSProcessingBBUtils.class})
-public class CdsControllerDETest {
+@ContextConfiguration(
+        classes = {PnfConfigCdsControllerDE.class, ExceptionBuilder.class, AbstractCDSProcessingBBUtils.class})
+public class PnfConfigCdsControllerDETest {
 
     @Autowired
-    private CdsControllerDE cdsControllerDE;
+    private PnfConfigCdsControllerDE pnfConfigCdsControllerDE;
 
     @MockBean
     private ControllerContext controllerContext;
@@ -52,20 +53,46 @@ public class CdsControllerDETest {
     @Mock
     private AbstractCDSProcessingBBUtils abstractCDSProcessingBBUtils;
 
-    @Before
-    public void setUp() {
+    @Test
+    public void testUnderstand_action_assign_TrueReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("config-assign");
+
+        // verify
+        assertTrue(pnfConfigCdsControllerDE.understand(controllerContext));
+    }
+
+    @Test
+    public void testUnderstand_action_deploy_TrueReturned() {
+        // when
         when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("config-deploy");
+
+        // verify
+        assertTrue(pnfConfigCdsControllerDE.understand(controllerContext));
     }
 
     @Test
-    public void testUnderstand_validContext_TrueReturned() {
-        assertTrue(cdsControllerDE.understand(controllerContext));
+    public void testUnderstand_action_any_FalseReturned() {
+        // when
+        when(controllerContext.getControllerActor()).thenReturn("cds");
+        when(controllerContext.getControllerScope()).thenReturn("pnf");
+        when(controllerContext.getControllerAction()).thenReturn("any-action");
+
+        // verify
+        assertFalse(pnfConfigCdsControllerDE.understand(controllerContext));
     }
 
     @Test
     public void testUnderstand_invalidContext_FalseReturned() {
+        // when
         when(controllerContext.getControllerActor()).thenReturn("appc");
-        assertFalse(cdsControllerDE.understand(controllerContext));
+
+        // verify
+        assertFalse(pnfConfigCdsControllerDE.understand(controllerContext));
     }
 
 }
diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfCDSProcessingDETest.java
new file mode 100644 (file)
index 0000000..c69adee
--- /dev/null
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix
+ *  ================================================================================
+ *  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 org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.so.bpmn.BaseTaskTest;
+import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
+import org.onap.so.client.cds.AbstractCDSProcessingBBUtils;
+import org.onap.so.client.cds.GeneratePayloadForCds;
+import org.onap.so.client.cds.beans.AbstractCDSPropertiesBean;
+import org.onap.so.client.exception.ExceptionBuilder;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+import java.util.Arrays;
+import java.util.Collection;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*;
+
+@RunWith(Parameterized.class)
+public class GenericPnfCDSProcessingDETest extends BaseTaskTest {
+
+    @ClassRule
+    public static final SpringClassRule springClassRule = new SpringClassRule();
+
+    @Rule
+    public final SpringMethodRule smr = new SpringMethodRule();
+
+    @InjectMocks
+    private GenericPnfCDSProcessingDE controllerRunnable;
+
+    @Mock
+    private GeneratePayloadForCds generatePayloadForCds;
+
+    @Mock
+    private AbstractCDSProcessingBBUtils cdsDispather;
+
+    private static final String PRECHECK_ACTION = "precheck";
+    private static final String DOWNLOAD_ACTION = "downloadNeSw";
+    private static final String ACTIVATE_ACTION = "activateNeSw";
+    private static final String POSTCHECK_ACTION = "postcheck";
+
+    private String description;
+    private String action;
+    private String scope;
+    private String expectedJson;
+
+    public GenericPnfCDSProcessingDETest(String desc, String action, String scope, String expectedJson) {
+        this.description = desc;
+        this.action = action;
+        this.scope = scope;
+        this.expectedJson = expectedJson;
+
+    }
+
+    @Parameterized.Parameters(name = "index {0}")
+    public static Collection<String[]> data() {
+        return Arrays.asList(new String[][] {
+                {"Test JSON for action:" + PRECHECK_ACTION + " scope:pnf", PRECHECK_ACTION, "pnf",
+                        buildExpectedJson(PRECHECK_ACTION, "pnf")},
+                {"Test JSON for action:" + DOWNLOAD_ACTION + " scope:pnf", DOWNLOAD_ACTION, "pnf",
+                        buildExpectedJson(DOWNLOAD_ACTION, "pnf")},
+                {"Test JSON for action:" + ACTIVATE_ACTION + " scope:pnf", ACTIVATE_ACTION, "pnf",
+                        buildExpectedJson(ACTIVATE_ACTION, "pnf")},
+                {"Test JSON for action:" + POSTCHECK_ACTION + " scope:pnf", POSTCHECK_ACTION, "pnf",
+                        buildExpectedJson(POSTCHECK_ACTION, "pnf")},});
+    }
+
+    private static String buildExpectedJson(String action, String scope) {
+        return "{\"" + action + "-request\":" + "{\"" + action + "-" + "properties\":"
+                + "{\"service-instance-id\":\"test_service_id\","
+                + "\"pnf-customization-uuid\":\"9acb3a83-8a52-412c-9a45-901764938144\","
+                + "\"pnf-id\":\"5df8b6de-2083-11e7-93ae-92361f002671\","
+                + "\"target-software-version\":\"demo-sw-ver2.0.0\"," + "\"pnf-name\":\"PNFDemo\","
+                + "\"service-model-uuid\":\"6bc0b04d-1873-4721-b53d-6615225b2a28\"}," + "\"resolution-key\":\"PNFDemo\""
+                + "}" + "}";
+    }
+
+    private DelegateExecution execution = new DelegateExecutionFake();
+
+    @Test
+    public void testExecution_validPnf_action_executionObjectCreated() {
+        try {
+
+            // given
+            ControllerContext controllerContext = new ControllerContext();
+            controllerContext.setExecution(execution);
+            controllerContext.setControllerActor("cds");
+            controllerContext.setControllerAction(this.action);
+            controllerContext.setControllerScope(this.scope);
+            AbstractCDSPropertiesBean bean = new AbstractCDSPropertiesBean();
+            doNothing().when(cdsDispather).constructExecutionServiceInputObject(execution);
+            doNothing().when(cdsDispather).sendRequestToCDSClient(execution);
+            doReturn(bean).when(generatePayloadForCds).buildCdsPropertiesBean(execution);
+
+            // when
+            Boolean isUnderstandable = controllerRunnable.understand(controllerContext);
+            Boolean isReady = controllerRunnable.ready(controllerContext);
+            controllerRunnable.prepare(controllerContext);
+            controllerRunnable.run(controllerContext);
+
+            // verify
+            assertEquals(isUnderstandable, true);
+            assertEquals(isReady, true);
+            Object executionObject = execution.getVariable(EXECUTION_OBJECT);
+            assertThat(executionObject).isNotNull();
+            assertThat(executionObject).isInstanceOf(AbstractCDSPropertiesBean.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Exception thrown" + e.getMessage());
+        }
+    }
+}