AAI Query optimization for VID
[vid.git] / vid-app-common / src / main / webapp / app / vid / scripts / controller / aaiSubscriberController.js
index 2701e3e..2f07652 100755 (executable)
@@ -522,7 +522,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             var deferred = $q.defer();\r
             AaiService.searchServiceInstances(\r
                 '?subscriberId=' + $location.search().subscriberId +\r
-                '&serviceInstanceIdentifier=' + $location.search().serviceInstanceId)\r
+                '&serviceInstanceIdentifier=' + $location.search().serviceInstanceId + '&serviceInstanceIdentifierType=Service Instance Id')\r
                 .then(function (response) {\r
                     if (response.displayData && response.displayData.length) {\r
                         var first = response.displayData[0];\r
@@ -589,7 +589,14 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                     $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
+                            try {\r
+                                $log.debug("Getting inventory reponse items from Named Query with AAI query optimization - Before ");\r
+                                $scope.handleInitialResponseInventoryItemsOptimized(response);\r
+                                $log.debug("Getting inventory reponse items from Named Query with AAI query optimization - After ");\r
+                            }catch (error) {\r
+                                $log.error("Exception: Fallback to original method of getting subscriber name and SI orch status.");\r
+                                $scope.handleInitialResponseInventoryItems(response);\r
+                            }\r
                             $scope.setProgress(100); // done\r
                             $scope.status = FIELD.STATUS.DONE;\r
                             $scope.isSpinnerVisible = false;\r
@@ -630,7 +637,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                 return $q.resolve($scope.modelVersionIdForServiceInstance.aaiModelVersionId);\r
             } else {\r
                 $scope.status = FIELD.STATUS.FETCHING_SERVICE_INST_DATA + $scope.serviceInstanceId;\r
-                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId)\r
+                return AaiService.getModelVersionId(instance.globalCustomerId, instance.serviceInstanceId, 'Service Instance Id')\r
                     .then(function (aaiModelVersionId) {\r
                         $scope.modelVersionIdForServiceInstance = {\r
                             globalCustomerId: instance.globalCustomerId,\r
@@ -827,6 +834,298 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
             return _.includes(vfModuleStatusHasAllowedResume, vfModuleStatus) && !$scope.isActivateDeactivateEnabled("activate");\r
         };\r
 \r
+        $scope.handleInitialResponseInventoryItemsOptimized = function (response) {\r
+\r
+            $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json\r
+            $log.debug($scope.inventoryResponseItemList);\r
+\r
+            $scope.displayData = [];\r
+            $scope.vnfs = [];\r
+\r
+            $scope.counter = 100;\r
+\r
+            $scope.subscriberName = $location.search().subscriberName;\r
+\r
+            $scope.allConfigurationsAssigned = true;\r
+            // look up the subscriber name and service orchestration status from A&AI here...\r
+            AaiService.getSubscriberNameAndServiceInstanceInfo( $scope.globalCustomerId,\r
+                $scope.serviceInstanceId,\r
+                'Service Instance Id',$scope.subscriberName, function (response) {\r
+                    $scope.subscriberName = response['subscriberName'];\r
+                    DataService.setSubscriberName($scope.subscriberName);\r
+                    $scope.serviceOrchestrationStatus = response['orchestrationStatus'];\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
+\r
+                        $scope.service.instance = {\r
+                            "name": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE][FIELD.ID.SERVICE_INSTANCE_NAME],\r
+                            "serviceInstanceId": $scope.serviceInstanceId,\r
+                            "serviceType": $scope.serviceType,\r
+                            "globalCustomerId": $scope.globalCustomerId,\r
+                            "subscriberName": $scope.subscriberName,\r
+                            "id": $scope.serviceInstanceId,\r
+                            "inputs": {\r
+                                "a": {\r
+                                    "type": PARAMETER.STRING,\r
+                                    "description": FIELD.PROMPT.VAR_DESCRIPTION_A,\r
+                                    "default": FIELD.PROMPT.DEFAULT_A\r
+                                },\r
+                                "b": {\r
+                                    "type": PARAMETER.STRING,\r
+                                    "description": FIELD.PROMPT.VAR_DESCRIPTION_B,\r
+                                    "default": FIELD.PROMPT.DEFAULT_B\r
+                                }\r
+                            },\r
+                            "object": $scope.inventoryResponseItem[FIELD.ID.SERVICE_INSTANCE],\r
+                            "vnfs": [],\r
+                            "networks": [],\r
+                            "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
+                                // i expect to find vnfs now\r
+\r
+                                if (subInventoryResponseItem[FIELD.ID.L3_NETWORK] != null) {\r
+                                    var l3NetworkObject = subInventoryResponseItem[FIELD.ID.L3_NETWORK];\r
+                                    var l3Network = {\r
+                                        "id": $scope.counter++,\r
+                                        "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
+                                        "itemType": FIELD.ID.L3_NETWORK,\r
+                                        "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
+                                        "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
+                                        "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                        "object": l3NetworkObject,\r
+                                        "nodes": [],\r
+                                        "subnets": [],\r
+                                        "vlans": []\r
+                                    };\r
+                                    if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
+                                        //console.log ("subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS]=");\r
+                                        //console.log (JSON.stringify (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS], null, 4 ));\r
+                                        angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (subSubInventoryResponseItem, key) {\r
+                                            //console.log (JSON.stringify (subSubInventoryResponseItem, null, 4 ));\r
+                                            var subnet = {};\r
+                                            var subnetObject;\r
+                                            if (subSubInventoryResponseItem[FIELD.ID.SUB_NET] != null) {\r
+                                                subnetObject = subSubInventoryResponseItem[FIELD.ID.SUB_NET];\r
+                                                subnet = {\r
+                                                    "subnet-id": subnetObject[FIELD.ID.SUBNET_ID],\r
+                                                    "subnet-name": subnetObject[FIELD.ID.SUBNET_NAME],\r
+                                                    "gateway-address": subnetObject[FIELD.ID.GATEWAY_ADDRESS],\r
+                                                    "network-start-address": subnetObject[FIELD.ID.NETWORK_START_ADDRESS],\r
+                                                    "cidr-mask": subnetObject[FIELD.ID.CIDR_MASK]\r
+                                                };\r
+                                                l3Network.subnets.push(subnet);\r
+                                            }\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
+                                if (subInventoryResponseItem[FIELD.ID.GENERIC_VNF] != null) {\r
+                                    var genericVnfObject = subInventoryResponseItem[FIELD.ID.GENERIC_VNF];\r
+\r
+                                    var genericVnf = {\r
+                                        "name": genericVnfObject[FIELD.ID.VNF_NAME],\r
+                                        "id": $scope.counter++,\r
+                                        "itemType": COMPONENT.VNF,\r
+                                        "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
+                                        "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
+                                        angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
+\r
+                                            if (vfmodules[FIELD.ID.VOLUME_GROUP] != null) {\r
+                                                var volumeGroupObject = vfmodules[FIELD.ID.VOLUME_GROUP];\r
+                                                var volumeGroup = {\r
+                                                    "id": $scope.counter++,\r
+                                                    "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
+                                                    "itemType": FIELD.ID.VOLUME_GROUP,\r
+                                                    "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
+                                                    "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
+                                                    "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                                    "object": volumeGroupObject,\r
+                                                    "nodes": []\r
+                                                };\r
+                                                genericVnf[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
+                                                genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS].push(volumeGroup);\r
+                                            }\r
+                                        });\r
+                                    }\r
+                                    // now we've loaded up the availableVolumeGroups, we can use it\r
+                                    if (subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
+                                        angular.forEach(subInventoryResponseItem[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (vfmodules, key) {\r
+\r
+                                            if (vfmodules[FIELD.ID.VF_MODULE] != null) {\r
+                                                var vfModuleObject = vfmodules[FIELD.ID.VF_MODULE];\r
+                                                var vfModule = {\r
+                                                    "id": $scope.counter++,\r
+                                                    "name": vfModuleObject[FIELD.ID.VF_MODULE_NAME],\r
+                                                    "itemType": FIELD.ID.VF_MODULE,\r
+                                                    "nodeType": FIELD.ID.VF_MODULE,\r
+                                                    "nodeStatus": vfModuleObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                                    "volumeGroups": [],\r
+                                                    "object": vfModuleObject,\r
+                                                    "networks": []\r
+                                                };\r
+                                                genericVnf[FIELD.ID.VF_MODULES].push(vfModule);\r
+                                                if (vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS] != null) {\r
+                                                    angular.forEach(vfmodules[FIELD.ID.INVENTORY_RESPONSE_ITEMS][FIELD.ID.INVENTORY_RESPONSE_ITEM], function (networks, key) {\r
+                                                        if (networks[FIELD.ID.L3_NETWORK] != null) {\r
+                                                            var l3NetworkObject = networks[FIELD.ID.L3_NETWORK];\r
+                                                            var l3Network = {\r
+                                                                "id": $scope.counter++,\r
+                                                                "name": l3NetworkObject[FIELD.ID.NETWORK_NAME],\r
+                                                                "itemType": FIELD.ID.L3_NETWORK,\r
+                                                                "nodeId": l3NetworkObject[FIELD.ID.NETWORK_ID],\r
+                                                                "nodeType": l3NetworkObject[FIELD.ID.NETWORK_TYPE],\r
+                                                                "nodeStatus": l3NetworkObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                                                "object": l3NetworkObject,\r
+                                                                "nodes": []\r
+                                                            };\r
+                                                            vfModule[FIELD.ID.NETWORKS].push(l3Network);\r
+                                                        }\r
+                                                        if (networks[FIELD.ID.VOLUME_GROUP] != null) {\r
+                                                            var volumeGroupObject = networks[FIELD.ID.VOLUME_GROUP];\r
+\r
+                                                            var volumeGroup = {\r
+                                                                "id": $scope.counter++,\r
+                                                                "name": volumeGroupObject[FIELD.ID.VOLUME_GROUP_NAME],\r
+                                                                "itemType": FIELD.ID.VOLUME_GROUP,\r
+                                                                "nodeId": volumeGroupObject[FIELD.ID.VOLUME_GROUP_ID],\r
+                                                                "nodeType": volumeGroupObject[FIELD.ID.VNF_TYPE],\r
+                                                                "nodeStatus": volumeGroupObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                                                "object": volumeGroupObject,\r
+                                                                "nodes": []\r
+                                                            };\r
+                                                            var tmpVolGroup = [];\r
+\r
+                                                            angular.forEach(genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS], function (avgroup, key) {\r
+                                                                if (avgroup.name != volumeGroup.name) {\r
+                                                                    tmpVolGroup.push(avgroup);\r
+                                                                }\r
+                                                            });\r
+\r
+                                                            genericVnf[FIELD.ID.AVAILABLEVOLUMEGROUPS] = tmpVolGroup;\r
+\r
+                                                            vfModule[FIELD.ID.VOLUMEGROUPS].push(volumeGroup);\r
+                                                        }\r
+\r
+                                                    });\r
+                                                }\r
+                                            }\r
+                                        });\r
+                                    }\r
+                                }\r
+\r
+\r
+                                if (subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION] != null) {\r
+                                    var configObject = subInventoryResponseItem[FIELD.ID.GENERIC_CONFIGURATION];\r
+                                    var config = {\r
+                                        "id": $scope.counter++,\r
+                                        "name": configObject[FIELD.ID.CONFIGURATION_NAME],\r
+                                        "itemType": FIELD.ID.CONFIGURATION,\r
+                                        "nodeId": configObject[FIELD.ID.CONFIGURATION_ID],\r
+                                        "nodeType": configObject[FIELD.ID.CONFIGURATION_TYPE],\r
+                                        "nodeStatus": configObject[FIELD.ID.ORCHESTRATION_STATUS],\r
+                                        "modelInvariantId": configObject[FIELD.ID.MODEL_INVAR_ID],\r
+                                        "modelVersionId": configObject[FIELD.ID.MODEL_VERSION_ID],\r
+                                        "modelCustomizationId": configObject[FIELD.ID.MODEL_CUSTOMIZATION_ID],\r
+                                        "object": configObject,\r
+                                        "ports": [],\r
+                                        "configData" : null\r
+                                    };\r
+                                    if( !$scope.hasFabricConfigurations ) {\r
+                                        portMirroringConfigurationIds.push(configObject[FIELD.ID.CONFIGURATION_ID]);\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
         $scope.handleInitialResponseInventoryItems = function (response) {\r
 \r
             $scope.inventoryResponseItemList = response.data[FIELD.ID.INVENTORY_RESPONSE_ITEM]; // get data from json\r
@@ -1521,12 +1820,13 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
         $scope.serviceInstanceses = [{"sinstance": FIELD.NAME.SERVICE_INSTANCE_Id}, {"sinstance": FIELD.NAME.SERVICE_INSTANCE_NAME}];\r
 \r
-        function navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProjects, selectedOwningEntities) {\r
+        function navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProjects, selectedOwningEntities, selectedInstanceIdentifierType) {\r
             var projectQuery = AaiService.getMultipleValueParamQueryString(_.map(selectedProjects, 'id'), COMPONENT.PROJECT_SUB_PATH);\r
             var owningEntityQuery = AaiService.getMultipleValueParamQueryString(_.map(selectedOwningEntities, 'id'), COMPONENT.OWNING_ENTITY_SUB_PATH);\r
             var globalCustomerIdQuery = globalCustomerId ? COMPONENT.SELECTED_SUBSCRIBER_SUB_PATH + globalCustomerId : null;\r
             var serviceInstanceQuery = selectedServiceInstance ? COMPONENT.SELECTED_SERVICE_INSTANCE_SUB_PATH + selectedServiceInstance : null;\r
-            var query = AaiService.getJoinedQueryString([projectQuery, owningEntityQuery, globalCustomerIdQuery, serviceInstanceQuery]);\r
+            var serviceInstanceTypeQuery = selectedInstanceIdentifierType ? COMPONENT.SELECTED_SERVICE_INSTANCE_TYPE_SUB_PATH + selectedInstanceIdentifierType : null;\r
+            var query = AaiService.getJoinedQueryString([projectQuery, owningEntityQuery, globalCustomerIdQuery, serviceInstanceQuery, serviceInstanceTypeQuery]);\r
 \r
             window.location.href = COMPONENT.SELECTED_SERVICE_SUB_PATH + query;\r
         }\r
@@ -1542,7 +1842,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
                             .getGlobalCustomerIdByInstanceIdentifier(selectedServiceInstance, selectedInstanceIdentifierType)\r
                             .then(handleCustomerIdResponse);\r
                     } else {\r
-                        navigateToSearchResultsPage(selectedCustomer, null, selectedProject, selectedOwningEntity);\r
+                        navigateToSearchResultsPage(selectedCustomer, null, selectedProject, selectedOwningEntity, selectedInstanceIdentifierType);\r
                     }\r
                 } else {\r
                     alert(FIELD.ERROR.SELECT);\r
@@ -1550,7 +1850,7 @@ appDS2.controller("aaiSubscriberController", ["COMPONENT", "FIELD", "PARAMETER",
 \r
                 function handleCustomerIdResponse(globalCustomerId) {\r
                     if (UtilityService.hasContents(globalCustomerId)) {\r
-                        navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProject, selectedOwningEntity);\r
+                        navigateToSearchResultsPage(globalCustomerId, selectedServiceInstance, selectedProject, selectedOwningEntity, selectedInstanceIdentifierType);\r
                     } else {\r
                         alert(FIELD.ERROR.SERVICE_INST_DNE);\r
                     }\r