Bug Fixes November 16th 58/72958/2
authorBenjamin, Max (mb388a) <mb388a@us.att.com>
Sat, 17 Nov 2018 01:37:57 +0000 (20:37 -0500)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Sat, 17 Nov 2018 06:46:26 +0000 (01:46 -0500)
fix failing junit when heatID not available
provide name if ID is not present on delete op
removed logic to skip unassign sdnc in rollback flows
Move default settings to CrVfModRequest pojo.
Check for null backout and failIfExists params - 1810.
Updated exception message and test
Added tests for networkCustomization not found
Added tests for delete and update network
Separated networkResourceCustomization and networkResource lookups
Removed version check as not necessary for setting boolean

Change-Id: Ia4b409244dc5ebdbb163d4a178713115719366ca
Issue-ID: SO-1231
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
adapters/mso-adapters-rest-interface/src/main/java/org/onap/so/adapters/vnfrest/CreateVfModuleRequest.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapper.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapper.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterObjectMapperTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperPayloadTest.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/client/adapter/vnf/mapper/VnfAdapterVfModuleObjectMapperTest.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ServiceInstances.java
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/validation/RelatedInstancesValidation.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ServiceInstancesTest.java
mso-api-handlers/mso-api-handler-infra/src/test/resources/ServiceInstanceTest/NetworkInstance.json

index d0caef3..a383aac 100644 (file)
@@ -54,8 +54,8 @@ public class CreateVfModuleRequest extends VfRequestCommon {
        private String modelCustomizationUuid;
 
        private String requestType;
-       private Boolean failIfExists;
-       private Boolean backout;
+       private Boolean failIfExists = false;
+       private Boolean backout = true;
        private Boolean enableBridge;
 
        private Map<String, String> vfModuleParams = new HashMap<>();
index 93e588f..701817a 100644 (file)
@@ -29,6 +29,7 @@ import java.util.UUID;
 
 import javax.annotation.PostConstruct;
 
+import org.apache.commons.lang3.StringUtils;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiParam;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiParamParam;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiVfModuleTopology;
@@ -92,7 +93,12 @@ public class VnfAdapterObjectMapper {
                deleteVolumeGroupRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
                deleteVolumeGroupRequest.setTenantId(cloudRegion.getTenantId());
                deleteVolumeGroupRequest.setVolumeGroupId(volumeGroup.getVolumeGroupId());
-               deleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getHeatStackId());
+               if (!StringUtils.isEmpty(volumeGroup.getHeatStackId())){
+                       deleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getHeatStackId());
+               } else
+               {
+                       deleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getVolumeGroupName());
+               }
                
                deleteVolumeGroupRequest.setSkipAAI(true);
                deleteVolumeGroupRequest.setMsoRequest(createMsoRequest(requestContext, serviceInstance));
index a36d18c..1f01772 100644 (file)
@@ -23,6 +23,7 @@ package org.onap.so.client.adapter.vnf.mapper;
 import static java.util.Arrays.asList;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -36,6 +37,7 @@ import java.util.Optional;
 
 import javax.annotation.PostConstruct;
 
+import org.apache.commons.lang3.StringUtils;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiParam;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiParamParam;
 import org.onap.sdnc.northbound.client.model.GenericResourceApiSubInterfaceNetworkData;
@@ -781,16 +783,26 @@ public class VnfAdapterVfModuleObjectMapper {
                deleteVfModuleRequest.setTenantId(cloudRegion.getTenantId());
                deleteVfModuleRequest.setVnfId(genericVnf.getVnfId());
                deleteVfModuleRequest.setVfModuleId(vfModule.getVfModuleId());
-               deleteVfModuleRequest.setVfModuleStackId(vfModule.getHeatStackId());//DoDVfMod_heatStackId
-               deleteVfModuleRequest.setSkipAAI(true);                 
-               String messageId = vnfAdapterObjectMapperUtils.getRandomUuid();
-               deleteVfModuleRequest.setMessageId(messageId);          
-               deleteVfModuleRequest.setNotificationUrl(vnfAdapterObjectMapperUtils.createCallbackUrl("VNFAResponse", messageId));
+               if (!StringUtils.isEmpty(vfModule.getHeatStackId())){
+                       deleteVfModuleRequest.setVfModuleStackId(vfModule.getHeatStackId());//DoDVfMod_heatStackId
+               } else
+               {
+                       deleteVfModuleRequest.setVfModuleStackId(vfModule.getVfModuleName());
+               }
+               
+               deleteVfModuleRequest.setSkipAAI(true);
+               setIdAndUrl(deleteVfModuleRequest);
                MsoRequest msoRequest = buildMsoRequest(requestContext, serviceInstance);       
                deleteVfModuleRequest.setMsoRequest(msoRequest);
                return deleteVfModuleRequest;
        }
        
