Implement adaptive SON functionality 60/102060/2
authorniranjana <niranjana.y60@wipro.com>
Thu, 20 Feb 2020 09:44:34 +0000 (15:14 +0530)
committerniranjana <niranjana.y60@wipro.com>
Thu, 20 Feb 2020 12:22:48 +0000 (17:52 +0530)
Issue-ID: DCAEGEN2-2023
Signed-off-by: niranjana <niranjana.y60@wipro.com>
Change-Id: I419b04f669f0b021396a4b04f11139eb4918de09

21 files changed:
pom.xml
src/main/docker/config/sonhms/config_all.json
src/main/java/org/onap/dcaegen2/services/sonhms/Application.java
src/main/java/org/onap/dcaegen2/services/sonhms/Configuration.java
src/main/java/org/onap/dcaegen2/services/sonhms/MainThreadComponent.java
src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThread.java
src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadUtils.java
src/main/java/org/onap/dcaegen2/services/sonhms/child/StateOof.java
src/main/java/org/onap/dcaegen2/services/sonhms/dao/FixedPciCellsRepository.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/dao/PciUpdateRepository.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/DmaapClient.java
src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyNotificationCallback.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/entity/FixedPciCells.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/entity/PciUpdate.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/restclient/CellInfo.java
src/main/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClient.java
src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java
src/main/resources/schema.sql
src/test/java/org/onap/dcaegen2/services/sonhms/child/StateOofTest.java
src/test/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClientTest.java
version.properties

diff --git a/pom.xml b/pom.xml
index 1a909c0..58de62c 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
        <groupId>org.onap.dcaegen2.services.son-handler</groupId>
        <artifactId>son-handler</artifactId>
        <name>dcaegen2-services-son-handler</name>
-       <version>1.1.1-SNAPSHOT</version>
+       <version>2.0.0-SNAPSHOT</version>
 
        <!--parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.0.4.RELEASE</version> </parent -->
index cbb2384..29bb357 100644 (file)
@@ -89,6 +89,8 @@
     "sonhandler.oofTriggerCountThreshold": 5,
     "sonhandler.oof.service": "http://oof-osdf.onap:8699",
     "sonhandler.pciAnrOptimizer": "pci_anr",
