DCAE SliceAnalysis MS - Cps Integration 98/123498/8 1.0.6-slice-analysis-ms 1.1.1-datalake-handler-admin-ui
authordenilson.l65 <denilson.l65@wipro.com>
Tue, 24 Aug 2021 11:08:00 +0000 (11:08 +0000)
committerdenilson.l65 <denilson.l65@wipro.com>
Sat, 28 Aug 2021 05:43:10 +0000 (05:43 +0000)
Issue-ID: DCAEGEN2-2885
Signed-off-by: denilson.l65 <denilson.l65@wipro.com>
Change-Id: Iea7a675e5dc2f182dda14f0ccf14f2864a5991e5

components/slice-analysis-ms/ChangeLog.md [new file with mode: 0644]
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/configdb/CpsService.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ConsumerThread.java
components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/configdb/CpsInterfaceServiceTest.java [new file with mode: 0644]
components/slice-analysis-ms/src/test/resources/DUCellsList.json [new file with mode: 0644]
components/slice-analysis-ms/src/test/resources/DUList.json [new file with mode: 0644]
components/slice-analysis-ms/src/test/resources/sliceConfig.json [new file with mode: 0644]

diff --git a/components/slice-analysis-ms/ChangeLog.md b/components/slice-analysis-ms/ChangeLog.md
new file mode 100644 (file)
index 0000000..5d64d12
--- /dev/null
@@ -0,0 +1,11 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## [1.0.6] - 2021/08/28
+        - [DCAEGEN2-2885](https://jira.onap.org/browse/DCAEGEN2-2885) - DCAE SliceAnalysis MS - CPS Integration
+
+        - [DCAEGEN2-2811](https://jira.onap.org/browse/DCAEGEN2-2811) - Remove security vulnerabilities
+
index f0c27e1..389a75d 100644 (file)
@@ -22,12 +22,18 @@ package org.onap.slice.analysis.ms.configdb;
 
 import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
 
+import org.json.JSONArray;
+import org.json.JSONObject;
 import org.onap.slice.analysis.ms.models.Configuration;
 import org.onap.slice.analysis.ms.restclients.CpsRestClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.stereotype.Service;
 
 /**
@@ -48,22 +54,84 @@ public class CpsService implements CpsInterface {
         * Fetches the current configuration of RIC from CPS
         */
        public Map<String, Map<String, Object>> fetchCurrentConfigurationOfRIC(String snssai) {
-               return null;
+           Map<String, Map<String, Object>> responseMap = new HashMap<String, Map<String, Object>>();
+           String reqUrl = cpsBaseUrl +"/get-nearrtric-config";
+           log.info("fetching current configuration of RIC from Cps: {s-NSSAI: "+snssai+"}");
+           String requestBody = "{\"inputParameters\": {\"sNssai\":"+JSONObject.quote(snssai)+"}}";
+               try {
+                       String response = restclient.sendPostRequest(reqUrl,requestBody, new ParameterizedTypeReference<String>() {}).getBody();
+                       JSONArray sliceArray = new JSONArray(response);
+                       for (int i=0;i<sliceArray.length();i++) {
+                               String nearRTTICid = sliceArray.getJSONObject(i).optString("idNearRTRIC");
+                               JSONArray pLMNInfoList = sliceArray.getJSONObject(i).getJSONObject("attributes").getJSONArray("pLMNInfoList");
+                               for (int j=0;j<pLMNInfoList.length();j++){
+                                       JSONArray sNSSAIList = pLMNInfoList.getJSONObject(j).getJSONArray("sNSSAIList");
+                                       for(int k=0;k<sNSSAIList.length();k++) {
+                                               Map<String,Object> map = new HashMap<String,Object>();
+                                               JSONArray configDataArray = sNSSAIList.getJSONObject(k).getJSONArray("configData");
+                                               for(int l=0;l<configDataArray.length();l++) {
+                                                       JSONObject configData = configDataArray.getJSONObject(l);
+                                                       map.put((String) configData.get("configParameter"), configData.get("configValue"));
+                                               }
+                                               responseMap.put(nearRTTICid, map);
+                                       }
+                               }
+                       }
+           }catch (Exception e) {
+                   log.info("CPS fetches current configuration of RIC: " + e);
+           }
+           return responseMap;
        }
 
        /**
         * Fetches all the network functions of an S-NSSAI from CPS
         */
        public List<String> fetchNetworkFunctionsOfSnssai(String snssai) {
-               return null;
+           List<String> responseList=new ArrayList<>();
+           String reqUrl=cpsBaseUrl+"/get-gnbdufunction-by-snssai";
+           log.info("fetching network functions of snssai from Cps: {s-NSSAI: "+snssai+"}");
+           String requestBody = "{\"inputParameters\": {\"sNssai\":"+JSONObject.quote(snssai)+"}}";
+           try {
+                   String response=restclient.sendPostRequest(reqUrl,requestBody,new ParameterizedTypeReference<String>() {}).getBody();
+                   JSONArray networkFunctionJsonArry = new JSONArray(response);
+                   for (int i=0;i<networkFunctionJsonArry.length();i++) {
+                           JSONObject networkFunctionJson = networkFunctionJsonArry.getJSONObject(i);
+                           responseList.add(networkFunctionJson.getJSONObject("attributes").optString("gNBDUId"));
+                   }
+           }
+           catch (Exception e) {
+                   log.info("Fetch network functions of S-NSSAI from CPS" + e);
+           }
+           return responseList;
        }
 
        /**
         * Fetches the RICS of an S-NSSAI from CPS
         */
        public Map<String, List<String>> fetchRICsOfSnssai(String snssai) {
-               return null;
+            Map<String,List<String>> responseMap=new HashMap<>();
+           String reqUrl=cpsBaseUrl + "/get-nrcelldu-by-snssai";
+           log.info("fetching RIC of s-NSSAI from Cps: {s-NSSAI: "+snssai+"}");
+           String requestBody = "{\"inputParameters\": {\"sNssai\":"+JSONObject.quote(snssai)+"}}";
+           try {
+                   String response=restclient.sendPostRequest(reqUrl,requestBody,new ParameterizedTypeReference<String>() {}).getBody();
+                   JSONArray sliceArray = new JSONArray(response);
+                   for (int i=0;i<sliceArray.length();i++) {
+                           String nearRTTICid = sliceArray.getJSONObject(i).optString("idNearRTRIC");
+                           JSONArray GNBDUFunctionArray = sliceArray.getJSONObject(i).getJSONArray("GNBDUFunction");
+                           for (int j=0;j<GNBDUFunctionArray.length();j++){
+                                   JSONArray NRCellDUArray = GNBDUFunctionArray.getJSONObject(j).getJSONArray("NRCellDU");
+                                   List<String> cellslist=new ArrayList<>();
+                                   for(int k=0;k<NRCellDUArray.length();k++) {
+                                           cellslist.add(NRCellDUArray.getJSONObject(k).getJSONObject("attributes").optString("cellLocalId"));
+                                   }
+                                   responseMap.put(nearRTTICid,cellslist);
+                           }
+                   }
+           }catch (Exception e) {
+                   log.info("Fetch RICS of S-NSSAI from CPS" + e);
+           }
+           return responseMap;
        }
-
 }
 
index e802820..6098142 100644 (file)
@@ -22,7 +22,9 @@
 package org.onap.slice.analysis.ms.service;
 
 import java.util.List;
+import java.util.Objects;
 
+import org.onap.slice.analysis.ms.configdb.CpsInterface;
 import org.onap.slice.analysis.ms.configdb.IConfigDbService;
 import org.onap.slice.analysis.ms.models.Configuration;
 import org.onap.slice.analysis.ms.models.SubCounter;
@@ -38,6 +40,7 @@ public class ConsumerThread extends Thread {
        private PmDataQueue pmDataQueue;
        private IConfigDbService configDbService;
        private SnssaiSamplesProcessor snssaiSamplesProcessor;
+       private CpsInterface cpsInterface;
        private long initialDelaySec; 
        private int samples;
 
@@ -50,6 +53,7 @@ public class ConsumerThread extends Thread {
                this.configDbService = BeanUtil.getBean(IConfigDbService.class);
                this.initialDelaySec = Configuration.getInstance().getInitialDelaySeconds();
                this.samples = Configuration.getInstance().getSamples();
+               this.cpsInterface = BeanUtil.getBean(CpsInterface.class);
        }
 
        /**
@@ -57,6 +61,8 @@ public class ConsumerThread extends Thread {
         */
        @Override
        public void run() {    
+               Boolean isConfigDbEnabled = (Objects.isNull(Configuration.getInstance().getConfigDbEnabled())) ? true
+                                                       : Configuration.getInstance().getConfigDbEnabled();
                boolean done = false;
                boolean result = false;
                String snssai = "";
@@ -69,7 +75,12 @@ public class ConsumerThread extends Thread {
                                if (!snssai.equals("")) {
                                        log.info("Consumer thread processing data for s-nssai {}",snssai);    
                                        try {
-                                               nfs = configDbService.fetchNetworkFunctionsOfSnssai(snssai);
+                                               if (isConfigDbEnabled) {
+                                                       nfs = configDbService.fetchNetworkFunctionsOfSnssai(snssai);
+                                               }
+                                               else {
+                                                       nfs = cpsInterface.fetchNetworkFunctionsOfSnssai(snssai);
+                                               }
                                        }
                                        catch(Exception e) {
                                                pmDataQueue.putSnssaiToQueue(snssai);
diff --git a/components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/configdb/CpsInterfaceServiceTest.java b/components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/configdb/CpsInterfaceServiceTest.java
new file mode 100644 (file)
index 0000000..008736d
--- /dev/null
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  slice-analysis-ms
+ *  ================================================================================
+ *   Copyright (C) 2021 Wipro Limited.
+ *   ==============================================================================
+ *     Licensed under the Apache License, Version 2.0 (the "License");
+ *     you may not use this file except in compliance with the License.
+ *     You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ *     ============LICENSE_END=========================================================
+ *
+ *******************************************************************************/
+package org.onap.slice.analysis.ms.configdb;
+
+import static org.junit.Assert.assertEquals;
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.slice.analysis.ms.models.Configuration;
+import org.onap.slice.analysis.ms.restclients.CpsRestClient;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(PowerMockRunner.class)
+@PowerMockRunnerDelegate(SpringRunner.class)
+@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
+@PrepareForTest({ CpsService.class,Configuration.class })
+@SpringBootTest(classes = CpsInterfaceServiceTest.class)
+public class CpsInterfaceServiceTest {
+       @InjectMocks
+       CpsService cpsService;
+
+       @Mock
+       CpsRestClient restClient;
+
+       @Test
+       public void fetchCurrentConfigurationOfRICTest() {
+               Map<String, Object> map = new HashMap<>();
+               map.put("dLThptPerSlice", 10);
+               map.put("uLThptPerSlice", 10);
+               map.put("maxNumberOfConns", 10);
+               Map<String, Map<String, Object>> responseMap = new HashMap<>();
+               responseMap.put("11", map);
+               try {
+                       String serviceInstance = new String(
+                                       Files.readAllBytes(Paths.get("src/test/resources/sliceConfig.json")));
+                       Mockito.when(restClient.sendPostRequest(Mockito.anyString(), Mockito.anyString(), Mockito.any())).thenReturn(new ResponseEntity<>(serviceInstance, HttpStatus.OK));
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+               assertEquals(responseMap, cpsService.fetchCurrentConfigurationOfRIC("111-1111"));
+       }
+
+       @Test
+       public void fetchNetworkFunctionsOfSnssaiTest() {
+               List<String> responseList=new ArrayList<>();
+               responseList.add("22");
+               responseList.add("23");
+               try {
+                       String serviceInstance = new String(
+                                       Files.readAllBytes(Paths.get("src/test/resources/DUList.json")));
+                       Mockito.when(restClient.sendPostRequest(Mockito.anyString(), Mockito.anyString(), Mockito.any())).thenReturn(new ResponseEntity<>(serviceInstance, HttpStatus.OK));
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+               assertEquals(responseList, cpsService.fetchNetworkFunctionsOfSnssai("111-1111"));
+       }
+
+       @Test
+       public void fetchRICsOfSnssaiTest() {
+               Map<String,List<String>> responseMap=new HashMap<>();
+               List<String> cellslist=new ArrayList<>();
+               cellslist.add("1599");
+               cellslist.add("1598");
+               responseMap.put("11",cellslist);
+               try {
+                       String serviceInstance = new String(
+                                       Files.readAllBytes(Paths.get("src/test/resources/DUCellsList.json")));
+                       Mockito.when(restClient.sendPostRequest(Mockito.anyString(), Mockito.anyString(), Mockito.any())).thenReturn(new ResponseEntity<>(serviceInstance, HttpStatus.OK));
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+               assertEquals(responseMap, cpsService.fetchRICsOfSnssai("111-1111"));
+       }
+}
diff --git a/components/slice-analysis-ms/src/test/resources/DUCellsList.json b/components/slice-analysis-ms/src/test/resources/DUCellsList.json
new file mode 100644 (file)
index 0000000..799e1e8
--- /dev/null
@@ -0,0 +1,400 @@
+[
+  {
+    "idNearRTRIC": 11,
+    "attributes": {
+      "near-rt-ric-url": "10.165.160.47:6080",
+      "trackingArea": "Kingston",
+      "rANNFNSSIList": [
+        "e893-e93r-c0f2-kj76",
+        "m93ed-e93e-c0f2-9i7y"
+      ],
+      "RRMPolicyRatio": [
+        {
+          "id": "33",
+          "attributes": {
+            "resourceType": "sharing",
+            "rRMPolicyMemberList": [
+              {
+                "idx": 33,
+                "mcc": "310",
+                "mnc": "410",
+                "sNSSAI": 101
+              }
+            ],
+            "quotaType": "STRICT",
+            "rRMPolicyMaxRatio": 22,
+            "rRMPolicyMinRatio": 3,
+            "rRMPolicyDedicatedRatio": 4
+          }
+        }
+      ],
+      "pLMNInfoList": [
+        {
+          "mcc": "310",
+          "mnc": "410",
+          "sNSSAIList": [
+            {
+              "sNssai": "010",
+              "status": "ACTIVE",
+              "configData": [
+                {
+                  "configParameter": "maxNumberOfConns",
+                  "configValue": 10
+                },
+                {
+                  "configParameter": "uLThptPerSlice",
+                  "configValue": 10
+                },
+                {
+                  "configParameter": "dLThptPerSlice",
+                  "configValue": 10
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "sliceProfilesList": [
+        {
+          "sliceProfileId": "b594-e98r-c7f2-ij79",
+          "sNSSAI": 101,
+          "maxNumberofUEs": 24,
+          "latency": 2,
+          "uLThptPerSlice": 30,
+          "dLThptPerSlice": 60,
+          "maxNumberofConns": 22,
+          "uEMobilityLevel": "high",
+          "coverageAreaList": [
+            "CA1",
+            "CA2"
+          ],
+          "resourceSharingLevel": "Shared"
+        }
+      ]
+    },
+    "GNBDUFunction": [
+      {
+        "idGNBDUFunction": "22",
+        "attributes": {
+          "gNBDUFunction-url": "10.165.160.13:6080",
+          "gNBIdLength": 23,
+          "gNBDUName": "gnbdu1",
+          "gNBDUId": 22,
+          "gNBId": 98763,
+          "RRMPolicyRatio": [
+            {
+              "id": "34",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 34,
+                    "mcc": "211",
+                    "mnc": "111",
+                    "sNSSAI": 102
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 23,
+                "rRMPolicyMinRatio": 4,
+                "rRMPolicyDedicatedRatio": 5
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        },
+        "NRCellDU": [
+          {
+            "idNRCellDU": "1599",
+            "attributes": {
+              "nRCellDU-url": "10.165.160.15:8083",
+              "cellLocalId": 1599,
+              "operationalState": "ENABLED",
+              "administrativeState": "UNLOCKED",
+              "cellState": "ACTIVE",
+              "RRMPolicyRatio": [
+                {
+                  "id": "34",
+                  "attributes": {
+                    "resourceType": "sharing",
+                    "rRMPolicyMemberList": [
+                      {
+                        "idx": 34,
+                        "mcc": "211",
+                        "mnc": "111",
+                        "sNSSAI": 102
+                      }
+                    ],
+                    "quotaType": "STRICT",
+                    "rRMPolicyMaxRatio": 23,
+                    "rRMPolicyMinRatio": 4,
+                    "rRMPolicyDedicatedRatio": 5
+                  }
+                }
+              ],
+              "pLMNInfoList": [
+                {
+                  "mcc": "211",
+                  "mnc": "211",
+                  "sNSSAIList": [
+                    {
+                      "sNssai": "111-1111",
+                      "status": "active",
+                      "configData": [
+                        {
+                          "configParameter": "maxNumberOfConns",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "dLThptPerSlice",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "uLThptPerSlice",
+                          "configValue": 20
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "nRPCI": 11,
+              "nRTAC": 14777,
+              "arfcnDL": 1,
+              "arfcnUL": 2,
+              "arfcnSUL": 3,
+              "bSChannelBwDL": 4,
+              "bSChannelBwUL": 5,
+              "bSChannelBwSUL": 6,
+              "ssbFrequency": 7,
+              "ssbSubCarrierSpacing": 15,
+              "ssbOffset": 9,
+              "ssbDuration": 4,
+              "nRSectorCarrierRef": [
+                "OU=Sales"
+              ],
+              "userLabel": "user",
+              "sAP": [
+                {
+                  "host": "localhost",
+                  "port": 8080
+                }
+              ]
+            }
+          },
+          {
+            "idNRCellDU": "1598",
+            "attributes": {
+              "nRCellDU-url": "10.165.160.15:8083",
+              "cellLocalId": 1598,
+              "operationalState": "ENABLED",
+              "administrativeState": "UNLOCKED",
+              "cellState": "ACTIVE",
+              "RRMPolicyRatio": [
+                {
+                  "id": "34",
+                  "attributes": {
+                    "resourceType": "sharing",
+                    "rRMPolicyMemberList": [
+                      {
+                        "idx": 34,
+                        "mcc": "211",
+                        "mnc": "111",
+                        "sNSSAI": 102
+                      }
+                    ],
+                    "quotaType": "STRICT",
+                    "rRMPolicyMaxRatio": 23,
+                    "rRMPolicyMinRatio": 4,
+                    "rRMPolicyDedicatedRatio": 5
+                  }
+                }
+              ],
+              "pLMNInfoList": [
+                {
+                  "mcc": "211",
+                  "mnc": "211",
+                  "sNSSAIList": [
+                    {
+                      "sNssai": "111-1111",
+                      "status": "active",
+                      "configData": [
+                        {
+                          "configParameter": "maxNumberOfConns",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "dLThptPerSlice",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "uLThptPerSlice",
+                          "configValue": 20
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "nRPCI": 11,
+              "nRTAC": 14777,
+              "arfcnDL": 1,
+              "arfcnUL": 2,
+              "arfcnSUL": 3,
+              "bSChannelBwDL": 4,
+              "bSChannelBwUL": 5,
+              "bSChannelBwSUL": 6,
+              "ssbFrequency": 7,
+              "ssbSubCarrierSpacing": 15,
+              "ssbOffset": 9,
+              "ssbDuration": 4,
+              "nRSectorCarrierRef": [
+                "OU=Sales"
+              ],
+              "userLabel": "user",
+              "sAP": [
+                {
+                  "host": "localhost",
+                  "port": 8080
+                }
+              ]
+            }
+          }
+        ]
+      }
+    ],
+    "GNBCUUPFunction": [
+      {
+        "idGNBCUUPFunction": "22",
+        "attributes": {
+          "gNBCUUPFunction-url": "10.165.160.13:6080",
+          "gNBId": 22,
+          "RRMPolicyRatio": [
+            {
+              "id": "35",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 35,
+                    "mcc": "212",
+                    "mnc": "212",
+                    "sNSSAI": 203
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 22,
+                "rRMPolicyMinRatio": 3,
+                "rRMPolicyDedicatedRatio": 4
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        }
+      }
+    ],
+    "GNBCUCPFunction": [
+      {
+        "idGNBCUCPFunction": "32",
+        "attributes": {
+          "gNBCUCPFunction-url": "10.165.160.13:6080",
+          "gNBId": 32,
+          "gNBIdLength": 23,
+          "gNBCUName": "gnbcucp1",
+          "RRMPolicyRatio": [
+            {
+              "id": "43",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 43,
+                    "mcc": "310",
+                    "mnc": "410",
+                    "sNSSAI": 101
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 22,
+                "rRMPolicyMinRatio": 3,
+                "rRMPolicyDedicatedRatio": 4
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        },
+        "NRCellCU": [
+          {
+            "idNRCellCU": "15199",
+            "attributes": {
+              "nRCellCU-url": "10.165.160.15:8083",
+              "cellLocalId": 15199,
+              "RRMPolicyRatio": [
+                {
+                  "id": "55",
+                  "attributes": {
+                    "resourceType": "sharing",
+                    "rRMPolicyMemberList": [
+                      {
+                        "idx": 55,
+                        "mcc": "550",
+                        "mnc": "550",
+                        "sNSSAI": 101
+                      }
+                    ],
+                    "quotaType": "STRICT",
+                    "rRMPolicyMaxRatio": 22,
+                    "rRMPolicyMinRatio": 3,
+                    "rRMPolicyDedicatedRatio": 4
+                  }
+                }
+              ],
+              "pLMNInfoList": [
+                {
+                  "mcc": "551",
+                  "mnc": "550",
+                  "sNSSAIList": [
+                    {
+                      "sNssai": "501",
+                      "status": "active",
+                      "configData": [
+                        {
+                          "configParameter": "maxNumberOfConns",
+                          "configValue": 10
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "sAP": [
+                {
+                  "host": "localhost",
+                  "port": 8080
+                }
+              ]
+            }
+          }
+        ]
+      }
+    ]
+  }
+]
diff --git a/components/slice-analysis-ms/src/test/resources/DUList.json b/components/slice-analysis-ms/src/test/resources/DUList.json
new file mode 100644 (file)
index 0000000..26b96ed
--- /dev/null
@@ -0,0 +1,236 @@
+[
+  {
+    "idGNBDUFunction": "22",
+    "attributes": {
+      "gNBDUFunction-url": "10.165.160.13:6080",
+      "gNBIdLength": 23,
+      "gNBDUName": "gnbdu1",
+      "gNBDUId": 22,
+      "gNBId": 98763,
+      "RRMPolicyRatio": [
+        {
+          "id": "34",
+          "attributes": {
+            "resourceType": "sharing",
+            "rRMPolicyMemberList": [
+              {
+                "idx": 34,
+                "mcc": "211",
+                "mnc": "111",
+                "sNSSAI": 102
+              }
+            ],
+            "quotaType": "STRICT",
+            "rRMPolicyMaxRatio": 23,
+            "rRMPolicyMinRatio": 4,
+            "rRMPolicyDedicatedRatio": 5
+          }
+        }
+      ],
+      "userLabel": "user",
+      "sAP": [
+        {
+          "host": "localhost",
+          "port": 8080
+        }
+      ]
+    },
+    "NRCellDU": [
+      {
+        "idNRCellDU": "15299",
+        "attributes": {
+          "nRCellDU-url": "10.165.160.15:8083",
+          "cellLocalId": 15299,
+          "operationalState": "ENABLED",
+          "administrativeState": "UNLOCKED",
+          "cellState": "ACTIVE",
+          "RRMPolicyRatio": [
+            {
+              "id": "34",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 34,
+                    "mcc": "211",
+                    "mnc": "111",
+                    "sNSSAI": 102
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 23,
+                "rRMPolicyMinRatio": 4,
+                "rRMPolicyDedicatedRatio": 5
+              }
+            }
+          ],
+          "pLMNInfoList": [
+            {
+              "mcc": "211",
+              "mnc": "211",
+              "sNSSAIList": [
+                {
+                  "sNssai": "111-1111",
+                  "status": "active",
+                  "configData": [
+                    {
+                      "configParameter": "maxNumberOfConns",
+                      "configValue": 20
+                    },
+                    {
+                      "configParameter": "dLThptPerSlice",
+                      "configValue": 20
+                    },
+                    {
+                      "configParameter": "uLThptPerSlice",
+                      "configValue": 20
+                    }
+                  ]
+                }
+              ]
+            }
+          ],
+          "nRPCI": 11,
+          "nRTAC": 14777,
+          "arfcnDL": 1,
+          "arfcnUL": 2,
+          "arfcnSUL": 3,
+          "bSChannelBwDL": 4,
+          "bSChannelBwUL": 5,
+          "bSChannelBwSUL": 6,
+          "ssbFrequency": 7,
+          "ssbSubCarrierSpacing": 15,
+          "ssbOffset": 9,
+          "ssbDuration": 4,
+          "nRSectorCarrierRef": [
+            "OU=Sales"
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        }
+      }
+    ]
+  },
+  {
+    "idGNBDUFunction": "23",
+    "attributes": {
+      "gNBDUFunction-url": "10.165.160.13:6080",
+      "gNBIdLength": 23,
+      "gNBDUName": "gnbdu1",
+      "gNBDUId": 23,
+      "gNBId": 98763,
+      "RRMPolicyRatio": [
+        {
+          "id": "34",
+          "attributes": {
+            "resourceType": "sharing",
+            "rRMPolicyMemberList": [
+              {
+                "idx": 34,
+                "mcc": "211",
+                "mnc": "111",
+                "sNSSAI": 102
+              }
+            ],
+            "quotaType": "STRICT",
+            "rRMPolicyMaxRatio": 23,
+            "rRMPolicyMinRatio": 4,
+            "rRMPolicyDedicatedRatio": 5
+          }
+        }
+      ],
+      "userLabel": "user",
+      "sAP": [
+        {
+          "host": "localhost",
+          "port": 8080
+        }
+      ]
+    },
+    "NRCellDU": [
+      {
+        "idNRCellDU": "15299",
+        "attributes": {
+          "nRCellDU-url": "10.165.160.15:8083",
+          "cellLocalId": 15299,
+          "operationalState": "ENABLED",
+          "administrativeState": "UNLOCKED",
+          "cellState": "ACTIVE",
+          "RRMPolicyRatio": [
+            {
+              "id": "34",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 34,
+                    "mcc": "211",
+                    "mnc": "111",
+                    "sNSSAI": 102
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 23,
+                "rRMPolicyMinRatio": 4,
+                "rRMPolicyDedicatedRatio": 5
+              }
+            }
+          ],
+          "pLMNInfoList": [
+            {
+              "mcc": "211",
+              "mnc": "211",
+              "sNSSAIList": [
+                {
+                  "sNssai": "111-1111",
+                  "status": "active",
+                  "configData": [
+                    {
+                      "configParameter": "maxNumberOfConns",
+                      "configValue": 20
+                    },
+                    {
+                      "configParameter": "dLThptPerSlice",
+                      "configValue": 20
+                    },
+                    {
+                      "configParameter": "uLThptPerSlice",
+                      "configValue": 20
+                    }
+                  ]
+                }
+              ]
+            }
+          ],
+          "nRPCI": 11,
+          "nRTAC": 14777,
+          "arfcnDL": 1,
+          "arfcnUL": 2,
+          "arfcnSUL": 3,
+          "bSChannelBwDL": 4,
+          "bSChannelBwUL": 5,
+          "bSChannelBwSUL": 6,
+          "ssbFrequency": 7,
+          "ssbSubCarrierSpacing": 15,
+          "ssbOffset": 9,
+          "ssbDuration": 4,
+          "nRSectorCarrierRef": [
+            "OU=Sales"
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        }
+      }
+    ]
+  }
+]
diff --git a/components/slice-analysis-ms/src/test/resources/sliceConfig.json b/components/slice-analysis-ms/src/test/resources/sliceConfig.json
new file mode 100644 (file)
index 0000000..8e5e188
--- /dev/null
@@ -0,0 +1,322 @@
+[
+  {
+    "idNearRTRIC": 11,
+    "attributes": {
+      "near-rt-ric-url": "10.165.160.47:6080",
+      "trackingArea": "Kingston",
+      "rANNFNSSIList": [
+        "e893-e93r-c0f2-kj76",
+        "m93ed-e93e-c0f2-9i7y"
+      ],
+      "RRMPolicyRatio": [
+        {
+          "id": "33",
+          "attributes": {
+            "resourceType": "sharing",
+            "rRMPolicyMemberList": [
+              {
+                "idx": 33,
+                "mcc": "310",
+                "mnc": "410",
+                "sNSSAI": 101
+              }
+            ],
+            "quotaType": "STRICT",
+            "rRMPolicyMaxRatio": 22,
+            "rRMPolicyMinRatio": 3,
+            "rRMPolicyDedicatedRatio": 4
+          }
+        }
+      ],
+      "pLMNInfoList": [
+        {
+          "mcc": "310",
+          "mnc": "410",
+          "sNSSAIList": [
+            {
+              "sNssai": "111-1111",
+              "status": "ACTIVE",
+              "configData": [
+                {
+                  "configParameter": "maxNumberOfConns",
+                  "configValue": 10
+                },
+                {
+                  "configParameter": "uLThptPerSlice",
+                  "configValue": 10
+                },
+                {
+                  "configParameter": "dLThptPerSlice",
+                  "configValue": 10
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "sliceProfilesList": [
+        {
+          "sliceProfileId": "b594-e98r-c7f2-ij79",
+          "sNSSAI": 101,
+          "maxNumberofUEs": 24,
+          "latency": 2,
+          "uLThptPerSlice": 30,
+          "dLThptPerSlice": 60,
+          "maxNumberofConns": 22,
+          "uEMobilityLevel": "high",
+          "coverageAreaList": [
+            "CA1",
+            "CA2"
+          ],
+          "resourceSharingLevel": "Shared"
+        }
+      ]
+    },
+    "GNBDUFunction": [
+      {
+        "idGNBDUFunction": "22",
+        "attributes": {
+          "gNBDUFunction-url": "10.165.160.13:6080",
+          "gNBIdLength": 23,
+          "gNBDUName": "gnbdu1",
+          "gNBDUId": 22,
+          "gNBId": 98763,
+          "RRMPolicyRatio": [
+            {
+              "id": "34",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 34,
+                    "mcc": "211",
+                    "mnc": "111",
+                    "sNSSAI": 102
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 23,
+                "rRMPolicyMinRatio": 4,
+                "rRMPolicyDedicatedRatio": 5
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        },
+        "NRCellDU": [
+          {
+            "idNRCellDU": "15299",
+            "attributes": {
+              "nRCellDU-url": "10.165.160.15:8083",
+              "cellLocalId": 15299,
+              "operationalState": "ENABLED",
+              "administrativeState": "UNLOCKED",
+              "cellState": "ACTIVE",
+              "RRMPolicyRatio": [
+                {
+                  "id": "34",
+                  "attributes": {
+                    "resourceType": "sharing",
+                    "rRMPolicyMemberList": [
+                      {
+                        "idx": 34,
+                        "mcc": "211",
+                        "mnc": "111",
+                        "sNSSAI": 102
+                      }
+                    ],
+                    "quotaType": "STRICT",
+                    "rRMPolicyMaxRatio": 23,
+                    "rRMPolicyMinRatio": 4,
+                    "rRMPolicyDedicatedRatio": 5
+                  }
+                }
+              ],
+              "pLMNInfoList": [
+                {
+                  "mcc": "211",
+                  "mnc": "211",
+                  "sNSSAIList": [
+                    {
+                      "sNssai": "111-1111",
+                      "status": "active",
+                      "configData": [
+                        {
+                          "configParameter": "maxNumberOfConns",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "dLThptPerSlice",
+                          "configValue": 20
+                        },
+                        {
+                          "configParameter": "uLThptPerSlice",
+                          "configValue": 20
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "nRPCI": 11,
+              "nRTAC": 14777,
+              "arfcnDL": 1,
+              "arfcnUL": 2,
+              "arfcnSUL": 3,
+              "bSChannelBwDL": 4,
+              "bSChannelBwUL": 5,
+              "bSChannelBwSUL": 6,
+              "ssbFrequency": 7,
+              "ssbSubCarrierSpacing": 15,
+              "ssbOffset": 9,
+              "ssbDuration": 4,
+              "nRSectorCarrierRef": [
+                "OU=Sales"
+              ],
+              "userLabel": "user",
+              "sAP": [
+                {
+                  "host": "localhost",
+                  "port": 8080
+                }
+              ]
+            }
+          }
+        ]
+      }
+    ],
+    "GNBCUUPFunction": [
+      {
+        "idGNBCUUPFunction": "22",
+        "attributes": {
+          "gNBCUUPFunction-url": "10.165.160.13:6080",
+          "gNBId": 22,
+          "RRMPolicyRatio": [
+            {
+              "id": "35",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 35,
+                    "mcc": "212",
+                    "mnc": "212",
+                    "sNSSAI": 203
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 22,
+                "rRMPolicyMinRatio": 3,
+                "rRMPolicyDedicatedRatio": 4
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        }
+      }
+    ],
+    "GNBCUCPFunction": [
+      {
+        "idGNBCUCPFunction": "32",
+        "attributes": {
+          "gNBCUCPFunction-url": "10.165.160.13:6080",
+          "gNBId": 32,
+          "gNBIdLength": 23,
+          "gNBCUName": "gnbcucp1",
+          "RRMPolicyRatio": [
+            {
+              "id": "43",
+              "attributes": {
+                "resourceType": "sharing",
+                "rRMPolicyMemberList": [
+                  {
+                    "idx": 43,
+                    "mcc": "310",
+                    "mnc": "410",
+                    "sNSSAI": 101
+                  }
+                ],
+                "quotaType": "STRICT",
+                "rRMPolicyMaxRatio": 22,
+                "rRMPolicyMinRatio": 3,
+                "rRMPolicyDedicatedRatio": 4
+              }
+            }
+          ],
+          "userLabel": "user",
+          "sAP": [
+            {
+              "host": "localhost",
+              "port": 8080
+            }
+          ]
+        },
+        "NRCellCU": [
+          {
+            "idNRCellCU": "15199",
+            "attributes": {
+              "nRCellCU-url": "10.165.160.15:8083",
+              "cellLocalId": 15199,
+              "RRMPolicyRatio": [
+                {
+                  "id": "55",
+                  "attributes": {
+                    "resourceType": "sharing",
+                    "rRMPolicyMemberList": [
+                      {
+                        "idx": 55,
+                        "mcc": "550",
+                        "mnc": "550",
+                        "sNSSAI": 101
+                      }
+                    ],
+                    "quotaType": "STRICT",
+                    "rRMPolicyMaxRatio": 22,
+                    "rRMPolicyMinRatio": 3,
+                    "rRMPolicyDedicatedRatio": 4
+                  }
+                }
+              ],
+              "pLMNInfoList": [
+                {
+                  "mcc": "551",
+                  "mnc": "550",
+                  "sNSSAIList": [
+                    {
+                      "sNssai": "501",
+                      "status": "active",
+                      "configData": [
+                        {
+                          "configParameter": "maxNumberOfConns",
+                          "configValue": 10
+                        }
+                      ]
+                    }
+                  ]
+                }
+              ],
+              "sAP": [
+                {
+                  "host": "localhost",
+                  "port": 8080
+                }
+              ]
+            }
+          }
+        ]
+      }
+    ]
+  }
+]