[SO] Macro flow for PNF-Modify operation 11/135711/1
authorRupali Shirode <rupali.shirode@t-systems.com>
Mon, 28 Aug 2023 13:09:15 +0000 (18:39 +0530)
committerRupali Shirode <rupali.shirode@t-systems.com>
Mon, 28 Aug 2023 13:10:43 +0000 (18:40 +0530)
Macro flow for PNF-Modify operation

Issue-ID: SO-4111
Change-Id: Ic51cbee5fe59f3aafb2ec41773504b183763d9ec
Signed-off-by: Rupali Shirode <rupali.shirode@t-systems.com>
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/bbobjects/Pnf.java
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AAISetPnfInMaintBB.bpmn [new file with mode: 0644]
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/common/AAISetPNFInMaintBBTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIFlagTasks.java
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/client/aai/mapper/AAIObjectMapper.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java

index 501f711..2b0297f 100644 (file)
@@ -43,6 +43,7 @@ INSERT INTO northbound_request_ref_lookup(MACRO_ACTION, ACTION, REQUEST_SCOPE, I
 ('CNF-Macro-Upgrade', 'upgradeCnf', 'Vnf', false,true, '7', '7','DEFAULT', '*'),
 ('PNF-Macro-Delete', 'deleteInstance', 'Pnf', false,true, '7', '7','DEFAULT', '*'),
 ('PNF-Macro-Create', 'createInstance', 'Pnf', false,true, '7', '7','DEFAULT', '*'),
+('PNF-Macro-Modify', 'updateInstance', 'Pnf', false,true, '7', '7','DEFAULT', '*'),
 ('Cnf-Create', 'createInstance', 'Cnf', true, true, '7','7','DEFAULT', '*'),
 ('Cnf-Delete', 'deleteInstance', 'Cnf', true, true, '7','7','DEFAULT', '*'),
 ('Slice-Macro-create','createRanSlice','NetworkSliceSubnet',0,1,7,1,'DEFAULT','*'),
@@ -297,7 +298,11 @@ INSERT INTO orchestration_flow_reference(COMPOSITE_ACTION, SEQ_NO, FLOW_NAME, SC
 ('Slice-Macro-modify','2','ControllerExecutionBB','nssi','modify-sliceprofile',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Slice-Macro-modify' and CLOUD_OWNER = 'DEFAULT')),
 ('Slice-Macro-delete','2','DeleteRANNssiBB',null,null,1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Slice-Macro-delete' and CLOUD_OWNER = 'DEFAULT')),
 ('Slice-Macro-delete','1','ControllerExecutionBB','nssi','delete-sliceprofile',1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'Slice-Macro-delete' and CLOUD_OWNER = 'DEFAULT'));
-
+('PNF-Macro-Modify' , '1', 'AAISetPnfInMaintBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'PNF-Macro-Modify' and CLOUD_OWNER = 'DEFAULT')),
+('PNF-Macro-Modify' , '2', 'ControllerExecutionBB',  'pnf' , 'modify-config-assign', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'PNF-Macro-Modify' and CLOUD_OWNER = 'DEFAULT')),
+('PNF-Macro-Modify' , '3', 'WaitForPnfReadyBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'PNF-Macro-Modify' and CLOUD_OWNER = 'DEFAULT')),
+('PNF-Macro-Modify' , '4', 'ControllerExecutionBB',  'pnf' , 'modify-config-deploy', 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'PNF-Macro-Modify' and CLOUD_OWNER = 'DEFAULT')),
+('PNF-Macro-Modify' , '5', 'ActivatePnfBB', NULL, NULL, 1.0,(SELECT id from northbound_request_ref_lookup WHERE MACRO_ACTION = 'PNF-Macro-Modify' and CLOUD_OWNER = 'DEFAULT')),
 
 INSERT INTO rainy_day_handler_macro (FLOW_NAME, SERVICE_TYPE, VNF_TYPE, ERROR_CODE, WORK_STEP, POLICY, SECONDARY_POLICY, REG_EX_ERROR_MESSAGE, SERVICE_ROLE)
 VALUES
@@ -427,6 +432,7 @@ VALUES
 ('DeactivateNetworkCollectionBB', 'NETWORK_COLLECTION', 'DEACTIVATE'),
 ('AAICheckVnfInMaintBB', 'NO_VALIDATE', 'CUSTOM'),
 ('AAISetVnfInMaintBB', 'NO_VALIDATE', 'CUSTOM'),
+('AAISetPnfInMaintBB', 'NO_VALIDATE', 'CUSTOM'),
 ('AAIUnsetVnfInMaintBB', 'NO_VALIDATE', 'CUSTOM'),
 ('SDNOVnfHealthCheckBB', 'NO_VALIDATE', 'CUSTOM'),
 ('VNF-Macro-Replace', 'NO_VALIDATE', 'CUSTOM'),
index 1953ba4..1608d88 100644 (file)
@@ -51,6 +51,9 @@ public class Pnf implements Serializable, ShallowCopy<Pnf> {
     @JsonProperty("cloud-region")
     private CloudRegion cloudRegion;
 
+    @JsonProperty("in-maint")
+    private Boolean inMaint;
+
     @JsonProperty("model-info-pnf")
     private ModelInfoPnf modelInfoPnf;
 
@@ -92,6 +95,14 @@ public class Pnf implements Serializable, ShallowCopy<Pnf> {
         this.orchestrationStatus = orchestrationStatus;
     }
 
+    public Boolean isInMaint() {
+        return inMaint;
+    }
+
+    public void setInMaint(Boolean inMaint) {
+        this.inMaint = inMaint;
+    }
+
     public CloudRegion getCloudRegion() {
         return cloudRegion;
     }
diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AAISetPnfInMaintBB.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/AAISetPnfInMaintBB.bpmn
new file mode 100644 (file)
index 0000000..49ca2ec
--- /dev/null
@@ -0,0 +1,64 @@
+<?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" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.10.0">
+  <bpmn:process id="AAISetPnfInMaintBB" name="AAISetPnfInMaintBB" isExecutable="true">
+    <bpmn:startEvent id="Start_AAISetPnfInMaintBB">
+      <bpmn:outgoing>SequenceFlow_0zaz9o2</bpmn:outgoing>
+    </bpmn:startEvent>
+    <bpmn:endEvent id="End_AAISetPnfInMaintBB">
+      <bpmn:incoming>SequenceFlow_1jwsja5</bpmn:incoming>
+    </bpmn:endEvent>
+    <bpmn:serviceTask id="Task_SetInMaint" name="PNF Set InMaint Flag (AAI)" camunda:expression="${AAIFlagTasks.modifyPnfInMaintFlag(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), true)}">
+      <bpmn:incoming>Flow_1vke3vw</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1jwsja5</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0zaz9o2" sourceRef="Start_AAISetPnfInMaintBB" targetRef="Task_CheckPnfInMaint" />
+    <bpmn:sequenceFlow id="SequenceFlow_1jwsja5" sourceRef="Task_SetInMaint" targetRef="End_AAISetPnfInMaintBB" />
+    <bpmn:serviceTask id="Task_CheckPnfInMaint" name="Check If Pnf In Maint (AAI)" camunda:expression="${AAIFlagTasks.checkPnfInMaintFlag(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_0zaz9o2</bpmn:incoming>
+      <bpmn:outgoing>Flow_1vke3vw</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="Flow_1vke3vw" sourceRef="Task_CheckPnfInMaint" targetRef="Task_SetInMaint" />
+  </bpmn:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="AAISetPnfInMaintBB">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="Start_AAISetPnfInMaintBB">
+        <dc:Bounds x="155" y="76" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="102" y="112" width="23" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_1r380lg_di" bpmnElement="Task_SetInMaint">
+        <dc:Bounds x="440" y="54" width="100" height="80" />
+        <bpmndi:BPMNLabel />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1h93h9d_di" bpmnElement="End_AAISetPnfInMaintBB">
+        <dc:Bounds x="609" y="76" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="370" y="116" width="18" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="BPMNShape_1wtggzs" bpmnElement="Task_CheckPnfInMaint">
+        <dc:Bounds x="270" y="54" width="100" height="80" />
+        <bpmndi:BPMNLabel />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0zaz9o2_di" bpmnElement="SequenceFlow_0zaz9o2">
+        <di:waypoint x="191" y="94" />
+        <di:waypoint x="270" y="94" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="116.5" y="73" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1jwsja5_di" bpmnElement="SequenceFlow_1jwsja5">
+        <di:waypoint x="540" y="94" />
+        <di:waypoint x="609" y="94" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="281.5" y="79" width="90" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1vke3vw_di" bpmnElement="Flow_1vke3vw">
+        <di:waypoint x="370" y="94" />
+        <di:waypoint x="440" y="94" />
+      </bpmndi:BPMNEdge>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn:definitions>
diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/common/AAISetPNFInMaintBBTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/common/AAISetPNFInMaintBBTest.java
new file mode 100644 (file)
index 0000000..4ff5687
--- /dev/null
@@ -0,0 +1,32 @@
+package org.onap.so.bpmn.common;
+
+import org.camunda.bpm.engine.delegate.BpmnError;
+import org.camunda.bpm.engine.runtime.ProcessInstance;
+import org.junit.Test;
+import org.onap.so.bpmn.BaseBPMNTest;
+import java.io.IOException;
+import static org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareTests.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+
+public class AAISetPNFInMaintBBTest extends BaseBPMNTest {
+    @Test
+    public void sunnyDayAAISetPnfInMaintBBTest() throws InterruptedException, IOException {
+        ProcessInstance pi = runtimeService.startProcessInstanceByKey("AAISetPnfInMaintBB", variables);
+        assertThat(pi).isNotNull().isStarted().hasPassedInOrder("Start_AAISetPnfInMaintBB", "Task_SetInMaint",
+                "End_AAISetPnfInMaintBB");
+    }
+
+    @Test
+    public void rainyDayAAISetPnfInMaintBBTest() {
+        doThrow(new BpmnError("7000", "TESTING ERRORS")).when(aaiFlagTasks)
+                .modifyPnfInMaintFlag(any(BuildingBlockExecution.class), any(boolean.class));
+
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("AAISetPnfInMaintBB", variables);
+        assertThat(processInstance).isNotNull();
+        assertThat(processInstance).isStarted().hasPassedInOrder("Start_AAISetPnfInMaintBB", "Task_SetInMaint")
+                .hasNotPassed("End_AAISetPnfInMaintBB");
+        assertThat(processInstance).isEnded();
+    }
+
+}
index 997d200..10bb720 100644 (file)
@@ -24,9 +24,11 @@ package org.onap.so.bpmn.infrastructure.aai.tasks;
 
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.orchestration.AAIPnfResources;
 import org.onap.so.client.orchestration.AAIVnfResources;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,6 +42,9 @@ public class AAIFlagTasks {
 
     @Autowired
     private AAIVnfResources aaiVnfResources;
+
+    @Autowired
+    private AAIPnfResources aaiPnfResources;
     @Autowired
     private ExceptionBuilder exceptionUtil;
     @Autowired
@@ -74,6 +79,39 @@ public class AAIFlagTasks {
         }
     }
 
+    public void checkPnfInMaintFlag(BuildingBlockExecution execution) {
+        boolean inMaint = false;
+        try {
+            Pnf pnf = extractPojosForBB.extractByKey(execution, ResourceKey.PNF);
+            String pnfName = pnf.getPnfName();
+            inMaint = aaiPnfResources.checkInMaintFlag(pnfName);
+        } catch (Exception ex) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+        if (inMaint) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "PNF is already in maintenance in A&AI");
+        }
+    }
+
+    public void modifyPnfInMaintFlag(BuildingBlockExecution execution, boolean inMaint) {
+        try {
+            Pnf pnf = extractPojosForBB.extractByKey(execution, ResourceKey.PNF);
+            logger.info("In modifyPnfInMaintFlag pnfname: {}", pnf.getPnfName());
+            Pnf copiedPnf = pnf.shallowCopyId();
+            copiedPnf.setPnfName(pnf.getPnfName());
+
+            copiedPnf.setInMaint(inMaint);
+            pnf.setInMaint(inMaint);
+            logger.info("In modifyPnfInMaintFlag if block pnfInMaint: {}, copiedPnfInMaint: {}", pnf.isInMaint(),
+                    copiedPnf.isInMaint());
+            aaiPnfResources.updateObjectPnf(copiedPnf);
+
+        } catch (Exception ex) {
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, ex);
+        }
+    }
+
+
     public void checkVnfClosedLoopDisabledFlag(BuildingBlockExecution execution) {
         boolean isClosedLoopDisabled = false;
         try {
index 82f44bc..3e4e2d1 100755 (executable)
@@ -308,6 +308,9 @@ public class WorkflowAction {
         } else if (isPNFDelete(resourceType, requestAction)) {
             pnfEBBLoader.traverseAAIPnf(execution, resourceList, workflowResourceIds.getServiceInstanceId(), resourceId,
                     aaiResourceIds);
+        } else if (isPNFUpdate(resourceType, requestAction)) {
+            pnfEBBLoader.traverseAAIPnf(execution, resourceList, workflowResourceIds.getServiceInstanceId(), resourceId,
+                    aaiResourceIds);
         } else if (resourceType == WorkflowType.VNF
                 && (DELETE_INSTANCE.equalsIgnoreCase(requestAction) || REPLACEINSTANCE.equalsIgnoreCase(requestAction)
                         || (RECREATE_INSTANCE.equalsIgnoreCase(requestAction)))) {
@@ -410,6 +413,10 @@ public class WorkflowAction {
         return resourceType == WorkflowType.PNF && DELETE_INSTANCE.equalsIgnoreCase(requestAction);
     }
 
+    private boolean isPNFUpdate(WorkflowType resourceType, String requestAction) {
+        return resourceType == WorkflowType.PNF && UPDATE_INSTANCE.equalsIgnoreCase(requestAction);
+    }
+
     private void setExecutionVariables(DelegateExecution execution, List<ExecuteBuildingBlock> flowsToExecute,
             List<String> flowNames) {
         execution.setVariable("flowNames", flowNames);
index 4664ffc..9974e6c 100644 (file)
@@ -114,6 +114,7 @@ public class AAIObjectMapper {
                     map().setModelInvariantId(source.getModelInfoPnf().getModelInvariantUuid());
                     map().setModelVersionId(source.getModelInfoPnf().getModelUuid());
                     map().setNfType(source.getModelInfoPnf().getNfType());
+                    map().setInMaint(source.isInMaint());
                 }
             });
         }
index acfca5d..d042fd6 100644 (file)
@@ -62,8 +62,15 @@ public class AAIPnfResources {
 
     public void updateOrchestrationStatusPnf(Pnf pnf, OrchestrationStatus orchestrationStatus) {
         AAIResourceUri pnfURI = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().pnf(pnf.getPnfName()));
-
         Pnf pnfCopy = pnf.shallowCopyId();
+        if (orchestrationStatus.equals(OrchestrationStatus.REGISTER)
+                || orchestrationStatus.equals(OrchestrationStatus.REGISTERED)) {
+            pnf.setInMaint(true);
+            pnfCopy.setInMaint(true);
+        } else {
+            pnf.setInMaint(false);
+            pnfCopy.setInMaint(false);
+        }
 
         pnf.setOrchestrationStatus(orchestrationStatus);
         pnfCopy.setOrchestrationStatus(orchestrationStatus);
@@ -93,6 +100,30 @@ public class AAIPnfResources {
         injectionHelper.getAaiClient().delete(pnfURI);
     }
 
+    public void updateObjectPnf(Pnf pnf) {
+        Optional<org.onap.aai.domain.yang.Pnf> pnfFromAai =
+                injectionHelper.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class,
+                        AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().pnf(pnf.getPnfName())));
+        logger.info("***in updateObjectPnf getPnfName====> {} ", pnfFromAai.get().getPnfName());
+        injectionHelper.getAaiClient().update(
+                AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().pnf(pnf.getPnfName())),
+                aaiObjectMapper.mapPnf((pnf)));
+    }
+
+    /**
+     * Check inMaint flag value of PNF from AAI using pnfName
+     *
+     * @param pnfName - pnf-id required pnf
+     * @return inMaint flag value
+     */
+    public boolean checkInMaintFlag(String pnfName) {
+        org.onap.aai.domain.yang.Pnf pnf = injectionHelper.getAaiClient()
+                .get(org.onap.aai.domain.yang.Pnf.class,
+                        AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().pnf(pnfName)))
+                .orElse(new org.onap.aai.domain.yang.Pnf());
+        return pnf.isInMaint();
+    }
+
     private void updatePnfFields(Pnf pnf, org.onap.aai.domain.yang.Pnf pnfFromAai) {
         if (pnf.getModelInfoPnf() != null
                 && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelCustomizationUuid())) {
index d4331dc..17967ca 100644 (file)
@@ -809,6 +809,29 @@ public class ServiceInstances extends AbstractRestHandler {
         }
     }
 
+    @PUT
+    @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/pnfs/{pnfInstanceId}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Operation(description = "Create PNF on a specified version and serviceInstance", responses = @ApiResponse(
+            content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+    @Transactional
+    public Response updatePnfInstance(String request, @PathParam("version") String version,
+            @PathParam("serviceInstanceId") String serviceInstanceId, @PathParam("pnfInstanceId") String pnfInstanceId,
+            @Context ContainerRequestContext requestContext) throws ApiException {
+        String requestId = requestHandlerUtils.getRequestId(requestContext);
+        HashMap<String, String> instanceIdMap = new HashMap<>();
+        instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+        instanceIdMap.put("pnfInstanceId", pnfInstanceId);
+        try {
+            return serviceInstances(request, Action.updateInstance, instanceIdMap, version, requestId,
+                    requestHandlerUtils.getRequestUri(requestContext, uriPrefix));
+        } catch (Exception e) {
+            logger.error("Error in pnf", e);
+            throw e;
+        }
+    }
+
     @POST
     @Path("/{version:[vV][5-7]}/serviceInstances/{serviceInstanceId}/networks")
     @Consumes(MediaType.APPLICATION_JSON)