add query stack data and populate table step 23/91623/2
authorBoslet, Cory <cory.boslet@att.com>
Wed, 17 Jul 2019 17:36:05 +0000 (13:36 -0400)
committerBenjamin, Max (mb388a) <mb388a@us.att.com>
Wed, 17 Jul 2019 18:15:41 +0000 (14:15 -0400)
Need to check if audit is enabled first in the delete record task
Updates to audit delete redeisgn and data to table
Various updates to logging, audit object, added tag to query, updated
tag value.
Updated write method to make sure an entry for this heat stack doesnt
already exist to avoid duplicate entrys
Updated unit test to account for get query
Added so that id is not hidden from query results
Updated the was delete is done plus minor updates.
Updated delete method to use resttemplate instead of bowman client
Combined the write and get stack data task into the external tasks.
Removed the task to delete the stack data from db
Updates to junit request id so its not a random id for test
Updated service tasks in att BB to call external task
Update to be a real uuid format due to failing unit test
Updated fields to protected and updated unit test

Issue-ID: SO-2111
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
Change-Id: I8f479a046cf837403f60c330ed6ad8bc08a9c82f

21 files changed:
adapters/mso-adapter-utils/src/main/java/org/onap/so/audit/beans/AuditInventory.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AbstractAuditService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDeleteStackService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditStackService.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditVServer.java
adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/HeatStackAudit.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java [new file with mode: 0644]
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditStackServiceDataTest.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditVServerTest.java
adapters/mso-openstack-adapters/src/test/resources/vfModule.json [new file with mode: 0644]
adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java [new file with mode: 0644]
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/DeleteVfModuleBB.bpmn
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/DeleteVfModuleBBTest.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/audit/AuditTasks.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/common/data/TestDataSetup.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/audit/AuditTasksTest.java
mso-api-handlers/mso-requests-db-repositories/src/main/java/org/onap/so/db/request/data/repository/RequestProcessingDataRepository.java
mso-api-handlers/mso-requests-db/src/main/java/org/onap/so/db/request/client/RequestsDbClient.java
mso-catalog-db/src/test/java/org/onap/so/db/catalog/client/CatalogDbClientTest.java

index 7e612b3..eff32cf 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -25,18 +25,24 @@ import java.io.Serializable;
 public class AuditInventory implements Serializable {
 
     /**
-     * 
+     *
      */
     private static final long serialVersionUID = 4937350343452380760L;
 
+    private String msoRequestId;
+
     private String cloudRegion;
 
     private String cloudOwner;
 
     private String tenantId;
 
+    private String vfModuleId;
+
     private String heatStackName;
 
+    private String genericVnfId;
+
     public String getCloudRegion() {
         return cloudRegion;
     }
@@ -69,6 +75,30 @@ public class AuditInventory implements Serializable {
         this.heatStackName = heatStackName;
     }
 
+    public String getGenericVnfId() {
+        return genericVnfId;
+    }
+
+    public void setGenericVnfId(String genericVnfId) {
+        this.genericVnfId = genericVnfId;
+    }
+
+    public String getVfModuleId() {
+        return vfModuleId;
+    }
+
+    public void setVfModuleId(String vfModuleId) {
+        this.vfModuleId = vfModuleId;
+    }
+
+    public String getMsoRequestId() {
+        return msoRequestId;
+    }
+
+    public void setMsoRequestId(String msoRequestId) {
+        this.msoRequestId = msoRequestId;
+    }
+
 
 
 }
