Merge "Fix Issues - Fix certificate issue for authenticated topic - Fix consumer... 1.0.1-slice-analysis-ms
authorVijay Venkatesh Kumar <vv770d@att.com>
Wed, 28 Oct 2020 14:02:25 +0000 (14:02 +0000)
committerGerrit Code Review <gerrit@onap.org>
Wed, 28 Oct 2020 14:02:25 +0000 (14:02 +0000)
22 files changed:
components/slice-analysis-ms/entry.sh [new file with mode: 0644]
components/slice-analysis-ms/pom.xml
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/Application.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/configdb/ConfigDbInterfaceService.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/configdb/IConfigDbService.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/models/Configuration.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/models/MeasurementObject.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/restclients/RestClient.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/AverageCalculator.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/ConsumerThread.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/PmDataQueue.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/PmEventProcessor.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/PmThread.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/PolicyService.java
components/slice-analysis-ms/src/main/java/org/onap/slice/analysis/ms/service/SnssaiSamplesProcessor.java
components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/restclients/RestClientTest.java
components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/service/AverageCalculatorTest.java
components/slice-analysis-ms/src/test/java/org/onap/slice/analysis/ms/service/SnssaiSamplesProcessorTest.java
components/slice-analysis-ms/src/test/resources/appendData.json
components/slice-analysis-ms/src/test/resources/av.json [new file with mode: 0644]
components/slice-analysis-ms/src/test/resources/average.json
components/slice-analysis-ms/src/test/resources/test.json [new file with mode: 0644]

diff --git a/components/slice-analysis-ms/entry.sh b/components/slice-analysis-ms/entry.sh
new file mode 100644 (file)
index 0000000..2859fe9
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/bash
+export trustpass=`cat /opt/app/sliceanalysisms/etc/cert/trust.pass`
+java -Djavax.net.ssl.trustStore=/opt/app/sliceanalysisms/etc/cert/trust.jks -Djavax.net.ssl.trustStorePassword=$trustpass -jar /bin/application.jar
\ No newline at end of file
index 0802840..1eac47f 100644 (file)
@@ -32,7 +32,7 @@
 
        <groupId>org.onap.dcaegen2.services.components</groupId>
        <artifactId>slice-analysis-ms</artifactId>
-       <version>1.0.0-SNAPSHOT</version>
+       <version>1.0.1-SNAPSHOT</version>
        <name>dcaegen2-services-slice-analysis-ms</name>
        <description>Network slice PM analyser</description>
         <packaging>jar</packaging>
                                                        <directory>${project.build.directory}</directory>
                                                        <include>${project.artifactId}-${project.version}.jar</include>
                                                </resource>
+                                               <resource>
+                                                       <targetPath>/bin</targetPath>
+                                                       <directory>${project.basedir}</directory>
+                                                       <include>entry.sh</include>
+                                               </resource>
                                        </resources>
                                        <runs>
                                                <!-- Maven is loosing file permissions during artifacts copy -->
                                                <run>adduser --disabled-password sliceanalysis </run>
                                                <run>mv /bin/*.jar /bin/application.jar</run>
                                                <run>chmod -R 777 /bin</run>
+                                               <run>chmod +x /bin/entry.sh</run>
                                        </runs>
                                        <exposes>
                                                <expose>8080</expose>
                                        </exposes>
-                                       <entryPoint>java -jar /bin/application.jar</entryPoint>
+                                       <entryPoint>./bin/entry.sh</entryPoint>
                                </configuration>
                        </plugin>
                </plugins>
index 759706e..2ecaf7e 100644 (file)
 
 package org.onap.slice.analysis.ms;
 
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.google.gson.reflect.TypeToken;
-
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.lang.reflect.Type;
@@ -42,9 +35,16 @@ import org.onap.slice.analysis.ms.models.ConfigPolicy;
 import org.onap.slice.analysis.ms.models.Configuration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.jdbc.DataSourceBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.client.RestTemplate;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
 
 /**
  * 
@@ -121,6 +121,11 @@ public class Application {
         return DataSourceBuilder.create().url(url).username(configuration.getPgUsername())
                 .password(configuration.getPgPassword()).build();
     }
+    
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
 
     private static String readFromFile(String file) {
         String content = "";
index b3cd7b1..8a11bdb 100644 (file)
@@ -62,9 +62,9 @@ public class ConfigDbInterfaceService implements IConfigDbService {
        /**
         *  Fetches the current configuration of RIC from config DB
         */