+    "sonhandler.policyNegativeAckThreshold": 3,
+    "sonhandler.policyFixedPciTimeInterval": 300000,
     "sonhandler.pollingTimeout": 60,
     "service_calls": {
       "sdnr-getpnfname": [],
index 3e65c8c..71dabff 100644 (file)
@@ -40,8 +40,9 @@ 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;
 
-
+@EnableScheduling
 @SpringBootApplication
 public class Application {
 
index d3d9d39..13c86b6 100644 (file)
@@ -71,7 +71,8 @@ public class Configuration {
     private int oofTriggerCountTimer;
     private int oofTriggerCountThreshold;
     private int policyRespTimer;
-
+    private int policyNegativeAckThreshold;
+    private long policyFixedPciTimeInterval;
 
     public int getPoorCountThreshold() {
         return poorCountThreshold;
@@ -351,7 +352,23 @@ public class Configuration {
         this.oofEndpoint = oofEndpoint;
     }
 
-    @Override
+    public int getPolicyNegativeAckThreshold() {
+               return policyNegativeAckThreshold;
+       }
+
+       public void setPolicyNegativeAckThreshold(int policyNegativeAckThreshold) {
+               this.policyNegativeAckThreshold = policyNegativeAckThreshold;
+       }
+
+       public long getPolicyFixedPciTimeInterval() {
+               return policyFixedPciTimeInterval;
+       }
+
+       public void setPolicyFixedPciTimeInterval(long policyFixedPciTimeInterval) {
+               this.policyFixedPciTimeInterval = policyFixedPciTimeInterval;
+       }
+
+       @Override
     public String toString() {
         return "Configuration [pgHost=" + pgHost + ", pgPort=" + pgPort + ", pgUsername=" + pgUsername + ", pgPassword="
                 + pgPassword + ", dmaapServers=" + dmaapServers + ", configDbService=" + configDbService
@@ -365,7 +382,7 @@ public class Configuration {
                 + ", badThreshold=" + badThreshold + ", poorThreshold=" + poorThreshold + ", poorCountThreshold="
                 + poorCountThreshold + ", badCountThreshold=" + badCountThreshold + ", oofTriggerCountTimer="
                 + oofTriggerCountTimer + ", oofTriggerCountThreshold=" + oofTriggerCountThreshold + ", policyRespTimer="
-                + policyRespTimer + "]";
+                + policyRespTimer + ", policyNegativeAckThreshold=" + policyNegativeAckThreshold + ", policyFixedPciTimeInterval="+ policyFixedPciTimeInterval + "]";
     }
 
     /**
@@ -422,7 +439,8 @@ public class Configuration {
         oofTriggerCountTimer = jsonObject.get("sonhandler.oofTriggerCountTimer").getAsInt();
         oofTriggerCountThreshold = jsonObject.get("sonhandler.oofTriggerCountThreshold").getAsInt();
         policyRespTimer = jsonObject.get("sonhandler.policyRespTimer").getAsInt();
-
+        policyNegativeAckThreshold = jsonObject.get("sonhandler.policyNegativeAckThreshold").getAsInt();
+        policyFixedPciTimeInterval = jsonObject.get("sonhandler.policyFixedPciTimeInterval").getAsLong();
 
         log.info("configuration from CBS {}", this);
 
index a167872..e809b45 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
 
 package org.onap.dcaegen2.services.sonhms;
 
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+
 import javax.annotation.PostConstruct;
 
+import org.onap.dcaegen2.services.sonhms.child.ChildThread;
+import org.onap.dcaegen2.services.sonhms.child.Graph;
+import org.onap.dcaegen2.services.sonhms.dao.FixedPciCellsRepository;
+import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
+import org.onap.dcaegen2.services.sonhms.utils.ClusterUtils;
+import org.onap.dcaegen2.services.sonhms.utils.ThreadUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -42,8 +58,6 @@ public class MainThreadComponent {
     @Autowired
     private NewFmNotification newFmNotification;
     
-
-
     /**
      * main thread initialization.
      */
@@ -55,4 +69,34 @@ public class MainThreadComponent {
         Thread pmThread = new Thread(new PmThread(newPmNotification));
         pmThread.start();
     }
+
+       @Scheduled(fixedRate = 300000, initialDelay = 60000)
+       public void checkFixedPciTable() {
+               log.info("Inside checkFixedPciTable method");
+               FixedPciCellsRepository fixedPciCellsRepository = BeanUtil.getBean(FixedPciCellsRepository.class);
+               List<String> fixedPciCellsList = fixedPciCellsRepository.getFixedPciCells();
+               if (!fixedPciCellsList.isEmpty()) {
+                       log.info("Fixed Pci table not empty");
+                       Timestamp lastInvokedOofTimeStamp = ChildThread.getLastInvokedOofTimeStamp();
+                       Timestamp fixedPciCreatedAt = fixedPciCellsRepository.getTimeStampforFixedPci();
+                       Long difference = fixedPciCreatedAt.getTime() - lastInvokedOofTimeStamp.getTime();
+                       Configuration configuration = Configuration.getInstance();
+
+                       if (difference > configuration.getPolicyFixedPciTimeInterval()) {
+                               log.info("Creating new child thread for sending fixedPciCells");
+                               List<Graph> cluster = new ArrayList<>();
+                               BlockingQueue<List<String>> childStatusQueue = new LinkedBlockingQueue<>();
+                               EventHandler eventHandler = new EventHandler(childStatusQueue,
+                                               Executors.newFixedThreadPool(Configuration.getInstance().getMaximumClusters()), new HashMap<>(),
+                                               new ClusterUtils(), new ThreadUtils());
+                               ExecutorService pool = Executors.newFixedThreadPool(5);
+                               ThreadUtils threadUtils = new ThreadUtils();
+                               boolean result = threadUtils.createNewThread(cluster, childStatusQueue, pool, eventHandler, null);
+                               log.info("Child Thread creation result:"+ result);
+                       }
+
+               } else {
+                       log.info("Exiting function fixedPci table empty");
+               }
+       }
 }
index 87c5081..1e740a9 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -45,9 +45,12 @@ import org.onap.dcaegen2.services.sonhms.Configuration;
 import org.onap.dcaegen2.services.sonhms.HoMetricsComponent;
 import org.onap.dcaegen2.services.sonhms.Timer;
 import org.onap.dcaegen2.services.sonhms.dao.ClusterDetailsRepository;
+import org.onap.dcaegen2.services.sonhms.dao.FixedPciCellsRepository;
+import org.onap.dcaegen2.services.sonhms.dao.PciUpdateRepository;
 import org.onap.dcaegen2.services.sonhms.dao.SonRequestsRepository;
 import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient;
 import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics;
+import org.onap.dcaegen2.services.sonhms.entity.PciUpdate;
 import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException;
 import org.onap.dcaegen2.services.sonhms.exceptions.OofNotFoundException;
 import org.onap.dcaegen2.services.sonhms.model.AnrInput;
@@ -57,6 +60,8 @@ import org.onap.dcaegen2.services.sonhms.model.Flag;
 import org.onap.dcaegen2.services.sonhms.model.HoDetails;
 import org.onap.dcaegen2.services.sonhms.model.ThreadId;
 import org.onap.dcaegen2.services.sonhms.restclient.AsyncResponseBody;
+import org.onap.dcaegen2.services.sonhms.restclient.PciSolutions;
+import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient;
 import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
 import org.onap.dcaegen2.services.sonhms.utils.ClusterUtils;
 import org.onap.dcaegen2.services.sonhms.utils.DmaapUtils;
@@ -74,6 +79,8 @@ public class ChildThread implements Runnable {
     Map<CellPciPair, ArrayList<CellPciPair>> clusterMap;
     HoMetricsComponent hoMetricsComponent;
     private static final Logger log = org.slf4j.LoggerFactory.getLogger(ChildThread.class);
+    private static Timestamp startTime;
+
 
     /**
      * Constructor with parameters.
@@ -139,211 +146,244 @@ public class ChildThread implements Runnable {
         return responseMap;
     }
 
-    @Override
-    public void run() {
-
-        threadId.setChildThreadId(Thread.currentThread().getId());
-        synchronized (threadId) {
-            threadId.notifyAll();
-        }
-
-        MDC.put("logFileName", Thread.currentThread().getName());
-        log.info("Starting child thread");
-
-        StateOof oof = new StateOof(childStatusUpdate);
-        ClusterUtils clusterUtils = new ClusterUtils();
-        Detection detect = new Detection();
-        ChildThreadUtils childUtils = new ChildThreadUtils(ConfigPolicy.getInstance(), new PnfUtils(),
-                new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance()), new HoMetricsComponent());
-
-        try {
-            String networkId = cluster.getNetworkId();
-
-            Boolean done = false;
-
-            Map<String, ArrayList<Integer>> collisionConfusionResult;
-            while (!done) {
-                if (cluster.getCollisionConfusionMap().isEmpty()) {
-
-                    collisionConfusionResult = detect.detectCollisionConfusion(cluster);
-                } else {
-                    collisionConfusionResult = cluster.getCollisionConfusionMap();
-                }
-
-                Boolean trigger = childUtils.triggerOrWait(collisionConfusionResult);
-                ConfigPolicy configPolicy = ConfigPolicy.getInstance();
-                double timer = 60;
-                try {
-                    timer = (double) configPolicy.getConfig().get("PCI_NEIGHBOR_CHANGE_CLUSTER_TIMEOUT_IN_SECS");
-                } catch (NullPointerException e) {
-                    log.info("Policy config not available. Using default timeout - 60 seconds");
-                }
-                if (!trigger) {
-                    try {
-                        Thread.sleep((long) timer * 1000);
-                    } catch (InterruptedException e) {
-                        log.error("Interrupted Exception while waiting for more notifications {}", e);
-                        Thread.currentThread().interrupt();
-                    }
-
-                    while (!queue.isEmpty()) {
-                        Map<CellPciPair, ArrayList<CellPciPair>> newNotification;
-                        newNotification = queue.poll();
-                        log.info("New notification from SDNR {}", newNotification);
-                        cluster = clusterUtils.modifyCluster(cluster, newNotification);
-
-                        // update cluster in DB
-                        clusterUtils.updateCluster(cluster);
-                        collisionConfusionResult = detect.detectCollisionConfusion(cluster);
-
-                    }
-
-                }
-                ArrayList<String> cellidList = new ArrayList<>();
-                ArrayList<String> cellIds = new ArrayList<>();
-
-                for (Map.Entry<String, ArrayList<Integer>> entry : collisionConfusionResult.entrySet()) {
-                    String key = entry.getKey();
-                    ArrayList<Integer> arr;
-                    arr = entry.getValue();
-                    if (!arr.isEmpty()) {
-                        Set<Integer> set = new HashSet<>(arr);
-                        if (((set.size() == 1) && !set.contains(0)) || (set.size() != 1)) {
-                            cellIds.add(key);
-
-                        }
-                    }
-
-                }
-
-                for (String cell : cellIds) {
-                    log.debug("cellidList entries: {}", cell);
-                    cellidList.add(cell);
-                }
-                UUID transactionId;
+       public static Timestamp getLastInvokedOofTimeStamp() {
+               return startTime;
 
-                Flag policyTriggerFlag = BeanUtil.getBean(Flag.class);
-                while (policyTriggerFlag.getHolder().equals("PM")) {
-                    Thread.sleep(100);
-                }
-                policyTriggerFlag.setHolder("CHILD");
-                policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() + 1);
-
-                Timer timerOof = BeanUtil.getBean(Timer.class);
-                if (!timerOof.getIsTimer()) {
-                    log.info("Starting timer");
-                    timerOof.setIsTimer(true);
-                    Timestamp startTime = new Timestamp(System.currentTimeMillis());
-                    timerOof.setStartTime(startTime);
-                    timerOof.setCount(0);
-                    log.info("startTime {}", startTime);
+       }
 
-                }
-                int timerThreshold = (Configuration.getInstance().getOofTriggerCountTimer() * 60000);
-                int triggerCountThreshold = Configuration.getInstance().getOofTriggerCountThreshold();
-                log.info("Time threshold {}, triggerCountThreshold {}", timerThreshold, triggerCountThreshold);
-                log.info("oof trigger count {}", timerOof.getCount());
-                timerOof.setCount(timerOof.getCount() + 1);
-                Timestamp currentTime = new Timestamp(System.currentTimeMillis());
-                Long difference = currentTime.getTime() - timerOof.getStartTime().getTime();
-                if (difference < timerThreshold && timerOof.getCount() > triggerCountThreshold) {
-                    log.info("difference {}", difference);
-
-                    Either<List<AnrInput>, Integer> anrTriggerResponse = checkAnrTrigger();
-                    if (anrTriggerResponse.isRight()) {
-                        log.info("ANR trigger response right {}", anrTriggerResponse.right().value());
-                        if (anrTriggerResponse.right().value() == 404) {
-                            log.info("No poor neighbors found");
-                        } else if (anrTriggerResponse.right().value() == 500) {
-                            log.info("Failed to fetch HO details from DB ");
-                        }
-                        transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>());
-
-                    } else {
-                        log.info("ANR trigger response left {}", anrTriggerResponse.left().value());
-                        List<AnrInput> anrInputList = anrTriggerResponse.left().value();
-                        log.info("Trigger oof for joint optimization");
-                        transactionId = oof.triggerOof(cellidList, networkId, anrInputList);
-
-                    }
-
-                } else {
-
-                    transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>());
-
-                    if (difference > timerThreshold) {
-                        timerOof.setIsTimer(false);
-                        timerOof.setCount(0);
-                    }
-                }
+    @Override
+    public void run() {
 
-                long childThreadId = Thread.currentThread().getId();
-                childUtils.saveRequest(transactionId.toString(), childThreadId);
+               threadId.setChildThreadId(Thread.currentThread().getId());
+               synchronized (threadId) {
+                       threadId.notifyAll();
+               }
+
+               MDC.put("logFileName", Thread.currentThread().getName());
+               log.info("Starting child thread");
+
+               StateOof oof = new StateOof(childStatusUpdate);
+               ClusterUtils clusterUtils = new ClusterUtils();
+               Detection detect = new Detection();
+               ChildThreadUtils childUtils = new ChildThreadUtils(ConfigPolicy.getInstance(), new PnfUtils(),
+                               new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance()), new HoMetricsComponent());
+
+               try {
+                       String networkId = cluster.getNetworkId();
+
+                       Boolean done = false;
+
+                       Map<String, ArrayList<Integer>> collisionConfusionResult = new HashMap<String, ArrayList<Integer>>();
+
+                       while (!done) {
+
+                               if (!cluster.getCellPciNeighbourMap().isEmpty()) {
+
+                                       if (cluster.getCollisionConfusionMap().isEmpty()) {
+
+                                               collisionConfusionResult = detect.detectCollisionConfusion(cluster);
+                                       } else {
+                                               collisionConfusionResult = cluster.getCollisionConfusionMap();
+                                       }
+
+                                       Boolean trigger = childUtils.triggerOrWait(collisionConfusionResult);
+                                       ConfigPolicy configPolicy = ConfigPolicy.getInstance();
+                                       double timer = 60;
+                                       try {
+                                               timer = (double) configPolicy.getConfig().get("PCI_NEIGHBOR_CHANGE_CLUSTER_TIMEOUT_IN_SECS");
+                                       } catch (NullPointerException e) {
+                                               log.info("Policy config not available. Using default timeout - 60 seconds");
+                                       }
+                                       if (!trigger) {
+                                               try {
+                                                       Thread.sleep((long) timer * 1000);
+                                               } catch (InterruptedException e) {
+                                                       log.error("Interrupted Exception while waiting for more notifications {}", e);
+                                                       Thread.currentThread().interrupt();
+                                               }
+
+                                               while (!queue.isEmpty()) {
+                                                       Map<CellPciPair, ArrayList<CellPciPair>> newNotification;
+                                                       newNotification = queue.poll();
+                                                       log.info("New notification from SDNR {}", newNotification);
+                                                       cluster = clusterUtils.modifyCluster(cluster, newNotification);
+
+                                                       // update cluster in DB
+                                                       clusterUtils.updateCluster(cluster);
+                                                       collisionConfusionResult = detect.detectCollisionConfusion(cluster);
+
+                                               }
+
+                                       }
+                               }
+                               ArrayList<String> cellidList = new ArrayList<>();
+                               ArrayList<String> cellIds = new ArrayList<>();
+
+                               for (Map.Entry<String, ArrayList<Integer>> entry : collisionConfusionResult.entrySet()) {
+                                       String key = entry.getKey();
+                                       ArrayList<Integer> arr;
+                                       arr = entry.getValue();
+                                       if (!arr.isEmpty()) {
+                                               Set<Integer> set = new HashSet<>(arr);
+                                               if (((set.size() == 1) && !set.contains(0)) || (set.size() != 1)) {
+                                                       cellIds.add(key);
+
+                                               }
+                                       }
+
+                               }
+
+                               for (String cell : cellIds) {
+                                       log.debug("cellidList entries: {}", cell);
+                                       cellidList.add(cell);
+                               }
+                               UUID transactionId;
+
+                               Flag policyTriggerFlag = BeanUtil.getBean(Flag.class);
+                               while (policyTriggerFlag.getHolder().equals("PM")) {
+                                       Thread.sleep(100);
+                               }
+                               policyTriggerFlag.setHolder("CHILD");
+                               policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() + 1);
+
+                               FixedPciCellsRepository fixedPciCellsRepository = BeanUtil.getBean(FixedPciCellsRepository.class);
+                               List<String> fixedPciCells = fixedPciCellsRepository.getFixedPciCells();
+
+                               Timer timerOof = BeanUtil.getBean(Timer.class);
+                               if (!timerOof.getIsTimer()) {
+                                       log.info("Starting timer");
+                                       timerOof.setIsTimer(true);
+                                       startTime = new Timestamp(System.currentTimeMillis());
+                                       timerOof.setStartTime(startTime);
+                                       timerOof.setCount(0);
+                                       log.info("startTime {}", startTime); 
+
+                               }
+                               int timerThreshold = (Configuration.getInstance().getOofTriggerCountTimer() * 60000);
+                               int triggerCountThreshold = Configuration.getInstance().getOofTriggerCountThreshold();
+                               log.info("Time threshold {}, triggerCountThreshold {}", timerThreshold, triggerCountThreshold);
+                               log.info("oof trigger count {}", timerOof.getCount());
+                               timerOof.setCount(timerOof.getCount() + 1);
+                               Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+                               Long difference = currentTime.getTime() - timerOof.getStartTime().getTime();
+                               if (difference < timerThreshold && timerOof.getCount() > triggerCountThreshold) {
+                                       log.info("difference {}", difference);
+
+                                       Either<List<AnrInput>, Integer> anrTriggerResponse = checkAnrTrigger();
+                                       if (anrTriggerResponse.isRight()) {
+                                               log.info("ANR trigger response right {}", anrTriggerResponse.right().value());
+                                               if (anrTriggerResponse.right().value() == 404) {
+                                                       log.info("No poor neighbors found");
+                                               } else if (anrTriggerResponse.right().value() == 500) {
+                                                       log.info("Failed to fetch HO details from DB ");
+                                               }
+                                               transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>(),fixedPciCells);
+
+                                       } else {
+                                               log.info("ANR trigger response left {}", anrTriggerResponse.left().value());
+                                               List<AnrInput> anrInputList = anrTriggerResponse.left().value();
+                                               log.info("Trigger oof for joint optimization");
+                                               transactionId = oof.triggerOof(cellidList, networkId, anrInputList,fixedPciCells);
+
+                                       }
+
+                               } else {
+
+                                       transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>(),fixedPciCells);
+
+                                       if (difference > timerThreshold) {
+                                               timerOof.setIsTimer(false);
+                                               timerOof.setCount(0);
+                                       }
+                               }
+
+                               long childThreadId = Thread.currentThread().getId();
+                               childUtils.saveRequest(transactionId.toString(), childThreadId);
                 while (!ChildThread.getResponseMap().containsKey(childThreadId)) {
                     Thread.sleep(100);
                 }
 
                 AsyncResponseBody asynResponseBody = ChildThread.getResponseMap().get(childThreadId);
-
-                try {
-                    childUtils.sendToPolicy(asynResponseBody);
-                    policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() - 1);
-                    if (policyTriggerFlag.getNumChilds() == 0) {
-                        policyTriggerFlag.setHolder("NONE");
-                    }
-
-                } catch (ConfigDbNotFoundException e1) {
-                    log.debug("Config DB is unreachable: {}", e1);
-                }
-
-                SonRequestsRepository sonRequestsRepository = BeanUtil.getBean(SonRequestsRepository.class);
-                sonRequestsRepository.deleteByChildThreadId(childThreadId);
-
-                List<String> childStatus = new ArrayList<>();
-                childStatus.add(Long.toString(Thread.currentThread().getId()));
-                childStatus.add("success");
-                try {
-                    childStatusUpdate.put(childStatus);
-                } catch (InterruptedException e) {
-                    log.debug("InterruptedException during childStatus update {}", e);
-                    Thread.currentThread().interrupt();
-
-                }
-
-                Either<List<String>, Integer> bufferedNotifications = getBufferedNotifications();
-
-                if (bufferedNotifications.isRight()) {
-                    log.info("No buffered notifications");
-                    done = true;
-                } else {
-                    List<Map<CellPciPair, ArrayList<CellPciPair>>> clusterMaps = getClusterMapsFromNotifications(
-                            bufferedNotifications.left().value());
-                    for (Map<CellPciPair, ArrayList<CellPciPair>> bufferedClusterMap : clusterMaps) {
-                        cluster = clusterUtils.modifyCluster(cluster, bufferedClusterMap);
-                    }
-                    String cellPciNeighbourString = cluster.getPciNeighbourJson();
-                    UUID clusterId = cluster.getGraphId();
-                    ClusterDetailsRepository clusterDetailsRepository = BeanUtil
-                            .getBean(ClusterDetailsRepository.class);
-                    clusterDetailsRepository.updateCluster(cellPciNeighbourString, clusterId.toString());
-                }
-
-            }
-
-        } catch (OofNotFoundException e) {
-            log.error("OOF not found, Removing flag and cleaning up");
-            Flag policyTriggerFlag = BeanUtil.getBean(Flag.class);
-            policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() - 1);
-            if (policyTriggerFlag.getNumChilds() == 0) {
-                policyTriggerFlag.setHolder("NONE");
-            }
-        } catch (Exception e) {
-            log.error("{}", e);
-            
-            
-        }
-
-        cleanup();
+                               
+                               List<PciSolutions> pciSolutionsList = asynResponseBody.getSolutions().getPciSolutions();
+
+                               if (!pciSolutionsList.isEmpty())
+                                       for (PciSolutions pcisolutions : pciSolutionsList) {
+
+                                               String cellId = pcisolutions.getCellId();
+                                               int oldPci = SdnrRestClient.getPci(cellId);
+                                               int newPci = pcisolutions.getPci();
+                                               PciUpdate pciUpdate = new PciUpdate();
+                                               pciUpdate.setCellId(cellId);
+                                               pciUpdate.setOldPci(oldPci);
+                                               pciUpdate.setNewPci(newPci);
+                                               PciUpdateRepository pciUpdateRepository = BeanUtil.getBean(PciUpdateRepository.class);
+                                               pciUpdateRepository.save(pciUpdate);
+                                       }
+
+                               try {
+                                       childUtils.sendToPolicy(asynResponseBody);
+                                       policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() - 1);
+                                       if (policyTriggerFlag.getNumChilds() == 0) {
+                                               policyTriggerFlag.setHolder("NONE");
+                                       }
+
+                               } catch (ConfigDbNotFoundException e1) {
+                                       log.debug("Config DB is unreachable: {}", e1);
+                               }
+
+                               SonRequestsRepository sonRequestsRepository = BeanUtil.getBean(SonRequestsRepository.class);
+                               sonRequestsRepository.deleteByChildThreadId(childThreadId);
+
+                               List<String> childStatus = new ArrayList<>();
+                               childStatus.add(Long.toString(Thread.currentThread().getId()));
+                               childStatus.add("success");
+                               try {
+                                       childStatusUpdate.put(childStatus);
+                               } catch (InterruptedException e) {
+                                       log.debug("InterruptedException during childStatus update {}", e);
+                                       Thread.currentThread().interrupt();
+
+                               }
+
+                               if (!cluster.getCellPciNeighbourMap().isEmpty()) {
+
+                                       Either<List<String>, Integer> bufferedNotifications = getBufferedNotifications();
+
+                                       if (bufferedNotifications.isRight()) {
+                                               log.info("No buffered notifications");
+                                               done = true;
+                                       } else {
+                                               List<Map<CellPciPair, ArrayList<CellPciPair>>> clusterMaps = getClusterMapsFromNotifications(
+                                                               bufferedNotifications.left().value());
+                                               for (Map<CellPciPair, ArrayList<CellPciPair>> bufferedClusterMap : clusterMaps) {
+                                                       cluster = clusterUtils.modifyCluster(cluster, bufferedClusterMap);
+                                               }
+                                               String cellPciNeighbourString = cluster.getPciNeighbourJson();
+                                               UUID clusterId = cluster.getGraphId();
+                                               ClusterDetailsRepository clusterDetailsRepository = BeanUtil
+                                                               .getBean(ClusterDetailsRepository.class);
+                                               clusterDetailsRepository.updateCluster(cellPciNeighbourString, clusterId.toString());
+                                       }
+                               } else {
+                                       done = true;
+                               }
+
+                       }
+
+               } catch (OofNotFoundException e) {
+                       log.error("OOF not found, Removing flag and cleaning up");
+                       Flag policyTriggerFlag = BeanUtil.getBean(Flag.class);
+                       policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() - 1);
+                       if (policyTriggerFlag.getNumChilds() == 0) {
+                               policyTriggerFlag.setHolder("NONE");
+                       }
+               } catch (Exception e) {
+                       log.error("{}", e);
+
+               }
+
+               cleanup();
     }
 
     private List<Map<CellPciPair, ArrayList<CellPciPair>>> getClusterMapsFromNotifications(List<String> notifications) {
index 852d087..d04e6cb 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -207,9 +207,6 @@ public class ChildThreadUtils {
                 } else {
                     log.debug("Sending notification to policy failed");
                 }
-                policyDmaapClient.handlePolicyResponse(requestId);
-                log.info("handled policy response in ModifyConfig");
-
             }
         }
         if (!solutions.getAnrSolutions().isEmpty()) {
@@ -276,9 +273,6 @@ public class ChildThreadUtils {
                     log.info("Policy Notification: {}", notification);
                     Boolean result = policyDmaapClient.sendNotificationToPolicy(notification);
                     log.info("send notification to policy result {} ", result);
-                    policyDmaapClient.handlePolicyResponse(requestId);
-                    log.info("handled policy response in ModifyConfigANR");
-
                 }
 
             }
index a00c166..04d4fb1 100644 (file)
@@ -55,7 +55,7 @@ public class StateOof {
      * @throws OofNotFoundException
      *             when trigger oof fails
      */
-    public UUID triggerOof(List<String> cellidList, String networkId, List<AnrInput> anrInputList)
+    public UUID triggerOof(List<String> cellidList, String networkId, List<AnrInput> anrInputList, List<String> fixedPciCells)
             throws OofNotFoundException, InterruptedException {
 
         log.info("Triggering oof");
@@ -75,10 +75,10 @@ public class StateOof {
         String oofResponse = null;
         if (!anrInputList.isEmpty()) {
             oofResponse = OofRestClient.queryOof(numSolutions, transactionId.toString(), "create", cellidList,
-                    networkId, pciAnrOptimizerList, anrInputList);
+                    networkId, pciAnrOptimizerList, anrInputList,fixedPciCells);
         } else {
             oofResponse = OofRestClient.queryOof(numSolutions, transactionId.toString(), "create", cellidList,
-                    networkId, pciOptimizerList, anrInputList);
+                    networkId, pciOptimizerList, anrInputList,fixedPciCells);
         }
         log.info("Synchronous Response {}", oofResponse);
 
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/dao/FixedPciCellsRepository.java b/src/main/java/org/onap/dcaegen2/services/sonhms/dao/FixedPciCellsRepository.java
new file mode 100644 (file)
index 0000000..1f9c858
--- /dev/null
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  son-handler
+ *  ================================================================================
+ *   Copyright (C) 2020 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.dcaegen2.services.sonhms.dao;
+
+import java.sql.Timestamp;
+import java.util.List;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+import org.onap.dcaegen2.services.sonhms.entity.FixedPciCells;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.jpa.repository.Query;
+
+@Repository
+@Transactional
+public interface FixedPciCellsRepository extends CrudRepository<FixedPciCells, String> {
+
+       @SuppressWarnings("unchecked")
+       public FixedPciCells save(FixedPciCells persisted);
+
+       @Query(nativeQuery = true, value = "SELECT cell_id FROM fixed_pci_cells")
+       public List<String> getFixedPciCells();
+
+       @Query(nativeQuery = true,
+                       value = "SELECT created_at FROM fixed_pci_cells WHERE "
+                               + "created_at=(SELECT created_at FROM fixed_pci_cells " 
+                               + "ORDER BY created_at DESC FOR UPDATE SKIP LOCKED LIMIT 1);")
+       public Timestamp getTimeStampforFixedPci();
+
+}
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/dao/PciUpdateRepository.java b/src/main/java/org/onap/dcaegen2/services/sonhms/dao/PciUpdateRepository.java
new file mode 100644 (file)
index 0000000..dc997bc
--- /dev/null
@@ -0,0 +1,53 @@
+
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  son-handler
+ *  ================================================================================
+ *   Copyright (C) 2020 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.dcaegen2.services.sonhms.dao;
+
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+import org.onap.dcaegen2.services.sonhms.entity.PciUpdate;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.Modifying;
+
+@Repository
+@Transactional
+public interface PciUpdateRepository extends CrudRepository<PciUpdate, String> {
+               
+       @SuppressWarnings("unchecked")
+       public PciUpdate save(PciUpdate persisted);
+       
+       @Query(nativeQuery = true, value = "SELECT negative_ack_count FROM pci_update WHERE cell_id = ?1")
+       public int getNegativeAckCountforCellId(String cellId);
+       
+       @Query(nativeQuery = true, value = "SELECT old_pci FROM pci_update WHERE cell_id = ?1")
+       public long getOldPciforCellId(String cellId);
+       
+       @Modifying
+       @Query(nativeQuery = true, value = "UPDATE pci_update SET negative_ack_count = ?1 WHERE cell_id = ?2")
+       public void increaseNegativeAckCountforCellId(int negativeAckCount, String cellId);
+       
+       @Modifying
+       @Query(nativeQuery = true, value = "DELETE FROM pci_update WHERE cell_id = ?1")
+       public void deleterecordforCellId(String cellId);
+       
+}
index 664dbf8..8284f8f 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -81,13 +81,21 @@ public class DmaapClient {
         String[] pmTopicSplit = pmTopicUrl.split("\\/");
         String pmTopic = pmTopicSplit[sdnrTopicSplit.length - 1];
         log.debug("pm topic : {}", pmTopic);
+        String policyResponseTopicUrl = ((Map<String, String>) ((Map<String, Object>) streamSubscribes
+                .get("dcae_cl_response_topic")).get("dmaap_info")).get("topic_url");
+        String[] policyResponseTopicUrlSplit = policyResponseTopicUrl.split("\\/");
+        String policyResponseTopic = policyResponseTopicUrlSplit[policyResponseTopicUrlSplit.length - 1];
+        log.debug("policyResponse Topic : {}", policyResponseTopic);
         CambriaConsumer sdnrNotifCambriaConsumer = null;
         CambriaConsumer fmNotifCambriaConsumer = null;
         CambriaConsumer pmNotifCambriaConsumer = null;
+        CambriaConsumer policyResponseCambriaConsumer = null;
 
         sdnrNotifCambriaConsumer = dmaapUtils.buildConsumer(configuration, sdnrTopic);
         fmNotifCambriaConsumer = dmaapUtils.buildConsumer(configuration, fmTopic);
         pmNotifCambriaConsumer = dmaapUtils.buildConsumer(configuration, pmTopic);
+        policyResponseCambriaConsumer = dmaapUtils.buildConsumer(configuration, policyResponseTopic);
+
 
         // create notification consumers for SNDR and policy
         NotificationConsumer sdnrNotificationConsumer = new NotificationConsumer(sdnrNotifCambriaConsumer,
@@ -114,6 +122,14 @@ public class DmaapClient {
         executorPool.scheduleAtFixedRate(pmNotificationConsumer, 0, configuration.getPollingInterval(),
                 TimeUnit.SECONDS);
 
+               // create notification consumers for Policy
+               NotificationConsumer policyNotificationConsumer = new NotificationConsumer(policyResponseCambriaConsumer,
+                               new PolicyNotificationCallback());
+               // start policy notification consumer threads
+               executorPool = Executors.newScheduledThreadPool(10);
+               executorPool.scheduleAtFixedRate(policyNotificationConsumer, 0, configuration.getPollingInterval(),
+                               TimeUnit.SECONDS);
+
     }
 
 }
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyNotificationCallback.java b/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyNotificationCallback.java
new file mode 100644 (file)
index 0000000..82e940d
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  son-handler
+ *  ================================================================================
+ *   Copyright (C) 2020 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.dcaegen2.services.sonhms.dmaap;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.List;
+
+import org.onap.dcaegen2.services.sonhms.Configuration;
+import org.onap.dcaegen2.services.sonhms.dao.FixedPciCellsRepository;
+import org.onap.dcaegen2.services.sonhms.dao.PciUpdateRepository;
+import org.onap.dcaegen2.services.sonhms.entity.FixedPciCells;
+import org.onap.dcaegen2.services.sonhms.model.Configurations;
+import org.onap.dcaegen2.services.sonhms.model.Payload;
+import org.onap.dcaegen2.services.sonhms.model.PolicyNotification;
+import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
+import org.slf4j.Logger;
+
+public class PolicyNotificationCallback extends NotificationCallback {
+
+       private static final Logger log = org.slf4j.LoggerFactory.getLogger(PolicyNotificationCallback.class);
+
+       @Override
+       public void activateCallBack(String msg) {
+               handlePolicyNotification(msg);
+       }
+
+       private void handlePolicyNotification(String msg) {
+               PciUpdateRepository pciUpdateRepository = BeanUtil.getBean(PciUpdateRepository.class);
+        Configuration configuration = Configuration.getInstance();
+               try {
+                       ObjectMapper mapper = new ObjectMapper();
+                       PolicyNotification policyResponse = mapper.readValue(msg, PolicyNotification.class);
+                       String payload = policyResponse.getPayload();
+                       Payload payloadObject = mapper.readValue(payload, Payload.class);
+                       List<Configurations> configurationList = payloadObject.getConfiguration();
+                       for (Configurations config : configurationList) {
+                               int status = config.getStatus().getCode();
+                               if (status != 200) {
+                                       String cellId = config.getData().getFapservice().getAlias();
+
+                                       int negativeAckCount = pciUpdateRepository.getNegativeAckCountforCellId(cellId);
+                                       if (negativeAckCount > configuration.getPolicyNegativeAckThreshold()) {
+                                               long fixedPci = pciUpdateRepository.getOldPciforCellId(cellId);
+                                                
+                                               FixedPciCellsRepository fixedPciCellsRepository = BeanUtil
+                                                               .getBean(FixedPciCellsRepository.class);
+                                               FixedPciCells fixedPciCells = new FixedPciCells();
+                                               fixedPciCells.setCellId(cellId);
+                                               fixedPciCells.setFixedPci(fixedPci);
+                                               fixedPciCellsRepository.save(fixedPciCells);
+                                               pciUpdateRepository.deleterecordforCellId(cellId);
+                                       } else {
+
+                                               pciUpdateRepository.increaseNegativeAckCountforCellId(++negativeAckCount, cellId);
+                                       }
+                               } else {
+
+                                       String cellId = config.getData().getFapservice().getAlias();
+                                       pciUpdateRepository.deleterecordforCellId(cellId);
+                               }
+
+                               String statusToString = Integer.toString(status);
+                               log.info("Handled response from policy, status code {}", statusToString);
+                       }
+               } catch (IOException e) {
+                       log.info("caught io exception while fetching policy response");
+
+               }
+       }
+}
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/entity/FixedPciCells.java b/src/main/java/org/onap/dcaegen2/services/sonhms/entity/FixedPciCells.java
new file mode 100644 (file)
index 0000000..e48a054
--- /dev/null
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  son-handler
+ *  ================================================================================
+ *   Copyright (C) 2020 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.dcaegen2.services.sonhms.entity;
+
+import java.sql.Timestamp;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Entity;
+import org.hibernate.annotations.CreationTimestamp;
+
+@Entity
+@Table(name ="FIXED_PCI_CELLS")
+public class FixedPciCells {
+       
+       @Id
+       @Column(name = "cell_id", columnDefinition = "text")
+       private String cellId;
+       
+       @Column(name = "fixed_pci", columnDefinition = "bigint")
+       private long fixedPci;
+       
+       @CreationTimestamp
+       @Column(name = "created_at", columnDefinition = "timestamp")
+       private Timestamp createdAt;
+       
+       public FixedPciCells() {
+               
+       }
+
+       public FixedPciCells(String cellId, long fixedPci, Timestamp createdAt) {
+               this.cellId = cellId;
+               this.fixedPci = fixedPci;
+               this.createdAt = createdAt;
+       }
+
+       public String getCellId() {
+               return cellId;
+       }
+
+       public void setCellId(String cellId) {
+               this.cellId = cellId;
+       }
+
+       public long getFixedPci() {
+               return fixedPci;
+       }
+
+       public void setFixedPci(long fixedPci) {
+               this.fixedPci = fixedPci;
+       }
+
+       public Timestamp getCreatedAt() {
+               return createdAt;
+       }
+
+       public void setCreatedAt(Timestamp createdAt) {
+               this.createdAt = createdAt;
+       }
+       
+       
+
+       
+       
+}
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/entity/PciUpdate.java b/src/main/java/org/onap/dcaegen2/services/sonhms/entity/PciUpdate.java
new file mode 100644 (file)
index 0000000..8c04922
--- /dev/null
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ *  ============LICENSE_START=======================================================
+ *  son-handler
+ *  ================================================================================
+ *   Copyright (C) 2020 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.dcaegen2.services.sonhms.entity;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "PCI_UPDATE")
+public class PciUpdate {
+
+       @Id
+       @Column(name = "cell_id", columnDefinition = "text")
+       private String cellId;
+
+       @Column(name = "old_pci", columnDefinition = "bigint")
+       private long oldPci;
+       
+       @Column(name = "new_pci", columnDefinition = "bigint")
+       private long newPci;
+       
+       @Column(name = "negative_ack_count", columnDefinition = "int")
+       private int negativeAckCount;
+       
+       public PciUpdate() {
+
+       }
+
+       public PciUpdate(String cellId, long oldPci, long newPci, int negativeAckCount) {
+               this.cellId = cellId;
+               this.oldPci = oldPci;
+               this.newPci = newPci;
+               this.negativeAckCount = negativeAckCount;
+       }
+
+       public String getCellId() {
+               return cellId;
+       }
+
+       public void setCellId(String cellId) {
+               this.cellId = cellId;
+       }
+
+       public long getOldPci() {
+               return oldPci;
+       }
+
+       public void setOldPci(long oldPci) {
+               this.oldPci = oldPci;
+       }
+
+       public long getNewPci() {
+               return newPci;
+       }
+
+       public void setNewPci(long newPci) {
+               this.newPci = newPci;
+       }
+
+       public int getNegativeAckCount() {
+               return negativeAckCount;
+       }
+
+       public void setNegativeAckCount(int negativeAckCount) {
+               this.negativeAckCount = negativeAckCount;
+       }       
+}
index ccca473..273b480 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@ public class CellInfo {
     List<String> cellIdList = new ArrayList<>();
     protected List<AnrInput> anrInputList = new ArrayList<>();
     String trigger;
+    List<String> fixedPCICells = new ArrayList<>();
     
     
     public List<AnrInput> getAnrInputList() {
@@ -66,6 +67,11 @@ public class CellInfo {
         this.cellIdList = cellIdList;
     }
 
-    
+       public List<String> getFixedPCICells() {
+               return fixedPCICells;
+       }
 
+       public void setFixedPCICells(List<String> fixedPCICells) {
+               this.fixedPCICells = fixedPCICells;
+       }
 }
index d6b6c74..ca56e89 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -53,7 +53,7 @@ public class OofRestClient {
      */
 
     public static String queryOof(int numSolutions, String transactionId, String requestType, List<String> cellIdList,
-            String networkId, List<String> optimizers, List<AnrInput> anrInputList) throws OofNotFoundException {
+            String networkId, List<String> optimizers, List<AnrInput> anrInputList, List<String> fixedPciCells) throws OofNotFoundException {
         log.debug("inside queryoof");
 
         Configuration configuration = Configuration.getInstance();
@@ -82,6 +82,9 @@ public class OofRestClient {
         if (!anrInputList.isEmpty()) {
             cellInfo.setAnrInputList(anrInputList);
         }
+        if(!fixedPciCells.isEmpty()) {
+        cellInfo.setFixedPCICells(fixedPciCells); 
+        }
         OofRequestBody oofRequestBody = new OofRequestBody();
         oofRequestBody.setRequestInfo(requestInfo);
         oofRequestBody.setCellInfo(cellInfo);
@@ -98,7 +101,7 @@ public class OofRestClient {
 
         String requestUrl = configuration.getOofService() + configuration.getOofEndpoint();
         log.info("requestUrl {}", requestUrl);
-        ResponseEntity<String> response = null;
+        ResponseEntity<String> response = null; 
         response = SonHandlerRestTemplate.sendPostRequestToOof(requestUrl, requestBody,
                 new ParameterizedTypeReference<String>() {
                 });
index 2c2a764..011b6a6 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -49,8 +49,21 @@ public class ThreadUtils {
      */
     public Boolean createNewThread(List<Graph> newClusters, BlockingQueue<List<String>> childStatusQueue,
             ExecutorService pool, EventHandler eventHandler,String cellId) {
-        
-        
+
+               if (newClusters.isEmpty()) {
+
+                       BlockingQueue<Map<CellPciPair, ArrayList<CellPciPair>>> queue = new LinkedBlockingQueue<>();
+                       ThreadId threadId = new ThreadId();
+                       threadId.setChildThreadId(0);
+                       ChildThread child = new ChildThread(childStatusQueue, new Graph(), queue, threadId,
+                                       new HoMetricsComponent());
+                       log.info("Creating new child thread");
+                       pool.execute(child);
+                       waitForThreadId(threadId);
+                       EventHandler.addChildThreadMap(threadId.getChildThreadId(), child);
+                       eventHandler.addChildStatus(threadId.getChildThreadId(), "processingNotifications");
+               }
+
         for (Graph cluster : newClusters) {
 
             BlockingQueue<Map<CellPciPair, ArrayList<CellPciPair>>> queue = new LinkedBlockingQueue<>();
index 72cdbcf..5d23f81 100644 (file)
@@ -33,3 +33,14 @@ CREATE TABLE HANDOVER_METRICS(
        ho_details TEXT NOT NULL,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 );             
+CREATE TABLE PCI_UPDATE(
+       cell_id TEXT PRIMARY KEY NOT NULL,
+       old_pci BIGINT NOT NULL,
+    new_pci BIGINT, 
+    negative_ack_count INT DEFAULT 0
+);
+CREATE TABLE FIXED_PCI_CELLS(
+       cell_id TEXT PRIMARY KEY NOT NULL,
+       fixed_pci BIGINT NOT NULL,
+       created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+);
index b597311..5ea56ea 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@ package org.onap.dcaegen2.services.sonhms.child;
 import static org.junit.Assert.assertNotNull;
 
 import java.util.ArrayList;
+import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -62,18 +63,20 @@ public class StateOofTest {
     @Test
        public void triggerOofTest() {
                ArrayList<String> cellList = new ArrayList<>();
+           List<String> fixedPciCells = new ArrayList<>();
+
                cellList.add("cell1");
                PowerMockito.mockStatic(OofRestClient.class);
                try {
                        PowerMockito.when(OofRestClient.queryOof(Mockito.anyInt(), Mockito.anyString(), Mockito.anyString(), Mockito.anyList(),
-                                       Mockito.anyString(), Mockito.anyList(), Mockito.anyList())).thenReturn("oofResponse");
+                                       Mockito.anyString(), Mockito.anyList(), Mockito.anyList(), Mockito.any())).thenReturn("oofResponse");
                } catch (OofNotFoundException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
 
                try {
-                       transactionId = oof.triggerOof(cellList, "networkId", new ArrayList<>());
+                       transactionId = oof.triggerOof(cellList, "networkId", new ArrayList<>(),fixedPciCells);
                } catch (OofNotFoundException | InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
index 8c1168b..9e79dcb 100644 (file)
@@ -2,7 +2,7 @@
  *  ============LICENSE_START=======================================================
  *  son-handler
  *  ================================================================================
- *   Copyright (C) 2019 Wipro Limited.
+ *   Copyright (C) 2019-2020 Wipro Limited.
  *   ==============================================================================
  *     Licensed under the Apache License, Version 2.0 (the "License");
  *     you may not use this file except in compliance with the License.
@@ -86,7 +86,8 @@ public class OofRestClientTest {
            cellIdList.add("EXP001");
            List<String> optimizers=new ArrayList<String>();
            optimizers.add("pci"); 
-           List<AnrInput> anrInputList = new ArrayList<>(); 
+           List<AnrInput> anrInputList = new ArrayList<>();
+           List<String> fixedPciCells = new ArrayList<>();
         
         PowerMockito.mockStatic(SonHandlerRestTemplate.class);
                PowerMockito.mockStatic(Configuration.class);
@@ -97,7 +98,7 @@ public class OofRestClientTest {
 
            try {
                
-                       String result=OofRestClient.queryOof(1, "xxx-xxx-xxxx", "create", cellIdList, "NTWK005", optimizers, anrInputList);
+                       String result=OofRestClient.queryOof(1, "xxx-xxx-xxxx", "create", cellIdList, "NTWK005", optimizers, anrInputList,fixedPciCells);
                        assertEquals(ResponseEntity.ok(responseBody).getBody(), result);
                        
 
@@ -109,7 +110,7 @@ public class OofRestClientTest {
         .thenReturn(null);
            try {
                        
-               OofRestClient.queryOof(1, "xxx-xxx-xxxx", "create", cellIdList, "NTWK005", optimizers, new ArrayList<>());
+               OofRestClient.queryOof(1, "xxx-xxx-xxxx", "create", cellIdList, "NTWK005", optimizers, new ArrayList<>(),fixedPciCells);
 
                } catch (OofNotFoundException e) {
                        // TODO Auto-generated catch block
index 15ef9d6..3aceb23 100644 (file)
@@ -18,9 +18,9 @@
 #     ============LICENSE_END=========================================================
 #
 ###############################################################################
-major=1
-minor=1
-patch=1
+major=2
+minor=0
+patch=0
 base_version=${major}.${minor}.${patch}
 release_version=${base_version}
 snapshot_version=${base_version}-SNAPSHOT