VfModule and VolumeGroup RequestParameters: introduce objects hierarchy

-- RequestParametersVfModuleOrVolumeGroup
   +-- RequestParametersVfModuleOrVolumeGroupInstantiation
   +-- RequestParametersVfModuleUpgrade

Change-Id: I97ef46c7cf66936685e030a73b42d4deac7403b5
Issue-ID: VID-603
Signed-off-by: Ittay Stern <ittay.stern@att.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 a03d62d..e71315d 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
@@ -11,7 +11,7 @@
 import org.onap.vid.model.serviceInstantiation.*
 import org.onap.vid.mso.model.*
 import org.onap.vid.mso.model.BaseResourceInstantiationRequestDetails.*
-import org.onap.vid.mso.model.VfModuleInstantiationRequestDetails.UserParamMap
+import org.onap.vid.mso.model.VfModuleOrVolumeGroupRequestDetails.*
 import org.onap.vid.mso.rest.SubscriberInfo
 import org.onap.vid.properties.Features
 import org.onap.vid.services.AsyncInstantiationBusinessLogic
@@ -99,20 +99,17 @@
         return RequestDetailsWrapper(VnfInstantiationRequestDetails(vnfDetails.modelInfo, cloudConfiguration, requestInfo, null, null, null, null))
     }
 
-    fun generateVfModuleInstantiationRequest(
+    protected fun generateVfModuleRequestWithRequestParams(
             vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
-            serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String,
-            vgInstanceId: String?, userId: String, testApi: String?
-    ): RequestDetailsWrapper<VfModuleInstantiationRequestDetails> {
+            serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String, vgInstanceId: String?, userId: String,
+            requestParameters: (userParams: List<UserParamTypes>) -> RequestParametersVfModuleOrVolumeGroup
+    ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
         val requestInfo = generateRequestInfo(vfModuleDetails.instanceName, ResourceType.VF_MODULE, vfModuleDetails.isRollbackOnFailure, null, userId)
 
         //cloud configuration
         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
 
-        //request parameters
         val userParams = aggregateAllInstanceParams(extractActualInstanceParams(vfModuleDetails.instanceParams), vfModuleDetails.supplementaryParams)
-        val requestParameters = VfModuleInstantiationRequestDetails.RequestParametersVfModule(
-                userParams, vfModuleDetails.isUsePreload, testApi, nullSafeNegate(vfModuleDetails.isRetainVolumeGroups))
 
         //related instance list
         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
@@ -121,7 +118,34 @@
             volumeGroupModel.modelType = "volumeGroup"
             relatedInstanceList.add(RelatedInstance(volumeGroupModel, vgInstanceId, vfModuleDetails.volumeGroupInstanceName))
         }
-        return RequestDetailsWrapper(VfModuleInstantiationRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters))
+
+        return RequestDetailsWrapper(VfModuleOrVolumeGroupRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters(userParams)))
+    }
+
+    fun generateVfModuleInstantiationRequest(
+            vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
+            serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String,
+            vgInstanceId: String?, userId: String, testApi: String?
+    ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
+        val requestParameters = { userParams: List<UserParamTypes> ->
+            RequestParametersVfModuleOrVolumeGroupInstantiation(userParams, vfModuleDetails.isUsePreload, testApi)
+        }
+
+        return generateVfModuleRequestWithRequestParams(vfModuleDetails, serviceModelInfo, serviceInstanceId,
+                vnfModelInfo, vnfInstanceId, vgInstanceId, userId, requestParameters)
+    }
+
+    fun generateVfModuleReplaceRequest(
+            vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
+            serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String,
+            vgInstanceId: String?, userId: String, testApi: String?
+    ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
+        val requestParameters = { userParams: List<UserParamTypes> ->
+            RequestParametersVfModuleUpgrade(userParams, vfModuleDetails.isUsePreload, testApi, nullSafeNegate(vfModuleDetails.isRetainVolumeGroups))
+        }
+
+        return generateVfModuleRequestWithRequestParams(vfModuleDetails, serviceModelInfo, serviceInstanceId,
+                vnfModelInfo, vnfInstanceId, vgInstanceId, userId, requestParameters)
     }
 
     private fun nullSafeNegate(booleanValue: Boolean?): Boolean? = booleanValue?.not()