index 5060e55..7500097 100644 (file)
@@ -43,6 +43,8 @@ public abstract class AbstractAuditService {
     protected static final String UNABLE_TO_FIND_ALL_V_SERVERS_AND_L_INTERACES_IN_A_AI =
             "Unable to find all VServers and L-Interaces in A&AI";
 
+    protected static final String UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK = "Unable to find VServers in Openstack";
+
     @Autowired
     public Environment env;
 
@@ -68,12 +70,12 @@ public abstract class AbstractAuditService {
      * @param auditList
      * @return
      */
-    protected boolean didDeleteAuditFail(Optional<AAIObjectAuditList> auditList) {
-        if (auditList.get().getAuditList() != null && !auditList.get().getAuditList().isEmpty()) {
+    protected boolean didDeleteAuditFail(AAIObjectAuditList auditList) {
+        if (auditList.getAuditList() != null && !auditList.getAuditList().isEmpty()) {
             if (logger.isInfoEnabled()) {
-                logger.info("Audit Results: {}", auditList.get().toString());
+                logger.info("Audit Results: {}", auditList.toString());
             }
-            return auditList.get().getAuditList().stream().filter(AAIObjectAudit::isDoesObjectExist).findFirst()
+            return auditList.getAuditList().stream().filter(AAIObjectAudit::isDoesObjectExist).findFirst()
                     .map(v -> true).orElse(false);
         } else {
             return false;
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditDataService.java
new file mode 100644 (file)
index 0000000..1c707fe
--- /dev/null
@@ -0,0 +1,77 @@
+package org.onap.so.adapters.audit;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+
+@Component
+public class AuditDataService {
+
+    @Autowired
+    private RequestsDbClient requestsDbClient;
+
+    /**
+     * Checks to see if an entry already exist for the given heat stack and writes audit stack data to the request
+     * database if it doesn't.
+     *
+     * @throws JsonProcessingException
+     */
+    public void writeStackDataToRequestDb(AuditInventory auditInventory, AAIObjectAuditList auditList)
+            throws JsonProcessingException {
+        List<RequestProcessingData> requestProcessingDataList =
+                requestsDbClient.getRequestProcessingDataByGroupingIdAndNameAndTag(auditInventory.getVfModuleId(),
+                        auditInventory.getHeatStackName(), "AuditStackData");
+        if (requestProcessingDataList.isEmpty()) {
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            String auditListString = objectMapper.getMapper().writeValueAsString(auditList);;
+
+            RequestProcessingData requestProcessingData = new RequestProcessingData();
+            requestProcessingData.setSoRequestId(auditInventory.getMsoRequestId());
+            requestProcessingData.setGroupingId(auditInventory.getVfModuleId());
+            requestProcessingData.setName(auditInventory.getHeatStackName());
+            requestProcessingData.setTag("AuditStackData");
+            requestProcessingData.setValue(auditListString);
+
+            requestsDbClient.saveRequestProcessingData(requestProcessingData);
+        }
+    }
+
+    /**
+     * Retrieves audit stack data from the request database.
+     *
+     * @throws IOException
+     * @throws JsonMappingException
+     * @throws JsonParseException
+     */
+    public Optional<AAIObjectAuditList> getStackDataFromRequestDb(AuditInventory auditInventory)
+            throws JsonParseException, JsonMappingException, IOException {
+
+        List<RequestProcessingData> requestProcessingDataList =
+                requestsDbClient.getRequestProcessingDataByGroupingIdAndNameAndTag(auditInventory.getVfModuleId(),
+                        auditInventory.getHeatStackName(), "AuditStackData");
+        if (!requestProcessingDataList.isEmpty()) {
+            RequestProcessingData requestProcessingData = requestProcessingDataList.get(0);
+            String auditListString = requestProcessingData.getValue();
+
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            AAIObjectAuditList auditList =
+                    objectMapper.getMapper().readValue(auditListString, AAIObjectAuditList.class);
+
+            return Optional.of(auditList);
+        } else {
+            return Optional.empty();
+        }
+    }
+
+
+}
index 9b245ba..b99eaa9 100644 (file)
@@ -40,10 +40,16 @@ public class AuditDeleteStackService extends AbstractAuditService {
     private static final Logger logger = LoggerFactory.getLogger(AuditDeleteStackService.class);
 
     @Autowired
-    public HeatStackAudit heatStackAudit;
+    protected HeatStackAudit heatStackAudit;
 
     @Autowired
-    public Environment environment;
+    protected AuditVServer auditVservers;
+
+    @Autowired
+    protected AuditDataService auditDataService;
+
+    @Autowired
+    protected Environment env;
 
     protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
         AuditInventory auditInventory = externalTask.getVariable("auditInventory");
@@ -51,17 +57,21 @@ public class AuditDeleteStackService extends AbstractAuditService {
         setupMDC(externalTask);
         boolean success = false;
         try {
-            logger.info("Executing External Task Audit Inventory, Retry Number: {} \n {}", auditInventory,
-                    externalTask.getRetries());
-            Optional<AAIObjectAuditList> auditListOpt = heatStackAudit.auditHeatStack(auditInventory.getCloudRegion(),
-                    auditInventory.getCloudOwner(), auditInventory.getTenantId(), auditInventory.getHeatStackName());
+            logger.info("Executing External Task Delete Audit Inventory. Retry Number: {}", externalTask.getRetries());
+            Optional<AAIObjectAuditList> auditListOpt = auditDataService.getStackDataFromRequestDb(auditInventory);
             if (auditListOpt.isPresent()) {
-                auditListOpt.get().setAuditType("delete");
-                auditListOpt.get().setHeatStackName(auditInventory.getHeatStackName());
-                GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
-                variables.put("auditInventoryResult", objectMapper.getMapper().writeValueAsString(auditListOpt.get()));
-                success = !didDeleteAuditFail(auditListOpt);
+                auditVservers.auditVservers(auditListOpt.get());
+            } else {
+                logger.debug("Auditing Vservers based on vf module relationships");
+                auditListOpt = auditVservers.auditVserversThroughRelationships(auditInventory.getGenericVnfId(),
+                        auditInventory.getHeatStackName());
             }
+            auditListOpt.get().setHeatStackName(auditInventory.getHeatStackName());
+            auditListOpt.get().setAuditType("delete");
+            GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+            variables.put("auditInventoryResult", objectMapper.getMapper().writeValueAsString(auditListOpt.get()));
+            success = !didDeleteAuditFail(auditListOpt.get());
+
         } catch (Exception e) {
             logger.error("Error during audit of stack", e);
         }
diff --git a/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java b/adapters/mso-openstack-adapters/src/main/java/org/onap/so/adapters/audit/AuditQueryStackService.java
new file mode 100644 (file)
index 0000000..c8ac9d1
--- /dev/null
@@ -0,0 +1,68 @@
+package org.onap.so.adapters.audit;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.camunda.bpm.client.task.ExternalTask;
+import org.camunda.bpm.client.task.ExternalTaskService;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AuditQueryStackService extends AbstractAuditService {
+
+    private static final Logger logger = LoggerFactory.getLogger(AuditQueryStackService.class);
+
+    @Autowired
+    protected HeatStackAudit heatStackAudit;
+
+    @Autowired
+    protected AuditDataService auditDataService;
+
+    protected void executeExternalTask(ExternalTask externalTask, ExternalTaskService externalTaskService) {
+        AuditInventory auditInventory = externalTask.getVariable("auditInventory");
+        setupMDC(externalTask);
+        boolean success = false;
+        Map<String, Object> variables = new HashMap<>();
+        try {
+            logger.info("Executing External Task Query Audit Inventory. Audit Inventory: {} \n Retry Number: {}",
+                    auditInventory.toString(), externalTask.getRetries());
+
+            Optional<AAIObjectAuditList> auditList = heatStackAudit.queryHeatStack(auditInventory.getCloudOwner(),
+                    auditInventory.getCloudRegion(), auditInventory.getTenantId(), auditInventory.getHeatStackName());
+
+            if (auditList.isPresent()) {
+                success = true;
+                auditDataService.writeStackDataToRequestDb(auditInventory, auditList.get());
+            }
+            if (success) {
+                externalTaskService.complete(externalTask, variables);
+                logger.debug("The External Task {}  was Successful", externalTask.getId());
+            } else {
+                if (externalTask.getRetries() == null) {
+                    logger.debug("The External Task {} Failed. Setting Retries to Default Start Value: {}",
+                            externalTask.getId(), getRetrySequence().length);
+                    externalTaskService.handleFailure(externalTask, UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK,
+                            UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK, getRetrySequence().length, 10000);
+                } else if (externalTask.getRetries() != null && externalTask.getRetries() - 1 == 0) {
+                    logger.debug("The External Task {} Failed. All Retries Exhausted", externalTask.getId());
+                    externalTaskService.complete(externalTask, variables);
+                } else {
+                    logger.debug("The External Task {} Failed. Decrementing Retries to {} , Retry Delay: ",
+                            externalTask.getId(), externalTask.getRetries() - 1,
+                            calculateRetryDelay(externalTask.getRetries()));
+                    externalTaskService.handleFailure(externalTask, UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK,
+                            UNABLE_TO_FIND_V_SERVERS_IN_OPENSTACK, externalTask.getRetries() - 1,
+                            calculateRetryDelay(externalTask.getRetries()));
+                }
+                logger.debug("The External Task {} Failed", externalTask.getId());
+            }
+        } catch (Exception e) {
+            logger.error("Error during audit query of stack", e);
+        }
+    }
+}
index 576acb1..999d273 100644 (file)
@@ -49,6 +49,9 @@ public class AuditStackService {
     @Autowired
     private AuditDeleteStackService auditDeleteStack;
 
+    @Autowired
+    private AuditQueryStackService auditQueryStack;
+
     @PostConstruct
     public void auditAddAAIInventory() throws Exception {
         for (int i = 0; i < getMaxClients(); i++) {
@@ -69,6 +72,16 @@ public class AuditStackService {
         }
     }
 
+    @PostConstruct
+    public void auditQueryInventory() throws Exception {
+        for (int i = 0; i < getMaxClients(); i++) {
+            ExternalTaskClient client = createExternalTaskClient();
+            client.subscribe("InventoryQueryAudit")
+                    .lockDuration(Long.parseLong(env.getProperty("mso.audit.lock-time", "60000")))
+                    .handler(auditQueryStack::executeExternalTask).open();
+        }
+    }
+
     protected ExternalTaskClient createExternalTaskClient() throws Exception {
         ClientRequestInterceptor interceptor = createClientRequestInterceptor();
         ExternalTaskClient client = ExternalTaskClient.create()
index e009c0e..89e0320 100644 (file)
 
 package org.onap.so.adapters.audit;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
@@ -40,6 +42,38 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 public class AuditVServer extends AbstractAudit {
     private static final Logger logger = LoggerFactory.getLogger(AuditVServer.class);
 
+    public void auditVservers(AAIObjectAuditList aaiObjectAuditList) {
+
+        aaiObjectAuditList.getAuditList().forEach(aaiObjectAudit -> {
+            boolean vserverExist = getAaiClient().exists(AAIUriFactory
+                    .createResourceFromExistingURI(AAIObjectType.VSERVER, aaiObjectAudit.getResourceURI()));
+            aaiObjectAudit.setDoesObjectExist(vserverExist);
+        });
+    }
+
+    public Optional<AAIObjectAuditList> auditVserversThroughRelationships(String genericVnfId, String vfModuleName) {
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, genericVnfId)
+                .queryParam("vf-module-name", vfModuleName);
+        if (getAaiClient().get(uri).getRelationships().isPresent()) {
+            List<AAIResourceUri> relatedVservers =
+                    getAaiClient().get(uri).getRelationships().get().getRelatedUris(AAIObjectType.VSERVER);
+            if (!relatedVservers.isEmpty()) {
+                relatedVservers.forEach(vserverUri -> {
+                    Optional<Vserver> vserver = getAaiClient().get(vserverUri).asBean(Vserver.class);
+                    Vserver vServerShallow = new Vserver();
+                    BeanUtils.copyProperties(vserver, vServerShallow);
+                    AAIObjectAudit vServerAudit = new AAIObjectAudit();
+                    vServerAudit.setAaiObject(vServerShallow);
+                    vServerAudit.setAaiObjectType(AAIObjectType.VSERVER.typeName());
+                    vServerAudit.setDoesObjectExist(true);
+                    auditList.getAuditList().add(vServerAudit);
+                });
+            }
+        }
+        return Optional.of(auditList);
+    }
+
     public Optional<AAIObjectAuditList> auditVservers(Set<Vserver> vServersToAudit, String tenantId, String cloudOwner,
             String cloudRegion) {
         if (vServersToAudit == null || vServersToAudit.isEmpty()) {
index 2be87ff..06fff19 100644 (file)
@@ -35,11 +35,16 @@ import org.onap.aai.domain.yang.LInterfaces;
 import org.onap.aai.domain.yang.Vlan;
 import org.onap.aai.domain.yang.Vlans;
 import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.onap.so.openstack.utils.MsoHeatUtils;
 import org.onap.so.openstack.utils.MsoNeutronUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.woorea.openstack.heat.model.Link;
@@ -66,6 +71,28 @@ public class HeatStackAudit {
     @Autowired
     protected AuditVServer auditVservers;
 
+    public Optional<AAIObjectAuditList> queryHeatStack(String cloudOwner, String cloudRegion, String tenantId,
+            String heatStackName) {
+        try {
+            logger.debug("Fetching Top Level Stack Information");
+            Resources resources = heat.queryStackResources(cloudRegion, tenantId, heatStackName, 3);
+            List<Resource> novaResources = resources.getList().stream()
+                    .filter(p -> "OS::Nova::Server".equals(p.getType())).collect(Collectors.toList());
+            if (novaResources.isEmpty())
+                return Optional.of(new AAIObjectAuditList());
+            else {
+                Set<Vserver> vserversToAudit = createVserverSet(novaResources);
+                AAIObjectAuditList aaiObjectAuditList = new AAIObjectAuditList();
+                vserversToAudit.stream().forEach(vServer -> aaiObjectAuditList.getAuditList()
+                        .add(createAAIObjectAudit(cloudOwner, cloudRegion, tenantId, vServer)));
+                return Optional.of(aaiObjectAuditList);
+            }
+        } catch (Exception e) {
+            logger.error("Error during query stack resources", e);
+            return Optional.of(new AAIObjectAuditList());
+        }
+    }
+
     public Optional<AAIObjectAuditList> auditHeatStack(String cloudRegion, String cloudOwner, String tenantId,
             String heatStackName) {
         try {
@@ -215,6 +242,31 @@ public class HeatStackAudit {
         return vserversToAudit;
     }
 
+    protected Set<Vserver> createVserverSet(List<Resource> novaResources) {
+        Set<Vserver> vserversToAudit = new HashSet<>();
+        for (Resource novaResource : novaResources) {
+            Vserver auditVserver = new Vserver();
+            auditVserver.setLInterfaces(new LInterfaces());
+            auditVserver.setVserverId(novaResource.getPhysicalResourceId());
+            vserversToAudit.add(auditVserver);
+        }
+        return vserversToAudit;
+    }
+
+    protected AAIObjectAudit createAAIObjectAudit(String cloudOwner, String cloudRegion, String tenantId,
+            Vserver vServer) {
+        AAIObjectAudit aaiObjectAudit = new AAIObjectAudit();
+        Vserver vServerShallow = new Vserver();
+        BeanUtils.copyProperties(vServer, vServerShallow);
+        aaiObjectAudit.setAaiObject(vServerShallow);
+        aaiObjectAudit.setAaiObjectType(AAIObjectType.VSERVER.typeName());
+        aaiObjectAudit.setResourceURI(AAIUriFactory
+                .createResourceUri(AAIObjectType.VSERVER, cloudOwner, cloudRegion, tenantId, vServer.getVserverId())
+                .build());
+
+        return aaiObjectAudit;
+    }
+
     /**
      * @param novaResource Single openstack resource that is of type Nova
      * @param neutronPorts List of Neutron ports created within the stack
diff --git a/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java b/adapters/mso-openstack-adapters/src/test/java/org/onap/so/adapters/audit/AuditDataServiceTest.java
new file mode 100644 (file)
index 0000000..d3380a6
--- /dev/null
@@ -0,0 +1,101 @@
+package org.onap.so.adapters.audit;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.aai.domain.yang.Vserver;
+import org.onap.so.audit.beans.AuditInventory;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAudit;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class AuditDataServiceTest {
+
+    @InjectMocks
+    AuditDataService auditDataService = new AuditDataService();
+
+    @Mock
+    protected RequestsDbClient requestsDbClient;
+
+    AuditInventory auditInventory = new AuditInventory();
+
+    @Before
+    public void before() throws JsonProcessingException {
+        auditInventory.setCloudOwner("testCloudOwner");
+        auditInventory.setCloudRegion("testLcpCloudRegionId");
+        auditInventory.setHeatStackName("testVfModuleName1");
+        auditInventory.setVfModuleId("testVnfModuleId");
+        auditInventory.setTenantId("testTenantId");
+        auditInventory.setGenericVnfId("testVnfId1");
+    }
+
+    @Test
+    public void testWriteStackDataToRequestDb() throws Exception {
+        Mockito.doReturn(new ArrayList<RequestProcessingData>()).when(requestsDbClient)
+                .getRequestProcessingDataByGroupingIdAndNameAndTag(Mockito.any(), Mockito.any(), Mockito.any());
+        Mockito.doNothing().when(requestsDbClient).saveRequestProcessingData(Mockito.any());
+
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(auditList);;
+
+        RequestProcessingData requestProcessingData = new RequestProcessingData();
+        requestProcessingData.setSoRequestId(auditInventory.getMsoRequestId());
+        requestProcessingData.setGroupingId(auditInventory.getVfModuleId());
+        requestProcessingData.setName(auditInventory.getHeatStackName());
+        requestProcessingData.setTag("AuditStackData");
+        requestProcessingData.setValue(auditListString);
+
+        auditDataService.writeStackDataToRequestDb(auditInventory, auditList);
+        Mockito.verify(requestsDbClient, Mockito.times(1)).saveRequestProcessingData(requestProcessingData);
+    }
+
+    @Test
+    public void testGetStackDataToRequestDb() throws Exception {
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(audit);
+
+        List<RequestProcessingData> list = new ArrayList();
+        RequestProcessingData requestProcessingData = new RequestProcessingData();
+        requestProcessingData.setId(234321432);
+        requestProcessingData.setGroupingId("testVfModuleId");
+        requestProcessingData.setName("heatStackName");
+        requestProcessingData.setTag("AuditStackData");
+        requestProcessingData.setValue(auditListString);
+        list.add(requestProcessingData);
+
+        Mockito.doReturn(list).when(requestsDbClient).getRequestProcessingDataByGroupingIdAndNameAndTag(Mockito.any(),
+                Mockito.any(), Mockito.any());
+        auditDataService.getStackDataFromRequestDb(auditInventory);
+        Mockito.verify(requestsDbClient, Mockito.times(1)).getRequestProcessingDataByGroupingIdAndNameAndTag(
+                "testVnfModuleId", "testVfModuleName1", "AuditStackData");
+    }
+
+}
index f23486c..3432e4a 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -40,6 +40,7 @@ import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.springframework.core.env.Environment;
 import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
@@ -48,6 +49,9 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
     @InjectMocks
     private AuditCreateStackService auditStackService = new AuditCreateStackService();
 
+    @InjectMocks
+    private AuditQueryStackService auditQueryStackService = new AuditQueryStackService();
+
     @Mock
     private HeatStackAudit heatStackAuditMock;
 
@@ -60,6 +64,9 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
     @Mock
     private ExternalTaskService mockExternalTaskService;
 
+    @Mock
+    private AuditDataService auditDataService;
+
     private ObjectMapper objectMapper = new ObjectMapper();
 
     private AuditInventory auditInventory = new AuditInventory();
@@ -111,6 +118,20 @@ public class AuditStackServiceDataTest extends AuditCreateStackService {
         assertNotNull(actualMap.get("auditInventoryResult"));
     }
 
+    @Test
+    public void executeExternalTaskQueryAuditTest() throws JsonProcessingException {
+        doReturn(auditListOptSuccess).when(heatStackAuditMock).queryHeatStack("cloudOwner", "cloudRegion", "tenantId",
+                "stackName");
+        Mockito.doNothing().when(auditDataService).writeStackDataToRequestDb(Mockito.any(AuditInventory.class),
+                Mockito.any(AAIObjectAuditList.class));
+        auditQueryStackService.executeExternalTask(mockExternalTask, mockExternalTaskService);
+        ArgumentCaptor<Map> captor = ArgumentCaptor.forClass(Map.class);
+        ArgumentCaptor<ExternalTask> taskCaptor = ArgumentCaptor.forClass(ExternalTask.class);
+        Mockito.verify(mockExternalTaskService).complete(taskCaptor.capture(), captor.capture());
+        Mockito.verify(auditDataService).writeStackDataToRequestDb(Mockito.any(AuditInventory.class),
+                Mockito.any(AAIObjectAuditList.class));
+    }
+
     @Test
     public void execute_external_task_audit_first_failure_Test() {
         doReturn(auditListOptFailure).when(heatStackAuditMock).auditHeatStack("cloudRegion", "cloudOwner", "tenantId",
index 2075557..3d9a128 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -33,14 +33,19 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Stream;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.LInterfaces;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipList;
+import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.client.aai.AAIObjectPlurals;
 import org.onap.so.client.aai.AAIObjectType;
@@ -48,6 +53,7 @@ import org.onap.so.client.aai.AAIResourcesClient;
 import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.uri.AAIResourceUri;
 import org.onap.so.client.aai.entities.uri.AAIUriFactory;
+import org.onap.so.objects.audit.AAIObjectAudit;
 import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.skyscreamer.jsonassert.JSONAssert;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
@@ -362,6 +368,69 @@ public class AuditVServerTest extends AuditVServer {
         JSONAssert.assertEquals(expected, actualString, false);
     }
 
+    @Test
+    public void testAuditVserversWithList() {
+
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        AAIObjectAudit obj1 = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        obj1.setAaiObject(vserver);
+        obj1.setResourceURI(AAIUriFactory
+                .createResourceUri(AAIObjectType.VSERVER, cloudOwner, cloudRegion, tenantId, "testVserverId").build());
+        auditList.getAuditList().add(obj1);
+
+        doReturn(false).when(aaiResourcesMock).exists(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER, cloudOwner,
+                cloudRegion, tenantId, "testVserverId"));
+
+        auditNova.auditVservers(auditList);
+
+        Mockito.verify(aaiResourcesMock).exists(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER, cloudOwner,
+                cloudRegion, tenantId, "testVserverId"));
+
+        Assert.assertEquals(false, auditList.getAuditList().get(0).isDoesObjectExist());
+    }
+
+    @Test
+    public void testAuditVserversThroughRelationships() {
+
+        VfModule vfModule = new VfModule();
+        vfModule.setVfModuleId("id");
+
+        AAIResultWrapper wrapper = new AAIResultWrapper(vfModule);
+
+        doReturn(wrapper).when(aaiResourcesMock)
+                .get(AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, "genericVnfId")
+                        .queryParam("vf-module-name", "vfModuleName"));
+
+        Optional<AAIObjectAuditList> auditList =
+                auditNova.auditVserversThroughRelationships("genericVnfId", "vfModuleName");
+
+        Assert.assertTrue(auditList.get().getAuditList().isEmpty());
+    }
+
+    @Test
+    public void testAuditVserversThroughRelationships_exists() throws IOException {
+
+        String vfModule = getJson("vfModule.json");
+
+        AAIResultWrapper wrapper = new AAIResultWrapper(vfModule);
+        AAIResultWrapper vserverWrapper = new AAIResultWrapper(new Vserver());
+
+        doReturn(wrapper).when(aaiResourcesMock)
+                .get(AAIUriFactory.createResourceUri(AAIObjectPlurals.VF_MODULE, "genericVnfId")
+                        .queryParam("vf-module-name", "vfModuleName"));
+
+        doReturn(vserverWrapper).when(aaiResourcesMock).get(AAIUriFactory.createResourceUri(AAIObjectType.VSERVER,
+                "cloud-owner", "cloud-region-id", "tenant-id", "VUSCHGA1"));
+
+        Optional<AAIObjectAuditList> auditList =
+                auditNova.auditVserversThroughRelationships("genericVnfId", "vfModuleName");
+
+        Assert.assertFalse(auditList.get().getAuditList().isEmpty());
+    }
+
+
     private String getJson(String filename) throws IOException {
         return new String(Files.readAllBytes(Paths.get("src/test/resources/" + filename)));
     }
diff --git a/adapters/mso-openstack-adapters/src/test/resources/vfModule.json b/adapters/mso-openstack-adapters/src/test/resources/vfModule.json
new file mode 100644 (file)
index 0000000..bfdca2c
--- /dev/null
@@ -0,0 +1,38 @@
+{
+                "vf-module-id": "a62d14f0-421e-4e64-980a-a368722819db",
+                "vf-module-name": "vig30001vm001vig001_migrated.base.module-0",
+                "is-base-vf-module": false,
+                "resource-version": "1494001780539",
+                "relationship-list": {
+                    "relationship": [
+                        {
+                            "related-to": "vserver",
+                            "related-link": "/aai/v11/cloud-infrastructure/cloud-regions/cloud-region/cloud-owner/cloud-region-id/tenants/tenant/tenant-id/vservers/vserver/VUSCHGA1",
+                            "relationship-data": [
+                                {
+                                    "relationship-key": "cloud-region.cloud-owner",
+                                    "relationship-value": "cloud-owner"
+                                },
+                                {
+                                    "relationship-key": "cloud-region.cloud-region-id",
+                                    "relationship-value": "cloud-region-id"
+                                },
+                                {
+                                    "relationship-key": "tenant.tenant-id",
+                                    "relationship-value": "tenant-id"
+                                },
+                                {
+                                    "relationship-key": "vserver.vserver-id",
+                                    "relationship-value": "VUSCHGA1"
+                                }
+                            ],
+                            "related-to-property": [
+                                {
+                                    "property-key": "vserver.vserver-name",
+                                    "property-value": "VUSCHGA1"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
diff --git a/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java b/adapters/mso-requests-db-adapter/src/main/java/org/onap/so/adapters/requestsdb/RequestDbRepositoryConfiguration.java
new file mode 100644 (file)
index 0000000..c32525a
--- /dev/null
@@ -0,0 +1,23 @@
+package org.onap.so.adapters.requestsdb;
+
+import java.util.stream.Collectors;
+import javax.persistence.EntityManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
+import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter;
+
+@Configuration
+public class RequestDbRepositoryConfiguration extends RepositoryRestConfigurerAdapter {
+
+    @Autowired
+    private EntityManager entityManager;
+
+    @Override
+    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
+        config.exposeIdsFor(entityManager.getMetamodel().getEntities().stream().map(e -> e.getJavaType())
+                .collect(Collectors.toList()).toArray(new Class[0]));
+    }
+
+
+}
index 33335ab..ca0f845 100644 (file)
@@ -2,13 +2,12 @@
 <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="1.10.0">
   <bpmn:process id="DeleteVfModuleBB" name="DeleteVfModuleBB" isExecutable="true">
     <bpmn:startEvent id="DeleteVfModuleBB_Start">
-      <bpmn:outgoing>SequenceFlow_1537yw5</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1oeootm</bpmn:outgoing>
     </bpmn:startEvent>
-    <bpmn:serviceTask id="DeleteVfModuleVnfAdapter" name="Delete Vf Module VnfAdapter" camunda:expression="${VnfAdapterDeleteTasks.deleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1n8gab5</bpmn:incoming>
+    <bpmn:serviceTask id="DeleteVfModuleVnfAdapter" name="Prepare Request" camunda:expression="${VnfAdapterDeleteTasks.deleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn:incoming>SequenceFlow_028rmiu</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_08tvhtf</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1537yw5" sourceRef="DeleteVfModuleBB_Start" targetRef="ExclusiveGateway_0xrgzm7" />
     <bpmn:serviceTask id="UpdateVfModuleDeleteStatus" name="&#10;AAI &#10;Update&#10;(vf module)&#10;" camunda:expression="${AAIUpdateTasks.updateOrchestrationStatusDeleteVfModule(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_01vfwtp</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_09l7pcg</bpmn:outgoing>
       <bpmn:incoming>SequenceFlow_0khqfnc</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0yuz21z</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1n8gab5" sourceRef="ExclusiveGateway_0xrgzm7" targetRef="DeleteVfModuleVnfAdapter" />
-    <bpmn:parallelGateway id="ExclusiveGateway_0xrgzm7">
-      <bpmn:incoming>SequenceFlow_1537yw5</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1n8gab5</bpmn:outgoing>
-      <bpmn:outgoing>SequenceFlow_1v3jgqe</bpmn:outgoing>
-    </bpmn:parallelGateway>
-    <bpmn:sequenceFlow id="SequenceFlow_032jv5j" name="Yes&#10;" sourceRef="ExclusiveGateway_1h2ystu" targetRef="Setup_Audit_Variable">
+    <bpmn:sequenceFlow id="SequenceFlow_032jv5j" name="Yes&#10;" sourceRef="auditEnabledCheck" targetRef="Setup_Audit_Variable">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditInventoryNeeded") == true}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="SequenceFlow_0qfmmgt" sourceRef="Audit_Inventory" targetRef="auditSuccessfulCheck" />
     <bpmn:sequenceFlow id="SequenceFlow_14bu4ys" sourceRef="ExclusiveGateway_1yvh16a" targetRef="aaiThrow" />
-    <bpmn:sequenceFlow id="SequenceFlow_1mgunf3" name="No" sourceRef="ExclusiveGateway_1h2ystu" targetRef="ExclusiveGateway_1pydilb" />
     <bpmn:serviceTask id="Check_Audit" name="Check Audit Variable" camunda:expression="${AuditTasks.isDeleteAuditNeeded(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
-      <bpmn:incoming>SequenceFlow_1v3jgqe</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1odt2wt</bpmn:outgoing>
+      <bpmn:incoming>SequenceFlow_1oeootm</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_10af0fk</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1v3jgqe" sourceRef="ExclusiveGateway_0xrgzm7" targetRef="Check_Audit" />
-    <bpmn:sequenceFlow id="SequenceFlow_1odt2wt" sourceRef="Check_Audit" targetRef="ExclusiveGateway_1h2ystu" />
-    <bpmn:sequenceFlow id="SequenceFlow_1swistn" sourceRef="Setup_Audit_Variable" targetRef="Audit_Inventory" />
-    <bpmn:serviceTask id="Audit_Inventory" name="Audit Inventory For Delete in AAI" camunda:type="external" camunda:topic="InventoryDeleteAudit">
-      <bpmn:incoming>SequenceFlow_1swistn</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_0qfmmgt</bpmn:outgoing>
+    <bpmn:serviceTask id="Audit_Inventory" name="&#10;AAI&#10;Audit&#10;(vservers)&#10;" camunda:type="external" camunda:topic="InventoryDeleteAudit">
+      <bpmn:incoming>SequenceFlow_0f5ljoh</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0hpj2mm</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:serviceTask id="Setup_Audit_Variable" name="Setup Audit Variable" camunda:expression="${AuditTasks.setupAuditVariable(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
       <bpmn:incoming>SequenceFlow_032jv5j</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1swistn</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1iulltd</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_1ut7n32" sourceRef="ExclusiveGateway_1pydilb" targetRef="ExclusiveGateway_1yvh16a" />
-    <bpmn:exclusiveGateway id="ExclusiveGateway_1h2ystu" name="Audit&#10; Enabled?" default="SequenceFlow_1mgunf3">
-      <bpmn:incoming>SequenceFlow_1odt2wt</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_032jv5j</bpmn:outgoing>
-      <bpmn:outgoing>SequenceFlow_1mgunf3</bpmn:outgoing>
-    </bpmn:exclusiveGateway>
-    <bpmn:exclusiveGateway id="ExclusiveGateway_1pydilb">
-      <bpmn:incoming>SequenceFlow_1mgunf3</bpmn:incoming>
-      <bpmn:incoming>SequenceFlow_17cd9e2</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1ut7n32</bpmn:outgoing>
-    </bpmn:exclusiveGateway>
     <bpmn:subProcess id="SubProcess_0grvkj2" name="Audit Exception Sub Process" triggeredByEvent="true">
       <bpmn:endEvent id="EndEvent_1gzq57j">
         <bpmn:incoming>SequenceFlow_1fhst92</bpmn:incoming>
       <bpmn:sequenceFlow id="SequenceFlow_1fhst92" sourceRef="ServiceTask_1isbxvo" targetRef="EndEvent_1gzq57j" />
       <bpmn:startEvent id="StartEvent_1euiddy" isInterrupting="false">
         <bpmn:outgoing>SequenceFlow_0xuodpy</bpmn:outgoing>
-        <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" camunda:escalationCodeVariable="test" />
+        <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" camunda:escalationCodeVariable="auditCode" />
       </bpmn:startEvent>
     </bpmn:subProcess>
     <bpmn:sequenceFlow id="SequenceFlow_179btn2" sourceRef="aaiCatch" targetRef="DeleteNetworkPolicies" />
       <bpmn:outgoing>SequenceFlow_179btn2</bpmn:outgoing>
       <bpmn:linkEventDefinition name="AAI" />
     </bpmn:intermediateCatchEvent>
-    <bpmn:sequenceFlow id="SequenceFlow_17cd9e2" name="Yes/No" sourceRef="auditSuccessfulCheck" targetRef="ExclusiveGateway_1pydilb">
+    <bpmn:sequenceFlow id="SequenceFlow_17cd9e2" name="Yes/No" sourceRef="auditSuccessfulCheck" targetRef="ExclusiveGateway_01wvywu">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditIsSuccessful") == false || execution.getVariable("auditIsSuccessful") == true}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_1gdyk9j" name="No" sourceRef="auditSuccessfulCheck" targetRef="EndEvent_0b0ocu0">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditIsSuccessful") == false}]]></bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:inclusiveGateway id="ExclusiveGateway_1yvh16a">
-      <bpmn:incoming>SequenceFlow_02lpx87</bpmn:incoming>
-      <bpmn:incoming>SequenceFlow_1ut7n32</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_14bu4ys</bpmn:outgoing>
-    </bpmn:inclusiveGateway>
     <bpmn:inclusiveGateway id="auditSuccessfulCheck" name="Audit&#10; Successful?">
-      <bpmn:incoming>SequenceFlow_0qfmmgt</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0hpj2mm</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_17cd9e2</bpmn:outgoing>
       <bpmn:outgoing>SequenceFlow_1gdyk9j</bpmn:outgoing>
     </bpmn:inclusiveGateway>
       <bpmn:incoming>SequenceFlow_1gdyk9j</bpmn:incoming>
       <bpmn:escalationEventDefinition escalationRef="Escalation_130je8j" />
     </bpmn:endEvent>
+    <bpmn:exclusiveGateway id="auditEnabledCheck" name="Audit&#10; Enabled?" default="SequenceFlow_1bt1p2u">
+      <bpmn:incoming>SequenceFlow_10af0fk</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_032jv5j</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1bt1p2u</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_1t9q2jl">
+      <bpmn:incoming>SequenceFlow_1bt1p2u</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0dzf7hz</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_1bq9g02</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_1bt1p2u" name="No" sourceRef="auditEnabledCheck" targetRef="ExclusiveGateway_1t9q2jl" />
+    <bpmn:sequenceFlow id="SequenceFlow_1oeootm" sourceRef="DeleteVfModuleBB_Start" targetRef="Check_Audit" />
+    <bpmn:sequenceFlow id="SequenceFlow_10af0fk" sourceRef="Check_Audit" targetRef="auditEnabledCheck" />
+    <bpmn:serviceTask id="aicQueryStack" name="&#10;AIC&#10;Query&#10;(stack)&#10;" camunda:type="external" camunda:topic="InventoryQueryAudit">
+      <bpmn:incoming>SequenceFlow_1iulltd</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0dzf7hz</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:sequenceFlow id="SequenceFlow_1iulltd" sourceRef="Setup_Audit_Variable" targetRef="aicQueryStack" />
+    <bpmn:sequenceFlow id="SequenceFlow_0dzf7hz" sourceRef="aicQueryStack" targetRef="ExclusiveGateway_1t9q2jl" />
+    <bpmn:sequenceFlow id="SequenceFlow_1bq9g02" sourceRef="ExclusiveGateway_1t9q2jl" targetRef="ExclusiveGateway_1naduhl" />
+    <bpmn:sequenceFlow id="SequenceFlow_0mtzl4z" sourceRef="ExclusiveGateway_1naduhl" targetRef="ExclusiveGateway_13fhmpf" />
+    <bpmn:sequenceFlow id="SequenceFlow_028rmiu" sourceRef="ExclusiveGateway_1naduhl" targetRef="DeleteVfModuleVnfAdapter" />
+    <bpmn:parallelGateway id="ExclusiveGateway_1naduhl">
+      <bpmn:incoming>SequenceFlow_1bq9g02</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0mtzl4z</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_028rmiu</bpmn:outgoing>
+    </bpmn:parallelGateway>
+    <bpmn:inclusiveGateway id="ExclusiveGateway_1yvh16a">
+      <bpmn:incoming>SequenceFlow_02lpx87</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_13mlz57</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_14bu4ys</bpmn:outgoing>
+    </bpmn:inclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0hpj2mm" sourceRef="Audit_Inventory" targetRef="auditSuccessfulCheck" />
+    <bpmn:exclusiveGateway id="ExclusiveGateway_13fhmpf" name="Audit&#10; Enabled?" default="SequenceFlow_1gjwivp">
+      <bpmn:incoming>SequenceFlow_0mtzl4z</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0f5ljoh</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1gjwivp</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_0f5ljoh" name="Yes" sourceRef="ExclusiveGateway_13fhmpf" targetRef="Audit_Inventory">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("auditInventoryNeeded") == true}]]></bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:exclusiveGateway id="ExclusiveGateway_01wvywu">
+      <bpmn:incoming>SequenceFlow_17cd9e2</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_1gjwivp</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_13mlz57</bpmn:outgoing>
+    </bpmn:exclusiveGateway>
+    <bpmn:sequenceFlow id="SequenceFlow_1gjwivp" name="No" sourceRef="ExclusiveGateway_13fhmpf" targetRef="ExclusiveGateway_01wvywu" />
+    <bpmn:sequenceFlow id="SequenceFlow_13mlz57" sourceRef="ExclusiveGateway_01wvywu" targetRef="ExclusiveGateway_1yvh16a" />
   </bpmn:process>
   <bpmn:error id="Error_0jjnve8" name="Error_3k24na6" errorCode="AAIInventoryFailure" />
   <bpmn:escalation id="Escalation_130je8j" name="audit" escalationCode="audit1" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_16798zf_di" bpmnElement="DeleteVfModuleVnfAdapter">
-        <dc:Bounds x="382" y="303" width="100" height="80" />
+        <dc:Bounds x="888" y="312" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1537yw5_di" bpmnElement="SequenceFlow_1537yw5">
-        <di:waypoint xsi:type="dc:Point" x="195" y="284" />
-        <di:waypoint xsi:type="dc:Point" x="282" y="284" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="194" y="263" width="90" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0pbhsub_di" bpmnElement="UpdateVfModuleDeleteStatus">
         <dc:Bounds x="907" y="468" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_08tvhtf_di" bpmnElement="SequenceFlow_08tvhtf">
-        <di:waypoint xsi:type="dc:Point" x="482" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="511" y="343" />
+        <di:waypoint xsi:type="dc:Point" x="988" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1020" y="352" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="452" y="322" width="90" height="12" />
+          <dc:Bounds x="959" y="331" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1rn6yvh_di" bpmnElement="DeleteVfModuleBB_End">
-        <dc:Bounds x="1136" y="490" width="36" height="36" />
+        <dc:Bounds x="1268" y="490" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1109" y="530" width="90" height="0" />
+          <dc:Bounds x="1241" y="530" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="CallActivity_0whogn3_di" bpmnElement="VnfAdapter">
-        <dc:Bounds x="511" y="303" width="100" height="80" />
+        <dc:Bounds x="1020" y="312" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_02lpx87_di" bpmnElement="SequenceFlow_02lpx87">
-        <di:waypoint xsi:type="dc:Point" x="611" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="1120" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="309" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="723" y="328" width="90" height="0" />
+          <dc:Bounds x="1116.5" y="337" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_11p7mrh_di" bpmnElement="SubProcess_11p7mrh" isExpanded="true">
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_09l7pcg_di" bpmnElement="SequenceFlow_09l7pcg">
         <di:waypoint xsi:type="dc:Point" x="1007" y="508" />
-        <di:waypoint xsi:type="dc:Point" x="1136" y="508" />
+        <di:waypoint xsi:type="dc:Point" x="1268" y="508" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1027" y="493" width="90" height="0" />
+          <dc:Bounds x="1092.5" y="493" width="90" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0xyu3pk_di" bpmnElement="SequenceFlow_0xyu3pk">
       <bpmndi:BPMNShape id="ServiceTask_0v8naz9_di" bpmnElement="UpdateVfModuleContrailServiceInstanceFqdn">
         <dc:Bounds x="654" y="468" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1n8gab5_di" bpmnElement="SequenceFlow_1n8gab5">
-        <di:waypoint xsi:type="dc:Point" x="307" y="309" />
-        <di:waypoint xsi:type="dc:Point" x="307" y="343" />
-        <di:waypoint xsi:type="dc:Point" x="382" y="343" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="277" y="320" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ParallelGateway_18x6mx2_di" bpmnElement="ExclusiveGateway_0xrgzm7">
-        <dc:Bounds x="282" y="259" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="262" y="312" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_032jv5j_di" bpmnElement="SequenceFlow_032jv5j">
-        <di:waypoint xsi:type="dc:Point" x="492" y="174" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="531" y="133" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="259" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="444" y="214" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="499" y="139" width="19" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0qfmmgt_di" bpmnElement="SequenceFlow_0qfmmgt">
-        <di:waypoint xsi:type="dc:Point" x="754" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="780" y="133" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="722" y="111.5" width="90" height="13" />
+          <dc:Bounds x="405.5348837209302" y="217.95121951219514" width="19" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_14bu4ys_di" bpmnElement="SequenceFlow_14bu4ys">
-        <di:waypoint xsi:type="dc:Point" x="950" y="284" />
-        <di:waypoint xsi:type="dc:Point" x="1100" y="283" />
+        <di:waypoint xsi:type="dc:Point" x="1228" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="1323" y="284" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="980" y="262" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1mgunf3_di" bpmnElement="SequenceFlow_1mgunf3">
-        <di:waypoint xsi:type="dc:Point" x="492" y="224" />
-        <di:waypoint xsi:type="dc:Point" x="492" y="257" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="257" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="224" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="503.9261744966443" y="237" width="14" height="12" />
+          <dc:Bounds x="1230.5" y="262.5" width="90" height="13" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1vmz3zo_di" bpmnElement="Check_Audit">
-        <dc:Bounds x="339" y="159" width="100" height="80" />
+        <dc:Bounds x="244" y="244" width="100" height="80" />
       </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1v3jgqe_di" bpmnElement="SequenceFlow_1v3jgqe">
-        <di:waypoint xsi:type="dc:Point" x="307" y="259" />
-        <di:waypoint xsi:type="dc:Point" x="307" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="339" y="199" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="277" y="223" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1odt2wt_di" bpmnElement="SequenceFlow_1odt2wt">
-        <di:waypoint xsi:type="dc:Point" x="439" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="467" y="199" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="408" y="178" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1swistn_di" bpmnElement="SequenceFlow_1swistn">
-        <di:waypoint xsi:type="dc:Point" x="631" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="654" y="133" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="598" y="112" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1l8r2a6_di" bpmnElement="Audit_Inventory">
-        <dc:Bounds x="654" y="93" width="100" height="80" />
+        <dc:Bounds x="930" y="117" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1gttdjr_di" bpmnElement="Setup_Audit_Variable">
-        <dc:Bounds x="531" y="93" width="100" height="80" />
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNEdge id="SequenceFlow_1ut7n32_di" bpmnElement="SequenceFlow_1ut7n32">
-        <di:waypoint xsi:type="dc:Point" x="893" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="199" />
-        <di:waypoint xsi:type="dc:Point" x="925" y="259" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="864" y="177.5" width="90" height="13" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ExclusiveGateway_1olwkdn_di" bpmnElement="ExclusiveGateway_1h2ystu" isMarkerVisible="true">
-        <dc:Bounds x="467" y="174" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="519" y="187" width="45" height="24" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
-      <bpmndi:BPMNShape id="ExclusiveGateway_1d1pmqz_di" bpmnElement="ExclusiveGateway_1pydilb" isMarkerVisible="true">
-        <dc:Bounds x="843" y="174" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="733" y="227" width="90" height="13" />
-        </bpmndi:BPMNLabel>
+        <dc:Bounds x="444" y="174" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="SubProcess_0grvkj2_di" bpmnElement="SubProcess_0grvkj2" isExpanded="true">
         <dc:Bounds x="231" y="642" width="350" height="200" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="IntermediateThrowEvent_1sftyjz_di" bpmnElement="aaiThrow">
-        <dc:Bounds x="1100" y="266" width="36" height="36" />
+        <dc:Bounds x="1323" y="266" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1092" y="305" width="55" height="12" />
+          <dc:Bounds x="1315" y="305" width="55" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_13y483m_di" bpmnElement="aaiCatch">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_17cd9e2_di" bpmnElement="SequenceFlow_17cd9e2">
-        <di:waypoint xsi:type="dc:Point" x="830" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="133" />
-        <di:waypoint xsi:type="dc:Point" x="868" y="174" />
+        <di:waypoint xsi:type="dc:Point" x="1108" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="189" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="830" y="114" width="36" height="12" />
+          <dc:Bounds x="1111.0434782608695" y="137" width="36" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1gdyk9j_di" bpmnElement="SequenceFlow_1gdyk9j">
-        <di:waypoint xsi:type="dc:Point" x="805" y="108" />
-        <di:waypoint xsi:type="dc:Point" x="805" y="56" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="132" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="109" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="109" />
+        <di:waypoint xsi:type="dc:Point" x="1083" y="84" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="812" y="77" width="14" height="12" />
+          <dc:Bounds x="1083" y="110.74468085106383" width="14" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="InclusiveGateway_0cjvlht_di" bpmnElement="ExclusiveGateway_1yvh16a">
-        <dc:Bounds x="900" y="259" width="50" height="50" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="879" y="312" width="0" height="12" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="InclusiveGateway_0i6rdd1_di" bpmnElement="auditSuccessfulCheck">
-        <dc:Bounds x="780" y="108" width="50" height="50" />
+        <dc:Bounds x="1058" y="132" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="775" y="162" width="60" height="24" />
+          <dc:Bounds x="1053" y="186" width="60" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="StartEvent_04qhoba_di" bpmnElement="StartEvent_1euiddy">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1onxfk1_di" bpmnElement="EndEvent_0b0ocu0">
-        <dc:Bounds x="787" y="20" width="36" height="36" />
+        <dc:Bounds x="1065" y="48" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1024" y="87" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_05scr6c_di" bpmnElement="auditEnabledCheck" isMarkerVisible="true">
+        <dc:Bounds x="371.6051332675222" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="421" y="272" width="45" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ExclusiveGateway_1t9q2jl_di" bpmnElement="ExclusiveGateway_1t9q2jl" isMarkerVisible="true">
+        <dc:Bounds x="697" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="677" y="313" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bt1p2u_di" bpmnElement="SequenceFlow_1bt1p2u">
+        <di:waypoint xsi:type="dc:Point" x="397" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="397" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="309" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="407" y="326" width="14" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1oeootm_di" bpmnElement="SequenceFlow_1oeootm">
+        <di:waypoint xsi:type="dc:Point" x="195" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="244" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="219.5" y="263" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_10af0fk_di" bpmnElement="SequenceFlow_10af0fk">
+        <di:waypoint xsi:type="dc:Point" x="344" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="372" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="358" y="263" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_1l7z1c0_di" bpmnElement="aicQueryStack">
+        <dc:Bounds x="571" y="174" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1iulltd_di" bpmnElement="SequenceFlow_1iulltd">
+        <di:waypoint xsi:type="dc:Point" x="544" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="571" y="214" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="557.5" y="193" width="0" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0dzf7hz_di" bpmnElement="SequenceFlow_0dzf7hz">
+        <di:waypoint xsi:type="dc:Point" x="671" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="722" y="259" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="651.5" y="193" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1bq9g02_di" bpmnElement="SequenceFlow_1bq9g02">
+        <di:waypoint xsi:type="dc:Point" x="747" y="284" />
+        <di:waypoint xsi:type="dc:Point" x="796" y="284" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="726.5" y="263" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0mtzl4z_di" bpmnElement="SequenceFlow_0mtzl4z">
+        <di:waypoint xsi:type="dc:Point" x="821" y="259" />
+        <di:waypoint xsi:type="dc:Point" x="821" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="846" y="214" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="791" y="231" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_028rmiu_di" bpmnElement="SequenceFlow_028rmiu">
+        <di:waypoint xsi:type="dc:Point" x="821" y="309" />
+        <di:waypoint xsi:type="dc:Point" x="821" y="352" />
+        <di:waypoint xsi:type="dc:Point" x="888" y="352" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="791" y="324.5" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ParallelGateway_1we1ooj_di" bpmnElement="ExclusiveGateway_1naduhl">
+        <dc:Bounds x="796" y="259" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="760" y="59" width="0" height="12" />
+          <dc:Bounds x="775" y="313" width="90" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="InclusiveGateway_07wvmp4_di" bpmnElement="ExclusiveGateway_1yvh16a">
+        <dc:Bounds x="1178" y="259" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1067" y="312" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0hpj2mm_di" bpmnElement="SequenceFlow_0hpj2mm">
+        <di:waypoint xsi:type="dc:Point" x="1030" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="1058" y="157" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="999" y="136" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_13fhmpf_di" bpmnElement="ExclusiveGateway_13fhmpf" isMarkerVisible="true">
+        <dc:Bounds x="846" y="189" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="898" y="202" width="45" height="24" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0f5ljoh_di" bpmnElement="SequenceFlow_0f5ljoh">
+        <di:waypoint xsi:type="dc:Point" x="871" y="189" />
+        <di:waypoint xsi:type="dc:Point" x="871" y="157" />
+        <di:waypoint xsi:type="dc:Point" x="930" y="157" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="877.601615925754" y="162.89580806038546" width="19" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ExclusiveGateway_01wvywu_di" bpmnElement="ExclusiveGateway_01wvywu" isMarkerVisible="true">
+        <dc:Bounds x="1131" y="189" width="50" height="50" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1111" y="243" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1gjwivp_di" bpmnElement="SequenceFlow_1gjwivp">
+        <di:waypoint xsi:type="dc:Point" x="871" y="239" />
+        <di:waypoint xsi:type="dc:Point" x="871" y="266" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="266" />
+        <di:waypoint xsi:type="dc:Point" x="1156" y="239" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="879" y="244" width="14" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_13mlz57_di" bpmnElement="SequenceFlow_13mlz57">
+        <di:waypoint xsi:type="dc:Point" x="1181" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="214" />
+        <di:waypoint xsi:type="dc:Point" x="1203" y="259" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="1147" y="193" width="90" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
index d9166c9..47d0ad9 100644 (file)
@@ -46,18 +46,20 @@ public class DeleteVfModuleBBTest extends BaseBPMNTest {
         mockSubprocess("VnfAdapter", "Mocked VnfAdapter", "GenericStub");
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVfModuleBB", variables);
         List<LockedExternalTask> tasks = externalTaskService.fetchAndLock(100, "externalWorkerId")
-                .topic("InventoryDeleteAudit", 60L * 1000L).execute();
+                .topic("InventoryDeleteAudit", 60L * 1000L).topic("InventoryQueryAudit", 60L * 1000L).execute();
         while (!tasks.isEmpty()) {
             for (LockedExternalTask task : tasks) {
                 externalTaskService.complete(task.getId(), "externalWorkerId");
             }
             tasks = externalTaskService.fetchAndLock(100, "externalWorkerId").topic("InventoryDeleteAudit", 60L * 1000L)
-                    .execute();
+                    .topic("InventoryQueryAudit", 60L * 1000L).execute();
         }
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "ExclusiveGateway_0xrgzm7",
-                "ExclusiveGateway_1yvh16a", "Check_Audit", "Setup_Audit_Variable", "Audit_Inventory",
-                "DeleteVfModuleVnfAdapter", "VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
+        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "Check_Audit", "auditEnabledCheck",
+                "Setup_Audit_Variable", "Setup_Audit_Variable", "aicQueryStack", "ExclusiveGateway_1t9q2jl",
+                "ExclusiveGateway_1naduhl", "ExclusiveGateway_13fhmpf", "DeleteVfModuleVnfAdapter", "VnfAdapter",
+                "Audit_Inventory", "ExclusiveGateway_1yvh16a", "auditSuccessfulCheck", "ExclusiveGateway_01wvywu",
+                "ExclusiveGateway_1yvh16a", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
                 "UpdateVnfManagementV6Address", "UpdateVfModuleContrailServiceInstanceFqdn",
                 "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
         assertThat(pi).isEnded();
@@ -68,19 +70,22 @@ public class DeleteVfModuleBBTest extends BaseBPMNTest {
         doThrow(BpmnError.class).when(vnfAdapterDeleteTasks).deleteVfModule(any(BuildingBlockExecution.class));
         ProcessInstance pi = runtimeService.startProcessInstanceByKey("DeleteVfModuleBB", variables);
         List<LockedExternalTask> tasks = externalTaskService.fetchAndLock(100, "externalWorkerId")
-                .topic("InventoryDeleteAudit", 60L * 1000L).execute();
+                .topic("InventoryDeleteAudit", 60L * 1000L).topic("InventoryQueryAudit", 60L * 1000L).execute();
         while (!tasks.isEmpty()) {
             for (LockedExternalTask task : tasks) {
                 externalTaskService.complete(task.getId(), "externalWorkerId");
             }
             tasks = externalTaskService.fetchAndLock(100, "externalWorkerId").topic("InventoryDeleteAudit", 60L * 1000L)
-                    .execute();
+                    .topic("InventoryQueryAudit", 60L * 1000L).execute();
         }
         assertThat(pi).isNotNull();
-        assertThat(pi).isStarted().hasPassed("DeleteVfModuleBB_Start", "DeleteVfModuleVnfAdapter").hasNotPassed(
-                "VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress", "UpdateVnfManagementV6Address",
-                "UpdateVfModuleContrailServiceInstanceFqdn", "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus",
-                "DeleteVfModuleBB_End");
+        assertThat(pi).isStarted()
+                .hasPassed("DeleteVfModuleBB_Start", "Check_Audit", "auditEnabledCheck", "Setup_Audit_Variable",
+                        "Setup_Audit_Variable", "aicQueryStack", "ExclusiveGateway_1t9q2jl", "ExclusiveGateway_1naduhl",
+                        "ExclusiveGateway_13fhmpf")
+                .hasNotPassed("VnfAdapter", "DeleteNetworkPolicies", "UpdateVnfIpv4OamAddress",
+                        "UpdateVnfManagementV6Address", "UpdateVfModuleContrailServiceInstanceFqdn",
+                        "UpdateVfModuleHeatStackId", "UpdateVfModuleDeleteStatus", "DeleteVfModuleBB_End");
         assertThat(pi).isEnded();
     }
 }
index 62878fd..922b721 100644 (file)
 package org.onap.so.bpmn.infrastructure.audit;
 
 
+import java.util.List;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.bpmn.servicedecomposition.tasks.ExtractPojosForBB;
 import org.onap.so.client.exception.BBObjectNotFoundException;
 import org.onap.so.client.exception.ExceptionBuilder;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.objects.audit.AAIObjectAuditList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,12 +89,17 @@ public class AuditTasks {
 
         GeneralBuildingBlock gBBInput = execution.getGeneralBuildingBlock();
         VfModule vfModule = extractPojosForBB.extractByKey(execution, ResourceKey.VF_MODULE_ID);
+        GenericVnf genericVnf = extractPojosForBB.extractByKey(execution, ResourceKey.GENERIC_VNF_ID);
         CloudRegion cloudRegion = gBBInput.getCloudRegion();
 
+        auditInventory.setMsoRequestId(gBBInput.getRequestContext().getMsoRequestId());
         auditInventory.setCloudOwner(cloudRegion.getCloudOwner());
         auditInventory.setCloudRegion(cloudRegion.getLcpCloudRegionId());
         auditInventory.setTenantId(cloudRegion.getTenantId());
+        auditInventory.setVfModuleId(vfModule.getVfModuleId());
         auditInventory.setHeatStackName(vfModule.getVfModuleName());
+        auditInventory.setGenericVnfId(genericVnf.getVnfId());
         return auditInventory;
     }
+
 }
index 825c703..4f1ad99 100644 (file)
@@ -159,7 +159,7 @@ public class TestDataSetup {
 
     public RequestContext buildRequestContext() {
         RequestContext requestContext = new RequestContext();
-        requestContext.setMsoRequestId(UUID.randomUUID().toString());
+        requestContext.setMsoRequestId("fb06f44c-c797-4f38-9b17-b4b975344600");
         requestContext.setProductFamilyId("testProductFamilyId");
         requestContext.setRequestorId("testRequestorId");
 
index 3bf2429..cee06ca 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -21,14 +21,20 @@ package org.onap.so.bpmn.infrastructure.audit;
 
 import static com.shazam.shazamcrest.MatcherAssert.assertThat;
 import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs;
+import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.ArgumentMatchers;
 import org.mockito.InjectMocks;
+import org.mockito.Mockito;
+import org.onap.aai.domain.yang.Vserver;
 import org.onap.so.audit.beans.AuditInventory;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
@@ -36,6 +42,11 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
 import org.onap.so.bpmn.servicedecomposition.entities.ResourceKey;
 import org.onap.so.client.exception.BBObjectNotFoundException;
+import org.onap.so.client.graphinventory.GraphInventoryCommonObjectMapperProvider;
+import org.onap.so.db.request.beans.RequestProcessingData;
+import org.onap.so.objects.audit.AAIObjectAudit;
+import org.onap.so.objects.audit.AAIObjectAuditList;
+import com.fasterxml.jackson.core.JsonProcessingException;
 
 public class AuditTasksTest extends BaseTaskTest {
 
@@ -50,16 +61,29 @@ public class AuditTasksTest extends BaseTaskTest {
     public final ExpectedException exception = ExpectedException.none();
 
     @Before
-    public void before() throws BBObjectNotFoundException {
+    public void before() throws BBObjectNotFoundException, JsonProcessingException {
         serviceInstance = setServiceInstance();
         genericVnf = setGenericVnf();
         vfModule = setVfModule();
+        buildRequestContext();
         setCloudRegion();
+        setRequestContext();
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.GENERIC_VNF_ID)))
                 .thenReturn(genericVnf);
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.VF_MODULE_ID))).thenReturn(vfModule);
         when(extractPojosForBB.extractByKey(any(), ArgumentMatchers.eq(ResourceKey.SERVICE_INSTANCE_ID)))
                 .thenReturn(serviceInstance);
+        execution.setVariable("auditQuerySuccess", true);
+        AAIObjectAuditList auditList = new AAIObjectAuditList();
+        auditList.setHeatStackName("testHeatStackName");
+        AAIObjectAudit audit = new AAIObjectAudit();
+        Vserver vserver = new Vserver();
+        vserver.setVserverId("testVserverId");
+        audit.setAaiObject(vserver);
+        auditList.getAuditList().add(audit);
+        GraphInventoryCommonObjectMapperProvider objectMapper = new GraphInventoryCommonObjectMapperProvider();
+        String auditListString = objectMapper.getMapper().writeValueAsString(audit);
+        execution.setVariable("auditList", auditListString);
     }
 
     @Test
@@ -68,8 +92,12 @@ public class AuditTasksTest extends BaseTaskTest {
         expectedAuditInventory.setCloudOwner("testCloudOwner");
         expectedAuditInventory.setCloudRegion("testLcpCloudRegionId");
         expectedAuditInventory.setHeatStackName("testVfModuleName1");
+        expectedAuditInventory.setVfModuleId("testVfModuleId1");
         expectedAuditInventory.setTenantId("testTenantId");
+        expectedAuditInventory.setGenericVnfId("testVnfId1");
+        expectedAuditInventory.setMsoRequestId("fb06f44c-c797-4f38-9b17-b4b975344600");
         auditTasks.setupAuditVariable(execution);
         assertThat((AuditInventory) execution.getVariable("auditInventory"), sameBeanAs(expectedAuditInventory));
     }
+
 }
index ba2d021..7081713 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -38,4 +38,7 @@ public interface RequestProcessingDataRepository extends JpaRepository<RequestPr
             @Param("NAME") String name);
 
     List<RequestProcessingData> findBySoRequestIdOrderByGroupingIdDesc(@Param("SO_REQUEST_ID") String soRequestId);
+
+    List<RequestProcessingData> findByGroupingIdAndNameAndTag(@Param("GROUPING_ID") String groupingId,
+            @Param("NAME") String name, @Param("TAG") String tag);
 }
index c0ce59d..7a24d14 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -26,6 +26,8 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.annotation.PostConstruct;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriBuilder;
@@ -72,6 +74,7 @@ public class RequestsDbClient {
     private static final String REQUEST_ID = "REQUEST_ID";
     private static final String OPERATIONAL_ENVIRONMENT_ID = "OPERATIONAL_ENV_ID";
     private static final String SERVICE_MODEL_VERSION_ID = "SERVICE_MODEL_VERSION_ID";
+    private static final String TAG = "TAG";
     private static final String FLOW_EXECUTION_PATH = "flowExecutionPath";
     private static final String BPMN_EXECUTION_DATA_TAG = "BPMNExecutionData";
 
@@ -119,6 +122,8 @@ public class RequestsDbClient {
     private static final String findBySoRequestIdOrderByGroupingIdDesc =
             "/requestProcessingData/search/findBySoRequestIdOrderByGroupingIdDesc";
 
+    private static final String findByGroupingIdAndNameAndTag =
+            "/requestProcessingData/search/findByGroupingIdAndNameAndTag";
 
     @Autowired
     protected RestTemplate restTemplate;
@@ -368,6 +373,20 @@ public class RequestsDbClient {
                         .queryParam(GROUPING_ID, groupingId).build().toString()));
     }
 
+    public List<RequestProcessingData> getRequestProcessingDataByGroupingIdAndNameAndTag(String groupingId, String name,
+            String tag) {
+        Iterable<RequestProcessingData> requestProcessingDataListIt =
+                getClientFactory().create(RequestProcessingData.class)
+                        .getAll(getUri(UriBuilder.fromUri(endpoint + findByGroupingIdAndNameAndTag)
+                                .queryParam(GROUPING_ID, groupingId).queryParam(NAME, name).queryParam(TAG, tag).build()
+                                .toString()));
+
+        List<RequestProcessingData> requestProcessingDataList =
+                StreamSupport.stream(requestProcessingDataListIt.spliterator(), false).collect(Collectors.toList());
+
+        return requestProcessingDataList;
+    }
+
     public RequestProcessingData getRequestProcessingDataBySoRequestIdAndName(String soRequestId, String name) {
         return getClientFactory().create(RequestProcessingData.class)
                 .get(getUri(UriBuilder.fromUri(endpoint + findBySoRequestIdAndName)
index 9c257bd..b82c17d 100644 (file)
@@ -7,9 +7,9 @@
  * 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.
@@ -170,4 +170,5 @@ public class CatalogDbClientTest {
         CvnfcCustomization aCvnfc = catalogDbClient.findCvnfcCustomizationInAList(cvnfcCustomizationUuid, cvnfcs);
         assertTrue(aCvnfc.getModelCustomizationUUID().equals("a123"));
     }
+
 }