Add or Delete a PNF to an Active Service
[so.git] / bpmn / MSOCommonBPMN / src / main / java / org / onap / so / bpmn / servicedecomposition / tasks / BBInputSetup.java
index 145d4c8..0c5e2d1 100644 (file)
@@ -6,7 +6,7 @@
  * ================================================================================
  * Modifications Copyright (c) 2019 Samsung
  * ================================================================================
- * Modifications Copyright (c) 2019 Nokia
+ * Modifications Copyright (c) 2020 Nokia
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 
 package org.onap.so.bpmn.servicedecomposition.tasks;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -31,17 +32,41 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
+import org.apache.commons.lang3.StringUtils;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.camunda.bpm.engine.delegate.JavaDelegate;
 import org.javatuples.Pair;
+import org.onap.aaiclient.client.aai.AAICommonObjectMapperProvider;
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper;
+import org.onap.aaiclient.client.aai.entities.Relationships;
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri;
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory;
+import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder;
+import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder.Types;
 import org.onap.so.bpmn.common.BuildingBlockExecution;
 import org.onap.so.bpmn.common.DelegateExecutionImpl;
-import org.onap.so.bpmn.servicedecomposition.bbobjects.*;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.CloudRegion;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Collection;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Configuration;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Customer;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.InstanceGroup;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.LineOfBusiness;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.NetworkPolicy;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.OwningEntity;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Platform;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf;
 import org.onap.so.bpmn.servicedecomposition.bbobjects.Project;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.RouteTableReference;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceProxy;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceSubscription;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Tenant;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VfModule;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.Vnfc;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VolumeGroup;
+import org.onap.so.bpmn.servicedecomposition.bbobjects.VpnBinding;
 import org.onap.so.bpmn.servicedecomposition.entities.ConfigurationResourceKeys;
 import org.onap.so.bpmn.servicedecomposition.entities.ExecuteBuildingBlock;
 import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock;
@@ -51,13 +76,8 @@ import org.onap.so.bpmn.servicedecomposition.entities.WorkflowResourceIds;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.OrchestrationContext;
 import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.NoServiceInstanceFoundException;
+import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.ResourceNotFoundException;
 import org.onap.so.bpmn.servicedecomposition.tasks.exceptions.ServiceModelNotFoundException;
-import org.onap.so.client.aai.AAICommonObjectMapperProvider;
-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.client.exception.ExceptionBuilder;
 import org.onap.so.db.catalog.beans.CollectionNetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.CollectionResource;
@@ -67,6 +87,7 @@ import org.onap.so.db.catalog.beans.CvnfcConfigurationCustomization;
 import org.onap.so.db.catalog.beans.NetworkCollectionResourceCustomization;
 import org.onap.so.db.catalog.beans.NetworkResourceCustomization;
 import org.onap.so.db.catalog.beans.OrchestrationStatus;
+import org.onap.so.db.catalog.beans.PnfResourceCustomization;
 import org.onap.so.db.catalog.beans.Service;
 import org.onap.so.db.catalog.beans.ServiceProxyResourceCustomization;
 import org.onap.so.db.catalog.beans.VfModuleCustomization;
@@ -77,7 +98,6 @@ import org.onap.so.serviceinstancebeans.CloudConfiguration;
 import org.onap.so.serviceinstancebeans.ModelInfo;
 import org.onap.so.serviceinstancebeans.ModelType;
 import org.onap.so.serviceinstancebeans.Networks;
-import org.onap.so.serviceinstancebeans.Pnfs;
 import org.onap.so.serviceinstancebeans.RelatedInstance;
 import org.onap.so.serviceinstancebeans.RelatedInstanceList;
 import org.onap.so.serviceinstancebeans.RequestDetails;
