diff options
9 files changed, 189 insertions, 6 deletions
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 index 0000000000..80c7014d6b --- /dev/null +++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/V9.1__AddCNFMFlowmappings.sql @@ -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 index 0000000000..3f2ace3a26 --- /dev/null +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/CnfInstantiateBB.bpmn @@ -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=" 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("gBuildingBlockExecution")))}"> + <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 index 0000000000..b6be7716f6 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/CnfInstantiateTask.java @@ -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; + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java index ef32ac5cbb..c461c486d4 100755 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -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"; diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java index 1eb5cf7437..c7b5f3c175 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowType.java @@ -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; diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java index 6b9b39e5a9..67f1254ede 100644 --- a/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java @@ -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; diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java index 64c42a0498..811d88869e 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/MsoRequest.java @@ -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()); } diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java index 531d87c229..efa037d393 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/RequestHandlerUtils.java @@ -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) { diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java index 4aa9cd0696..7e9231b5df 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java @@ -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. @@ -379,6 +381,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) @Produces(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); |