From d290a8c6849bfd957363ec4c57a477c650429971 Mon Sep 17 00:00:00 2001 From: krishna Date: Mon, 20 May 2019 17:36:59 +0530 Subject: Change oof trigger functionality considering multiple PM events Change-Id: I29ec91238b451263127822480e27c6f423635404 Issue-ID: DCAEGEN2-1513 Signed-off-by: krishna --- dpo/blueprints/k8s-sonhms-inputs.yaml | 8 +- dpo/blueprints/k8s-sonhms.yaml | 35 +++++- .../dcaegen2/services/sonhms/Configuration.java | 87 +++++++++++--- .../services/sonhms/HoMetricsComponent.java | 28 +++++ .../services/sonhms/PmNotificationHandler.java | 127 +++++++++++++++------ .../onap/dcaegen2/services/sonhms/PmThread.java | 3 +- .../org/onap/dcaegen2/services/sonhms/Timer.java | 75 ++++++++++++ .../services/sonhms/child/ChildThread.java | 106 +++++++++++------ .../services/sonhms/child/ChildThreadUtils.java | 32 +++++- .../dcaegen2/services/sonhms/child/StateOof.java | 18 ++- .../sonhms/controller/ConfigFetchFromCbs.java | 19 ++- .../services/sonhms/dmaap/PolicyDmaapClient.java | 4 +- .../dcaegen2/services/sonhms/model/HoDetails.java | 23 ++++ .../services/sonhms/utils/ThreadUtils.java | 2 +- .../services/sonhms/ConfigurationTest.java | 6 +- .../services/sonhms/HoMetricsComponentTest.java | 19 +++ .../services/sonhms/PMNotificationHandlerTest.java | 6 +- .../services/sonhms/child/ChildThreadTest.java | 30 +++-- .../services/sonhms/child/StateOofTest.java | 2 +- .../sonhms/child/TestChildThreadUtils.java | 22 +++- .../services/sonhms/dmaap/DmaapClientTest.java | 1 - .../sonhms/restclient/OofRestClientTest.java | 2 +- 22 files changed, 540 insertions(+), 115 deletions(-) create mode 100644 src/main/java/org/onap/dcaegen2/services/sonhms/Timer.java diff --git a/dpo/blueprints/k8s-sonhms-inputs.yaml b/dpo/blueprints/k8s-sonhms-inputs.yaml index e417c01..44b8b2f 100644 --- a/dpo/blueprints/k8s-sonhms-inputs.yaml +++ b/dpo/blueprints/k8s-sonhms-inputs.yaml @@ -18,7 +18,7 @@ pgaas_cluster_name: dcae-pg-primary.onap database_name: sonhms -tag_version: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.0.0 +tag_version: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.1.0 replicas: 1 aaf_username: aaf_password: @@ -38,7 +38,13 @@ cid: sonhms-cid config_db: http://sdnc.onap:8181 oof: http://oof-osdf.onap:8699 pci_optimizer: pci +pci_anr_optimizer: pci_anr log_path: /dockerdata-nfs/son-handler +poorCountThreshold: 3 +badCountThreshold: 3 +oofTriggerCountTimer: 30 +oofTriggerCountThreshold: 5 +policyRespTimer: 10 policy_id: com.Config_PCIMS_CONFIG_POLICY.1.xml topic00_location: onap topic00_client_role: son-subscriber diff --git a/dpo/blueprints/k8s-sonhms.yaml b/dpo/blueprints/k8s-sonhms.yaml index d77f0fc..0c7ab81 100644 --- a/dpo/blueprints/k8s-sonhms.yaml +++ b/dpo/blueprints/k8s-sonhms.yaml @@ -30,7 +30,7 @@ inputs: tag_version: type: string description: docker image name and version - default: "nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.0.0" + default: "nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.1.0" pgaas_cluster_name: type: string description: pg cluster @@ -107,10 +107,34 @@ inputs: type: string description: pci optimizer name in oof default: pci + pci_anr_optimizer: + type: string + description: pci and anr optimizer name in oof + default: pci_anr log_path: type: string description: log location in host default: /dockerdata-nfs/son-handler + poorCountThreshold: + type: integer + description: poor neighbor count threshold + default: 3 + badCountThreshold: + type: integer + description: bad neighbor count threshold + default: 3 + oofTriggerCountTimer: + type: integer + description: timer for oof triggered count in minutes + default: 30 + oofTriggerCountThreshold: + type: integer + description: Threshold for oof trigger count + default: 5 + policyRespTimer: + type: integer + description: policy response wait timer in seconds + default: 10 policy_id: type: string description: policy id for config policy @@ -240,8 +264,13 @@ node_templates: sonhandler.cid: { get_input: cid } sonhandler.configDb.service: { get_input: config_db } sonhandler.oof.service: { get_input: oof } - sonhandler.optimizers: - - { get_input: pci_optimizer } + sonhandler.pciOptimizer: { get_input: pci_optimizer } + sonhandler.pciAnrOptimizer: { get_input: pci_anr_optimizer } + sonhandler.poorCountThreshold: { get_input: poorCountThreshold} + sonhandler.badCountThreshold: { get_input: badCountThreshold} + sonhandler.oofTriggerCountTimer: { get_input: oofTriggerCountTimer} + sonhandler.oofTriggerCountThreshold: { get_input: oofTriggerCountThreshold} + sonhandler.policyRespTimer: { get_input: policyRespTimer} service_calls: sdnr-getpnfname: [] sdnr-getpci: [] diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/Configuration.java b/src/main/java/org/onap/dcaegen2/services/sonhms/Configuration.java index a0dc6c5..5cb145a 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/Configuration.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/Configuration.java @@ -42,7 +42,8 @@ public class Configuration { private int minConfusion; private String sourceId; private String callbackUrl; - private List optimizers; + private String pciOptimizer; + private String pciAnrOptimizer; private int numSolutions; private int bufferTime; private int maximumClusters; @@ -52,7 +53,53 @@ public class Configuration { private Map streamsPublishes; private int badThreshold; private int poorThreshold; + private int poorCountThreshold; + private int badCountThreshold; + private int oofTriggerCountTimer; + private int oofTriggerCountThreshold; + private int policyRespTimer; + + public int getPoorCountThreshold() { + return poorCountThreshold; + } + + public void setPoorCountThreshold(int poorCountThreshold) { + this.poorCountThreshold = poorCountThreshold; + } + + public int getBadCountThreshold() { + return badCountThreshold; + } + + public void setBadCountThreshold(int badCountThreshold) { + this.badCountThreshold = badCountThreshold; + } + + public int getOofTriggerCountTimer() { + return oofTriggerCountTimer; + } + + public void setOofTriggerCountTimer(int oofTriggerCountTimer) { + this.oofTriggerCountTimer = oofTriggerCountTimer; + } + + public int getOofTriggerCountThreshold() { + return oofTriggerCountThreshold; + } + + public void setOofTriggerCountThreshold(int oofTriggerCountThreshold) { + this.oofTriggerCountThreshold = oofTriggerCountThreshold; + } + + public int getPolicyRespTimer() { + return policyRespTimer; + } + + public void setPolicyRespTimer(int policyRespTimer) { + this.policyRespTimer = policyRespTimer; + } + public int getBadThreshold() { return badThreshold; } @@ -203,14 +250,6 @@ public class Configuration { this.callbackUrl = callbackUrl; } - public List getOptimizers() { - return optimizers; - } - - public void setOptimizers(List optimizers) { - this.optimizers = optimizers; - } - public int getNumSolutions() { return numSolutions; } @@ -275,16 +314,38 @@ public class Configuration { this.configDbService = configDbService; } + public String getPciOptimizer() { + return pciOptimizer; + } + + public void setPciOptimizer(String pciOptimizer) { + this.pciOptimizer = pciOptimizer; + } + + public String getPciAnrOptimizer() { + return pciAnrOptimizer; + } + + public void setPciAnrOptimizer(String pciAnrOptimizer) { + this.pciAnrOptimizer = pciAnrOptimizer; + } + @Override public String toString() { return "Configuration [pgHost=" + pgHost + ", pgPort=" + pgPort + ", pgUsername=" + pgUsername + ", pgPassword=" + pgPassword + ", dmaapServers=" + dmaapServers + ", configDbService=" + configDbService + ", oofService=" + oofService + ", cg=" + cg + ", cid=" + cid + ", pollingInterval=" + pollingInterval + ", pollingTimeout=" + pollingTimeout + ", minCollision=" + minCollision + ", minConfusion=" - + minConfusion + ", sourceId=" + sourceId + ", callbackUrl=" + callbackUrl + ", optimizers=" - + optimizers + ", numSolutions=" + numSolutions + ", bufferTime=" + bufferTime + ", maximumClusters=" - + maximumClusters + ", aafUsername=" + aafUsername + ", aafPassword=" + aafPassword - + ", streamsSubscribes=" + streamsSubscribes + ", streamsPublishes=" + streamsPublishes + "]"; + + minConfusion + ", sourceId=" + sourceId + ", callbackUrl=" + callbackUrl + ", pciOptimizer=" + + pciOptimizer + ", pciAnrOptimizer=" + pciAnrOptimizer + ", numSolutions=" + numSolutions + + ", bufferTime=" + bufferTime + ", maximumClusters=" + maximumClusters + ", aafUsername=" + aafUsername + + ", aafPassword=" + aafPassword + ", streamsSubscribes=" + streamsSubscribes + ", streamsPublishes=" + + streamsPublishes + ", badThreshold=" + badThreshold + ", poorThreshold=" + poorThreshold + + ", poorCountThreshold=" + poorCountThreshold + ", badCountThreshold=" + badCountThreshold + + ", oofTriggerCountTimer=" + oofTriggerCountTimer + ", oofTriggerCountThreshold=" + + oofTriggerCountThreshold + ", policyRespTimer=" + policyRespTimer + "]"; } + + } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponent.java b/src/main/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponent.java index cf1cf45..eca0930 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponent.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponent.java @@ -27,9 +27,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import fj.data.Either; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.onap.dcaegen2.services.sonhms.dao.HandOverMetricsRepository; +import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics; import org.onap.dcaegen2.services.sonhms.model.HoDetails; import org.onap.dcaegen2.services.sonhms.utils.BeanUtil; import org.slf4j.Logger; @@ -61,4 +63,30 @@ public class HoMetricsComponent { return Either.right(404); } } + + public Boolean update(String hoDetails, String srcCellId) { + try { + HandOverMetricsRepository handOverMetricsRepository = BeanUtil.getBean(HandOverMetricsRepository.class); + handOverMetricsRepository.updateHoMetrics(hoDetails, srcCellId); + return true; + }catch(Exception e) { + log.info("Exception in updating ho metrics {}",e); + return false; + } + } + public Either, Integer> getAll() { + HandOverMetricsRepository handOverMetricsRepository = BeanUtil.getBean(HandOverMetricsRepository.class); + try { + Iterable hoMetrics = handOverMetricsRepository.findAll(); + List hoMetricsList = new ArrayList<>(); + Iterator hoMetricsIterator = hoMetrics.iterator(); + while (hoMetricsIterator.hasNext()) { + hoMetricsList.add(hoMetricsIterator.next()); + } + return Either.left(hoMetricsList); + } catch (Exception e) { + log.info("error in getAll() hoMetrics"); + return Either.right(500); + } + } } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/PmNotificationHandler.java b/src/main/java/org/onap/dcaegen2/services/sonhms/PmNotificationHandler.java index e2223d7..fe809ec 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/PmNotificationHandler.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/PmNotificationHandler.java @@ -23,8 +23,13 @@ package org.onap.dcaegen2.services.sonhms; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; + +import fj.data.Either; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; import org.onap.dcaegen2.services.sonhms.child.ChildThreadUtils; @@ -67,34 +72,94 @@ public class PmNotificationHandler { /** * handle PM notifications. */ - public Boolean handlePmNotifications(PmNotification pmNotification, int badThreshold) { - HandOverMetricsRepository handOverMetricsRepository = BeanUtil.getBean(HandOverMetricsRepository.class); + public Boolean handlePmNotifications(PmNotification pmNotification, int badThreshold, int poorThreshold, + int badCountThreshold) { Boolean result; + Boolean newEntryFlag = false; try { List hoDetailsList = new ArrayList<>(); List lteCellList = new ArrayList<>(); String srcCellId = pmNotification.getEvent().getCommonEventHeader().getSourceName(); + /* + * check whether entry already exists if yes : read the hometrics and update it + * with latest info else store the current data + */ + HoMetricsComponent hoMetricsComponent = new HoMetricsComponent(); + Either, Integer> hoMetrics = hoMetricsComponent.getHoMetrics(srcCellId); + Map dstCellIdPcPair = new HashMap<>(); + Map dstCellIdBcPair = new HashMap<>(); + if (hoMetrics.isLeft()) { + List oldHoDetailsList = hoMetrics.left().value(); + for (HoDetails hodetail : oldHoDetailsList) { + dstCellIdBcPair.put(hodetail.getDstCellId(), hodetail.getBadCount()); + dstCellIdPcPair.put(hodetail.getDstCellId(), hodetail.getPoorCount()); + } + + } else if (hoMetrics.right().value() == 404) { + newEntryFlag = true; + log.info("no history of srcCell found"); + } for (AdditionalMeasurements additionalMeasurements : pmNotification.getEvent().getMeasurementFields() .getAdditionalMeasurements()) { int attemptsCount = Integer.parseInt(additionalMeasurements.getHashMap().get("InterEnbOutAtt_X2HO")); int successCount = Integer.parseInt(additionalMeasurements.getHashMap().get("InterEnbOutSucc_X2HO")); float successRate = ((float) successCount / attemptsCount) * 100; - if (successRate >= badThreshold) { + + if (successRate >= badThreshold && successRate <= poorThreshold) { // poor neighbor HoDetails hoDetails = new HoDetails(); hoDetails.setDstCellId(additionalMeasurements.getName()); hoDetails.setAttemptsCount(attemptsCount); hoDetails.setSuccessCount(successCount); hoDetails.setSuccessRate(successRate); + int pc = 1; + int bc = 0; + if (dstCellIdPcPair.containsKey(additionalMeasurements.getName())) { + pc = dstCellIdPcPair.get(additionalMeasurements.getName()) + 1; + } + hoDetails.setBadCount(bc); + hoDetails.setPoorCount(pc); hoDetailsList.add(hoDetails); - log.info("not bad neighbor {}", additionalMeasurements.getName()); - } else { + log.info("poor neighbor {}", additionalMeasurements.getName()); + } else if (successRate < badThreshold) { // bad neighbor log.info(" bad neighbor {}", additionalMeasurements.getName()); - LteCell lteCell = new LteCell(); - lteCell.setBlacklisted("true"); - lteCell.setCid(additionalMeasurements.getName()); - lteCell.setPlmnId(additionalMeasurements.getHashMap().get("networkId")); - lteCell.setPnfName(pmNotification.getEvent().getCommonEventHeader().getReportingEntityName()); - lteCellList.add(lteCell); + HoDetails hoDetails = new HoDetails(); + hoDetails.setDstCellId(additionalMeasurements.getName()); + hoDetails.setAttemptsCount(attemptsCount); + hoDetails.setSuccessCount(successCount); + hoDetails.setSuccessRate(successRate); + int bc = 1; + int pc = 0; + if (dstCellIdBcPair.containsKey(additionalMeasurements.getName())) { + bc = dstCellIdBcPair.get(additionalMeasurements.getName()) + 1; + } + if (dstCellIdPcPair.containsKey(additionalMeasurements.getName())) { + pc = dstCellIdPcPair.get(additionalMeasurements.getName()); + } + hoDetails.setBadCount(bc); + hoDetails.setPoorCount(pc); + hoDetailsList.add(hoDetails); + if (bc >= badCountThreshold) { + LteCell lteCell = new LteCell(); + lteCell.setBlacklisted("true"); + lteCell.setCid(additionalMeasurements.getName()); + lteCell.setPlmnId(additionalMeasurements.getHashMap().get("networkId")); + lteCell.setPnfName(pmNotification.getEvent().getCommonEventHeader().getReportingEntityName()); + lteCellList.add(lteCell); + hoDetailsList.remove(hoDetails); + } + + } else if (successRate > poorThreshold) { // good neighbor + HoDetails hoDetails = new HoDetails(); + hoDetails.setDstCellId(additionalMeasurements.getName()); + hoDetails.setAttemptsCount(attemptsCount); + hoDetails.setSuccessCount(successCount); + hoDetails.setSuccessRate(successRate); + int pc = 0; + int bc = 0; + hoDetails.setBadCount(bc); + hoDetails.setPoorCount(pc); + hoDetailsList.add(hoDetails); + log.info("good neighbor {}", additionalMeasurements.getName()); } } if (!lteCellList.isEmpty()) { @@ -109,24 +174,21 @@ public class PmNotificationHandler { result = sendAnrUpdateToPolicy(pmNotification, lteCellList); log.info("Sent ANR update to policy {}", result); policyTriggerFlag.setHolder("NONE"); - - String hoDetailsString = handOverMetricsRepository.getHandOverMetrics(srcCellId); - if (hoDetailsString != null) { - ObjectMapper mapper = new ObjectMapper(); - String newHoDetailsString = null; - try { - newHoDetailsString = mapper.writeValueAsString(hoDetailsList); - } catch (Exception e) { - log.error("Error in writing handover metrics json ", e); - return false; - } - handOverMetricsRepository.updateHoMetrics(newHoDetailsString, srcCellId); - } } - if (!hoDetailsList.isEmpty()) { + if (!hoDetailsList.isEmpty() && newEntryFlag) { result = saveToHandOverMetrics(hoDetailsList, srcCellId); log.debug("save HO metrics result {} ", result); + } else if (!hoDetailsList.isEmpty()) { + String hoDetailsString = null; + ObjectMapper mapper = new ObjectMapper(); + try { + hoDetailsString = mapper.writeValueAsString(hoDetailsList); + } catch (Exception e) { + log.error("Error in writing handover metrics json ", e); + return false; + } + hoMetricsComponent.update(hoDetailsString, srcCellId); } } catch (Exception e) { @@ -153,7 +215,7 @@ public class PmNotificationHandler { log.info("payload : {}", payload); String anrUpdateString = mapper.writeValueAsString(payload); ChildThreadUtils childUtils = new ChildThreadUtils(ConfigPolicy.getInstance(), new PnfUtils(), - new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance())); + new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance()), new HoMetricsComponent()); String requestId = UUID.randomUUID().toString(); String notification = childUtils.getNotificationString( pmNotification.getEvent().getCommonEventHeader().getReportingEntityName(), requestId, @@ -182,15 +244,10 @@ public class PmNotificationHandler { log.error("Error in writing handover metrics json ", e); return false; } - - if (handOverMetricsRepository.getHandOverMetrics(srcCellId) == null) { - HandOverMetrics handOverMetrics = new HandOverMetrics(); - handOverMetrics.setHoDetails(hoDetailsString); - handOverMetrics.setSrcCellId(srcCellId); - handOverMetricsRepository.save(handOverMetrics); - } else { - handOverMetricsRepository.updateHoMetrics(hoDetailsString, srcCellId); - } + HandOverMetrics handOverMetrics = new HandOverMetrics(); + handOverMetrics.setHoDetails(hoDetailsString); + handOverMetrics.setSrcCellId(srcCellId); + handOverMetricsRepository.save(handOverMetrics); return true; } } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/PmThread.java b/src/main/java/org/onap/dcaegen2/services/sonhms/PmThread.java index 49f0c56..b2d4568 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/PmThread.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/PmThread.java @@ -72,7 +72,8 @@ public class PmThread implements Runnable { } else if (pmNotification.isLeft()) { Configuration configuration = Configuration.getInstance(); Boolean result = pmNotificationHandler.handlePmNotifications(pmNotification.left().value(), - configuration.getBadThreshold()); + configuration.getBadThreshold(), configuration.getPoorThreshold(), + configuration.getBadCountThreshold()); log.info("pm notification handler result {}", result); } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/Timer.java b/src/main/java/org/onap/dcaegen2/services/sonhms/Timer.java new file mode 100644 index 0000000..aff5fe5 --- /dev/null +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/Timer.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * son-handler + * ================================================================================ + * Copyright (C) 2019 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; + +import java.sql.Timestamp; + +import javax.annotation.PostConstruct; +import org.springframework.stereotype.Component; + +@Component +public class Timer { + + private Timestamp startTime; + private Timestamp currentTime; + private Boolean isTimer; + private int count; + + @PostConstruct + void init() { + isTimer = false; + count = 0; + } + + public Timestamp getStartTime() { + return startTime; + } + + public void setStartTime(Timestamp startTime) { + this.startTime = startTime; + } + + public Timestamp getCurrentTime() { + return currentTime; + } + + public void setCurrentTime(Timestamp currentTime) { + this.currentTime = currentTime; + } + + public Boolean getIsTimer() { + return isTimer; + } + + public void setIsTimer(Boolean isTimer) { + this.isTimer = isTimer; + } + + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + +} \ No newline at end of file diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThread.java b/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThread.java index b053467..0170f90 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThread.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThread.java @@ -21,6 +21,7 @@ package org.onap.dcaegen2.services.sonhms.child; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import fj.data.Either; @@ -42,9 +43,11 @@ import org.onap.dcaegen2.services.sonhms.ClusterDetailsComponent; import org.onap.dcaegen2.services.sonhms.ConfigPolicy; 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.SonRequestsRepository; import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient; +import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics; import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException; import org.onap.dcaegen2.services.sonhms.model.AnrInput; import org.onap.dcaegen2.services.sonhms.model.CellPciPair; @@ -150,7 +153,7 @@ public class ChildThread implements Runnable { ClusterUtils clusterUtils = new ClusterUtils(); Detection detect = new Detection(); ChildThreadUtils childUtils = new ChildThreadUtils(ConfigPolicy.getInstance(), new PnfUtils(), - new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance())); + new PolicyDmaapClient(new DmaapUtils(), Configuration.getInstance()), new HoMetricsComponent()); try { String networkId = cluster.getNetworkId(); @@ -217,7 +220,7 @@ public class ChildThread implements Runnable { cellidList.add(cell); } UUID transactionId; - + Flag policyTriggerFlag = BeanUtil.getBean(Flag.class); while (policyTriggerFlag.getHolder().equals("PM")) { Thread.sleep(100); @@ -225,21 +228,55 @@ public class ChildThread implements Runnable { policyTriggerFlag.setHolder("CHILD"); policyTriggerFlag.setNumChilds(policyTriggerFlag.getNumChilds() + 1); - Either, Integer> anrTriggerResponse = checkAnrTrigger(cellidList); - if (anrTriggerResponse.isRight()) { + 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); + + } + Timestamp currentTime = new Timestamp(System.currentTimeMillis()); + Long difference = currentTime.getTime() - timerOof.getStartTime().getTime(); + 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); + if (difference < timerThreshold && timerOof.getCount() > triggerCountThreshold) { + log.info("difference {}", difference); + + Either, 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 anrInputList = anrTriggerResponse.left().value(); + log.info("Trigger oof for joint optimization"); + transactionId = oof.triggerOof(cellidList, networkId, anrInputList); - if (anrTriggerResponse.right().value() == 404) { - log.debug("No poor neighbors found"); - } else if (anrTriggerResponse.right().value() == 500) { - log.debug("Failed to fetch HO details from DB "); } - transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>()); } else { - List anrInputList = anrTriggerResponse.left().value(); - log.info("Trigger oof for joint optimization"); - transactionId = oof.triggerOof(cellidList, networkId, anrInputList); + + transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>()); + + if (difference > timerThreshold) { + timerOof.setIsTimer(false); + timerOof.setCount(0); + } } + long childThreadId = Thread.currentThread().getId(); childUtils.saveRequest(transactionId.toString(), childThreadId); while (!ChildThread.getResponseMap().containsKey(childThreadId)) { @@ -248,15 +285,12 @@ public class ChildThread implements Runnable { 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); @@ -404,34 +438,38 @@ public class ChildThread implements Runnable { /** * Check if ANR to be triggered. */ - public Either, Integer> checkAnrTrigger(List cellidList) { + public Either, Integer> checkAnrTrigger() { List anrInputList = new ArrayList<>(); Configuration configuration = Configuration.getInstance(); - int poorThreshold = configuration.getPoorThreshold(); List hoDetailsList; - Either, Integer> response; - for (String cellId : cellidList) { - response = hoMetricsComponent.getHoMetrics(cellId); + Either, Integer> hoMetrics = hoMetricsComponent.getAll(); + if(hoMetrics.isRight()) { + log.error("Error in getting HO details from db"); + return Either.right(500); + } + List hoMetricsList = hoMetrics.left().value(); + for (HandOverMetrics hoMetric : hoMetricsList) { + String hoDetailsListString = hoMetric.getHoDetails(); + ObjectMapper mapper = new ObjectMapper(); + try { + hoDetailsList = mapper.readValue(hoDetailsListString, new TypeReference>() { + }); + } catch (Exception e) { + log.error("Exception in parsing HO metrics", hoDetailsListString, e); + continue; + } List removeableNeighbors = new ArrayList<>(); - if (response.isLeft()) { - hoDetailsList = response.left().value(); - for (HoDetails hoDetail : hoDetailsList) { - if (hoDetail.getSuccessRate() < poorThreshold) { + log.info("Checking poor count for src cell {}", hoMetric.getSrcCellId()); + for (HoDetails hoDetail : hoDetailsList) { + if (hoDetail.getPoorCount() >= configuration.getPoorCountThreshold()) { removeableNeighbors.add(hoDetail.getDstCellId()); } } - } else { - if (response.right().value() == 400) { - log.error("Error in getting HO details from db"); - return Either.right(500); - } else { - log.info("no HO metrics found"); - } - } + if (!removeableNeighbors.isEmpty()) { - AnrInput anrInput = new AnrInput(cellId, removeableNeighbors); + AnrInput anrInput = new AnrInput(hoMetric.getSrcCellId(), removeableNeighbors); anrInputList.add(anrInput); } } @@ -440,4 +478,4 @@ public class ChildThread implements Runnable { } return Either.right(404); } -} +} \ No newline at end of file diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadUtils.java b/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadUtils.java index 183de84..d567c8a 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadUtils.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadUtils.java @@ -25,6 +25,8 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import fj.data.Either; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -32,6 +34,7 @@ import java.util.UUID; import org.onap.dcaegen2.services.sonhms.ConfigPolicy; import org.onap.dcaegen2.services.sonhms.Configuration; +import org.onap.dcaegen2.services.sonhms.HoMetricsComponent; import org.onap.dcaegen2.services.sonhms.dao.SonRequestsRepository; import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient; import org.onap.dcaegen2.services.sonhms.entity.SonRequests; @@ -42,6 +45,7 @@ import org.onap.dcaegen2.services.sonhms.model.Common; import org.onap.dcaegen2.services.sonhms.model.Configurations; import org.onap.dcaegen2.services.sonhms.model.Data; import org.onap.dcaegen2.services.sonhms.model.FapService; +import org.onap.dcaegen2.services.sonhms.model.HoDetails; import org.onap.dcaegen2.services.sonhms.model.Lte; import org.onap.dcaegen2.services.sonhms.model.LteCell; import org.onap.dcaegen2.services.sonhms.model.NeighborListInUse; @@ -61,14 +65,16 @@ public class ChildThreadUtils { private ConfigPolicy configPolicy; private PnfUtils pnfUtils; private PolicyDmaapClient policyDmaapClient; + private HoMetricsComponent hoMetricsComponent; /** * Parameterized constructor. */ - public ChildThreadUtils(ConfigPolicy configPolicy, PnfUtils pnfUtils, PolicyDmaapClient policyDmaapClient) { + public ChildThreadUtils(ConfigPolicy configPolicy, PnfUtils pnfUtils, PolicyDmaapClient policyDmaapClient, HoMetricsComponent hoMetricsComponent) { this.configPolicy = configPolicy; this.pnfUtils = pnfUtils; this.policyDmaapClient = policyDmaapClient; + this.hoMetricsComponent = hoMetricsComponent; } /** @@ -219,7 +225,29 @@ public class ChildThreadUtils { lteCellList, String.valueOf(lteCellList.size()))))))), null); configurations.add(configuration); + Either, Integer> hoMetrics = hoMetricsComponent.getHoMetrics(cellId); + if(hoMetrics.isLeft()) { + List hoDetailsList = hoMetrics.left().value(); + for(LteCell lteCell:lteCellList) { + String removedNbr = lteCell.getCid(); + for(HoDetails hoDetail:hoDetailsList) { + if(removedNbr.equals(hoDetail.getDstCellId())) { + hoDetailsList.remove(hoDetail); + break; + } + } + } + String hoDetailsString = null; + ObjectMapper mapper = new ObjectMapper(); + try { + hoDetailsString = mapper.writeValueAsString(hoDetailsList); + } catch (Exception e) { + log.error("Error in writing handover metrics json ", e); + return false; + } + hoMetricsComponent.update(hoDetailsString, cellId); } + } Payload payload = new Payload(configurations); ObjectMapper mapper = new ObjectMapper(); @@ -238,6 +266,8 @@ public class ChildThreadUtils { log.info("send notification to policy result {} ", result); policyDmaapClient.handlePolicyResponse(requestId); log.info("handled policy response in ModifyConfigANR"); + + } } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/child/StateOof.java b/src/main/java/org/onap/dcaegen2/services/sonhms/child/StateOof.java index acfa1a4..8eb5a40 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/child/StateOof.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/child/StateOof.java @@ -66,10 +66,20 @@ public class StateOof { Configuration config = Configuration.getInstance(); int numSolutions = config.getNumSolutions(); - List optimizers = config.getOptimizers(); - - String oofResponse = OofRestClient.queryOof(numSolutions, transactionId.toString(), "create", cellidList, - networkId, optimizers, anrInputList); + List pciOptimizerList = new ArrayList<>(); + List pciAnrOptimizerList = new ArrayList<>(); + + pciOptimizerList.add(config.getPciOptimizer()); + pciAnrOptimizerList.add(config.getPciAnrOptimizer()); + + String oofResponse =null; + if(!anrInputList.isEmpty()) { + oofResponse = OofRestClient.queryOof(numSolutions, transactionId.toString(), "create", cellidList, + networkId, pciAnrOptimizerList, anrInputList); + }else { + oofResponse = OofRestClient.queryOof(numSolutions, transactionId.toString(), "create", cellidList, + networkId, pciOptimizerList, anrInputList); + } log.info("Synchronous Response {}", oofResponse); List childStatus = new ArrayList<>(); diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/controller/ConfigFetchFromCbs.java b/src/main/java/org/onap/dcaegen2/services/sonhms/controller/ConfigFetchFromCbs.java index 548cb4d..7ec446c 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/controller/ConfigFetchFromCbs.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/controller/ConfigFetchFromCbs.java @@ -114,8 +114,8 @@ public class ConfigFetchFromCbs { String namespace = jsonObject.get("sonhandler.namespace").getAsString(); String callbackUrl = "http://" + System.getenv("HOSTNAME") + "." + namespace + ":8080/callbackUrl"; - JsonArray optimizersJson = jsonObject.getAsJsonArray("sonhandler.optimizers"); - List optimizers = new Gson().fromJson(optimizersJson, listType); + String pciOptimizer = jsonObject.get("sonhandler.pciOptimizer").getAsString(); + String pciAnrOptimizer = jsonObject.get("sonhandler.pciAnrOptimizer").getAsString(); String oofService = jsonObject.get("sonhandler.oof.service").getAsString(); int pollingTimeout = jsonObject.get("sonhandler.pollingTimeout").getAsInt(); @@ -123,6 +123,12 @@ public class ConfigFetchFromCbs { int badThreshold = jsonObject.get("sonhandler.badThreshold").getAsInt(); int poorThreshold = jsonObject.get("sonhandler.poorThreshold").getAsInt(); + int poorCountThreshold = jsonObject.get("sonhandler.poorCountThreshold").getAsInt(); + int badCountThreshold = jsonObject.get("sonhandler.badCountThreshold").getAsInt(); + int oofTriggerCountTimer = jsonObject.get("sonhandler.oofTriggerCountTimer").getAsInt(); + int oofTriggerCountThreshold = jsonObject.get("sonhandler.oofTriggerCountThreshold").getAsInt(); + int policyRespTimer = jsonObject.get("sonhandler.policyRespTimer").getAsInt(); + configuration.setStreamsSubscribes(streamsSubscribes); configuration.setStreamsPublishes(streamsPublishes); configuration.setPgPassword(pgPassword); @@ -141,11 +147,18 @@ public class ConfigFetchFromCbs { configuration.setBufferTime(bufferTime); configuration.setConfigDbService(configDbService); configuration.setCallbackUrl(callbackUrl); - configuration.setOptimizers(optimizers); + configuration.setPciOptimizer(pciOptimizer); + configuration.setPciAnrOptimizer(pciAnrOptimizer); configuration.setOofService(oofService); configuration.setPollingTimeout(pollingTimeout); configuration.setBadThreshold(badThreshold); configuration.setPoorThreshold(poorThreshold); + configuration.setPoorCountThreshold(poorCountThreshold); + configuration.setBadCountThreshold(badCountThreshold); + configuration.setOofTriggerCountTimer(oofTriggerCountTimer); + configuration.setOofTriggerCountThreshold(oofTriggerCountThreshold); + configuration.setPolicyRespTimer(policyRespTimer); + log.info("configuration from CBS {}", configuration.toString()); } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyDmaapClient.java b/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyDmaapClient.java index d5371eb..a0a1274 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyDmaapClient.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/dmaap/PolicyDmaapClient.java @@ -90,8 +90,8 @@ public class PolicyDmaapClient { Timestamp currentTime = new Timestamp(System.currentTimeMillis()); Long difference = currentTime.getTime() - startTimer.getTime(); - - while (difference < 10000) { + int policyRespTimer = configuration.getPolicyRespTimer(); // Timer in seconds + while (difference < (policyRespTimer*1000)) { Iterable policyResponseMessages; try { policyResponseMessages = policyResponseCambriaConsumer.fetch(); diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/model/HoDetails.java b/src/main/java/org/onap/dcaegen2/services/sonhms/model/HoDetails.java index 1d43f09..b6e2ab9 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/model/HoDetails.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/model/HoDetails.java @@ -27,6 +27,8 @@ public class HoDetails { private int attemptsCount; private int successCount; private float successRate; + private int poorCount; + private int badCount; /** * default constructor. @@ -35,6 +37,27 @@ public class HoDetails { } + + public int getPoorCount() { + return poorCount; + } + + + public void setPoorCount(int poorCount) { + this.poorCount = poorCount; + } + + + public int getBadCount() { + return badCount; + } + + + public void setBadCount(int badCount) { + this.badCount = badCount; + } + + public String getDstCellId() { return dstCellId; } diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java b/src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java index 5889b63..2c2a764 100644 --- a/src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java +++ b/src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java @@ -88,4 +88,4 @@ public class ThreadUtils { } } -} +} \ No newline at end of file diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/ConfigurationTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/ConfigurationTest.java index 68b94fb..f762a5b 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/ConfigurationTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/ConfigurationTest.java @@ -61,7 +61,8 @@ public class ConfigurationTest { configuration.setOofService("oofService"); configuration.setBadThreshold(50); configuration.setPoorThreshold(70); - configuration.setOptimizers(list); + configuration.setPciOptimizer("pci"); + configuration.setPciAnrOptimizer("pci-anr"); configuration.setPollingInterval(30); configuration.setPollingTimeout(100); configuration.setConfigDbService("sdnrService"); @@ -77,7 +78,8 @@ public class ConfigurationTest { assertEquals(5, configuration.getMinConfusion()); assertEquals(1, configuration.getNumSolutions()); assertEquals("oofService", configuration.getOofService()); - assertEquals(list, configuration.getOptimizers()); + assertEquals("pci", configuration.getPciOptimizer()); + assertEquals("pci-anr", configuration.getPciAnrOptimizer()); assertEquals("user", configuration.getPgUsername()); assertEquals("password", configuration.getPgPassword()); assertEquals("pg", configuration.getPgHost()); diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponentTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponentTest.java index 9ac056b..4bc4a33 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponentTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/HoMetricsComponentTest.java @@ -23,6 +23,7 @@ package org.onap.dcaegen2.services.sonhms; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import fj.data.Either; @@ -30,6 +31,7 @@ import fj.data.Either; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.List; import org.junit.BeforeClass; @@ -38,6 +40,7 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.onap.dcaegen2.services.sonhms.dao.HandOverMetricsRepository; +import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics; import org.onap.dcaegen2.services.sonhms.model.HoDetails; import org.onap.dcaegen2.services.sonhms.utils.BeanUtil; import org.powermock.api.mockito.PowerMockito; @@ -80,6 +83,22 @@ public class HoMetricsComponentTest { assertEquals(400,res); } + @Test + public void getAllTest() { + PowerMockito.mockStatic(BeanUtil.class); + PowerMockito.when(BeanUtil + .getBean(HandOverMetricsRepository.class)).thenReturn(handOverMetricsRepositoryMock); + HandOverMetrics hoMetrics = new HandOverMetrics(); + hoMetrics.setHoDetails("hoDetails"); + hoMetrics.setSrcCellId("cell1"); + List hoList = new ArrayList<>(); + hoList.add(hoMetrics); + Iterable response = hoList; + when(handOverMetricsRepositoryMock.findAll()).thenReturn(response); + assertTrue(hoMetricsComponent.getAll().isLeft()); + when(handOverMetricsRepositoryMock.findAll()).thenReturn(null); + assertTrue(hoMetricsComponent.getAll().isRight()); + } private static String readFromFile(String file) { String content = new String(); try { diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandlerTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandlerTest.java index cbd0265..18f9e02 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandlerTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandlerTest.java @@ -99,9 +99,9 @@ public class PMNotificationHandlerTest { when(flagMock.getHolder()).thenReturn("NONE"); when(policyDmaapClient.sendNotificationToPolicy(Mockito.anyString())).thenReturn(true); when(policyDmaapClient.handlePolicyResponse(Mockito.anyString())).thenReturn(true); - assertTrue(pmNotificationHandler.handlePmNotifications(pmNotification, 50)); - assertFalse(pmNotificationHandler.handlePmNotifications(null, 0)); - assertTrue(pmNotificationHandler.handlePmNotifications(pmNotification1, 50)); + assertTrue(pmNotificationHandler.handlePmNotifications(pmNotification, 50, 70, 1)); + assertFalse(pmNotificationHandler.handlePmNotifications(null, 0, 0,0)); + assertTrue(pmNotificationHandler.handlePmNotifications(pmNotification1, 50, 70, 1)); } private static String readFromFile(String file) { diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadTest.java index a27360e..2003c2c 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/child/ChildThreadTest.java @@ -24,6 +24,8 @@ package org.onap.dcaegen2.services.sonhms.child; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; +import com.fasterxml.jackson.databind.ObjectMapper; + import fj.data.Either; import java.util.ArrayList; @@ -33,10 +35,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.onap.dcaegen2.services.sonhms.Configuration; import org.onap.dcaegen2.services.sonhms.HoMetricsComponent; +import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics; import org.onap.dcaegen2.services.sonhms.model.HoDetails; import org.springframework.boot.test.context.SpringBootTest; @@ -52,21 +54,33 @@ public class ChildThreadTest { @Test public void checkAnrTriggerTest() { - ArrayList cellidList = new ArrayList<>(); - cellidList.add("cell1"); //PowerMockito.mockStatic(Configuration.class); Configuration config = Configuration.getInstance() ; config.setPoorThreshold(70); + config.setPoorCountThreshold(3); //PowerMockito.when(Configuration.getInstance()).thenReturn(config); - Either, Integer> response = null; + Either, Integer> response = null; + List hoDetailsList = new ArrayList<>(); + List hoMetrics = new ArrayList<>(); HoDetails hoDetail = new HoDetails(); hoDetail.setDstCellId("dstCell1"); hoDetail.setSuccessRate(60); - List hoDetailsList = new ArrayList<>(); + hoDetail.setPoorCount(4); hoDetailsList.add(hoDetail); - response = Either.left(hoDetailsList); - when(hoMetricsComponent.getHoMetrics(Mockito.anyString())).thenReturn(response); - assertTrue(childThread.checkAnrTrigger(cellidList).isLeft()); + HandOverMetrics hoMetric = new HandOverMetrics(); + hoMetric.setSrcCellId("cell1"); + ObjectMapper mapper = new ObjectMapper(); + String hoDetailsString = null; + try { + hoDetailsString = mapper.writeValueAsString(hoDetailsList); + } catch (Exception e) { + e.printStackTrace(); + } + hoMetric.setHoDetails(hoDetailsString); + hoMetrics.add(hoMetric); + response = Either.left(hoMetrics); + when(hoMetricsComponent.getAll()).thenReturn(response); + assertTrue(childThread.checkAnrTrigger().isLeft()); } } diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/child/StateOofTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/child/StateOofTest.java index 32bfbcf..b597311 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/child/StateOofTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/child/StateOofTest.java @@ -73,7 +73,7 @@ public class StateOofTest { } try { - transactionId = oof.triggerOof(cellList, "networkId", null); + transactionId = oof.triggerOof(cellList, "networkId", new ArrayList<>()); } catch (OofNotFoundException | InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/child/TestChildThreadUtils.java b/src/test/java/org/onap/dcaegen2/services/sonhms/child/TestChildThreadUtils.java index 28940b3..92b2da1 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/child/TestChildThreadUtils.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/child/TestChildThreadUtils.java @@ -28,6 +28,8 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.ObjectMapper; +import fj.data.Either; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -47,11 +49,14 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.onap.dcaegen2.services.sonhms.ConfigPolicy; import org.onap.dcaegen2.services.sonhms.Configuration; +import org.onap.dcaegen2.services.sonhms.HoMetricsComponent; +import org.onap.dcaegen2.services.sonhms.dao.HandOverMetricsRepository; import org.onap.dcaegen2.services.sonhms.dao.SonRequestsRepository; import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient; import org.onap.dcaegen2.services.sonhms.entity.SonRequests; import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException; import org.onap.dcaegen2.services.sonhms.model.CellPciPair; +import org.onap.dcaegen2.services.sonhms.model.HoDetails; import org.onap.dcaegen2.services.sonhms.model.PolicyNotification; import org.onap.dcaegen2.services.sonhms.restclient.AsyncResponseBody; import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient; @@ -79,6 +84,12 @@ public class TestChildThreadUtils { @Mock private PolicyDmaapClient policyDmaapClient; + @Mock + private HandOverMetricsRepository hoMetricRepository; + + @Mock + private HoMetricsComponent hoMetricsComponent; + @InjectMocks private ChildThreadUtils childThreadUtils2; @@ -92,7 +103,7 @@ public class TestChildThreadUtils { Map configPolicyMap = new HashMap<>(); configPolicyMap.put("PCI_MODCONFIG_POLICY_NAME", "ControlLoop-vPCI-fb41f388-a5f2-11e8-98d0-529269fb1459"); configPolicy.setConfig(configPolicyMap); - childThreadUtils = new ChildThreadUtils(configPolicy, pnfUtils, policyDmaapClient); + childThreadUtils = new ChildThreadUtils(configPolicy, pnfUtils, policyDmaapClient, hoMetricsComponent); MockitoAnnotations.initMocks(this); } @@ -167,6 +178,8 @@ public class TestChildThreadUtils { public void sendToPolicyTest() throws ConfigDbNotFoundException { PowerMockito.mockStatic(SdnrRestClient.class); + PowerMockito.mockStatic(BeanUtil.class); + String asyncRspBodyString = readFromFile("/AsyncRespBody.json"); ObjectMapper mapper = new ObjectMapper(); AsyncResponseBody async = new AsyncResponseBody (); @@ -198,6 +211,13 @@ public class TestChildThreadUtils { Map>>> expected = new HashMap<>(); expected.put("pnfName", list); when(pnfUtils.getPnfsForAnrSolutions(async.getSolutions().getAnrSolutions())).thenReturn(expected); + HoDetails hoDetails = new HoDetails(); + hoDetails.setDstCellId("EXP006"); + List hoDetailsList = new ArrayList<>(); + hoDetailsList.add(hoDetails); + Either, Integer> hoMetrics = Either.left(hoDetailsList); + when(hoMetricsComponent.getHoMetrics(Mockito.anyString())).thenReturn(hoMetrics); + when(hoMetricsComponent.update(Mockito.anyString(), Mockito.anyString())).thenReturn(true); assertTrue(childThreadUtils2.sendToPolicy(async)); } diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/dmaap/DmaapClientTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/dmaap/DmaapClientTest.java index 4f28e35..2a249fd 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/dmaap/DmaapClientTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/dmaap/DmaapClientTest.java @@ -76,7 +76,6 @@ public class DmaapClientTest { configuration.setMinConfusion(5); configuration.setNumSolutions(1); configuration.setOofService("oofService"); - configuration.setOptimizers(list); configuration.setPollingInterval(30); configuration.setPollingTimeout(100); configuration.setConfigDbService("sdnrService"); diff --git a/src/test/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClientTest.java b/src/test/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClientTest.java index 7451ca5..8c1168b 100644 --- a/src/test/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClientTest.java +++ b/src/test/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClientTest.java @@ -71,7 +71,7 @@ public class OofRestClientTest { configuration.setMinConfusion(5); configuration.setNumSolutions(1); configuration.setOofService("oofService"); - configuration.setOptimizers(list); + configuration.setPciOptimizer("pci"); configuration.setPollingInterval(30); configuration.setPollingTimeout(100); configuration.setConfigDbService("sdnrService"); -- cgit 1.2.3-korg