Merge "Fixing missing type info in"
authorByung-Woo Jun <byung-woo.jun@est.tech>
Wed, 26 Aug 2020 11:25:44 +0000 (11:25 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 26 Aug 2020 11:25:44 +0000 (11:25 +0000)
adapters/mso-adapter-utils/src/main/java/org/onap/so/cloud/authentication/AuthenticationMethodFactory.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/cloud/authentication/KeystoneV3Authentication.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/MsoKeystoneV3Utils.java
adapters/mso-adapter-utils/src/main/java/org/onap/so/openstack/utils/NovaClient.java
adapters/mso-openstack-adapters/pom.xml
adapters/mso-openstack-adapters/src/main/java/org/onap/so/heatbridge/HeatBridgeImpl.java
adapters/mso-openstack-adapters/src/test/java/org/onap/so/heatbridge/HeatBridgeImplTest.java
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/SniroHomingV1.groovy
bpmn/MSOCoreBPMN/src/main/java/org/onap/so/bpmn/core/domain/HomingSolution.java

index 59c6bec..fa5c57f 100644 (file)
@@ -89,4 +89,23 @@ public final class AuthenticationMethodFactory {
         v3Auth.setScope(scope);
         return v3Auth;
     }
+
+    public final com.woorea.openstack.keystone.v3.model.Authentication getAuthenticationForV3(
+            CloudIdentity cloudIdentity) {
+        Identity identity = new Identity();
+        Password password = new Password();
+        User user = new User();
+        Domain userDomain = new Domain();
+        userDomain.setName(cloudIdentity.getUserDomainName());
+        user.setName(cloudIdentity.getMsoId());
+        user.setPassword(CryptoUtils.decryptCloudConfigPassword(cloudIdentity.getMsoPass()));
+        user.setDomain(userDomain);
+        password.setUser(user);
+        identity.setPassword(password);
+        identity.setMethods(Collections.singletonList("password"));
+        com.woorea.openstack.keystone.v3.model.Authentication v3Auth =
+                new com.woorea.openstack.keystone.v3.model.Authentication();
+        v3Auth.setIdentity(identity);
+        return v3Auth;
+    }
 }
index 1690695..3564b8f 100644 (file)
@@ -107,7 +107,7 @@ public class KeystoneV3Authentication {
         return policy;
     }
 