@@ -108,6 +128,7 @@ public class BBInputSetup implements JavaDelegate {
     private static final String NETWORK_COLLECTION = "NetworkCollection";
     private static final String PREPROV = "PREPROV";
     private static final String CREATEVOLUME = "CreateVolume";
+    private static final String CONTROLLER = "Controller";
 
     @Autowired
     private BBInputSetupUtils bbInputSetupUtils;
@@ -176,6 +197,12 @@ public class BBInputSetup implements JavaDelegate {
             execution.setVariable(GBB_INPUT_VAR_NAME, outputBB);
             execution.setVariable(LOOKUP_KEY_MAP_VAR_NAME, lookupKeyMap);
 
+            if (outputBB.getRequestContext().getIsHelm()) {
+                execution.setVariable("isHelm", true);
+            } else {
+                execution.setVariable("isHelm", false);
+            }
+
             BuildingBlockExecution gBuildingBlockExecution = new DelegateExecutionImpl(execution);
             execution.setVariable("gBuildingBlockExecution", gBuildingBlockExecution);
             execution.setVariable("RetryCount", 1);
@@ -235,6 +262,11 @@ public class BBInputSetup implements JavaDelegate {
         lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, workflowResourceIds.getVolumeGroupId());
         lookupKeyMap.put(ResourceKey.CONFIGURATION_ID, workflowResourceIds.getConfigurationId());
         lookupKeyMap.put(ResourceKey.INSTANCE_GROUP_ID, workflowResourceIds.getInstanceGroupId());
+        lookupKeyMap.put(ResourceKey.VNF_INSTANCE_NAME, workflowResourceIds.getVnfInstanceName());
+        lookupKeyMap.put(ResourceKey.VF_MODULE_INSTANCE_NAME, workflowResourceIds.getVfModuleInstanceName());
+        lookupKeyMap.put(ResourceKey.CHILD_SERVICE_INSTANCE_ID, workflowResourceIds.getChildServiceInstanceId());
+        lookupKeyMap.put(ResourceKey.CHILD_SERVICE_INSTANCE_NAME, workflowResourceIds.getChildServiceInstanceName());
+        lookupKeyMap.put(ResourceKey.PNF_INSTANCE_NAME, workflowResourceIds.getPnfInstanceName());
     }
 
     protected GeneralBuildingBlock getGBBALaCarteNonService(ExecuteBuildingBlock executeBB,
@@ -387,15 +419,7 @@ public class BBInputSetup implements JavaDelegate {
             parameter.getLookupKeyMap().put(ResourceKey.VOLUME_GROUP_ID, parameter.getResourceId());
             this.populateVolumeGroup(parameter);
         } else if (modelType.equals(ModelType.vfModule)) {
-            if (parameter.getBbName().contains("Configuration")) {
-                parameter.setResourceId(parameter.getLookupKeyMap().get(ResourceKey.CONFIGURATION_ID));
-                parameter.getModelInfo().setModelCustomizationUuid(parameter.getConfigurationKey());
-                populateConfiguration(parameter);
-            } else {
-                parameter.getLookupKeyMap().put(ResourceKey.VF_MODULE_ID, parameter.getResourceId());
-                parameter.setCloudConfiguration(parameter.getRequestDetails().getCloudConfiguration());
-                this.populateVfModule(parameter);
-            }
+            populateVfModuleOnAssignAndCreateFlows(parameter);
         } else if (modelType.equals(ModelType.instanceGroup)) {
             parameter.getLookupKeyMap().put(ResourceKey.INSTANCE_GROUP_ID, parameter.getResourceId());
             this.populateInstanceGroup(parameter);
@@ -412,13 +436,37 @@ public class BBInputSetup implements JavaDelegate {
         parameter.getServiceInstance().getInstanceGroups().add(instanceGroup);
     }
 
+    protected void populateVfModuleOnAssignAndCreateFlows(BBInputSetupParameter parameter) throws Exception {
+        if (parameter.getBbName().contains("Configuration")) {
+            parameter.setResourceId(parameter.getLookupKeyMap().get(ResourceKey.CONFIGURATION_ID));
+            parameter.getModelInfo().setModelCustomizationUuid(parameter.getConfigurationKey());
+            populateConfiguration(parameter);
+        } else {
+            parameter.getLookupKeyMap().put(ResourceKey.VF_MODULE_ID, parameter.getResourceId());
+            parameter.setCloudConfiguration(parameter.getRequestDetails().getCloudConfiguration());
+            this.populateVfModule(parameter);
+        }
+    }
+
     protected void mapCatalogInstanceGroup(InstanceGroup instanceGroup, ModelInfo modelInfo, Service service) {
         // @TODO: this will populate the instanceGroup model info.
-        // Dependent on MSO-5821 653458 US - MSO - Enhance Catalog DB Schema & Adapter to support VNF Groups
+        // Dependent on MSO-5821 653458 US - MSO - Enhance Catalog DB Schema & Adapter
+        // to support VNF Groups
     }
 
     protected void populateConfiguration(BBInputSetupParameter parameter) {
         Configuration configuration = null;
+        String replaceVnfModelCustomizationUUID = "";
+        if (parameter.getRelatedInstanceList() != null) {
+            for (RelatedInstanceList relatedInstList : parameter.getRelatedInstanceList()) {
+                RelatedInstance relatedInstance = relatedInstList.getRelatedInstance();
+                if (relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)) {
+                    if (parameter.getIsReplace()) {
+                        replaceVnfModelCustomizationUUID = relatedInstance.getModelInfo().getModelCustomizationId();
+                    }
+                }
+            }
+        }
         for (Configuration configurationTemp : parameter.getServiceInstance().getConfigurations()) {
             if (parameter.getLookupKeyMap().get(ResourceKey.CONFIGURATION_ID) != null
                     && configurationTemp.getConfigurationId()
@@ -441,8 +489,17 @@ public class BBInputSetup implements JavaDelegate {
         if (configuration != null && parameter.getBbName().contains("Fabric")) {
             Vnfc vnfc = getVnfcToConfiguration(parameter.getConfigurationResourceKeys().getVnfcName());
             configuration.setVnfc(vnfc);
-            this.mapCatalogConfiguration(configuration, parameter.getModelInfo(), parameter.getService(),
-                    parameter.getConfigurationResourceKeys());
+            if (!parameter.getBbName().contains("Delete")) {
+                if (parameter.getIsReplace()) {
+                    parameter.getConfigurationResourceKeys()
+                            .setVnfResourceCustomizationUUID(replaceVnfModelCustomizationUUID);
+                    mapCatalogConfiguration(configuration, parameter.getModelInfo(),
+                            parameter.getServiceModel().getNewService(), parameter.getConfigurationResourceKeys());
+                } else {
+                    mapCatalogConfiguration(configuration, parameter.getModelInfo(),
+                            parameter.getServiceModel().getCurrentService(), parameter.getConfigurationResourceKeys());
+                }
+            }
         } else if (configuration != null && parameter.getBbName().contains("Vrf")) {
             configuration.setModelInfoConfiguration(mapperLayer.mapCatalogConfigurationToConfiguration(
                     findConfigurationResourceCustomization(parameter.getModelInfo(), parameter.getService()), null));
@@ -452,7 +509,7 @@ public class BBInputSetup implements JavaDelegate {
     }
 
     protected Vnfc getVnfcToConfiguration(String vnfcName) {
-        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfcName);
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().vnfc(vnfcName));
         Optional<org.onap.aai.domain.yang.Vnfc> vnfcOp =
                 bbInputSetupUtils.getAAIResourceDepthOne(uri).asBean(org.onap.aai.domain.yang.Vnfc.class);
         if (vnfcOp.isPresent()) {
@@ -596,6 +653,11 @@ public class BBInputSetup implements JavaDelegate {
                             parameter.getServiceModel().getCurrentService(), vnfModelCustomizationUUID);
                 }
             }
+            if (vfModule != null && vfModule.getModelInfoVfModule() != null
+                    && vfModule.getModelInfoVfModule().getModelName() != null
+                    && vfModule.getModelInfoVfModule().getModelName().contains("helm")) {
+                parameter.setIsHelm(true);
+            }
         } else {
             logger.debug("Related VNF instance Id not found: {}",
                     parameter.getLookupKeyMap().get(ResourceKey.GENERIC_VNF_ID));
@@ -631,18 +693,22 @@ public class BBInputSetup implements JavaDelegate {
                 break;
             }
         }
+        VfModuleCustomization vfResourceCustomization = null;
         if (vnfResourceCustomization != null) {
-            VfModuleCustomization vfResourceCustomization = vnfResourceCustomization.getVfModuleCustomizations()
-                    .stream() // Convert to steam
+            vfResourceCustomization = vnfResourceCustomization.getVfModuleCustomizations().stream() // Convert to steam
                     .filter(x -> modelInfo.getModelCustomizationId().equalsIgnoreCase(x.getModelCustomizationUUID()))// find
                     // what
                     // we
                     // want
                     .findAny() // If 'findAny' then return found
                     .orElse(null);
-            if (vfResourceCustomization != null) {
-                vfModule.setModelInfoVfModule(this.mapperLayer.mapCatalogVfModuleToVfModule(vfResourceCustomization));
-            }
+        }
+        if (vfResourceCustomization == null) {
+            vfResourceCustomization = bbInputSetupUtils
+                    .getVfModuleCustomizationByModelCuztomizationUUID(modelInfo.getModelCustomizationId());
+        }
+        if (vfResourceCustomization != null) {
+            vfModule.setModelInfoVfModule(this.mapperLayer.mapCatalogVfModuleToVfModule(vfResourceCustomization));
         }
     }
 
@@ -662,6 +728,7 @@ public class BBInputSetup implements JavaDelegate {
     }
 
     protected void populateVolumeGroup(BBInputSetupParameter parameter) throws Exception {
+        String replaceVnfModelCustomizationUUID = null;
         VolumeGroup volumeGroup = null;
         GenericVnf vnf = null;
         String vnfModelCustomizationUUID = null;
@@ -674,7 +741,11 @@ public class BBInputSetup implements JavaDelegate {
             for (RelatedInstanceList relatedInstList : parameter.getRelatedInstanceList()) {
                 RelatedInstance relatedInstance = relatedInstList.getRelatedInstance();
                 if (relatedInstance.getModelInfo().getModelType().equals(ModelType.vnf)) {
-                    vnfModelCustomizationUUID = relatedInstance.getModelInfo().getModelCustomizationUuid();
+                    if (parameter.getIsReplace()) {
+                        replaceVnfModelCustomizationUUID = relatedInstance.getModelInfo().getModelCustomizationId();
+                    } else {
+                        vnfModelCustomizationUUID = relatedInstance.getModelInfo().getModelCustomizationId();
+                    }
                     break;
                 }
             }
@@ -685,8 +756,13 @@ public class BBInputSetup implements JavaDelegate {
                 vnfModelCustomizationUUID =
                         bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()).getModelCustomizationId();
                 ModelInfo vnfModelInfo = new ModelInfo();
-                vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
-                mapCatalogVnf(tempVnf, vnfModelInfo, parameter.getService());
+                if (parameter.getIsReplace()) {
+                    vnfModelInfo.setModelCustomizationUuid(replaceVnfModelCustomizationUUID);
+                    mapCatalogVnf(tempVnf, vnfModelInfo, parameter.getServiceModel().getNewService());
+                } else {
+                    vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
+                    mapCatalogVnf(tempVnf, vnfModelInfo, parameter.getServiceModel().getCurrentService());
+                }
                 break;
             }
         }
@@ -696,6 +772,22 @@ public class BBInputSetup implements JavaDelegate {
                         && volumeGroupTemp.getVolumeGroupId()
                                 .equalsIgnoreCase(parameter.getLookupKeyMap().get(ResourceKey.VOLUME_GROUP_ID))) {
                     volumeGroup = volumeGroupTemp;
+                    if (volumeGroup.getModelInfoVfModule() == null) {
+                        throw new Exception(
+                                "ModelInfoVfModule is null for VolumeGroup: " + volumeGroup.getVolumeGroupId());
+                    }
+                    String volumeGroupCustId = volumeGroup.getModelInfoVfModule().getModelCustomizationUUID();
+                    ModelInfo modelInfoVolumeGroup = new ModelInfo();
+                    modelInfoVolumeGroup.setModelCustomizationId(volumeGroupCustId);
+                    if (parameter.getIsReplace() && parameter.getLookupKeyMap().get(ResourceKey.VOLUME_GROUP_ID) != null
+                            && volumeGroupTemp.getVolumeGroupId()
+                                    .equalsIgnoreCase(parameter.getLookupKeyMap().get(ResourceKey.VOLUME_GROUP_ID))) {
+                        mapCatalogVolumeGroup(volumeGroupTemp, modelInfoVolumeGroup,
+                                parameter.getServiceModel().getNewService(), replaceVnfModelCustomizationUUID);
+                    } else {
+                        mapCatalogVolumeGroup(volumeGroupTemp, modelInfoVolumeGroup,
+                                parameter.getServiceModel().getCurrentService(), vnfModelCustomizationUUID);
+                    }
                     break;
                 }
             }
@@ -703,10 +795,17 @@ public class BBInputSetup implements JavaDelegate {
                 volumeGroup = createVolumeGroup(parameter.getLookupKeyMap(), parameter.getResourceId(),
                         parameter.getInstanceName(), generatedVnfType, parameter.getInstanceParams());
                 vnf.getVolumeGroups().add(volumeGroup);
-            }
-            if (volumeGroup != null) {
-                mapCatalogVolumeGroup(volumeGroup, parameter.getModelInfo(), parameter.getService(),
-                        vnfModelCustomizationUUID);
+                if (parameter.getIsReplace()) {
+                    if (parameter.getExecuteBB().getOldVolumeGroupName() != null
+                            && !parameter.getExecuteBB().getOldVolumeGroupName().isEmpty()) {
+                        volumeGroup.setVolumeGroupName(parameter.getExecuteBB().getOldVolumeGroupName());
+                    }
+                    mapCatalogVolumeGroup(volumeGroup, parameter.getModelInfo(),
+                            parameter.getServiceModel().getNewService(), replaceVnfModelCustomizationUUID);
+                } else {
+                    mapCatalogVolumeGroup(volumeGroup, parameter.getModelInfo(),
+                            parameter.getServiceModel().getCurrentService(), vnfModelCustomizationUUID);
+                }
             }
         } else {
             logger.debug("Related VNF instance Id not found: {}",
@@ -815,13 +914,6 @@ public class BBInputSetup implements JavaDelegate {
         }
     }
 
-    private void populatePnf(Pnfs pnf, String pnfId, ServiceInstance serviceInstance) {
-        Pnf genericPnf = new Pnf();
-        genericPnf.setPnfId(pnfId);
-        genericPnf.setPnfName(pnf.getInstanceName());
-        serviceInstance.getPnfs().add(genericPnf);
-    }
-
     protected boolean instanceGroupInList(GenericVnf vnf, String instanceGroupId) {
         for (InstanceGroup instanceGroup : vnf.getInstanceGroups()) {
             if (instanceGroup.getId() != null && instanceGroup.getId().equalsIgnoreCase(instanceGroupId)) {
@@ -892,6 +984,13 @@ public class BBInputSetup implements JavaDelegate {
         }
     }
 
+    protected void mapCatalogPnf(Pnf pnf, ModelInfo modelInfo, Service service) {
+        PnfResourceCustomization pnfResourceCustomization = getPnfResourceCustomizationFromService(modelInfo, service);
+        if (pnfResourceCustomization != null) {
+            pnf.setModelInfoPnf(this.mapperLayer.mapCatalogPnfToPnf(pnfResourceCustomization));
+        }
+    }
+
     protected VnfResourceCustomization getVnfResourceCustomizationFromService(ModelInfo modelInfo, Service service) {
         VnfResourceCustomization vnfResourceCustomization = null;
         for (VnfResourceCustomization resourceCust : service.getVnfCustomizations()) {
@@ -903,6 +1002,17 @@ public class BBInputSetup implements JavaDelegate {
         return vnfResourceCustomization;
     }
 
+    protected PnfResourceCustomization getPnfResourceCustomizationFromService(ModelInfo modelInfo, Service service) {
+        PnfResourceCustomization pnfResourceCustomization = null;
+        for (PnfResourceCustomization resourceCust : service.getPnfCustomizations()) {
+            if (resourceCust.getModelCustomizationUUID().equalsIgnoreCase(modelInfo.getModelCustomizationUuid())) {
+                pnfResourceCustomization = resourceCust;
+                break;
+            }
+        }
+        return pnfResourceCustomization;
+    }
+
     protected void populateL3Network(BBInputSetupParameter parameter) {
         L3Network network = null;
         for (L3Network networkTemp : parameter.getServiceInstance().getNetworks()) {
@@ -971,9 +1081,26 @@ public class BBInputSetup implements JavaDelegate {
             if (requestDetails.getOwningEntity() != null)
                 owningEntity = mapperLayer.mapRequestOwningEntity(requestDetails.getOwningEntity());
 
+            String modelVersionId = requestDetails.getModelInfo().getModelVersionId();
+
+            if (ModelType.vnf == requestDetails.getModelInfo().getModelType()) {
+                for (RelatedInstanceList relatedInstanceList : requestDetails.getRelatedInstanceList()) {
+                    if (ModelType.service == relatedInstanceList.getRelatedInstance().getModelInfo().getModelType()) {
+                        modelVersionId = relatedInstanceList.getRelatedInstance().getModelInfo().getModelVersionId();
+                        break;
+                    }
+                }
+            }
+            if (ModelType.pnf == requestDetails.getModelInfo().getModelType()) {
+                for (RelatedInstanceList relatedInstanceList : requestDetails.getRelatedInstanceList()) {
+                    if (ModelType.service == relatedInstanceList.getRelatedInstance().getModelInfo().getModelType()) {
+                        modelVersionId = relatedInstanceList.getRelatedInstance().getModelInfo().getModelVersionId();
+                        break;
+                    }
+                }
+            }
 
-            Service service =
-                    bbInputSetupUtils.getCatalogServiceByModelUUID(requestDetails.getModelInfo().getModelVersionId());
+            Service service = bbInputSetupUtils.getCatalogServiceByModelUUID(modelVersionId);
             if (service == null) {
                 service = bbInputSetupUtils.getCatalogServiceByModelVersionAndModelInvariantUUID(
                         requestDetails.getModelInfo().getModelVersion(),
@@ -1018,7 +1145,8 @@ public class BBInputSetup implements JavaDelegate {
 
     protected ServiceSubscription getServiceSubscriptionFromURI(String resourceId, Customer customer) {
         Map<String, String> uriKeys = bbInputSetupUtils.getURIKeysFromServiceInstance(resourceId);
-        String subscriptionServiceType = uriKeys.get("service-type");
+        String subscriptionServiceType =
+                uriKeys.get(AAIFluentTypeBuilder.Types.SERVICE_SUBSCRIPTION.getUriParams().serviceType);
         org.onap.aai.domain.yang.ServiceSubscription serviceSubscriptionAAI =
                 bbInputSetupUtils.getAAIServiceSubscription(customer.getGlobalCustomerId(), subscriptionServiceType);
         if (serviceSubscriptionAAI != null) {
@@ -1030,7 +1158,7 @@ public class BBInputSetup implements JavaDelegate {
 
     protected Customer getCustomerFromURI(String resourceId) {
         Map<String, String> uriKeys = bbInputSetupUtils.getURIKeysFromServiceInstance(resourceId);
-        String globalCustomerId = uriKeys.get("global-customer-id");
+        String globalCustomerId = uriKeys.get(AAIFluentTypeBuilder.Types.CUSTOMER.getUriParams().globalCustomerId);
         org.onap.aai.domain.yang.Customer customerAAI = this.bbInputSetupUtils.getAAICustomer(globalCustomerId);
         if (customerAAI != null) {
             return mapperLayer.mapAAICustomer(customerAAI);
@@ -1046,6 +1174,7 @@ public class BBInputSetup implements JavaDelegate {
         RequestContext requestContext = mapperLayer.mapRequestContext(parameter.getRequestDetails());
         requestContext.setAction(parameter.getRequestAction());
         requestContext.setMsoRequestId(parameter.getExecuteBB().getRequestId());
+        requestContext.setIsHelm(parameter.getIsHelm());
         org.onap.aai.domain.yang.CloudRegion aaiCloudRegion =
                 bbInputSetupUtils.getCloudRegion(parameter.getRequestDetails().getCloudConfiguration());
         CloudRegion cloudRegion =
@@ -1059,8 +1188,9 @@ public class BBInputSetup implements JavaDelegate {
         if (customer == null) {
             Map<String, String> uriKeys = bbInputSetupUtils
                     .getURIKeysFromServiceInstance(parameter.getServiceInstance().getServiceInstanceId());
-            String globalCustomerId = uriKeys.get("global-customer-id");
-            String subscriptionServiceType = uriKeys.get("service-type");
+            String globalCustomerId = uriKeys.get(AAIFluentTypeBuilder.Types.CUSTOMER.getUriParams().globalCustomerId);
+            String subscriptionServiceType =
+                    uriKeys.get(AAIFluentTypeBuilder.Types.SERVICE_SUBSCRIPTION.getUriParams().serviceType);
             customer = mapCustomer(globalCustomerId, subscriptionServiceType);
         }
         outputBB.setServiceInstance(parameter.getServiceInstance());
@@ -1150,7 +1280,9 @@ public class BBInputSetup implements JavaDelegate {
                 || requestAction.equalsIgnoreCase("activateInstance")
                 || requestAction.equalsIgnoreCase("activateFabricConfiguration")
                 || requestAction.equalsIgnoreCase("recreateInstance")
-                || requestAction.equalsIgnoreCase("replaceInstance")) {
+                || requestAction.equalsIgnoreCase("replaceInstance")
+                || requestAction.equalsIgnoreCase("upgradeInstance") || requestAction.equalsIgnoreCase("healthCheck")
+                || requestAction.equalsIgnoreCase("upgradeCnf")) {
             return getGBBMacroExistingService(executeBB, lookupKeyMap, bbName, requestAction,
                     requestDetails.getCloudConfiguration());
         }
@@ -1330,7 +1462,13 @@ public class BBInputSetup implements JavaDelegate {
         if (serviceInstanceId != null) {
             aaiServiceInstance = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
             if (aaiServiceInstance != null) {
-                service = bbInputSetupUtils.getCatalogServiceByModelUUID(aaiServiceInstance.getModelVersionId());
+                String modelVersionId = aaiServiceInstance.getModelVersionId();
+                if ("upgradeInstance".equalsIgnoreCase(requestAction)) {
+                    modelVersionId = requestDetails.getModelInfo().getModelVersionId();
+                }
+
+                service = bbInputSetupUtils.getCatalogServiceByModelUUID(modelVersionId);
+
                 if (service == null) {
                     String message = String.format(
                             "Related service instance model not found in MSO CatalogDB: model-version-id=%s",
@@ -1361,19 +1499,60 @@ public class BBInputSetup implements JavaDelegate {
             cloudRegion = mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
         }
         gBB.setCloudRegion(cloudRegion);
-        if (bbName.contains(VNF)) {
+
+        /*
+         * Below check is for CNF-Upgrade only. Reads new version VNF/VF-Module details from UserParams and delegates to
+         * BBs. Reads data from RequestDetails.
+         */
+        String upgradeCnfModelCustomizationUUID = "";
+        String upgradeCnfVfModuleModelCustomizationUUID = "";
+        String upgradeCnfModelVersionId = "";
+        String upgradeCnfVfModuleModelVersionId = "";
+        if (requestDetails.getRelatedInstanceList() != null && requestAction.equalsIgnoreCase("upgradeCnf")) {
+            if (requestDetails.getRequestParameters().getUserParams() != null) {
+                List<RequestParameters> requestParams = new ArrayList<>();
+                requestParams.add(requestDetails.getRequestParameters());
+                for (RequestParameters reqParam : requestParams) {
+                    for (Map<String, Object> params : reqParam.getUserParams()) {
+                        if (params.containsKey("service")) {
+                            org.onap.so.serviceinstancebeans.Service services = serviceMapper(params);
+                            List<Vnfs> vnfs = services.getResources().getVnfs();
+                            for (Vnfs vnfobj : vnfs) {
+                                for (VfModules vfMod : vnfobj.getVfModules()) {
+                                    upgradeCnfModelCustomizationUUID = vnfobj.getModelInfo().getModelCustomizationId();
+                                    upgradeCnfModelVersionId = vnfobj.getModelInfo().getModelVersionId();
+                                    upgradeCnfVfModuleModelCustomizationUUID =
+                                            vfMod.getModelInfo().getModelCustomizationId();
+                                    upgradeCnfVfModuleModelVersionId = vfMod.getModelInfo().getModelVersionId();
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        if (bbName.contains(VNF) || (bbName.contains(CONTROLLER)
+                && (VNF).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
             for (GenericVnf genericVnf : serviceInstance.getVnfs()) {
                 if (lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID) != null
                         && genericVnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) {
                     org.onap.aai.domain.yang.GenericVnf vnf = bbInputSetupUtils.getAAIGenericVnf(genericVnf.getVnfId());
                     ModelInfo modelInfo = new ModelInfo();
-                    if (vnf != null) {
+                    if ("upgradeCnf".equalsIgnoreCase(requestAction) && upgradeCnfModelCustomizationUUID != null
+                            && !(bbName.contains("Deactivate"))) {
+                        modelInfo.setModelCustomizationUuid(upgradeCnfModelCustomizationUUID);
+                        modelInfo.setModelVersionId(upgradeCnfModelVersionId);
+                        this.mapCatalogVnf(genericVnf, modelInfo, service);
+                    } else if (vnf != null) {
                         modelInfo.setModelCustomizationUuid(vnf.getModelCustomizationId());
+                        this.mapCatalogVnf(genericVnf, modelInfo, service);
                     }
-                    this.mapCatalogVnf(genericVnf, modelInfo, service);
+
                 }
             }
-        } else if (bbName.contains(VF_MODULE)) {
+
+        } else if (bbName.contains(VF_MODULE) || (bbName.contains(CONTROLLER)
+                && (VF_MODULE).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
             for (GenericVnf vnf : serviceInstance.getVnfs()) {
                 for (VfModule vfModule : vnf.getVfModules()) {
                     if (lookupKeyMap.get(ResourceKey.VF_MODULE_ID) != null
@@ -1381,14 +1560,29 @@ public class BBInputSetup implements JavaDelegate {
                         String vnfModelCustomizationUUID =
                                 this.bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()).getModelCustomizationId();
                         ModelInfo vnfModelInfo = new ModelInfo();
-                        vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
-                        this.mapCatalogVnf(vnf, vnfModelInfo, service);
+                        if ("upgradeCnf".equalsIgnoreCase(requestAction) && upgradeCnfModelCustomizationUUID != null
+                                && !(bbName.contains("Deactivate"))) {
+                            vnfModelInfo.setModelCustomizationUuid(upgradeCnfModelCustomizationUUID);
+                            vnfModelInfo.setModelVersionId(upgradeCnfModelVersionId);
+                            this.mapCatalogVnf(vnf, vnfModelInfo, service);
+                        } else {
+                            vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
+                            this.mapCatalogVnf(vnf, vnfModelInfo, service);
+                        }
                         lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, vnf.getVnfId());
                         String vfModuleCustomizationUUID = this.bbInputSetupUtils
                                 .getAAIVfModule(vnf.getVnfId(), vfModule.getVfModuleId()).getModelCustomizationId();
                         ModelInfo vfModuleModelInfo = new ModelInfo();
-                        vfModuleModelInfo.setModelCustomizationId(vfModuleCustomizationUUID);
-                        this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service, vnfModelCustomizationUUID);
+                        if ("upgradeCnf".equalsIgnoreCase(requestAction) && upgradeCnfModelCustomizationUUID != null
+                                && !(bbName.contains("Deactivate"))) {
+                            vfModuleModelInfo.setModelCustomizationUuid(upgradeCnfVfModuleModelCustomizationUUID);
+                            vfModuleModelInfo.setModelVersionId(upgradeCnfVfModuleModelVersionId);
+                            this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service,
+                                    upgradeCnfModelCustomizationUUID);
+                        } else {
+                            vfModuleModelInfo.setModelCustomizationId(vfModuleCustomizationUUID);
+                            this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service, vnfModelCustomizationUUID);
+                        }
                         if (cloudRegion != null) {
                             Optional<String> volumeGroupIdOp = getVolumeGroupIdRelatedToVfModule(vnf, vfModuleModelInfo,
                                     cloudRegion.getCloudOwner(), cloudRegion.getLcpCloudRegionId(), lookupKeyMap);
@@ -1396,6 +1590,11 @@ public class BBInputSetup implements JavaDelegate {
                                 lookupKeyMap.put(ResourceKey.VOLUME_GROUP_ID, volumeGroupIdOp.get());
                             }
                         }
+                        if (vfModule.getModelInfoVfModule() != null
+                                && vfModule.getModelInfoVfModule().getModelName() != null
+                                && vfModule.getModelInfoVfModule().getModelName().contains("helm")) {
+                            gBB.getRequestContext().setIsHelm(true);
+                        }
                         break;
                     }
                 }
@@ -1451,6 +1650,9 @@ public class BBInputSetup implements JavaDelegate {
                     break;
                 }
             }
+        } else if (bbName.equals("HealthCheckBB")
+                && (VNF).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope())) {
+            this.setisHelmforHealthCheckBB(service, serviceInstance, gBB);
         }
         if (executeBB.getWorkflowResourceIds() != null) {
             parameter.setResourceId(executeBB.getWorkflowResourceIds().getNetworkCollectionId());
@@ -1471,14 +1673,27 @@ public class BBInputSetup implements JavaDelegate {
         Vnfs vnfs = null;
         VfModules vfModules = null;
         Networks networks = null;
+
         CloudConfiguration cloudConfiguration = requestDetails.getCloudConfiguration();
-        CloudRegion cloudRegion = getCloudRegionFromMacroRequest(cloudConfiguration, resources);
-        gBB.setCloudRegion(cloudRegion);
+        CloudRegion cloudRegion = setCloudConfiguration(gBB, cloudConfiguration);
+
         BBInputSetupParameter parameter =
                 new BBInputSetupParameter.Builder().setRequestId(executeBB.getRequestId()).setService(service)
                         .setBbName(bbName).setServiceInstance(serviceInstance).setLookupKeyMap(lookupKeyMap).build();
-        if (bbName.contains(VNF)) {
-            vnfs = findVnfsByKey(key, resources, vnfs);
+        if (bbName.contains(VNF) || (bbName.contains(CONTROLLER)
+                && (VNF).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
+            String vnfInstanceName = lookupKeyMap.get(ResourceKey.VNF_INSTANCE_NAME);
+            if (StringUtils.isNotBlank(vnfInstanceName)) {
+                vnfs = findVnfsByInstanceName(vnfInstanceName, resources);
+            } else {
+                vnfs = findVnfsByKey(key, resources);
+            }
+
+            // Vnf level cloud configuration takes precedence over service level cloud configuration.
+            if (vnfs.getCloudConfiguration() != null) {
+                setCloudConfiguration(gBB, vnfs.getCloudConfiguration());
+            }
+
             String vnfId = lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID);
             // This stores the vnf id in request db to be retrieved later when
             // working on a vf module or volume group
@@ -1500,27 +1715,63 @@ public class BBInputSetup implements JavaDelegate {
             }
             parameter.setApplicationId(applicationId);
             this.populateGenericVnf(parameter);
-        } else if (bbName.contains(PNF)) {
+        } else if (bbName.contains(PNF) || (bbName.contains(CONTROLLER)
+                && (PNF).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
             String pnfId = lookupKeyMap.get(ResourceKey.PNF);
-            resources.getPnfs().stream()
-                    .filter(pnf -> Objects.equals(key, pnf.getModelInfo().getModelCustomizationId())).findFirst()
-                    .ifPresent(pnf -> this.populatePnf(pnf, pnfId, serviceInstance));
-        } else if (bbName.contains(VF_MODULE) || bbName.contains(VOLUME_GROUP)) {
-            Pair<Vnfs, VfModules> vnfsAndVfModules = getVfModulesAndItsVnfsByKey(key, resources);
-            if (vnfsAndVfModules != null) {
-                vfModules = vnfsAndVfModules.getValue1();
-                vnfs = vnfsAndVfModules.getValue0();
+            String pnfInstanceName = lookupKeyMap.get(ResourceKey.PNF_INSTANCE_NAME);
+            if (StringUtils.isNotBlank(pnfInstanceName)) {
+                resources.getPnfs().stream().filter(pnfs -> Objects.equals(pnfInstanceName, pnfs.getInstanceName()))
+                        .findFirst()
+                        .ifPresent(pnfs -> BBInputSetupPnf.populatePnfToServiceInstance(pnfs, pnfId, serviceInstance));
+            } else {
+                resources.getPnfs().stream()
+                        .filter(pnfs -> Objects.equals(key, pnfs.getModelInfo().getModelCustomizationId())).findFirst()
+                        .ifPresent(pnfs -> BBInputSetupPnf.populatePnfToServiceInstance(pnfs, pnfId, serviceInstance));
+            }
+
+            serviceInstance.getPnfs().stream().filter(pnf -> pnfInstanceName.equalsIgnoreCase(pnf.getPnfName()))
+                    .findFirst().ifPresent(pnf -> {
+                        ModelInfo pnfModelInfo = new ModelInfo();
+                        pnfModelInfo.setModelCustomizationUuid(pnf.getModelInfoPnf().getModelCustomizationUuid());
+                        pnfModelInfo.setModelCustomizationId(pnf.getModelInfoPnf().getModelCustomizationUuid());
+                        mapCatalogPnf(pnf, pnfModelInfo, service);
+                    });
+
+        } else if (bbName.contains(VF_MODULE) || bbName.contains(VOLUME_GROUP) || (bbName.contains(CONTROLLER)
+                && (VF_MODULE).equalsIgnoreCase(executeBB.getBuildingBlock().getBpmnScope()))) {
+            String vfModuleInstanceName = lookupKeyMap.get(ResourceKey.VF_MODULE_INSTANCE_NAME);
+            if (StringUtils.isNotBlank(vfModuleInstanceName)) {
+                vfModules = getVfModulesByInstanceName(vfModuleInstanceName, resources);
+            } else {
+                vfModules = getVfModulesByKey(key, resources);
             }
-            lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, getVnfId(executeBB, lookupKeyMap));
-            if (vnfs == null) {
-                throw new Exception("Could not find Vnf to orchestrate VfModule");
+
+            String vfModulesName = vfModules.getInstanceName();
+            String vfModulesModelCustId = vfModules.getModelInfo().getModelCustomizationId();
+            // Get the Vnf associated with vfModule
+            Optional<org.onap.so.serviceinstancebeans.Vnfs> parentVnf = resources.getVnfs().stream()
+                    .filter(aVnf -> aVnf.getCloudConfiguration() != null)
+                    .filter(aVnf -> aVnf.getVfModules().stream()
+                            .anyMatch(aVfModules -> aVfModules.getInstanceName().equals(vfModulesName) && aVfModules
+                                    .getModelInfo().getModelCustomizationId().equals(vfModulesModelCustId)))
+                    .findAny();
+
+            // Get the cloud configuration from this Vnf
+            if (parentVnf.isPresent()) {
+                cloudRegion = setCloudConfiguration(gBB, parentVnf.get().getCloudConfiguration());
             }
+
+            lookupKeyMap.put(ResourceKey.GENERIC_VNF_ID, getVnfId(executeBB, lookupKeyMap));
+
             parameter.setModelInfo(vfModules.getModelInfo());
             if (bbName.contains(VOLUME_GROUP)) {
                 parameter.setResourceId(lookupKeyMap.get(ResourceKey.VOLUME_GROUP_ID));
                 parameter.setInstanceName(vfModules.getVolumeGroupInstanceName());
                 parameter.setVnfType(vnfType);
                 parameter.setInstanceParams(vfModules.getInstanceParams());
+                ServiceModel serviceModel = new ServiceModel();
+                serviceModel.setCurrentService(service);
+                parameter.setServiceModel(serviceModel);
                 this.populateVolumeGroup(parameter);
             } else {
                 parameter.setResourceId(lookupKeyMap.get(ResourceKey.VF_MODULE_ID));
@@ -1534,11 +1785,22 @@ public class BBInputSetup implements JavaDelegate {
                 parameter.setInstanceName(vfModules.getInstanceName());
                 parameter.setInstanceParams(vfModules.getInstanceParams());
                 this.populateVfModule(parameter);
+                gBB.getRequestContext().setIsHelm(parameter.getIsHelm());
             }
         } else if (bbName.contains(NETWORK)) {
             networks = findNetworksByKey(key, resources);
             String networkId = lookupKeyMap.get(ResourceKey.NETWORK_ID);
             if (networks != null) {
+                // If service level cloud configuration is not provided then get it from networks.
+                if (cloudConfiguration == null) {
+                    Optional<org.onap.so.serviceinstancebeans.Networks> netWithCloudConfig = resources.getNetworks()
+                            .stream().filter(aNetwork -> aNetwork.getCloudConfiguration() != null).findAny();
+                    if (netWithCloudConfig.isPresent()) {
+                        setCloudConfiguration(gBB, netWithCloudConfig.get().getCloudConfiguration());
+                    } else {
+                        logger.debug("Could not find any cloud configuration for this request.");
+                    }
+                }
                 parameter.setInstanceName(networks.getInstanceName());
                 parameter.setModelInfo(networks.getModelInfo());
                 parameter.setInstanceParams(networks.getInstanceParams());
@@ -1564,6 +1826,24 @@ public class BBInputSetup implements JavaDelegate {
         return gBB;
     }
 
+    /**
+     * setCloudConfiguration - set cloud info on a building block.
+     *
+     * @param gBB
+     * @param cloudConfiguration
+     * @return CloudRegion
+     * @throws Exception
+     */
+    private CloudRegion setCloudConfiguration(GeneralBuildingBlock gBB, CloudConfiguration cloudConfiguration)
+            throws Exception {
+        org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = bbInputSetupUtils.getCloudRegion(cloudConfiguration);
+        Tenant tenant = getTenant(cloudConfiguration, aaiCloudRegion);
+        gBB.setTenant(tenant);
+        CloudRegion cloudRegion = mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
+        gBB.setCloudRegion(cloudRegion);
+        return cloudRegion;
+    }
+
     protected Networks findNetworksByKey(String key, Resources resources) {
         for (Networks networks : resources.getNetworks()) {
             if (networks.getModelInfo().getModelCustomizationId().equalsIgnoreCase(key)) {
@@ -1573,58 +1853,45 @@ public class BBInputSetup implements JavaDelegate {
         return null;
     }
 
-    protected Pair<Vnfs, VfModules> getVfModulesAndItsVnfsByKey(String key, Resources resources) {
+    protected VfModules getVfModulesByInstanceName(String vfModuleInstanceName, Resources resources) {
+        for (Vnfs vnfs : resources.getVnfs()) {
+            for (VfModules vfModules : vnfs.getVfModules()) {
+                if (vfModules.getInstanceName().equals(vfModuleInstanceName)) {
+                    return vfModules;
+                }
+            }
+        }
+        throw new ResourceNotFoundException(
+                "Could not find vf-module with instanceName: " + vfModuleInstanceName + " in userparams");
+    }
+
+    protected VfModules getVfModulesByKey(String key, Resources resources) {
         for (Vnfs vnfs : resources.getVnfs()) {
             for (VfModules vfModules : vnfs.getVfModules()) {
                 if (vfModules.getModelInfo().getModelCustomizationId().equalsIgnoreCase(key)) {
-                    return new Pair<Vnfs, VfModules>(vnfs, vfModules);
+                    return vfModules;
                 }
             }
         }
-        return null;
+        throw new ResourceNotFoundException("Could not find vf-module with key: " + key + " in userparams");
     }
 
-    protected Vnfs findVnfsByKey(String key, Resources resources, Vnfs vnfs) {
+    protected Vnfs findVnfsByInstanceName(String instanceName, Resources resources) {
         for (Vnfs tempVnfs : resources.getVnfs()) {
-            if (tempVnfs.getModelInfo().getModelCustomizationId().equalsIgnoreCase(key)) {
-                vnfs = tempVnfs;
-                break;
+            if (tempVnfs.getInstanceName().equals(instanceName)) {
+                return tempVnfs;
             }
         }
-        return vnfs;
+        throw new ResourceNotFoundException("Could not find vnf with instanceName: " + instanceName + " in userparams");
     }
 
-    protected CloudRegion getCloudRegionFromMacroRequest(CloudConfiguration cloudConfiguration, Resources resources) {
-        if (cloudConfiguration == null) {
-            for (Vnfs vnfs : resources.getVnfs()) {
-                if (cloudConfiguration == null) {
-                    cloudConfiguration = vnfs.getCloudConfiguration();
-                } else {
-                    break;
-                }
-                for (VfModules vfModules : vnfs.getVfModules()) {
-                    if (cloudConfiguration == null) {
-                        cloudConfiguration = vfModules.getCloudConfiguration();
-                    } else {
-                        break;
-                    }
-                }
-            }
-            for (Networks networks : resources.getNetworks()) {
-                if (cloudConfiguration == null) {
-                    cloudConfiguration = networks.getCloudConfiguration();
-                } else {
-                    break;
-                }
+    protected Vnfs findVnfsByKey(String key, Resources resources) {
+        for (Vnfs tempVnfs : resources.getVnfs()) {
+            if (tempVnfs.getModelInfo().getModelCustomizationId().equalsIgnoreCase(key)) {
+                return tempVnfs;
             }
         }
-        if (cloudConfiguration != null) {
-            org.onap.aai.domain.yang.CloudRegion aaiCloudRegion = bbInputSetupUtils.getCloudRegion(cloudConfiguration);
-            return mapperLayer.mapCloudRegion(cloudConfiguration, aaiCloudRegion);
-        } else {
-            logger.debug("Could not find any cloud configuration for this request.");
-            return null;
-        }
+        throw new ResourceNotFoundException("Could not find vnf with key: " + key + " in userparams");
     }
 
     protected String getVnfId(ExecuteBuildingBlock executeBB, Map<ResourceKey, String> lookupKeyMap) {
@@ -1648,20 +1915,8 @@ public class BBInputSetup implements JavaDelegate {
                 && bbName.equalsIgnoreCase(AssignFlows.SERVICE_INSTANCE.toString())) {
             throw new Exception("Request invalid missing: RequestInfo:InstanceName");
         } else {
-            org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = null;
-            if (aLaCarte && bbName.equalsIgnoreCase(AssignFlows.SERVICE_INSTANCE.toString())) {
-                serviceInstanceAAI = bbInputSetupUtils
-                        .getAAIServiceInstanceByName(requestDetails.getRequestInfo().getInstanceName(), customer);
-            }
-            if (serviceInstanceId != null && serviceInstanceAAI == null) {
-                if (customer != null && customer.getServiceSubscription() != null) {
-                    serviceInstanceAAI =
-                            bbInputSetupUtils.getAAIServiceInstanceByIdAndCustomer(customer.getGlobalCustomerId(),
-                                    customer.getServiceSubscription().getServiceType(), serviceInstanceId);
-                } else {
-                    serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
-                }
-            }
+            org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI;
+            serviceInstanceAAI = getServiceInstanceAAI(requestDetails, customer, serviceInstanceId, aLaCarte, bbName);
             if (serviceInstanceAAI != null) {
                 lookupKeyMap.put(ResourceKey.SERVICE_INSTANCE_ID, serviceInstanceId);
                 return this.getExistingServiceInstance(serviceInstanceAAI);
@@ -1671,6 +1926,25 @@ public class BBInputSetup implements JavaDelegate {
         }
     }
 
+    private org.onap.aai.domain.yang.ServiceInstance getServiceInstanceAAI(RequestDetails requestDetails,
+            Customer customer, String serviceInstanceId, boolean aLaCarte, String bbName) throws Exception {
+        org.onap.aai.domain.yang.ServiceInstance serviceInstanceAAI = null;
+        if (aLaCarte && bbName.equalsIgnoreCase(AssignFlows.SERVICE_INSTANCE.toString())) {
+            serviceInstanceAAI = bbInputSetupUtils
+                    .getAAIServiceInstanceByName(requestDetails.getRequestInfo().getInstanceName(), customer);
+        }
+        if (serviceInstanceId != null && serviceInstanceAAI == null) {
+            if (customer != null && customer.getServiceSubscription() != null) {
+                serviceInstanceAAI =
+                        bbInputSetupUtils.getAAIServiceInstanceByIdAndCustomer(customer.getGlobalCustomerId(),
+                                customer.getServiceSubscription().getServiceType(), serviceInstanceId);
+            } else {
+                serviceInstanceAAI = bbInputSetupUtils.getAAIServiceInstanceById(serviceInstanceId);
+            }
+        }
+        return serviceInstanceAAI;
+    }
+
     protected ServiceInstance createServiceInstance(RequestDetails requestDetails, Project project,
             OwningEntity owningEntity, Map<ResourceKey, String> lookupKeyMap, String serviceInstanceId) {
         ServiceInstance serviceInstance = new ServiceInstance();
@@ -1782,20 +2056,19 @@ public class BBInputSetup implements JavaDelegate {
         AAIResultWrapper serviceInstanceWrapper = new AAIResultWrapper(
                 new AAICommonObjectMapperProvider().getMapper().writeValueAsString(serviceInstanceAAI));
         Optional<Relationships> relationshipsOp = serviceInstanceWrapper.getRelationships();
-        Relationships relationships = null;
         if (relationshipsOp.isPresent()) {
-            relationships = relationshipsOp.get();
-        } else {
-            return;
+            mapRelationship(serviceInstance, relationshipsOp.get());
         }
+    }
 
-        this.mapProject(relationships.getByType(AAIObjectType.PROJECT), serviceInstance);
-        this.mapOwningEntity(relationships.getByType(AAIObjectType.OWNING_ENTITY), serviceInstance);
-        this.mapL3Networks(relationships.getRelatedAAIUris(AAIObjectType.L3_NETWORK), serviceInstance.getNetworks());
-        this.mapGenericVnfs(relationships.getRelatedAAIUris(AAIObjectType.GENERIC_VNF), serviceInstance.getVnfs());
-        this.mapCollection(relationships.getByType(AAIObjectType.COLLECTION), serviceInstance);
-        this.mapConfigurations(relationships.getRelatedAAIUris(AAIObjectType.CONFIGURATION),
-                serviceInstance.getConfigurations());
+    private void mapRelationship(ServiceInstance serviceInstance, Relationships relationships) {
+        this.mapProject(relationships.getByType(Types.PROJECT, uri -> uri.nodesOnly(true)), serviceInstance);
+        this.mapOwningEntity(relationships.getByType(Types.OWNING_ENTITY, uri -> uri.nodesOnly(true)), serviceInstance);
+        this.mapL3Networks(relationships.getRelatedUris(Types.L3_NETWORK), serviceInstance.getNetworks());
+        this.mapGenericVnfs(relationships.getRelatedUris(Types.GENERIC_VNF), serviceInstance.getVnfs());
+        this.mapPnfs(relationships.getRelatedUris(Types.PNF), serviceInstance.getPnfs());
+        this.mapCollection(relationships.getByType(Types.COLLECTION), serviceInstance);
+        this.mapConfigurations(relationships.getRelatedUris(Types.CONFIGURATION), serviceInstance.getConfigurations());
     }
 
     protected void mapConfigurations(List<AAIResourceUri> relatedAAIUris, List<Configuration> configurations) {
@@ -1834,16 +2107,29 @@ public class BBInputSetup implements JavaDelegate {
         Optional<Relationships> relationshipsOp = aaiGenericVnfWrapper.getRelationships();
         if (relationshipsOp.isPresent()) {
             Relationships relationships = relationshipsOp.get();
-            this.mapPlatform(relationships.getByType(AAIObjectType.PLATFORM), genericVnf);
-            this.mapLineOfBusiness(relationships.getByType(AAIObjectType.LINE_OF_BUSINESS), genericVnf);
-            genericVnf.getVolumeGroups().addAll(mapVolumeGroups(relationships.getByType(AAIObjectType.VOLUME_GROUP)));
-            genericVnf.getInstanceGroups()
-                    .addAll(mapInstanceGroups(relationships.getByType(AAIObjectType.INSTANCE_GROUP)));
+            this.mapPlatform(relationships.getByType(Types.PLATFORM, uri -> uri.nodesOnly(true)), genericVnf);
+            this.mapLineOfBusiness(relationships.getByType(Types.LINE_OF_BUSINESS, uri -> uri.nodesOnly(true)),
+                    genericVnf);
+            genericVnf.getVolumeGroups().addAll(mapVolumeGroups(relationships.getByType(Types.VOLUME_GROUP)));
+            genericVnf.getInstanceGroups().addAll(mapInstanceGroups(relationships.getByType(Types.INSTANCE_GROUP)));
         }
 
         return genericVnf;
     }
 
+    protected void mapPnfs(List<AAIResourceUri> list, List<Pnf> pnfs) {
+        for (AAIResourceUri aaiResourceUri : list) {
+            pnfs.add(this.mapPnf(aaiResourceUri));
+        }
+    }
+
+    protected Pnf mapPnf(AAIResourceUri aaiResourceUri) {
+        AAIResultWrapper aaiPnfWrapper = this.bbInputSetupUtils.getAAIResourceDepthOne(aaiResourceUri);
+        Optional<org.onap.aai.domain.yang.Pnf> aaiPnfWrapperOp =
+                aaiPnfWrapper.asBean(org.onap.aai.domain.yang.Pnf.class);
+        return aaiPnfWrapperOp.map(pnf -> this.mapperLayer.mapAAIPnfIntoPnf(pnf)).orElse(null);
+    }
+
     protected List<InstanceGroup> mapInstanceGroups(List<AAIResultWrapper> instanceGroups) {
         List<InstanceGroup> instanceGroupsList = new ArrayList<>();
         for (AAIResultWrapper volumeGroupWrapper : instanceGroups) {
@@ -1894,14 +2180,10 @@ public class BBInputSetup implements JavaDelegate {
             AAIResultWrapper lineOfBusinessWrapper = lineOfBusinesses.get(0);
             Optional<org.onap.aai.domain.yang.LineOfBusiness> aaiLineOfBusinessOp =
                     lineOfBusinessWrapper.asBean(org.onap.aai.domain.yang.LineOfBusiness.class);
-            org.onap.aai.domain.yang.LineOfBusiness aaiLineOfBusiness = null;
-            if (!aaiLineOfBusinessOp.isPresent()) {
-                return;
+            if (aaiLineOfBusinessOp.isPresent()) {
+                LineOfBusiness lineOfBusiness = this.mapperLayer.mapAAILineOfBusiness(aaiLineOfBusinessOp.get());
+                genericVnf.setLineOfBusiness(lineOfBusiness);
             }
-            aaiLineOfBusiness = aaiLineOfBusinessOp.get();
-
-            LineOfBusiness lineOfBusiness = this.mapperLayer.mapAAILineOfBusiness(aaiLineOfBusiness);
-            genericVnf.setLineOfBusiness(lineOfBusiness);
         }
     }
 
@@ -1910,14 +2192,10 @@ public class BBInputSetup implements JavaDelegate {
             AAIResultWrapper platformWrapper = platforms.get(0);
             Optional<org.onap.aai.domain.yang.Platform> aaiPlatformOp =
                     platformWrapper.asBean(org.onap.aai.domain.yang.Platform.class);
-            org.onap.aai.domain.yang.Platform aaiPlatform = null;
-            if (!aaiPlatformOp.isPresent()) {
-                return;
+            if (aaiPlatformOp.isPresent()) {
+                Platform platform = this.mapperLayer.mapAAIPlatform(aaiPlatformOp.get());
+                genericVnf.setPlatform(platform);
             }
-            aaiPlatform = aaiPlatformOp.get();
-
-            Platform platform = this.mapperLayer.mapAAIPlatform(aaiPlatform);
-            genericVnf.setPlatform(platform);
         }
     }
 
@@ -1926,31 +2204,60 @@ public class BBInputSetup implements JavaDelegate {
             AAIResultWrapper collectionWrapper = collections.get(0);
             Optional<org.onap.aai.domain.yang.Collection> aaiCollectionOp =
                     collectionWrapper.asBean(org.onap.aai.domain.yang.Collection.class);
-            org.onap.aai.domain.yang.Collection aaiCollection = null;
-            if (!aaiCollectionOp.isPresent()) {
-                return;
-            }
-            aaiCollection = aaiCollectionOp.get();
-
-            Collection collection = this.mapperLayer.mapAAICollectionIntoCollection(aaiCollection);
-            NetworkCollectionResourceCustomization collectionResourceCust = bbInputSetupUtils
-                    .getCatalogNetworkCollectionResourceCustByID(aaiCollection.getCollectionCustomizationId());
-            collection.setModelInfoCollection(mapperLayer.mapCatalogCollectionToCollection(collectionResourceCust,
-                    collectionResourceCust.getCollectionResource()));
-            Optional<Relationships> relationshipsOp = collectionWrapper.getRelationships();
-            Relationships relationships = null;
-            if (relationshipsOp.isPresent()) {
-                relationships = relationshipsOp.get();
-            } else {
-                serviceInstance.setCollection(collection);
-                return;
-            }
-            List<InstanceGroup> instanceGroupsList =
-                    mapInstanceGroups(relationships.getByType(AAIObjectType.INSTANCE_GROUP));
-            if (!instanceGroupsList.isEmpty()) {
-                collection.setInstanceGroup(instanceGroupsList.get(0));
+            aaiCollectionOp.ifPresent(
+                    collection -> serviceInstanceSetCollection(serviceInstance, collectionWrapper, collection));
+        }
+    }
+
+    private void serviceInstanceSetCollection(ServiceInstance serviceInstance, AAIResultWrapper collectionWrapper,
+            org.onap.aai.domain.yang.Collection aaiCollection) {
+        Collection collection = getCollection(aaiCollection);
+        Optional<Relationships> relationshipsOp = collectionWrapper.getRelationships();
+        relationshipsOp.ifPresent(relationships -> setInstanceGroupForCollection(collection, relationships));
+        serviceInstance.setCollection(collection);
+    }
+
+    private void setInstanceGroupForCollection(Collection collection, Relationships relationships) {
+        List<InstanceGroup> instanceGroupsList = mapInstanceGroups(relationships.getByType(Types.INSTANCE_GROUP));
+        if (!instanceGroupsList.isEmpty()) {
+            collection.setInstanceGroup(instanceGroupsList.get(0));
+        }
+    }
+
+    private Collection getCollection(org.onap.aai.domain.yang.Collection aaiCollection) {
+        Collection collection = this.mapperLayer.mapAAICollectionIntoCollection(aaiCollection);
+        NetworkCollectionResourceCustomization collectionResourceCust = bbInputSetupUtils
+                .getCatalogNetworkCollectionResourceCustByID(aaiCollection.getCollectionCustomizationId());
+        collection.setModelInfoCollection(mapperLayer.mapCatalogCollectionToCollection(collectionResourceCust,
+                collectionResourceCust.getCollectionResource()));
+        return collection;
+    }
+
+    private org.onap.so.serviceinstancebeans.Service serviceMapper(Map<String, Object> params) throws IOException {
+        ObjectMapper obj = new ObjectMapper();
+        String input = obj.writeValueAsString(params.get("service"));
+        return obj.readValue(input, org.onap.so.serviceinstancebeans.Service.class);
+    }
+
+    private void setisHelmforHealthCheckBB(Service service, ServiceInstance serviceInstance, GeneralBuildingBlock gBB) {
+        for (GenericVnf vnf : serviceInstance.getVnfs()) {
+            for (VfModule vfModule : vnf.getVfModules()) {
+                String vnfModelCustomizationUUID =
+                        this.bbInputSetupUtils.getAAIGenericVnf(vnf.getVnfId()).getModelCustomizationId();
+                ModelInfo vnfModelInfo = new ModelInfo();
+                vnfModelInfo.setModelCustomizationUuid(vnfModelCustomizationUUID);
+                this.mapCatalogVnf(vnf, vnfModelInfo, service);
+                String vfModuleCustomizationUUID = this.bbInputSetupUtils
+                        .getAAIVfModule(vnf.getVnfId(), vfModule.getVfModuleId()).getModelCustomizationId();
+                ModelInfo vfModuleModelInfo = new ModelInfo();
+                vfModuleModelInfo.setModelCustomizationId(vfModuleCustomizationUUID);
+                this.mapCatalogVfModule(vfModule, vfModuleModelInfo, service, vnfModelCustomizationUUID);
+                if (vfModule.getModelInfoVfModule() != null && vfModule.getModelInfoVfModule().getModelName() != null
+                        && vfModule.getModelInfoVfModule().getModelName().contains("helm")) {
+                    gBB.getRequestContext().setIsHelm(true);
+                    break;
+                }
             }
-            serviceInstance.setCollection(collection);
         }
     }
 
@@ -1976,9 +2283,8 @@ public class BBInputSetup implements JavaDelegate {
         Optional<Relationships> relationshipsOp = aaiNetworkWrapper.getRelationships();
         if (relationshipsOp.isPresent()) {
             Relationships relationships = relationshipsOp.get();
-            this.mapNetworkPolicies(relationships.getByType(AAIObjectType.NETWORK_POLICY),
-                    network.getNetworkPolicies());
-            mapRouteTableReferences(relationships.getByType(AAIObjectType.ROUTE_TABLE_REFERENCE),
+            this.mapNetworkPolicies(relationships.getByType(Types.NETWORK_POLICY), network.getNetworkPolicies());
+            mapRouteTableReferences(relationships.getByType(Types.ROUTE_TABLE_REFERENCE),
                     network.getContrailNetworkRouteTableReferences());
         }
 
@@ -2029,14 +2335,10 @@ public class BBInputSetup implements JavaDelegate {
             AAIResultWrapper owningEntityWrapper = owningEntities.get(0);
             Optional<org.onap.aai.domain.yang.OwningEntity> aaiOwningEntityOp =
                     owningEntityWrapper.asBean(org.onap.aai.domain.yang.OwningEntity.class);
-            org.onap.aai.domain.yang.OwningEntity aaiOwningEntity = null;
-            if (!aaiOwningEntityOp.isPresent()) {
-                return;
+            if (aaiOwningEntityOp.isPresent()) {
+                OwningEntity owningEntity = this.mapperLayer.mapAAIOwningEntity(aaiOwningEntityOp.get());
+                serviceInstance.setOwningEntity(owningEntity);
             }
-            aaiOwningEntity = aaiOwningEntityOp.get();
-
-            OwningEntity owningEntity = this.mapperLayer.mapAAIOwningEntity(aaiOwningEntity);
-            serviceInstance.setOwningEntity(owningEntity);
         }
     }
 
@@ -2045,14 +2347,10 @@ public class BBInputSetup implements JavaDelegate {
             AAIResultWrapper projectWrapper = projects.get(0);
             Optional<org.onap.aai.domain.yang.Project> aaiProjectOp =
                     projectWrapper.asBean(org.onap.aai.domain.yang.Project.class);
-            org.onap.aai.domain.yang.Project aaiProject = null;
-            if (!aaiProjectOp.isPresent()) {
-                return;
+            if (aaiProjectOp.isPresent()) {
+                Project project = this.mapperLayer.mapAAIProject(aaiProjectOp.get());
+                serviceInstance.setProject(project);
             }
-            aaiProject = aaiProjectOp.get();
-
-            Project project = this.mapperLayer.mapAAIProject(aaiProject);
-            serviceInstance.setProject(project);
         }
     }