Fix bugs and formatting issues 31/84831/2
authorkrishnaa96 <krishna.moorthy6@wipro.com>
Wed, 10 Apr 2019 08:58:53 +0000 (14:28 +0530)
committerkrishnaa96 <krishna.moorthy6@wipro.com>
Wed, 10 Apr 2019 12:31:28 +0000 (18:01 +0530)
Added minor functionality changes
License formatting fixed

Change-Id: Ieed4aab7562256eaf15627de0cee53cfe1cc8956
Issue-ID: DCAEGEN2-1111
Signed-off-by: krishnaa96 <krishna.moorthy6@wipro.com>
35 files changed:
README.md [new file with mode: 0644]
dpo/blueprints/k8s-sonhms-inputs.yaml
dpo/blueprints/k8s-sonhms.yaml
dpo/spec/sonhandler-componentspec.json
entrypoint.sh [changed mode: 0644->0755]
pom.xml
src/main/java/org/onap/dcaegen2/services/sonhms/AlarmAdditionalInformation.java
src/main/java/org/onap/dcaegen2/services/sonhms/EventHandler.java
src/main/java/org/onap/dcaegen2/services/sonhms/FaultFields.java
src/main/java/org/onap/dcaegen2/services/sonhms/MainThreadComponent.java
src/main/java/org/onap/dcaegen2/services/sonhms/PmNotificationHandler.java [moved from src/main/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandler.java with 71% similarity]
src/main/java/org/onap/dcaegen2/services/sonhms/PmThread.java [moved from src/main/java/org/onap/dcaegen2/services/sonhms/PMThread.java with 91% similarity]
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/PnfUtils.java
src/main/java/org/onap/dcaegen2/services/sonhms/controller/ConfigFetchFromCbs.java
src/main/java/org/onap/dcaegen2/services/sonhms/model/AdditionalMeasurements.java
src/main/java/org/onap/dcaegen2/services/sonhms/model/Event.java
src/main/java/org/onap/dcaegen2/services/sonhms/model/Flag.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/sonhms/model/MeasurementFields.java [moved from src/main/java/org/onap/dcaegen2/services/sonhms/model/Measurement.java with 84% similarity]
src/main/java/org/onap/dcaegen2/services/sonhms/model/PolicyNotification.java
src/main/java/org/onap/dcaegen2/services/sonhms/restclient/OofRestClient.java
src/main/java/org/onap/dcaegen2/services/sonhms/restclient/SdnrRestClient.java
src/main/java/org/onap/dcaegen2/services/sonhms/utils/ThreadUtils.java
src/main/resources/logback.xml
src/test/java/org/onap/dcaegen2/services/sonhms/EventHandlerTest.java
src/test/java/org/onap/dcaegen2/services/sonhms/FaultFieldsTest.java
src/test/java/org/onap/dcaegen2/services/sonhms/PMNotificationHandlerTest.java
src/test/java/org/onap/dcaegen2/services/sonhms/child/TestChildThreadUtils.java
src/test/java/org/onap/dcaegen2/services/sonhms/child/TestPnfUtils.java
src/test/java/org/onap/dcaegen2/services/sonhms/restclient/SdnrRestClientTest.java
src/test/resources/anrSolutions.json [new file with mode: 0644]
src/test/resources/pmNotification.json
src/test/resources/pmNotification1.json
src/test/resources/policy_notification.json

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..65e28af
--- /dev/null
+++ b/README.md
@@ -0,0 +1,43 @@
+SONHMS 
+
+### Build Instructions
+
+This project is organized as a mvn project and has "org.onap.dcaegen2" as parent project. The build generate a jar and package into docker container. 
+
+```
+git clone https://gerrit.onap.org/r/dcaegen2/services/son-handler
+mvn clean install
+```
+
+
+### Environment variables in Docker Container
+
+
+Variables coming from deployment system:
+
+- APP_NAME - son-handler application name that will be registered with consul
+- CONSUL_PROTOCOL - Consul protocol by default set to **http**, if it is need to change it then that can be set to different value 
+- CONSUL_HOST - used with conjunction with CBSPOLLTIMER, should be a host address (without port! e.g my-ip-or-host) where Consul service lies
+- CBS_PROTOCOL - Config Binding Service protocol by default set to **http**, if it is need to change it then that can be set to different value
+- CONFIG_BINDING_SERVICE - used with conjunction with CBSPOLLTIMER, should be a name of CBS as it is registered in Consul
+- HOSTNAME - used with conjunction with CBSPOLLTIMER, should be a name of sonhms application as it is registered in CBS catalog
+
+### Release images
+For R1 - image/version  pushed to nexus3 
+```
+nexus3.onap.org:10001/snapshots/onap/org.onap.dcaegen2.services.son-handler   1.0.0
+```
+
+### Deployment
+son handler can be manually deployed in dcae environment using cloudify blueprint.
+
+login to bootstrap container in dcae deployment
+
+To install : 
+       cfy install -b sonhms -d sonhms -i <inputs filepath> <blueprint filepath> 
+
+To uninstall:
+       cfy uninstall sonhms
+       cfy blueprints delete sonhms
+
+
index 42afba4..052f0b9 100644 (file)
@@ -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:latest
+tag_version: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.0.0
 replicas: 1
 aaf_username: 
 aaf_password: 
@@ -30,12 +30,13 @@ min_confusion: 5
 max_clusters: 5
 bad_threshold: 50
 poor_threshold: 70
-dmaap: message-router
+namespace: onap
+dmaap: message-router.onap
 buffer_time: 60
 cg: sonhms-cg
 cid: sonhms-cid
-config_db: http://sdnc.onap.svc.cluster.local:8181
-oof: http://oof.onap.svc.cluster.local:8080
+config_db: http://sdnc.onap:8181
+oof: http://oof-osdf.onap:8080
 pci_optimizer: pci
 log_path: /dockerdata-nfs/son-handler
 topic00_location: onap
index 9e43fac..9d4e0db 100644 (file)
@@ -29,7 +29,7 @@ inputs:
   tag_version:
     type: string
     description: docker image name and version
-    default: "nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:latest"
+    default: "nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.son-handler:1.0.0"
   pgaas_cluster_name:
     type: string
     description: pg cluster
@@ -76,6 +76,10 @@ inputs:
     type: integer
     description: threshold for poor neighbors
     default: 70
+  namespace:
+    type: String
+    description: namespace
+    default: onap
   dmaap:
     type: string
     description: dmaap server
@@ -143,7 +147,7 @@ node_templates:
               - host:
                   path: { get_input: log_path }
                 container:
-                  bind: /var/log/onap
+                  bind: /home/sonhms/logs
                   mode: rw
     properties:
       image:
@@ -209,6 +213,7 @@ node_templates:
         sonhandler.maximumClusters: { get_input: max_clusters }
         sonhandler.badThreshold: { get_input: bad_threshold }
         sonhandler.poorThreshold: { get_input: poor_threshold }
+        sonhandler.namespace: { get_input: namespace }
         sonhandler.sourceId: SONHMS
         sonhandler.dmaap.server: 
           - { get_input: dmaap }
index 1586dcf..6fc51be 100644 (file)
                                "type": "message router"
                        },
                        {
-                               "format": "FM_ALARM_FROM_VES",
-                               "version": "1.0.0",
+                               "format": "VES_specification",
+                               "version": "7.30.1",
                                "config_key": "fault_management_topic",
                                "type": "message router"
                        },
                        {
-                               "format": "PM_ALARM_FROM_VES",
-                               "version": "1.0.0",
+                               "format": "VES_specification",
+                               "version": "7.30.1",
                                "config_key": "performance_management_topic",
                                "type": "message router"
                        },
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/pom.xml b/pom.xml
index e3a48a3..f87e777 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -1,14 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- ============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========================================================= -->
+<!-- 
+/*******************************************************************************
+ *  ============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=========================================================
+ *  
+ *******************************************************************************/
+  -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
@@ -29,7 +41,7 @@
 
 
        <properties>
-               <sdk.version>1.1.4-SNAPSHOT</sdk.version>
+               <sdk.version>1.1.4</sdk.version>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                                        </resources>
                                        <runs>
                                                <!-- Maven is loosing file permissions during artifacts copy -->