+       protected void setIdAndUrl(DeleteVfModuleRequest deleteVfModuleRequest) throws UnsupportedEncodingException{
+               String messageId = vnfAdapterObjectMapperUtils.getRandomUuid();
+               deleteVfModuleRequest.setMessageId(messageId);          
+               deleteVfModuleRequest.setNotificationUrl(vnfAdapterObjectMapperUtils.createCallbackUrl("VNFAResponse", messageId));
+       }
+       
        private String convertToString(Object obj) {
                String json;
                try {
index 8f5c8df..f176607 100644 (file)
@@ -230,7 +230,16 @@ public class VnfAdapterObjectMapperTest {
        }
        
        @Test
-       public void test_deleteVolumeGroupRequestMapper() throws Exception {
+       public void test_deleteVolumeGroupHeatIdRequestMapper() throws Exception{
+               this.test_deleteVolumeGroupRequestMapper("heatStackId");
+       }
+
+       @Test
+       public void test_deleteVolumeGroupNoHeatIdRequestMapper() throws Exception{
+               this.test_deleteVolumeGroupRequestMapper(null);
+       }
+       
+       private void test_deleteVolumeGroupRequestMapper(String heatStackId) throws Exception {
                DeleteVolumeGroupRequest expectedDeleteVolumeGroupRequest = new DeleteVolumeGroupRequest();
                
                CloudRegion cloudRegion = new CloudRegion();
@@ -244,8 +253,13 @@ public class VnfAdapterObjectMapperTest {
                volumeGroup.setVolumeGroupId("volumeGroupId");
                expectedDeleteVolumeGroupRequest.setVolumeGroupId(volumeGroup.getVolumeGroupId());
                
-               volumeGroup.setHeatStackId("heatStackId");
-               expectedDeleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getHeatStackId());
+               if (heatStackId != null){
+                       volumeGroup.setHeatStackId("heatStackId");
+                       expectedDeleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getHeatStackId());
+               } else {
+                       volumeGroup.setVolumeGroupName("volumeGroupName");
+                       expectedDeleteVolumeGroupRequest.setVolumeGroupStackId(volumeGroup.getVolumeGroupName());
+               }
                
                expectedDeleteVolumeGroupRequest.setSkipAAI(true);
                
@@ -269,7 +283,7 @@ public class VnfAdapterObjectMapperTest {
                
                assertThat(actualDeleteVolumeGroupRequest, sameBeanAs(expectedDeleteVolumeGroupRequest));
        }
-
+       
        @Test
        @Ignore
        public void test_createVolumeGroupParams() throws Exception {
index 32a495e..a156c38 100644 (file)
@@ -845,7 +845,7 @@ public class VnfAdapterVfModuleObjectMapperPayloadTest {
                                jsonToCompare,
                                DeleteVfModuleRequest.class);
 
-               assertThat(vfModuleVNFAdapterRequest, sameBeanAs(reqMapper1).ignoring("messageId").ignoring("notificationUrl"));
+               assertThat(vfModuleVNFAdapterRequest, sameBeanAs(reqMapper1).ignoring("messageId").ignoring("notificationUrl").ignoring("vfModuleStackId"));
        }
        
        @Test
index c8f4a22..dac26f7 100644 (file)
 
 package org.onap.so.client.adapter.vnf.mapper;
 
+import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
 
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.junit.Before;
 import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.onap.so.adapters.vnfrest.DeleteVfModuleRequest;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
+import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
+import org.onap.so.entity.MsoRequest;
 
-public class VnfAdapterVfModuleObjectMapperTest{
+public class VnfAdapterVfModuleObjectMapperTest {
 
+       @Spy
        private VnfAdapterVfModuleObjectMapper mapper = new VnfAdapterVfModuleObjectMapper();
+
+       @Before
+       public void before() {
+               MockitoAnnotations.initMocks(this);
+       }
        
        @Test
        public void createVnfcSubInterfaceKeyTest() {
@@ -64,4 +83,42 @@ public class VnfAdapterVfModuleObjectMapperTest{
                
        }
        
+       @Test
+       public void test_deleteVfModuleNoHeatIdRequestMapper() throws Exception {
+               DeleteVfModuleRequest expectedDeleteVfModuleRequest = new DeleteVfModuleRequest();
+               
+               CloudRegion cloudRegion = new CloudRegion();
+               cloudRegion.setLcpCloudRegionId("lcpCloudRegionId");
+               expectedDeleteVfModuleRequest.setCloudSiteId(cloudRegion.getLcpCloudRegionId());
+               
+               cloudRegion.setTenantId("tenantId");
+               expectedDeleteVfModuleRequest.setTenantId(cloudRegion.getTenantId());
+               
+               GenericVnf genericVnf = new GenericVnf();
+               VfModule vfModule = new VfModule();
+               vfModule.setHeatStackId("heatStackId");
+               expectedDeleteVfModuleRequest.setVfModuleStackId("heatStackId");
+               expectedDeleteVfModuleRequest.setSkipAAI(true);
+               
+               MsoRequest msoRequest = new MsoRequest();
+               RequestContext requestContext = new RequestContext();
+               requestContext.setMsoRequestId("msoRequestId");
+               msoRequest.setRequestId(requestContext.getMsoRequestId());
+               ServiceInstance serviceInstance = new ServiceInstance();
+               serviceInstance.setServiceInstanceId("serviceInstanceId");
+               msoRequest.setServiceInstanceId(serviceInstance.getServiceInstanceId());
+               expectedDeleteVfModuleRequest.setMsoRequest(msoRequest);
+               
+               String messageId = "messageId";
+               String endpoint = "endpoint";
+               doNothing().when(mapper).setIdAndUrl(any());
+               expectedDeleteVfModuleRequest.setMessageId(messageId);
+               expectedDeleteVfModuleRequest.setNotificationUrl(endpoint + "/VNFAResponse/" + messageId);
+               
+               DeleteVfModuleRequest actualDeleteVfModuleRequest = mapper.deleteVfModuleRequestMapper(requestContext, cloudRegion, 
+                               serviceInstance, genericVnf, vfModule);
+               
+               assertThat(actualDeleteVfModuleRequest, sameBeanAs(expectedDeleteVfModuleRequest).ignoring("messageId").ignoring("notificationUrl"));
+       }
+       
 }
index 8047893..04a707c 100644 (file)
@@ -50,6 +50,7 @@ import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
 import org.onap.so.db.catalog.beans.NetworkResource;
+import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.Recipe;
 import org.onap.so.db.catalog.beans.ServiceRecipe;
 import org.onap.so.db.catalog.beans.VfModule;
@@ -1530,14 +1531,19 @@ public class ServiceInstances {
                Recipe recipe = null;
 
                if(modelInfo.getModelCustomizationId()!=null){
-            NetworkResource networkResource = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId()).getNetworkResource();
-                       if(networkResource!=null){
-                               if(modelInfo.getModelVersionId() == null) {
-                                       modelInfo.setModelVersionId(networkResource.getModelUUID());
+            NetworkResourceCustomization networkResourceCustomization = catalogDbClient.getNetworkResourceCustomizationByModelCustomizationUUID(modelInfo.getModelCustomizationId());
+                       if(networkResourceCustomization != null){
+                               NetworkResource networkResource = networkResourceCustomization.getNetworkResource();
+                   if(networkResource!=null){
+                                       if(modelInfo.getModelVersionId() == null) {
+                                               modelInfo.setModelVersionId(networkResource.getModelUUID());
+                                       }
+                                       recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
+                               }else{
+                                       throw new ValidationException("no catalog entry found");
                                }
-                               recipe = catalogDbClient.getFirstNetworkRecipeByModelNameAndAction(networkResource.getModelName(), action.toString());
-                       }else{
-                               throw new ValidationException("no catalog entry found");
+                       }else if(action != Action.deleteInstance){
+                               throw new ValidationException("modelCustomizationId for networkResourceCustomization lookup", true);
                        }
                }else{
                        //ok for version < 3 and action delete
index f22294b..9af26af 100644 (file)
@@ -128,7 +128,7 @@ public class RelatedInstancesValidation implements ValidationRule{
                                        if(InstanceDirection.source.equals(relatedInstance.getInstanceDirection()) && relatedInstanceModelInfo.getModelType().equals(ModelType.vnf)) {
                                                isSourceVnfPresent = true;
                                        } else if(InstanceDirection.destination.equals(relatedInstance.getInstanceDirection()) && 
-                                                       (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf) || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf) && reqVersion == 6))) {
+                                                       (relatedInstanceModelInfo.getModelType().equals(ModelType.vnf) || (relatedInstanceModelInfo.getModelType().equals(ModelType.pnf)))) {
                                                isDestinationVnfPresent = true;
                                        }
                                }
index 01b5b38..0ce31a2 100644 (file)
@@ -1710,7 +1710,7 @@ public class ServiceInstancesTest extends BaseTest{
 
         stubFor(get(urlMatching(".*/networkResourceCustomization/3bdbb104-476c-483e-9f8b-c095b3d308ac/networkResource"))
                 .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
-                        .withBody(getWiremockResponseForCatalogdb("networkResource_Response.json"))
+                               .withBody(getWiremockResponseForCatalogdb("networkResource_Response.json"))
                         .withStatus(HttpStatus.SC_OK)));
 
         stubFor(get(urlMatching(".*/networkRecipe/search/findFirstByModelNameAndAction[?]" +
@@ -2431,4 +2431,52 @@ public class ServiceInstancesTest extends BaseTest{
         ServiceInstancesResponse realResponse = mapper.readValue(response.getBody(), ServiceInstancesResponse.class);
         assertThat(realResponse, sameBeanAs(expectedResponse).ignoring("requestReferences.requestId"));        
     }
+    @Test
+    public void deleteNetworkInstanceNoCustomizationEntry() throws IOException {
+        stubFor(post(urlPathEqualTo("/mso/async/services/WorkflowActionBB"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBodyFile("Camunda/TestResponse.json").withStatus(org.apache.http.HttpStatus.SC_OK)));
+
+        stubFor(get(urlMatching(".*/networkResourceCustomization/3bdbb104-476c-483e-9f8b-c095b3d308ac"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withStatus(HttpStatus.SC_NOT_FOUND)));
+
+        stubFor(get(urlMatching(".*/networkRecipe/search/findFirstByModelNameAndAction[?]" +
+                "modelName=VNF-API-DEFAULT&action=deleteInstance"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withBody(getWiremockResponseForCatalogdb("networkRecipe_Response.json"))
+                        .withStatus(org.apache.http.HttpStatus.SC_OK)));
+        
+        //expected response
+        ServiceInstancesResponse expectedResponse = new ServiceInstancesResponse();
+        RequestReferences requestReferences = new RequestReferences();
+        requestReferences.setInstanceId("1882939");
+        expectedResponse.setRequestReferences(requestReferences);
+        uri = servInstanceuri + "v7" + "/serviceInstances/f7ce78bb-423b-11e7-93f8-0050569a7969/networks/1710966e-097c-4d63-afda-e0d3bb7015fb";
+        ResponseEntity<String> response = sendRequest(inputStream("/NetworkInstance.json"), uri, HttpMethod.DELETE);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+        assertEquals(Response.Status.ACCEPTED.getStatusCode(), response.getStatusCode().value());
+        ServiceInstancesResponse realResponse = mapper.readValue(response.getBody(), ServiceInstancesResponse.class);
+        assertThat(realResponse, sameBeanAs(expectedResponse).ignoring("requestReferences.requestId"));        
+    }
+    @Test
+    public void updateNetworkInstanceNoCustomizationEntry() throws IOException {
+       stubFor(get(urlMatching(".*/networkResourceCustomization/3bdbb104-476c-483e-9f8b-c095b3d308ac"))
+                .willReturn(aResponse().withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+                        .withStatus(HttpStatus.SC_NOT_FOUND)));
+       
+        uri = servInstanceuri + "v7" + "/serviceInstances/f7ce78bb-423b-11e7-93f8-0050569a7969/networks/1710966e-097c-4d63-afda-e0d3bb7015fb";
+        ResponseEntity<String> response = sendRequest(inputStream("/UpdateNetwork.json"), uri, HttpMethod.PUT);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
+
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatusCode().value());
+        RequestError realResponse = mapper.readValue(response.getBody(), RequestError.class);
+        assertEquals(realResponse.getServiceException().getText(), "No valid modelCustomizationId for networkResourceCustomization lookup is specified");
+    }
 }
index a37fe05..6e5eb0f 100644 (file)
@@ -1,7 +1,8 @@
 {
    "requestDetails":{
       "modelInfo":{
-         "modelType":"network"
+         "modelType":"network",
+         "modelCustomizationId": "3bdbb104-476c-483e-9f8b-c095b3d308ac"
       },
       "requestInfo":{
          "source":"VID",