Disable homing_solution

Send Homing_solution=none during macro instantiation
Add flag 'FLAG_DISABLE_HOMING' (by default set to true) which defines
whether homing_solution should be in request to so or not

Issue-ID: VID-576
Signed-off-by: wsliwka <wojciech.sliwka@nokia.com>
Change-Id: I6151151a0256a5bb4e637acf08ae511f4b265dc2
Signed-off-by: wsliwka <wojciech.sliwka@nokia.com>
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/MsoRequestBuilder.kt b/vid-app-common/src/main/java/org/onap/vid/job/command/MsoRequestBuilder.kt
index c8502b1..b35deb8 100644
--- a/vid-app-common/src/main/java/org/onap/vid/job/command/MsoRequestBuilder.kt
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/MsoRequestBuilder.kt
@@ -13,6 +13,7 @@
 import org.onap.vid.mso.model.BaseResourceInstantiationRequestDetails.*
 import org.onap.vid.mso.model.VfModuleInstantiationRequestDetails.UserParamMap
 import org.onap.vid.mso.rest.SubscriberInfo
+import org.onap.vid.properties.Features
 import org.onap.vid.services.AsyncInstantiationBusinessLogic
 import org.onap.vid.services.CloudOwnerService
 import org.onap.vid.utils.JACKSON_OBJECT_MAPPER
@@ -33,6 +34,7 @@
     companion object {
         private val LOGGER = EELFLoggerDelegate.getLogger(MsoRequestBuilder::class.java)
         private const val VID_SOURCE = "VID"
+        private const val DISABLED_HOMING_VALUE = "none"
     }
 
     fun generateALaCarteServiceInstantiationRequest(payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String, userId: String): RequestDetailsWrapper<ServiceInstantiationRequestDetails> {
@@ -61,7 +63,8 @@
     fun generateMacroServiceInstantiationRequest(jobId: UUID?, payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String, userId: String): RequestDetailsWrapper<ServiceInstantiationRequestDetails> {
         val serviceInstanceName = generateServiceName(jobId, payload, optimisticUniqueServiceInstanceName)
 
-        val serviceInstantiationServiceList = generateServiceInstantiationServicesList(payload, serviceInstanceName, createServiceInstantiationVnfList(jobId, payload))
+        val serviceInstantiationServiceList = generateMacroServiceInstantiationRequestParams(payload, serviceInstanceName, jobId)
+
 
         val requestParameters = ServiceInstantiationRequestDetails.RequestParameters(payload.subscriptionServiceType, false, serviceInstantiationServiceList)
 
@@ -213,9 +216,9 @@
                 }
         }
 
-        val result : MutableMap<String, String> = instanceParams[0].entries.stream()
+        val result: MutableMap<String, String> = instanceParams[0].entries.stream()
                 .filter { entry -> !keysToRemove.contains(entry.key) }
-                .collect(Collectors.toMap({it.key}, {it.value}))
+                .collect(Collectors.toMap({ it.key }, { it.value }))
 
         return if (result.isEmpty()) emptyList() else listOf(result)
     }
@@ -330,7 +333,7 @@
 
     private fun generateCloudConfiguration(lcpCloudRegionId: String?, tenantId: String?): CloudConfiguration {
         val cloudConfiguration = CloudConfiguration(lcpCloudRegionId, tenantId)
-        if(lcpCloudRegionId != null){
+        if (lcpCloudRegionId != null) {
             cloudOwnerService.enrichCloudConfigurationWithCloudOwner(cloudConfiguration, lcpCloudRegionId)
         }
         return cloudConfiguration
@@ -342,7 +345,7 @@
                 .collect(Collectors.toList())
     }
 
-    private fun generateRequestInfo(instanceName: String?, resourceType: ResourceType?, rollbackOnFailure: Boolean?, productFamilyId: String?, userId: String) : BaseResourceInstantiationRequestDetails.RequestInfo {
+    private fun generateRequestInfo(instanceName: String?, resourceType: ResourceType?, rollbackOnFailure: Boolean?, productFamilyId: String?, userId: String): BaseResourceInstantiationRequestDetails.RequestInfo {
         return BaseResourceInstantiationRequestDetails.RequestInfo(
                 if (resourceType == null) null else getUniqueNameIfNeeded(instanceName, resourceType, false),
                 productFamilyId,
@@ -386,10 +389,7 @@
     }
 
     private fun generateUserParamsNameAndValue(instanceParams: List<Map<String, String>>): List<ServiceInstantiationRequestDetails.UserParamNameAndValue> {
-        if (instanceParams == null){
-            return emptyList()
-        }
-        return instanceParams.getOrElse(0, {emptyMap()}).map{x-> ServiceInstantiationRequestDetails.UserParamNameAndValue(x.key, x.value)}
+        return instanceParams.getOrElse(0) {emptyMap()}.map{ x-> ServiceInstantiationRequestDetails.UserParamNameAndValue(x.key, x.value)}
     }
 
     private fun generateSubscriberInfoPre1806(payload: ServiceInstantiation): SubscriberInfo {
@@ -408,4 +408,18 @@
             listOf(vpn, network).map { RelatedInstance(it.modelInfo, it.instanceId, it.instanceName) }
         }
     }
+
+    private fun generateMacroServiceInstantiationRequestParams(payload: ServiceInstantiation, serviceInstanceName: String?, jobId: UUID?): List<UserParamTypes> {
+        val userParams = generateServiceInstantiationServicesList(payload, serviceInstanceName, createServiceInstantiationVnfList(jobId, payload))
+
+        return userParams.plus(homingSolution())
+    }
+
+    private fun homingSolution(): List<UserParamTypes> {
+        return if (featureManager.isActive(Features.FLAG_DISABLE_HOMING)) {
+            listOf(ServiceInstantiationRequestDetails.HomingSolution(DISABLED_HOMING_VALUE))
+        } else {
+            listOf()
+        }
+    }
 }
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/model/ServiceInstantiationRequestDetails.java b/vid-app-common/src/main/java/org/onap/vid/mso/model/ServiceInstantiationRequestDetails.java
index 8f8dd68..e610d6c 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/model/ServiceInstantiationRequestDetails.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/model/ServiceInstantiationRequestDetails.java
@@ -136,6 +136,19 @@
         }
     }
 