@@ -130,7 +154,7 @@
         val requestInfo = generateRequestInfo(vfModuleDetails.volumeGroupInstanceName, ResourceType.VOLUME_GROUP, vfModuleDetails.isRollbackOnFailure, null, userId)
         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
         val userParams = aggregateAllInstanceParams(extractActualInstanceParams(vfModuleDetails.instanceParams), vfModuleDetails.supplementaryParams)
-        val requestParameters = VfModuleInstantiationRequestDetails.RequestParametersVfModule(userParams, vfModuleDetails.isUsePreload, testApi, null)
+        val requestParameters = RequestParametersVfModuleOrVolumeGroupInstantiation(userParams, vfModuleDetails.isUsePreload, testApi)
         val relatedInstances = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
 
         vfModuleDetails.modelInfo.modelType = "volumeGroup"
@@ -158,10 +182,10 @@
         return RequestDetailsWrapper(NetworkInstantiationRequestDetails(networkDetails.modelInfo, cloudConfiguration, requestInfo, null, null, null, null))
     }
 
-    fun generateDeleteVfModuleRequest(vfModuleDetails: VfModule, userId: String): RequestDetailsWrapper<VfModuleInstantiationRequestDetails> {
+    fun generateDeleteVfModuleRequest(vfModuleDetails: VfModule, userId: String): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
         val requestInfo = generateRequestInfo(null, null, null, null, userId)
         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
-        return RequestDetailsWrapper(VfModuleInstantiationRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, null, null))
+        return RequestDetailsWrapper(VfModuleOrVolumeGroupRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, null, null))
     }
 
     private fun generateServiceName(jobId: UUID?, payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String): String? {
@@ -271,7 +295,7 @@
         }.collect(Collectors.toList<VfModuleMacro>())
     }
 