+                                           <run>adduser --disabled-password sonhms </run>
                                                <run>chmod +x /bin/entrypoint.sh</run>
                                                <run>mv /bin/*.jar /bin/application.jar</run>
                                                <run>chmod -R 777 /bin</run>
-                                               <run>mkdir /var/log/onap</run>
-                                               <run>chmod -R 777 /var/log/onap</run>
                                        </runs>
                                        <exposes>
                                                <expose>8080</expose>
index 63cc745..fb45967 100644 (file)
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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;
 
@@ -25,23 +26,29 @@ public class AlarmAdditionalInformation {
     private String networkId;
     private int collisions;
     private int confusions;
+
     public String getNetworkId() {
         return networkId;
     }
+
     public void setNetworkId(String networkId) {
         this.networkId = networkId;
     }
+
     public int getCollisions() {
         return collisions;
     }
+
     public void setCollisions(int collisions) {
         this.collisions = collisions;
     }
+
     public int getConfusions() {
         return confusions;
     }
+
     public void setConfusions(int confusions) {
         this.confusions = confusions;
     }
-    
+
 }
index a25fe0e..bcd9e92 100644 (file)
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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;
 
index 462f550..c1649b2 100644 (file)
@@ -31,7 +31,7 @@ public class FaultFields {
                 + alarmAdditionalInformation + "]";
     }
 
-    private int faultFieldsVersion;
+    private double faultFieldsVersion;
        private String alarmCondition;
        private String eventSourceType;
        private String specificProblem;
@@ -48,11 +48,11 @@ public class FaultFields {
         this.alarmAdditionalInformation = alarmAdditionalInformation;
     }
 
-    public int getFaultFieldsVersion() {
+    public double getFaultFieldsVersion() {
                return faultFieldsVersion;
        }
 
-       public void setFaultFieldsVersion(int faultFieldsVersion) {
+       public void setFaultFieldsVersion(double faultFieldsVersion) {
                this.faultFieldsVersion = faultFieldsVersion;
        }
 
index 606f420..a167872 100644 (file)
@@ -41,6 +41,8 @@ public class MainThreadComponent {
     
     @Autowired
     private NewFmNotification newFmNotification;
+    
+
 
     /**
      * main thread initialization.
@@ -50,7 +52,7 @@ public class MainThreadComponent {
         log.debug("initializing main thread");
         Thread thread = new Thread(new MainThread(newNotification, newFmNotification));
         thread.start();
-        Thread pmThread = new Thread(new PMThread(newPmNotification));
+        Thread pmThread = new Thread(new PmThread(newPmNotification));
         pmThread.start();
     }
 }
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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;
 
@@ -24,6 +25,10 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
+
+import org.onap.dcaegen2.services.sonhms.child.ChildThreadUtils;
+import org.onap.dcaegen2.services.sonhms.child.PnfUtils;
 import org.onap.dcaegen2.services.sonhms.dao.HandOverMetricsRepository;
 import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient;
 import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics;
@@ -33,6 +38,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.Flag;
 import org.onap.dcaegen2.services.sonhms.model.HoDetails;
 import org.onap.dcaegen2.services.sonhms.model.Lte;
 import org.onap.dcaegen2.services.sonhms.model.LteCell;
@@ -44,21 +50,21 @@ import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PMNotificationHandler {
+public class PmNotificationHandler {
 
     private static Logger log = LoggerFactory.getLogger(DmaapNotificationsComponent.class);
     PolicyDmaapClient policyDmaapClient;
 
-    public PMNotificationHandler() {
+    public PmNotificationHandler() {
 
     }
 
-    public PMNotificationHandler(PolicyDmaapClient policyDmaapClient) {
+    public PmNotificationHandler(PolicyDmaapClient policyDmaapClient) {
         this.policyDmaapClient = policyDmaapClient;
     }
 
     /**
-     * handle pm notifications.
+     * handle PM notifications.
      */
     public Boolean handlePmNotifications(PMNotification pmNotification, int badThreshold) {
         HandOverMetricsRepository handOverMetricsRepository = BeanUtil.getBean(HandOverMetricsRepository.class);
@@ -67,12 +73,12 @@ public class PMNotificationHandler {
             List<HoDetails> hoDetailsList = new ArrayList<>();
             List<LteCell> lteCellList = new ArrayList<>();
             String srcCellId = pmNotification.getEvent().getCommonEventHeader().getSourceName();
-            for (AdditionalMeasurements additionalMeasurements : pmNotification.getEvent().getMeasurement()
+            for (AdditionalMeasurements additionalMeasurements : pmNotification.getEvent().getMeasurementFields()
                     .getAdditionalMeasurements()) {
                 int attemptsCount = Integer
-                        .parseInt(additionalMeasurements.getArrayOfNamedHashMap().get(1).get("InterEnbOutAtt_X2HO"));
+                        .parseInt(additionalMeasurements.getHashMap().get("InterEnbOutAtt_X2HO"));
                 int successCount = Integer
-                        .parseInt(additionalMeasurements.getArrayOfNamedHashMap().get(2).get("InterEnbOutSucc_X2HO"));
+                        .parseInt(additionalMeasurements.getHashMap().get("InterEnbOutSucc_X2HO"));
                 float successRate = ((float) successCount / attemptsCount) * 100;
                 if (successRate >= badThreshold) {
                     HoDetails hoDetails = new HoDetails();
@@ -81,21 +87,30 @@ public class PMNotificationHandler {
                     hoDetails.setSuccessCount(successCount);
                     hoDetails.setSuccessRate(successRate);
                     hoDetailsList.add(hoDetails);
-                    log.info("not bad  neighbor {}",additionalMeasurements.getName());
+                    log.info("not bad  neighbor {}", additionalMeasurements.getName());
                 } else {
-                    log.info(" bad  neighbor {}",additionalMeasurements.getName());
+                    log.info(" bad  neighbor {}", additionalMeasurements.getName());
                     LteCell lteCell = new LteCell();
                     lteCell.setBlacklisted("true");
                     lteCell.setCid(additionalMeasurements.getName());
-                    lteCell.setPlmnId(additionalMeasurements.getArrayOfNamedHashMap().get(0).get("networkId"));
+                    lteCell.setPlmnId(additionalMeasurements.getHashMap().get("networkId"));
                     lteCell.setPnfName(pmNotification.getEvent().getCommonEventHeader().getReportingEntityName());
                     lteCellList.add(lteCell);
                 }
             }
             if (!lteCellList.isEmpty()) {
                 log.info("triggering policy to remove bad neighbors");
+                Flag policyTriggerFlag = BeanUtil.getBean(Flag.class);
+                
+                while (policyTriggerFlag.getHolder().equals("CHILD")) {
+                    Thread.sleep(100);
+                }
+
+                policyTriggerFlag.setHolder("PM");
                 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();
@@ -106,7 +121,7 @@ public class PMNotificationHandler {
                         log.error("Error in writing handover metrics json ", e);
                         return false;
                     }
-                    handOverMetricsRepository.updateHoMetrics(newHoDetailsString, srcCellId);            
+                    handOverMetricsRepository.updateHoMetrics(newHoDetailsString, srcCellId);
                 }
             }
             if (!hoDetailsList.isEmpty()) {
@@ -134,11 +149,16 @@ public class PMNotificationHandler {
                             new NeighborListInUse(null, lteCellList, String.valueOf(lteCellList.size()))))))));
             configurations.add(configuration);
             Payload payload = new Payload(configurations);
-            log.info("payload : {}",   payload);
+            log.info("payload : {}", payload);
             String anrUpdateString = mapper.writeValueAsString(payload);
+            ChildThreadUtils childUtils = new ChildThreadUtils(ConfigPolicy.getInstance(), new PnfUtils(),
+                    new PolicyDmaapClient());
+            String notification = childUtils.getNotificationString(pmNotification.getEvent().getCommonEventHeader().getReportingEntityName(), UUID.randomUUID().toString(), anrUpdateString,
+                    System.currentTimeMillis(), "ModifyConfigANR");
+            log.info("Policy Notification: {}", notification);
+            Boolean result = policyDmaapClient.sendNotificationToPolicy(notification);
+            log.info("send notification to policy result {} ", result);
             