+    public static class HomingSolution implements UserParamTypes {
+        private final String homingSolution;
+
+        public HomingSolution(String homingSolution) {
+            this.homingSolution = homingSolution;
+        }
+
+        @JsonProperty("Homing_Solution")
+        public String getHomingSolution() {
+            return homingSolution;
+        }
+    }
+
     public static class ServiceInstantiationService implements UserParamTypes {
         private final ServiceInstantiationServiceInner serviceInstantiationServiceInner;
 
diff --git a/vid-app-common/src/main/java/org/onap/vid/properties/Features.java b/vid-app-common/src/main/java/org/onap/vid/properties/Features.java
index 9abf68b..00d8424 100644
--- a/vid-app-common/src/main/java/org/onap/vid/properties/Features.java
+++ b/vid-app-common/src/main/java/org/onap/vid/properties/Features.java
@@ -74,6 +74,7 @@
     FLAG_PNP_INSTANTIATION,
     FLAG_HANDLE_SO_WORKFLOWS,
     FLAG_CREATE_ERROR_REPORTS,
+    FLAG_DISABLE_HOMING,
     FLAG_FLASH_REDUCED_RESPONSE_CHANGEMG,
     FLAG_FLASH_MORE_ACTIONS_BUTTON_IN_OLD_VIEW_EDIT,
     FLAG_FLASH_CLOUD_REGION_AND_NF_ROLE_OPTIONAL_SEARCH,
diff --git a/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
index 8438172..ff542d0 100644
--- a/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
+++ b/vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
@@ -32,5 +32,6 @@
 FLAG_1902_NEW_VIEW_EDIT= false
 FLAG_EXP_USE_DEFAULT_HOST_NAME_VERIFIER = false
 FLAG_1902_VNF_GROUPING = true
+FLAG_DISABLE_HOMING = true
 FLAG_FLASH_CLOUD_REGION_AND_NF_ROLE_OPTIONAL_SEARCH=false
 FLAG_FLASH_REDUCED_RESPONSE_CHANGEMG = false
diff --git a/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties b/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties
index adff111..d1ce91f 100644
--- a/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties
+++ b/vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties
@@ -35,4 +35,4 @@
 FLAG_SUPPLEMENTARY_FILE = false
 FLAG_1902_NEW_VIEW_EDIT=false
 FLAG_1902_VNF_GROUPING = false
-
+FLAG_DISABLE_HOMING = true
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
index 2b4f4be..ce0aa42 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
@@ -190,6 +190,7 @@
     @BeforeClass
     void initServicesInfoService() {
         MockitoAnnotations.initMocks(this);
+        doReturn(false).when(featureManager).isActive(Features.FLAG_DISABLE_HOMING);
         AsyncInstantiationRepository realAsyncInstantiationRepository = new AsyncInstantiationRepository(dataAccessService);
         asyncInstantiationRepository = spy(realAsyncInstantiationRepository);
 
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/MsoRequestBuilderTest.java b/vid-app-common/src/test/java/org/onap/vid/services/MsoRequestBuilderTest.java
index bd761f2..2c70b3d 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/MsoRequestBuilderTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/MsoRequestBuilderTest.java
@@ -26,6 +26,7 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -85,6 +86,7 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
 
 @ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class})
 public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
@@ -138,22 +140,32 @@
 
     @Test
     public void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected() throws IOException {
-        createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true);
+        createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true,
+                false);
     }
 
     @Test
     public void createServiceInfo_WithUserProvidedNamingFalseAndNoVfmodules_ServiceInfoIsAsExpected() throws IOException {
-        createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false);
+        createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false, false);
     }
 