-    protected String findEndpointURL(List<Service> serviceCatalog, String type, String region, String facing) {
+    public String findEndpointURL(List<Service> serviceCatalog, String type, String region, String facing) {
         for (Service service : serviceCatalog) {
             if (type.equals(service.getType())) {
                 for (Service.Endpoint endpoint : service.getEndpoints()) {
index 63bc235..072ab5a 100644 (file)
 package org.onap.so.openstack.utils;
 
 import java.util.Map;
+import org.onap.so.cloud.authentication.AuthenticationMethodFactory;
 import org.onap.so.db.catalog.beans.CloudIdentity;
+import org.onap.so.db.catalog.beans.CloudSite;
 import org.onap.so.openstack.beans.MsoTenant;
 import org.onap.so.openstack.exceptions.MsoCloudSiteNotFound;
 import org.onap.so.openstack.exceptions.MsoException;
+import org.onap.so.utils.CryptoUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import com.woorea.openstack.keystone.v3.model.Token;
+import com.woorea.openstack.base.client.OpenStackConnectException;
+import com.woorea.openstack.base.client.OpenStackResponseException;
+import com.woorea.openstack.keystone.v3.Keystone;
+import com.woorea.openstack.keystone.v3.api.TokensResource.Authenticate;
+import com.woorea.openstack.keystone.v3.model.Authentication;
+import com.woorea.openstack.keystone.v3.model.Authentication.Identity;
 
 @Component
 public class MsoKeystoneV3Utils extends MsoTenantUtils {
 
+    @Autowired
+    private AuthenticationMethodFactory authenticationMethodFactory;
+
     @Override
     public String createTenant(String tenantName, String cloudSiteId, Map<String, String> metadata, boolean backout)
             throws MsoException {
@@ -57,4 +71,22 @@ public class MsoKeystoneV3Utils extends MsoTenantUtils {
         return cloudIdentity.getIdentityUrl();
     }
 
+    public Token getKeystoneToken(CloudSite cloudSite) throws MsoException {
+        try {
+            CloudIdentity cloudIdentity = cloudSite.getIdentityService();
+
+            Keystone keystone = new Keystone(cloudIdentity.getIdentityUrl());
+
+            Authentication auth = authenticationMethodFactory.getAuthenticationForV3(cloudIdentity);
+
+            Authenticate authenticate = keystone.tokens().authenticate(auth);
+            return executeAndRecordOpenstackRequest(authenticate);
+
+        } catch (OpenStackResponseException e) {
+            throw keystoneErrorToMsoException(e, "TokenAuth");
+        } catch (OpenStackConnectException e) {
+            throw keystoneErrorToMsoException(e, "TokenAuth");
+        }
+    }
+
 }
index ad41b0f..eb6cba5 100644 (file)
     <dependency>
       <groupId>commons-validator</groupId>
       <artifactId>commons-validator</artifactId>
-      <version>1.4.0</version>
+      <version>1.4.1</version>
     </dependency>
 
     <!-- added for unit testing -->
index 45d91c2..10f39f7 100644 (file)
@@ -49,6 +49,7 @@ import org.apache.commons.validator.routines.InetAddressValidator;
 import org.onap.aai.domain.yang.Flavor;
 import org.onap.aai.domain.yang.Image;
 import org.onap.aai.domain.yang.L3InterfaceIpv4AddressList;
+import org.onap.aai.domain.yang.L3InterfaceIpv6AddressList;
 import org.onap.aai.domain.yang.L3Network;
 import org.onap.aai.domain.yang.LInterface;
 import org.onap.aai.domain.yang.PInterface;
@@ -524,6 +525,20 @@ public class HeatBridgeImpl implements HeatBridgeApi {
                                 .cloudRegion(cloudOwner, cloudRegionId).tenant(tenantId).vserver(port.getDeviceId())
                                 .lInterface(lIf.getInterfaceName()).l3InterfaceIpv4AddressList(ipAddress)),
                         Optional.of(lInterfaceIp));
+            } else if (InetAddressValidator.getInstance().isValidInet6Address(ipAddress)) {
+                Subnet subnet = osClient.getSubnetById(ip.getSubnetId());
+                IPAddressString cidr = new IPAddressString(subnet.getCidr());
+                L3InterfaceIpv6AddressList ipv6 = new L3InterfaceIpv6AddressList();
+                ipv6.setL3InterfaceIpv6Address(ipAddress);
+                ipv6.setNeutronNetworkId(port.getNetworkId());
+                ipv6.setNeutronSubnetId(ip.getSubnetId());
+                ipv6.setL3InterfaceIpv6PrefixLength(Long.parseLong(cidr.getNetworkPrefixLength().toString()));
+
+                transaction.createIfNotExists(
+                        AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.cloudInfrastructure()
+                                .cloudRegion(cloudOwner, cloudRegionId).tenant(tenantId).vserver(port.getDeviceId())
+                                .lInterface(lIf.getInterfaceName()).l3InterfaceIpv6AddressList(ipAddress)),
+                        Optional.of(ipv6));
             }
         }
     }
index 8c21e3f..03f6c73 100644 (file)
@@ -423,6 +423,18 @@ public class HeatBridgeImplTest {
         when(port.getProfile()).thenReturn(ImmutableMap.of(HeatBridgeConstants.OS_PCI_SLOT_KEY, pfPciId,
                 HeatBridgeConstants.OS_PHYSICAL_NETWORK_KEY, "physical_network_id"));
 
+        IP ip = mock(IP.class);
+
+        Set<IP> ipSet = new HashSet<>();
+        ipSet.add(ip);
+        when(ip.getIpAddress()).thenReturn("2606:ae00:2e60:100::226");
+        when(ip.getSubnetId()).thenReturn("testSubnetId");
+        when(port.getFixedIps()).thenAnswer(x -> ipSet);
+
+        Subnet subnet = mock(Subnet.class);
+        when(subnet.getCidr()).thenReturn("169.254.100.0/24");
+        when(osClient.getSubnetById("testSubnetId")).thenReturn(subnet);
+
         Network network = mock(Network.class);
         when(network.getId()).thenReturn("test-network-id");
         when(network.getNetworkType()).thenReturn(NetworkType.VLAN);
@@ -446,8 +458,9 @@ public class HeatBridgeImplTest {
         heatbridge.buildAddVserverLInterfacesToAaiAction(stackResources, Arrays.asList("1", "2"), "CloudOwner");
 
         // Assert
-        verify(transaction, times(15)).createIfNotExists(any(AAIResourceUri.class), any(Optional.class));
+        verify(transaction, times(20)).createIfNotExists(any(AAIResourceUri.class), any(Optional.class));
         verify(osClient, times(5)).getPortById(anyString());
+        verify(osClient, times(5)).getSubnetById("testSubnetId");
         verify(osClient, times(10)).getNetworkById(anyString());
     }
 
index 08c032f..1468893 100644 (file)
@@ -64,208 +64,211 @@ import org.slf4j.LoggerFactory
 class SniroHomingV1 extends AbstractServiceTaskProcessor{
 
     private static final Logger logger = LoggerFactory.getLogger( SniroHomingV1.class);
-       ExceptionUtil exceptionUtil = new ExceptionUtil()
-       JsonUtils jsonUtil = new JsonUtils()
-       SniroUtils sniroUtils = new SniroUtils(this)
-
-       /**
-        * This method validates the incoming variables.
-        * The method then prepares the sniro request
-        * and posts it to sniro's rest api.
-        *
-        * @param execution
-        *
-        * @author cb645j
-        */
-       public void callSniro(DelegateExecution execution){
-               execution.setVariable("prefix","HOME_")
-               logger.trace("Started Sniro Homing Call Sniro ")
-               try{
-                       execution.setVariable("rollbackData", null)
-                       execution.setVariable("rolledBack", false)
-
-                       String requestId = execution.getVariable("msoRequestId")
-                       logger.debug("Incoming Request Id is: "  + requestId)
-                       String serviceInstanceId = execution.getVariable("serviceInstanceId")
-                       logger.debug("Incoming Service Instance Id is: "  + serviceInstanceId)
-                       ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
-                       logger.debug("Incoming Service Decomposition is: "  + serviceDecomposition)
-                       String subscriberInfo = execution.getVariable("subscriberInfo")
-                       logger.debug("Incoming Subscriber Information is: "  + subscriberInfo)
-
-                       if(isBlank(requestId) || isBlank(serviceInstanceId) || isBlank(serviceDecomposition.toString()) || isBlank(subscriberInfo)){
-                               exceptionUtil.buildAndThrowWorkflowException(execution, 4000, "A required input variable is missing or null")
-                       }else{
-                               String subId = jsonUtil.getJsonValue(subscriberInfo, "globalSubscriberId")
-                               String subName = jsonUtil.getJsonValue(subscriberInfo, "subscriberName")
-                               String subCommonSiteId = ""
-                               if(jsonUtil.jsonElementExist(subscriberInfo, "subscriberCommonSiteId")){
-                                       subCommonSiteId = jsonUtil.getJsonValue(subscriberInfo, "subscriberCommonSiteId")
-                               }
-                               Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)
-
-                               String cloudConfiguration = execution.getVariable("cloudConfiguration") // TODO Currently not being used
-                               String homingParameters = execution.getVariable("homingParameters") // (aka. request parameters) Should be json format. TODO confirm its json format
-
-                               //Authentication
-                               String authHeader = UrnPropertiesReader.getVariable("sniro.manager.headers.auth", execution)
-                               execution.setVariable("BasicAuthHeaderValue", authHeader)
-
-                               //Prepare Callback
-                               String timeout = execution.getVariable("timeout")
-                               if(isBlank(timeout)){
-                                       timeout = UrnPropertiesReader.getVariable("sniro.manager.timeout", execution)
-                                       if(isBlank(timeout)) {
-                                               timeout = "PT30M";
-                                       }
-                               }
-                               logger.debug("Async Callback Timeout will be: " + timeout)
-
-                               execution.setVariable("timeout", timeout);
-                               execution.setVariable("correlator", requestId);
-                               execution.setVariable("messageType", "SNIROResponse");
-
-                               //Build Request & Call Sniro
-                               String sniroRequest = sniroUtils.buildRequest(execution, requestId, serviceDecomposition, subscriber, homingParameters)
-                               execution.setVariable("sniroRequest", sniroRequest)
-                               logger.debug("SNIRO Request is: " + sniroRequest)
-
-                               String endpoint = UrnPropertiesReader.getVariable("sniro.manager.uri.v1", execution)
-                               String host = UrnPropertiesReader.getVariable("sniro.manager.host", execution)
-                               String urlString = host + endpoint
-                               logger.debug("Sniro Url is: " + urlString)
-
-                               URL url = new URL(urlString);
-                               HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.SNIRO)
-                               httpClient.addAdditionalHeader("Authorization", authHeader)
-                               Response httpResponse = httpClient.post(sniroRequest)
-
-                               int responseCode = httpResponse.getStatus()
-
-                               logger.debug("Sniro sync response code is: " + responseCode)
-                               if(httpResponse.hasEntity()){
-                                       logger.debug("Sniro sync response is: " + httpResponse.readEntity(String.class))
-                               }
-
-                               if(responseCode != 202){
-                                       exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from Sniro.")
-                               }
-
-                               logger.trace("Completed Sniro Homing Call Sniro")
-                       }
-               }catch(BpmnError b){
-                       throw b
-               }catch(Exception e){
-                       logger.debug("Error encountered within Homing CallSniro method: " + e)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing CallSniro: " + e.getMessage())
-               }
-       }
-
-       /**
-        * This method processes the callback response
-        * and the contained homing solution. It sets
-        * homing solution assignment and license
-        * information to the corresponding resources
-        *
-        * @param execution
-        *
-        * @author cb645j
-        */
-       public void processHomingSolution(DelegateExecution execution){
-               logger.trace("Started Sniro Homing Process Homing Solution")
-               try{
-                       String response = execution.getVariable("asyncCallbackResponse")
-                       logger.debug("Sniro Async Callback Response is: " + response)
-
-                       sniroUtils.validateCallbackResponse(execution, response)
-
-                       ServiceDecomposition decomposition = execution.getVariable("serviceDecomposition")
-                       List<Resource> resourceList = decomposition.getServiceResources()
-
-                       if(JsonUtils.jsonElementExist(response, "solutionInfo.placementInfo")){
-                               String placements = jsonUtil.getJsonValue(response, "solutionInfo.placementInfo")
-                               JSONArray arr = new JSONArray(placements)
-                               for(int i = 0; i < arr.length(); i++){
-                                       JSONObject placement = arr.getJSONObject(i)
-                                       String jsonServiceResourceId = placement.getString("serviceResourceId")
-                                       for(Resource resource:resourceList){
-                                               String serviceResourceId = resource.getResourceId()
-                                               if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){
-                                                       //match
-                                                       String inventoryType = placement.getString("inventoryType")
-                                                       resource.getHomingSolution().setInventoryType(InventoryType.valueOf(inventoryType))
-                                                       resource.getHomingSolution().setCloudRegionId(placement.getString("cloudRegionId"))
-                                                       resource.getHomingSolution().setRehome(placement.getBoolean("isRehome"))
-                                                       JSONArray assignmentArr = placement.getJSONArray("assignmentInfo")
-                                                       Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "variableName", "variableValue")
-                                                       resource.getHomingSolution().setCloudOwner(assignmentMap.get("cloudOwner"))
-                                                       resource.getHomingSolution().setAicClli(assignmentMap.get("aicClli"))
-                                                       resource.getHomingSolution().setAicVersion(assignmentMap.get("aicVersion"))
-                                                       if(inventoryType.equalsIgnoreCase("service")){
-                                                               VnfResource vnf = new VnfResource()
-                                                               vnf.setVnfHostname(assignmentMap.get("vnfHostName"))
-                                                               resource.getHomingSolution().setVnf(vnf)
-                                                               resource.getHomingSolution().setServiceInstanceId(placement.getString("serviceInstanceId"))
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-
-                       if(JsonUtils.jsonElementExist(response, "solutionInfo.licenseInfo")){
-                               String licenseInfo = jsonUtil.getJsonValue(response, "solutionInfo.licenseInfo")
-                               JSONArray licenseArr = new JSONArray(licenseInfo)
-                               for(int l = 0; l < licenseArr.length(); l++){
-                                       JSONObject license = licenseArr.getJSONObject(l)
-                                       String jsonServiceResourceId = license.getString("serviceResourceId")
-                                       for(Resource resource:resourceList){
-                                               String serviceResourceId = resource.getResourceId()
-                                               if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){
-                                                       //match
-                                                       String jsonEntitlementPoolList = jsonUtil.getJsonValue(license.toString(), "entitlementPoolList")
-                                                       List<String> entitlementPoolList = jsonUtil.StringArrayToList(execution, jsonEntitlementPoolList)
-                                                       resource.getHomingSolution().getLicense().setEntitlementPoolList(entitlementPoolList)
-
-                                                       String jsonLicenseKeyGroupList = jsonUtil.getJsonValue(license.toString(), "licenseKeyGroupList")
-                                                       List<String> licenseKeyGroupList = jsonUtil.StringArrayToList(execution, jsonLicenseKeyGroupList)
-                                                       resource.getHomingSolution().getLicense().setLicenseKeyGroupList(licenseKeyGroupList)
-                                               }
-                                       }
-                               }
-                       }
-                       execution.setVariable("serviceDecomposition", decomposition)
-
-                       logger.trace("Completed Sniro Homing Process Homing Solution")
-               }catch(BpmnError b){
-                       throw b
-               }catch(Exception e){
-                       logger.debug("Error encountered within Homing ProcessHomingSolution method: " + e)
-                       exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Sniro Homing Process Solution")
-               }
-       }
-
-       /**
-        * This method logs the start of DHVCreateService
-        * to make debugging easier.
-        *
-        * @param - execution
-        * @author cb645j
-        */
-       public String logStart(DelegateExecution execution){
-               String requestId = execution.getVariable("testReqId")
-               if(isBlank(requestId)){
-                       requestId = execution.getVariable("msoRequestId")
-               }
-               execution.setVariable("DHVCS_requestId", requestId)
-               logger.trace("STARTED Homing Subflow for request: "  + requestId + " ")
-               logger.debug("****** Homing Subflow Global Debug Enabled: " + execution.getVariable("isDebugLogEnabled")  + " *****")
-               logger.trace("STARTED Homing Subflow for request: "  + requestId + " ")
-       }
-
-
-       /**
-        * Auto-generated method stub
-        */
-       public void preProcessRequest(DelegateExecution execution){}
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    JsonUtils jsonUtil = new JsonUtils()
+    SniroUtils sniroUtils = new SniroUtils(this)
+
+    /**
+     * This method validates the incoming variables.
+     * The method then prepares the sniro request
+     * and posts it to sniro's rest api.
+     *
+     * @param execution
+     *
+     * @author cb645j
+     */
+    public void callSniro(DelegateExecution execution){
+        execution.setVariable("prefix","HOME_")
+        logger.trace("Started Sniro Homing Call Sniro ")
+        try{
+            execution.setVariable("rollbackData", null)
+            execution.setVariable("rolledBack", false)
+
+            String requestId = execution.getVariable("msoRequestId")
+            logger.debug("Incoming Request Id is: "  + requestId)
+            String serviceInstanceId = execution.getVariable("serviceInstanceId")
+            logger.debug("Incoming Service Instance Id is: "  + serviceInstanceId)
+            ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
+            logger.debug("Incoming Service Decomposition is: "  + serviceDecomposition)
+            String subscriberInfo = execution.getVariable("subscriberInfo")
+            logger.debug("Incoming Subscriber Information is: "  + subscriberInfo)
+
+            if(isBlank(requestId) || isBlank(serviceInstanceId) || isBlank(serviceDecomposition.toString()) || isBlank(subscriberInfo)){
+                exceptionUtil.buildAndThrowWorkflowException(execution, 4000, "A required input variable is missing or null")
+            }else{
+                String subId = jsonUtil.getJsonValue(subscriberInfo, "globalSubscriberId")
+                String subName = jsonUtil.getJsonValue(subscriberInfo, "subscriberName")
+                String subCommonSiteId = ""
+                if(jsonUtil.jsonElementExist(subscriberInfo, "subscriberCommonSiteId")){
+                    subCommonSiteId = jsonUtil.getJsonValue(subscriberInfo, "subscriberCommonSiteId")
+                }
+                Subscriber subscriber = new Subscriber(subId, subName, subCommonSiteId)
+
+                String cloudConfiguration = execution.getVariable("cloudConfiguration") // TODO Currently not being used
+                String homingParameters = execution.getVariable("homingParameters") // (aka. request parameters) Should be json format. TODO confirm its json format
+
+                //Authentication
+                String authHeader = UrnPropertiesReader.getVariable("sniro.manager.headers.auth", execution)
+                execution.setVariable("BasicAuthHeaderValue", authHeader)
+
+                //Prepare Callback
+                String timeout = execution.getVariable("timeout")
+                if(isBlank(timeout)){
+                    timeout = UrnPropertiesReader.getVariable("sniro.manager.timeout", execution)
+                    if(isBlank(timeout)) {
+                        timeout = "PT30M";
+                    }
+                }
+                logger.debug("Async Callback Timeout will be: " + timeout)
+
+                execution.setVariable("timeout", timeout);
+                execution.setVariable("correlator", requestId);
+                execution.setVariable("messageType", "SNIROResponse");
+
+                //Build Request & Call Sniro
+                String sniroRequest = sniroUtils.buildRequest(execution, requestId, serviceDecomposition, subscriber, homingParameters)
+                execution.setVariable("sniroRequest", sniroRequest)
+                logger.debug("SNIRO Request is: " + sniroRequest)
+
+                String endpoint = UrnPropertiesReader.getVariable("sniro.manager.uri.v1", execution)
+                String host = UrnPropertiesReader.getVariable("sniro.manager.host", execution)
+                String urlString = host + endpoint
+                logger.debug("Sniro Url is: " + urlString)
+
+                URL url = new URL(urlString);
+                HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.SNIRO)
+                httpClient.addAdditionalHeader("Authorization", authHeader)
+                Response httpResponse = httpClient.post(sniroRequest)
+
+                int responseCode = httpResponse.getStatus()
+
+                logger.debug("Sniro sync response code is: " + responseCode)
+                if(httpResponse.hasEntity()){
+                    logger.debug("Sniro sync response is: " + httpResponse.readEntity(String.class))
+                }
+
+                if(responseCode != 202){
+                    exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from Sniro.")
+                }
+
+                logger.trace("Completed Sniro Homing Call Sniro")
+            }
+        }catch(BpmnError b){
+            throw b
+        }catch(Exception e){
+            logger.debug("Error encountered within Homing CallSniro method: " + e)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Homing CallSniro: " + e.getMessage())
+        }
+    }
+
+    /**
+     * This method processes the callback response
+     * and the contained homing solution. It sets
+     * homing solution assignment and license
+     * information to the corresponding resources
+     *
+     * @param execution
+     *
+     * @author cb645j 
+     */
+    public void processHomingSolution(DelegateExecution execution){
+        logger.trace("Started Sniro Homing Process Homing Solution")
+        try{
+            String response = execution.getVariable("asyncCallbackResponse")
+            logger.debug("Sniro Async Callback Response is: " + response)
+
+            sniroUtils.validateCallbackResponse(execution, response)
+
+            ServiceDecomposition decomposition = execution.getVariable("serviceDecomposition")
+            List<Resource> resourceList = decomposition.getServiceResources()
+
+            if(JsonUtils.jsonElementExist(response, "solutionInfo.placementInfo")){
+                String placements = jsonUtil.getJsonValue(response, "solutionInfo.placementInfo")
+                JSONArray arr = new JSONArray(placements)
+                for(int i = 0; i < arr.length(); i++){
+                    JSONObject placement = arr.getJSONObject(i)
+                    String jsonServiceResourceId = placement.getString("serviceResourceId")
+                    for(Resource resource:resourceList){
+                        String serviceResourceId = resource.getResourceId()
+                        if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){
+                            //match
+                            String inventoryType = placement.getString("inventoryType")
+                            resource.getHomingSolution().setInventoryType(InventoryType.valueOf(inventoryType))
+                            resource.getHomingSolution().setCloudRegionId(placement.getString("cloudRegionId"))
+                            resource.getHomingSolution().setRehome(placement.getBoolean("isRehome"))
+                            JSONArray assignmentArr = placement.getJSONArray("assignmentInfo")
+                            Map<String, String> assignmentMap = jsonUtil.entryArrayToMap(execution, assignmentArr.toString(), "variableName", "variableValue")
+                            resource.getHomingSolution().setCloudOwner(assignmentMap.get("cloudOwner"))
+                            resource.getHomingSolution().setAicClli(assignmentMap.get("aicClli"))
+                            resource.getHomingSolution().setAicVersion(assignmentMap.get("aicVersion"))
+                            if(inventoryType.equalsIgnoreCase("service")){
+                                VnfResource vnf = new VnfResource()
+                                vnf.setVnfHostname(assignmentMap.get("vnfHostName"))
+                                resource.getHomingSolution().setVnf(vnf)
+                                resource.getHomingSolution().setServiceInstanceId(placement.getString("serviceInstanceId"))
+                            }
+                            if(placement.getBoolean("isRehome")) {
+                                resource.getHomingSolution().setAllottedResourceId(assignmentMap.get("serviceResourceId"))
+                            }
+                        }
+                    }
+                }
+            }
+
+            if(JsonUtils.jsonElementExist(response, "solutionInfo.licenseInfo")){
+                String licenseInfo = jsonUtil.getJsonValue(response, "solutionInfo.licenseInfo")
+                JSONArray licenseArr = new JSONArray(licenseInfo)
+                for(int l = 0; l < licenseArr.length(); l++){
+                    JSONObject license = licenseArr.getJSONObject(l)
+                    String jsonServiceResourceId = license.getString("serviceResourceId")
+                    for(Resource resource:resourceList){
+                        String serviceResourceId = resource.getResourceId()
+                        if(serviceResourceId.equalsIgnoreCase(jsonServiceResourceId)){
+                            //match
+                            String jsonEntitlementPoolList = jsonUtil.getJsonValue(license.toString(), "entitlementPoolList")
+                            List<String> entitlementPoolList = jsonUtil.StringArrayToList(execution, jsonEntitlementPoolList)
+                            resource.getHomingSolution().getLicense().setEntitlementPoolList(entitlementPoolList)
+
+                            String jsonLicenseKeyGroupList = jsonUtil.getJsonValue(license.toString(), "licenseKeyGroupList")
+                            List<String> licenseKeyGroupList = jsonUtil.StringArrayToList(execution, jsonLicenseKeyGroupList)
+                            resource.getHomingSolution().getLicense().setLicenseKeyGroupList(licenseKeyGroupList)
+                        }
+                    }
+                }
+            }
+            execution.setVariable("serviceDecomposition", decomposition)
+
+            logger.trace("Completed Sniro Homing Process Homing Solution")
+        }catch(BpmnError b){
+            throw b
+        }catch(Exception e){
+            logger.debug("Error encountered within Homing ProcessHomingSolution method: " + e)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured in Sniro Homing Process Solution")
+        }
+    }
+
+    /**
+     * This method logs the start of DHVCreateService
+     * to make debugging easier.
+     *
+     * @param - execution
+     * @author cb645j
+     */
+    public String logStart(DelegateExecution execution){
+        String requestId = execution.getVariable("testReqId")
+        if(isBlank(requestId)){
+            requestId = execution.getVariable("msoRequestId")
+        }
+        execution.setVariable("DHVCS_requestId", requestId)
+        logger.trace("STARTED Homing Subflow for request: "  + requestId + " ")
+        logger.debug("****** Homing Subflow Global Debug Enabled: " + execution.getVariable("isDebugLogEnabled")  + " *****")
+        logger.trace("STARTED Homing Subflow for request: "  + requestId + " ")
+    }
+
+
+    /**
+     * Auto-generated method stub
+     */
+    public void preProcessRequest(DelegateExecution execution){}
 
 }
index 309b053..ddfb29e 100644 (file)
@@ -37,6 +37,7 @@ public class HomingSolution extends JsonWrapper implements Serializable {
     private InventoryType inventoryType;
     private boolean isRehome;
     private String serviceInstanceId; // TODO should start using si object instead
+    private String allottedResourceId;
     private String cloudOwner;
     private String cloudRegionId;
     private String aicClli;
@@ -74,6 +75,14 @@ public class HomingSolution extends JsonWrapper implements Serializable {
         this.serviceInstanceId = serviceInstanceId;
     }
 
+    public String getAllottedResourceId() {
+        return allottedResourceId;
+    }
+
+    public void setAllottedResourceId(String allottedResourceId) {
+        this.allottedResourceId = allottedResourceId;
+    }
+
     public String getCloudOwner() {
         return cloudOwner;
     }