-            Boolean result = policyDmaapClient.sendNotificationToPolicy(anrUpdateString);
-            log.debug("send notification to policy result {} ", result);
         } catch (Exception e) {
             log.error("Exception in sending Anr update to policy ", e);
             return false;
@@ -156,14 +176,13 @@ 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 {
+        } else {
             handOverMetricsRepository.updateHoMetrics(hoDetailsString, srcCellId);
         }
         return true;
@@ -28,24 +28,25 @@ import org.onap.dcaegen2.services.sonhms.model.PMNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PMThread implements Runnable {
+public class PmThread implements Runnable {
 
-    private static Logger log = LoggerFactory.getLogger(PMThread.class);
+    private static Logger log = LoggerFactory.getLogger(PmThread.class);
 
     private NewPmNotification newPmNotification;
+    
 
     private DmaapNotificationsComponent dmaapNotificationsComponent;
 
-    private PMNotificationHandler pmNotificationHandler;
+    private PmNotificationHandler pmNotificationHandler;
 
     /**
      * parameterized constructor.
      */
-    public PMThread(NewPmNotification newPmNotification) {
+    public PmThread(NewPmNotification newPmNotification) {
         super();
         this.newPmNotification = newPmNotification;
         dmaapNotificationsComponent = new DmaapNotificationsComponent();
-        pmNotificationHandler = new PMNotificationHandler(new PolicyDmaapClient());
+        pmNotificationHandler = new PmNotificationHandler(new PolicyDmaapClient());
     }
 
     @Override
index 5348e7d..15a2881 100644 (file)
@@ -49,6 +49,7 @@ import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException;
 import org.onap.dcaegen2.services.sonhms.model.AnrInput;
 import org.onap.dcaegen2.services.sonhms.model.CellPciPair;
 import org.onap.dcaegen2.services.sonhms.model.ClusterMap;
+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;
@@ -142,7 +143,7 @@ public class ChildThread implements Runnable {
         }
 
         MDC.put("logFileName", Thread.currentThread().getName());
-        log.debug("Starting child thread");
+        log.info("Starting child thread");
 
         StateOof oof = new StateOof(childStatusUpdate);
         ClusterUtils clusterUtils = new ClusterUtils();
@@ -188,9 +189,9 @@ public class ChildThread implements Runnable {
 
                         // update cluster in DB
                         clusterUtils.updateCluster(cluster);
+                        collisionConfusionResult = detect.detectCollisionConfusion(cluster);
 
                     }
-                    collisionConfusionResult = detect.detectCollisionConfusion(cluster);
 
                 }
                 ArrayList<String> cellidList = new ArrayList<>();
@@ -215,15 +216,27 @@ public class ChildThread implements Runnable {
                     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);
+                
                 Either<List<AnrInput>, Integer> anrTriggerResponse = checkAnrTrigger(cellidList);
                 if (anrTriggerResponse.isRight()) {
-                    if (anrTriggerResponse.right().value() == 404)
+
+                    if (anrTriggerResponse.right().value() == 404) {
                         log.debug("No poor neighbors found");
-                    else if (anrTriggerResponse.right().value() == 500)
+                    } else if (anrTriggerResponse.right().value() == 500) {
                         log.debug("Failed to fetch HO details from DB ");
+                    }
+
                     transactionId = oof.triggerOof(cellidList, networkId, new ArrayList<>());
                 } else {
                     List<AnrInput> anrInputList = anrTriggerResponse.left().value();
+                    log.info("Trigger oof for joint optimization");
                     transactionId = oof.triggerOof(cellidList, networkId, anrInputList);
                 }
                 long childThreadId = Thread.currentThread().getId();
@@ -234,8 +247,16 @@ 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);
                 }
@@ -379,6 +400,9 @@ public class ChildThread implements Runnable {
         return clusterMapList;
     }
 
+    /**
+     * Check if ANR to be triggered.
+     */
     public Either<List<AnrInput>, Integer> checkAnrTrigger(List<String> cellidList) {
 
         List<AnrInput> anrInputList = new ArrayList<>();
index 178d728..1acfde6 100644 (file)
@@ -49,7 +49,6 @@ import org.onap.dcaegen2.services.sonhms.model.Payload;
 import org.onap.dcaegen2.services.sonhms.model.PolicyNotification;
 import org.onap.dcaegen2.services.sonhms.model.Ran;
 import org.onap.dcaegen2.services.sonhms.model.X0005b9Lte;
-import org.onap.dcaegen2.services.sonhms.restclient.AnrSolutions;
 import org.onap.dcaegen2.services.sonhms.restclient.AsyncResponseBody;
 import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient;
 import org.onap.dcaegen2.services.sonhms.restclient.Solutions;
@@ -112,27 +111,9 @@ public class ChildThreadUtils {
      * get policy notification string from oof result.
      *
      */
-    public String getNotificationString(String pnfName, List<CellPciPair> cellPciPairs, String requestId,
-            Long alarmStartTime) {
-        ArrayList<Configurations> configurations = new ArrayList<>();
-        for (CellPciPair cellPciPair : cellPciPairs) {
-            String cellId = cellPciPair.getCellId();
-            int pci = cellPciPair.getPhysicalCellId();
-            Configurations configuration = new Configurations(new Data(new FapService(cellId,
-                    new X0005b9Lte(pci, pnfName), new CellConfig(new Lte(new Ran(new Common(cellId), null))))));
-            configurations.add(configuration);
-        }
-
-        Payload payload = new Payload(configurations);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setSerializationInclusion(Include.NON_NULL);
-        String payloadString = "";
-        try {
-            payloadString = mapper.writeValueAsString(payload);
-        } catch (JsonProcessingException e) {
-            log.debug("JSON processing exception: {}", e);
-        }
-
+    public String getNotificationString(String pnfName, String requestId, String payloadString,
+            Long alarmStartTime, String action) {
+        
         String closedLoopControlName = "ControlLoop-vPCI-fb41f388-a5f2-11e8-98d0-529269fb1459";
         try {
             closedLoopControlName = (String) configPolicy.getConfig().get("PCI_MODCONFIG_POLICY_NAME");
@@ -141,10 +122,11 @@ public class ChildThreadUtils {
         }
 
         PolicyNotification policyNotification = new PolicyNotification(closedLoopControlName, requestId, alarmStartTime,
-                pnfName);
+                pnfName, action);
 
         policyNotification.setClosedLoopControlName(closedLoopControlName);
         policyNotification.setPayload(payloadString);
+        ObjectMapper mapper = new ObjectMapper();
 
         String notification = "";
         try {
@@ -161,7 +143,7 @@ public class ChildThreadUtils {
      * @throws ConfigDbNotFoundException
      *             when config db is unreachable
      */
-    public void sendToPolicy(AsyncResponseBody async) throws ConfigDbNotFoundException {
+    public Boolean sendToPolicy(AsyncResponseBody async) throws ConfigDbNotFoundException {
 
         if (log.isDebugEnabled()) {
             log.debug(async.toString());
@@ -169,19 +151,34 @@ public class ChildThreadUtils {
 
         Solutions solutions;
         solutions = async.getSolutions();
-
         if (!solutions.getPciSolutions().isEmpty()) {
             Map<String, List<CellPciPair>> pnfs = pnfUtils.getPnfs(solutions);
-
             for (Map.Entry<String, List<CellPciPair>> entry : pnfs.entrySet()) {
                 String pnfName = entry.getKey();
                 List<CellPciPair> cellPciPairs = entry.getValue();
+                ArrayList<Configurations> configurations = new ArrayList<>();
+                for (CellPciPair cellPciPair : cellPciPairs) {
+                    String cellId = cellPciPair.getCellId();
+                    int pci = cellPciPair.getPhysicalCellId();
+                    Configurations configuration = new Configurations(new Data(new FapService(cellId,
+                            new X0005b9Lte(pci, pnfName), new CellConfig(new Lte(new Ran(new Common(cellId), null))))));
+                    configurations.add(configuration);
+                }
+
+                Payload payload = new Payload(configurations);
+                ObjectMapper mapper = new ObjectMapper();
+                mapper.setSerializationInclusion(Include.NON_NULL);
+                String payloadString = "";
+                try {
+                    payloadString = mapper.writeValueAsString(payload);
+                } catch (JsonProcessingException e) {
+                    log.debug("JSON processing exception: {}", e);
+                }
 
-                String notification = getNotificationString(pnfName, cellPciPairs, UUID.randomUUID().toString(),
-                        System.currentTimeMillis());
-                log.debug("Policy Notification: {}", notification);
-                PolicyDmaapClient policy = new PolicyDmaapClient();
-                boolean status = policy.sendNotificationToPolicy(notification);
+                String notification = getNotificationString(pnfName, UUID.randomUUID().toString(), payloadString,
+                        System.currentTimeMillis(), "ModifyConfig");
+                log.info("Policy Notification: {}", notification);
+                boolean status = policyDmaapClient.sendNotificationToPolicy(notification);
                 log.debug("sent Message: {}", status);
                 if (status) {
                     log.debug("Message sent to policy");
@@ -192,39 +189,49 @@ public class ChildThreadUtils {
             }
         }
         if (!solutions.getAnrSolutions().isEmpty()) {
-
+            Map<String, List<Map<String,List<String>>>> anrPnfs;
             List<Configurations> configurations = new ArrayList<>();
-            for (AnrSolutions anrSolution : solutions.getAnrSolutions()) {
-                String cellId = anrSolution.getCellId();
-                List<LteCell> lteCellList = new ArrayList<>();
-                for (String removeableNeighbor : anrSolution.getRemoveableNeighbors()) {
-                    LteCell lteCell = new LteCell();
-                    lteCell.setBlacklisted("true");
-                    lteCell.setPlmnId(solutions.getNetworkId());
-                    lteCell.setCid(removeableNeighbor);
-                    int pci = SdnrRestClient.getPci(cellId);
-                    String pnfName = SdnrRestClient.getPnfName(cellId);
-                    lteCell.setPhyCellId(pci);
-                    lteCell.setPnfName(pnfName);
-                    lteCellList.add(lteCell);
+            anrPnfs = pnfUtils.getPnfsForAnrSolutions(solutions.getAnrSolutions());
+            for(Map.Entry<String, List<Map<String,List<String>>>> entry : anrPnfs.entrySet()) {
+                String pnfName = entry.getKey();
+                for(Map<String,List<String>> cellRemNeighborsPair : anrPnfs.get(pnfName)) {
+                  for(Map.Entry<String, List<String>> entry1 : cellRemNeighborsPair.entrySet()) {
+                      String cellId = entry1.getKey();
+                      List<LteCell> lteCellList = new ArrayList<>();
+                      for(String removeableNeighbor : entry1.getValue()) {
+                          LteCell lteCell = new LteCell();
+                          lteCell.setBlacklisted("true");
+                          lteCell.setPlmnId(solutions.getNetworkId());
+                          lteCell.setCid(removeableNeighbor);
+                          int pci = SdnrRestClient.getPci(cellId);
+                          lteCell.setPhyCellId(pci);
+                          lteCell.setPnfName(pnfName);
+                          lteCellList.add(lteCell);
+                      }
+                      Configurations configuration = new Configurations(
+                              new Data(new FapService(cellId, null, new CellConfig(new Lte(new Ran(new Common(cellId),
+                                      new NeighborListInUse(null, lteCellList, String.valueOf(lteCellList.size()))))))));
+                      configurations.add(configuration); 
+                  }
                 }
-                Configurations configuration = new Configurations(
-                        new Data(new FapService(cellId, null, new CellConfig(new Lte(new Ran(new Common(cellId),
-                                new NeighborListInUse(null, lteCellList, String.valueOf(lteCellList.size()))))))));
-                configurations.add(configuration);
-            }
-            Payload payload = new Payload(configurations);
-            ObjectMapper mapper = new ObjectMapper();
-            mapper.setSerializationInclusion(Include.NON_NULL);
-            String anrUpdateString = null;
-            try {
-                anrUpdateString = mapper.writeValueAsString(payload);
-            } catch (JsonProcessingException e) {
-                log.error("Exception in writing anrupdate string", e);
+                Payload payload = new Payload(configurations);
+                ObjectMapper mapper = new ObjectMapper();
+                mapper.setSerializationInclusion(Include.NON_NULL);
+                String payloadString = null;
+                try {
+                    payloadString = mapper.writeValueAsString(payload);
+                } catch (JsonProcessingException e) {
+                    log.error("Exception in writing anrupdate string", e);
+                }
+                String notification = getNotificationString(pnfName, UUID.randomUUID().toString(), payloadString,
+                        System.currentTimeMillis(), "ModifyConfigANR");
+                log.info("Policy Notification: {}", notification);
+                Boolean result = policyDmaapClient.sendNotificationToPolicy(notification);
+                log.info("send notification to policy result {} ", result);
             }
-            Boolean result = policyDmaapClient.sendNotificationToPolicy(anrUpdateString);
-            log.debug("send notification to policy result {} ", result);
+            
         }
+        return true;
     }
 
 }
index 590a938..43c6c53 100644 (file)
@@ -31,15 +31,19 @@ import org.onap.dcaegen2.services.sonhms.dao.CellInfoRepository;
 import org.onap.dcaegen2.services.sonhms.entity.CellInfo;
 import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException;
 import org.onap.dcaegen2.services.sonhms.model.CellPciPair;
+import org.onap.dcaegen2.services.sonhms.restclient.AnrSolutions;
 import org.onap.dcaegen2.services.sonhms.restclient.PciSolutions;
 import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient;
 import org.onap.dcaegen2.services.sonhms.restclient.Solutions;
 import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
+import org.slf4j.Logger;
 
 
 
 public class PnfUtils {
 
+    private static final Logger log = org.slf4j.LoggerFactory.getLogger(ChildThreadUtils.class);
+
     /**
      * get pnfs.
      *
@@ -72,4 +76,32 @@ public class PnfUtils {
         }
         return pnfs;
     }
+    
+    /**
+     * get pnfs for ANR solutions
+     * 
+     */
+    public Map<String, List<Map<String,List<String>>>> getPnfsForAnrSolutions(List<AnrSolutions> anrSolutions) throws ConfigDbNotFoundException {
+        
+        Map<String, List<Map<String,List<String>>>> anrPnfs = new HashMap<>();
+        
+        List<String> removeableNeighbors;
+        for(AnrSolutions anrSolution : anrSolutions) {
+            String cellId = anrSolution.getCellId();
+            String pnfName = SdnrRestClient.getPnfName(cellId);
+            removeableNeighbors = anrSolution.getRemoveableNeighbors();
+            Map<String,List<String>> cellRemNeighborsPair = new HashMap<>();
+            cellRemNeighborsPair.put(cellId, removeableNeighbors);
+            if(anrPnfs.containsKey(pnfName)) {
+                anrPnfs.get(pnfName).add(cellRemNeighborsPair);
+            }else {
+                List<Map<String,List<String>>> anrCells = new ArrayList<>();
+                anrCells.add(cellRemNeighborsPair);
+                anrPnfs.put(pnfName, anrCells);
+            }
+        }
+        log.info("anr Pnfs {}",anrPnfs.toString());
+        return anrPnfs;
+        
+    }
 }
index 76e7929..767dae2 100644 (file)
@@ -80,7 +80,7 @@ public class ConfigFetchFromCbs {
         
         log.info("Updating configuration from CBS");
         Configuration configuration = Configuration.getInstance();
-        log.debug("configuration from CBS {}", jsonObject);
+        log.info("configuration from CBS {}", jsonObject);
         
         Type mapType = new TypeToken<Map<String, Object>>() {}.getType();
         
@@ -109,8 +109,8 @@ public class ConfigFetchFromCbs {
         int bufferTime = jsonObject.get("sonhandler.bufferTime").getAsInt();
         String cid = jsonObject.get("sonhandler.cid").getAsString();
         String configDbService = jsonObject.get("sonhandler.configDb.service").getAsString();
-        
-        String callbackUrl = "http://" + System.getenv("HOSTNAME") + ":8080/callbackUrl";
+        String namespace = jsonObject.get("sonhandler.namespace").getAsString();
+        String callbackUrl = "http://" + System.getenv("HOSTNAME") + "." + namespace + ":8080/callbackUrl";
         
         JsonArray optimizersJson = jsonObject.getAsJsonArray("sonhandler.optimizers");
         List<String> optimizers = new Gson().fromJson(optimizersJson, listType);                   
@@ -144,6 +144,8 @@ public class ConfigFetchFromCbs {
         configuration.setPollingTimeout(pollingTimeout);
         configuration.setBadThreshold(badThreshold);
         configuration.setPoorThreshold(poorThreshold);
+        log.info("configuration from CBS {}", configuration.toString());
+
     }
 
 }
index 10329ba..15a93e9 100644 (file)
 
 package org.onap.dcaegen2.services.sonhms.model;
 
-import java.util.List;
 import java.util.Map;
 
 public class AdditionalMeasurements {
     
     String name;
-    List<Map<String,String>> arrayOfNamedHashMap;  
+    Map<String,String> hashMap ;  
     
     public AdditionalMeasurements() {
         
@@ -38,16 +37,17 @@ public class AdditionalMeasurements {
     public void setName(String name) {
         this.name = name;
     }
-    public List<Map<String, String>> getArrayOfNamedHashMap() {
-        return arrayOfNamedHashMap;
+    public Map<String, String> getHashMap() {
+        return hashMap;
     }
-    public void setArrayOfNamedHashMap(List<Map<String, String>> arrayOfNamedHashMap) {
-        this.arrayOfNamedHashMap = arrayOfNamedHashMap;
+    public void setHashMap(Map<String, String> hashMap) {
+        this.hashMap = hashMap;
     }
     @Override
     public String toString() {
-        return "AdditionalMeasurements [name=" + name + ", arrayOfNamedHashMap=" + arrayOfNamedHashMap + "]";
+        return "AdditionalMeasurements [name=" + name + ", hashMap=" + hashMap + "]";
     }
-    
+  
+  
     
 }
index b958318..73edc39 100644 (file)
@@ -25,7 +25,7 @@ import org.onap.dcaegen2.services.sonhms.CommonEventHeader;
 
 public class Event {
     CommonEventHeader commonEventHeader;
-    Measurement measurement;
+    MeasurementFields measurementFields;
     
     public Event() {
         
@@ -39,13 +39,15 @@ public class Event {
         this.commonEventHeader = commonEventHeader;
     }
 
-    public Measurement getMeasurement() {
-        return measurement;
+    public MeasurementFields getMeasurementFields() {
+        return measurementFields;
     }
 
-    public void setMeasurement(Measurement measurement) {
-        this.measurement = measurement;
+    public void setMeasurementFields(MeasurementFields measurementFields) {
+        this.measurementFields = measurementFields;
     }
+
     
     
 }
diff --git a/src/main/java/org/onap/dcaegen2/services/sonhms/model/Flag.java b/src/main/java/org/onap/dcaegen2/services/sonhms/model/Flag.java
new file mode 100644 (file)
index 0000000..a5a7d65
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ *  ============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.model;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Flag {
+    
+    private String holder;
+    private int numChilds;
+
+    @PostConstruct
+    void setup() {
+        holder = "NONE";
+        numChilds = 0;
+    }
+    
+    public String getHolder() {
+        return holder;
+    }
+
+    public void setHolder(String holder) {
+        this.holder = holder;
+    }
+
+    public int getNumChilds() {
+        return numChilds;
+    }
+
+    public void setNumChilds(int numChilds) {
+        this.numChilds = numChilds;
+    }
+    
+}
@@ -23,15 +23,17 @@ package org.onap.dcaegen2.services.sonhms.model;
 
 import java.util.List;
 
-public class Measurement {
+public class MeasurementFields {
 
     String measurementInterval;
+    String measurementFieldsVersion;
+   
     List<AdditionalMeasurements> additionalMeasurements;
     
     /**
      * default constructor
      */
-    public Measurement() {
+    public MeasurementFields() {
         
     }
     public String getMeasurementInterval() {
@@ -50,5 +52,12 @@ public class Measurement {
         this.additionalMeasurements = additionalMeasurements;
     }
     
+    public String getMeasurementFieldsVersion() {
+        return measurementFieldsVersion;
+    }
+    public void setMeasurementFieldsVersion(String measurementFieldsVersion) {
+        this.measurementFieldsVersion = measurementFieldsVersion;
+    }
+
     
 }
index 35480cf..e432b0c 100644 (file)
@@ -62,7 +62,7 @@ public class PolicyNotification {
      * Constructor.
      *
      */
-    public PolicyNotification(String closedLoopControlName, String requestId, Long alarmStartTime, String pnfName) {
+    public PolicyNotification(String closedLoopControlName, String requestId, Long alarmStartTime, String pnfName, String action) {
         this.closedLoopControlName = closedLoopControlName;
         this.requestId = requestId;
         this.closedLoopEventClient = "microservice.PCI";
@@ -70,7 +70,7 @@ public class PolicyNotification {
         this.closedLoopAlarmStart = alarmStartTime;
         this.from = "PCIMS";
         this.version = "1.0.2";
-        this.action = "ModifyConfig";
+        this.action = action;
         this.target = "generic-vnf.vnf-id";
         this.targetType = "VNF";
         this.aai = new HashMap<>();
index 9cb1d18..0f6dd98 100644 (file)
@@ -70,7 +70,7 @@ public class OofRestClient {
         requestInfo.setRequestType(requestType);
         requestInfo.setNumSolutions(numSolutions);
         requestInfo.setOptimizers(optimizers);
-        Map<String,String> callbackHeader = new HashMap<>();
+        Map<String, String> callbackHeader = new HashMap<>();
         callbackHeader.put("Content-Type", "application/json");
         requestInfo.setCallbackHeader(callbackHeader);
         ConfigPolicy config = ConfigPolicy.getInstance();
@@ -81,13 +81,14 @@ public class OofRestClient {
             log.debug("No config policy available. Using default timeout 60 sec");
         }
         requestInfo.setTimeout(timeout);
-        
+
         CellInfo cellInfo = new CellInfo();
         cellInfo.setCellIdList(cellIdList);
         cellInfo.setNetworkId(networkId);
         cellInfo.setTrigger("NbrListChange");
-        if(!anrInputList.isEmpty())
+        if (!anrInputList.isEmpty()) {
             cellInfo.setAnrInputList(anrInputList);
+        }
         OofRequestBody oofRequestBody = new OofRequestBody();
         oofRequestBody.setRequestInfo(requestInfo);
         oofRequestBody.setCellInfo(cellInfo);
@@ -98,11 +99,11 @@ public class OofRestClient {
             requestBody = mapper.writeValueAsString(oofRequestBody);
         } catch (JsonProcessingException e) {
             log.error("Exception when forming JSON String {}", e);
-            
+
         }
-        log.debug("requestBody{}", requestBody);
+        log.info("requestBody{}", requestBody);
 
-        String requestUrl = configuration.getOofService() + "/api/oof/v1/pci";
+        String requestUrl = configuration.getOofService() + "/api/oof/pci/v1";
         log.debug("requestUrl {}", requestUrl);
         ResponseEntity<String> response = null;
         response = SonHandlerRestTemplate.sendPostRequestToOof(requestUrl, requestBody,
@@ -111,7 +112,7 @@ public class OofRestClient {
         if (response == null) {
             throw new OofNotFoundException("Request to oof failed");
         }
-        log.debug("response {}", response);
+        log.info("response {}", response);
 
         return response.getBody();
     }
index 65bd756..2478f82 100644 (file)
@@ -37,8 +37,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.ResponseEntity;
 
-
-
 public class SdnrRestClient {
 
     private static final String DATETIMEFORMAT = "yyyy-MM-dd HH:mm:ss";
@@ -48,20 +46,6 @@ public class SdnrRestClient {
 
     }
 
-    /**
-     * Method to get cell list from SDNR.
-     *
-     * @throws ConfigDbNotFoundException
-     *             when request to configDB fails
-     */
-    public static String getCellList(String networkId) throws ConfigDbNotFoundException {
-        Configuration configuration = Configuration.getInstance();
-        String ts = new SimpleDateFormat(DATETIMEFORMAT).format(new Time(System.currentTimeMillis()));
-        String requestUrl = configuration.getConfigDbService() + "/SDNCConfigDBAPI/getCellList" + "/" + networkId + "/" 
-                + ts;
-        return sendRequest(requestUrl);
-    }
-
     /**
      * Method to get neibhbour list from SDNR.
      *
@@ -71,16 +55,19 @@ public class SdnrRestClient {
     public static List<CellPciPair> getNbrList(String cellId) throws ConfigDbNotFoundException {
         Configuration configuration = Configuration.getInstance();
         String ts = new SimpleDateFormat(DATETIMEFORMAT).format(new Time(System.currentTimeMillis()));
-        String requestUrl = configuration.getConfigDbService() + "/SDNCConfigDBAPI/getNbrList" + "/" + cellId + "/"
-                + ts;
+        String requestUrl = configuration.getConfigDbService() + "/api/sdnc-config-db/v3/getNbrList" + "/" + cellId
+                + "/" + ts;
         log.debug("request url: {}", requestUrl);
         String response = sendRequest(requestUrl);
         List<CellPciPair> nbrList = new ArrayList<>();
-        JSONArray nbrListObj = new JSONArray(response);
+        JSONObject responseJson = new JSONObject(response);
+        JSONArray nbrListObj = responseJson.getJSONArray("nbrList");
         for (int i = 0; i < nbrListObj.length(); i++) {
             JSONObject cellObj = nbrListObj.getJSONObject(i);
-            CellPciPair cell = new CellPciPair(cellObj.getString("cellId"), cellObj.getInt("pciValue"));
-            nbrList.add(cell);
+            if (cellObj.getBoolean("ho")) {
+                CellPciPair cell = new CellPciPair(cellObj.getString("targetCellId"), cellObj.getInt("pciValue"));
+                nbrList.add(cell);
+            }
         }
 
         return nbrList;
@@ -95,7 +82,7 @@ public class SdnrRestClient {
     public static int getPci(String cellId) throws ConfigDbNotFoundException {
         Configuration configuration = Configuration.getInstance();
         String ts = new SimpleDateFormat(DATETIMEFORMAT).format(new Time(System.currentTimeMillis()));
-        String requestUrl = configuration.getConfigDbService() + "/SDNCConfigDBAPI/getPCI" + "/" + cellId + "/"
+        String requestUrl = configuration.getConfigDbService() + "/api/sdnc-config-db/v3/getPCI" + "/" + cellId + "/"
                 + ts;
         String response = sendRequest(requestUrl);
         JSONObject respObj = new JSONObject(response);
@@ -111,24 +98,24 @@ public class SdnrRestClient {
     public static String getPnfName(String cellId) throws ConfigDbNotFoundException {
         Configuration configuration = Configuration.getInstance();
         String ts = new SimpleDateFormat(DATETIMEFORMAT).format(new Time(System.currentTimeMillis()));
-        String requestUrl = configuration.getConfigDbService() + "/SDNCConfigDBAPI/getPnfName" + "/" + cellId + "/"
-                + ts; 
+        String requestUrl = configuration.getConfigDbService() + "/api/sdnc-config-db/v3/getPnfId" + "/" + cellId + "/"
+                + ts;
         String response = sendRequest(requestUrl);
         JSONObject responseObject = new JSONObject(response);
         return responseObject.getString("value");
     }
 
-
     /**
      * Method to send request.
      */
     private static String sendRequest(String url) throws ConfigDbNotFoundException {
         ResponseEntity<String> response = SonHandlerRestTemplate.sendGetRequest(url,
-                new ParameterizedTypeReference<String>() {});
+                new ParameterizedTypeReference<String>() {
+                });
         if (response == null) {
             throw new ConfigDbNotFoundException("Cannot reach Config DB");
         }
-        return response.getBody(); 
+        return response.getBody();
     }
 
 }
index 96b1a24..5889b63 100644 (file)
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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.utils;
 
index 28586fd..ae59b6e 100644 (file)
@@ -1,43 +1,38 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- ============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========================================================= -->
-<configuration>
-       <appender name="FILE-THREAD" class="ch.qos.logback.classic.sift.SiftingAppender">
-               <discriminator>
-                       <key>logFileName</key>
-                       <defaultValue>log</defaultValue>
-               </discriminator>
+<!-- 
+/*******************************************************************************
+ *  ============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=========================================================
+ *  
+ *******************************************************************************/
+  -->
+       <configuration>
+
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>
+                %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n
+            </Pattern>
+        </layout>
+    </appender>
+
+    <root level="info">
+        <appender-ref ref="CONSOLE"/>
+    </root>
 
-               <sift>
-                       <appender name="file-${logFileName}"
-                               class="ch.qos.logback.core.rolling.RollingFileAppender">
-                               <file>/var/log/onap/son-handler/${logFileName}.log</file>
-                               <rollingPolicy
-                                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-                                       <fileNamePattern>${logFileName}.%i.log.zip</fileNamePattern>
-                                       <minIndex>1</minIndex>
-                                       <maxIndex>5</maxIndex>
-                               </rollingPolicy>
-                               <triggeringPolicy
-                                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-                                       <maxFileSize>5MB</maxFileSize>
-                               </triggeringPolicy>
-                               <encoder>
-                                       <pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread])
-                                               %highlight(%-5level) %logger{36}.%M - %msg%n</pattern>
-                               </encoder>
-                       </appender>
-               </sift>
-       </appender>
-       <root level="info">
-               <appender-ref ref="FILE-THREAD" />
-       </root>
 </configuration>
index 02a061b..8f161a7 100644 (file)
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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;
 
index c940917..19f3815 100644 (file)
@@ -38,7 +38,7 @@ public class FaultFieldsTest {
 
         faultFields.setEventSeverity("eventSeverity");
         faultFields.setEventSourceType("eventSourceType");
-        faultFields.setFaultFieldsVersion(0);
+        faultFields.setFaultFieldsVersion(4.0);
         faultFields.setAlarmAdditionalInformation(alarmAdditionalInformation);
 
         faultFields.setSpecificProblem("specificProblem");
@@ -46,7 +46,7 @@ public class FaultFieldsTest {
         assertEquals("alarmCondition", faultFields.getAlarmCondition());
         assertEquals(1, faultFields.getAlarmAdditionalInformation().getCollisions());
         assertEquals(3, faultFields.getAlarmAdditionalInformation().getConfusions());
-        assertEquals(0, faultFields.getFaultFieldsVersion());
+        assertEquals(4.0, faultFields.getFaultFieldsVersion(), 0);
         assertEquals("eventSeverity", faultFields.getEventSeverity());
         assertEquals("eventSourceType", faultFields.getEventSourceType());
         assertEquals("networkId", faultFields.getAlarmAdditionalInformation().getNetworkId());
index e2e702c..9cae5b6 100644 (file)
@@ -1,22 +1,23 @@
 /*******************************************************************************
- * ============LICENSE_START=======================================================
- * pcims
+ *  ============LICENSE_START=======================================================
+ *  son-handler
  *  ================================================================================
- *  Copyright (C) 2018 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=========================================================
- ******************************************************************************/
+ *   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;
 
@@ -38,6 +39,7 @@ import org.mockito.Mockito;
 import org.onap.dcaegen2.services.sonhms.dao.HandOverMetricsRepository;
 import org.onap.dcaegen2.services.sonhms.dmaap.PolicyDmaapClient;
 import org.onap.dcaegen2.services.sonhms.entity.HandOverMetrics;
+import org.onap.dcaegen2.services.sonhms.model.Flag;
 import org.onap.dcaegen2.services.sonhms.model.PMNotification;
 import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
 import org.powermock.api.mockito.PowerMockito;
@@ -56,8 +58,11 @@ public class PMNotificationHandlerTest {
     @Mock
     HandOverMetricsRepository handOverMetricsRepositoryMock;
     
+    @Mock
+    Flag flagMock;
+    
     @InjectMocks
-    PMNotificationHandler pmNotificationHandler;
+    PmNotificationHandler pmNotificationHandler;
     
     @Mock
     PolicyDmaapClient policyDmaapClient;
@@ -88,7 +93,10 @@ public class PMNotificationHandlerTest {
         PowerMockito.mockStatic(BeanUtil.class);
         PowerMockito.when(BeanUtil
                 .getBean(HandOverMetricsRepository.class)).thenReturn(handOverMetricsRepositoryMock);
+        PowerMockito.when(BeanUtil
+                .getBean(Flag.class)).thenReturn(flagMock);
         when(handOverMetricsRepositoryMock.save(new HandOverMetrics())).thenReturn(null);
+        when(flagMock.getHolder()).thenReturn("NONE");
         when(policyDmaapClient.sendNotificationToPolicy(Mockito.anyString())).thenReturn(true);
         assertTrue(pmNotificationHandler.handlePmNotifications(pmNotification, 50));
         assertFalse(pmNotificationHandler.handlePmNotifications(null, 0));
index ab4119d..536f327 100644 (file)
@@ -55,7 +55,6 @@ import org.onap.dcaegen2.services.sonhms.model.CellPciPair;
 import org.onap.dcaegen2.services.sonhms.model.PolicyNotification;
 import org.onap.dcaegen2.services.sonhms.restclient.AsyncResponseBody;
 import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient;
-import org.onap.dcaegen2.services.sonhms.restclient.Solutions;
 import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
 import org.onap.dcaegen2.services.sonhms.utils.ClusterUtilsTest;
 import org.powermock.api.mockito.PowerMockito;
@@ -153,7 +152,7 @@ public class TestChildThreadUtils {
                String requestId = "a4130fd5-2291-4a83-8992-04e4c9f32731";
                Long alarmStart = Long.parseLong("1542445563201");
 
-               String result = childThreadUtils.getNotificationString(pnfName, cellPciPairs, requestId, alarmStart);
+               String result = childThreadUtils.getNotificationString(pnfName, requestId, "payloadString", alarmStart, "action");
                PolicyNotification actual = new PolicyNotification();
                try {
                        actual = mapper.readValue(result, PolicyNotification.class);
@@ -188,8 +187,18 @@ public class TestChildThreadUtils {
         pciPairList.add(cell2);
         pciPairList.add(cell3);
         pnfsMap.put("pnf1", pciPairList);
-        when(pnfUtils.getPnfs(Mockito.any(Solutions.class))).thenReturn(pnfsMap);
-        childThreadUtils.sendToPolicy(async);
+        when(pnfUtils.getPnfs(async.getSolutions())).thenReturn(pnfsMap);
+        List<String> remNeighbors = new ArrayList<>();
+        remNeighbors.add("EXP006");
+        Map<String,List<String>> cellRemNeighborsPair = new HashMap<>();
+        cellRemNeighborsPair.put("EXP003", remNeighbors);
+        List<Map<String,List<String>>> list = new ArrayList<>();
+        list.add(cellRemNeighborsPair);
+        Map<String, List<Map<String,List<String>>>> expected = new HashMap<>();
+        expected.put("pnfName", list);
+        when(pnfUtils.getPnfsForAnrSolutions(async.getSolutions().getAnrSolutions())).thenReturn(expected);
+        assertTrue(childThreadUtils2.sendToPolicy(async));
+        
        }
 
        private static String readFromFile(String file) {
index 4b36598..d74bff8 100644 (file)
@@ -22,6 +22,7 @@ package org.onap.dcaegen2.services.sonhms.child;
 
 import static org.junit.Assert.assertEquals;
 
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import java.io.BufferedReader;
@@ -46,6 +47,7 @@ import org.onap.dcaegen2.services.sonhms.dao.CellInfoRepository;
 import org.onap.dcaegen2.services.sonhms.entity.CellInfo;
 import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException;
 import org.onap.dcaegen2.services.sonhms.model.CellPciPair;
+import org.onap.dcaegen2.services.sonhms.restclient.AnrSolutions;
 import org.onap.dcaegen2.services.sonhms.restclient.SdnrRestClient;
 import org.onap.dcaegen2.services.sonhms.restclient.Solutions;
 import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
@@ -69,6 +71,7 @@ public class TestPnfUtils {
     
     private static final Logger log = org.slf4j.LoggerFactory.getLogger(TestPnfUtils.class);
     private static Solutions solutions = new Solutions();
+    private static List<AnrSolutions> anrSolutions = new ArrayList<>();
     private static Optional<CellInfo> cellInfo;
     private static Optional<CellInfo> cellInfoNull;
 
@@ -81,10 +84,13 @@ public class TestPnfUtils {
          
          
          String solutionsString=readFromFile("/solutions.json");
+         String anrSolutionsString = readFromFile("/anrSolutions.json");
          ObjectMapper mapper = new ObjectMapper();
             
             try {
                 solutions=mapper.readValue(solutionsString, Solutions.class);
+                anrSolutions = mapper.readValue(anrSolutionsString, new TypeReference<ArrayList<AnrSolutions>>() {
+                });
             } catch (IOException e) {
                 log.debug("Exception in StateOof Test "+e);
                 e.printStackTrace();
@@ -134,6 +140,33 @@ public class TestPnfUtils {
             e.printStackTrace();
         }
      }
+     
+     @Test
+     public void testGetPnfsForAnrSolutions() {
+         Map<String, List<Map<String,List<String>>>> actual = null ;
+         Map<String, List<Map<String,List<String>>>> expected = new HashMap<>();
+         try {
+             PowerMockito.mockStatic(SdnrRestClient.class);
+            PowerMockito.when(SdnrRestClient.getPnfName(Mockito.anyString())).thenReturn("ncServer1");
+            actual = pnfUtils.getPnfsForAnrSolutions(anrSolutions);
+        } catch (ConfigDbNotFoundException e) {
+            e.printStackTrace();
+        }
+        List<String> remNeighbors1 = new ArrayList<>();
+        List<String> remNeighbors2 = new ArrayList<>();
+        remNeighbors1.add("cell2");
+        remNeighbors1.add("cell3");
+        remNeighbors2.add("cell9");
+        Map<String,List<String>> cellRemNeighborsPair1 = new HashMap<>();
+        Map<String,List<String>> cellRemNeighborsPair2 = new HashMap<>();
+        cellRemNeighborsPair1.put("cell1", remNeighbors1);
+        cellRemNeighborsPair2.put("cell8", remNeighbors2);
+        List<Map<String,List<String>>> list = new ArrayList<>();
+        list.add(cellRemNeighborsPair1);
+        list.add(cellRemNeighborsPair2);
+        expected.put("ncServer1", list);
+        assertEquals(expected, actual);
+     }
      private static String readFromFile(String file) {
             String content  = new String();
             try {
index 1557e51..59eacc9 100644 (file)
@@ -37,7 +37,6 @@ import org.mockito.MockitoAnnotations;
 import org.onap.dcaegen2.services.sonhms.Configuration;
 import org.onap.dcaegen2.services.sonhms.exceptions.ConfigDbNotFoundException;
 import org.onap.dcaegen2.services.sonhms.model.CellPciPair;
-import org.onap.dcaegen2.services.sonhms.utils.BeanUtil;
 import org.onap.dcaegen2.services.sonhms.utils.SonHandlerRestTemplate;
 import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
@@ -64,36 +63,20 @@ public class SdnrRestClientTest {
         MockitoAnnotations.initMocks(this);
     }
     
-    @Test
-       public void getCellListTest() {
-       
-       String responseBody="[\n" + 
-                       "  \"string\"\n" + 
-                       "]";
-       PowerMockito.mockStatic(SonHandlerRestTemplate.class);
-       PowerMockito.mockStatic(BeanUtil.class);
-               PowerMockito.mockStatic(Configuration.class);
-               PowerMockito.when(Configuration.getInstance()).thenReturn(configuration);
-               PowerMockito.when(SonHandlerRestTemplate.sendGetRequest(Mockito.anyString(),Matchers.<ParameterizedTypeReference<String>>any())) 
-        .thenReturn(ResponseEntity.ok(responseBody));
-               try {
-                       String result=SdnrRestClient.getCellList("12345");
-                       assertEquals(ResponseEntity.ok(responseBody).getBody(),result);
-               } catch (ConfigDbNotFoundException e) {
-                       log.debug("ConfigDbNotFoundException {}",e.toString());;
-               }
-               
-    }
     
     @Test
        public void getNbrListTest() {
                
-               String responseBody="[\n" + 
-                               "  {\n" + 
-                               "    \"cellId\": \"string\",\n" + 
-                               "    \"pciValue\": 0\n" + 
-                               "  }\n" + 
-                               "]";
+               String responseBody="{\n" + 
+                       "  \"cellId\": \"string\",\n" + 
+                       "  \"nbrList\": [\n" + 
+                       "    {\n" + 
+                       "      \"ho\": true,\n" + 
+                       "      \"pciValue\": 0,\n" + 
+                       "      \"targetCellId\": \"string\"\n" + 
+                       "    }\n" + 
+                       "  ]\n" + 
+                       "}";
                PowerMockito.mockStatic(SonHandlerRestTemplate.class);
                PowerMockito.mockStatic(Configuration.class);
                PowerMockito.when(Configuration.getInstance()).thenReturn(configuration);
@@ -103,11 +86,14 @@ public class SdnrRestClientTest {
                        List<CellPciPair> result=SdnrRestClient.getNbrList("1");
                        List<CellPciPair> nbrList = new ArrayList<>();
                        String response=ResponseEntity.ok(responseBody).getBody();
-               JSONArray nbrListObj = new JSONArray(response);
+                       JSONObject responseJson = new JSONObject(response);
+               JSONArray nbrListObj = responseJson.getJSONArray("nbrList");
                for (int i = 0; i < nbrListObj.length(); i++) {
                    JSONObject cellObj = nbrListObj.getJSONObject(i);
-                   CellPciPair cell = new CellPciPair(cellObj.getString("cellId"), cellObj.getInt("pciValue"));
-                   nbrList.add(cell);
+                   if (cellObj.getBoolean("ho")) {
+                       CellPciPair cell = new CellPciPair(cellObj.getString("targetCellId"), cellObj.getInt("pciValue"));
+                       nbrList.add(cell);
+                   }
                }
                        assertEquals(nbrList,result);
                } catch (ConfigDbNotFoundException e) {
diff --git a/src/test/resources/anrSolutions.json b/src/test/resources/anrSolutions.json
new file mode 100644 (file)
index 0000000..77291a3
--- /dev/null
@@ -0,0 +1,15 @@
+[
+  {
+    "cellId":"cell1",
+    "removeableNeighbors":[
+      "cell2",
+      "cell3"
+    ]
+  },
+  {
+    "cellId":"cell8",
+    "removeableNeighbors":[
+      "cell9"
+    ]
+  }
+]
index a956ae4..7b9dbe1 100644 (file)
@@ -1,56 +1,44 @@
-
-  {
-    "event":{
+{
+   "event":{
       "commonEventHeader":{
-        "version":"4.0",
-        "domain":"measurement",
-        "eventName":"Measurement_RansimAgent-Wipro_HandoffMetric",
-        "eventId":"measurement000001",
-        "sequence":0,
-        "priority":"Normal",
-        "reportingEntityId":"cc305d54-75b4-431b-adb2-eb6b9e541234",
-        "reportingEntityName":"ncserver1",
-        "sourceId":"de305d54-75b4-431b-adb2-eb6b9e546456",
-        "sourceName":"Chn0001",
-        "startEpochMicrosec":1551772223000000,
-        "lastEpochMicrosec":1551790542000000,
-        "nfNamingCode":"RansimAgent",
-        "nfVendorName":"Wipro",
-        "vesEventListenerVersion":"7.0.1",
-        "timeZoneOffset":"UTC-05:30"
+         "version":"4.0.1",
+         "domain":"measurement",
+         "eventName":"Measurement_RansimAgent-Wipro_HandoffMetric",
+         "eventId":"measurement000001",
+         "sequence":0,
+         "priority":"Normal",
+         "reportingEntityId":"cc305d54-75b4-431b-adb2-eb6b9e541234",
+         "reportingEntityName":"ncserver1",
+         "sourceId":"de305d54-75b4-431b-adb2-eb6b9e546456",
+         "sourceName":"Chn0001",
+         "startEpochMicrosec":1551772223000000,
+         "lastEpochMicrosec":1551790542000000,
+         "nfNamingCode":"RansimAgent",
+         "nfVendorName":"Wipro",
+         "vesEventListenerVersion":"7.0.1",
+         "timeZoneOffset":"UTC-05:30"
       },
-      "measurement":{
-        "measurementInterval":180,
-        "additionalMeasurements":[
-          {
-            "arrayOfNamedHashMap":[
-             {
-                "networkId":"plmnid1"
-              },
-              {
-                "InterEnbOutAtt_X2HO":"200"
-              },
-              {
-                "InterEnbOutSucc_X2HO":"190"
-              }
-            ],
-            "name":"Chn0014"
-          },
-          {
-            "arrayOfNamedHashMap":[
-             {
-                "networkId":"plmnid1"
-              },
-              {
-                "InterEnbOutAtt_X2HO":"300"
-              },
-              {
-                "InterEnbOutSucc_X2HO":"210"
-              }
-            ],
-            "name":"Chn0013"
-          }
-        ]
+      "measurementFields":{
+         "measurementInterval":180,
+         "measurementFieldsVersion":"4.0",
+         "additionalMeasurements":[
+            {
+               "hashMap":{
+                  "networkId":"plmnid1",
+                  "InterEnbOutAtt_X2HO":"200",
+                  "InterEnbOutSucc_X2HO":"190"
+               },
+               "name":"Chn0014"
+            },
+            {
+               "hashMap":{
+                  "networkId":"plmnid1",                                 
+                  "InterEnbOutAtt_X2HO":"300",
+                  "InterEnbOutSucc_X2HO":"210"
+               },
+               "name":"Chn0013"
+            }
+         ]
       }
-    }
-  }
+   }
+}
\ No newline at end of file
index 0f046e2..2ad6aa7 100644 (file)
@@ -1,55 +1,45 @@
-{
-    "event": {
-      "commonEventHeader": {
-        "version": "4.0",
-        "domain": "measurement",
-        "eventName": "Measurement_RansimAgent-Wipro_HandoffMetric",
-        "eventId": "measurement000002",
-        "sequence": 0,
-        "priority": "Normal",
-        "reportingEntityId": "cc305d54-75b4-431b-adb2-eb6b9e544567",
-        "reportingEntityName": "ncserver1",
-        "sourceId": "de305d54-75b4-431b-adb2-eb6b9e546456",
-        "sourceName": "Chn0002",
-        "startEpochMicrosec": 1551772223000000,
-        "lastEpochMicrosec": 1551790542000000,
-        "nfNamingCode": "RansimAgent",
-        "nfVendorName": "Wipro",
-        "vesEventListenerVersion": "7.0.1",
-        "timeZoneOffset": "UTC-05:30"
+ {
+   "event":{
+      "commonEventHeader":{
+         "version":"4.0.1",
+         "domain":"measurement",
+         "eventName":"Measurement_RansimAgent-Wipro_HandoffMetric",
+         "eventId":"measurement000001",
+         "sequence":0,
+         "priority":"Normal",
+         "reportingEntityId":"cc305d54-75b4-431b-adb2-eb6b9e541234",
+         "reportingEntityName":"ncserver1",
+         "sourceId":"de305d54-75b4-431b-adb2-eb6b9e546456",
+         "sourceName":"Chn0002",
+         "startEpochMicrosec":1551772223000000,
+         "lastEpochMicrosec":1551790542000000,
+         "nfNamingCode":"RansimAgent",
+         "nfVendorName":"Wipro",
+         "vesEventListenerVersion":"7.0.1",
+         "timeZoneOffset":"UTC-05:30"
       },
-      "measurement": {
-        "measurementInterval": 180,
-        "additionalMeasurements": [
-          {
-            "arrayOfNamedHashMap": [
-             {
-                "networkId":"plmnid1"
-              },
-              {
-                "InterEnbOutAtt_X2HO":"300"
-              },
-              {
-                "InterEnbOutSucc_X2HO":"100"
-              }
-            ],
-            "name": "Chn0004"
-          },
-          {
-            "arrayOfNamedHashMap": [
-             {
-                "networkId":"plmnid1"
-              },
-              {
-                "InterEnbOutAtt_X2HO":"250"
-              },
-              {
-                "InterEnbOutSucc_X2HO":"100"
-              }
-            ],
-            "name": "Chn0001"
-          }
-        ]
+      "measurementFields":{
+         "measurementInterval":180,
+         "measurementFieldsVersion":"4.0",
+         "additionalMeasurements":[
+            {
+               "hashMap":{
+                  "networkId":"plmnid1",
+                  "InterEnbOutAtt_X2HO":"300",
+                  "InterEnbOutSucc_X2HO":"100"
+               },
+               "name":"Chn0004"
+            },
+            {
+               "hashMap":{
+                 "networkId":"plmnid1",
+                  "InterEnbOutAtt_X2HO":"250",
+                  "InterEnbOutSucc_X2HO":"100"
+               },
+               "name":"Chn0001"
+            }
+         ]
       }
-    }
-  }
+   }
+}
\ No newline at end of file
index 3863d1c..b99a8b9 100644 (file)
@@ -8,11 +8,11 @@
        "requestID": "a4130fd5-2291-4a83-8992-04e4c9f32731",
        "from": "PCIMS",
        "version": "1.0.2",
-       "payload": "{\"Configurations\":[{\"data\":{\"FAPService\":{\"alias\":\"Chn0330\",\"X0005b9Lte\":{\"phyCellIdInUse\":6,\"pnfName\":\"ncserver23\"},\"CellConfig\":{\"LTE\":{\"RAN\":{\"Common\":{\"CellIdentity\":\"Chn0330\"}}}}}}},{\"data\":{\"FAPService\":{\"alias\":\"Chn0331\",\"X0005b9Lte\":{\"phyCellIdInUse\":7,\"pnfName\":\"ncserver23\"},\"CellConfig\":{\"LTE\":{\"RAN\":{\"Common\":{\"CellIdentity\":\"Chn0331\"}}}}}}}]}",
+       "payload": "payloadString",
        "AAI": {
                "generic-vnf.prov-status": "ACTIVE",
                "generic-vnf.is-closed-loop-disabled": "false",
                "generic-vnf.vnf-id": "ncserver23"
        },
-       "Action": "ModifyConfig"
+       "Action": "action"
 }