Merge "identify macro services without instantiation type in BE by feature flag"
authorIttay Stern <ittay.stern@att.com>
Mon, 25 Nov 2019 14:04:02 +0000 (14:04 +0000)
committerGerrit Code Review <gerrit@onap.org>
Mon, 25 Nov 2019 14:04:02 +0000 (14:04 +0000)
46 files changed:
vid-app-common/src/main/java/org/onap/vid/job/command/MsoRequestBuilder.kt
vid-app-common/src/main/java/org/onap/vid/job/command/VfmoduleCommand.kt
vid-app-common/src/main/java/org/onap/vid/model/serviceInstantiation/VfModule.java
vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleOrVolumeGroupRequestDetails.kt [moved from vid-app-common/src/main/java/org/onap/vid/mso/model/VfModuleInstantiationRequestDetails.java with 66% similarity]
vid-app-common/src/main/java/org/onap/vid/mso/model/VolumeGroupRequestDetails.java
vid-app-common/src/main/java/org/onap/vid/properties/Features.java
vid-app-common/src/main/webapp/WEB-INF/conf/dev.features.properties
vid-app-common/src/main/webapp/WEB-INF/conf/onap.features.properties
vid-app-common/src/main/webapp/app/vid/scripts/controller/InstantiationController.js
vid-app-common/src/main/webapp/app/vid/scripts/controller/aaiSubscriberController.js
vid-app-common/src/test/java/org/onap/vid/job/command/ResourceCommandTest.java
vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java
vid-app-common/src/test/java/org/onap/vid/services/MsoRequestBuilderTest.java
vid-app-common/src/test/resources/payload_jsons/vfmodule/upgrade_vfmodule_e2e__fe_input_cypress.json
vid-app-common/src/test/resources/payload_jsons/vfmodule/upgrade_vfmodule_e2e__payload_to_mso.json
vid-automation/src/main/java/vid/automation/test/infra/Features.java
vid-automation/src/main/java/vid/automation/test/test/CreateNewInstanceTest.java
vid-automation/src/main/resources/NewServiceInstanceTest/createNewServiceInstance_macro_validPopupDataAndUI__dynamicFieldsEcompNamingFalse.json
vid-automation/src/test/resources/features.properties
vid-webpack-master/cypress/integration/iFrames/collectionResource.e2e.ts
vid-webpack-master/cypress/integration/iFrames/drawingBoard.e2e.ts
vid-webpack-master/cypress/integration/iFrames/network.popup.e2e.ts
vid-webpack-master/cypress/integration/iFrames/pnf.e2e.ts
vid-webpack-master/cypress/integration/iFrames/viewEditUpgradeVfModule.e2e.ts
vid-webpack-master/cypress/integration/iFrames/vnf.popup.e2e.ts
vid-webpack-master/cypress/support/jsonBuilders/mocks/jsons/flags.cypress.json
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vfModule/vfModule.model.info.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/models/vrf/vrfModal/networkStep/network.step.service.spec.ts
vid-webpack-master/src/app/drawingBoard/service-planning/objectsToTree/shared.tree.service.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/networkGenerator/network.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/service.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGenerator/vnf.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericForm/formControlsServices/vnfGroupGenerator/vnfGroup.control.generator.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/generic-form-popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/basic.popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/network/network.popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/service/service.popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModule/vfModule.popuop.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popuop.service.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vfModuleUpgrade/vfModule.upgrade.popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnf/vnf.popup.service.spec.ts
vid-webpack-master/src/app/shared/components/genericFormPopup/genericFormServices/vnfGroup/vnfGroup.popup.service.spec.ts
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.actions.ts
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.spec.ts
vid-webpack-master/src/app/shared/storeUtil/utils/vfModule/vfModule.reducers.ts

index b35deb8..c392d07 100644 (file)
@@ -11,7 +11,6 @@ import org.onap.vid.changeManagement.RequestDetailsWrapper
 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.rest.SubscriberInfo
 import org.onap.vid.properties.Features
 import org.onap.vid.services.AsyncInstantiationBusinessLogic
@@ -99,15 +98,17 @@ class MsoRequestBuilder
         return RequestDetailsWrapper(VnfInstantiationRequestDetails(vnfDetails.modelInfo, cloudConfiguration, requestInfo, null, null, null, null))
     }
 
-    fun generateVfModuleInstantiationRequest(vfModuleDetails: VfModule, serviceModelInfo: ModelInfo, serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String, vgInstanceId: String?, userId: String, testApi: String?): RequestDetailsWrapper<VfModuleInstantiationRequestDetails> {
+    protected fun generateVfModuleRequestWithRequestParams(
+            vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
+            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)
 
         //related instance list
         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
@@ -116,14 +117,44 @@ class MsoRequestBuilder
             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,
+                    vfModuleDetails.isRetainAssignments, nullSafeNegate(vfModuleDetails.isRetainVolumeGroups))
+        }
+
+        return generateVfModuleRequestWithRequestParams(vfModuleDetails, serviceModelInfo, serviceInstanceId,
+                vnfModelInfo, vnfInstanceId, vgInstanceId, userId, requestParameters)
+    }
+
+    private fun nullSafeNegate(booleanValue: Boolean?): Boolean? = booleanValue?.not()
+
     fun generateVolumeGroupInstantiationRequest(vfModuleDetails: VfModule, serviceModelInfo: ModelInfo, serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String, userId: String, testApi: String?): RequestDetailsWrapper<VolumeGroupRequestDetails> {
         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)
+        val requestParameters = RequestParametersVfModuleOrVolumeGroupInstantiation(userParams, vfModuleDetails.isUsePreload, testApi)
         val relatedInstances = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
 
         vfModuleDetails.modelInfo.modelType = "volumeGroup"