-    private void createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules) throws IOException {
+    @Test
+    public void shouldCreateServiceInfoWithHomingSolutionDisabled() throws IOException {
+        doReturn(true).when(featureManager).isActive(Features.FLAG_DISABLE_HOMING);
+
+        createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true, true);
+    }
+
+    private void createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules, boolean disabledHoming) throws IOException {
 
         ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
                 createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
                 1,
                 false, PROJECT_NAME, true);
         URL resource;
-        if (withVfmodules) {
+        if (disabledHoming) {
+            resource = this.getClass().getResource("/payload_jsons/bulk_service_no_homing.json");
+        } else if (withVfmodules) {
             resource = this.getClass().getResource("/payload_jsons/bulk_service_request_ecomp_naming.json");
         } else {
             // remove the vf modules
diff --git a/vid-app-common/src/test/resources/payload_jsons/bulk_service_no_homing.json b/vid-app-common/src/test/resources/payload_jsons/bulk_service_no_homing.json
new file mode 100644
index 0000000..f612800
--- /dev/null
+++ b/vid-app-common/src/test/resources/payload_jsons/bulk_service_no_homing.json
@@ -0,0 +1,99 @@
+{
+  "requestDetails": {
+    "modelInfo": {
+      "modelType": "service",
+      "modelInvariantId": "5d48acb5-097d-4982-aeb2-f4a3bd87d31b",
+      "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a",
+      "modelName": "MOW AVPN vMX BV vPE 1 Service",
+      "modelVersion": "10.0"
+    },
+    "owningEntity": {
+      "owningEntityId": "038d99af-0427-42c2-9d15-971b99b9b489",
+      "owningEntityName": "JULIO ERICKSON"
+    },
+    "project": {
+      "projectName": "{some project name}"
+    },
+    "subscriberInfo": {
+      "globalSubscriberId": "{some subscriber id}"
+    },
+    "requestInfo": {
+      "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+      "source": "VID",
+      "suppressRollback": false,
+      "requestorId": "az2016"
+    },
+    "requestParameters": {
+      "subscriptionServiceType": "VMX",
+      "aLaCarte": false,
+      "userParams": [{
+        "service": {
+          "modelInfo": {
+            "modelType": "service",
+            "modelName": "MOW AVPN vMX BV vPE 1 Service",
+            "modelVersionId": "3c40d244-808e-42ca-b09a-256d83d19d0a"
+          },
+          "instanceParams": [{
+            "instanceParams_test1": "some text",
+            "instanceParams_test2": "another text"
+          }],
+          "resources": {
+            "vnfs": [{
+              "modelInfo": {
+                "modelType": "vnf",
+                "modelName": "2016-73_MOW-AVPN-vPE-BV-L",
+                "modelVersionId": "7f40c192-f63c-463e-ba94-286933b895f8",
+                "modelCustomizationName": "2016-73_MOW-AVPN-vPE-BV-L 0",
+                "modelCustomizationId": "ab153b6e-c364-44c0-bef6-1f2982117f04"
+              },
+              "cloudConfiguration": {
+                "lcpCloudRegionId": "mdt1",
+                "cloudOwner": "irma-aic",
+                "tenantId": "88a6ca3ee0394ade9403f075db23167e"
+              },
+              "platform": {
+                "platformName": "platformName"
+              },
+              "lineOfBusiness": {
+                "lineOfBusinessName": "lineOfBusinessName"
+              },
+              "productFamilyId": "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb",
+              "instanceParams": [{
+                "vmx_int_net_len": "24",
+                "availability_zone_0": "mtpocdv-kvm-az01",
+                "vre_a_volume_size_0": "100"
+              }],
+              "vfModules": [{
+                "modelInfo": {
+                  "modelCustomizationName" : "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                  "modelType": "vfModule",
+                  "modelName": "201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0",
+                  "modelVersionId": "4c75f813-fa91-45a4-89d0-790ff5f1ae79",
+                  "modelCustomizationId": "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f"
+                },
+                "instanceParams": [{
+                  "vmx_int_net_len": "24"
+                }]
+              },
+                {
+                  "modelInfo": {
+                    "modelCustomizationName" : "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                    "modelType": "vfModule",
+                    "modelName": "201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+                    "modelVersionId": "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+                    "modelCustomizationId": "72d9d1cd-f46d-447a-abdb-451d6fb05fa8"
+                  },
+                  "instanceParams": [{
+                    "availability_zone_0": "mtpocdv-kvm-az01",
+                    "vre_a_volume_size_0": "100"
+                  }]
+                }]
+            }]
+          }
+        }
+      },
+        {"Homing_Solution": "none"}
+      ]
+    }
+  }
+}
\ No newline at end of file