-    fun aggregateAllInstanceParams(instanceParams: Map<String, String>?, supplementaryParams: Map<String, String>?): List<VfModuleInstantiationRequestDetails.UserParamMap<String, String>> {
+    fun aggregateAllInstanceParams(instanceParams: Map<String, String>?, supplementaryParams: Map<String, String>?): List<VfModuleOrVolumeGroupRequestDetails.UserParamMap<String, String>> {
         var instanceParamsFinal: Map<String, String> = instanceParams ?: emptyMap()
         val supplementaryParamsFinal: Map<String, String> = supplementaryParams ?: emptyMap()
 
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/VfmoduleCommand.kt b/vid-app-common/src/main/java/org/onap/vid/job/command/VfmoduleCommand.kt
index bee42fb..6c49907 100644
--- a/vid-app-common/src/main/java/org/onap/vid/job/command/VfmoduleCommand.kt
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/VfmoduleCommand.kt
@@ -90,7 +90,7 @@
 
         val originalRequestWithNewestVfmModelInfo = getRequest().cloneWith(vfmModelInfo)
 
-        val requestDetailsWrapper = msoRequestBuilder.generateVfModuleInstantiationRequest(
+        val requestDetailsWrapper = msoRequestBuilder.generateVfModuleReplaceRequest(
                 originalRequestWithNewestVfmModelInfo, serviceModelInfo, serviceInstanceId,
                 vnfModelInfo, vnfInstanceId, null, sharedData.userId, sharedData.testApi)
 
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleInstantiationRequestDetails.java b/vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleOrVolumeGroupRequestDetails.java
similarity index 81%
rename from vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleInstantiationRequestDetails.java
rename to vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleOrVolumeGroupRequestDetails.java
index d54fe7c..794714e 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleInstantiationRequestDetails.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleOrVolumeGroupRequestDetails.java
@@ -98,31 +98,45 @@
 
  */
 
-public class VfModuleInstantiationRequestDetails extends BaseResourceInstantiationRequestDetails {
+public class VfModuleOrVolumeGroupRequestDetails extends BaseResourceInstantiationRequestDetails {
 
-    public VfModuleInstantiationRequestDetails(
+    public VfModuleOrVolumeGroupRequestDetails(
             @JsonProperty(value = "modelInfo", required = true) ModelInfo modelInfo,
             @JsonProperty(value = "cloudConfiguration", required = true) CloudConfiguration cloudConfiguration,
             @JsonProperty(value = "requestInfo", required = true) RequestInfo requestInfo,
             @JsonProperty(value = "relatedInstanceList", required = true) List<RelatedInstance> relatedInstanceList,
-            @JsonProperty(value = "requestParameters", required = true) RequestParametersVfModule requestParameters)
+            @JsonProperty(value = "requestParameters", required = true) RequestParametersVfModuleOrVolumeGroup requestParameters)
     {
         super(modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters);
     }
 
-    public static class RequestParametersVfModule extends BaseResourceInstantiationRequestDetails.RequestParameters {
+    public static class RequestParametersVfModuleOrVolumeGroup extends BaseResourceInstantiationRequestDetails.RequestParameters {
         @JsonInclude(NON_NULL) private final Boolean usePreload;
-        @JsonInclude(NON_NULL) private final Boolean rebuildVolumeGroups;
 
-        public RequestParametersVfModule(List<? extends UserParamTypes> userParams, Boolean usePreload, String testApi, Boolean rebuildVolumeGroups) {
+        private RequestParametersVfModuleOrVolumeGroup(List<? extends UserParamTypes> userParams, Boolean usePreload, String testApi) {
             super(userParams, testApi);
             this.usePreload = usePreload;
-            this.rebuildVolumeGroups = rebuildVolumeGroups;
         }
 
         public Boolean isUsePreload() {
             return usePreload;
         }
+    }
+
+    public static class RequestParametersVfModuleOrVolumeGroupInstantiation extends RequestParametersVfModuleOrVolumeGroup {
+        public RequestParametersVfModuleOrVolumeGroupInstantiation(
+            List<? extends UserParamTypes> userParams, Boolean usePreload, String testApi) {
+            super(userParams, usePreload, testApi);
+        }
+    }
+
+    public static class RequestParametersVfModuleUpgrade extends RequestParametersVfModuleOrVolumeGroup {
+        @JsonInclude(NON_NULL) private final Boolean rebuildVolumeGroups;
+
+        public RequestParametersVfModuleUpgrade(List<? extends UserParamTypes> userParams, Boolean usePreload, String testApi, Boolean rebuildVolumeGroups) {
+            super(userParams, usePreload, testApi);
+            this.rebuildVolumeGroups = rebuildVolumeGroups;
+        }
 
         public Boolean getRebuildVolumeGroups() {
             return rebuildVolumeGroups;
@@ -130,7 +144,6 @@
     }
 
     public static class UserParamMap<K,V> extends HashMap<K,V> implements UserParamTypes, Map<K,V>  {
-
         public UserParamMap() {
             super();
         }
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/model/VolumeGroupRequestDetails.java b/vid-app-common/src/main/java/org/onap/vid/mso/model/VolumeGroupRequestDetails.java
index e1a5e56..6b7d6b9 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/model/VolumeGroupRequestDetails.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/model/VolumeGroupRequestDetails.java
@@ -21,8 +21,8 @@
 package org.onap.vid.mso.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-
 import java.util.List;
+import org.onap.vid.mso.model.VfModuleOrVolumeGroupRequestDetails.RequestParametersVfModuleOrVolumeGroup;
 
 public class VolumeGroupRequestDetails extends BaseResourceInstantiationRequestDetails {
 
@@ -31,7 +31,7 @@
             @JsonProperty(value = "cloudConfiguration", required = true) CloudConfiguration cloudConfiguration,
             @JsonProperty(value = "requestInfo", required = true) RequestInfo requestInfo,
             @JsonProperty(value = "relatedInstanceList", required = true) List<RelatedInstance> relatedInstanceList,
-            @JsonProperty(value = "requestParameters", required = true) VfModuleInstantiationRequestDetails.RequestParametersVfModule requestParameters)
+            @JsonProperty(value = "requestParameters", required = true) RequestParametersVfModuleOrVolumeGroup requestParameters)
     {
         super(modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters);
     }
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 036c0fb..b935ead 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
@@ -75,8 +75,8 @@
 import org.onap.vid.mso.model.NetworkInstantiationRequestDetails;
 import org.onap.vid.mso.model.ServiceDeletionRequestDetails;
 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
-import org.onap.vid.mso.model.VfModuleInstantiationRequestDetails;
 import org.onap.vid.mso.model.VfModuleMacro;
+import org.onap.vid.mso.model.VfModuleOrVolumeGroupRequestDetails;
 import org.onap.vid.mso.model.VnfInstantiationRequestDetails;
 import org.onap.vid.mso.model.VolumeGroupRequestDetails;
 import org.onap.vid.properties.Features;
@@ -371,7 +371,7 @@
         when(aaiClient.isNodeTypeExistsByName(eq("vmxnjr001_AVPN_base_vRE_BV_expansion"), eq(ResourceType.VF_MODULE))).thenReturn(false);
 
         String expected = IOUtils.toString(this.getClass().getResource(fileName), "UTF-8");
-        final RequestDetailsWrapper<VfModuleInstantiationRequestDetails> result = msoRequestBuilder.generateVfModuleInstantiationRequest(
+        final RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result = msoRequestBuilder.generateVfModuleInstantiationRequest(
                 vfModule, siModelInfo, serviceInstanceId,
                 vnfModelInfo, vnfInstanceId, volumeGroupInstanceId, "pa0916", "VNF_API");
         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
@@ -391,8 +391,8 @@
     }
 
     @Test(dataProvider = "expectedAggregatedParams")
-    public void testAggregateInstanceParamsAndSuppFile(Map<String, String> instanceParams, Map<String, String> suppParams, List<VfModuleInstantiationRequestDetails.UserParamMap<String, String>> expected) {
-        List<VfModuleInstantiationRequestDetails.UserParamMap<String, String>> aggParams = msoRequestBuilder.aggregateAllInstanceParams(instanceParams, suppParams);
+    public void testAggregateInstanceParamsAndSuppFile(Map<String, String> instanceParams, Map<String, String> suppParams, List<VfModuleOrVolumeGroupRequestDetails.UserParamMap<String, String>> expected) {
+        List<VfModuleOrVolumeGroupRequestDetails.UserParamMap<String, String>> aggParams = msoRequestBuilder.aggregateAllInstanceParams(instanceParams, suppParams);
         assertThat("Aggregated params are not as expected", aggParams, equalTo(expected));
     }
 
@@ -566,7 +566,7 @@
                         "  }" +
                         "}";
         VfModule vfModuleDetails = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", VF_MODULE_0_MODEL_VERSION_ID, VF_MODULE_0_MODEL_CUSTOMIZATION_NAME, null, new HashMap<>(), "vmxnjr001_AVPN_base_vPE_BV_base", null, true);
-        RequestDetailsWrapper<VfModuleInstantiationRequestDetails> result =
+        RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> result =
                 msoRequestBuilder.generateDeleteVfModuleRequest(vfModuleDetails, "az2018");
         MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
     }
@@ -612,17 +612,21 @@
 
     @Test
     public void generateReplaceVfModuleRequest_whenRetainVolumeGroupIsTrue_rebuildVolumeGroupIsFalse() {
-        assertThat(generatedVfModuleInstantiationRequest(true),
+        boolean retainVolumeGroups = true;
+
+        assertThat(generatedVfModuleReplaceRequest(retainVolumeGroups),
             jsonPartEquals("requestDetails.requestParameters.rebuildVolumeGroups", false));
     }
 
     @Test
     public void generateReplaceVfModuleRequest_verifyResultAsExpected() {
+        Boolean retainVolumeGroups = null;
+
         String expected = TestUtils.readFileAsString("/payload_jsons/vfmodule/replace_vfmodule__payload_to_mso.json");
-        assertThat(generatedVfModuleInstantiationRequest(null), jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
+        assertThat(generatedVfModuleReplaceRequest(retainVolumeGroups), jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
     }
 
-    private RequestDetailsWrapper<VfModuleInstantiationRequestDetails> generatedVfModuleInstantiationRequest(
+    private RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> generatedVfModuleReplaceRequest(
         Boolean retainVolumeGroups) {
         when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
         when(aaiClient.getCloudOwnerByCloudRegionId("regionOne")).thenReturn("irma-aic");
@@ -637,8 +641,9 @@
 
         ModelInfo vnfModelInfo = createVnfModelInfo("newest-model-name-vnf", "newest-model-version-vnf", "newest-model-uuid-vnf", "23122c9b-dd7f-483f-bf0a-e069303db2f7", "newest-model-customization-uuid-vnf", "newest-model-customization-name-vnf" );
 
-        return msoRequestBuilder.generateVfModuleInstantiationRequest(vfModuleDetails, serviceModelInfo, "e9993045-cc96-4f3f-bf9a-71b2a400a956", vnfModelInfo, "5c9c2896-1fe6-4055-b7ec-d0a01e5f9bf5", null,
-            "az2016", "GR_API"
+        return msoRequestBuilder.generateVfModuleReplaceRequest(vfModuleDetails, serviceModelInfo,
+            "e9993045-cc96-4f3f-bf9a-71b2a400a956", vnfModelInfo,
+            "5c9c2896-1fe6-4055-b7ec-d0a01e5f9bf5", null, "az2016", "GR_API"
         );
     }
 }
\ No newline at end of file