-       public Map<String,Map<String,Integer>> fetchCurrentConfigurationOfRIC(String snssai){
+       public Map<String,Map<String,Object>> fetchCurrentConfigurationOfRIC(String snssai){
                String reqUrl=configDbBaseUrl+"/api/sdnc-config-db/v4/slice-config/"+snssai;
-               ResponseEntity<Map<String,Map<String,Integer>>> response=restclient.sendGetRequest(reqUrl, new ParameterizedTypeReference<Map<String,Map<String,Integer>>>() {
+               ResponseEntity<Map<String,Map<String,Object>>> response=restclient.sendGetRequest(reqUrl, new ParameterizedTypeReference<Map<String,Map<String,Object>>>() {
                });
                return response.getBody();
        }
@@ -87,24 +87,18 @@ public class ConfigDbInterfaceService implements IConfigDbService {
         *  Fetches the RICS of an S-NSSAI from config DB
         */
        public Map<String, List<String>> fetchRICsOfSnssai(String snssai){
-
                Map<String,List<String>> responseMap=new HashMap<>();
-
                String reqUrl=configDbBaseUrl+"/api/sdnc-config-db/v4/du-cell-list/"+snssai;
-
-               ResponseEntity<Map<String,List<CellsModel>>> response=restclient.sendGetRequest(reqUrl, new ParameterizedTypeReference<Map<String,List<CellsModel>>>() {
+               ResponseEntity<Map<String,List<CellsModel>>> response = restclient.sendGetRequest(reqUrl, new ParameterizedTypeReference<Map<String,List<CellsModel>>>() {
                });
 
-
                for (Map.Entry<String, List<CellsModel>> entry : response.getBody().entrySet()) {
                        List<String> cellslist=new ArrayList<>();
                        for(CellsModel cellmodel:entry.getValue()) {
-
                                cellslist.add(cellmodel.getCellLocalId());
                        }
                        responseMap.put(entry.getKey(), cellslist);
                }
-
                return responseMap;
        }
 
index 3c8a9f8..7413c18 100644 (file)
@@ -34,6 +34,6 @@ public interface IConfigDbService {
        public Map<String, List<String>> fetchRICsOfSnssai(String snssai);
        public List<String> fetchNetworkFunctionsOfSnssai(String snssai);
        public Map<String, Integer> fetchCurrentConfigurationOfSlice(String snssai);
-       public Map<String, Map<String,Integer>> fetchCurrentConfigurationOfRIC(String snssai);
+       public Map<String, Map<String,Object>> fetchCurrentConfigurationOfRIC(String snssai);
        public Map<String ,String> fetchServiceDetails(String snssai);
 }
index 25a8046..8bdbb1a 100644 (file)
@@ -260,6 +260,9 @@ public class Configuration {
                 minPercentageChange = jsonObject.get("sliceanalysisms.minPercentageChange").getAsInt();
                 initialDelaySeconds = jsonObject.get("sliceanalysisms.initialDelaySeconds").getAsLong();
 
+                aafUsername = jsonObject.get("aafUsername").getAsString();
+                aafPassword = jsonObject.get("aafPassword").getAsString();
+                
                 log.info("configuration from CBS {}", this);
         }
 }
index 047c985..b94d75d 100644 (file)
@@ -22,6 +22,7 @@
 
 package org.onap.slice.analysis.ms.models;
 
+import java.util.List;
 import java.util.Map;
 
 /** 
@@ -31,6 +32,17 @@ public class MeasurementObject {
        private String measurementObjectId;
        private Map<String, Integer> pmData;
 
+       public static int findIndex(String measurementObjectId, List<MeasurementObject> list) {
+               int index = -1;
+               int len = list.size();
+               for(int i=0; i<len ; i++) {
+                       if(measurementObjectId.equals(list.get(i).getMeasurementObjectId())) {
+                               index = i;
+                       }
+               }
+               return index;
+       }
+
        public String getMeasurementObjectId() {
                return measurementObjectId;
        }
@@ -67,9 +79,10 @@ public class MeasurementObject {
                final int prime = 31;
                int result = 1;
                result = prime * result + ((measurementObjectId == null) ? 0 : measurementObjectId.hashCode());
+               result = prime * result + ((pmData == null) ? 0 : pmData.hashCode());
                return result;
        }
-       
+
        @Override
        public boolean equals(Object obj) {
                if (this == obj)
@@ -84,6 +97,11 @@ public class MeasurementObject {
                                return false;
                } else if (!measurementObjectId.equals(other.measurementObjectId))
                        return false;
+               if (pmData == null) {
+                       if (other.pmData != null)
+                               return false;
+               } else if (!pmData.equals(other.pmData))
+                       return false;
                return true;
        }
 
index 5946fd1..65de983 100644 (file)
@@ -21,8 +21,8 @@
 
 package org.onap.slice.analysis.ms.restclients;
 
-import org.onap.slice.analysis.ms.utils.BeanUtil;
 import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
@@ -40,7 +40,9 @@ public class RestClient {
 
        private static final String EXCEPTION_MSG = "Exception caught during request {}";
        private static final Logger log = org.slf4j.LoggerFactory.getLogger(RestClient.class);
-
+       
+       @Autowired
+       private RestTemplate restTemplate;
        protected RestClient() {
 
        }
@@ -53,7 +55,6 @@ public class RestClient {
                        ParameterizedTypeReference<T> responseType) {
                HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
                try {
-                       RestTemplate restTemplate = BeanUtil.getBean(RestTemplate.class);
                        return restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity, responseType);
                } catch (Exception e) {
                        log.debug(EXCEPTION_MSG, e.getMessage());
@@ -68,7 +69,6 @@ public class RestClient {
        public <T> ResponseEntity<T> sendGetRequest(HttpHeaders headers, String requestUrl, ParameterizedTypeReference<T> responseType) {
                HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
                try {
-                       RestTemplate restTemplate = BeanUtil.getBean(RestTemplate.class);
                        return restTemplate.exchange(requestUrl, HttpMethod.GET, requestEntity, responseType);
                } catch (Exception e) {
                        log.debug(EXCEPTION_MSG, e.getMessage());
index a003e9c..52670d5 100644 (file)
@@ -50,19 +50,22 @@ public class AverageCalculator {
         * Find average of samples
         */
        public List<MeasurementObject> findAverageOfSamples(List<List<MeasurementObject>> samples) {
+               log.debug("find average for samples {}", samples);
                int numOfSamples = samples.size();
                List<MeasurementObject> result = new ArrayList<>();
-               samples.forEach(sample -> 
-               sample.forEach(cellMeasObj -> {
-                       int index = result.indexOf(cellMeasObj);
-                       if(index != -1) {
-                               result.set(index, findSum(result.get(index), cellMeasObj));
+               if(!samples.isEmpty()) {
+                       for(List<MeasurementObject> sample : samples) {
+                               for(MeasurementObject cellMeasObj : sample) {
+                                       int index = MeasurementObject.findIndex(cellMeasObj.getMeasurementObjectId(), result);
+                                       if(index != -1) {
+                                               result.set(index, findSum(result.get(index), cellMeasObj));
+                                       }
+                                       else { 
+                                               result.add(cellMeasObj);
+                                       }
+                               }
                        }
-                       else { 
-                               result.add(cellMeasObj);
-                       }
-               })
-                               );
+               }
                return findAvg(result, numOfSamples);
        }
 
@@ -81,13 +84,15 @@ public class AverageCalculator {
         * Calculate the average
         */
        public List<MeasurementObject> findAvg(List<MeasurementObject> result, int numOfSamples) {
-               result.forEach(cellMeasObj ->
-               pmNames.forEach(pmName -> {
-                       int value = (cellMeasObj.getPmData().get(pmName))/numOfSamples;
-                       cellMeasObj.getPmData().put(pmName, value);
-               })
-                               );
-               log.debug("Average of measurement data samples {}",result);
+               if(!result.isEmpty()) {
+                       result.forEach(cellMeasObj ->
+                       pmNames.forEach(pmName -> {
+                               int value = (cellMeasObj.getPmData().get(pmName))/numOfSamples;
+                               cellMeasObj.getPmData().put(pmName, value);
+                       })
+                       );
+                       log.debug("Average of measurement data samples {}",result);
+               }
                return result;
        }
 }
index 39235cd..6868bc4 100644 (file)
@@ -21,6 +21,8 @@
 
 package org.onap.slice.analysis.ms.service;
 
+import java.util.List;
+
 import org.onap.slice.analysis.ms.configdb.IConfigDbService;
 import org.onap.slice.analysis.ms.models.Configuration;
 import org.onap.slice.analysis.ms.utils.BeanUtil;
@@ -31,7 +33,7 @@ import org.slf4j.LoggerFactory;
  * This Thread class consumes message from pm data queue and sends onset message to policy
  */
 public class ConsumerThread extends Thread {
-       private static Logger log = LoggerFactory.getLogger(PmThread.class);
+       private static Logger log = LoggerFactory.getLogger(ConsumerThread.class);
        private PmDataQueue pmDataQueue;
        private IConfigDbService configDbService;
        private SnssaiSamplesProcessor snssaiSamplesProcessor;
@@ -55,16 +57,31 @@ public class ConsumerThread extends Thread {
        public void run() {    
                boolean done = false;
                String snssai = "";
+               boolean result = false;
+               List<String> nfs = null;
                while (!done) {
                        try {
                                Thread.sleep(initialDelaySec);
                                snssai = pmDataQueue.getSnnsaiFromQueue();
                                if (!snssai.equals("")) {
-                                       log.info("Consumer thread started for s-nssai {}",snssai);    
-                                       snssaiSamplesProcessor.processSamplesOfSnnsai(snssai, configDbService.fetchNetworkFunctionsOfSnssai(snssai));
+                                       log.info("Consumer thread processing data for s-nssai {}",snssai);    
+                                       try {
+                                               nfs = configDbService.fetchNetworkFunctionsOfSnssai(snssai);
+                                       }
+                                       catch(Exception e) {
+                                               pmDataQueue.putSnssaiToQueue(snssai);
+                                               log.error("Exception caught while fetching nfs of snssai {}, {}", snssai, e.getMessage());
+                                       }
+                                       if(nfs != null) {
+                                               result = snssaiSamplesProcessor.processSamplesOfSnnsai(snssai, nfs);
+                                               if(!result) {
+                                                       log.info("Not enough samples to process for {}",snssai);
+                                                       pmDataQueue.putSnssaiToQueue(snssai);
+                                               }
+                                       }
                                }
                        } catch (Exception e) {
-                               log.error("Exception in Consumer Thread ", e);
+                               log.error("Exception in Consumer Thread, {}", e.getMessage());
                                done = true;
                        }
                }
index d907bfe..4f19697 100644 (file)
@@ -31,6 +31,8 @@ import java.util.concurrent.LinkedBlockingQueue;
 
 import org.onap.slice.analysis.ms.models.MeasurementObject;
 import org.onap.slice.analysis.ms.models.SubCounter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 /** 
@@ -38,6 +40,8 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class PmDataQueue {
+    private static Logger log = LoggerFactory.getLogger(PmDataQueue.class);
+
        private Map<SubCounter, Queue<List<MeasurementObject>>> subCounterMap = Collections.synchronizedMap(new LinkedHashMap<SubCounter, Queue<List<MeasurementObject>>>());
        private Queue<String> snssaiList = new LinkedBlockingQueue<>();
 
@@ -54,6 +58,7 @@ public class PmDataQueue {
                        measQueue.add(measurementObjectData);
                        subCounterMap.put(subCounter, measQueue);
                }
+               log.debug("Queue: {}", subCounterMap);
        }
 
        /**
@@ -61,12 +66,15 @@ public class PmDataQueue {
         * returns the specified number of samples
         */
        public List<List<MeasurementObject>> getSamplesFromQueue(SubCounter subCounter, int samples) {
-               List<List<MeasurementObject>> sampleList = new LinkedList<>();
+               List<List<MeasurementObject>> sampleList = null;
                if (subCounterMap.containsKey(subCounter)){
                        Queue<List<MeasurementObject>> measQueue = subCounterMap.get(subCounter);
-                       while(samples > 0) {
-                               sampleList.add(measQueue.remove());
-                               samples --;
+                       if(measQueue.size() >= samples) {
+                               sampleList = new LinkedList<>();
+                               while(samples > 0) {
+                                       sampleList.add(measQueue.remove());
+                                       samples --;
+                               }
                        }
                }
                return sampleList;
@@ -86,10 +94,12 @@ public class PmDataQueue {
        public String getSnnsaiFromQueue() {
                String snssai = "";
                try {
-                       snssai = snssaiList.remove();
+                       if(!snssaiList.isEmpty()){
+                               snssai = snssaiList.remove();
+                       }
                }
                catch(Exception e) {
-
+                       log.error("Problem fetching from the Queue, {}", e.getMessage());
                }
                return snssai;
        }
index 99c24c8..51a0466 100644 (file)
@@ -31,6 +31,8 @@ import org.onap.slice.analysis.ms.models.pmnotification.Event;
 import org.onap.slice.analysis.ms.models.pmnotification.MeasInfoList;
 import org.onap.slice.analysis.ms.models.pmnotification.MeasResult;
 import org.onap.slice.analysis.ms.models.pmnotification.MeasValuesList;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
@@ -41,7 +43,7 @@ import org.springframework.stereotype.Component;
 @Scope("prototype")
 public class PmEventProcessor implements IPmEventProcessor{
        protected Map<String, List<MeasurementObject>> instanceMap = new HashMap<>();
-
+       private static Logger log = LoggerFactory.getLogger(PmEventProcessor.class);
 
        /**
         * Process the PM event
@@ -53,6 +55,7 @@ public class PmEventProcessor implements IPmEventProcessor{
                        List<MeasValuesList> subCounterMeasurements = measurement.getMeasValuesList();  
                        subCounterMeasurements.forEach(subCounterMeasurement -> processMeasurementObjectData(collectedSubCounters, subCounterMeasurement));
                });
+               log.info("Processed Event: {}", instanceMap);
                return instanceMap;
        }
 
@@ -65,26 +68,28 @@ public class PmEventProcessor implements IPmEventProcessor{
                measResultList.forEach(measResult -> {
                        String pmName = collectedSubCounters.get(measResult.getP()-1);
                        Integer pmValue = Integer.valueOf(measResult.getsValue());
-                       Map<String,String> pmMapping = getMapKey(pmName);
-                       String snssai = pmMapping.get("snssai");
-                       String pm = pmMapping.get("pm"); 
-                       Map<String, Integer> pmData = new HashMap<>();
-                       pmData.put(pm, pmValue);
-                       if (instanceMap.containsKey(snssai)) {
-                               int index = instanceMap.get(snssai).indexOf(new MeasurementObject(measObjId));
-                               if (index == -1) {
-                                       instanceMap.get(snssai).add(new MeasurementObject(measObjId,pmData));
+                       if(pmName.contains("PrbUsedUl") || pmName.contains("PrbUsedDl")) {
+                               Map<String,String> pmMapping = getMapKey(pmName);
+                               String snssai = pmMapping.get("snssai");
+                               String pm = pmMapping.get("pm"); 
+                               Map<String, Integer> pmData = new HashMap<>();
+                               pmData.put(pm, pmValue);
+                               if (instanceMap.containsKey(snssai)) {
+                                       int index = MeasurementObject.findIndex(measObjId, instanceMap.get(snssai));
+                                       if (index == -1) {
+                                               instanceMap.get(snssai).add(new MeasurementObject(measObjId,pmData));
+                                       }
+                                       else {
+                                               instanceMap.get(snssai).get(index).getPmData().put(pm, pmValue);
+                                       }                       
                                }
                                else {
-                                       instanceMap.get(snssai).get(index).getPmData().put(pmName, pmValue);
-                               }                       
-                       }
-                       else {
-                               List<MeasurementObject> l = new LinkedList<>();
-                               l.add(new MeasurementObject(measObjId,pmData));
-                               instanceMap.put(snssai, l);
+                                       List<MeasurementObject> l = new LinkedList<>();
+                                       l.add(new MeasurementObject(measObjId,pmData));
+                                       instanceMap.put(snssai, l);
+                               }
                        }
-               });
+               });     
        }
 
        /**
@@ -92,14 +97,10 @@ public class PmEventProcessor implements IPmEventProcessor{
         */
        public Map<String, String> getMapKey(String pmName) {
                String [] pmNameArr = pmName.split("\\.");
-               String snssai = "";
                String pm = pmNameArr[1];
                Map<String, String> result = new HashMap<>();
                result.put("pm", pm);
-               if ((pm.equalsIgnoreCase("PrbUsedDl")) || (pm.equalsIgnoreCase("PrbUsedUl"))){
-                       snssai = pmNameArr[2];
-               }
-               result.put("snssai", snssai);
+               result.put("snssai", pmNameArr[2]);
                return result;
        }
 }
\ No newline at end of file
index d8bcbf6..e2903ae 100644 (file)
@@ -52,7 +52,6 @@ public class PmThread extends Thread {
                super();
                this.newPmNotification = BeanUtil.getBean(NewPmNotification.class);
                this.performanceNotificationsRepository = BeanUtil.getBean(PerformanceNotificationsRepository.class);
-               this.pmEventProcessor = BeanUtil.getBean(IPmEventProcessor.class);
                this.pmDataQueue = BeanUtil.getBean(PmDataQueue.class);
        }
 
@@ -68,12 +67,13 @@ public class PmThread extends Thread {
                while (!done) {
                        try {
                                Thread.sleep(1000);
-                               if (newPmNotification.getNewNotif()) {
-                                       log.info("New PM notification from Dmaap");
+                               if (newPmNotification.getNewNotif()) {                          
                                        String pmNotificationString = performanceNotificationsRepository.getPerformanceNotificationFromQueue();
                                        if(pmNotificationString != null) {
+                                               log.info("New PM notification");
                                                ObjectMapper mapper = new ObjectMapper();
                                                pmNotification = mapper.readValue(pmNotificationString, PmNotification.class);
+                                               this.pmEventProcessor = BeanUtil.getBean(IPmEventProcessor.class);
                                                processedData = pmEventProcessor.processEvent(pmNotification.getEvent());
                                                String networkFunction = pmNotification.getEvent().getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn();
                                                processedData.forEach((key,value) -> {
index 8006339..165bef9 100644 (file)
@@ -99,8 +99,8 @@ public class PolicyService {
                ObjectMapper obj = new ObjectMapper();
                String msg =  "";
                try { 
-                       log.debug("Policy onset message for S-NSSAI: {} is {}", snssai, msg);
                        msg = obj.writeValueAsString(onsetMessage);
+                       log.info("Policy onset message for S-NSSAI: {} is {}", snssai, msg);
                        policyDmaapClient.sendNotificationToPolicy(msg);
                } 
                catch (Exception e) { 
index 16fb41a..e8d5de3 100644 (file)
@@ -63,7 +63,7 @@ public class SnssaiSamplesProcessor {
        private Map<String, List<String>> ricToCellMapping = new HashMap<>();
        private Map<String, Map<String, Integer>> ricToPrbsMapping = new HashMap<>();
        private Map<String, Map<String, Integer>> ricToThroughputMapping = new HashMap<>();
-       private int samples;
+       private int noOfSamples;
        private List<String> pmsToCompute;      
        private Map<String, String> prbThroughputMapping = new HashMap<>(); 
        private int minPercentageChange;
@@ -71,7 +71,7 @@ public class SnssaiSamplesProcessor {
        @PostConstruct
        public void init() {
                Configuration configuration = Configuration.getInstance();
-               samples = configuration.getSamples();
+               noOfSamples = configuration.getSamples();
                pmsToCompute = new ArrayList<>();
                pmsToCompute.add("PrbUsedDl");
                pmsToCompute.add("PrbUsedUl");
@@ -84,22 +84,34 @@ public class SnssaiSamplesProcessor {
        /**
         * process the measurement data of an S-NSSAI
         */
-       public void processSamplesOfSnnsai(String snssai, List<String> networkFunctions) {
-               networkFunctions.forEach(nf -> {
+       public boolean processSamplesOfSnnsai(String snssai, List<String> networkFunctions) { 
+               List<MeasurementObject> sample = null;
+               List<List<MeasurementObject>> samples = null;
+               log.info("Network Functions {} of snssai {}", networkFunctions, snssai);
+               for(String nf : networkFunctions) {
                        log.debug("Average of samples for {}:", snssai);
-                       addToMeasurementList(averageCalculator.findAverageOfSamples(pmDataQueue.getSamplesFromQueue(new SubCounter(nf, snssai), samples)));
-               });             
+                       samples = pmDataQueue.getSamplesFromQueue(new SubCounter(nf, snssai), noOfSamples);
+                       if(samples != null) {
+                               sample = averageCalculator.findAverageOfSamples(samples);
+                               addToMeasurementList(sample);
+                       }
+                       else {
+                               log.info("Not enough samples present for nf {}", nf);
+                               return false;
+                       }
+               }               
+               log.info("snssai measurement list {}", snssaiMeasurementList);
                ricToCellMapping = configDbService.fetchRICsOfSnssai(snssai);   
-               log.debug("RIC to Cell Mapping for {} S-NSSAI: {}", snssai, ricToCellMapping);
-               Map<String, Map<String, Integer>> ricConfiguration = configDbService.fetchCurrentConfigurationOfRIC(snssai);
+               log.info("RIC to Cell Mapping for {} S-NSSAI: {}", snssai, ricToCellMapping);
+               Map<String, Map<String, Object>> ricConfiguration = configDbService.fetchCurrentConfigurationOfRIC(snssai);
                Map<String, Integer> sliceConfiguration = configDbService.fetchCurrentConfigurationOfSlice(snssai);
-               log.debug("RIC Configuration: {}", ricConfiguration);
-               log.debug("Slice Configuration: {}", sliceConfiguration);
+               log.info("RIC Configuration {} and Slice Configuration {}", ricConfiguration, sliceConfiguration);
                pmsToCompute.forEach(pm -> {
+                       log.debug("processing for pm {}", pm);
                        sumOfPrbsAcrossCells(pm);
                        int sum = computeSum(pm);
                        computeThroughput(sliceConfiguration, sum, pm);
-                       calculatePercentageChange(ricConfiguration, pm);
+                       calculatePercentageChange(ricConfiguration, prbThroughputMapping.get(pm));
                });
                updateConfiguration();  
                if(ricToThroughputMapping.size() > 0) {
@@ -107,7 +119,7 @@ public class SnssaiSamplesProcessor {
                        addProps.setResourceConfig(ricToThroughputMapping);
                        policyService.sendOnsetMessageToPolicy(snssai, addProps, configDbService.fetchServiceDetails(snssai));
                }
-
+               return true;
        }
 
        /**
@@ -132,17 +144,18 @@ public class SnssaiSamplesProcessor {
         * Calculate the change in the configuration value and keep the configuration only if it is greater than a
         * specific limit 
         */
-       protected void calculatePercentageChange(Map<String, Map<String, Integer>> ricConfiguration, String pm) {
+       protected void calculatePercentageChange(Map<String, Map<String, Object>> ricConfiguration, String pm) {
                Iterator<Map.Entry<String, Map<String,Integer>>> it = ricToThroughputMapping.entrySet().iterator();
                Map.Entry<String, Map<String,Integer>> entry = null;
                float existing = 0;
                float change = 0;
                while(it.hasNext()) {
                        entry = it.next();
-                       existing = ricConfiguration.get(entry.getKey()).get(pm);
+                       existing = (float)((int)ricConfiguration.get(entry.getKey()).get(pm));
                        change = ((Math.abs(entry.getValue().get(pm) - existing))/existing)*100;
                        if (change <= minPercentageChange) {
                                ricToThroughputMapping.get(entry.getKey()).remove(pm);
+                               log.info("Removing pm data {} for RIC {}", pm, entry.getKey());
                        }
                }
        }
@@ -151,7 +164,7 @@ public class SnssaiSamplesProcessor {
                ricToCellMapping.forEach((ric,cells) -> {
                        int sumOfPrbs = 0;
                        for(String cell : cells) {
-                               int index = snssaiMeasurementList.indexOf(new MeasurementObject(cell));
+                               int index = MeasurementObject.findIndex(cell, snssaiMeasurementList);
                                sumOfPrbs += snssaiMeasurementList.get(index).getPmData().get(pmName);
                        }
                        if(ricToPrbsMapping.containsKey(ric)) {
@@ -163,6 +176,7 @@ public class SnssaiSamplesProcessor {
                                ricToPrbsMapping.put(ric, pmToPrbMapping);
                        }
                });
+               log.info("PRBs sum computed for RIC {}", ricToPrbsMapping);
        }
 
        protected Integer computeSum(String pm) {
@@ -188,7 +202,6 @@ public class SnssaiSamplesProcessor {
                                ricToThroughputMapping.put(ric, throughtputMap);
                        }
                }
-
+               log.info("Throughput computed for RIC {}", ricToThroughputMapping);
        }
-
 }
index b19b480..95da366 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.slice.analysis.ms.restclients;
 
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -31,49 +32,39 @@ 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.service.SnssaiSamplesProcessorTest;
 import org.onap.slice.analysis.ms.utils.BeanUtil;
-import org.powermock.api.mockito.PowerMockito;
 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.core.ParameterizedTypeReference;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.client.RestTemplate;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestTemplate;
 
 
 
-@RunWith(PowerMockRunner.class)
-@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
-@PowerMockRunnerDelegate(SpringRunner.class)
-@PrepareForTest({ BeanUtil.class })
-@SpringBootTest(classes = RestClient.class)
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = RestClientTest.class)
 public class RestClientTest {
-
        
        @Mock
        RestTemplate restTemplate;
 
-       
        @InjectMocks
        RestClient restclient;
        
-
-       @SuppressWarnings({ "static-access", "unchecked", "rawtypes" })
+       @SuppressWarnings({ "static-access"})
        @Test
        public void sendGetRequestTest() {
-       
-               PowerMockito.mockStatic(BeanUtil.class);
-               PowerMockito.when(BeanUtil.getBean(Mockito.any())).thenReturn(restTemplate);
-                ParameterizedTypeReference<Map<String,Integer>> responseType = null;
+               ParameterizedTypeReference<Map<String,Integer>> responseType = null;
               HttpHeaders headers = new HttpHeaders();
               headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
               headers.setContentType(MediaType.APPLICATION_JSON);
@@ -82,7 +73,7 @@ public class RestClientTest {
                responsemap.put("dLThptPerSlice", 1);
                responsemap.put("uLThptPerSlice", 2);
                String requestUrl="";
-               PowerMockito.when(restTemplate.exchange(requestUrl, HttpMethod.GET,requestEntity,responseType)).thenReturn(ResponseEntity.ok(responsemap));
+               when(restTemplate.exchange(requestUrl, HttpMethod.GET,requestEntity,responseType)).thenReturn(ResponseEntity.ok(responsemap));
                 ResponseEntity<Map<String,Integer>> resp = restclient.sendGetRequest(headers, requestUrl, responseType);
                assertEquals(resp.getBody(),responsemap);       
        }
@@ -90,15 +81,13 @@ public class RestClientTest {
        @SuppressWarnings({ "static-access", "unchecked", "rawtypes" })
        @Test
        public void sendPostRequestTest() { 
-       PowerMockito.mockStatic(BeanUtil.class);
-       PowerMockito.when(BeanUtil.getBean(RestTemplate.class)).thenReturn(restTemplate);
        ParameterizedTypeReference<String> responseType = null;
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.setContentType(MediaType.APPLICATION_JSON);
        String requestUrl = "Url"; String requestBody = null;  
        HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
-       PowerMockito.when(restTemplate.exchange(requestUrl, HttpMethod.POST,requestEntity,responseType)).thenReturn(new ResponseEntity(HttpStatus.OK)); 
+       when(restTemplate.exchange(requestUrl, HttpMethod.POST,requestEntity,responseType)).thenReturn(new ResponseEntity(HttpStatus.OK)); 
        ResponseEntity<String> resp = restclient.sendPostRequest(headers, requestUrl, requestBody,responseType);
        assertEquals(resp.getStatusCode(), HttpStatus.OK);  
        }
@@ -111,7 +100,7 @@ public class RestClientTest {
        headers.setContentType(MediaType.APPLICATION_JSON);
        String requestUrl = "Url"; String requestBody = null;  
        HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
-       PowerMockito.when(restTemplate.exchange(requestUrl, HttpMethod.POST,requestEntity,responseType)).thenReturn(new ResponseEntity(HttpStatus.NOT_FOUND));        
+       when(restTemplate.exchange(requestUrl, HttpMethod.POST,requestEntity,responseType)).thenReturn(new ResponseEntity(HttpStatus.NOT_FOUND));        
        ResponseEntity<String> resp = restclient.sendPostRequest(headers, requestUrl, requestBody,responseType);
        assertEquals(resp.getStatusCode(), HttpStatus.NOT_FOUND);  
        }  
index e9c134f..05e6017 100644 (file)
@@ -70,7 +70,6 @@ public class AverageCalculatorTest {
         catch (IOException e) { 
             e.printStackTrace(); 
         } 
-        
         assertEquals(output, averageCalculator.findAverageOfSamples(input));
        }
        
@@ -113,5 +112,4 @@ public class AverageCalculatorTest {
                assertEquals(new MeasurementObject("cell1", result), 
                                averageCalculator.findSum(new MeasurementObject("cell1", existingMap), new MeasurementObject("cell1", currentMap)));
        }
-}
-       
+}
\ No newline at end of file
index b8316df..e8cc214 100644 (file)
@@ -130,7 +130,7 @@ public class SnssaiSamplesProcessorTest {
        
        @Test
        public void calculatePercentageChangeTest() {
-               Map<String, Map<String, Integer>> ricConfiguration =  null;
+               Map<String, Map<String, Object>> ricConfiguration =  null;
                Map<String, Map<String, Integer>> exp = new HashMap<>();
                Map<String, Integer> ric1 = new HashMap<>();
                Map<String, Integer> ric2 = new HashMap<>();
@@ -140,7 +140,7 @@ public class SnssaiSamplesProcessorTest {
                exp.put("1", ric1);
                exp.put("2", ric2);     
                try { 
-                       ricConfiguration = obj.readValue(new String(Files.readAllBytes(Paths.get("src/test/resources/ricConfiguration.json"))), new TypeReference<Map<String, Map<String, Integer>>>(){});
+                       ricConfiguration = obj.readValue(new String(Files.readAllBytes(Paths.get("src/test/resources/ricConfiguration.json"))), new TypeReference<Map<String, Map<String, Object>>>(){});
        } 
        catch (IOException e) { 
             e.printStackTrace(); 
index 39802dd..8cd0672 100644 (file)
@@ -54,7 +54,7 @@
        },
        {"measurementObjectId":"cell3",
         "pmData":{
-               "PrbUsedDl":"25",
+               "PrbUsedDl":"30",
                "PrbUsedUl":"40"
                }
        }
diff --git a/components/slice-analysis-ms/src/test/resources/av.json b/components/slice-analysis-ms/src/test/resources/av.json
new file mode 100644 (file)
index 0000000..f9e8ece
--- /dev/null
@@ -0,0 +1,14 @@
+[
+       {"measurementObjectId":"103593989",
+        "pmData":{
+               "PrbUsedDl":"33",
+               "PrbUsedUl":"42"
+               }
+       },
+       {"measurementObjectId":"103593999",
+        "pmData":{
+               "PrbUsedDl":"53",
+               "PrbUsedUl":"53"
+               }
+       }
+]
\ No newline at end of file
index 81838b6..e0b0779 100644 (file)
@@ -13,7 +13,7 @@
        },
        {"measurementObjectId":"cell3",
         "pmData":{
-               "PrbUsedDl":"25",
+               "PrbUsedDl":"30",
                "PrbUsedUl":"40"
                }
        }
diff --git a/components/slice-analysis-ms/src/test/resources/test.json b/components/slice-analysis-ms/src/test/resources/test.json
new file mode 100644 (file)
index 0000000..e852e24
--- /dev/null
@@ -0,0 +1,44 @@
+[
+[
+       {"measurementObjectId":"103593989",
+        "pmData":{
+               "PrbUsedDl":"30",
+               "PrbUsedUl":"40"
+               }
+       },
+       {"measurementObjectId":"103593999",
+        "pmData":{
+               "PrbUsedDl":"60",
+               "PrbUsedUl":"80"
+               }
+       }
+       ],
+[
+       {"measurementObjectId":"103593989",
+        "pmData":{
+               "PrbUsedDl":"35",
+               "PrbUsedUl":"44"
+               }
+       },
+       {"measurementObjectId":"103593999",
+        "pmData":{
+               "PrbUsedDl":"50",
+               "PrbUsedUl":"40"
+               }
+       }
+       ],
+[
+       {"measurementObjectId":"103593989",
+        "pmData":{
+               "PrbUsedDl":"35",
+               "PrbUsedUl":"44"
+               }
+       },
+       {"measurementObjectId":"103593999",
+        "pmData":{
+               "PrbUsedDl":"50",
+               "PrbUsedUl":"40"
+               }
+       }
+       ]
+]
\ No newline at end of file