[SO] Implementing CNFM API endpoint 46/129246/1
authorSagarS <sagar.shetty@est.tech>
Wed, 11 May 2022 13:16:29 +0000 (14:16 +0100)
committerSagarS <sagar.shetty@est.tech>
Thu, 12 May 2022 09:00:56 +0000 (10:00 +0100)
Change-Id: I45202df4cd3a418414b1189cfc59bb845c37edd4
Signed-off-by: SagarS <sagar.shetty@est.tech>
Issue-ID: SO-3905

adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V9.1__AddCNFMFlowmappings.sql [new file with mode: 0644]
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CnfInstantiateBB.bpmn [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/CnfInstantiateTask.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java
common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java

diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V9.1__AddCNFMFlowmappings.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V9.1__AddCNFMFlowmappings.sql
new file mode 100644 (file)
index 0000000..80c7014
--- /dev/null
@@ -0,0 +1,10 @@
+USE catalogdb;
+
+INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, IS_ALACARTE, IS_TOPLEVELFLOW, MIN_API_VERSION, MAX_API_VERSION,cloud_owner,service_type) VALUES
+('Cnf-Create', 'createInstance', 'Cnf', true, true, '1','1','DEFAULT', '*')
+
+INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, FLOW_VERSION, NB_REQ_REF_LOOKUP_ID) VALUES
+('CNF-Create', '1', 'CnfInstantiateBB', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Cnf-Create'))
+
+INSERT INTO building_block_detail (BUILDING_BLOCK_NAME, RESOURCE_TYPE, TARGET_ACTION) VALUES
+('CnfInstantiateBB', 'CNF', 'ACTIVATE')
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CnfInstantiateBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CnfInstantiateBB.bpmn
new file mode 100644 (file)
index 0000000..3f2ace3
--- /dev/null
@@ -0,0 +1,38 @@
+<?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:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_0x13ohc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="4.12.0">
+  <bpmn:process id="CnfInstantiateBB" name="&#10;CnfInstantiateBB" isExecutable="true">
+    <bpmn:startEvent id="StartEvent_0ru3x55">
+      <bpmn:outgoing>SequenceFlow_016sgof</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:sequenceFlow id="SequenceFlow_016sgof" sourceRef="StartEvent_0ru3x55" targetRef="ServiceTask_11" />
+    <bpmn:endEvent id="EndEvent_001k15i">
+      <bpmn:incoming>SequenceFlow_18fsqzd</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:serviceTask id="ServiceTask_11" name="Print Input parameters" camunda:asyncAfter="true" camunda:expression="${CnfInstantiateTask.handleCnfInstatiate(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_016sgof</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_18fsqzd</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_18fsqzd" sourceRef="ServiceTask_11" targetRef="EndEvent_001k15i" />
+  </bpmn:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="CnfInstantiateBB">
+      <bpmndi:BPMNEdge id="SequenceFlow_18fsqzd_di" bpmnElement="SequenceFlow_18fsqzd">
+        <di:waypoint x="400" y="117" />
+        <di:waypoint x="522" y="117" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_016sgof_di" bpmnElement="SequenceFlow_016sgof">
+        <di:waypoint x="188" y="117" />
+        <di:waypoint x="300" y="117" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_0ru3x55_di" bpmnElement="StartEvent_0ru3x55">
+        <dc:Bounds x="152" y="99" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_001k15i_di" bpmnElement="EndEvent_001k15i">
+        <dc:Bounds x="522" y="99" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_1jf7hlc_di" bpmnElement="ServiceTask_11">
+        <dc:Bounds x="300" y="77" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/CnfInstantiateTask.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/CnfInstantiateTask.java
new file mode 100644 (file)
index 0000000..b6be771
--- /dev/null
@@ -0,0 +1,90 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2022 Ericsson. All rights reserved.
+ * ================================================================================
+ * 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.adapter.vnfm.tasks;
+
+import static org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.Constants.INPUT_PARAMETER;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.onap.so.bpmn.common.BuildingBlockExecution;
+import org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.utils.InputParameter;
+import org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.utils.InputParametersProvider;
+import org.onap.so.bpmn.infrastructure.adapter.vnfm.tasks.utils.NullInputParameter;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
+import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class performs CNF Instantiation
+ * 
+ * @author sagar.shetty@est.tech
+ */
+@Component
+public class CnfInstantiateTask {
+    private static final Logger LOGGER = LoggerFactory.getLogger(CnfInstantiateTask.class);
+    private final InputParametersProvider<GenericVnf> sdncInputParametersProvider;
+    private final ExtractPojosForBB extractPojosForBB;
+    private final InputParametersProvider<Map<String, Object>> userParamInputParametersProvider;
+
+    @Autowired
+    public CnfInstantiateTask(final InputParametersProvider<GenericVnf> inputParametersProvider,
+            final InputParametersProvider<Map<String, Object>> userParamInputParametersProvider,
+            final ExtractPojosForBB extractPojosForBB) {
+        this.sdncInputParametersProvider = inputParametersProvider;
+        this.userParamInputParametersProvider = userParamInputParametersProvider;
+        this.extractPojosForBB = extractPojosForBB;
+    }
+
+    public void handleCnfInstatiate(final BuildingBlockExecution execution) {
+        try {
+            LOGGER.debug("Executing handleCnfInstatiate  ...");
+            final InputParameter userParamsInputParameter = getUserParamsInputParameter(execution);
+            LOGGER.debug("Finished executing handleCnfInstatiate ...");
+        } catch (final Exception exception) {
+            LOGGER.error("Unable to get input parameters", exception);
+            execution.setVariable(INPUT_PARAMETER, NullInputParameter.NULL_INSTANCE);
+        }
+    }
+
+    private InputParameter getUserParamsInputParameter(final BuildingBlockExecution execution) {
+        final GeneralBuildingBlock generalBuildingBlock = execution.getGeneralBuildingBlock();
+        if (generalBuildingBlock != null && generalBuildingBlock.getRequestContext() != null
+                && generalBuildingBlock.getRequestContext().getRequestParameters() != null) {
+            final List<Map<String, Object>> userParams =
+                    generalBuildingBlock.getRequestContext().getRequestParameters().getUserParams();
+            if (userParams != null) {
+                final Map<String, Object> params = new HashMap<>();
+                userParams.stream().forEach(obj -> {
+                    params.putAll(obj);
+                });
+                LOGGER.info("User params found : {}", params);
+                if (userParams != null && !userParams.isEmpty()) {
+                    return userParamInputParametersProvider.getInputParameter(params);
+                }
+            }
+        }
+        LOGGER.warn("No input parameters found in userparams ...");
+        return NullInputParameter.NULL_INSTANCE;
+    }
+}
index ef32ac5..c461c48 100755 (executable)
@@ -12,6 +12,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2021 Orange
  * ================================================================================
+ * Modifications Copyright (c) 2022 Ericsson. All rights reserved.
+ * ================================================================================
  * 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
@@ -108,7 +110,7 @@ public class WorkflowAction {
     private static final String VNF_TYPE = "vnfType";
     private static final String CONFIGURATION = "Configuration";
     private static final String SUPPORTEDTYPES =
-            "vnfs|vfModules|networks|networkCollections|volumeGroups|serviceInstances|instanceGroups";
+            "vnfs|vfModules|networks|networkCollections|volumeGroups|serviceInstances|instanceGroups|cnfs";
     private static final String HOMINGSOLUTION = "Homing_Solution";
     private static final String SERVICE_TYPE_TRANSPORT = "TRANSPORT";
     private static final String SERVICE_TYPE_BONDING = "BONDING";
index 1eb5cf7..c7b5f3c 100644 (file)
@@ -3,7 +3,7 @@
  * ONAP - SO
  * ================================================================================
  * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+ * ================================================================================ 
  * 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
@@ -31,7 +31,8 @@ public enum WorkflowType {
     VIRTUAL_LINK("VirtualLink"),
     NETWORKCOLLECTION("NetworkCollection"),
     CONFIGURATION("Configuration"),
-    INSTANCE_GROUP("InstanceGroup");
+    INSTANCE_GROUP("InstanceGroup"),
+    CNF("Cnf");
 
     private final String type;
 
index 6b9b39e..67f1254 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2022 Ericsson. All rights reserved.
+ * ================================================================================
  * 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
@@ -37,7 +39,9 @@ public enum ModelType {
     pnf("pnf"),
     networkInstanceGroup("networkInstanceGroup"),
     instanceGroup("instanceGroup"),
-    vpnBinding("vpnBinding");
+    vpnBinding("vpnBinding"),
+    cnf("cnf");
+
 
     final String name;
 
index 64c42a0..811d888 100644 (file)
@@ -9,6 +9,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2020 Nokia
  * ================================================================================
+ * Modifications Copyright (c) 2022 Ericsson. All rights reserved.
+ * ================================================================================
  * 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
@@ -376,7 +378,9 @@ public class MsoRequest {
                     aq.setInstanceGroupId(servInsReq.getInstanceGroupId());
                     aq.setInstanceGroupName(requestInfo.getInstanceName());
                 }
-                if (ModelType.vnf.name().equalsIgnoreCase(requestScope)) {
+
+                if (ModelType.vnf.name().equalsIgnoreCase(requestScope)
+                        || ModelType.cnf.name().equalsIgnoreCase(requestScope)) {
                     if (requestInfo != null) {
                         aq.setVnfName(requestInfo.getInstanceName());
                     }
index 531d87c..efa037d 100644 (file)
@@ -8,6 +8,8 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
+ * Modifications Copyright (c) 2022 Ericsson. All rights reserved.
+ * ================================================================================
  * 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
@@ -547,6 +549,9 @@ public class RequestHandlerUtils extends AbstractRestHandler {
             requestScope = ModelType.vnf.name();
         } else if (requestUri.contains(ModelType.pnf.name())) {
             requestScope = ModelType.pnf.name();
+
+        } else if (requestUri.contains(ModelType.cnf.name())) {
+            requestScope = ModelType.cnf.name();
         } else {
             requestScope = ModelType.service.name();
         }
@@ -723,6 +728,10 @@ public class RequestHandlerUtils extends AbstractRestHandler {
             }
         } else if (modelInfo.getModelType().equals(ModelType.instanceGroup)) {
             recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 180);
+        } else if (modelInfo.getModelType().equals(ModelType.cnf)) {
+            // Capturing CNF workflow URI
+            logger.debug("Capturing cnf workflow URI");
+            recipeLookupResult = new RecipeLookupResult("/mso/async/services/WorkflowActionBB", 360);
         }
 
         if (recipeLookupResult == null) {
index 4aa9cd0..7e9231b 100644 (file)
@@ -6,6 +6,8 @@
  * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================ 
+ * Modifications Copyright (c) 2022 Ericsson. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -378,6 +380,28 @@ public class ServiceInstances extends AbstractRestHandler {
         }
     }
 
+    @POST
+    @Path("/{version:[vV][1]}/serviceInstances/{serviceInstanceId}/cnfs")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Create CNF on a specified version and serviceInstance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response createCnfInstance(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @Context ContainerRequestContext requestContext)
+            throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        try {
+            return serviceInstances(request, Action.createInstance, instanceIdMap, version, requestId,
+                    requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+        } catch (Exception e) {
+            logger.error("Error in cnf", e);
+            throw e;
+        }
+    }
+
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/upgrade")
     @Consumes(MediaType.APPLICATION_JSON)
@@ -899,7 +923,8 @@ public class ServiceInstances extends AbstractRestHandler {
         requestHandlerUtils.parseRequest(sir, instanceIdMap, action, version, requestJSON, aLaCarte, requestId,
                 currentActiveReq);
         if ((action == Action.replaceInstance || action == Action.replaceInstanceRetainAssignments)
-                && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString()))
+                && (requestScope.equals(ModelType.vnf.toString()) || requestScope.equals(ModelType.vfModule.toString())
+                        || requestScope.equals(ModelType.cnf.toString()))
                 && sir.getRequestDetails().getCloudConfiguration() == null) {
             CloudConfiguration cloudConfiguration =
                     getCloudConfigurationOnReplace(requestScope, instanceIdMap, currentActiveReq);