@@ -151,10 +182,10 @@ class MsoRequestBuilder
         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? {
@@ -264,7 +295,7 @@ class MsoRequestBuilder
         }.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<UserParamMap<String, String>> {
         var instanceParamsFinal: Map<String, String> = instanceParams ?: emptyMap()
         val supplementaryParamsFinal: Map<String, String> = supplementaryParams ?: emptyMap()
 
index bee42fb..6c49907 100644 (file)
@@ -90,7 +90,7 @@ class VfmoduleCommand @Autowired constructor(
 
         val originalRequestWithNewestVfmModelInfo = getRequest().cloneWith(vfmModelInfo)
 
-        val requestDetailsWrapper = msoRequestBuilder.generateVfModuleInstantiationRequest(
+        val requestDetailsWrapper = msoRequestBuilder.generateVfModuleReplaceRequest(
                 originalRequestWithNewestVfmModelInfo, serviceModelInfo, serviceInstanceId,
                 vnfModelInfo, vnfInstanceId, null, sharedData.userId, sharedData.testApi)
 
index 41da85e..ad5b39e 100644 (file)
@@ -28,6 +28,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.Nullable;
 import org.onap.vid.job.JobAdapter;
 import org.onap.vid.job.JobType;
 import org.onap.vid.mso.model.ModelInfo;
@@ -42,6 +43,12 @@ public class VfModule extends BaseResource implements JobAdapter.AsyncJobRequest
        @JsonInclude(NON_NULL) private Boolean usePreload;
        private Map<String, String> supplementaryParams;
 
+       @JsonInclude(NON_NULL)
+       private final Boolean retainVolumeGroups;
+
+       @JsonInclude(NON_NULL)
+       private Boolean retainAssignments;
+
        public VfModule(@JsonProperty("modelInfo") ModelInfo modelInfo,
                @JsonProperty("instanceName") String instanceName,
                @JsonProperty("volumeGroupName") String volumeGroupInstanceName,
@@ -57,12 +64,16 @@ public class VfModule extends BaseResource implements JobAdapter.AsyncJobRequest
                @JsonProperty("trackById") String trackById,
                @JsonProperty("isFailed") Boolean isFailed,
                @JsonProperty("statusMessage") String statusMessage,
+               @Nullable @JsonProperty("retainAssignments") Boolean retainAssignments,
+               @Nullable @JsonProperty("retainVolumeGroups") Boolean retainVolumeGroups,
                @JsonProperty("position") Integer position) {
                super(modelInfo, instanceName, action, lcpCloudRegionId, legacyRegion, tenantId, instanceParams, rollbackOnFailure, instanceId, trackById, isFailed, statusMessage,
                        position);
                this.volumeGroupInstanceName = volumeGroupInstanceName;
                this.usePreload = usePreload;
                this.supplementaryParams = supplementaryParams;
+               this.retainAssignments = retainAssignments;
+               this.retainVolumeGroups = retainVolumeGroups;
        }
 
        public String getVolumeGroupInstanceName() {
@@ -93,6 +104,16 @@ public class VfModule extends BaseResource implements JobAdapter.AsyncJobRequest
                return JobType.VfmoduleInstantiation;
        }
 
+       @Nullable
+       public Boolean isRetainAssignments() {
+               return retainAssignments;
+       }
+
+       @Nullable
+       public Boolean isRetainVolumeGroups() {
+               return retainVolumeGroups;
+       }
+
        public VfModule cloneWith(ModelInfo modelInfo) {
                return new VfModule(
                                modelInfo,
@@ -110,6 +131,8 @@ public class VfModule extends BaseResource implements JobAdapter.AsyncJobRequest
                                this.getTrackById(),
                                this.getIsFailed(),
                                this.getStatusMessage(),
+                               this.isRetainAssignments(),
+                               this.isRetainVolumeGroups(),
                                this.getPosition());
        }
 }
\ No newline at end of file
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
+package org.onap.vid.mso.model
 
-package org.onap.vid.mso.model;
-
-import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.fasterxml.jackson.annotation.JsonInclude
+import com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL
+import java.util.*
 
 /* Based on this model:
 
@@ -98,36 +93,33 @@ import java.util.Map;
 
  */
 
-public class VfModuleInstantiationRequestDetails extends BaseResourceInstantiationRequestDetails {
-
-    public VfModuleInstantiationRequestDetails(
-            @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)
-    {
-        super(modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters);
-    }
+data class VfModuleOrVolumeGroupRequestDetails(
+        val modelInfo: ModelInfo,
+        val cloudConfiguration: CloudConfiguration,
+        val requestInfo: RequestInfo,
+        val relatedInstanceList: List<RelatedInstance>?,
+        val requestParameters: RequestParametersVfModuleOrVolumeGroup?)
+    : BaseResourceInstantiationRequestDetails(modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters)
 
-    public static class RequestParametersVfModule extends BaseResourceInstantiationRequestDetails.RequestParameters {
-        @JsonInclude(NON_NULL) private final Boolean usePreload;
+open class RequestParametersVfModuleOrVolumeGroup internal constructor(
+        userParams: List<UserParamTypes>,
+        @get:JsonInclude(NON_NULL) val isUsePreload: Boolean?,
+        testApi: String?
+) : BaseResourceInstantiationRequestDetails.RequestParameters(userParams, testApi)
 
-        public RequestParametersVfModule(List<? extends UserParamTypes> userParams, Boolean usePreload, String testApi) {
-            super(userParams, testApi);
-            this.usePreload = usePreload;
-        }
+class RequestParametersVfModuleOrVolumeGroupInstantiation(
+        userParams: List<UserParamTypes>,
+        usePreload: Boolean?,
+        testApi: String?
+) : RequestParametersVfModuleOrVolumeGroup(userParams, usePreload, testApi)
 
-        public Boolean isUsePreload() {
-            return usePreload;
-        }
-    }
+class RequestParametersVfModuleUpgrade(
+        userParams: List<UserParamTypes>,
+        usePreload: Boolean?,
+        testApi: String?,
+        @get:JsonInclude(NON_NULL) val retainAssignments: Boolean?,
+        @get:JsonInclude(NON_NULL) val rebuildVolumeGroups: Boolean?
+) : RequestParametersVfModuleOrVolumeGroup(userParams, usePreload, testApi)
 
-    public static class UserParamMap<K,V> extends HashMap<K,V> implements UserParamTypes, Map<K,V>  {
-
-        public UserParamMap() {
-            super();
-        }
-    }
-}
+class UserParamMap<K, V> : HashMap<K, V>(), UserParamTypes, MutableMap<K, V>
 
index e1a5e56..a637f85 100644 (file)
@@ -21,7 +21,6 @@
 package org.onap.vid.mso.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-
 import java.util.List;
 
 public class VolumeGroupRequestDetails extends BaseResourceInstantiationRequestDetails {
@@ -31,7 +30,7 @@ public class VolumeGroupRequestDetails extends BaseResourceInstantiationRequestD
             @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);
     }
index b53ddbe..d6d7a6a 100644 (file)
@@ -29,8 +29,6 @@ public enum Features implements Feature {
      * Use /docs/feature-flags.md for details
      */
 
-    CREATE_INSTANCE_TEST,
-    EMPTY_DRAWING_BOARD_TEST,
     FLAG_ADD_MSO_TESTAPI_FIELD,
     FLAG_SERVICE_MODEL_CACHE,
     FLAG_NETWORK_TO_ASYNC_INSTANTIATION,
index 7152d91..7baa086 100644 (file)
@@ -1,7 +1,5 @@
 FLAG_ENABLE_WEBPACK_MODERN_UI = true
 FLAG_ASYNC_JOBS = true
-CREATE_INSTANCE_TEST = false
-EMPTY_DRAWING_BOARD_TEST = false
 FLAG_ADD_MSO_TESTAPI_FIELD = true
 FLAG_UNASSIGN_SERVICE = true
 FLAG_COLLECTION_RESOURCE_SUPPORT = true
@@ -10,7 +8,6 @@ FLAG_SERVICE_MODEL_CACHE = true
 FLAG_SHOW_ASSIGNMENTS = true
 FLAG_HANDLE_SO_WORKFLOWS = true
 FLAG_CREATE_ERROR_REPORTS = true
-
 FLAG_SHOW_VERIFY_SERVICE = true
 FLAG_DUPLICATE_VNF = true
 FLAG_DEFAULT_VNF = true
index 709de95..1f7244c 100644 (file)
@@ -1,6 +1,5 @@
 FLAG_PNP_INSTANTIATION = true
 
-CREATE_INSTANCE_TEST = false
 FLAG_ADD_MSO_TESTAPI_FIELD = true
 FLAG_UNASSIGN_SERVICE = true
 FLAG_SERVICE_MODEL_CACHE = true
@@ -22,7 +21,6 @@ FLAG_SHOW_ORCHESTRATION_TYPE = false
 FLAG_COLLECTION_RESOURCE_SUPPORT = false
 FLAG_ENABLE_WEBPACK_MODERN_UI = false
 FLAG_ASYNC_JOBS = false
-EMPTY_DRAWING_BOARD_TEST = false
 FLAG_NETWORK_TO_ASYNC_INSTANTIATION = false
 FLAG_DUPLICATE_VNF = false
 FLAG_DEFAULT_VNF = false
index 6d8dde8..4b6b0f4 100755 (executable)
             var isVfc = false;\r
 \r
             _.map($scope.service.model.vnfs, function (value, key) {\r
-                if (value.uuid == vnf.uuid) {\r
-                    if (!_.isEmpty(value.vfcInstanceGroups)) {\r
+                if (value.uuid == vnf.uuid && !_.isEmpty(value.vfcInstanceGroups)) {\r
                         isVfc = true;\r
                         var queryData = {\r
                             serviceModelId: $scope.service.model.service.uuid,\r
                         $scope.$broadcast(COMPONENT.IFRAME_DIALOG, queryData);\r
                         return;\r
                     }\r
-                }\r
             });\r
 \r
             DataService.setSubscriberName($scope.service.instance.subscriberName);\r
index bf3d54a..110f24e 100755 (executable)
@@ -489,8 +489,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             if (model && model.vnfs && !_.isEmpty(model.vnfs)) {\r
                 Object.keys(model.vnfs).forEach(function (key) {\r
                     var vnf = model.vnfs[key];\r
-                    if (vnf.vfcInstanceGroups && !_.isEmpty(vnf.vfcInstanceGroups)) {\r
-                        if (vnf.uuid === genericVnf.modelVersionId) {\r
+                    if (vnf.vfcInstanceGroups && !_.isEmpty(vnf.vfcInstanceGroups) && vnf.uuid === genericVnf.modelVersionId) {\r
                             AaiService.getInstanceGroupsByVNFInstanceId(genericVnf.nodeId,\r
                                 function (response) { //success\r
                                     handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf);\r
@@ -502,7 +501,6 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                 }\r
                             )\r
                         }\r
-                    }\r
                 });\r
             }\r
         }\r
@@ -797,11 +795,9 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
         };\r
 \r
         $scope.isShowAssignmentsEnabled = function () {\r
-            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_ASSIGNMENTS)) {\r
-                if ($scope.serviceOrchestrationStatus) {\r
+            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_ASSIGNMENTS) && $scope.serviceOrchestrationStatus) {\r
                     return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';\r
                 }\r
-            }\r
             return false;\r
         };\r
 \r
