fix delete vfmodule
[so.git] / bpmn / so-bpmn-tasks / src / test / java / org / onap / so / bpmn / infrastructure / workflow / tasks / WorkflowActionTest.java
index 5699c94..87e6daa 100644 (file)
@@ -4,6 +4,8 @@
  * ================================================================================
  * Copyright (C) 2017 - 2018 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ================================================================================
  * 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
@@ -22,25 +24,25 @@ package org.onap.so.bpmn.infrastructure.workflow.tasks;
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.*;
 import static org.mockito.ArgumentMatchers.anyObject;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.UUID;
-
 import org.camunda.bpm.engine.delegate.BpmnError;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake;
@@ -51,6 +53,7 @@ import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
+import org.mockito.Spy;
 import org.onap.aai.domain.yang.GenericVnf;
 import org.onap.aai.domain.yang.L3Network;
 import org.onap.aai.domain.yang.Relationship;
@@ -58,6 +61,7 @@ import org.onap.aai.domain.yang.RelationshipList;
 import org.onap.aai.domain.yang.ServiceInstance;
 import org.onap.aai.domain.yang.VfModule;
 import org.onap.aai.domain.yang.VfModules;
+import org.onap.aai.domain.yang.Vnfc;
 import org.onap.aai.domain.yang.VolumeGroup;
 import org.onap.so.bpmn.BaseTaskTest;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
@@ -65,11 +69,17 @@ import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
 import org.onap.so.bpmn.servicedecomposition.entities.BuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
+import org.onap.so.client.aai.AAIObjectType;
+import org.onap.so.client.aai.entities.AAIResultWrapper;
 import org.onap.so.client.aai.entities.Relationships;
+import org.onap.so.client.aai.entities.uri.AAIResourceUri;
+import org.onap.so.client.aai.entities.uri.AAIUriFactory;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResource;
 import org.onap.so.db.catalog.beans.CollectionResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResourceInstanceGroupCustomization;
+import org.onap.so.db.catalog.beans.ConfigurationResource;
+import org.onap.so.db.catalog.beans.CvnfcCustomization;
 import org.onap.so.db.catalog.beans.HeatEnvironment;
 import org.onap.so.db.catalog.beans.HeatTemplate;
 import org.onap.so.db.catalog.beans.InstanceGroup;
@@ -77,6 +87,7 @@ import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
+import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
 import org.onap.so.db.catalog.beans.macro.NorthBoundRequest;
 import org.onap.so.db.catalog.beans.macro.OrchestrationFlow;
 import org.onap.so.serviceinstancebeans.RequestDetails;
