Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / webapp / app / vid / scripts / controller / aaiSubscriberController.js
index d58b83f..ec4799b 100755 (executable)
@@ -20,8 +20,8 @@
 \r
 "use strict";\r
 \r
-appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "$uibModal", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService", "MsoService", "OwningEntityService", "$q",\r
-    function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, $uibModal, VIDCONFIGURATION, UtilityService, vidService, AaiService, MsoService, OwningEntityService, $q) {\r
+appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER", "DataService", "PropertyService", "$scope", "$http", "$timeout", "$location", "$log", "$route", "$uibModal", "VIDCONFIGURATION", "UtilityService", "vidService", "AaiService", "MsoService", "OwningEntityService", "AsdcService","featureFlags", "$q", "_",\r
+    function (COMPONENT, FIELD, PARAMETER, DataService, PropertyService, $scope, $http, $timeout, $location, $log, $route, $uibModal, VIDCONFIGURATION, UtilityService, vidService, AaiService, MsoService, OwningEntityService, AsdcService, featureFlags, $q, _) {\r
 \r
         $scope.showVnfDetails = function (vnf) {\r
             console.log("showVnfDetails");\r
@@ -44,6 +44,8 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
         $scope.serviceTypes = [FIELD.PROMPT.SELECT_SERVICE, COMPONENT.UCPE_VMS, COMPONENT.SDN_L3_BONDING, COMPONENT.SDN_ETHERNET_INTERNET];\r
         $scope.defaultSubscriberName = [FIELD.PROMPT.SELECT_SUB];\r
 \r
+        $scope.verifyButtonEnabled = true;\r
+\r
         var callbackFunction = function (response) {\r
             alert(response);\r
         };\r
@@ -172,7 +174,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     $scope.isSpinnerVisible = false;\r
                     $scope.isProgressVisible = false;\r
                 } else {\r
-                    $scope.status = "Failed to get service models from ASDC.";\r
+                    $scope.status = "Failed to get service models from SDC.";\r
                     $scope.error = true;\r
                     $scope.isSpinnerVisible = false;\r
                 }\r
@@ -223,7 +225,9 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     $scope.createType = "a la carte";\r
                     var broadcastType = "createComponent";\r
 \r
-                    if (UtilityService.arrayContains(VIDCONFIGURATION.MACRO_SERVICES, serviceModel.service.invariantUuid)) {\r
+                    DataService.setShouldIncludeInAsyncInstantiationFlow(AsdcService.shouldTakeTheAsyncInstantiationFlow(serviceModel));\r
+\r
+                    if (AsdcService.isMacro(serviceModel)) {\r
                         DataService.setALaCarte(false);\r
                         $scope.createType = "Macro";\r
                         var convertedAsdcModel = UtilityService.convertModel(serviceModel);\r
@@ -247,7 +251,6 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                             "serviceRole": serviceModel.service.serviceRole\r
                         });\r
                     }\r
-                    ;\r
 \r
                     $scope.$broadcast(broadcastType, {\r
                         componentId: COMPONENT.SERVICE,\r
@@ -442,9 +445,6 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             var polls = PropertyService.retrieveMsoMaxPolls();\r
             PropertyService.setMsoMaxPolls(polls);\r
 \r
-            //PropertyService.setMsoBaseUrl("testmso");\r
-            PropertyService.setServerResponseTimeoutMsec();\r
-\r
             /*\r
              * Common parameters that would typically be set when the page is\r
              * displayed for a specific service instance id.\r
@@ -464,6 +464,63 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             $scope.setProgress(2); // Show "a little" progress\r
         }\r
 \r
+        function getRelatedInstanceGroupsByVnfId(genericVnf) {\r
+            var model = vidService.getModel();\r
+            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
+                            AaiService.getInstanceGroupsByVNFInstanceId(genericVnf.nodeId,\r
+                                function (response) { //success\r
+                                    handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf);\r
+                                },\r
+                                function (response) { //failure\r
+                                    $scope.showError(FIELD.ERROR.AAI);\r
+                                    $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;\r
+                                    $scope.errorDetails = response.data;\r
+                                }\r
+                            )\r
+                        }\r
+                    }\r
+                })\r
+            }\r
+        }\r
+\r
+        function resolveModelDataIfMissing(modelVersionId) {\r
+            var model = vidService.getModel();\r
+            if (model && model.service && model.service.uuid === modelVersionId) {\r
+                return $q.resolve(); // no need to resolve anything\r
+            } else {\r
+                // resolve model and value of isPermitted\r
+                return resolveIfIsPermitted()\r
+                    .then(function() {\r
+                        return getAsdcModelByVersionId(modelVersionId);\r
+                    })\r
+            }\r
+        }\r
+\r
+        function resolveIfIsPermitted() {\r
+            var deferred = $q.defer();\r
+            AaiService.searchServiceInstances(\r
+                '?subscriberId=' + $location.search().subscriberId +\r
+                '&serviceInstanceIdentifier=' + $location.search().serviceInstanceId)\r
+                .then(function (response) {\r
+                    if (response.displayData && response.displayData.length) {\r
+                        var first = response.displayData[0];\r
+                        $scope.isPermitted = first.isPermitted;\r
+                        deferred.resolve(first.isPermitted);\r
+                    } else {\r
+                        deferred.reject("some error while resolveIfIsPermitted")\r
+                    }\r
+                });\r
+\r
+            return deferred.promise;\r
+        }\r
+\r
+        var serviceNetworkVlans = [];\r
+        var vnfNetworksAndVlans = [];\r
+\r
         $scope.getComponentList = function (event, request) {\r
 \r
             $scope.isSpinnerVisible = true;\r
@@ -484,34 +541,79 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
             //$scope.getAsdcModel($location.search().modelUuid);\r
 \r
-            $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;\r
-            $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
-\r
-            AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId,\r
-                function (response) { //success\r
-                    $scope.handleInitialResponseInventoryItems(response);\r
-                    $scope.setProgress(100); // done\r
-                    $scope.status = FIELD.STATUS.DONE;\r
-                    $scope.isSpinnerVisible = false;\r
-                },\r
-                function (response) { //failure\r
-                    $scope.showError(FIELD.ERROR.AAI);\r
-                    $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;\r
-                    $scope.errorDetails = response.data;\r
-                }\r
-            );\r
-\r
-        }\r
+            //make sure view/edit don't open new deploy service popup\r
+            DataService.setShouldIncludeInAsyncInstantiationFlow(false);\r
+\r
+            return getModelVersionIdForServiceInstance({\r
+                globalCustomerId: $location.search().subscriberId,\r
+                serviceInstanceId: $location.search().serviceInstanceId,\r
+                aaiModelVersionId: $location.search().aaiModelVersionId\r
+            })\r
+                .then(resolveModelDataIfMissing)\r
+                .then($scope.prepareScopeWithModel)\r
+                .then(function () {\r
+                    return AaiService.getVlansByNetworksMapping($scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId, $scope.service.model.service.uuid);\r
+                })\r
+                .then(function (vlanByNetwork) {\r
+                    serviceNetworkVlans = vlanByNetwork.serviceNetworks ? vlanByNetwork.serviceNetworks : [];\r
+                    vnfNetworksAndVlans =  vlanByNetwork.vnfNetworks ? vlanByNetwork.vnfNetworks : [];\r
+                    $log.debug('vlanByNetwork', vlanByNetwork);\r
+                    $scope.namedQueryId = VIDCONFIGURATION.COMPONENT_LIST_NAMED_QUERY_ID;\r
+                    $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
+\r
+                    $scope.hasFabricConfigurations = !UtilityService.isObjectEmpty($scope.service.model.fabricConfigurations);\r
+                    return AaiService.runNamedQuery($scope.namedQueryId, $scope.globalCustomerId, $scope.serviceType, $scope.serviceInstanceId,\r
+                        function (response) { //success\r
+                            $scope.handleInitialResponseInventoryItems(response);\r
+                            $scope.setProgress(100); // done\r
+                            $scope.status = FIELD.STATUS.DONE;\r
+                            $scope.isSpinnerVisible = false;\r
+                            //TODO\r
+                        },\r
+                        function (response) { //failure\r
+                            $scope.showError(FIELD.ERROR.AAI);\r
+                            $scope.errorMsg = FIELD.ERROR.FETCHING_SERVICE_INSTANCE_DATA + response.status;\r
+                            $scope.errorDetails = response.data;\r
+                        }\r
+                    );\r
+                });\r
+        };\r
 \r
         $scope.handleServerError = function (response, status) {\r
             alert(response.statusText);\r
+        };\r
+\r
+        function handleGetRelatedInstanceGroupsResponseForVnf(response, genericVnf) {\r
+            _.forEach(response.data, function (instanceGroup) {\r
+                var newInstanceGroup = {\r
+                    name: instanceGroup.name,\r
+                    type: instanceGroup.type\r
+                };\r
+                genericVnf.instanceGroups.push(newInstanceGroup);\r
+            });\r
         }\r
 \r
+\r
+\r
         function getModelVersionIdForServiceInstance(instance) {\r
             if (UtilityService.hasContents(instance.aaiModelVersionId)) {\r
                 return $q.resolve(instance.aaiModelVersionId);\r
+            } else if ($scope.modelVersionIdForServiceInstance\r
+                && $scope.modelVersionIdForServiceInstance.globalCustomerId === instance.globalCustomerId\r
+                && $scope.modelVersionIdForServiceInstance.serviceInstanceId === instance.serviceInstanceId\r
+            ) {\r
+                return $q.resolve($scope.modelVersionIdForServiceInstance.aaiModelVersionId);\r
             } else {\r
-                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId);\r
+                $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
+                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId)\r
+                    .then(function (aaiModelVersionId) {\r
+                        $scope.modelVersionIdForServiceInstance = {\r
+                            globalCustomerId: instance.globalCustomerId,\r
+                            serviceInstanceId: instance.serviceInstanceId,\r
+                            aaiModelVersionId: aaiModelVersionId\r
+                        };\r
+                        return $q.resolve(aaiModelVersionId);\r
+                    });\r
             }\r
         }\r
 \r
@@ -524,13 +626,26 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
 \r
             function navigateToViewEditPage() {\r
-                window.location.href =\r
-                    COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId +\r
+                window.location.href = AsdcService.shouldTakeTheDrawingBoardViewEdit(vidService.getModel()) ?\r
+                    drawingBoardViewEditUrl() : oldViewEditUrl();\r
+            }\r
+\r
+            function oldViewEditUrl() {\r
+                return COMPONENT.INSTANTIATE_ROOT_PATH + disData.globalCustomerId +\r
                     COMPONENT.SUBSCRIBERNAME_SUB_PATH + disData.subscriberName +\r
                     COMPONENT.SERVICETYPE_SUB_PATH + disData.serviceType +\r
                     COMPONENT.SERVICEINSTANCEID_SUB_PATH + disData.serviceInstanceId +\r
+                    COMPONENT.MODELVERSIONID_SUB_PATH + disData.aaiModelVersionId +\r
                     COMPONENT.IS_PERMITTED_SUB_PATH + disData.isPermitted;\r
             }\r
+\r
+            function drawingBoardViewEditUrl() {\r
+                return 'serviceModels.htm#/servicePlanning/EDIT?' +\r
+                'serviceModelId=' +     disData.aaiModelVersionId +\r
+                '&subscriberId=' +      disData.globalCustomerId  +\r
+                '&serviceType=' +       disData.serviceType      +\r
+                '&serviceInstanceId=' + disData.serviceInstanceId;\r
+            }\r
         };\r
 \r
         function handleErrorGettingModelVersion(err) {\r
@@ -547,13 +662,22 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 method: 'GET',\r
                 url: pathQuery\r
             }).then(function successCallback(response) {\r
-                vidService.setModel(response.data);\r
-                console.log("aaiSubscriber getAsdcModel DONE!!!!");\r
-            }, function errorCallback(response) {\r
+                if (response.headers()['content-type'].includes('json')) {\r
+                    vidService.setModel(response.data);\r
+                    console.log("aaiSubscriber getAsdcModel DONE!!!!");\r
+                } else {\r
+                    // the response is erroneous\r
+                    console.log("aaiSubscriber getAsdcModel BAD RESPONSE");\r
+                    errorCallback(response);\r
+                    return $q.reject()\r
+                }\r
+            }, errorCallback);\r
+\r
+            function errorCallback(response) {\r
                 $log.error("aaiSubscriber getAsdcModel - " + FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId);\r
                 $scope.errorMsg = FIELD.ERROR.NO_MATCHING_MODEL_AAI + aaiModelVersionId;\r
                 alert($scope.errorMsg);\r
-            });\r
+            }\r
         }\r
 \r
         function returnMatchingServiceSubscription(serviceSubs, serviceId){\r
@@ -580,15 +704,20 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 });\r
         }\r
 \r
+        $scope.isConfigurationDataAvailiable = function (configuration) {\r
+            $log.debug(configuration);\r
+            return configuration.configData && (!configuration.configData.errorDescription);\r
+        }\r
+\r
         $scope.isActivateDeactivateEnabled = function(btnType) {\r
-            if ($scope.serviceOrchestrationStatus && $scope.service.model.service.serviceType.toLowerCase().indexOf('transport') != -1) {\r
+            if ($scope.serviceOrchestrationStatus) {\r
+                var status = $scope.serviceOrchestrationStatus.toLowerCase();\r
                 switch (btnType) {\r
                     case "activate":\r
-                        return $scope.serviceOrchestrationStatus === 'Created' ||\r
-                            $scope.serviceOrchestrationStatus.toLowerCase() === 'pendingdelete' || $scope.serviceOrchestrationStatus.toLowerCase() === 'pending-delete';\r
+                        return _.includes(COMPONENT.ACTIVATE_SERVICE_STATUSES, status);\r
                         break;\r
                     case "deactivate":\r
-                        return $scope.serviceOrchestrationStatus === 'Active';\r
+                        return status === 'active';\r
                         break;\r
                 }\r
             }\r
@@ -596,6 +725,68 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             return false;\r
         };\r
 \r
+        $scope.isShowVerifyService = function () {\r
+            return featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_VERIFY_SERVICE);\r
+        }\r
+\r
+        $scope.isEnableVerifyService = function () {\r
+            //Button should only be enabled when the service type is A la carte\r
+            if (DataService.getALaCarte()) {\r
+                return $scope.verifyButtonEnabled;\r
+            }\r
+            return false;\r
+        };\r
+\r
+        $scope.activateVerifyService = function () {\r
+            $scope.verifyButtonEnabled = false;\r
+            let url = COMPONENT.VERIFY_SERVICE_URL;\r
+\r
+            let config = {\r
+                headers: {\r
+                    'Content-Type': 'application/json'\r
+                }\r
+            };\r
+\r
+            let data = {\r
+                "serviceInstanceList": [\r
+                    {\r
+                        "serviceInstanceId": $scope.serviceInstanceId,\r
+                        "modelVersionId": $scope.service.model.service.uuid,\r
+                        "modelInvariantId": $scope.service.model.service.invariantUuid,\r
+                        "customerId": $scope.globalCustomerId,\r
+                        "serviceType": $scope.service.instance.serviceType,\r
+                    }\r
+                ]\r
+            };\r
+            AaiService.postPOMBAverificationRequest(url, data, config);\r
+\r
+        };\r
+\r
+        $scope.isShowAssignmentsEnabled = function () {\r
+            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_SHOW_ASSIGNMENTS)) {\r
+                if ($scope.serviceOrchestrationStatus) {\r
+                    return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';\r
+                }\r
+            }\r
+            return false;\r
+        };\r
+\r
+        $scope.isActivateFabricConfiguration = function () {\r
+\r
+            if (featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_FABRIC_CONFIGURATION_ASSIGNMENTS) && $scope.hasFabricConfigurations) {\r
+                if ($scope.serviceOrchestrationStatus) {\r
+                    return $scope.serviceOrchestrationStatus.toLowerCase() === 'assigned';\r
+                }\r
+            }\r
+            return false;\r
+        };\r
+\r
+        $scope.isResumeShown = function (status) {\r
+            var vfModuleStatus = status.toLowerCase();\r
+            var serviceStatus = $scope.serviceOrchestrationStatus && $scope.serviceOrchestrationStatus.toLowerCase();\r
+            return _.includes(['pendingactivation', 'assigned'], vfModuleStatus) && !$scope.isActivateDeactivateEnabled("activate");\r
+        };\r
+\r
         $scope.handleInitialResponseInventoryItems = function (response) {\r
 \r
             $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json\r
@@ -607,12 +798,16 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             $scope.counter = 100;\r
 \r
             $scope.subscriberName = "";\r
+\r
+            $scope.allConfigurationsAssigned = true;\r
             // just look up the subscriber name in A&AI here...\r
             AaiService.getSubscriberName($scope.globalCustomerId, function (response) {\r
                 $scope.subscriberName = response.subscriberName;\r
                 DataService.setSubscriberName($scope.subscriberName);\r
                 $scope.serviceOrchestrationStatus = returnMatchingServiceSubscription(response.serviceSubscriptions[FIELD.ID.SERVICE_SUBSCRIPTION], $scope.serviceInstanceId);\r
-\r
+                if ($scope.serviceOrchestrationStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
+                    $scope.allConfigurationsAssigned = false;\r
+                }\r
                 angular.forEach($scope.inventoryResponseItemList, function (inventoryResponseItem, key) {\r
 \r
                     $scope.inventoryResponseItem = inventoryResponseItem;\r
@@ -642,6 +837,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                         "configurations": []\r
                     };\r
 \r
+                    var portMirroringConfigurationIds = [];\r
                     if (inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
 \r
                         angular.forEach(inventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subInventoryResponseItem, key) {\r
@@ -658,7 +854,8 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                     "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
                                     "object": l3NetworkObject,\r
                                     "nodes": [],\r
-                                    "subnets": []\r
+                                    "subnets": [],\r
+                                    "vlans": []\r
                                 };\r
                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
                                     //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");\r
@@ -680,6 +877,12 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                         }\r
                                     });\r
                                 }\r
+\r
+                                \r
+                                var networkObj = _.find(serviceNetworkVlans, { 'networkId': l3Network.nodeId});\r
+                                if (networkObj !== undefined && networkObj.vlans !== undefined) {\r
+                                    l3Network["vlans"] = networkObj.vlans;\r
+                                }\r
                                 $scope.service.instance[FIELD.ID.NETWORKS].push(l3Network);\r
                             }\r
 \r
@@ -693,12 +896,24 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                     "nodeType": genericVnfObject[FIELD.ID.VNF_TYPE],\r
                                     "nodeId": genericVnfObject[FIELD.ID.VNF_ID],\r
                                     "nodeStatus": genericVnfObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                    "modelVersionId" : genericVnfObject[FIELD.ID.MODEL_VERSION_ID],\r
                                     "object": genericVnfObject,\r
                                     "vfModules": [],\r
                                     "volumeGroups": [],\r
-                                    "availableVolumeGroups": []\r
+                                    "instanceGroups": [],\r
+                                    "availableVolumeGroups": [],\r
+                                    "networks": []\r
                                 };\r
+\r
+                                var vnfNetworkObj = _.find(vnfNetworksAndVlans, { 'vnfId': genericVnf.nodeId});\r
+                                if (vnfNetworkObj !== undefined && vnfNetworkObj.networks !== undefined) {\r
+                                    genericVnf["networks"] = vnfNetworkObj.networks;\r
+                                }\r
+\r
                                 $scope.service.instance[FIELD.ID.VNFS].push(genericVnf);\r
+                                getRelatedInstanceGroupsByVnfId(genericVnf);\r
+\r
+\r
 \r
                                 // look for volume-groups\r
                                 if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
@@ -787,6 +1002,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                 }\r
                             }\r
 \r
+\r
                             if (subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION] != null) {\r
                                 var configObject = subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION];\r
                                 var config = {\r
@@ -800,35 +1016,70 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                                     "modelVersionId": configObject[FIELD.ID.MODEL_VERSION_ID],\r
                                     "modelCustomizationId": configObject[FIELD.ID.MODEL_CUSTOMIZATION_ID],\r
                                     "object": configObject,\r
-                                    "ports": []\r
+                                    "ports": [],\r
+                                    "configData" : null\r
                                 };\r
-\r
+                                if( !$scope.hasFabricConfigurations ) {\r
+                                portMirroringConfigurationIds.push(configObject[FIELD.ID.CONFIGURATION_ID]);\r
+                                    $scope.service.instance[FIELD.ID.CONFIGURATIONS].push(config);\r
                                 $scope.allowConfigurationActions = [FIELD.STATUS.AAI_ACTIVE, FIELD.STATUS.AAI_INACTIVE, FIELD.STATUS.AAI_CREATED].indexOf(config.nodeStatus) != -1;\r
-\r
-                                if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
-                                    angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {\r
-                                        var port = {};\r
-                                        var portObject;\r
-                                        if (subSubInventoryResponseItem[FIELD.ID.PORT] != null) {\r
-                                            portObject = subSubInventoryResponseItem[FIELD.ID.PORT];\r
-                                            port = {\r
-                                                "portId": portObject[FIELD.ID.PORT_ID],\r
-                                                "portName": portObject[FIELD.ID.PORT_NAME],\r
-                                                "portStatus": portObject[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.ID.AAI_DISABLED,\r
-                                                "object": portObject\r
-                                            };\r
-                                            config.ports.push(port);\r
-                                        }\r
-                                    });\r
-                                }\r
-                                $scope.service.instance[FIELD.ID.CONFIGURATIONS].push(config);\r
+                                } else {\r
+                                   if (config.nodeStatus.toLowerCase() !== FIELD.STATUS.ASSIGNED.toLowerCase()) {\r
+                                       $scope.allConfigurationsAssigned = false;\r
+                                       if ($scope.isActivateFabricConfiguration()) {\r
+                                            $scope.errorMsg = "Activate fabric configuration button is not available as some of the configuration objects are not in Assigned status. Check MSO logs for the reasons for this abnormal case.";\r
+                                       }\r
+                                   }\r
+                               }\r
                             }\r
 \r
                         });\r
+\r
+                        AaiService.getPortMirroringData(portMirroringConfigurationIds).then(function(result){\r
+                           angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
+                                config['configData'] = result.data[config['nodeId']];\r
+\r
+                               if (config.configData && config.configData.errorDescription) {\r
+                                   $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
+                                       "Cannot read cloud-region for configuration \"" + config.name + "\": " +\r
+                                       config.configData.errorDescription;\r
+                               }\r
+                           });\r
+                        });\r
+\r
+                        AaiService.getPortMirroringSourcePorts(portMirroringConfigurationIds).then(function(result){\r
+                           angular.forEach($scope.service.instance[FIELD.ID.CONFIGURATIONS], function(config){\r
+                                angular.forEach(result.data[config['nodeId']], function(port){\r
+                                   if (port.errorDescription) {\r
+                                       $scope.errorMsg = ($scope.errorMsg ? $scope.errorMsg + "\n" : "") +\r
+                                           "Cannot read a source port for configuration \"" + config.name + "\": " +\r
+                                           port.errorDescription;\r
+                                   } else {\r
+                                       config.ports.push({\r
+                                           "portId": port[FIELD.ID.PORT_ID],\r
+                                           "portName": port[FIELD.ID.PORT_NAME],\r
+                                           "portStatus": port[FIELD.ID.PORT_MIRRORED] === true ? FIELD.STATUS.AAI_ENABLED : FIELD.STATUS.AAI_DISABLED\r
+                                       });\r
+                                   }\r
+                               });\r
+                           });\r
+                        });\r
+\r
                     }\r
                 });\r
+\r
+                var aaiNetworkIds = _.map(serviceNetworkVlans, 'networkId');\r
+                var serviceInstanceNetworkIds = _.map($scope.service.instance[FIELD.ID.NETWORKS], 'nodeId');\r
+                var isContains = aaiNetworkIds.every(function(val) { return serviceInstanceNetworkIds.indexOf(val) >= 0; });\r
+                if (aaiNetworkIds.length && !isContains)  {\r
+                    $log.error("vlansByNetworks contain network that not found in service instance", aaiNetworkIds, serviceInstanceNetworkIds);\r
+                }\r
+\r
             });\r
-        }\r
+        };\r
+\r
+\r
+\r
 \r
         $scope.handleInitialResponse = function (response) {\r
             try {\r
@@ -977,7 +1228,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 });\r
         };\r
 \r
-        var activateDeactivateServiceInstance = function(msoType) {\r
+        var activateDeactivateServiceInstance = function (msoType) {\r
             var requestParams = {\r
                 model: $scope.service.model,\r
                 instance: $scope.service.instance\r
@@ -997,73 +1248,136 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             }\r
         };\r
 \r
-        $scope.activateMSOInstance = function() {\r
+\r
+        var activateFabricConfigurationInstance = function (msoType) {\r
+            var requestParams = {\r
+                model: $scope.service.model,\r
+                service: $scope.service,\r
+                serviceInstanceId: $scope.serviceInstanceId\r
+            };\r
+\r
+            if (DataService.getLoggedInUserId()) {\r
+                requestParams.userId = DataService.getLoggedInUserId();\r
+                openMsoModal(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ, requestParams);\r
+            } else {\r
+                AaiService.getLoggedInUserID(function (response) {\r
+                    var userID = response.data;\r
+                    DataService.setLoggedInUserId(userID);\r
+                    requestParams.userId = userID;\r
+                    openMsoModal(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ, requestParams);\r
+                });\r
+            }\r
+        };\r
+\r
+        $scope.showAssignmentsSDNC = function () {\r
+\r
+            if ($scope.service && $scope.service.instance) {\r
+                return VIDCONFIGURATION.SDNC_SHOW_ASSIGNMENTS_URL.replace("<SERVICE_INSTANCE_ID>" , $scope.service.instance.id);\r
+            }\r
+            return null;\r
+        };\r
+\r
+        $scope.activateFabricConfigurationMSO = function () {\r
+            activateFabricConfigurationInstance(COMPONENT.MSO_ACTIVATE_FABRIC_CONFIGURATION_REQ);\r
+        };\r
+\r
+        $scope.activateMSOInstance = function () {\r
 \r
             activateDeactivateServiceInstance(COMPONENT.MSO_ACTIVATE_SERVICE_REQ);\r
         };\r
 \r
-        $scope.deactivateMSOInstance = function() {\r
+        $scope.deactivateMSOInstance = function () {\r
 \r
             activateDeactivateServiceInstance(COMPONENT.MSO_DEACTIVATE_SERVICE_REQ);\r
         };\r
 \r
-        $scope.toggleConfigurationStatus = function (serviceObject, configuration) {\r
-\r
 \r
+        $scope.deleteConfiguration = function (serviceObject, configuration) {\r
             AaiService.getLoggedInUserID(function (response) {\r
-                    DataService.setLoggedInUserId(response.data);\r
-                    var requestParams = {\r
-                        serviceModel: {\r
-                            "modelType": "service",\r
-                            "modelInvariantId": serviceObject.model.service.invariantUuid,\r
-                            "modelVersionId": "uuid",\r
-                            "modelName": serviceObject.model.service.name,\r
-                            "modelVersion": serviceObject.model.service.version\r
-                        },\r
-                        configurationModel: {\r
-                            "modelType": "configuration",\r
-                            "modelInvariantId": configuration.modelInvariantId,\r
-                            "modelVersionId": configuration.modelVersionId,\r
-                            "modelCustomizationId": configuration.modelCustomizationId\r
-                        },\r
-                        serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
-                        configurationId: configuration.nodeId,\r
-                        configStatus: configuration.nodeStatus,\r
-                        userId: DataService.getLoggedInUserId()\r
-                    };\r
+                DataService.setLoggedInUserId(response.data);\r
+                var requestParams = {\r
+                    serviceModel: {\r
+                        "modelType": "configuration",\r
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,\r
+                        "modelVersionId": serviceObject.model.service.uuid,\r
+                        "modelName": serviceObject.model.service.name,\r
+                        "modelVersion": serviceObject.model.service.version\r
+                    },\r
+                    configurationModel: {\r
+                        "modelType": "configuration",\r
+                        "modelInvariantId": configuration.modelInvariantId,\r
+                        "modelVersionId": configuration.modelVersionId,\r
+                        "modelCustomizationId": configuration.modelCustomizationId\r
+                    },\r
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
+                    configurationId: configuration.nodeId,\r
+                    configStatus: configuration.DELETE,\r
+                    userId: DataService.getLoggedInUserId()\r
+                };\r
 \r
-                    openMsoModal(COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ, requestParams);\r
-             });\r
+                openMsoModal(COMPONENT.MSO_DELETE_CONFIGURATION_REQ, requestParams, configuration);\r
+            });\r
 \r
         };\r
 \r
-        $scope.togglePortStatus = function(serviceObject, configuration, port) {\r
+        $scope.toggleConfigurationStatus = function (serviceObject, configuration) {\r
+            AaiService.getLoggedInUserID(function (response) {\r
+                DataService.setLoggedInUserId(response.data);\r
+                var requestParams = {\r
+                    serviceModel: {\r
+                        "modelType": "service",\r
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,\r
+                        "modelVersionId": serviceObject.model.service.uuid,\r
+                        "modelName": serviceObject.model.service.name,\r
+                        "modelVersion": serviceObject.model.service.version\r
+                    },\r
+                    configurationModel: {\r
+                        "modelType": "configuration",\r
+                        "modelInvariantId": configuration.modelInvariantId,\r
+                        "modelVersionId": configuration.modelVersionId,\r
+                        "modelCustomizationId": configuration.modelCustomizationId\r
+                    },\r
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
+                    configurationId: configuration.nodeId,\r
+                    configStatus: configuration.nodeStatus,\r
+                    userId: DataService.getLoggedInUserId()\r
+                };\r
 \r
-            var requestParams = {\r
-                serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
-                configurationId: configuration.nodeId,\r
-                portId: port.portId,\r
-                portStatus: port.portStatus,\r
-                serviceModel: {\r
-                    "modelType": "service",\r
-                    "modelInvariantId": serviceObject.model.service.invariantUuid,\r
-                    "modelVersionId": "uuid",\r
-                    "modelName": serviceObject.model.service.name,\r
-                    "modelVersion": serviceObject.model.service.version\r
-                },\r
-                configurationModel: {\r
-                    "modelType": "configuration",\r
-                    "modelInvariantId": configuration.modelInvariantId,\r
-                    "modelVersionId": configuration.modelVersionId,\r
-                    "modelCustomizationId": configuration.modelCustomizationId\r
-                },\r
-                userId: DataService.getLoggedInUserId()\r
-            };\r
+                openMsoModal(COMPONENT.MSO_CHANGE_CONFIG_STATUS_REQ, requestParams, configuration);\r
+            });\r
+\r
+        };\r
+\r
+        $scope.togglePortStatus = function (serviceObject, configuration, port) {\r
+            AaiService.getLoggedInUserID(function (response) {\r
+                DataService.setLoggedInUserId(response.data);\r
+\r
+                var requestParams = {\r
+                    serviceInstanceId: serviceObject.instance.serviceInstanceId,\r
+                    configurationId: configuration.nodeId,\r
+                    portId: port.portId,\r
+                    portStatus: port.portStatus,\r
+                    serviceModel: {\r
+                        "modelType": "service",\r
+                        "modelInvariantId": serviceObject.model.service.invariantUuid,\r
+                        "modelVersionId": serviceObject.model.service.uuid,\r
+                        "modelName": serviceObject.model.service.name,\r
+                        "modelVersion": serviceObject.model.service.version\r
+                    },\r
+                    configurationModel: {\r
+                        "modelType": "configuration",\r
+                        "modelInvariantId": configuration.modelInvariantId,\r
+                        "modelVersionId": configuration.modelVersionId,\r
+                        "modelCustomizationId": configuration.modelCustomizationId\r
+                    },\r
+                    userId: DataService.getLoggedInUserId()\r
+                };\r
 \r
-            openMsoModal(COMPONENT.MSO_CHANGE_PORT_STATUS_REQ, requestParams);\r
+                openMsoModal(COMPONENT.MSO_CHANGE_PORT_STATUS_REQ, requestParams, configuration);\r
+            });\r
         };\r
 \r
-        $scope.dissociatePnf = function(pnfName) {\r
+        $scope.dissociatePnf = function (pnfName) {\r
 \r
             var jobInfo = {\r
                 status: "confirm",\r
@@ -1098,12 +1412,14 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     };\r
 \r
                     if (DataService.getLoggedInUserId()) {\r
+                        requestParams.userId = DataService.getLoggedInUserId();\r
                         requestParams.attuuid = DataService.getLoggedInUserId();\r
                         openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);\r
                     } else {\r
                         AaiService.getLoggedInUserID(function (response) {\r
                             DataService.setLoggedInUserId(response.data);\r
 \r
+                            requestParams.userId = response.data;\r
                             requestParams.attuuid = response.data;\r
                             openMsoModal(COMPONENT.MSO_REMOVE_RELATIONSHIP, requestParams);\r
                         });\r
@@ -1114,35 +1430,38 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
         };\r
 \r
-        var openMsoModal = function (msoType, requestParams) {\r
+        var openMsoModal = function (msoType, requestParams, configuration) {\r
             var modalInstance = $uibModal.open({\r
                 templateUrl: 'app/vid/scripts/modals/mso-commit/mso-commit.html',\r
-                controller : "msoCommitModalController",\r
+                controller: "msoCommitModalController",\r
                 backdrop: false,\r
                 resolve: {\r
                     msoType: function () {\r
                         return msoType;\r
                     },\r
-                    requestParams: function() {\r
+                    requestParams: function () {\r
                         requestParams.callbackFunction = updateViewCallbackFunction;\r
                         return requestParams;\r
+                    },\r
+                    configuration: function () {\r
+                        return configuration;\r
                     }\r
                 }\r
             });\r
         };\r
 \r
-        var updateViewCallbackFunction = function(response) {\r
+        var updateViewCallbackFunction = function (response) {\r
             $scope.callbackResults = "";\r
             var color = FIELD.ID.COLOR_NONE;\r
             $scope.callbackStyle = {\r
-                "background-color" : color\r
+                "background-color": color\r
             };\r
 \r
             /*\r
              * This 1/2 delay was only added to visually highlight the status\r
              * change. Probably not needed in the real application code.\r
              */\r
-            $timeout(function() {\r
+            $timeout(function () {\r
                 $scope.callbackResults = UtilityService.getCurrentTime()\r
                     + FIELD.STATUS.IS_SUCCESSFUL + response.isSuccessful;\r
                 if (response.isSuccessful) {\r
@@ -1152,7 +1471,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     color = FIELD.ID.COLOR_F88;\r
                 }\r
                 $scope.callbackStyle = {\r
-                    "background-color" : color\r
+                    "background-color": color\r
                 };\r
             }, 500);\r
         };\r
@@ -1198,7 +1517,8 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     }\r
                 }\r
             };\r
-    }]).directive('restrictInput', function () {\r
+    }\r
+]).directive('restrictInput', function () {\r
 \r
     return {\r
 \r