index 986f5d0..db856d7 100644 (file)
@@ -319,8 +319,8 @@ public class ResourceCommandTest {
         }
 
         static VfModule createVfModule(Action action) {
-            return new VfModule(mock(ModelInfo.class), null, null, action.toString(), null, null, null, null, null, false, false, null, null, null, null,
-                null);
+            return new VfModule(mock(ModelInfo.class), null, null, action.toString(), null, null, null, null, null,
+                false, false, null, null, null, null, null, null, null);
         }
 
         static Network createNetwork(Action action) {
index 9c0260e..d1b76df 100644 (file)
@@ -172,20 +172,22 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
             vfModuleInfo.setModelVersion("10.0");
             return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), "mdt1", null,
                     "88a6ca3ee0394ade9403f075db23167e", instanceParams, supplementaryParams, false, true, null, UUID.randomUUID().toString(), null, null,
-                null);
+                null, null, null);
         }
 
         return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), null, null, null,
-                instanceParams, supplementaryParams, false, false, null, UUID.randomUUID().toString(), null, null, null);
+                instanceParams, supplementaryParams, false, false, null, UUID.randomUUID().toString(), null,
+            null, null, null, null);
     }
 
     protected ModelInfo createVfModuleModelInfo(String modelName, String modelVersion, String modelVersionId, String modelInvariantId, String modelCustomizationId, String modelCustomizationName) {
         return createModelInfo("vfModule", modelName, modelVersion, modelVersionId, modelInvariantId, modelCustomizationId, modelCustomizationName);
     }
 
-    protected VfModule createVfModuleForReplace(ModelInfo vfModuleModelInfo, String instanceName, String lcpCloudRegionId, String tenantId) {
+    protected VfModule createVfModuleForReplace(ModelInfo vfModuleModelInfo, String instanceName,
+        String lcpCloudRegionId, String tenantId, Boolean retainAssignments, Boolean retainVolumeGroups) {
         return new VfModule( vfModuleModelInfo, instanceName, null, Action.Upgrade.name(), lcpCloudRegionId, null, tenantId,
-                null, null, true, null, null, UUID.randomUUID().toString(), null, null, null);
+                null, null, true, null, null, UUID.randomUUID().toString(), null, null, retainAssignments, retainVolumeGroups, null);
     }
 
     protected ModelInfo createVnfModelInfo(boolean isAlacarte) {
index a7e2d55..d2370af 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.vid.services;
 
 import static com.google.common.collect.Maps.newHashMap;
 import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
+import static net.javacrumbs.jsonunit.JsonMatchers.jsonPartEquals;
 import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsEqual.equalTo;
@@ -74,8 +75,9 @@ import org.onap.vid.mso.model.ModelInfo;
 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.UserParamMap;
 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;
@@ -370,7 +372,7 @@ public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
         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);
@@ -390,8 +392,8 @@ public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
     }
 
     @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<UserParamMap<String, String>> expected) {
+        List<UserParamMap<String, String>> aggParams = msoRequestBuilder.aggregateAllInstanceParams(instanceParams, suppParams);
         assertThat("Aggregated params are not as expected", aggParams, equalTo(expected));
     }
 
@@ -565,7 +567,7 @@ public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
                         "  }" +
                         "}";
         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);
     }
@@ -609,24 +611,48 @@ public class MsoRequestBuilderTest extends AsyncInstantiationBaseTest {
         assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
     }
 