@@ -85,8 +96,6 @@ import org.onap.so.serviceinstancebeans.ServiceInstancesRequest;
 import org.onap.so.serviceinstancebeans.SubscriberInfo;
 import org.springframework.core.env.Environment;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 public class WorkflowActionTest extends BaseTaskTest {
        
        
@@ -97,9 +106,15 @@ public class WorkflowActionTest extends BaseTaskTest {
        private DelegateExecution execution;
 
        
+       @InjectMocks
+       @Spy
+       protected WorkflowAction SPY_workflowAction;
+       
        @Rule
        public ExpectedException thrown = ExpectedException.none();
        
+       private String RESOURCE_PATH = "src/test/resources/__files/";
+       
        @Before
        public void before() throws Exception {
                execution = new DelegateExecutionFake();
@@ -854,6 +869,196 @@ public class WorkflowActionTest extends BaseTaskTest {
                                ,"DeleteNetworkCollectionBB");
        }
        
+       @Test
+       public void selectExecutionListALaCarteVfModuleNoFabricCreateTest() throws Exception{
+               String gAction = "createInstance";
+               String resource = "VfModule";
+               execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+               execution.setVariable("requestAction", gAction);
+               String bpmnRequest = new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
+               execution.setVariable("bpmnRequest", bpmnRequest);              
+               execution.setVariable("aLaCarte", true);
+               execution.setVariable("apiVersion", "7");
+               execution.setVariable("requestUri", "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+               
+               
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("AssignVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);  
+               
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
+               workflowAction.selectExecutionList(execution);
+               List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+               assertEqualsBulkFlowName(ebbs,"AssignVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB");
+       }
+       
+       @Test
+       public void selectExecutionListALaCarteVfModuleFabricCreateTest() throws Exception{
+               String gAction = "createInstance";
+               String resource = "VfModule";
+               execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+               execution.setVariable("requestAction", gAction);
+               String bpmnRequest = new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
+               execution.setVariable("bpmnRequest", bpmnRequest);              
+               execution.setVariable("aLaCarte", true);
+               execution.setVariable("apiVersion", "7");
+               execution.setVariable("requestUri", "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+               
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("AssignVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);
+               
+               List<CvnfcCustomization> cvnfcCustomizations = new ArrayList<CvnfcCustomization>();
+               CvnfcCustomization cvnfcCustomization = new CvnfcCustomization();
+               CvnfcConfigurationCustomization vnfVfmoduleCvnfcConfigurationCustomization = new CvnfcConfigurationCustomization();
+               ConfigurationResource configurationResource = new ConfigurationResource();
+               configurationResource.setToscaNodeType("FabricConfiguration");
+               vnfVfmoduleCvnfcConfigurationCustomization.setConfigurationResource(configurationResource);
+               vnfVfmoduleCvnfcConfigurationCustomization.setModelInstanceName("modelInstanceName1");
+               vnfVfmoduleCvnfcConfigurationCustomization.setCvnfcCustomization(cvnfcCustomization);
+               Set<CvnfcConfigurationCustomization> custSet = new HashSet<CvnfcConfigurationCustomization>();
+               custSet.add(vnfVfmoduleCvnfcConfigurationCustomization);
+               cvnfcCustomization.setCvnfcConfigurationCustomization(custSet);
+               cvnfcCustomization.setDescription("description");
+               cvnfcCustomizations.add(cvnfcCustomization);
+               
+               CvnfcCustomization cvnfcCustomization2 = new CvnfcCustomization();
+               CvnfcConfigurationCustomization vnfVfmoduleCvnfcConfigurationCustomization2 = new CvnfcConfigurationCustomization();
+               ConfigurationResource configurationResource2 = new ConfigurationResource();
+               configurationResource2.setToscaNodeType("FabricConfiguration");
+               vnfVfmoduleCvnfcConfigurationCustomization2.setConfigurationResource(configurationResource2);
+               vnfVfmoduleCvnfcConfigurationCustomization2.setModelInstanceName("modelInstanceName2");
+               vnfVfmoduleCvnfcConfigurationCustomization2.setCvnfcCustomization(cvnfcCustomization2);
+               Set<CvnfcConfigurationCustomization> custSet2 = new HashSet<CvnfcConfigurationCustomization>();
+               custSet2.add(vnfVfmoduleCvnfcConfigurationCustomization2);
+               cvnfcCustomization2.setCvnfcConfigurationCustomization(custSet2);
+               cvnfcCustomization2.setDescription("description2");
+               cvnfcCustomizations.add(cvnfcCustomization2);
+               
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
+               //when(catalogDbClient.getCvnfcCustomizationByVnfCustomizationUUIDAndVfModuleCustomizationUUID("fc25201d-36d6-43a3-8d39-fdae88e526ae", "9a6d01fd-19a7-490a-9800-460830a12e0b")).thenReturn(cvnfcCustomizations);
+               workflowAction.selectExecutionList(execution);
+               List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+               assertEqualsBulkFlowName(ebbs,"AssignVfModuleBB","CreateVfModuleBB","ActivateVfModuleBB","AssignFabricConfigurationBB","ActivateFabricConfigurationBB", "AssignFabricConfigurationBB","ActivateFabricConfigurationBB");
+       }
+       
+       @Test
+       public void selectExecutionListALaCarteVfModuleFabricDeleteTest() throws Exception{
+               String gAction = "deleteInstance";
+               String resource = "VfModule";
+               execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+               execution.setVariable("requestAction", gAction);
+               String bpmnRequest = new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
+               execution.setVariable("bpmnRequest", bpmnRequest);              
+               execution.setVariable("aLaCarte", true);
+               execution.setVariable("apiVersion", "7");
+               execution.setVariable("requestUri", "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+               
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB","DeleteVfModuleBB","UnassignVfModuleBB","DeactivateFabricConfigurationBB","UnassignFabricConfigurationBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);
+               
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
+               
+               org.onap.aai.domain.yang.GenericVnf vnf = new org.onap.aai.domain.yang.GenericVnf();
+               vnf.setVnfId("vnf0");
+               vnf.setModelCustomizationId("modelCustomizationId");
+               when(bbSetupUtils.getAAIGenericVnf(anyObject())).thenReturn(vnf);
+               
+               org.onap.aai.domain.yang.VfModule vfModule = new org.onap.aai.domain.yang.VfModule();
+               vfModule.setModelCustomizationId("modelCustomizationId");
+               when(bbSetupUtils.getAAIVfModule(anyObject(), anyObject())).thenReturn(vfModule);
+               
+               List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
+               org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
+               vnfc.setModelInvariantId("modelInvariantId");
+               vnfc.setVnfcName("testVnfcName");
+               vnfcs.add(vnfc);
+               doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(anyObject(), anyObject(), anyObject(), anyObject());
+               
+               List<org.onap.aai.domain.yang.Configuration> configurations = new ArrayList<org.onap.aai.domain.yang.Configuration>();
+               org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
+               configuration.setConfigurationId("configurationId");
+               configuration.setModelCustomizationId("modelCustimizationId");
+               configuration.setConfigurationName("testConfigurationName");
+               configurations.add(configuration);
+               doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(anyObject(), anyObject(), anyObject());
+               
+               doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(anyObject());
+               
+               SPY_workflowAction.selectExecutionList(execution);
+               List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+               assertEqualsBulkFlowName(ebbs,"DeactivateFabricConfigurationBB","UnassignFabricConfigurationBB","DeactivateVfModuleBB","DeleteVfModuleBB","UnassignVfModuleBB");
+       }
+       
+       @Test
+       public void selectExecutionListALaCarteVfModuleNoFabricDeleteTest() throws Exception{
+               String gAction = "deleteInstance";
+               String resource = "VfModule";
+               execution.setVariable("mso-request-id", "00f704ca-c5e5-4f95-a72c-6889db7b0688");
+               execution.setVariable("requestAction", gAction);
+               String bpmnRequest = new String(Files.readAllBytes(Paths.get("src/test/resources/__files/VfModuleCreateWithFabric.json")));
+               execution.setVariable("bpmnRequest", bpmnRequest);              
+               execution.setVariable("aLaCarte", true);
+               execution.setVariable("apiVersion", "7");
+               execution.setVariable("requestUri", "v7/serviceInstances/f647e3ef-6d2e-4cd3-bff4-8df4634208de/vnfs/b80b16a5-f80d-4ffa-91c8-bd47c7438a3d/vfModules");
+               
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("DeactivateVfModuleBB","DeleteVfModuleBB","UnassignVfModuleBB","DeactivateFabricConfigurationBB","UnassignFabricConfigurationBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);
+               
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwner(gAction,resource,true,"my-custom-cloud-owner")).thenReturn(northBoundRequest);
+               
+               org.onap.aai.domain.yang.GenericVnf vnf = new org.onap.aai.domain.yang.GenericVnf();
+               vnf.setVnfId("vnf0");
+               vnf.setModelCustomizationId("modelCustomizationId");
+               when(bbSetupUtils.getAAIGenericVnf(anyObject())).thenReturn(vnf);
+               
+               org.onap.aai.domain.yang.VfModule vfModule = new org.onap.aai.domain.yang.VfModule();
+               vfModule.setModelCustomizationId("modelCustomizationId");
+               when(bbSetupUtils.getAAIVfModule(anyObject(), anyObject())).thenReturn(vfModule);
+               
+               List<org.onap.aai.domain.yang.Vnfc> vnfcs = new ArrayList<org.onap.aai.domain.yang.Vnfc>();
+               org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
+               vnfc.setModelInvariantId("modelInvariantId");
+               vnfc.setVnfcName("testVnfcName");
+               vnfcs.add(vnfc);
+               doReturn(vnfcs).when(SPY_workflowAction).getRelatedResourcesInVfModule(anyObject(), anyObject(), anyObject(), anyObject());
+               
+               List<org.onap.aai.domain.yang.Configuration> configurations = new ArrayList<org.onap.aai.domain.yang.Configuration>();
+               org.onap.aai.domain.yang.Configuration configuration = new org.onap.aai.domain.yang.Configuration();
+               doReturn(configurations).when(SPY_workflowAction).getRelatedResourcesInVnfc(anyObject(), anyObject(), anyObject());
+               
+               doReturn("testName").when(SPY_workflowAction).getVnfcNameForConfiguration(anyObject());
+               
+               SPY_workflowAction.selectExecutionList(execution);
+               List<ExecuteBuildingBlock> ebbs = (List<ExecuteBuildingBlock>) execution.getVariable("flowsToExecute");
+               assertEqualsBulkFlowName(ebbs,"DeactivateVfModuleBB","DeleteVfModuleBB","UnassignVfModuleBB");
+       }
+       
+       @Test
+       public void getRelatedResourcesInVfModuleTest() throws Exception{
+               org.onap.aai.domain.yang.Vnfc vnfc = new org.onap.aai.domain.yang.Vnfc();
+               vnfc.setModelInvariantId("modelInvariantId");
+               vnfc.setVnfcName("testVnfcName");
+               
+               String vfncPayload = new String(Files.readAllBytes(Paths.get(RESOURCE_PATH + "/BuildingBlocks/vnfcResponse.json")));
+               AAIResultWrapper vfncWrapper = new AAIResultWrapper(vfncPayload);
+               
+               String configurationPayload = new String(Files.readAllBytes(Paths.get(RESOURCE_PATH + "/BuildingBlocks/configurationResponse.json")));
+               AAIResultWrapper configurationWrapper = new AAIResultWrapper(configurationPayload);
+               List<AAIResultWrapper> configurationResultWrappers = new ArrayList<AAIResultWrapper>();
+               configurationResultWrappers.add(configurationWrapper);
+               
+               AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfc.getVnfcName());
+               when(bbSetupUtils.getAAIResourceDepthOne(uri)).thenReturn(vfncWrapper);
+               
+               doReturn(configurationResultWrappers).when(SPY_workflowAction).getResultWrappersFromRelationships(anyObject(),anyObject());
+               List<org.onap.aai.domain.yang.Configuration> configurationsList = SPY_workflowAction.getRelatedResourcesInVnfc(vnfc, org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION);
+               assertEquals(1,configurationsList.size());
+               assertEquals("testConfigurationId",configurationsList.get(0).getConfigurationId());
+       }
+       
        /**
         * WorkflowActionBB Tests
         */
@@ -982,6 +1187,17 @@ public class WorkflowActionTest extends BaseTaskTest {
                assertEquals(flows.get(8).getFlowName(),"SDNOVnfHealthCheckBB");
                assertEquals(flows.get(9).getFlowName(),"AAIUnsetVnfInMaintBB");
        }       
+       
+       @Test
+       public void queryNorthBoundRequestCatalogDbTransportTest() throws MalformedURLException {
+               NorthBoundRequest northBoundRequest = new NorthBoundRequest();
+               List<OrchestrationFlow> orchFlows = createFlowList("AssignServiceInstanceBB");
+               northBoundRequest.setOrchestrationFlowList(orchFlows);
+               when(catalogDbClient.getNorthBoundRequestByActionAndIsALaCarteAndRequestScopeAndCloudOwnerAndServiceType("createInstance","Service",true,"my-custom-cloud-owner","TRANSPORT")).thenReturn(northBoundRequest);
+
+               List<OrchestrationFlow> flows = workflowAction.queryNorthBoundRequestCatalogDb(execution, "createInstance", WorkflowType.SERVICE, true,"my-custom-cloud-owner","TRANSPORT");
+               assertEquals(flows.get(0).getFlowName(),"AssignServiceInstanceBB");
+       }
 
        @Test
        public void extractResourceIdAndTypeFromUriTest(){
@@ -1200,6 +1416,74 @@ public class WorkflowActionTest extends BaseTaskTest {
                assertEquals("111",result.get(2).getResourceId());
        }
        
+       @Test
+       public void sortVfModulesByBaseLastTest(){
+               List<Resource> resources = new ArrayList<>();
+               Resource resource1 = new Resource(WorkflowType.VFMODULE,"111",false);
+               resource1.setBaseVfModule(true);
+               resources.add(resource1);
+               Resource resource2 = new Resource(WorkflowType.VFMODULE,"222",false);
+               resource2.setBaseVfModule(false);
+               resources.add(resource2);
+               Resource resource3 = new Resource(WorkflowType.VFMODULE,"333",false);
+               resource3.setBaseVfModule(false);
+               resources.add(resource3);
+               List<Resource> result = workflowAction.sortVfModulesByBaseLast(resources);
+               assertEquals("333",result.get(0).getResourceId());
+               assertEquals("222",result.get(1).getResourceId());
+               assertEquals("111",result.get(2).getResourceId());
+       }
+
+    @Test
+    public void findCatalogNetworkCollectionTest() {
+        Service service = new Service();
+        NetworkCollectionResourceCustomization networkCustomization = new NetworkCollectionResourceCustomization();
+        networkCustomization.setModelCustomizationUUID("123");
+        service.getCollectionResourceCustomizations().add(networkCustomization);
+        doReturn(networkCustomization).when(catalogDbClient).getNetworkCollectionResourceCustomizationByID("123");
+        CollectionResourceCustomization customization = workflowAction.findCatalogNetworkCollection(execution, service);
+        assertNotNull(customization);
+    }
+
+    @Test
+    public void findCatalogNetworkCollectionEmptyTest() {
+        Service service = new Service();
+        NetworkCollectionResourceCustomization networkCustomization = new NetworkCollectionResourceCustomization();
+        networkCustomization.setModelCustomizationUUID("123");
+        service.getCollectionResourceCustomizations().add(networkCustomization);
+        CollectionResourceCustomization customization = workflowAction.findCatalogNetworkCollection(execution, service);
+        assertNull(customization);
+    }
+
+    @Test
+    public void findCatalogNetworkCollectionMoreThanOneTest() {
+        Service service = new Service();
+        NetworkCollectionResourceCustomization networkCustomization1 = new NetworkCollectionResourceCustomization();
+        networkCustomization1.setModelCustomizationUUID("123");
+        NetworkCollectionResourceCustomization networkCustomization2 = new NetworkCollectionResourceCustomization();
+        networkCustomization2.setModelCustomizationUUID("321");
+        service.getCollectionResourceCustomizations().add(networkCustomization1);
+        service.getCollectionResourceCustomizations().add(networkCustomization2);
+        doReturn(networkCustomization1).when(catalogDbClient).getNetworkCollectionResourceCustomizationByID("123");
+        doReturn(networkCustomization2).when(catalogDbClient).getNetworkCollectionResourceCustomizationByID("321");
+        workflowAction.findCatalogNetworkCollection(execution, service);
+        assertEquals("Found multiple Network Collections in the Service model, only one per Service is supported.",
+            execution.getVariable("WorkflowActionErrorMessage"));
+    }
+
+    @Test
+    public void verifyLackOfNullPointerExceptionForNullResource(){
+      ExecuteBuildingBlock result = null;
+      try {
+        result = workflowAction
+        .buildExecuteBuildingBlock(new OrchestrationFlow(), null, null, null, null, null, false,
+        null, null, null, false, null, true);
+      }catch (NullPointerException e){
+      fail("NullPointerException should not be thrown when 'resource' is null");
+      }
+      assertNotNull(result);
+    }
+
        private List<OrchestrationFlow> createFlowList (String... flowNames){
                List<OrchestrationFlow> result = new ArrayList<>();
                for(String flowName : flowNames){