Merge "Fixing vulnerabilities and code smells"
authorByung-Woo Jun <byung-woo.jun@est.tech>
Wed, 7 Oct 2020 15:19:04 +0000 (15:19 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 7 Oct 2020 15:19:04 +0000 (15:19 +0000)
.gitignore
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoHeatUtils.java
adapters/mso-adapter-utils/src/test/java/org/onap/so/openstack/utils/MsoHeatUtilsTest.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/constants/HeatBridgeConstants.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
adapters/mso-openstack-adapters/src/test/resources/__files/pathed-sriov-pf.json [new file with mode: 0644]
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SDNCAdapterRestV1.groovy
graph-inventory/fluent-builder-maven-plugin/pom.xml
mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java

index 79d2c94..c57b142 100644 (file)
@@ -23,3 +23,5 @@ packages/root-pack-extras/config-resources/mariadb/db-sql-scripts/main-schemas/M
 **/bin/
 /tattletale/
 /.metadata/
+**/.sts4-cache
+**/.java-version
index c33160d..a7c47f8 100644 (file)
@@ -24,6 +24,7 @@
 package org.onap.so.openstack.utils;
 
 import java.io.IOException;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -124,10 +125,8 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
 
     // Properties names and variables (with default values)
     protected String createPollIntervalProp = "org.onap.so.adapters.po.pollInterval";
-    private String pollingMultiplierProp = "org.onap.so.adapters.po.pollMultiplier";
 
     protected static final String CREATE_POLL_INTERVAL_DEFAULT = "15";
-    private static final String POLLING_MULTIPLIER_DEFAULT = "60";
 
     private static final ObjectMapper JSON_MAPPER = new ObjectMapper();
 
@@ -348,9 +347,12 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
             String tenantId, boolean notFoundIsSuccess) throws MsoException {
         int pollingFrequency =
                 Integer.parseInt(this.environment.getProperty(createPollIntervalProp, CREATE_POLL_INTERVAL_DEFAULT));
-        int pollingMultiplier =
-                Integer.parseInt(this.environment.getProperty(pollingMultiplierProp, POLLING_MULTIPLIER_DEFAULT));
-        int numberOfPollingAttempts = Math.floorDiv((timeoutMinutes * pollingMultiplier), pollingFrequency);
+        LocalDateTime stopPolling = LocalDateTime.now().plusMinutes(timeoutMinutes);
+        if (pollingFrequency > timeoutMinutes * 60) {
+            logger.debug("Will not poll. Poll interval {} sec is greater then timeout {} sec", pollingFrequency,
+                    timeoutMinutes * 60);
+            stopPolling = LocalDateTime.now().minusMinutes(1);
+        }
         Heat heatClient = getHeatClient(cloudSiteId, tenantId);
         while (true) {
             String stackName = stack.getStackName() + "/" + stack.getId();
@@ -363,12 +365,12 @@ public class MsoHeatUtils extends MsoCommonUtils implements VduPlugin {
             } else if (latestStack != null) {
                 statusHandler.updateStackStatus(latestStack);
                 if (stackStatus.equals(latestStack.getStackStatus())) {
-                    if (numberOfPollingAttempts <= 0) {
+                    if (LocalDateTime.now().isAfter(stopPolling)) {
                         logger.error("Polling of stack timed out with Status: {}", latestStack.getStackStatus());
                         return latestStack;
                     }
+                    logger.debug("Will poll again until {}", stopPolling);
                     sleep(pollingFrequency * 1000L);
-                    numberOfPollingAttempts -= 1;
                 } else {
                     return latestStack;
                 }
index 4938bff..4f7fed7 100644 (file)
@@ -36,6 +36,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -106,7 +107,6 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
     @Before
     public void setup() {
         doReturn("15").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
-        doReturn("1").when(env).getProperty("org.onap.so.adapters.po.pollMultiplier", "60");
     }
 
     @Test
@@ -130,9 +130,8 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         assertEquals(true, actual != null);
     }
 
-
     @Test
-    public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
+    public final void pollStackForStatus_No_Polling_Test() throws MsoException, IOException {
         Stack stack = new Stack();
         stack.setId("id");
         stack.setStackName("stackName");
@@ -141,12 +140,29 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         doNothing().when(stackStatusHandler).updateStackStatus(stack);
         doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
+        doReturn("61").when(env).getProperty("org.onap.so.adapters.po.pollInterval", "15");
         Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
         Mockito.verify(stackStatusHandler, times(1)).updateStackStatus(stack);
         Mockito.verify(heatUtils, times(1)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
         assertEquals(true, actual != null);
     }
 
+    @Test
+    public final void pollStackForStatus_Polling_Exhausted_Test() throws MsoException, IOException {
+        Stack stack = new Stack();
+        stack.setId("id");
+        stack.setStackName("stackName");
+        stack.setStackStatus("CREATE_IN_PROGRESS");
+        stack.setStackStatusReason("Stack Finished");
+        doNothing().when(stackStatusHandler).updateStackStatus(stack);
+        doReturn(stack).when(heatUtils).queryHeatStack(isA(Heat.class), eq("stackName/id"));
+        doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
+        Stack actual = heatUtils.pollStackForStatus(1, stack, "CREATE_IN_PROGRESS", cloudSiteId, tenantId, false);
+        Mockito.verify(stackStatusHandler, times(5)).updateStackStatus(stack);
+        Mockito.verify(heatUtils, times(5)).queryHeatStack(isA(Heat.class), eq("stackName/id"));
+        assertEquals(true, actual != null);
+    }
+
     @Test
     public final void postProcessStackCreate_CREATE_IN_PROGRESS_Test() throws MsoException, IOException {
         Stack stack = new Stack();
@@ -255,12 +271,9 @@ public class MsoHeatUtilsTest extends MsoHeatUtils {
         CreateStackParam createStackParam = new CreateStackParam();
         createStackParam.setStackName("stackName");
         doReturn(heatClient).when(heatUtils).getHeatClient(cloudSiteId, tenantId);
-        doNothing().when(heatUtils).postProcessStackDelete(deletedStack);
         doReturn(null).when(heatUtils).executeAndRecordOpenstackRequest(mockDeleteStack);
         doReturn(stackResource).when(heatClient).getStacks();
         doReturn(mockDeleteStack).when(stackResource).deleteByName("stackName/id");
-        doReturn(deletedStack).when(heatUtils).pollStackForStatus(120, stack, "DELETE_IN_PROGRESS", cloudSiteId,
-                tenantId, true);
 
         heatUtils.handleUnknownCreateStackFailure(stack, 120, cloudSiteId, tenantId);
         Mockito.verify(heatUtils, times(1)).executeAndRecordOpenstackRequest(mockDeleteStack);
index 7d30c87..5cb870e 100644 (file)
@@ -46,6 +46,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.ws.rs.NotFoundException;
 import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.UriBuilder;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.validator.routines.InetAddressValidator;
 import org.onap.aai.domain.yang.Flavor;
@@ -59,7 +60,6 @@ import org.onap.aai.domain.yang.Pserver;
 import org.onap.aai.domain.yang.Relationship;
 import org.onap.aai.domain.yang.RelationshipList;
 import org.onap.aai.domain.yang.SriovPf;
-import org.onap.aai.domain.yang.SriovPfs;
 import org.onap.aai.domain.yang.Subnets;
 import org.onap.aai.domain.yang.SriovVf;
 import org.onap.aai.domain.yang.VfModule;
@@ -80,12 +80,12 @@ import org.onap.aaiclient.client.graphinventory.entities.DSLQuery;
 import org.onap.aaiclient.client.graphinventory.entities.DSLQueryBuilder;
 import org.onap.aaiclient.client.graphinventory.entities.DSLStartNode;
 import org.onap.aaiclient.client.graphinventory.entities.Node;
+import org.onap.aaiclient.client.graphinventory.entities.Pathed;
 import org.onap.aaiclient.client.graphinventory.entities.Start;
 import org.onap.aaiclient.client.graphinventory.entities.TraversalBuilder;
 import org.onap.aaiclient.client.graphinventory.entities.__;
 import org.onap.aaiclient.client.graphinventory.entities.uri.Depth;
 import org.onap.aaiclient.client.graphinventory.exceptions.BulkProcessFailed;
-import org.onap.logging.filter.base.ErrorCode;
 import org.onap.so.cloud.resource.beans.NodeType;
 import org.onap.so.db.catalog.beans.CloudIdentity;
 import org.onap.so.db.catalog.beans.ServerType;
@@ -95,8 +95,6 @@ import org.onap.so.heatbridge.helpers.AaiHelper;
 import org.onap.so.heatbridge.openstack.api.OpenstackClient;
 import org.onap.so.heatbridge.openstack.factory.OpenstackClientFactoryImpl;
 import org.onap.so.heatbridge.utils.HeatBridgeUtils;
-import org.onap.so.logger.LoggingAnchor;
-import org.onap.so.logger.MessageEnum;
 import org.onap.so.spring.SpringContextHelper;
 import org.openstack4j.model.compute.Server;
 import org.openstack4j.model.heat.Resource;
@@ -582,69 +580,67 @@ public class HeatBridgeImpl implements HeatBridgeApi {
      *
      * @param port Openstack port object
      * @param lIf AAI l-interface object
+     * @throws HeatBridgeException
      */
-    private void updateSriovPfToPserver(final Port port, final LInterface lIf) {
+    protected void updateSriovPfToPserver(final Port port, final LInterface lIf) throws HeatBridgeException {
         if (port.getvNicType().equalsIgnoreCase(HeatBridgeConstants.OS_SRIOV_PORT_TYPE)) {
-            if (port.getProfile() == null || Strings
-                    .isNullOrEmpty(port.getProfile().get(HeatBridgeConstants.OS_PHYSICAL_NETWORK_KEY).toString())) {
-                logger.debug("The SRIOV port:" + port.getName() + " is missing physical-network-id, cannot update "
-                        + "sriov-pf object for host pserver: " + port.getHostId());
-                return;
-            }
-            Optional<String> matchingPifName = HeatBridgeUtils.getMatchingPserverPifName(
-                    port.getProfile().get(HeatBridgeConstants.OS_PHYSICAL_NETWORK_KEY).toString());
-            if (matchingPifName.isPresent()) {
-                // Update l-interface description
-                String pserverHostName = port.getHostId();
-                lIf.setInterfaceDescription(
-                        "Attached to SR-IOV port: " + pserverHostName + "::" + matchingPifName.get());
-                try {
-                    AAIResourceUri pInterfaceUri =
-                            AAIUriFactory
-                                    .createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure()
-                                            .pserver(pserverHostName).pInterface(matchingPifName.get()))
-                                    .depth(Depth.ONE);
-                    if (resourcesClient.exists(pInterfaceUri)) {
-                        PInterface matchingPIf = resourcesClient.get(PInterface.class, pInterfaceUri).get();
-
-                        String pfPciId = port.getProfile().get(HeatBridgeConstants.OS_PCI_SLOT_KEY).toString();
-
-                        if (matchingPIf.getSriovPfs() == null
-                                || CollectionUtils.isEmpty(matchingPIf.getSriovPfs().getSriovPf())
-                                || matchingPIf.getSriovPfs().getSriovPf().stream()
-                                        .noneMatch(existingSriovPf -> existingSriovPf.getPfPciId().equals(pfPciId))) {
-
-                            SriovPf sriovPf = new SriovPf();
-                            sriovPf.setPfPciId(pfPciId);
-
-                            AAIResourceUri sriovPfUri = AAIUriFactory.createResourceUri(
-                                    AAIFluentTypeBuilder.cloudInfrastructure().pserver(pserverHostName)
-                                            .pInterface(matchingPifName.get()).sriovPf(sriovPf.getPfPciId()));
-
-                            // TODO if it does exist, should check if relationship is there, if not then create?
-                            if (!resourcesClient.exists(sriovPfUri)) {
-                                transaction.create(sriovPfUri, sriovPf);
-
-                                AAIResourceUri sriovVfUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder
-                                        .cloudInfrastructure().cloudRegion(cloudOwner, cloudRegionId).tenant(tenantId)
-                                        .vserver(port.getDeviceId()).lInterface(lIf.getInterfaceName()).sriovVf(
-                                                port.getProfile().get(HeatBridgeConstants.OS_PCI_SLOT_KEY).toString()));
-                                transaction.connect(sriovPfUri, sriovVfUri);
-                            }
-                        }
+
+            AAIResourceUri sriovVfUri = AAIUriFactory
+                    .createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure().cloudRegion(cloudOwner, cloudRegionId)
+                            .tenant(tenantId).vserver(port.getDeviceId()).lInterface(lIf.getInterfaceName())
+                            .sriovVf(port.getProfile().get(HeatBridgeConstants.OS_PCI_SLOT_KEY).toString()));
+
+            boolean relationshipExist = sriovVfHasSriovPfRelationship(sriovVfUri);
+
+            String pserverHostName = port.getHostId();
+            lIf.setInterfaceDescription("Attached to SR-IOV port: " + pserverHostName);
+
+            if (!relationshipExist) {
+                AAIResourceUri pserverUri = AAIUriFactory
+                        .createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure().pserver(pserverHostName));
+                if (resourcesClient.exists(pserverUri)) {
+                    String pfPciId = port.getProfile().get(HeatBridgeConstants.OS_PF_PCI_SLOT_KEY).toString();
+
+                    DSLQueryBuilder<Start, Node> builder = TraversalBuilder
+                            .fragment(new DSLStartNode(Types.PSERVER, __.key("hostname", pserverHostName)))
+                            .to(__.node(Types.P_INTERFACE)
+                                    .to(__.node(Types.SRIOV_PF, __.key("pf-pci-id", pfPciId)).output()));
+
+                    List<Pathed> results = getAAIDSLClient().queryPathed(new DSLQuery(builder.build()));
+
+                    if (results.size() == 1) {
+
+                        AAIResourceUri sriovPfUri = AAIUriFactory.createResourceFromExistingURI(Types.SRIOV_PF,
+                                UriBuilder.fromUri(results.get(0).getResourceLink()).build());
+
+                        transaction.connect(sriovPfUri, sriovVfUri);
+
                     } else {
-                        logger.warn(
-                                "PInterface {} does not exist in AAI. Unable to build sriov-vf to sriov-pf relationship.",
-                                matchingPifName.get());
+                        throw new HeatBridgeException("Unable to find sriov-pf related link " + pfPciId
+                                + ". Unexpected results size" + results.size());
                     }
-                } catch (WebApplicationException e) {
-                    // Silently log that we failed to update the Pserver p-interface with PCI-ID
-                    logger.error(LoggingAnchor.NINE, MessageEnum.GENERAL_EXCEPTION, pserverHostName,
-                            matchingPifName.get(), cloudOwner, tenantId, "OpenStack", "Heatbridge",
-                            ErrorCode.DataError.getValue(), "Exception - Failed to add sriov-pf object to pserver", e);
+                } else {
+                    logger.error("Pserver {} does not exist in AAI. Unable to build sriov-vf to sriov-pf relationship.",
+                            pserverHostName);
+                    throw new HeatBridgeException("Pserver " + pserverHostName + " does not exist in AAI");
+                }
+            }
+        }
+    }
+
+    protected boolean sriovVfHasSriovPfRelationship(AAIResourceUri sriovVfUri) {
+        boolean pfRelationshipsExist = false;
+        if (resourcesClient.exists(sriovVfUri)) {
+            Optional<Relationships> sriovVfRelationships = resourcesClient.get(sriovVfUri).getRelationships();
+
+            if (sriovVfRelationships.isPresent()) {
+                List<AAIResourceUri> sriovPfUris = sriovVfRelationships.get().getRelatedUris(Types.SRIOV_PF);
+                if (sriovPfUris.size() != 0) {
+                    pfRelationshipsExist = true;
                 }
             }
         }
+        return pfRelationshipsExist;
     }
 
     protected void updateLInterfaceIps(final Port port, final LInterface lIf) {
index 71c6a96..c8a39a5 100644 (file)
@@ -43,6 +43,7 @@ public class HeatBridgeConstants {
     public static final String OS_NEUTRON_PROVIDERNET = "OS::Neutron::ProviderNet";
     public static final String OS_SRIOV_PORT_TYPE = "direct";
     public static final String OS_PCI_SLOT_KEY = "pci_slot";
+    public static final String OS_PF_PCI_SLOT_KEY = "pf_pci_slot";
     public static final String OS_PHYSICAL_NETWORK_KEY = "physical_network";
     public static final String OS_PHYSICAL_INTERFACE_KEY = "physical-interface";
     public static final String OS_VLAN_NETWORK_KEY = "vlan";
index a9c3112..531496c 100644 (file)
@@ -42,6 +42,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -49,9 +50,10 @@ import static org.mockito.Mockito.when;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -60,7 +62,6 @@ import java.util.Set;
 import org.apache.commons.io.FileUtils;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
@@ -75,9 +76,12 @@ import org.onap.aai.domain.yang.SriovPf;
 import org.onap.aaiclient.client.aai.AAIDSLQueryClient;
 import org.onap.aaiclient.client.aai.AAIResourcesClient;
 import org.onap.aaiclient.client.aai.AAISingleTransactionClient;
+import org.onap.aaiclient.client.aai.entities.Results;
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
+import org.onap.aaiclient.client.graphinventory.entities.DSLQuery;
+import org.onap.aaiclient.client.graphinventory.entities.Pathed;
 import org.onap.aaiclient.client.graphinventory.exceptions.BulkProcessFailed;
 import org.onap.so.cloud.resource.beans.NodeType;
 import org.onap.so.db.catalog.beans.CloudIdentity;
@@ -100,6 +104,7 @@ import org.openstack4j.openstack.heat.domain.HeatResource;
 import org.openstack4j.openstack.heat.domain.HeatResource.Resources;
 import org.springframework.core.env.Environment;
 import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
@@ -133,6 +138,9 @@ public class HeatBridgeImplTest {
     @Mock
     private Server server;
 
+    @Mock
+    private AAIDSLQueryClient dSLQueryClient;
+
     @Spy
     @InjectMocks
     private HeatBridgeImpl heatbridge = new HeatBridgeImpl(resourcesClient, cloudIdentity, CLOUD_OWNER, REGION_ID,
@@ -342,11 +350,13 @@ public class HeatBridgeImplTest {
     }
 
     @Test
-    public void testUpdateVserverLInterfacesToAai() throws HeatBridgeException {
+    public void testUpdateVserverLInterfacesToAai()
+            throws HeatBridgeException, JsonParseException, JsonMappingException, IOException {
         // Arrange
         List<Resource> stackResources = (List<Resource>) extractTestStackResources();
         Port port = mock(Port.class);
         when(port.getId()).thenReturn("test-port-id");
+        when(port.getHostId()).thenReturn("pserverId");
         when(port.getName()).thenReturn("test-port-name");
         when(port.getvNicType()).thenReturn(HeatBridgeConstants.OS_SRIOV_PORT_TYPE);
         when(port.getMacAddress()).thenReturn("78:4f:43:68:e2:78");
@@ -357,7 +367,7 @@ public class HeatBridgeImplTest {
         when(server.getHypervisorHostname()).thenReturn("test.server.name");
         String pfPciId = "0000:08:00.0";
         when(port.getProfile()).thenReturn(ImmutableMap.of(HeatBridgeConstants.OS_PCI_SLOT_KEY, pfPciId,
-                HeatBridgeConstants.OS_PHYSICAL_NETWORK_KEY, "physical_network_id"));
+                HeatBridgeConstants.OS_PF_PCI_SLOT_KEY, "testPfPciId"));
 
         IP ip = mock(IP.class);
 
@@ -386,10 +396,14 @@ public class HeatBridgeImplTest {
 
         SriovPf sriovPf = new SriovPf();
         sriovPf.setPfPciId(pfPciId);
-        PInterface pIf = mock(PInterface.class);
-        when(pIf.getInterfaceName()).thenReturn("test-port-id");
-        when(resourcesClient.get(eq(PInterface.class), any(AAIResourceUri.class))).thenReturn(Optional.of(pIf));
+
+        when(resourcesClient.exists(any(AAIResourceUri.class))).thenReturn(true);
         when(env.getProperty("mso.cloudOwner.included", "")).thenReturn("CloudOwner");
+        doReturn(dSLQueryClient).when(heatbridge).getAAIDSLClient();
+        List<Pathed> pathed = ((Results<Pathed>) MAPPER.readValue(getJson("pathed-sriov-pf.json"),
+                new TypeReference<Results<Pathed>>() {})).getResult();
+        when(dSLQueryClient.queryPathed(any(DSLQuery.class))).thenReturn(pathed);
+        doReturn(false).when(heatbridge).sriovVfHasSriovPfRelationship(any());
 
         // Act
         heatbridge.buildAddVserverLInterfacesToAaiAction(stackResources, Arrays.asList("1", "2"), "CloudOwner");
@@ -399,6 +413,7 @@ public class HeatBridgeImplTest {
         verify(osClient, times(5)).getPortById(anyString());
         verify(osClient, times(5)).getSubnetById("testSubnetId");
         verify(osClient, times(10)).getNetworkById(anyString());
+        verify(transaction, times(5)).connect(any(AAIResourceUri.class), any(AAIResourceUri.class));
     }
 
     @Test
@@ -571,7 +586,8 @@ public class HeatBridgeImplTest {
     }
 
     @Test
-    public void testUpdateVserverLInterfacesToAai_skipVlans() throws HeatBridgeException {
+    public void testUpdateVserverLInterfacesToAai_skipVlans()
+            throws HeatBridgeException, JsonParseException, JsonMappingException, IOException {
         // Arrange
         List<Resource> stackResources = (List<Resource>) extractTestStackResources();
         Port port = mock(Port.class);
@@ -597,11 +613,9 @@ public class HeatBridgeImplTest {
         when(osClient.getPortById("c54b9f45-b413-4937-bbe4-3c8a5689cfc9")).thenReturn(port);
         when(osClient.getNetworkById(anyString())).thenReturn(network);
 
-        SriovPf sriovPf = new SriovPf();
-        sriovPf.setPfPciId(pfPciId);
         PInterface pIf = mock(PInterface.class);
         when(pIf.getInterfaceName()).thenReturn("test-port-id");
-        when(resourcesClient.get(eq(PInterface.class), any(AAIResourceUri.class))).thenReturn(Optional.of(pIf));
+        doNothing().when(heatbridge).updateSriovPfToPserver(any(), any());
 
         // Act
         heatbridge.buildAddVserverLInterfacesToAaiAction(stackResources, Arrays.asList("1", "2"), "CloudOwner");
@@ -636,5 +650,9 @@ public class HeatBridgeImplTest {
         return content;
     }
 
+    private String getJson(String filename) throws IOException {
+        return new String(Files.readAllBytes(Paths.get("src/test/resources/__files/" + filename)));
+    }
+
 
 }
diff --git a/adapters/mso-openstack-adapters/src/test/resources/__files/pathed-sriov-pf.json b/adapters/mso-openstack-adapters/src/test/resources/__files/pathed-sriov-pf.json
new file mode 100644 (file)
index 0000000..cccad4c
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "results" : [
+               {
+                       "resource-type" : "sriov-pf",
+                       "resource-link" : "/cloud-infrastructure/pservers/pserver/id1/p-interfaces/p-interface/id2/sriov-pfs/sriov-pf/id3"
+               }
+       ]
+}
\ No newline at end of file
index 669441c..6377d77 100644 (file)
@@ -304,6 +304,10 @@ class SDNCAdapterRestV1 extends AbstractServiceTaskProcessor {
                 Boolean failOnCallbackError = execution.getVariable("failOnCallbackError")
                 if(failOnCallbackError) {
                     sdncAdapterBuildWorkflowException(execution, callback)
+                }else {
+                    if(ackFinalIndicator.equals('Y')) {
+                        sdncAdapterBuildWorkflowException(execution, callback)
+                    }
                 }
             }
 
index 87f5138..6e59d0d 100644 (file)
@@ -9,6 +9,36 @@
   <artifactId>fluent-builder-maven-plugin</artifactId>
   <packaging>maven-plugin</packaging>
   <build>
+  <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.m2e</groupId>
+          <artifactId>lifecycle-mapping</artifactId>
+          <version>1.0.0</version>
+          <configuration>
+            <lifecycleMappingMetadata>
+              <pluginExecutions>
+                <pluginExecution>
+                  <pluginExecutionFilter>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-plugin-plugin</artifactId>
+                    <goals>
+                      <goal>descriptor</goal>
+                    </goals>
+                    <versionRange>[3.6.0,)</versionRange>
+                  </pluginExecutionFilter>
+                  <action>
+                    <execute>
+                      <runOnIncremental>false</runOnIncremental>
+                    </execute>
+                  </action>
+                </pluginExecution>
+              </pluginExecutions>
+            </lifecycleMappingMetadata>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
index 17b22ec..9b42eac 100644 (file)
@@ -29,6 +29,7 @@ import javax.annotation.PostConstruct;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriBuilder;
 import org.apache.http.HttpStatus;
+import org.onap.logging.filter.spring.SpringClientPayloadFilter;
 import org.onap.so.db.request.beans.ArchivedInfraRequests;
 import org.onap.so.db.request.beans.InfraActiveRequests;
 import org.onap.so.db.request.beans.OperationStatus;
@@ -42,6 +43,7 @@ import org.onap.so.db.request.beans.WatchdogComponentDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogDistributionStatus;
 import org.onap.so.db.request.beans.WatchdogServiceModVerIdLookup;
 import org.onap.so.db.request.data.controller.InstanceNameDuplicateCheckRequest;
+import org.onap.so.logging.jaxrs.filter.SOSpringClientFilter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
@@ -297,17 +299,55 @@ public class RequestsDbClient {
         restTemplate.exchange(uri, HttpMethod.PATCH, entity, String.class);
     }
 
+    /**
+     * Required for groovy usage. Cannot use Spring Autowired variables
+     *
+     * @param requestId
+     * @param basicAuth
+     * @param host
+     * @return
+     */
     public InfraActiveRequests getInfraActiveRequests(String requestId, String basicAuth, String host) {
+        RestTemplate template = new RestTemplate();
+        HttpHeaders headers = new HttpHeaders();
+        headers.set(HttpHeaders.AUTHORIZATION, basicAuth);
+        headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
+        headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
 
         URI uri = getUri(host + "/infraActiveRequests/" + requestId);
-
-        return getSingleResponse(uri, InfraActiveRequests.class);
+        try {
+            InfraActiveRequests infraActiveRequests = template
+                    .exchange(uri, HttpMethod.GET, new HttpEntity<>(headers), InfraActiveRequests.class).getBody();
+            if (infraActiveRequests != null) {
+                infraActiveRequests.setRequestId(requestId);
+            }
+            return infraActiveRequests;
+        } catch (HttpClientErrorException e) {
+            if (HttpStatus.SC_NOT_FOUND == e.getStatusCode().value()) {
+                return null;
+            }
+            throw e;
+        }
     }
 
+    /**
+     * Required for groovy usage. Cannot use Spring Autowired variables
+     *
+     * @param request
+     * @param basicAuth
+     * @param host
+     */
     public void updateInfraActiveRequests(InfraActiveRequests request, String basicAuth, String host) {
+        RestTemplate template = new RestTemplate();
+        template.getInterceptors().add(new SOSpringClientFilter());
+        template.getInterceptors().add(new SpringClientPayloadFilter());
+        HttpHeaders headers = new HttpHeaders();
+        headers.set(HttpHeaders.AUTHORIZATION, basicAuth);
+        headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
+        headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
         URI uri = getUri(host + "/infraActiveRequests/" + request.getRequestId());
-        HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(request, getHttpHeaders());
-        restTemplate.put(uri, entity);
+        HttpEntity<InfraActiveRequests> entity = new HttpEntity<>(request, headers);
+        template.put(uri, entity);
     }
 
     protected URI getUri(String uri) {