+    @Test(dataProvider = "trueAndFalse", dataProviderClass = TestUtils.class)
+    public void generateReplaceVfModuleRequest_whenRetainAssignmentsProvidedFromFrontend_retainAssignmentsToMsoIsTheSame(boolean retainAssignments) {
+
+        assertThat(generatedVfModuleReplaceRequest(retainAssignments, null),
+            jsonPartEquals("requestDetails.requestParameters.retainAssignments", retainAssignments));
+    }
+
+    @Test
+    public void generateReplaceVfModuleRequest_whenRetainVolumeGroupIsTrue_rebuildVolumeGroupIsFalse() {
+        boolean retainVolumeGroups = true;
+
+        assertThat(generatedVfModuleReplaceRequest(null, retainVolumeGroups),
+            jsonPartEquals("requestDetails.requestParameters.rebuildVolumeGroups", false));
+    }
+
     @Test
     public void generateReplaceVfModuleRequest_verifyResultAsExpected() {
+        Boolean retainVolumeGroups = null;
+        Boolean retainAssignments = null;
+
         String expected = TestUtils.readFileAsString("/payload_jsons/vfmodule/replace_vfmodule__payload_to_mso.json");
+        assertThat(generatedVfModuleReplaceRequest(retainAssignments, retainVolumeGroups), jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
+    }
+
+    private RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> generatedVfModuleReplaceRequest(
+        Boolean retainAssignments, Boolean retainVolumeGroups) {
         when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
         when(aaiClient.getCloudOwnerByCloudRegionId("regionOne")).thenReturn("irma-aic");
 
         ModelInfo vfModuleModelInfo = createVfModuleModelInfo("newest-model-name-vfm", "newest-model-version-vfm", "newest-model-uuid-vfm",
                 "f7a867f2-596b-4f4a-a128-421e825a6190", "newest-model-customization-uuid-vfm","newest-model-customization-name-vfm" );
 
-        VfModule vfModuleDetails = createVfModuleForReplace(vfModuleModelInfo, "replace_module", "regionOne", "0422ffb57ba042c0800a29dc85ca70f8");
+        VfModule vfModuleDetails = createVfModuleForReplace(vfModuleModelInfo, "replace_module", "regionOne", "0422ffb57ba042c0800a29dc85ca70f8",
+            retainAssignments, retainVolumeGroups);
 
         ModelInfo serviceModelInfo = createServiceModelInfo("newest-model-name-service", "newest-model-version-service", "newest-model-uuid-service", "b16a9398-ffa3-4041-b78c-2956b8ad9c7b", null, null );
 
         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" );
 
-        RequestDetailsWrapper<VfModuleInstantiationRequestDetails> result =
-                msoRequestBuilder.generateVfModuleInstantiationRequest(vfModuleDetails, serviceModelInfo, "e9993045-cc96-4f3f-bf9a-71b2a400a956", vnfModelInfo, "5c9c2896-1fe6-4055-b7ec-d0a01e5f9bf5", null,"az2016", "GR_API");
-
-        assertThat(result, jsonEquals(expected).when(IGNORING_ARRAY_ORDER));
+        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
index 9571a2d..46c99e7 100644 (file)
@@ -1,6 +1,6 @@
 {
   "action": "None_Upgrade",
-  "isDirty": true,
+  "isDirty": false,
   "vnfs": {
     "d520268f-7489-4662-be59-f81495b3a069": {
       "action": "None_Upgrade",
@@ -33,6 +33,7 @@
         "xbitestmodulereplace0..XbiTestModuleReplace..base_ocg..module-0": {
           "b0732bed-3ddf-43cc-b193-7f18db84e476": {
             "action": "None_Upgrade",
+            "retainAssignments" : false,
             "instanceName": "PST-VfMod-Replace-5-Vfmod",
             "instanceId": "b0732bed-3ddf-43cc-b193-7f18db84e476",
             "orchStatus": "Active",
     "viewEditUI": "legacy",
     "instantiationType": "ALaCarte"
   }
-}
\ No newline at end of file
+}
index 7c2d61c..c1a5052 100644 (file)
@@ -5,8 +5,6 @@ import org.togglz.core.context.FeatureContext;
 
 public enum Features implements Feature {
 
-    CREATE_INSTANCE_TEST,
-    EMPTY_DRAWING_BOARD_TEST,
     FLAG_ADD_MSO_TESTAPI_FIELD,
     FLAG_SERVICE_MODEL_CACHE,
     FLAG_NETWORK_TO_ASYNC_INSTANTIATION,
index b57d187..be96e69 100644 (file)
@@ -1,11 +1,12 @@
 package vid.automation.test.test;
 
+import java.io.IOException;
+import java.util.List;
 import org.onap.sdc.ci.tests.utilities.GeneralUIUtils;
 import org.openqa.selenium.WebElement;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 import vid.automation.test.Constants;
-import vid.automation.test.infra.Features;
 import vid.automation.test.infra.Get;
 import vid.automation.test.infra.SelectOption;
 import vid.automation.test.model.Service;
@@ -16,24 +17,15 @@ import vid.automation.test.services.BulkRegistration;
 import vid.automation.test.services.ServicesService;
 import vid.automation.test.services.SimulatorApi;
 
-import java.io.IOException;
-import java.util.List;
-
 public class CreateNewInstanceTest extends CreateInstanceDialogBaseTest {
     private ServicesService servicesService = new ServicesService();
 
     public CreateNewInstanceTest() throws IOException {
     }
 
-    @Test
+    @Test(groups = { "underDevelopment" })
     private void testCreateNewServiceInstance() throws Exception {
 
-        if (!Features.CREATE_INSTANCE_TEST.isActive()) {
-
-            // time bomb, as it fails on pipeline and I don't know how to fix it
-            return;
-        }
-
         SimulatorApi.clearAll();
         BulkRegistration.createNewServiceInstance("SILVIA ROBBINS");
 
index 25725db..591603f 100644 (file)
       "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
       "FLAG_ASYNC_ALACARTE_VNF": true,
       "FLAG_SERVICE_MODEL_CACHE": true,
-      "CREATE_INSTANCE_TEST": false,
       "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
       "FLAG_SUPPLEMENTARY_FILE": true,
-      "EMPTY_DRAWING_BOARD_TEST": false,
       "FLAG_ADD_MSO_TESTAPI_FIELD": true,
       "FLAG_5G_IN_NEW_INSTANTIATION_UI": true,
       "FLAG_RESTRICTED_SELECT": false,
     },
     "type": "[LCP_REGIONS_AND_TENANTS] Update"
   }
-}
\ No newline at end of file
+}
index 1324403..3b7fd31 100644 (file)
@@ -1,5 +1,3 @@
-CREATE_INSTANCE_TEST = false
-EMPTY_DRAWING_BOARD_TEST = false
 FLAG_ADD_MSO_TESTAPI_FIELD = true
 FLAG_NETWORK_TO_ASYNC_INSTANTIATION = false
 FLAG_SERVICE_MODEL_CACHE = true
index a9649fa..25c2fbb 100644 (file)
@@ -1586,7 +1586,6 @@ describe('Drawing board : Collection resource', function () {
           "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
           "FLAG_SHOW_VERIFY_SERVICE": true,
           "FLAG_1902_NEW_VIEW_EDIT": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
           "FLAG_1906_INSTANTIATION_API_USER_VALIDATION": true,
           "FLAG_EXP_CREATE_RESOURCES_IN_PARALLEL": false,
@@ -1602,7 +1601,6 @@ describe('Drawing board : Collection resource', function () {
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_1902_RETRY_JOB": true,
           "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
           "FLAG_1906_AAI_SUB_DETAILS_REDUCE_DEPTH": true,
           "FLAG_VF_MODULE_RESUME_STATUS_CREATE": true,
index e379f78..33829fb 100644 (file)
@@ -577,12 +577,10 @@ describe('Drawing board', function () {
         "flags": {
           "FLAG_SHOW_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
           "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_1906_COMPONENT_INFO" : false
         },
@@ -2211,9 +2209,7 @@ describe('Drawing board', function () {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
@@ -3864,9 +3860,7 @@ describe('Drawing board', function () {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
@@ -5603,7 +5597,6 @@ describe('Drawing board', function () {
         "name": null,
         "type": "UPDATE_DRAWING_BOARD_STATUS",
         "flags": {
-          "CREATE_INSTANCE_TEST": false,
           "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
@@ -6303,9 +6296,7 @@ describe('Drawing board', function () {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
           "FLAG_SUPPLEMENTARY_FILE": true
         },
index 8768e34..2f310b4 100644 (file)
@@ -213,10 +213,8 @@ describe('Network popup', function () {
             "FLAG_SHOW_VERIFY_SERVICE": false,
             "FLAG_SERVICE_MODEL_CACHE": true,
             "FLAG_ADVANCED_PORTS_FILTER": true,
-            "CREATE_INSTANCE_TEST": false,
             "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
             "FLAG_REGION_ID_FROM_REMOTE": true,
-            "EMPTY_DRAWING_BOARD_TEST": false,
             "FLAG_ADD_MSO_TESTAPI_FIELD": true
           },
           "type": "[FLAGS] Update"
index 0e10618..0a17fc9 100644 (file)
@@ -1447,7 +1447,6 @@ function initDrawingBoardWithFourPnf(serviceModelId: string, pnfName: string) {
           "FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST": true,
           "FLAG_SHOW_VERIFY_SERVICE": true,
           "FLAG_1902_NEW_VIEW_EDIT": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
           "FLAG_1906_INSTANTIATION_API_USER_VALIDATION": true,
           "FLAG_EXP_CREATE_RESOURCES_IN_PARALLEL": false,
@@ -1463,7 +1462,6 @@ function initDrawingBoardWithFourPnf(serviceModelId: string, pnfName: string) {
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_1902_RETRY_JOB": true,
           "FLAG_EXP_ANY_ALACARTE_NEW_INSTANTIATION_UI": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": true,
           "FLAG_1906_AAI_SUB_DETAILS_REDUCE_DEPTH": true,
           "FLAG_VF_MODULE_RESUME_STATUS_CREATE": true,
index 4ca39b1..46e5fad 100644 (file)
@@ -105,13 +105,17 @@ describe('View Edit Page: Upgrade VFModule', function () {
       initServicePlanning("EDIT",
         '../vid-automation/src/test/resources/viewEdit/ServiceTreeWithMultipleChildren_serviceInstance_withUpdatedLatestVersion.json');
       upgradeTheVFM();
+      assertVfModuleActionInRedux("None_Upgrade");
       undoUpgradeForVFM();
+      assertVfModuleActionInRedux("None");
       upgradeTheVFM();
       cy.getDrawingBoardDeployBtn().click();
       cy.wait('@expectedPostAsyncInstantiation').then(xhr => {
-        expect(Object(xhr.request.body).action).to.equal("None_Upgrade");
-        expect(Object(xhr.request.body).vnfs['VNF2_INSTANCE_ID'].action).to.equal("None_Upgrade");
-        expect(Object(xhr.request.body).vnfs['VNF2_INSTANCE_ID'].vfModules['vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1']['2c1ca484-cbc2-408b-ab86-25a2c15ce280'].action).to.equal("None_Upgrade");
+        const requestBody = Object(xhr.request.body);
+        const vfModuleRequest = requestBody.vnfs['VNF2_INSTANCE_ID'].vfModules['vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1']['2c1ca484-cbc2-408b-ab86-25a2c15ce280'];
+          expect(requestBody.action).to.equal("None_Upgrade");
+        expect(requestBody.vnfs['VNF2_INSTANCE_ID'].action).to.equal("None_Upgrade");
+        expect(vfModuleRequest.action).to.equal("None_Upgrade");
       });
     });
 
@@ -213,6 +217,9 @@ describe('View Edit Page: Upgrade VFModule', function () {
     cy.getElementByDataTestsId(`${treeNodeId}-menu-btn`).click()
     .drawingBoardTreeClickOnContextMenuOptionByName("Upgrade");
     // The following is needed when enabling FLAG_2002_VFM_UPGRADE_ADDITIONAL_OPTIONS
+
+    cy.getElementByDataTestsId('retainAssignments').click();
+    cy.screenshot();
     cy.getElementByDataTestsId('form-set').click();
   }
 
@@ -225,4 +232,13 @@ describe('View Edit Page: Upgrade VFModule', function () {
     serviceModel.service.uuid = "6e59c5de-f052-46fa-aa7e-2fca9d674c44";
     return serviceModel;
   }
+
+  function assertVfModuleActionInRedux(expectedState:string) {
+    cy.getReduxState().then((state) => {
+      const vfModule = state.service.serviceInstance['6e59c5de-f052-46fa-aa7e-2fca9d674c44']
+        .vnfs["VNF2_INSTANCE_ID"]
+        .vfModules["vf_vgeraldine0..VfVgeraldine..vflorence_vlc..module-1"]["2c1ca484-cbc2-408b-ab86-25a2c15ce280"];
+      expect(vfModule.action).to.equal(expectedState)
+    });
+  }
 });
index a014400..7a35491 100644 (file)
@@ -96,9 +96,7 @@ describe('Vnf popup', function () {
             "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
             "FLAG_SHOW_VERIFY_SERVICE": false,
             "FLAG_SERVICE_MODEL_CACHE": true,
-            "CREATE_INSTANCE_TEST": false,
             "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-            "EMPTY_DRAWING_BOARD_TEST": false,
             "FLAG_ADD_MSO_TESTAPI_FIELD": true
           },
           "type": "[FLAGS] Update"
index 40b37cb..d9561f1 100644 (file)
@@ -1,5 +1,4 @@
 {
-  "CREATE_INSTANCE_TEST": false,
   "EMPTY_DRAWING_BOARD_TEST": false,
   "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
   "FLAG_ADD_MSO_TESTAPI_FIELD": true,
index 2210d7c..5e14586 100644 (file)
@@ -20,10 +20,10 @@ import {MessageBoxService} from "../../../../../shared/components/messageBox/mes
 import {AvailableNodeIcons} from "../../../available-models-tree/available-models-tree.service";
 import {IframeService} from "../../../../../shared/utils/iframe.service";
 import {
-  deleteActionVfModuleInstance,
+  deleteActionVfModuleInstance, deleteVFModuleField,
   removeVfModuleInstance,
   undoDeleteVfModuleInstance,
-  undoUgradeVFModule,
+  undoUgradeVFModule, updateVFModuleField,
   updateVFModulePosition,
   upgradeVFModule
 } from "../../../../../shared/storeUtil/utils/vfModule/vfModule.actions";
@@ -354,7 +354,8 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
       },
       undoDelete: {
         method: (node, serviceModelId) => {
-          this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId))
+          this._store.dispatch(undoDeleteVfModuleInstance(node.data.dynamicModelName, node.parent.data.vnfStoreKey, serviceModelId));
+          this._store.dispatch(deleteVFModuleField(node.data.modelName,  node.parent.data.vnfStoreKey, node.data.servicedId ,node.data.dynamicModelName, 'retainAssignments'));
         },
         visible: (node) => this._sharedTreeService.shouldShowUndoDelete(node),
         enable: (node, serviceModelId) => this._sharedTreeService.shouldShowUndoDelete(node) && this._sharedTreeService.shouldShowDelete(node.parent) && !this._sharedTreeService.isServiceOnDeleteMode(serviceModelId)
@@ -386,9 +387,6 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
   }
 
   private upgradeVFM(serviceModelId, node) {
-    this._sharedTreeService.upgradeBottomUp(node, serviceModelId);
-    this._store.dispatch(upgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceModelId, node.data.dynamicModelName));
-
     if (FeatureFlagsService.getFlagState(Features.FLAG_2002_VFM_UPGRADE_ADDITIONAL_OPTIONS, this._store)) {
       this._iframeService.addClassOpenModal('content');
       this._dialogService.addDialog(GenericFormPopupComponent, {
@@ -401,10 +399,14 @@ export class VFModuleModelInfo implements ILevelNodeInfo {
           modelId: node.data.modelId,
           type: node.data.type,
           popupService: this._vfModuleUpgradePopupService,
+          vfModule : _.cloneDeep(node)
         },
-        node: node,
+        node,
         isUpdateMode: false
       });
+    }else {
+      this._sharedTreeService.upgradeBottomUp(node, serviceModelId);
+      this._store.dispatch(upgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceModelId ,node.data.dynamicModelName));
     }
   }
 
index c7c8d07..5d502c2 100644 (file)
@@ -84,7 +84,6 @@ describe('Network step service', () => {
         "genericModalCriteria": {"roles": ["-- select an option --", "network role 1", "network role 2", "network role 3", "network role 4", "network role 5"]},
         "name": null,
         "flags": {
-          "CREATE_INSTANCE_TEST": false,
           "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
           "FLAG_ENABLE_WEBPACK_MODERN_UI": true,
index 1412faa..53854ac 100644 (file)
@@ -467,7 +467,6 @@ function getStore() {
     "global": {
       "name": null,
       "flags": {
-        "CREATE_INSTANCE_TEST": false,
         "EMPTY_DRAWING_BOARD_TEST": false,
         "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
         "FLAG_ADD_MSO_TESTAPI_FIELD": true,
index 5b64aea..14d1466 100644 (file)
@@ -25,9 +25,7 @@ class MockAppStore<T> {
       "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
       "FLAG_SHOW_VERIFY_SERVICE": false,
       "FLAG_SERVICE_MODEL_CACHE": true,
-      "CREATE_INSTANCE_TEST": false,
       "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-      "EMPTY_DRAWING_BOARD_TEST": false,
       "FLAG_ADD_MSO_TESTAPI_FIELD": true
     },
     "type": "[FLAGS] Update"
index a6a29d1..f644a7c 100644 (file)
@@ -25,9 +25,7 @@ class MockAppStore<T> {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index f8a2da7..62c5ce3 100644 (file)
@@ -27,9 +27,7 @@ class MockAppStore<T> {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 66afac9..5c6e25c 100644 (file)
@@ -28,9 +28,7 @@ class MockAppStore<T> {
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 71d6611..49f1aa3 100644 (file)
@@ -25,8 +25,6 @@ class MockAppStore<T> {
         "type": "UPDATE_DRAWING_BOARD_STATUS",
         "drawingBoardStatus": "CREATE",
         "flags": {
-          "CREATE_INSTANCE_TEST": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_NETWORK_TO_ASYNC_INSTANTIATION": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true,
           "FLAG_SERVICE_MODEL_CACHE": false,
index ab70ea3..a36ed9c 100644 (file)
@@ -33,9 +33,7 @@ class MockAppStore<T>{
           "FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS": true,
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 54af063..c2024af 100644 (file)
@@ -33,10 +33,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index eb094ab..6c20bec 100644 (file)
@@ -30,10 +30,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 5b5acd3..f1e3af0 100644 (file)
@@ -31,10 +31,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 5b27b6e..296db34 100644 (file)
@@ -30,10 +30,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index a7f6d55..ff3f23f 100644 (file)
@@ -3,9 +3,34 @@ import {ITreeNode} from "angular-tree-component/dist/defs/api";
 import {FormGroup} from "@angular/forms";
 import {VfModulePopuopService} from "../vfModule/vfModule.popuop.service";
 import {FormPopupDetails} from "../../../../models/formControlModels/formPopupDetails.model";
+import {updateVFModuleField, upgradeVFModule} from "../../../../storeUtil/utils/vfModule/vfModule.actions";
+import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
+import {NgRedux} from "@angular-redux/store";
+import {AppState} from "../../../../store/reducers";
+import {BasicControlGenerator} from "../../../genericForm/formControlsServices/basic.control.generator";
+import {VfModuleControlGenerator} from "../../../genericForm/formControlsServices/vfModuleGenerator/vfModule.control.generator";
+import {IframeService} from "../../../../utils/iframe.service";
+import {DefaultDataGeneratorService} from "../../../../services/defaultDataServiceGenerator/default.data.generator.service";
+import {AaiService} from "../../../../services/aaiService/aai.service";
+import {BasicPopupService} from "../basic.popup.service";
+import {
+  FormControlModel
+} from "../../../../models/formControlModels/formControl.model";
+import {CheckboxFormControl} from "../../../../models/formControlModels/checkboxFormControl.model";
+import {FormControlType} from "../../../../models/formControlModels/formControlTypes.enum";
 
 @Injectable()
 export class VfModuleUpgradePopupService extends VfModulePopuopService {
+  constructor(protected _basicControlGenerator: BasicControlGenerator,
+              protected _vfModuleControlGenerator: VfModuleControlGenerator,
+              protected _iframeService: IframeService,
+              protected _defaultDataGeneratorService: DefaultDataGeneratorService,
+              protected _aaiService: AaiService,
+              protected _basicPopupService : BasicPopupService,
+              protected _store: NgRedux<AppState>,
+              private _sharedTreeService : SharedTreeService){
+    super(_basicControlGenerator, _vfModuleControlGenerator, _iframeService, _defaultDataGeneratorService, _aaiService, _basicPopupService,_store);
+  }
   node: ITreeNode;
 
   getGenericFormPopupDetails(serviceId: string, vnfStoreKey: string, vfModuleStoreKey: string, node: ITreeNode, uuidData: Object, isUpdateMode: boolean): FormPopupDetails {
@@ -13,11 +38,31 @@ export class VfModuleUpgradePopupService extends VfModulePopuopService {
   }
 
   getDynamicInputs = () => [];
-  getControls = () => [];
+
+  getControls = () : FormControlModel[] => {
+    return [
+      new CheckboxFormControl({
+        type: FormControlType.CHECKBOX,
+        controlName: 'retainAssignments',
+        displayName: 'Retain Assignments',
+        dataTestId: 'retainAssignments',
+        value: true,
+        validations: []
+      })
+    ];
+  };
+
+
   getTitle = (): string => 'Upgrade Module';
 
   onSubmit(that, form: FormGroup) {
-    //that.storeVFModule(that, form.value);
+    const node = that.uuidData.vfModule;
+    const serviceInstanceId: string = that.uuidData.serviceId;
+
+    this._store.dispatch(upgradeVFModule(node.data.modelName,  node.parent.data.vnfStoreKey, serviceInstanceId ,node.data.dynamicModelName));
+    this._sharedTreeService.upgradeBottomUp(node, serviceInstanceId);
+    this._store.dispatch(updateVFModuleField(node.data.modelName,  node.parent.data.vnfStoreKey, serviceInstanceId ,node.data.dynamicModelName, 'retainAssignments', form.controls['retainAssignments'].value));
+
     this.postSubmitIframeMessage(that);
     this.onCancel(that, form);
   }
index 17054c7..5850d25 100644 (file)
@@ -13,6 +13,7 @@ import {SdcUiServices} from "onap-ui-angular";
 import {FeatureFlagsService} from "../../../../services/featureFlag/feature-flags.service";
 import {getTestBed, TestBed} from "@angular/core/testing";
 import {VfModuleUpgradePopupService} from "./vfModule.upgrade.popuop.service";
+import {SharedTreeService} from "../../../../../drawingBoard/service-planning/objectsToTree/shared.tree.service";
 
 class MockModalService<T> {
 }
@@ -52,6 +53,7 @@ describe('VFModule popup service', () => {
         AaiService,
         LogService,
         BasicPopupService,
+        SharedTreeService,
         {provide: FeatureFlagsService, useClass: MockFeatureFlagsService},
         {provide: NgRedux, useClass: MockReduxStore},
         {provide: HttpClient, useClass: MockAppStore},
@@ -73,4 +75,15 @@ describe('VFModule popup service', () => {
     expect(service.getTitle()).toBe("Upgrade Module")
   });
 
+  test('get controls should return retainAssignments control with false i', ()=> {
+
+    const controls = service.getControls();
+
+    const retainAssignmentsControl = controls.find((control)=>{
+      return control.controlName === 'retainAssignments';
+    });
+
+    expect(retainAssignmentsControl).toBeDefined();
+    expect(retainAssignmentsControl.value).toBeTruthy();
+  });
 });
index b1bbc92..5f03473 100644 (file)
@@ -30,10 +30,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 075c972..f0d50fd 100644 (file)
@@ -30,10 +30,8 @@ class MockReduxStore<T> {
           "FLAG_SHOW_VERIFY_SERVICE": false,
           "FLAG_SERVICE_MODEL_CACHE": true,
           "FLAG_ADVANCED_PORTS_FILTER": true,
-          "CREATE_INSTANCE_TEST": false,
           "FLAG_SETTING_DEFAULTS_IN_DRAWING_BOARD": false,
           "FLAG_REGION_ID_FROM_REMOTE": true,
-          "EMPTY_DRAWING_BOARD_TEST": false,
           "FLAG_ADD_MSO_TESTAPI_FIELD": true
         },
         "type": "[FLAGS] Update"
index 59e5ee1..70c10c4 100644 (file)
@@ -9,6 +9,8 @@ export enum VfModuleActions {
   UPDATE_VFMODULE_POSITION = "UPDATE_VFMODULE_POSITION",
   UPGRADE_VFMODULE = "UPGRADE_VFMODULE",
   UNDO_UPGRADE_VFMODULE_ACTION = "UNDO_UPGRADE_VFMODULE_ACTION",
+  UPDATE_VFMODULE_FEILD = "UPDATE_VFMODULE_FEILD",
+  DELETE_VFMODULE_FEILD = "DELETE_VFMODULE_FEILD",
 }
 
 
@@ -62,6 +64,23 @@ export interface UndoUpgradeVfModuleInstanceAction extends Action {
   dynamicModelName: string;
 }
 
+export interface UpdateVFModuleField extends Action {
+  modelName : string;
+  vnfStoreKey : string;
+  serviceId: string;
+  dynamicModelName: string;
+  fieldName: string;
+  fieldValue : any;
+}
+
+export interface DeleteVFModuleField extends Action {
+  modelName : string;
+  vnfStoreKey : string;
+  serviceId: string;
+  dynamicModelName: string;
+  deleteFieldName: string;
+}
+
 export interface UndoDeleteActionVfModuleInstanceAction extends Action {
   dynamicModelName: string;
   vnfStoreKey : string;
@@ -132,3 +151,22 @@ export const undoUgradeVFModule: ActionCreator<UndoUpgradeVfModuleInstanceAction
   vnfStoreKey,
   serviceId
 });
+
+export const updateVFModuleField: ActionCreator<UpdateVFModuleField> = (modelName, vnfStoreKey, serviceId, dynamicModelName, fieldName, fieldValue) => ({
+  type: VfModuleActions.UPDATE_VFMODULE_FEILD,
+  dynamicModelName,
+  modelName,
+  vnfStoreKey,
+  serviceId,
+  fieldName,
+  fieldValue
+});
+
+export const deleteVFModuleField: ActionCreator<DeleteVFModuleField> = (modelName, vnfStoreKey, serviceId, dynamicModelName, deleteFieldName) => ({
+  type: VfModuleActions.DELETE_VFMODULE_FEILD,
+  dynamicModelName,
+  modelName,
+  vnfStoreKey,
+  serviceId,
+  deleteFieldName
+});
index ee0edb0..7b890b7 100644 (file)
@@ -1,9 +1,9 @@
 import {
   CreateVFModuleInstanceAction,
-  DeleteActionVfModuleInstanceAction,
+  DeleteActionVfModuleInstanceAction, DeleteVFModuleField,
   DeleteVfModuleInstanceAction,
   UndoDeleteActionVfModuleInstanceAction,
-  UpdateVFModluePosition,
+  UpdateVFModluePosition, UpdateVFModuleField,
   UpgradeVfModuleInstanceAction,
   VfModuleActions
 } from "./vfModule.actions";
@@ -14,12 +14,13 @@ import {ServiceInstanceActions} from "../../../models/serviceInstanceActions";
 
 describe('vfModuleReducer', () => {
   test('#REMOVE_VNF_MODULE_INSTANCE : should delete existing vnf module by dynamicModelName', () => {
-    let state = vfModuleReducer(<any>{serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vfName' : {
-                vfModules : {
-                  'modelName' : {
+    let state = vfModuleReducer(<any>{
+        serviceInstance: {
+          'serviceModelId': {
+            vnfs: {
+              'vfName': {
+                vfModules: {
+                  'modelName': {
                     'dynamicModelName1': {},
                     'dynamicModelName2': {},
                   }
@@ -27,13 +28,14 @@ describe('vfModuleReducer', () => {
               }
             }
           }
-        }},
+        }
+      },
       <DeleteVfModuleInstanceAction>{
         type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
-        modelName : 'modelName',
-        vfName : 'vfName',
-        vnfStoreKey : 'vfName',
-        serviceModelId : 'serviceModelId',
+        modelName: 'modelName',
+        vfName: 'vfName',
+        vnfStoreKey: 'vfName',
+        serviceModelId: 'serviceModelId',
         dynamicModelName: 'dynamicModelName1'
       });
 
@@ -43,26 +45,27 @@ describe('vfModuleReducer', () => {
   });
 
   test('#DELETE_LAST_VNF_MODULE_INSTANCE : should delete existing vnf module', () => {
-    let state = vfModuleReducer(<any>{serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vfName' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName': {
-                    }
+    let state = vfModuleReducer(<any>{
+        serviceInstance: {
+          'serviceModelId': {
+            vnfs: {
+              'vfName': {
+                vfModules: {
+                  'modelName': {
+                    'dynamicModelName': {}
                   }
                 }
               }
             }
           }
-        }},
+        }
+      },
       <DeleteVfModuleInstanceAction>{
         type: VfModuleActions.REMOVE_VNF_MODULE_INSTANCE,
-        modelName : 'modelName',
-        vfName : 'vfName',
-        vnfStoreKey : 'vfName',
-        serviceModelId : 'serviceModelId',
+        modelName: 'modelName',
+        vfName: 'vfName',
+        vnfStoreKey: 'vfName',
+        serviceModelId: 'serviceModelId',
         dynamicModelName: 'dynamicModelName'
       });
 
@@ -70,28 +73,29 @@ describe('vfModuleReducer', () => {
     expect(state.serviceInstance['serviceModelId'].vnfs['vfName'].vfModules['modelName']).not.toBeDefined();
   });
 
-  test('#CREATE_VF_MODULE: should create new vfModule to existing VNF', ()=>{
-    let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
+  test('#CREATE_VF_MODULE: should create new vfModule to existing VNF', () => {
+    let vfModuleInstance: VfModuleInstance = new VfModuleInstance();
     vfModuleInstance.instanceName = 'instanceName';
     vfModuleInstance.isMissingData = false;
     vfModuleInstance.volumeGroupName = 'volumeGroupName';
-    let vfModule = vfModuleReducer(<any>{serviceInstance : {
-          'serviceUuid' : {
-            vnfs : {
-              'vnfStoreKey' : {
-                'vfModules' : {
-                }
+    let vfModule = vfModuleReducer(<any>{
+        serviceInstance: {
+          'serviceUuid': {
+            vnfs: {
+              'vnfStoreKey': {
+                'vfModules': {}
               }
             }
           }
-        }},
+        }
+      },
       <CreateVFModuleInstanceAction>{
         type: VfModuleActions.CREATE_VF_MODULE,
-        vfId : 'vfId',
-        vfInstance : new VfModuleInstance(),
-        vnfStoreKey : 'vnfStoreKey',
-        serviceUuid : 'serviceUuid',
-        index : 1
+        vfId: 'vfId',
+        vfInstance: new VfModuleInstance(),
+        vnfStoreKey: 'vnfStoreKey',
+        serviceUuid: 'serviceUuid',
+        index: 1
       }).serviceInstance['serviceUuid'].vnfs['vnfStoreKey'].vfModules;
 
     let firstVfModuleName = Object.keys(vfModule)[0];
@@ -99,23 +103,64 @@ describe('vfModuleReducer', () => {
     expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
   });
 
-  test('#UPDATE_VF_MODULE: should update existing VFModule', ()=>{
-    let vfModuleInstance : VfModuleInstance = new VfModuleInstance();
-    vfModuleInstance.instanceName = 'instanceName';
-    vfModuleInstance.isMissingData = false;
-    vfModuleInstance.volumeGroupName = 'volumeGroupName';
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
+  test('#UPDATE_VFMODULE_FEILD: should update field with some value', () => {
+    const newFieldName = 'newFieldName';
+    const newFieldValue = 'newFieldValue';
+    let oldState = {
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vnfStoreKey': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName1': {
+                    isMissingData: true,
+                    action: 'None'
+                  },
+                  'dynamicModelName2': {},
+                }
+              }
+            }
+          }
+        }
+      }
+    };
+
+    let newState = vfModuleReducer(<any>oldState,
+      <UpdateVFModuleField>{
+        type: VfModuleActions.UPDATE_VFMODULE_FEILD,
+        dynamicModelName: 'dynamicModelName1',
+        vnfStoreKey: 'vnfStoreKey',
+        serviceId: 'serviceModelId',
+        modelName: 'modelName',
+        fieldName: newFieldName,
+        fieldValue: newFieldValue
+      });
+
+    let vfModule = newState.serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+
+    expect(vfModule[newFieldName]).toEqual(newFieldValue);
+  });
+
+  test('#DELETE_VFMODULE_FEILD: should update field with some value', () => {
+      const deleteFieldName = 'deleteFieldName';
+      let oldState = {
+        serviceHierarchy: {
+          'serviceModelId': {}
         },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vfName' : {
-                vfModules : {
-                  'modelName' : {
+        serviceInstance: {
+          'serviceModelId': {
+            vnfs: {
+              'vnfStoreKey': {
+                vfModules: {
+                  'modelName': {
                     'dynamicModelName1': {
-                      isMissingData : true
+                      isMissingData: true,
+                      [deleteFieldName]: true,
+                      action: 'None'
                     },
                     'dynamicModelName2': {},
                   }
@@ -123,192 +168,197 @@ describe('vfModuleReducer', () => {
               }
             }
           }
-        }},
-      <CreateVFModuleInstanceAction>{
-        type: VfModuleActions.UPDATE_VF_MODULE,
-        vfId : 'modelName',
-        vfInstance : new VfModuleInstance(),
-        vnfStoreKey : 'vfName',
-        dynamicModelName : 'dynamicModelName1',
-        serviceUuid : 'serviceModelId',
-        index : 1
-      }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules;
+        }
+      };
+      let newState = vfModuleReducer(<any>oldState,
+    <DeleteVFModuleField>{
+      type: VfModuleActions.DELETE_VFMODULE_FEILD,
+      dynamicModelName: 'dynamicModelName1',
+      vnfStoreKey: 'vnfStoreKey',
+      serviceId: 'serviceModelId',
+      modelName: 'modelName',
+      deleteFieldName: deleteFieldName,
+    });
 
-    let firstVfModuleName = Object.keys(vfModule)[0];
-    expect(vfModule[firstVfModuleName]).toBeDefined();
-    expect(vfModule[firstVfModuleName].isMissingData).toBeFalsy();
-  });
+  let vfModule = newState.serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
 
+  expect(vfModule[deleteFieldName]).toBeUndefined();
+});
 
-  test('#UPDATE_VFMODULE_POSITION: should update position', ()=>{
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
-        },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vfName' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName': {
-                      isMissingData : true
-                    }
+test('#UPDATE_VFMODULE_POSITION: should update position', () => {
+  let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vfName': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName': {
+                    isMissingData: true
                   }
                 }
               }
             }
           }
-        }},
-      <UpdateVFModluePosition>{
-        type: VfModuleActions.UPDATE_VFMODULE_POSITION,
-        node: {
-          position : 1,
-          dynamicModelName : "dynamicModelName",
-          modelName : "modelName"
-        },
-        instanceId : "serviceModelId",
-        vnfStoreKey : "vfName"
+        }
+      }
+    },
+    <UpdateVFModluePosition>{
+      type: VfModuleActions.UPDATE_VFMODULE_POSITION,
+      node: {
+        position: 1,
+        dynamicModelName: "dynamicModelName",
+        modelName: "modelName"
+      },
+      instanceId: "serviceModelId",
+      vnfStoreKey: "vfName"
 
-      }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules["modelName"]["dynamicModelName"];
-
-    expect(vfModule.position).toEqual(1);
-  });
+    }).serviceInstance['serviceModelId'].vnfs['vfName'].vfModules["modelName"]["dynamicModelName"];
 
+  expect(vfModule.position).toEqual(1);
+});
 
-  test('#DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
-        },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vnfStoreKey' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName1': {
-                      isMissingData : true,
-                      action : 'None'
-                    },
-                    'dynamicModelName2': {},
-                  }
+test('#DELETE_ACTION_VF_MODULE_INSTANCE', () => {
+  let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vnfStoreKey': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName1': {
+                    isMissingData: true,
+                    action: 'None'
+                  },
+                  'dynamicModelName2': {},
                 }
               }
             }
           }
-        }},
-      <DeleteActionVfModuleInstanceAction>{
-        type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
-        dynamicModelName: 'dynamicModelName1',
-        vnfStoreKey : 'vnfStoreKey',
-        serviceId: 'serviceModelId'
-      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+        }
+      }
+    },
+    <DeleteActionVfModuleInstanceAction>{
+      type: VfModuleActions.DELETE_ACTION_VF_MODULE_INSTANCE,
+      dynamicModelName: 'dynamicModelName1',
+      vnfStoreKey: 'vnfStoreKey',
+      serviceId: 'serviceModelId'
+    }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
 
-    console.log(vfModule.action);
-    expect(vfModule).toBeDefined();
-    expect(vfModule.isMissingData).toBeTruthy();
-    expect(vfModule.action).toEqual(ServiceInstanceActions.None_Delete);
-  });
+  console.log(vfModule.action);
+  expect(vfModule).toBeDefined();
+  expect(vfModule.isMissingData).toBeTruthy();
+  expect(vfModule.action).toEqual(ServiceInstanceActions.None_Delete);
+});
 
-  test('#UNDO_DELETE_ACTION_VF_MODULE_INSTANCE', ()=>{
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
-        },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vnfStoreKey' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName1': {
-                      isMissingData : true,
-                      action : 'None_Delete'
-                    },
-                    'dynamicModelName2': {},
-                  }
+test('#UNDO_DELETE_ACTION_VF_MODULE_INSTANCE', () => {
+  let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vnfStoreKey': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName1': {
+                    isMissingData: true,
+                    action: 'None_Delete'
+                  },
+                  'dynamicModelName2': {},
                 }
               }
             }
           }
-        }},
-      <UndoDeleteActionVfModuleInstanceAction>{
-        type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
-        dynamicModelName: 'dynamicModelName1',
-        vnfStoreKey : 'vnfStoreKey',
-        serviceId: 'serviceModelId'
-      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+        }
+      }
+    },
+    <UndoDeleteActionVfModuleInstanceAction>{
+      type: VfModuleActions.UNDO_DELETE_ACTION_VF_MODULE_INSTANCE,
+      dynamicModelName: 'dynamicModelName1',
+      vnfStoreKey: 'vnfStoreKey',
+      serviceId: 'serviceModelId'
+    }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
 
-    console.log(vfModule.action);
-    expect(vfModule).toBeDefined();
-    expect(vfModule.action).toEqual(ServiceInstanceActions.None);
-  });
+  console.log(vfModule.action);
+  expect(vfModule).toBeDefined();
+  expect(vfModule.action).toEqual(ServiceInstanceActions.None);
+});
 
-  test('#UPGRADE_VFMODULE', ()=>{
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
-        },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vnfStoreKey' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName1': {
-                      isMissingData : true,
-                      action : 'None'
-                    },
-                    'dynamicModelName2': {},
-                  }
+test('#UPGRADE_VFMODULE', () => {
+  let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vnfStoreKey': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName1': {
+                    isMissingData: true,
+                    action: 'None'
+                  },
+                  'dynamicModelName2': {},
                 }
               }
             }
           }
-        }},
-      <UpgradeVfModuleInstanceAction>{
-        type: VfModuleActions.UPGRADE_VFMODULE,
-        dynamicModelName: 'dynamicModelName1',
-        vnfStoreKey : 'vnfStoreKey',
-        serviceId: 'serviceModelId',
-        modelName: 'modelName'
-      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
+        }
+      }
+    },
+    <UpgradeVfModuleInstanceAction>{
+      type: VfModuleActions.UPGRADE_VFMODULE,
+      dynamicModelName: 'dynamicModelName1',
+      vnfStoreKey: 'vnfStoreKey',
+      serviceId: 'serviceModelId',
+      modelName: 'modelName'
+    }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
 
-    expect(vfModule.action).toEqual(ServiceInstanceActions.None_Upgrade);
-  });
+  expect(vfModule.action).toEqual(ServiceInstanceActions.None_Upgrade);
+});
 
-  test('#UNDO_UPGRADE_VFMODULE', ()=>{
-    let vfModule = vfModuleReducer(<any>{
-        serviceHierarchy : {
-          'serviceModelId' : {}
-        },
-        serviceInstance : {
-          'serviceModelId' : {
-            vnfs : {
-              'vnfStoreKey' : {
-                vfModules : {
-                  'modelName' : {
-                    'dynamicModelName1': {
-                      isMissingData : true,
-                      action : 'None_Upgrade'
-                    },
-                    'dynamicModelName2': {},
-                  }
+test('#UNDO_UPGRADE_VFMODULE', () => {
+  let vfModule = vfModuleReducer(<any>{
+      serviceHierarchy: {
+        'serviceModelId': {}
+      },
+      serviceInstance: {
+        'serviceModelId': {
+          vnfs: {
+            'vnfStoreKey': {
+              vfModules: {
+                'modelName': {
+                  'dynamicModelName1': {
+                    isMissingData: true,
+                    action: 'None_Upgrade'
+                  },
+                  'dynamicModelName2': {},
                 }
               }
             }
           }
-        }},
-      <UpgradeVfModuleInstanceAction>{
-        type: VfModuleActions.UNDO_UPGRADE_VFMODULE_ACTION,
-        dynamicModelName: 'dynamicModelName1',
-        vnfStoreKey : 'vnfStoreKey',
-        serviceId: 'serviceModelId',
-        modelName: 'modelName'
-      }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
-
-    expect(vfModule.action).toEqual(ServiceInstanceActions.None);
-  });
+        }
+      }
+    },
+    <UpgradeVfModuleInstanceAction>{
+      type: VfModuleActions.UNDO_UPGRADE_VFMODULE_ACTION,
+      dynamicModelName: 'dynamicModelName1',
+      vnfStoreKey: 'vnfStoreKey',
+      serviceId: 'serviceModelId',
+      modelName: 'modelName'
+    }).serviceInstance['serviceModelId'].vnfs['vnfStoreKey'].vfModules['modelName']['dynamicModelName1'];
 
+  expect(vfModule.action).toEqual(ServiceInstanceActions.None);
 });
+
+})
+;
index a7aadba..1bb2b15 100644 (file)
@@ -1,10 +1,10 @@
 import {Action} from "redux";
 import * as _ from "lodash";
 import {
-  CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction,
-  DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition,
+  CreateVFModuleInstanceAction, DeleteActionVfModuleInstanceAction, DeleteVFModuleField,
+  DeleteVfModuleInstanceAction, UndoDeleteActionVfModuleInstanceAction, UpdateVFModluePosition, UpdateVFModuleField,
   UpdateVFModuleInstanceAction, UpgradeVfModuleInstanceAction,
-  VfModuleActions
+  VfModuleActions,
 } from "./vfModule.actions";
 import {ServiceInstance} from "../../../models/serviceInstance";
 import {VfModuleMap} from "../../../models/vfModulesMap";
@@ -145,6 +145,26 @@ export function vfModuleReducer(state: ServiceState , action: Action) : ServiceS
       }
       return clonedState;
     }
+    case VfModuleActions.UPDATE_VFMODULE_FEILD : {
+      let clonedState = _.cloneDeep(state);
+      let updateFieldAction =  <UpdateVFModuleField> action;
+
+        clonedState.serviceInstance[updateFieldAction.serviceId]
+          .vnfs[updateFieldAction.vnfStoreKey]
+          .vfModules[updateFieldAction.modelName][updateFieldAction.dynamicModelName][updateFieldAction.fieldName] =  updateFieldAction.fieldValue;
+
+      return clonedState;
+    }
+    case VfModuleActions.DELETE_VFMODULE_FEILD : {
+      let clonedState = _.cloneDeep(state);
+      let deleteAction =  <DeleteVFModuleField> action;
+
+      delete clonedState.serviceInstance[deleteAction.serviceId]
+        .vnfs[deleteAction.vnfStoreKey]
+        .vfModules[deleteAction.modelName][deleteAction.dynamicModelName][deleteAction.deleteFieldName];
+
+      return clonedState;
+    }
   }
 }