From aceb2efeaf31e7010551027237da4b3ff628dc62 Mon Sep 17 00:00:00 2001 From: PatrikBuhr Date: Wed, 15 Feb 2023 09:18:47 +0100 Subject: [PATCH] Storage of PM Data The component receives PM data from a Kafka topic and stores it into an Influx database. Change-Id: I14c77a0ce2bc9fba2c3e066cb3616219d6a00356 Signed-off-by: PatrikBuhr Issue-ID: NONRTRIC-840 --- pmlog/Dockerfile | 51 +++ pmlog/INFO.yaml | 55 +++ pmlog/LICENSE.txt | 201 +++++++++++ pmlog/README.md | 1 + pmlog/api/pmlog-api.json | 172 ++++++++++ pmlog/api/pmlog-api.yaml | 223 ++++++++++++ pmlog/config/README | 43 +++ pmlog/config/application.yaml | 99 ++++++ pmlog/config/jobDefinition.json | 18 + pmlog/config/keystore.jks | Bin 0 -> 5269 bytes pmlog/config/truststore.jks | Bin 0 -> 3869 bytes pmlog/eclipse-formatter.xml | 362 ++++++++++++++++++++ pmlog/pom.xml | 375 +++++++++++++++++++++ .../src/main/java/org/oran/pmlog/Application.java | 48 +++ .../src/main/java/org/oran/pmlog/BeanFactory.java | 73 ++++ .../org/oran/pmlog/ConsumerRegstrationTask.java | 110 ++++++ .../java/org/oran/pmlog/DataFromKafkaTopic.java | 97 ++++++ .../src/main/java/org/oran/pmlog/InfluxStore.java | 190 +++++++++++ .../java/org/oran/pmlog/KafkaTopicListener.java | 116 +++++++ pmlog/src/main/java/org/oran/pmlog/PmReport.java | 192 +++++++++++ .../main/java/org/oran/pmlog/SwaggerConfig.java | 44 +++ .../org/oran/pmlog/clients/AsyncRestClient.java | 222 ++++++++++++ .../oran/pmlog/clients/AsyncRestClientFactory.java | 194 +++++++++++ .../org/oran/pmlog/clients/SecurityContext.java | 76 +++++ .../pmlog/configuration/ApplicationConfig.java | 194 +++++++++++ .../oran/pmlog/configuration/ConsumerJobInfo.java | 114 +++++++ .../oran/pmlog/configuration/WebClientConfig.java | 60 ++++ .../oran/pmlog/exceptions/ServiceException.java | 39 +++ .../test/java/org/oran/pmlog/ApplicationTest.java | 196 +++++++++++ .../src/test/java/org/oran/pmlog/Integration.java | 245 ++++++++++++++ .../A20000626.2315+0200-2330+0200_HTTPS-6-73.json | 1 + pmlog/src/test/resources/pm_report.json | 223 ++++++++++++ pmlog/src/test/resources/pm_report.json.gz | Bin 0 -> 937 bytes pmlog/src/test/resources/pm_report_filtered.json | 67 ++++ 34 files changed, 4101 insertions(+) create mode 100644 pmlog/Dockerfile create mode 100644 pmlog/INFO.yaml create mode 100644 pmlog/LICENSE.txt create mode 100644 pmlog/README.md create mode 100644 pmlog/api/pmlog-api.json create mode 100644 pmlog/api/pmlog-api.yaml create mode 100644 pmlog/config/README create mode 100644 pmlog/config/application.yaml create mode 100644 pmlog/config/jobDefinition.json create mode 100644 pmlog/config/keystore.jks create mode 100644 pmlog/config/truststore.jks create mode 100644 pmlog/eclipse-formatter.xml create mode 100644 pmlog/pom.xml create mode 100644 pmlog/src/main/java/org/oran/pmlog/Application.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/BeanFactory.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/ConsumerRegstrationTask.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/DataFromKafkaTopic.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/InfluxStore.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/KafkaTopicListener.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/PmReport.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/SwaggerConfig.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClient.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClientFactory.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/clients/SecurityContext.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/configuration/ApplicationConfig.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/configuration/ConsumerJobInfo.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/configuration/WebClientConfig.java create mode 100644 pmlog/src/main/java/org/oran/pmlog/exceptions/ServiceException.java create mode 100644 pmlog/src/test/java/org/oran/pmlog/ApplicationTest.java create mode 100644 pmlog/src/test/java/org/oran/pmlog/Integration.java create mode 100644 pmlog/src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json create mode 100644 pmlog/src/test/resources/pm_report.json create mode 100644 pmlog/src/test/resources/pm_report.json.gz create mode 100644 pmlog/src/test/resources/pm_report_filtered.json diff --git a/pmlog/Dockerfile b/pmlog/Dockerfile new file mode 100644 index 00000000..d5dc1fbc --- /dev/null +++ b/pmlog/Dockerfile @@ -0,0 +1,51 @@ +# +# ============LICENSE_START======================================================= +# O-RAN-SC +# ================================================================================ +# Copyright (C) 2023 Nordix Foundation. All rights reserved. +# ================================================================================ +# 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. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END========================================================= + + +FROM openjdk:11-jre-slim + +EXPOSE 8084 8435 + +ARG JAR + +WORKDIR /opt/app/pmlog-service +RUN mkdir -p /var/log/pmlog-service +RUN mkdir -p /opt/app/pmlog-service/etc/cert/ +RUN mkdir -p /var/pmlog-service + +ADD /config/application.yaml /opt/app/pmlog-service/config/application.yaml +ADD /config/jobDefinition.json /opt/app/pmlog-service/config/jobDefinition.json +ADD /config/keystore.jks /opt/app/pmlog-service/etc/cert/keystore.jks +ADD /config/truststore.jks /opt/app/pmlog-service/etc/cert/truststore.jks + +ARG user=nonrtric +ARG group=nonrtric + +RUN groupadd $user && \ + useradd -r -g $group $user +RUN chown -R $user:$group /opt/app/pmlog-service +RUN chown -R $user:$group /var/log/pmlog-service +RUN chown -R $user:$group /var/pmlog-service + +USER ${user} + +ADD target/${JAR} /opt/app/pmlog-service/pmlog.jar +CMD ["java", "-jar", "/opt/app/pmlog-service/pmlog.jar"] diff --git a/pmlog/INFO.yaml b/pmlog/INFO.yaml new file mode 100644 index 00000000..b2dfb2b9 --- /dev/null +++ b/pmlog/INFO.yaml @@ -0,0 +1,55 @@ +--- +project: "nonrtric_plt_pmlog" +project_creation_date: "2022-02-01" +project_category: "" +lifecycle_state: "Incubation" +project_lead: &oran_nonrtric_ptl + name: "John Keeney" + email: "John.Keeney@est.tech" + id: "johnkeeney" + company: "Ericsson Software Technology" + timezone: "Europe/Dublin" +primary_contact: *oran_nonrtric_ptl +issue_tracking: + type: "jira" + url: "https://jira.o-ran-sc.org/projects/NONRTRIC" + key: "NONRTRIC" +mailing_list: + type: "groups.io" + url: "https://lists.o-ran-sc.org/g/discuss" +realtime_discussion: + type: "irc" + server: "freenode.net" + channel: "#o-ran-sc" +meetings: + - type: "zoom" + agenda: "" + url: "https://wiki.o-ran-sc.org/display/RICNR/Meetings" + server: "n/a" + channel: "n/a" + repeats: "weekly" + time: "Wednesdays, 16:00/17:00 UTC" +repositories: + - "nonrtric/plt/pmlog" +committers: + - <<: *oran_nonrtric_ptl + - name: "Henrik Andersson" + email: "henrik.b.andersson@est.tech" + company: "Ericsson Software Technology" + id: "elinuxhenrik" + timezone: "Sweden/Stockholm" + - name: "Patrik Buhr" + email: "patrik.buhr@est.tech" + company: "Ericsson Software Technology" + id: "PatrikBuhr" + timezone: "Sweden/Stockholm" + - name: "Bjorn Magnusson" + email: "bjorn.magnusson@est.tech" + company: "Ericsson Software Technology" + id: "BjornMagnussonXA" + timezone: "Sweden/Stockholm" +tsc: + # yamllint disable-line rule:line-length + approval: + "https://wiki.o-ran-sc.org/display/TOC#ORANSCTechnicalOversightCommittee(TOC)-20220126 + sect.5.a-o" diff --git a/pmlog/LICENSE.txt b/pmlog/LICENSE.txt new file mode 100644 index 00000000..96589bff --- /dev/null +++ b/pmlog/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/pmlog/README.md b/pmlog/README.md new file mode 100644 index 00000000..30404ce4 --- /dev/null +++ b/pmlog/README.md @@ -0,0 +1 @@ +TODO \ No newline at end of file diff --git a/pmlog/api/pmlog-api.json b/pmlog/api/pmlog-api.json new file mode 100644 index 00000000..1d2534bb --- /dev/null +++ b/pmlog/api/pmlog-api.json @@ -0,0 +1,172 @@ +{ + "components": {"schemas": {"Link": { + "type": "object", + "properties": { + "templated": {"type": "boolean"}, + "href": {"type": "string"} + } + }}}, + "openapi": "3.0.1", + "paths": { + "/actuator/metrics/{requiredMetricName}": {"get": { + "summary": "Actuator web endpoint 'metrics-requiredMetricName'", + "operationId": "metrics-requiredMetricName_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "requiredMetricName", + "required": true + }], + "tags": ["Actuator"] + }}, + "/actuator": {"get": { + "summary": "Actuator root web endpoint", + "operationId": "links_1", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": { + "additionalProperties": { + "additionalProperties": {"$ref": "#/components/schemas/Link"}, + "type": "object" + }, + "type": "object" + }}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/threaddump": {"get": { + "summary": "Actuator web endpoint 'threaddump'", + "operationId": "threaddump_4", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/logfile": {"get": { + "summary": "Actuator web endpoint 'logfile'", + "operationId": "logfile_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/loggers/{name}": { + "post": { + "summary": "Actuator web endpoint 'loggers-name'", + "operationId": "loggers-name_3", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "name", + "required": true + }], + "tags": ["Actuator"] + }, + "get": { + "summary": "Actuator web endpoint 'loggers-name'", + "operationId": "loggers-name_4", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "name", + "required": true + }], + "tags": ["Actuator"] + } + }, + "/actuator/info": {"get": { + "summary": "Actuator web endpoint 'info'", + "operationId": "info_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/health": {"get": { + "summary": "Actuator web endpoint 'health'", + "operationId": "health_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/loggers": {"get": { + "summary": "Actuator web endpoint 'loggers'", + "operationId": "loggers_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/health/**": {"get": { + "summary": "Actuator web endpoint 'health-path'", + "operationId": "health-path_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/metrics": {"get": { + "summary": "Actuator web endpoint 'metrics'", + "operationId": "metrics_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/heapdump": {"get": { + "summary": "Actuator web endpoint 'heapdump'", + "operationId": "heapdump_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }}, + "/actuator/shutdown": {"post": { + "summary": "Actuator web endpoint 'shutdown'", + "operationId": "shutdown_2", + "responses": {"200": { + "description": "OK", + "content": {"*/*": {"schema": {"type": "object"}}} + }}, + "tags": ["Actuator"] + }} + }, + "info": { + "license": { + "name": "Copyright (C) 2023 Nordix Foundation. Licensed under the Apache License.", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + }, + "description": "Receives PM reports from a Kafka topic and writes the PM counters into an Influx database.", + "title": "PM Logger", + "version": "1.0" + }, + "tags": [{ + "name": "Actuator", + "description": "Monitor and interact", + "externalDocs": { + "description": "Spring Boot Actuator Web API Documentation", + "url": "https://docs.spring.io/spring-boot/docs/current/actuator-api/html/" + } + }] +} \ No newline at end of file diff --git a/pmlog/api/pmlog-api.yaml b/pmlog/api/pmlog-api.yaml new file mode 100644 index 00000000..b914489c --- /dev/null +++ b/pmlog/api/pmlog-api.yaml @@ -0,0 +1,223 @@ +openapi: 3.0.1 +info: + title: PM Logger + description: Receives PM reports from a Kafka topic and writes the PM counters into + an Influx database. + license: + name: Copyright (C) 2023 Nordix Foundation. Licensed under the Apache License. + url: http://www.apache.org/licenses/LICENSE-2.0 + version: "1.0" +servers: +- url: / +tags: +- name: Actuator + description: Monitor and interact + externalDocs: + description: Spring Boot Actuator Web API Documentation + url: https://docs.spring.io/spring-boot/docs/current/actuator-api/html/ +paths: + /actuator/metrics/{requiredMetricName}: + get: + tags: + - Actuator + summary: Actuator web endpoint 'metrics-requiredMetricName' + operationId: metrics-requiredMetricName_2 + parameters: + - name: requiredMetricName + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator: + get: + tags: + - Actuator + summary: Actuator root web endpoint + operationId: links_1 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + additionalProperties: + type: object + additionalProperties: + $ref: '#/components/schemas/Link' + /actuator/threaddump: + get: + tags: + - Actuator + summary: Actuator web endpoint 'threaddump' + operationId: threaddump_4 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/logfile: + get: + tags: + - Actuator + summary: Actuator web endpoint 'logfile' + operationId: logfile_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/loggers/{name}: + get: + tags: + - Actuator + summary: Actuator web endpoint 'loggers-name' + operationId: loggers-name_4 + parameters: + - name: name + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + post: + tags: + - Actuator + summary: Actuator web endpoint 'loggers-name' + operationId: loggers-name_3 + parameters: + - name: name + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/info: + get: + tags: + - Actuator + summary: Actuator web endpoint 'info' + operationId: info_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/health: + get: + tags: + - Actuator + summary: Actuator web endpoint 'health' + operationId: health_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/loggers: + get: + tags: + - Actuator + summary: Actuator web endpoint 'loggers' + operationId: loggers_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/health/**: + get: + tags: + - Actuator + summary: Actuator web endpoint 'health-path' + operationId: health-path_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/metrics: + get: + tags: + - Actuator + summary: Actuator web endpoint 'metrics' + operationId: metrics_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/heapdump: + get: + tags: + - Actuator + summary: Actuator web endpoint 'heapdump' + operationId: heapdump_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/shutdown: + post: + tags: + - Actuator + summary: Actuator web endpoint 'shutdown' + operationId: shutdown_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object +components: + schemas: + Link: + type: object + properties: + templated: + type: boolean + href: + type: string diff --git a/pmlog/config/README b/pmlog/config/README new file mode 100644 index 00000000..46f0c4ae --- /dev/null +++ b/pmlog/config/README @@ -0,0 +1,43 @@ +The keystore.jks and truststore.jks files are created by using the following commands (note that this is an example): + +1) Create a CA certificate and a private key: + +openssl genrsa -des3 -out CA-key.pem 2048 +openssl req -new -key CA-key.pem -x509 -days 3600 -out CA-cert.pem + +2) Create a keystore with a private key entry that is signed by the CA: + +Note: your name must be "localhost" for the unittest. + +keytool -genkeypair -alias policy_agent -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650 -storepass policy_agent +keytool -certreq -alias policy_agent -file request.csr -keystore keystore.jks -ext san=dns:your.domain.com -storepass policy_agent +openssl x509 -req -days 365 -in request.csr -CA CA-cert.pem -CAkey CA-key.pem -CAcreateserial -out ca_signed-cert.pem +keytool -importcert -alias ca_cert -file CA-cert.pem -keystore keystore.jks -trustcacerts -storepass policy_agent +keytool -importcert -alias policy_agent -file ca_signed-cert.pem -keystore keystore.jks -trustcacerts -storepass policy_agent + + +3) Create a trust store containing the CA cert (to trust all certs signed by the CA): + +keytool -genkeypair -alias not_used -keyalg RSA -keysize 2048 -keystore truststore.jks -validity 3650 -storepass policy_agent +keytool -importcert -alias ca_cert -file CA-cert.pem -keystore truststore.jks -trustcacerts -storepass policy_agent + + +4) Command for listing of the contents of jks files, examples: +keytool -list -v -keystore keystore.jks -storepass policy_agent +keytool -list -v -keystore truststore.jks -storepass policy_agent + +## License + +Copyright (C) 2022 Nordix Foundation. All rights reserved. +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. + diff --git a/pmlog/config/application.yaml b/pmlog/config/application.yaml new file mode 100644 index 00000000..8c82f93a --- /dev/null +++ b/pmlog/config/application.yaml @@ -0,0 +1,99 @@ +# ============LICENSE_START=============================================== +# Copyright (C) 2023-2022 Nordix Foundation. All rights reserved. +# ======================================================================== +# 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================================================= +# + +spring: + profiles: + active: prod + main: + allow-bean-definition-overriding: true + aop: + auto: false +management: + endpoints: + web: + exposure: + # Enabling of springboot actuator features. See springboot documentation. + include: "loggers,logfile,health,info,metrics,threaddump,heapdump,shutdown" + endpoint: + shutdown: + enabled: true +lifecycle: + timeout-per-shutdown-phase: "20s" +springdoc: + show-actuator: true +logging: + # Configuration of logging + level: + ROOT: WARN + org.apache.kafka: WARN + org.springframework: ERROR + org.springframework.data: ERROR + org.springframework.web.reactive.function.client.ExchangeFunctions: ERROR + org.oran.pmlog: INFO + pattern: + console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger{20} - %msg%n" + file: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger{20} - %msg%n" + + file: + name: /var/log/pmlog-service/application.log +server: + # Configuration of the HTTP/REST server. The parameters are defined and handeled by the springboot framework. + # See springboot documentation. + port : 8436 + http-port: 8084 + ssl: + key-store-type: JKS + key-store-password: policy_agent + key-store: /opt/app/pmlog-service/etc/cert/keystore.jks + key-password: policy_agent + key-alias: policy_agent + shutdown: "graceful" +app: + webclient: + # Configuration of the trust store used for the HTTP client (outgoing requests) + # The file location and the password for the truststore is only relevant if trust-store-used == true + # Note that the same keystore as for the server is used. + trust-store-used: false + trust-store-password: policy_agent + trust-store: /opt/app/pmlog-service/etc/cert/truststore.jks + # Configuration of usage of HTTP Proxy for the southbound accesses. + # The HTTP proxy (if configured) will only be used for accessing NearRT RIC:s + http.proxy-host: + http.proxy-port: 0 + kafka: + # KAFKA boostrap servers. + # several redundant boostrap servers can be specified, separated by a comma ','. + # bootstrap-servers and input-topic is overriden if defined in deliveryInfo in config/jobDefinition.json + bootstrap-servers: localhost:9092 + input-topic: + # The maximum number of records returned in a single call to poll() (default 100) + max-poll-records: 500 + group-id: kafkaGroupId + client-id: kafkaClientId + influx: + url: http://localhost:8086 + access-token: xmrt1YobMTl-Nx-a8iiO6fC8xJc5BvKZLSU8U18VfAYza4N0YHTFrLy15W4Ss2bxXhgX95qagxsBJ0GCBSFveQ== + bucket: pm_data + org: est + # The user, password and database can be blank if the access-token is defined + user: admin + password: adminadmin + database: pm_data + ics-base-url: https://localhost:8434 + consumer-job-id: "pmlog" + + diff --git a/pmlog/config/jobDefinition.json b/pmlog/config/jobDefinition.json new file mode 100644 index 00000000..bfe30905 --- /dev/null +++ b/pmlog/config/jobDefinition.json @@ -0,0 +1,18 @@ +{ + "info_type_id": "PmDataOverKafka", + "job_owner": "owner", + "job_result_uri": "", + "job_definition": { + "filterType": "pmdata", + "filter": { + "sourceNames": [], + "measObjInstIds": [], + "measTypeSpecs": [], + "measuredEntityDns": [] + }, + "deliveryInfo": { + "topic": "pmreports", + "bootStrapServers": "localhost:9092" + } + } +} \ No newline at end of file diff --git a/pmlog/config/keystore.jks b/pmlog/config/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..563c67b309780ca80622b2360e627b72887970ee GIT binary patch literal 5269 zcma)+RZta-x5ZD>eMmvN>(Jeeq;zvY8kCf7=|)NpAR#CzDWG&ncZ0y8k(LsaxZljZ z^Zn;O-TSa-&;G5o_tTz*h=8YofM7%fTpfnR5v>~i8xM#9ER29lKqBBG|6l<`1oZ3w zlAx842W@hiia>ki2i59MQ}pk0ze*QNExfx z7jSxlKWZ-PoB>@80oHC29n ze1KVdh6*GCGRX&{S7_@FnzX;P$v$2WCul61=O16!I>$H4+0jNqi2xg zq0rw>jPI3ZL@?F4nOU(BM&thK+qAu`MGkZ@p;1 zd$T@;t7uI#jm_njppWOBat!wfcu3YR`o4q3F{p>ta_x`{MLc_sR+!7Z9r~7u&RGio z9zn#*G|(5B&RM^@)69c}mUfavW=5ZG_8%dls6@93P#kbZrid>y^Uu%(JZeS#a8^v} z*Sv(@l)W4pQu&h9R0Ie;=4zmh|2VO z&0(W;32Z;@Igr6!b8@2nyQ|G;8QCDUNah#q)8(gFdN3@k9up{;V3qf_LPb8)q04f8 ziAw4g&HV6JJC{kmP+X%q-g+ac=8`d9@#mfV_lEtx8j7>qo~3CVt(ZFE)GB&J%)3{P zb0YywEyj5>25w*d;9w?O4=!D@j`LW8a6ZBmvT>&|X#wriPeTbTM8S~_N$0KE<*VD5 zaBn!eN6}vBNzr&vC|Y@NGi_PIn(!G(vySao{wYJ%Q87HUq=4dquG23aIleQ#ydZQKBmj zU*UHyPoBhfWZ{IHD|i`-a%)8J^vs@%bMr99Xz*GsG+u9{f>x+_?6;Y;%Vb{ z1?QuBN&#>OyaKoaoB*}}e}EML32*?|0bT;U5%m8tlJdbJ#QIKdc65Bg!U%o@LKGp$ zCoF`B!1wsqgaIpzz_P>wP4b&NFr@GBQvLsQUGbSBhlZhId}D&&zYBlkj%AvWLMKy9c|n z24OzHnU$iHkgzP0-#Pz|!H>Yo{^z}d_%Xe?RWaM*p(*=IUGs!1oXhWrB;|&MB{#v5 zVH6{^ktO85htGA5wqqdiP+6vE+OY|Row#H6YahGAm$xiqc@1|7(`kx79ec5IXGoQk zb={)kb7cfIHAi0NqxooZYHWrHY4&?zMg3qW{rmO>ovy`(C&}3DOS3@&JEpI56W3Ce z3sycY#$osbj8qJ?GMqf!lpP4u@ygeh4JPh9_{#$yvz2_)Sn1Bwt{mCv@)8cNrsisq z8Mq62>?`hp42d{}V)dPK4Xhb1G|HY?JU9+M%@+tz_eahdjqnY!YY){*9bhy4 zkKTcOl(;y!YDSD=b~$M8-Qu)JlJSPNI#cc!=wi(nX!&oXo8qSTfbx8pYTbbbfFXXZ zN#!1=;!PC(*ALN4++-eOHMvDS3+RdrIs*!pAnw|~@?u9yI1bs24pJBA0*A;EiG~Tz zs^qsSk>0~?5r3-R=WqHk=ESmB=if~?usR2*splHLb$X)^I^EgFm*!z0vHSixFmLZM zGz2?*RiI(92^ZRPqPm+zpRu-e?^BiO(L3jBw&+g@MY^NhxC+-H#>0d}8Lj6e6}iL| zJ&a5d1jZI^^jD@Q?~YrQUj^9e|mmu@;&}^ zV`q$*2Bf@V7BEE(D6h{bl{QA~u~-PclDFJ-H!L|x2aH1;}DOU88)BG@iBgAd4tIU5G_a?bVip)_?{*`7-7unqkkWsmH z#)0Y!Ik?Pcz5uFp`EAD`_og6H;Fr-kw~5kt z;||{16&!uDu#;|rGM+&bRqlM&5!@7H+J8MkO}nb5m7h$c2mE~`uiclt9H3WC-IWTd zO64Bwr>)qy;k_b>AS@wrR1bVjXxRJM70apf`q`h9B_vgdjzHSiCDm3uPs@&GnZtB) zS|Q*Q+20LLl(ai8t-7xlb({ahnSB#ro++XAQ>_Y({Cmau$&gCuZ?Pw(e4EQsj-2j` zYet|>sqx_CP{J!#SQsUU%Vsr0DRZK5(u20$pd9=7a_20|h}ym7X|}|QPdhPbzJHpz$%!BWrmzzSA&igkB2`qxi4ue z2d(By{8Nlc{CCVJmHwo&@z=a&=}g(#KtS~cXgqRRsF*snBjrGxzrfsZ zf84c-y)`wGa-oSLLMVV=vkiBNj;%&nF>mC ztklQAj2y=Gu3mFc3vbH5C>{lGFUN*~zS(I#Xlq@!fq51zR#|Ztvqj1VvbVT=er(Cm zCg~*8@|1$ix(H?MtB1m}>C=U%BOV?C2ia3cA?mgF$Jf>_vLyCYx6z`8*vmB0-0P~C zsuLsSk^nbuMplMEeD7PYN`(a9?1jmSFHqj=W+@t%0!r}Jlr37LwsVF#MFh-s&R}wGC-wN~P zbx1ukAx_-fP?B&z(m2jjFf1F|^rN{z+0(6yq?HNp=-GJosfZwDv{p+c5vvs;naze) z9Bes;OaRk0+In+SIR@0Ei51p?V4Pr`U!)ZB{!zOq{$42r(=mRLZ^s?umE76)`wHm} zu4y+=%CsHhX>3d4#$A}yx}&84!TX1`^R2X}@XZFnEIZm*Wb83=PS~yJDGv=0@>P8p z2bQNJ!RIzcuo@`%?FC!x$b4}jgW=8&#s<6VixukLv2!RJb?lm#D_?*|klU{&HyAtD zx!UAQAH`3A5z&gw~QJv17Sc>bf$6<}~1X>*o*2>B6<*`4f2EhLI z#h!~y#z6^Fd#sTYuUjpxso`vi5>I(z-WlRF?P3zj_=!#~e(^*3xB`0IM(yb|U~q^WJYCd>MYvm9e! zgLJL8%<|)^9<{KnMSmfDnypewf>0lgnGQiu$;x`!;F!ODLn;7RnSoe~C&;jPtx%N< z_)(A33r44$Lh)?n5T~tsh0ZogV}qc5vXW`aPFE`((--im9Co%o!fdz&L&kF3Zxpn> z#Zuz4{{VVWtD*d)q2+>Y^6iuE<&v643S>`fQkcof*|7Gj)T_(~)Mu|#s|ah!<`TPB z>1^4Zt3wKd+vn?Ik_xCmC48aAr(5?g^To!+0IuVLO*SgcpAMfz=}Tyfn~=`#-(8|w zzI-lhSLr#hx2;dCX@L!b68X)9s)bdmKXc_orTY;Xp2!6hkk4<<2d7c3^3FaP4FQGm z!*sJkrx_Snl}JxOp_AU?;-@Cf!A}bnhvMyP#FSG>gh(5DQf5^Y?T6fDQfM3-p1mm7 z+S0^QpE5bjrkYPv%1n__n9zHtIQVyW8Tw&{ZWP6Co4b_|O~cjC6@<^$e%M}(*woCw zkT$ka_{z|ar`ETgw6>4$!183xStoivONIz;^2f-GJ8sjk2d?js(wt4g2Nf%oRbR9O1hR-sdMCc#aRKL9Y!{i zjF$6X8lrGe0nd44SLfz%Y#q!MBU+V zy9_c*%8jE?Fk_-wGk;o9R4=bC&`x$;~^A0l|w?_QFkDppn z0S?32QQffa+&)aQ5@U(;@2G6ndBnI(y>lYY;5es=2HWoaF`N=z78QINo!rIuL$%4D zBEs(G(r)o2(q&Nd|?!0>}ZcIk10%+q8dN=5FVT`HS)>u#% zn_BkDhx9YU!3=As_p+qDcyD><0DWj3$uvRhbo!Ey>ucQjs#ZRm4@UL^s$~!8^ zE`GfM4*DxQ7rNJ>#m`0c^NN^S`3`DzvBQ2(B`N74)hdBKB8|^d;twJC9{QFsa_tH` zlP-Qso9V%aoD;<)G+iXK5YwHZH~aN`2QzLC*+he;HGcb6KOPDLs`)c;fkBanPSKGW zPy)45A&VE|W6Z8#DWJt0HQPj{paAaa-?oTene8x>D_QD6w^bP%NE zxz>B@-t|8H{~yje>-_fK=i`PVh-t8Z*iZz~JPsaroNC+^1o#M8h9E+M5JZE2a32%_ zZvB4}_$>$lF8zZG|4c3p!T+TQ@qt)n2(auQC<%4=Cjo{)&7flco`g^y5Jm7aWzBb1 zrG&&n-~o8{(~B={pn7 zSYnbTSpN_V=>#D_vlU}S(&+N9w^u%GUWu+5!-jN^2YZ;EfQovg-=WCJ1Ad$N9x8Mm znaR7XRdwMeAJi7+*x_oi+dCQQ{*hziSedsPzw*7Js0gs^v5b1suR=-D)KdOU6I@Q#U9{+`VE9Y8zS6{BI{ zV`oIXcE#0-lVsY%9(Nu)2~|2&7&SWK{UjQ4du=AM+<&C?lYulCAE)?Frl{K6S4QrE zB_XPv-xuP@;=S#1VOYD#ROL)0#K6cV-wB1jS)?}Fv&-0M^!2D~o|k12`|o@dyD`2c zU$B69_5s1m&x=c!bWBQmdnb}-mDbW++O%w=n&lg2?dy1sx=XMy~32qzd|4B5AfhE%@=^Oqe0Wd-$9=n(7j64Up9<>>4aYO z2rV-8cA$7QL#L`h4)aXQu%rHWt&yK@#^a#2jwLT)N)u74Cn01#~U-hS+sYj$JEhs64gn+pU`htaeT$zJo4_B&U$rh>dd#= zEuKk=#wz?Q1ehc9T8~nxNlOXmFc=4Capd1zQdIHhOpkoEVxS+vlM|8G-jc|uB~HzM zJ-sQ^pXOsf-Klx_Iz!f_uimOTSzc2Etyf;hnm*Y`rSr5Q0a&B@gI&Rap{T+wJcIyx zWL0oqh?ACRyLGG1xV3U2+*E85xl)|;aOX~~bn;3hBGqV9`EJxSY_!jWAYdmhvs}`D z!E|Q!rafjtc41zO<2u|U1^p_QNs>p(kNEMul;U?FP&H_=IJ+v3cgv>|J;?qo470RP z5Kf!+tHi&7Qa|_Ad+ZmrF3lc9&E-=1&hJybpKiC>F8HJ$-8P zjt;RifW|J=%?;sr!m%It^GmzPXdu*upYvV~+$W$2 zW%{Qs@hAky7)byg08fA)zy{zC@CCpD_E4684UYvVKxBr_?r>%S7z`>1g^CHo#6^Xn z2t43Frbjqs2;3h~1nvnI5b$U1{;L50Q&kI7@~09YrE=y?m{#&-T|s9415wgIM2xKW&6(96T@eAd7$Knpo--y=R(( zQP4vg;u2>3PU7a?k}n1$kj|3VYVENYe%{)ZXMhY{j zQq5q&85iSWAt0Pdrg*jdLR@p$p7Q8&>+3XX3(uGLqXUxunfg1|k}fQ1t#-{hB5-}^ zXz!4}4N~_7a)d^DYmk<&PyNyfTcU(nRvFejZLs_HLd%U;K2UA-L0=TVqW+z$+Tn2C@lcA%^B!9=Xi)Xw@qTEHePau!YS)$3FTNS3l9f0SZUB=lNmTA7w zO7>aR{rvvyhrAy{PvgtZmz?PeY zBNHq~O)t;)J(Ht1?Rj5(n6lj`XiftxpYrTfk+xk2WH zY{egTgxsp1R_aaNXbt3qM~t2*I#}5iH_UK;gnCKL)ghMI!_h$>0@gF(t zNK)}rA=WYcA_wXGdH|4I`V611tdPW9e&Ou6n=&7SBv zwj9adyBUL2A$g6$ZZ7*Jr+iA%<3fpVuuBUJH-9HM(%Qo-_RBJIam&9~*{LA1dYh(6 zxatY0`7f8p)PDtq47t|A-_ETq;1jgu^qD_3QpUvXuyImL(4)E}c8!gm427n&ahA=j z1^IO5oePO@3jNGsdse~lS!^*eVHxWY?l#ApxZ!@}|Th68s; z)Aq*BRf>tMZ^Qk#h3M>v)HF$JP6m;#V=!P50y(%p9xVv;2@=@-;CP2BYQwzD%3ZeF z*N^SobTZt|@YbtS&~Co#j=t`?2&d9x5F`|rUukHp|0`9o9D5*`0l7*X_hW440L}+edtLExfn2K@x_4bmUq*HJ3MD@F9x$6*nY(EB8r8H}Hw`Lk|55v_&$tMU zITFSylSw4=;Y0aJtPSORWGbfN@AC__q*s?NCak))q>2_Ol_6HB3{bz5FNsOKesSh};ETXBcvR#*!MSaj$eC=opLbnx!-J=+5o8WsKB? zlFX7j-;Oc6tgOYwvz?p!sx z-|-PnC-s}J)bW#&*vh_Y5?~y_Vp#(mL)sE>OhuJm7LYxxdjuuTr?QN>9}39KYm;ER zNo_NmmD1w|BN8Ejd@L%A<|-~PDDAk7Mo0=3D>+RSb{*YB>&UmIvct_r4PunsAc0I@ zCc9D!h``ygQ<6EuB1|#unSe%7{iRJS)aJ)kiKi37TXbJnIQ%3x7MgsfoF5=y#=P|t zcxt2plxAShwinlqKUOFygF{v8FD5JPjK-OCfR&YP7j}_P0rYvDVYk#Np=+H!&YX2WHE025g3$nUiYU_{bj<5}*O6k|u@)`#1Pi z{=V$8a=15h#FwsaH=OXUu5UAm#njjo0z^DJ6soE8q(kQFLDTpOd@5!E*ZFqqo&{YG zQt$ANuZPxKD@b07mSNx@wqztuJtOCTL1dGX=Ej3!a5ab$tA%CP1haEE(96?6zfpyv zQt5JSv*j{69Dxq2W7N4A5GCTombR}IbJ(lhWg-~cn7S6wr8VC}gko~mfVpj;4ZR6n z<^v0Jz`-!83O7y|7Rka&&OzOab)2d;F2BEdUVDDY{TLOXW5^ekFX{1vruUUUQ*WJi zc3Y`ycZ%zw<2L7pKZONdZFat;IfleYnxVRE!Bix(iCWe_jA9e=uEVFHzgvOw{0 zz&u3QShQdOh{8=@CJOQ?F|+mMe#tiB>}QyG+zN=IjsH_VwGGM(P9IFgjG!rh&7L%i Jg$;}=`yXAMCD8x? literal 0 HcmV?d00001 diff --git a/pmlog/eclipse-formatter.xml b/pmlog/eclipse-formatter.xml new file mode 100644 index 00000000..b2e86eb5 --- /dev/null +++ b/pmlog/eclipse-formatter.xml @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pmlog/pom.xml b/pmlog/pom.xml new file mode 100644 index 00000000..c423060a --- /dev/null +++ b/pmlog/pom.xml @@ -0,0 +1,375 @@ + + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.8 + + + org.o-ran-sc.nonrtric.plt + pmlog + 1.0.0-SNAPSHOT + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + onap-releases + onap-releases + https://nexus.onap.org/content/repositories/releases/ + + + + 11 + 3.0.0 + 2.9.0 + 2.2.1 + 20211205 + 3.8.0 + 2.12.2 + 1.24.3 + 0.30.0 + 3.7.0.1746 + 0.8.8 + 3.0.11 + true + + + + com.influxdb + influxdb-client-java + 6.3.0 + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework + spring-webflux + + + io.swagger.core.v3 + swagger-jaxrs2 + ${swagger.version} + + + io.swagger.core.v3 + swagger-jaxrs2-servlet-initializer + ${swagger.version} + + + com.google.code.gson + gson + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-actuator + + + + io.springfox + springfox-swagger2 + ${springfox.version} + + + io.springfox + springfox-swagger-ui + ${springfox.version} + + + + org.springframework.boot + spring-boot-devtools + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.springdoc + springdoc-openapi-ui + 1.6.3 + test + + + com.github.erosb + everit-json-schema + 1.12.1 + test + + + com.schibsted.spt.data + jslt + 0.1.11 + + + com.jayway.jsonpath + json-path + 2.7.0 + + + org.springframework.boot + spring-boot-starter-test + test + + + org.awaitility + awaitility + test + + + io.projectreactor + reactor-test + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.mockito + mockito-junit-jupiter + test + + + org.mockito + mockito-core + test + + + io.projectreactor.kafka + reactor-kafka + 1.3.13 + + + com.google.guava + guava + 31.0.1-jre + + + software.amazon.awssdk + s3 + 2.17.292 + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + net.revelc.code.formatter + formatter-maven-plugin + ${formatter-maven-plugin.version} + + ${project.basedir}/eclipse-formatter.xml + + + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless-maven-plugin.version} + + + + + com,java,javax,org + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + maven-failsafe-plugin + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/annotations/ + + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-maven-plugin.version} + + + default-prepare-agent + + prepare-agent + + + + default-report + prepare-package + + report + + + + + + io.fabric8 + docker-maven-plugin + ${docker-maven-plugin} + false + + + generate-nonrtric-plt-pmlog-image + package + + build + + + ${env.CONTAINER_PULL_REGISTRY} + + + o-ran-sc/nonrtric-plt-pmlog:${project.version} + + try + ${basedir} + Dockerfile + + ${project.build.finalName}.jar + + + ${project.version} + + + + + + + + push-nonrtric-plt-pmlog-image + + build + push + + + ${env.CONTAINER_PULL_REGISTRY} + ${env.CONTAINER_PUSH_REGISTRY} + + + o-ran-sc/nonrtric-plt-pmlog:${project.version} + + ${basedir} + Dockerfile + + ${project.build.finalName}.jar + + + ${project.version} + latest + + + + + + + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${sonar-maven-plugin.version} + + + io.swagger.codegen.v3 + swagger-codegen-maven-plugin + ${swagger-codegen-maven-plugin.version} + + + test + + generate + + + ${project.basedir}/api/pmlog-api.json + openapi-yaml + ${project.basedir}/api + + pmlog-api.yaml + + + + + + + + + JIRA + https://jira.o-ran-sc.org/ + + \ No newline at end of file diff --git a/pmlog/src/main/java/org/oran/pmlog/Application.java b/pmlog/src/main/java/org/oran/pmlog/Application.java new file mode 100644 index 00000000..65c48d2e --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/Application.java @@ -0,0 +1,48 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class Application { + + private static final Logger logger = LoggerFactory.getLogger(Application.class); + private static ConfigurableApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class); + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + logger.warn("Shutting down, received signal SIGTERM"); + SpringApplication.exit(applicationContext); + applicationContext = null; + } + }); + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/BeanFactory.java b/pmlog/src/main/java/org/oran/pmlog/BeanFactory.java new file mode 100644 index 00000000..e04e44e0 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/BeanFactory.java @@ -0,0 +1,73 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import org.apache.catalina.connector.Connector; +import org.oran.pmlog.configuration.ApplicationConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BeanFactory { + + @Value("${server.http-port}") + private int httpPort = 0; + + @Bean + public ApplicationConfig getApplicationConfig() { + return new ApplicationConfig(); + } + + @Bean + public ServletWebServerFactory servletContainer() { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); + if (httpPort > 0) { + tomcat.addAdditionalTomcatConnectors(getHttpConnector(httpPort)); + } + return tomcat; + } + + private static Connector getHttpConnector(int httpPort) { + Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL); + connector.setScheme("http"); + connector.setPort(httpPort); + connector.setSecure(false); + return connector; + } + + @Bean + public KafkaTopicListener getKafkaTopicListener(@Autowired ApplicationConfig appConfig) { + return new KafkaTopicListener(appConfig); + } + + @Bean + public InfluxStore getInfluxStore(@Autowired ApplicationConfig appConfig, @Autowired KafkaTopicListener listener) { + + InfluxStore distr = new InfluxStore(appConfig); + distr.start(listener.getFlux()); + return distr; + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/ConsumerRegstrationTask.java b/pmlog/src/main/java/org/oran/pmlog/ConsumerRegstrationTask.java new file mode 100644 index 00000000..34954f89 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/ConsumerRegstrationTask.java @@ -0,0 +1,110 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import java.time.Duration; + +import lombok.Getter; + +import org.oran.pmlog.clients.AsyncRestClient; +import org.oran.pmlog.clients.AsyncRestClientFactory; +import org.oran.pmlog.clients.SecurityContext; +import org.oran.pmlog.configuration.ApplicationConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; + +import reactor.core.publisher.Mono; +import reactor.util.retry.Retry; + +/** + * Registers the types and this producer in Innformation Coordinator Service. + * This is done when needed. + */ +@Component +@SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally +public class ConsumerRegstrationTask { + + private static final Logger logger = LoggerFactory.getLogger(ConsumerRegstrationTask.class); + private final AsyncRestClient restClient; + private final ApplicationConfig applicationConfig; + + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder() // + .disableHtmlEscaping() // + .excludeFieldsWithoutExposeAnnotation() // + .create(); + + @Getter + private boolean isRegisteredInIcs = false; + + public ConsumerRegstrationTask(@Autowired ApplicationConfig applicationConfig, + @Autowired SecurityContext securityContext) { + AsyncRestClientFactory restClientFactory = + new AsyncRestClientFactory(applicationConfig.getWebClientConfig(), securityContext); + this.restClient = restClientFactory.createRestClientNoHttpProxy(""); + this.applicationConfig = applicationConfig; + + if (this.applicationConfig.getIcsBaseUrl().isEmpty()) { + logger.info("Skipping createtion of info job. app.ics-base-url is empty."); + } else { + createSubscription(); + } + } + + private void createSubscription() { + putInfoJob() // + .doOnError(this::handleRegistrationFailure) + .retryWhen(Retry.fixedDelay(100, Duration.ofMillis(30 * 1000))) // + .subscribe( // + null, // + this::handleRegistrationFailure, // + this::handleRegistrationCompleted); + } + + private void handleRegistrationCompleted() { + logger.info("Registration of subscription/info job succeeded"); + isRegisteredInIcs = true; + } + + private void handleRegistrationFailure(Throwable t) { + logger.warn("Creation of subscription/info job failed {}", t.getMessage()); + } + + private Mono> putInfoJob() { + try { + String jobId = this.applicationConfig.getConsumerJobId(); + + if (jobId.isBlank()) { + logger.info("Skipping creation of infojob. job_id is empty."); + return Mono.empty(); + } + String url = applicationConfig.getIcsBaseUrl() + "/data-consumer/v1/info-jobs/" + jobId; + String body = this.applicationConfig.getConsumerJobInfo(); + return restClient.putForEntity(url, body); + } catch (Exception e) { + logger.error("Registration of subscription failed {}", e.getMessage()); + return Mono.error(e); + } + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/DataFromKafkaTopic.java b/pmlog/src/main/java/org/oran/pmlog/DataFromKafkaTopic.java new file mode 100644 index 00000000..2d08cde8 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/DataFromKafkaTopic.java @@ -0,0 +1,97 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import java.io.ByteArrayInputStream; +import java.util.zip.GZIPInputStream; + +import lombok.ToString; + +import org.apache.kafka.common.header.Header; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +@ToString +public class DataFromKafkaTopic { + private final byte[] key; + private final byte[] value; + private String stringValue = null; + private static final Logger logger = LoggerFactory.getLogger(DataFromKafkaTopic.class); + + public final Iterable
headers; + + private static byte[] noBytes = new byte[0]; + + public DataFromKafkaTopic(Iterable
headers, byte[] key, byte[] value) { + this.key = key == null ? noBytes : key; + this.value = value == null ? noBytes : value; + this.headers = headers; + } + + public String valueAsString() { + if (stringValue == null) { + if (isZipped()) { + stringValue = unzip(this.value); + } else { + stringValue = new String(this.value); + } + + } + return this.stringValue; + } + + private String unzip(byte[] bytes) { + try (final GZIPInputStream gzipInput = new GZIPInputStream(new ByteArrayInputStream(bytes))) { + return new String(gzipInput.readAllBytes()); + } catch (Exception e) { + logger.error("Could not unzip received info, reason: {}, typeId: {}", e.getMessage(), + getTypeIdFromHeaders()); + return ""; + } + } + + public static final String ZIPPED_PROPERTY = "gzip"; + public static final String TYPE_ID_PROPERTY = "type-id"; + + public boolean isZipped() { + if (headers == null) { + return false; + } + for (Header h : headers) { + if (h.key().equals(ZIPPED_PROPERTY)) { + return true; + } + } + return false; + } + + public String getTypeIdFromHeaders() { + if (headers == null) { + return ""; + } + for (Header h : headers) { + if (h.key().equals(TYPE_ID_PROPERTY)) { + return new String(h.value()); + } + } + return ""; + } +} diff --git a/pmlog/src/main/java/org/oran/pmlog/InfluxStore.java b/pmlog/src/main/java/org/oran/pmlog/InfluxStore.java new file mode 100644 index 00000000..7462e9af --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/InfluxStore.java @@ -0,0 +1,190 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import com.influxdb.client.InfluxDBClient; +import com.influxdb.client.InfluxDBClientFactory; +import com.influxdb.client.WriteApiBlocking; +import com.influxdb.client.domain.Ready; +import com.influxdb.client.domain.WritePrecision; +import com.influxdb.client.write.Point; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +import lombok.Getter; + +import org.oran.pmlog.configuration.ApplicationConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * The class receives PM reports and stores these in an Influx DB + */ +@SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally +public class InfluxStore { + private static final Logger logger = LoggerFactory.getLogger(InfluxStore.class); + + @Getter + private Disposable subscription; + + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create(); + private final ApplicationConfig applConfig; + + private final InfluxDBClient influxClient; + + public InfluxStore(ApplicationConfig applConfig) { + this.applConfig = applConfig; + this.influxClient = createInfluxClient(); + + pingDb(); + } + + private void pingDb() { + try { + String version = this.influxClient.version(); + logger.info("Influx version {} ", version); + Ready ready = this.influxClient.ready(); + logger.info("Ready {}", ready); + logger.info("Onboarding {}", this.influxClient.isOnboardingAllowed()); + } catch (Exception e) { + logger.error("Could not connect to influx DB, reason: {}", e.getMessage()); + } + } + + private InfluxDBClient createInfluxClient() { + try { + // org = est bucket = pm_data + String token = applConfig.getInfluxAccessToken(); + if (!token.isBlank()) { + return InfluxDBClientFactory.create(applConfig.getInfluxUrl(), token.toCharArray()); + } else { + return InfluxDBClientFactory.createV1(applConfig.getInfluxUrl(), // + applConfig.getInfluxUser(), applConfig.getInfluxPassword().toCharArray(), // + applConfig.getInfluxDatabase(), // + null); + } + } catch (Exception e) { + logger.error("Exception,could not create influx client {}", e.getMessage()); + return null; + } + } + + public void start(Flux input) { + this.subscription = input.flatMap(this::storeInInflux) // + .subscribe(this::handleSentOk, // + this::handleExceptionInStream, // + () -> stop()); + + } + + private String measType(PmReport.MeasResult measResult, PmReport.MeasInfoList measInfoList) { + return measInfoList.getMeasTypes().getMeasType(measResult.getP()); + } + + private String fdn(PmReport report, PmReport.MeasValuesList measValueList) { + return report.event.getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn() + "," + + measValueList.getMeasObjInstId(); + } + + private void addCounterFieldToPoint(Point point, PmReport.MeasInfoList measInfoList, + PmReport.MeasValuesList measValueList, PmReport.MeasResult measResult) { + String measType = measType(measResult, measInfoList); + + try { + Long value = Long.valueOf(measResult.getSValue()); + point.addField(measType, value); + } catch (Exception e) { + point.addField(measType, measResult.getSValue()); + } + } + + private Instant endTime(PmReport report) { + return Instant.ofEpochMilli(report.lastTimeEpochMili()); + } + + private Mono storeInInflux(DataFromKafkaTopic data) { + PmReport report = PmReport.parse(data); + + List points = new ArrayList<>(); + PmReport.MeasDataCollection measDataCollection = report.event.getPerf3gppFields().getMeasDataCollection(); + for (PmReport.MeasInfoList measInfoList : measDataCollection.getMeasInfoList()) { + + for (PmReport.MeasValuesList measValueList : measInfoList.getMeasValuesList()) { + if (measValueList.getSuspectFlag().equals("true")) { + continue; + } + Point point = Point.measurement(fdn(report, measValueList)).time(endTime(report), WritePrecision.MS); + + point.addField("GranularityPeriod", measDataCollection.getGranularityPeriod()); + + for (PmReport.MeasResult measResult : measValueList.getMeasResults()) { + addCounterFieldToPoint(point, measInfoList, measValueList, measResult); + } + points.add(point); + } + } + + store(points, report); + + logger.info("Processed file from: {}", report.event.getCommonEventHeader().getSourceName()); + + return Mono.just("ok"); + + } + + public void store(List points, PmReport report) { + try { + WriteApiBlocking writeApi = influxClient.getWriteApiBlocking(); + writeApi.writePoints(applConfig.getInfluxBucket(), applConfig.getInfluxOrg(), points); + } catch (Exception e) { + logger.error("Could not write points from {}, reason: {}", + report.event.getCommonEventHeader().getSourceName(), e.getMessage()); + } + } + + public synchronized void stop() { + if (this.subscription != null) { + this.subscription.dispose(); + this.subscription = null; + } + logger.info("InfluxStore stopped"); + } + + private void handleExceptionInStream(Throwable t) { + logger.warn(" exception: {}", t.getMessage()); + stop(); + } + + public synchronized boolean isRunning() { + return this.subscription != null; + } + + private void handleSentOk(String data) { + logger.debug("Stored data"); + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/KafkaTopicListener.java b/pmlog/src/main/java/org/oran/pmlog/KafkaTopicListener.java new file mode 100644 index 00000000..b5d2dae1 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/KafkaTopicListener.java @@ -0,0 +1,116 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.zip.GZIPInputStream; + +import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.serialization.ByteArrayDeserializer; +import org.oran.pmlog.configuration.ApplicationConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.kafka.receiver.KafkaReceiver; +import reactor.kafka.receiver.ReceiverOptions; + +/** + * The class streams incoming requests from a Kafka topic and sends them further + * to a multi cast sink, which several other streams can connect to. + */ +@SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally +public class KafkaTopicListener { + + private static final Logger logger = LoggerFactory.getLogger(KafkaTopicListener.class); + private final ApplicationConfig applicationConfig; + private Flux dataFromTopic; + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create(); + + public KafkaTopicListener(ApplicationConfig applConfig) { + this.applicationConfig = applConfig; + } + + public Flux getFlux() { + if (this.dataFromTopic == null) { + this.dataFromTopic = startReceiveFromTopic(this.applicationConfig.getKafkaClientId()); + } + return this.dataFromTopic; + } + + private Flux startReceiveFromTopic(String clientId) { + logger.debug("Listening to kafka topic: {}", this.applicationConfig.getKafkaInputTopic()); + + return KafkaReceiver.create(kafkaInputProperties(clientId)) // + .receiveAutoAck() // + .concatMap(consumerRecord -> consumerRecord) // + .doOnNext(input -> logger.trace("Received from kafka topic: {}", + this.applicationConfig.getKafkaInputTopic())) // + .doOnError(t -> logger.error("Received error: {}", t.getMessage())) // + .onErrorResume(t -> Mono.empty()) // + .doFinally(sig -> logger.error("KafkaTopicListener stopped, reason: {}", sig)) // + .filter(t -> t.value().length > 0 || t.key().length > 0) // + .map(input -> new DataFromKafkaTopic(input.headers(), input.key(), input.value())) // + .publish() // + .autoConnect(1); + } + + private ReceiverOptions kafkaInputProperties(String clientId) { + Map consumerProps = new HashMap<>(); + if (this.applicationConfig.getKafkaBootStrapServers().isEmpty()) { + logger.error("No kafka boostrap server is setup"); + } + + consumerProps.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false"); + consumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.applicationConfig.getKafkaBootStrapServers()); + consumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, applicationConfig.getKafkaGroupId()); + consumerProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class); + consumerProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class); + consumerProps.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); + + consumerProps.put(ConsumerConfig.CLIENT_ID_CONFIG, clientId + "_" + applicationConfig.getKafkaGroupId()); + + return ReceiverOptions.create(consumerProps) + .subscription(Collections.singleton(this.applicationConfig.getKafkaInputTopic())); + } + + public static byte[] unzip(byte[] bytes) throws IOException { + try (final GZIPInputStream gzipInput = new GZIPInputStream(new ByteArrayInputStream(bytes))) { + return gzipInput.readAllBytes(); + } + } + + private static byte[] unzip(byte[] bytes, String fileName) { + try { + return fileName.endsWith(".gz") ? unzip(bytes) : bytes; + } catch (IOException e) { + logger.error("Error while decompression, file: {}, reason: {}", fileName, e.getMessage()); + return new byte[0]; + } + + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/PmReport.java b/pmlog/src/main/java/org/oran/pmlog/PmReport.java new file mode 100644 index 00000000..bf80d66f --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/PmReport.java @@ -0,0 +1,192 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; +import java.util.Collection; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + + +@Builder(toBuilder = true) +public class PmReport { + + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder() // + .disableHtmlEscaping() // + .create(); + + public static PmReport parse(DataFromKafkaTopic data) { + return gson.fromJson(data.valueAsString(), PmReport.class); + } + + public long lastTimeEpochMili() { + return event.commonEventHeader.lastEpochMicrosec / 1000; + } + + @Expose + public Event event; + + public static class CommonEventHeader { + @Expose + private String domain; + + @Expose + private String eventId; + + @Expose + private String eventName; + + @Expose + @Getter + private String sourceName; + + @Expose + private String reportingEntityName; + + @Expose + private long startEpochMicrosec; + + @Expose + @Setter + private long lastEpochMicrosec; + + @Expose + private String timeZoneOffset; + + /* Not reported elements */ + int sequence; + String priority; + String version; + String vesEventListenerVersion; + } + + public static class MeasInfoId { + @Expose + private String sMeasInfoId = ""; + } + + public static class MeasTypes { + public String getMeasType(int pValue) { + if (pValue > sMeasTypesList.size()) { + return "MeasTypeIndexOutOfBounds:" + pValue; + } + return sMeasTypesList.get(pValue - 1); + } + + @Expose + protected ArrayList sMeasTypesList = new ArrayList<>(); + } + + @Getter + @Builder(toBuilder = true) + public static class MeasResult { + @Expose + @Setter + private int p; + + @Expose + @Setter + private String sValue; + } + + @Builder(toBuilder = true) + public static class MeasValuesList { + @Expose + @Getter + private String measObjInstId; + + @Expose + @Getter + private String suspectFlag; + + @Expose + @Getter + private Collection measResults; + + public boolean isEmpty() { + return this.measResults.isEmpty(); + } + + static MeasValuesList emptyList = MeasValuesList.builder().measResults(new ArrayList<>()).build(); + + public static MeasValuesList empty() { + return emptyList; + } + } + + @Getter + @Builder(toBuilder = true) + public static class MeasInfoList { + @Expose + private MeasInfoId measInfoId; + + @Expose + private MeasTypes measTypes; + + @Expose + private Collection measValuesList; + + } + + @Builder(toBuilder = true) + @Getter + public static class MeasDataCollection { + @Expose + private int granularityPeriod; + + @Expose + private String measuredEntityUserName; + + @Expose + private String measuredEntityDn; + + @Expose + private String measuredEntitySoftwareVersion; + + @Expose + private Collection measInfoList; + } + + @Builder(toBuilder = true) + @Getter + public static class Perf3gppFields { + @Expose + private String perf3gppFieldsVersion; + + @Expose + private MeasDataCollection measDataCollection; + } + + @Getter + @Builder(toBuilder = true) + public static class Event { + @Expose + private CommonEventHeader commonEventHeader; + + @Expose + private Perf3gppFields perf3gppFields; + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/SwaggerConfig.java b/pmlog/src/main/java/org/oran/pmlog/SwaggerConfig.java new file mode 100644 index 00000000..3bad66b2 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/SwaggerConfig.java @@ -0,0 +1,44 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; + +/** + * Swagger configuration class that uses swagger documentation type and scans + * all the controllers. To access the swagger gui go to + * http://ip:port/swagger-ui.html + */ +@OpenAPIDefinition( // + info = @Info(title = SwaggerConfig.API_TITLE, // + version = "1.0", // + description = SwaggerConfig.DESCRIPTION, // + license = @License(name = "Copyright (C) 2023 Nordix Foundation. Licensed under the Apache License.", + url = "http://www.apache.org/licenses/LICENSE-2.0"))) +public class SwaggerConfig { + private SwaggerConfig() {} + + static final String API_TITLE = "PM Logger"; + static final String DESCRIPTION = + "Receives PM reports from a Kafka topic and writes the PM counters into an Influx database."; +} diff --git a/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClient.java b/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClient.java new file mode 100644 index 00000000..106b68e2 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClient.java @@ -0,0 +1,222 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2022 Nordix Foundation + * %% + * 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.oran.pmlog.clients; + +import io.netty.channel.ChannelOption; +import io.netty.handler.ssl.SslContext; +import io.netty.handler.timeout.ReadTimeoutHandler; +import io.netty.handler.timeout.WriteTimeoutHandler; + +import java.lang.invoke.MethodHandles; +import java.util.concurrent.atomic.AtomicInteger; + +import org.oran.pmlog.configuration.WebClientConfig.HttpProxyConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.lang.Nullable; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import org.springframework.web.reactive.function.client.ExchangeStrategies; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.WebClient.RequestHeadersSpec; +import org.springframework.web.reactive.function.client.WebClientResponseException; + +import reactor.core.publisher.Mono; +import reactor.netty.http.client.HttpClient; +import reactor.netty.transport.ProxyProvider; + +/** + * Generic reactive REST client. + */ +public class AsyncRestClient { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private WebClient webClient = null; + private final String baseUrl; + private static final AtomicInteger sequenceNumber = new AtomicInteger(); + private final SslContext sslContext; + private final HttpProxyConfig httpProxyConfig; + private final SecurityContext securityContext; + + public AsyncRestClient(String baseUrl, @Nullable SslContext sslContext, @Nullable HttpProxyConfig httpProxyConfig, + SecurityContext securityContext) { + this.baseUrl = baseUrl; + this.sslContext = sslContext; + this.httpProxyConfig = httpProxyConfig; + this.securityContext = securityContext; + } + + @SuppressWarnings("java:S4449") // contentType, is not @Nullable + public Mono> postForEntity(String uri, @Nullable String body, + @Nullable MediaType mediaType) { + Mono bodyProducer = body != null ? Mono.just(body) : Mono.empty(); + + RequestHeadersSpec request = getWebClient() // + .post() // + .uri(uri) // + .contentType(mediaType) // + .body(bodyProducer, String.class); + return retrieve(request); + } + + public Mono post(String uri, @Nullable String body, @Nullable MediaType mediaType) { + return postForEntity(uri, body, mediaType) // + .map(this::toBody); + } + + public Mono> putForEntity(String uri, String body) { + RequestHeadersSpec request = getWebClient() // + .put() // + .uri(uri) // + .contentType(MediaType.APPLICATION_JSON) // + .bodyValue(body); + return retrieve(request); + } + + public Mono put(String uri, String body) { + return putForEntity(uri, body) // + .map(this::toBody); + } + + public Mono> getForEntity(String uri) { + RequestHeadersSpec request = getWebClient().get().uri(uri); + return retrieve(request); + } + + public Mono get(String uri) { + return getForEntity(uri) // + .map(this::toBody); + } + + public Mono> deleteForEntity(String uri) { + RequestHeadersSpec request = getWebClient().delete().uri(uri); + return retrieve(request); + } + + public Mono delete(String uri) { + return deleteForEntity(uri) // + .map(this::toBody); + } + + public Mono> postForEntity(String uri, @Nullable String body) { + Mono bodyProducer = body != null ? Mono.just(body) : Mono.empty(); + + RequestHeadersSpec request = getWebClient() // + .post() // + .uri(uri) // + .contentType(MediaType.APPLICATION_JSON) // + .body(bodyProducer, String.class); + return retrieve(request); + } + + public Mono post(String uri, @Nullable String body) { + return postForEntity(uri, body) // + .map(this::toBody); + } + + private Mono> retrieve(RequestHeadersSpec request) { + if (securityContext.isConfigured()) { + request.headers(h -> h.setBearerAuth(securityContext.getBearerAuthToken())); + } + return request.retrieve() // + .toEntity(String.class) // + .doOnError(this::onError); // + } + + private void onError(Throwable t) { + if (t instanceof WebClientResponseException) { + WebClientResponseException e = (WebClientResponseException) t; + logger.debug("Response error: {}", e.getResponseBodyAsString()); + } + } + + private static Object createTraceTag() { + return sequenceNumber.incrementAndGet(); + } + + private String toBody(ResponseEntity entity) { + if (entity.getBody() == null) { + return ""; + } else { + return entity.getBody(); + } + } + + private boolean isHttpProxyConfigured() { + return httpProxyConfig != null && httpProxyConfig.getHttpProxyPort() > 0 + && !httpProxyConfig.getHttpProxyHost().isEmpty(); + } + + private HttpClient buildHttpClient() { + HttpClient httpClient = HttpClient.create() // + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // + .doOnConnected(connection -> { + connection.addHandlerLast(new ReadTimeoutHandler(30)); + connection.addHandlerLast(new WriteTimeoutHandler(30)); + }); + + if (this.sslContext != null) { + httpClient = httpClient.secure(ssl -> ssl.sslContext(sslContext)); + } + + if (isHttpProxyConfigured()) { + httpClient = httpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP) + .host(httpProxyConfig.getHttpProxyHost()).port(httpProxyConfig.getHttpProxyPort())); + } + return httpClient; + } + + public WebClient buildWebClient(String baseUrl) { + Object traceTag = createTraceTag(); + + final HttpClient httpClient = buildHttpClient(); + ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() // + .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1)) // + .build(); + + ExchangeFilterFunction reqLogger = ExchangeFilterFunction.ofRequestProcessor(req -> { + logger.debug("{} {} uri = '{}''", traceTag, req.method(), req.url()); + return Mono.just(req); + }); + + ExchangeFilterFunction respLogger = ExchangeFilterFunction.ofResponseProcessor(resp -> { + logger.debug("{} resp: {}", traceTag, resp.statusCode()); + return Mono.just(resp); + }); + + return WebClient.builder() // + .clientConnector(new ReactorClientHttpConnector(httpClient)) // + .baseUrl(baseUrl) // + .exchangeStrategies(exchangeStrategies) // + .filter(reqLogger) // + .filter(respLogger) // + .build(); + } + + private WebClient getWebClient() { + if (this.webClient == null) { + this.webClient = buildWebClient(baseUrl); + } + return this.webClient; + } +} diff --git a/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClientFactory.java b/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClientFactory.java new file mode 100644 index 00000000..b0821882 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/clients/AsyncRestClientFactory.java @@ -0,0 +1,194 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2022 Nordix Foundation + * %% + * 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.oran.pmlog.clients; + +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.invoke.MethodHandles; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import javax.net.ssl.KeyManagerFactory; + +import org.oran.pmlog.configuration.WebClientConfig; +import org.oran.pmlog.configuration.WebClientConfig.HttpProxyConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ResourceUtils; + +/** + * Factory for a generic reactive REST client. + */ +public class AsyncRestClientFactory { + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private final SslContextFactory sslContextFactory; + private final HttpProxyConfig httpProxyConfig; + private final SecurityContext securityContext; + + public AsyncRestClientFactory(WebClientConfig clientConfig, SecurityContext securityContext) { + if (clientConfig != null) { + this.sslContextFactory = new CachingSslContextFactory(clientConfig); + this.httpProxyConfig = clientConfig.getHttpProxyConfig(); + } else { + logger.warn("No configuration for web client defined, HTTPS will not work"); + this.sslContextFactory = null; + this.httpProxyConfig = null; + } + this.securityContext = securityContext; + } + + public AsyncRestClient createRestClientNoHttpProxy(String baseUrl) { + return createRestClient(baseUrl, false); + } + + public AsyncRestClient createRestClientUseHttpProxy(String baseUrl) { + return createRestClient(baseUrl, true); + } + + private AsyncRestClient createRestClient(String baseUrl, boolean useHttpProxy) { + if (this.sslContextFactory != null) { + try { + return new AsyncRestClient(baseUrl, this.sslContextFactory.createSslContext(), + useHttpProxy ? httpProxyConfig : null, this.securityContext); + } catch (Exception e) { + String exceptionString = e.toString(); + logger.error("Could not init SSL context, reason: {}", exceptionString); + } + } + return new AsyncRestClient(baseUrl, null, httpProxyConfig, this.securityContext); + } + + private class SslContextFactory { + private final WebClientConfig clientConfig; + + public SslContextFactory(WebClientConfig clientConfig) { + this.clientConfig = clientConfig; + } + + public SslContext createSslContext() throws UnrecoverableKeyException, NoSuchAlgorithmException, + CertificateException, KeyStoreException, IOException { + return this.createSslContext(createKeyManager()); + } + + private SslContext createSslContext(KeyManagerFactory keyManager) + throws NoSuchAlgorithmException, CertificateException, KeyStoreException, IOException { + if (this.clientConfig.isTrustStoreUsed()) { + return createSslContextRejectingUntrustedPeers(this.clientConfig.getTrustStore(), + this.clientConfig.getTrustStorePassword(), keyManager); + } else { + // Trust anyone + return SslContextBuilder.forClient() // + .keyManager(keyManager) // + .trustManager(InsecureTrustManagerFactory.INSTANCE) // + .build(); + } + } + + private SslContext createSslContextRejectingUntrustedPeers(String trustStorePath, String trustStorePass, + KeyManagerFactory keyManager) + throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException { + + final KeyStore trustStore = getTrustStore(trustStorePath, trustStorePass); + List certificateList = Collections.list(trustStore.aliases()).stream() // + .filter(alias -> isCertificateEntry(trustStore, alias)) // + .map(alias -> getCertificate(trustStore, alias)) // + .collect(Collectors.toList()); + final X509Certificate[] certificates = certificateList.toArray(new X509Certificate[certificateList.size()]); + + return SslContextBuilder.forClient() // + .keyManager(keyManager) // + .trustManager(certificates) // + .build(); + } + + private boolean isCertificateEntry(KeyStore trustStore, String alias) { + try { + return trustStore.isCertificateEntry(alias); + } catch (KeyStoreException e) { + logger.error("Error reading truststore {}", e.getMessage()); + return false; + } + } + + private Certificate getCertificate(KeyStore trustStore, String alias) { + try { + return trustStore.getCertificate(alias); + } catch (KeyStoreException e) { + logger.error("Error reading truststore {}", e.getMessage()); + return null; + } + } + + private KeyManagerFactory createKeyManager() throws NoSuchAlgorithmException, CertificateException, IOException, + UnrecoverableKeyException, KeyStoreException { + final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + final KeyStore keyStore = KeyStore.getInstance(this.clientConfig.getKeyStoreType()); + final String keyStoreFile = this.clientConfig.getKeyStore(); + final String keyStorePassword = this.clientConfig.getKeyStorePassword(); + final String keyPassword = this.clientConfig.getKeyPassword(); + try (final InputStream inputStream = new FileInputStream(keyStoreFile)) { + keyStore.load(inputStream, keyStorePassword.toCharArray()); + } + keyManager.init(keyStore, keyPassword.toCharArray()); + return keyManager; + } + + private synchronized KeyStore getTrustStore(String trustStorePath, String trustStorePass) + throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException { + + KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); + store.load(new FileInputStream(ResourceUtils.getFile(trustStorePath)), trustStorePass.toCharArray()); + return store; + } + } + + public class CachingSslContextFactory extends SslContextFactory { + private SslContext cachedContext = null; + + public CachingSslContextFactory(WebClientConfig clientConfig) { + super(clientConfig); + } + + @Override + public SslContext createSslContext() throws UnrecoverableKeyException, NoSuchAlgorithmException, + CertificateException, KeyStoreException, IOException { + if (this.cachedContext == null) { + this.cachedContext = super.createSslContext(); + } + return this.cachedContext; + + } + } +} diff --git a/pmlog/src/main/java/org/oran/pmlog/clients/SecurityContext.java b/pmlog/src/main/java/org/oran/pmlog/clients/SecurityContext.java new file mode 100644 index 00000000..5aeb4a37 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/clients/SecurityContext.java @@ -0,0 +1,76 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2022 Nordix Foundation + * %% + * 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.oran.pmlog.clients; + +import java.lang.invoke.MethodHandles; +import java.nio.file.Files; +import java.nio.file.Path; + +import lombok.Setter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; + +@EnableConfigurationProperties +@ConfigurationProperties() +@Component +public class SecurityContext { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private long tokenTimestamp = 0; + + private String authToken = ""; + + @Setter + private Path authTokenFilePath; + + public SecurityContext(@Value("${app.auth-token-file:}") String authTokenFilename) { + if (!authTokenFilename.isEmpty()) { + this.authTokenFilePath = Path.of(authTokenFilename); + } + } + + public boolean isConfigured() { + return authTokenFilePath != null; + } + + public synchronized String getBearerAuthToken() { + if (!isConfigured()) { + return ""; + } + try { + long lastModified = authTokenFilePath.toFile().lastModified(); + if (tokenTimestamp == 0 || lastModified != this.tokenTimestamp) { + this.authToken = Files.readString(authTokenFilePath); + this.tokenTimestamp = lastModified; + } + } catch (Exception e) { + logger.warn("Could not read auth token file: {}, reason: {}", authTokenFilePath, e.getMessage()); + } + return this.authToken; + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/configuration/ApplicationConfig.java b/pmlog/src/main/java/org/oran/pmlog/configuration/ApplicationConfig.java new file mode 100644 index 00000000..8df61cd3 --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/configuration/ApplicationConfig.java @@ -0,0 +1,194 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog.configuration; + +import java.lang.invoke.MethodHandles; +import java.nio.charset.Charset; +import java.nio.file.Files; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +@EnableConfigurationProperties +@ToString +public class ApplicationConfig { + + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create(); + private static final String JOB_DEFINITION_PATH = "./config/jobDefinition.json"; + + @Value("${server.ssl.key-store-type}") + private String sslKeyStoreType = ""; + + @Value("${server.ssl.key-store-password}") + private String sslKeyStorePassword = ""; + + @Value("${server.ssl.key-store}") + private String sslKeyStore = ""; + + @Value("${server.ssl.key-password}") + private String sslKeyPassword = ""; + + @Value("${app.webclient.trust-store-used}") + private boolean sslTrustStoreUsed = false; + + @Value("${app.webclient.trust-store-password}") + private String sslTrustStorePassword = ""; + + @Value("${app.webclient.trust-store}") + private String sslTrustStore = ""; + + @Value("${app.webclient.http.proxy-host:}") + private String httpProxyHost = ""; + + @Value("${app.webclient.http.proxy-port:0}") + private int httpProxyPort = 0; + + @Getter + @Setter + @Value("${server.port}") + private int localServerHttpPort; + + @Getter + @Value("${app.kafka.max-poll-records:300}") + private int kafkaMaxPollRecords; + + @Getter + @Value("${app.kafka.group-id}") + private String kafkaGroupId; + + @Getter + @Value("${app.kafka.client-id}") + private String kafkaClientId; + + @Value("${app.kafka.bootstrap-servers}") + private String kafkaBootstrapServers; + + @Value("${app.kafka.input-topic}") + private String kafkaInputTopic; + + @Getter + @Value("${app.influx.url}") + private String influxUrl; + + @Getter + @Value("${app.influx.access-token}") + private String influxAccessToken; + + @Getter + @Value("${app.ics-base-url}") + private String icsBaseUrl; + + @Getter + @Value("${app.consumer-job-id:shouldHaveBeenDefinedInYaml}") + private String consumerJobId; + + @Getter + @Value("${app.influx.user}") + private String influxUser; + + @Getter + @Value("${app.influx.password}") + private String influxPassword; + + @Getter + @Value("${app.influx.database}") + private String influxDatabase; + + @Getter + @Value("${app.influx.bucket}") + private String influxBucket; + + @Getter + @Value("${app.influx.org}") + private String influxOrg; + + private WebClientConfig webClientConfig = null; + + public WebClientConfig getWebClientConfig() { + if (this.webClientConfig == null) { + WebClientConfig.HttpProxyConfig httpProxyConfig = WebClientConfig.HttpProxyConfig.builder() // + .httpProxyHost(this.httpProxyHost) // + .httpProxyPort(this.httpProxyPort) // + .build(); + + this.webClientConfig = WebClientConfig.builder() // + .keyStoreType(this.sslKeyStoreType) // + .keyStorePassword(this.sslKeyStorePassword) // + .keyStore(this.sslKeyStore) // + .keyPassword(this.sslKeyPassword) // + .isTrustStoreUsed(this.sslTrustStoreUsed) // + .trustStore(this.sslTrustStore) // + .trustStorePassword(this.sslTrustStorePassword) // + .httpProxyConfig(httpProxyConfig) // + .build(); + } + return this.webClientConfig; + } + + public String getConsumerJobInfo() { + + try { + return Files.readString(java.nio.file.Path.of(JOB_DEFINITION_PATH), Charset.defaultCharset()); + } catch (Exception e) { + logger.error("Could not load configuration file: {}, reason: {}", JOB_DEFINITION_PATH, e.getMessage()); + return "{}"; + } + } + + private ConsumerJobInfo.KafkaDeliveryInfo getKafkaDeliveryInfoFromAplicationYaml() { + return ConsumerJobInfo.KafkaDeliveryInfo.builder() // + .bootStrapServers(this.kafkaBootstrapServers) // + .topic(kafkaInputTopic) // + .build(); + } + + private ConsumerJobInfo.KafkaDeliveryInfo getKafkaDeliveryInfo() { + try { + ConsumerJobInfo infoFromFile = gson.fromJson(getConsumerJobInfo(), ConsumerJobInfo.class); + if (infoFromFile != null && infoFromFile.jobDefinition != null + && infoFromFile.jobDefinition.getDeliveryInfo() != null) { + return infoFromFile.jobDefinition.getDeliveryInfo(); + } + + } catch (Exception e) { + logger.warn("Could not parse file: {}, reason: {}, falling back to parameters in Application.yaml", + JOB_DEFINITION_PATH, e.getMessage()); + } + return getKafkaDeliveryInfoFromAplicationYaml(); + + } + + public String getKafkaInputTopic() { + return getKafkaDeliveryInfo().getTopic(); + } + + public String getKafkaBootStrapServers() { + return getKafkaDeliveryInfo().getBootStrapServers(); + } + +} diff --git a/pmlog/src/main/java/org/oran/pmlog/configuration/ConsumerJobInfo.java b/pmlog/src/main/java/org/oran/pmlog/configuration/ConsumerJobInfo.java new file mode 100644 index 00000000..be3b23ca --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/configuration/ConsumerJobInfo.java @@ -0,0 +1,114 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog.configuration; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +public class ConsumerJobInfo { + + @Getter + public static class PmFilterData { + + public static class MeasTypeSpec { + @Setter + @Getter + @Expose + String measuredObjClass; + + @Getter + @Expose + final Set measTypes = new HashSet<>(); + } + + @Expose + final Set sourceNames = new HashSet<>(); + + @Expose + final Set measObjInstIds = new HashSet<>(); + + @Expose + final Collection measTypeSpecs = new ArrayList<>(); + + @Expose + final Set measuredEntityDns = new HashSet<>(); + } + + @Builder + public static class KafkaDeliveryInfo { + @Getter + @Expose + private String topic; + + @Getter + @Expose + private String bootStrapServers; + } + + @Builder + public static class PmJobParameters { + + public static final String PM_FILTER_TYPE = "pmdata"; + + @Getter + @Builder.Default + @Expose + private String filterType = PM_FILTER_TYPE; + + @Getter + @Expose + private PmFilterData filter; + + @Getter + @Expose + private KafkaDeliveryInfo deliveryInfo; + + } + + @SerializedName("info_type_id") + @Expose + public String infoTypeId = ""; + + @SerializedName("job_owner") + @Expose + public String owner = ""; + + @SerializedName("job_definition") + @Expose + public PmJobParameters jobDefinition; + + public ConsumerJobInfo() {} + + public ConsumerJobInfo(String infoTypeId, PmJobParameters jobData, String owner) { + this.infoTypeId = infoTypeId; + this.jobDefinition = jobData; + this.owner = owner; + } +} diff --git a/pmlog/src/main/java/org/oran/pmlog/configuration/WebClientConfig.java b/pmlog/src/main/java/org/oran/pmlog/configuration/WebClientConfig.java new file mode 100644 index 00000000..21da61eb --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/configuration/WebClientConfig.java @@ -0,0 +1,60 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog.configuration; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; +import reactor.netty.transport.ProxyProvider; + +@Builder +@Getter +@ToString +public class WebClientConfig { + private String keyStoreType; + + private String keyStorePassword; + + private String keyStore; + + @ToString.Exclude + private String keyPassword; + + private boolean isTrustStoreUsed; + + @ToString.Exclude + private String trustStorePassword; + + private String trustStore; + + @ToString + @Builder + @Getter + public static class HttpProxyConfig { + private String httpProxyHost; + + private int httpProxyPort; + + private ProxyProvider.Proxy httpProxyType; + } + + private HttpProxyConfig httpProxyConfig; +} diff --git a/pmlog/src/main/java/org/oran/pmlog/exceptions/ServiceException.java b/pmlog/src/main/java/org/oran/pmlog/exceptions/ServiceException.java new file mode 100644 index 00000000..f05d955f --- /dev/null +++ b/pmlog/src/main/java/org/oran/pmlog/exceptions/ServiceException.java @@ -0,0 +1,39 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog.exceptions; + +import lombok.Getter; + +import org.springframework.http.HttpStatus; + +public class ServiceException extends Exception { + + private static final long serialVersionUID = 1L; + + @Getter + private final HttpStatus httpStatus; + + public ServiceException(String message, HttpStatus httpStatus) { + super(message); + this.httpStatus = httpStatus; + } + +} diff --git a/pmlog/src/test/java/org/oran/pmlog/ApplicationTest.java b/pmlog/src/test/java/org/oran/pmlog/ApplicationTest.java new file mode 100644 index 00000000..bbd0e88f --- /dev/null +++ b/pmlog/src/test/java/org/oran/pmlog/ApplicationTest.java @@ -0,0 +1,196 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.spy; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.lang.invoke.MethodHandles; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.json.JSONObject; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.mockito.Mockito; +import org.oran.pmlog.clients.AsyncRestClient; +import org.oran.pmlog.clients.AsyncRestClientFactory; +import org.oran.pmlog.clients.SecurityContext; +import org.oran.pmlog.configuration.ApplicationConfig; +import org.oran.pmlog.configuration.WebClientConfig; +import org.oran.pmlog.configuration.WebClientConfig.HttpProxyConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.TestPropertySource; +import reactor.core.publisher.Flux; + +@TestMethodOrder(MethodOrderer.MethodName.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@TestPropertySource(properties = { // + "server.ssl.key-store=./config/keystore.jks", // + "app.webclient.trust-store=./config/truststore.jks", // + "app.webclient.trust-store-used=true" // +}) +class ApplicationTest { + + @Autowired + private ApplicationConfig applicationConfig; + + @Autowired + SecurityContext securityContext; + + private com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create(); + + @LocalServerPort + int port; + + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + static class TestApplicationConfig extends ApplicationConfig { + + String thisProcessUrl() { + final String url = "https://localhost:" + getLocalServerHttpPort(); + return url; + } + } + + /** + * Overrides the BeanFactory. + */ + @TestConfiguration + static class TestBeanFactory extends BeanFactory { + + static final TestApplicationConfig applicationConfig = new TestApplicationConfig(); + static KafkaTopicListener kafkaListener; + static InfluxStore influxStore; + + @Override + @Bean + public ServletWebServerFactory servletContainer() { + return new TomcatServletWebServerFactory(); + } + + @Override + @Bean + public ApplicationConfig getApplicationConfig() { + return applicationConfig; + } + + @Override + @Bean + public KafkaTopicListener getKafkaTopicListener(@Autowired ApplicationConfig appConfig) { + kafkaListener = new KafkaTopicListener(applicationConfig); + return kafkaListener; + } + + @Override + @Bean + public InfluxStore getInfluxStore(@Autowired ApplicationConfig appConfig, + @Autowired KafkaTopicListener listener) { + influxStore = spy(new InfluxStore(applicationConfig)); + return influxStore; + } + + } + + @BeforeEach + public void init() {} + + @AfterEach + void reset() { + + } + + @Test + void generateApiDoc() throws FileNotFoundException { + String url = "/v3/api-docs"; + ResponseEntity resp = restClient().getForEntity(url).block(); + assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); + + JSONObject jsonObj = new JSONObject(resp.getBody()); + assertThat(jsonObj.remove("servers")).isNotNull(); + + String indented = jsonObj.toString(4); + try (PrintStream out = new PrintStream(new FileOutputStream("api/pmlog-api.json"))) { + out.print(indented); + } + } + + @Test + void testPmReport() throws IOException { + String path = "./src/test/resources/pm_report.json"; + String str = Files.readString(Path.of(path), Charset.defaultCharset()); + DataFromKafkaTopic data = new DataFromKafkaTopic(null, null, str.getBytes()); + + Mockito.doNothing().when(TestBeanFactory.influxStore).store(any(), any()); + TestBeanFactory.influxStore.start(Flux.just(data)); + + Mockito.verify(TestBeanFactory.influxStore, Mockito.times(1)).store(any(), any()); + } + + private AsyncRestClient restClient() { + return restClient(false); + } + + private String baseUrl() { + return "https://localhost:" + this.port; + } + + private AsyncRestClient restClient(boolean useTrustValidation) { + WebClientConfig config = this.applicationConfig.getWebClientConfig(); + HttpProxyConfig httpProxyConfig = HttpProxyConfig.builder() // + .httpProxyHost("") // + .httpProxyPort(0) // + .build(); + config = WebClientConfig.builder() // + .keyStoreType(config.getKeyStoreType()) // + .keyStorePassword(config.getKeyStorePassword()) // + .keyStore(config.getKeyStore()) // + .keyPassword(config.getKeyPassword()) // + .isTrustStoreUsed(useTrustValidation) // + .trustStore(config.getTrustStore()) // + .trustStorePassword(config.getTrustStorePassword()) // + .httpProxyConfig(httpProxyConfig).build(); + + AsyncRestClientFactory restClientFactory = new AsyncRestClientFactory(config, securityContext); + return restClientFactory.createRestClientNoHttpProxy(baseUrl()); + } + +} diff --git a/pmlog/src/test/java/org/oran/pmlog/Integration.java b/pmlog/src/test/java/org/oran/pmlog/Integration.java new file mode 100644 index 00000000..fa3c43bb --- /dev/null +++ b/pmlog/src/test/java/org/oran/pmlog/Integration.java @@ -0,0 +1,245 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2023 Nordix Foundation + * %% + * 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.oran.pmlog; + +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.ByteArraySerializer; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.oran.pmlog.configuration.ApplicationConfig; +import org.oran.pmlog.configuration.ConsumerJobInfo; +import org.oran.pmlog.configuration.ConsumerJobInfo.PmFilterData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.TestPropertySource; + +import reactor.core.publisher.Flux; +import reactor.kafka.sender.KafkaSender; +import reactor.kafka.sender.SenderOptions; +import reactor.kafka.sender.SenderRecord; + +@SuppressWarnings("java:S3577") // Rename class +@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@TestPropertySource(properties = { // + "server.ssl.key-store=./config/keystore.jks", // + "app.webclient.trust-store=./config/truststore.jks", // + "app.configuration-filepath=./src/test/resources/test_application_configuration.json", // + "app.pm-files-path=./src/test/resources/" // +}) // +class Integration { + + @Autowired + private ApplicationConfig applicationConfig; + + private static com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create(); + + private final Logger logger = LoggerFactory.getLogger(Integration.class); + + @LocalServerPort + int localServerHttpPort; + + static class TestApplicationConfig extends ApplicationConfig { + String thisProcessUrl() { + final String url = "https://localhost:" + getLocalServerHttpPort(); + return url; + } + } + + /** + * Overrides the BeanFactory. + */ + @TestConfiguration + static class TestBeanFactory extends BeanFactory { + + @Override + @Bean + public ServletWebServerFactory servletContainer() { + return new TomcatServletWebServerFactory(); + } + + @Override + @Bean + public ApplicationConfig getApplicationConfig() { + TestApplicationConfig cfg = new TestApplicationConfig(); + return cfg; + } + } + + @BeforeEach + void init() {} + + @AfterEach + void reset() {} + + private SenderOptions kafkaSenderOptions() { + String bootstrapServers = this.applicationConfig.getKafkaBootStrapServers(); + + Map props = new HashMap<>(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); + // props.put(ProducerConfig.CLIENT_ID_CONFIG, "sample-producerx"); + props.put(ProducerConfig.ACKS_CONFIG, "all"); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class); + return SenderOptions.create(props); + } + + private SenderRecord kafkaSenderRecord(String data, String key) { + String topic = this.applicationConfig.getKafkaInputTopic(); + int correlationMetadata = 2; + return SenderRecord.create(new ProducerRecord<>(topic, key.getBytes(), data.getBytes()), correlationMetadata); + } + + private void sendDataToKafka(Flux> dataToSend) { + final KafkaSender sender = KafkaSender.create(kafkaSenderOptions()); + + sender.send(dataToSend) // + .doOnError(e -> logger.error("Send failed", e)) // + .blockLast(); + + sender.close(); + } + + @SuppressWarnings("squid:S2925") // "Thread.sleep" should not be used in tests. + private static void waitForKafkaListener() throws InterruptedException { + Thread.sleep(4000); + } + + private String generateCounterValue(int sequenceValue, int noOfObjects, String counterName) { + long value = (random.nextInt() % 100) * sequenceValue + (counterName.hashCode() % 5000); + return Long.toString(value); + } + + static java.util.Random random = new java.util.Random(System.currentTimeMillis()); + + private long currentEpochMicroSeconds() { + return java.util.concurrent.TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()); + } + + private String measType(PmReport.MeasResult measResult, PmReport.MeasInfoList measInfoList) { + return measInfoList.getMeasTypes().getMeasType(measResult.getP()); + } + + // Set end time. Now - (GP * sequenceValue) + private void setEndTime(PmReport report, int sequenceValue, int noOfObjects) { + long gpMicro = report.event.getPerf3gppFields().getMeasDataCollection().getGranularityPeriod() * 1000 * 1000; + long endTime = currentEpochMicroSeconds() - ((noOfObjects - sequenceValue - 1) * gpMicro); + report.event.getCommonEventHeader().setLastEpochMicrosec(endTime); + + } + + String pmReport(int sequenceValue, int noOfObjects) { + try { + String path = "./src/test/resources/pm_report.json"; + // path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json"; + String str = Files.readString(Path.of(path), Charset.defaultCharset()); + PmReport report = gson.fromJson(str, PmReport.class); + PmReport.MeasDataCollection measDataCollection = report.event.getPerf3gppFields().getMeasDataCollection(); + + setEndTime(report, sequenceValue, noOfObjects); + + // Fill it with random values + for (PmReport.MeasInfoList measInfoList : measDataCollection.getMeasInfoList()) { + for (PmReport.MeasValuesList measValueList : measInfoList.getMeasValuesList()) { + for (PmReport.MeasResult measResult : measValueList.getMeasResults()) { + String value = this.generateCounterValue(sequenceValue, noOfObjects, + measType(measResult, measInfoList)); + measResult.setSValue(value); + } + } + } + return gson.toJson(report); + } catch (Exception e) { + logger.error("Could not loadPM report {}", e.getMessage(), e); + return null; + } + + } + + @Test + void testStoreReportsInflux() throws Exception { + final int NO_OF_OBJECTS = 24 * 4; + InfluxStore influxStore = new InfluxStore(this.applicationConfig); + + Flux input = Flux.range(0, NO_OF_OBJECTS) // + .map(i -> pmReport(i, NO_OF_OBJECTS)) // + .map(str -> new DataFromKafkaTopic(null, null, str.getBytes())); + + influxStore.start(input); + + } + + @SuppressWarnings("squid:S2925") // "Thread.sleep" should not be used in tests. + @Test + void sendPmReportsThroughKafka() throws Exception { + waitForKafkaListener(); + + final int NO_OF_OBJECTS = 20; + + var dataToSend = Flux.range(0, NO_OF_OBJECTS).map(i -> kafkaSenderRecord(pmReport(i, NO_OF_OBJECTS), "key")); + sendDataToKafka(dataToSend); + + Thread.sleep(1000 * 1000); + } + + @Test + void printConfiguration() { + PmFilterData f = new PmFilterData(); + f.getMeasObjInstIds().add("measObj"); + PmFilterData.MeasTypeSpec spec = new PmFilterData.MeasTypeSpec(); + spec.setMeasuredObjClass("measuredObjClass"); + spec.getMeasTypes().add("measType"); + f.getMeasTypeSpecs().add(spec); + f.getSourceNames().add("sourceName"); + ConsumerJobInfo.KafkaDeliveryInfo deliveryInfo = ConsumerJobInfo.KafkaDeliveryInfo.builder() // + .topic("topic").bootStrapServers("bootStrapServers") // + .build(); + ConsumerJobInfo.PmJobParameters params = ConsumerJobInfo.PmJobParameters.builder() // + .filter(f) // + .deliveryInfo(deliveryInfo).build(); + + ConsumerJobInfo info = new ConsumerJobInfo("type", params, "owner"); + String str = gson.toJson(info); + System.out.print(str); + } + + @SuppressWarnings("squid:S2925") // "Thread.sleep" should not be used in tests. + @Test + void tet() throws Exception { + Thread.sleep(1000 * 1000); + } + +} diff --git a/pmlog/src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json b/pmlog/src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json new file mode 100644 index 00000000..451279ab --- /dev/null +++ b/pmlog/src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json @@ -0,0 +1 @@ +{"event":{"commonEventHeader":{"domain":"","eventId":"","sequence":0,"eventName":"","sourceName":"HTTPST2-0","reportingEntityName":"","priority":"","startEpochMicrosec":15198378,"lastEpochMicrosec":151983,"version":"","vesEventListenerVersion":"","timeZoneOffset":"UTC+05.30"},"perf3gppFields":{"perf3gppFieldsVersion":"1.0","measDataCollection":{"granularityPeriod":900,"measuredEntityUserName":"","measuredEntityDn":"nodedntest","measuredEntitySoftwareVersion":"CXP2010174_1 R44B17","measInfoList":[{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellCU_GNBCUCP"},"measTypes":{"sMeasTypesList":["pmCounterNumber0","pmCounterNumber1","pmCounterNumber2","pmCounterNumber3","pmCounterNumber4","pmCounterNumber5","pmCounterNumber6","pmCounterNumber7","pmCounterNumber8","pmCounterNumber9","pmCounterNumber10","pmCounterNumber11","pmCounterNumber12","pmCounterNumber13","pmCounterNumber14","pmCounterNumber15","pmCounterNumber16","pmCounterNumber17","pmCounterNumber18","pmCounterNumber19","pmCounterNumber20","pmCounterNumber21","pmCounterNumber22","pmCounterNumber23","pmCounterNumber24","pmCounterNumber25","pmCounterNumber26","pmCounterNumber27","pmCounterNumber28","pmCounterNumber29","pmCounterNumber30","pmCounterNumber31","pmCounterNumber32","pmCounterNumber33","pmCounterNumber34","pmCounterNumber35","pmCounterNumber36","pmCounterNumber37","pmCounterNumber38","pmCounterNumber39","pmCounterNumber40","pmCounterNumber41","pmCounterNumber42","pmCounterNumber43","pmCounterNumber44","pmCounterNumber45","pmCounterNumber46","pmCounterNumber47","pmCounterNumber48","pmCounterNumber49","pmCounterNumber50","pmCounterNumber51","pmCounterNumber51Act","pmCounterNumber53","pmCounterNumber53Act","pmCounterNumber55","pmCounterNumber56","pmCounterNumber57","pmCounterNumber58","pmCounterNumber59","pmCounterNumber60","pmCounterNumber60IntgProt64kbps","pmCounterNumber62","pmCounterNumber63","pmCounterNumber64","pmCounterNumber65","pmCounterNumber66","pmCounterNumber67","pmCounterNumber68","pmCounterNumber69","pmCounterNumber70","pmCounterNumber71","pmCounterNumber72","pmCounterNumber73","pmCounterNumber74","pmCounterNumber75","pmCounterNumber76","pmCounterNumber77","pmCounterNumber78","pmCounterNumber79","pmCounterNumber80","pmCounterNumber81","pmCounterNumber82","pmCounterNumber83","pmCounterNumber84","pmCounterNumber84Em","pmCounterNumber84EmFbInd","pmCounterNumber87","pmCounterNumber88","pmCounterNumber89","pmCounterNumber90","pmCounterNumber91"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"180"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0"},{"p":92,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"180"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0"},{"p":92,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"180"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0"},{"p":92,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"180"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0"},{"p":92,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellDU_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber92","pmCounterNumber93","pmCounterNumber94","pmCounterNumber95","pmCounterNumber96","pmCounterNumber97","pmCounterNumber98","pmCounterNumber99","pmCounterNumber100","pmCounterNumber101","pmCounterNumber102","pmCounterNumber103","pmCounterNumber104","pmCounterNumber105","pmCounterNumber106","pmCounterNumber107","pmCounterNumber108","pmCounterNumber108Init","pmCounterNumber110","pmCounterNumber110Init","pmCounterNumber112","pmCounterNumber112Init","pmCounterNumber114","pmCounterNumber114Init","pmCounterNumber116","pmCounterNumber116Init","pmCounterNumber118","pmCounterNumber118Init","pmCounterNumber120","pmCounterNumber120Init","pmCounterNumber122","pmCounterNumber122Init","pmCounterNumber124","pmCounterNumber125","pmCounterNumber125Init","pmCounterNumber127","pmCounterNumber127Init","pmCounterNumber129","pmCounterNumber129Init","pmCounterNumber131","pmCounterNumber131Init","pmCounterNumber133","pmCounterNumber133Init","pmCounterNumber135","pmCounterNumber135Init","pmCounterNumber137","pmCounterNumber137Init","pmCounterNumber139","pmCounterNumber139Init","pmCounterNumber141","pmCounterNumber141Init","pmCounterNumber143","pmCounterNumber143Init","pmCounterNumber145","pmCounterNumber145Init","pmCounterNumber147","pmCounterNumber147Init","pmCounterNumber149","pmCounterNumber150","pmCounterNumber150Init","pmCounterNumber152","pmCounterNumber152Init","pmCounterNumber154","pmCounterNumber154Init","pmCounterNumber156","pmCounterNumber156Init","pmCounterNumber158","pmCounterNumber158Ext","pmCounterNumber160","pmCounterNumber161","pmCounterNumber162","pmCounterNumber163","pmCounterNumber164","pmCounterNumber165","pmCounterNumber166","pmCounterNumber1666","pmCounterNumber168","pmCounterNumber169","pmCounterNumber170","pmCounterNumber171","pmCounterNumber172","pmCounterNumber173","pmCounterNumber174","pmCounterNumber175","pmCounterNumber176","pmCounterNumber177","pmCounterNumber178","pmCounterNumber179","pmCounterNumber180","pmCounterNumber181","pmCounterNumber182","pmCounterNumber183","pmCounterNumber184","pmCounterNumber185","pmCounterNumber185Qos","pmCounterNumber185Samp","pmCounterNumber185SampQos","pmCounterNumber189","pmCounterNumber189Qos","pmCounterNumber191","pmCounterNumber191Qos","pmCounterNumber193","pmCounterNumber193Samp","pmCounterNumber195","pmCounterNumber195Ext","pmCounterNumber197","pmCounterNumber198","pmCounterNumber199","pmCounterNumber200","pmCounterNumber200BsrGrant","pmCounterNumber200PreemptGrant","pmCounterNumber200PucchSrGrant","pmCounterNumber204","pmCounterNumber205","pmCounterNumber206","pmCounterNumber207","pmCounterNumber208","pmCounterNumber209","pmCounterNumber210","pmCounterNumber211","pmCounterNumber212","pmCounterNumber213","pmCounterNumber214","pmCounterNumber215","pmCounterNumber216","pmCounterNumber216MacCe","pmCounterNumber218","pmCounterNumber219","pmCounterNumber220","pmCounterNumber221","pmCounterNumber222","pmCounterNumber223","pmCounterNumber224","pmCounterNumber225","pmCounterNumber226","pmCounterNumber227","pmCounterNumber228","pmCounterNumber228Forced","pmCounterNumber230","pmCounterNumber231","pmCounterNumber232","pmCounterNumber233","pmCounterNumber234","pmCounterNumber235","pmCounterNumber236","pmCounterNumber237","pmCounterNumber238","pmCounterNumber239","pmCounterNumber240","pmCounterNumber241","pmCounterNumber242","pmCounterNumber243","pmCounterNumber244","pmCounterNumber245","pmCounterNumber246","pmCounterNumber247","pmCounterNumber248","pmCounterNumber249","pmCounterNumber250","pmCounterNumber251","pmCounterNumber252","pmCounterNumber252Qos","pmCounterNumber254","pmCounterNumber254Qos"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":12,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":13,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":14,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"2880"},{"p":80,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":81,"sValue":"0,0,0,0,0,0,0,0"},{"p":82,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":83,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":84,"sValue":"0,0,0,0,0,0,0,0"},{"p":85,"sValue":"0,0,0,0,0,0,0,0"},{"p":86,"sValue":"0,0,0,0,0,0,0,0"},{"p":87,"sValue":"0,0,0,0,0,0,0,0"},{"p":88,"sValue":"0,0,0,0,0,0,0,0"},{"p":89,"sValue":"0,0,0,0,0,0,0,0"},{"p":90,"sValue":"0,0,0,0,0,0,0,0"},{"p":91,"sValue":"0,0,0,0,0,0,0,0"},{"p":92,"sValue":"0,0,0,0,0,0,0,0"},{"p":93,"sValue":"0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"179"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0,0,0,0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"900,0,0,0,0"},{"p":135,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":136,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":137,"sValue":"1440001"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":140,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":143,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":144,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":147,"sValue":"0,0,0,0,0,0,0,0,0,0,0,1800001,0,0,0,0,0,0,0,0,0"},{"p":148,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":149,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":150,"sValue":"0,0,0,0,0,0,0,0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0"},{"p":155,"sValue":"0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0"},{"p":159,"sValue":"0"},{"p":160,"sValue":"0"},{"p":161,"sValue":"0"},{"p":162,"sValue":"0"},{"p":163,"sValue":"0"},{"p":164,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":12,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":13,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":14,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"5376"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":81,"sValue":"0,0,0,0,0,0,0,0"},{"p":82,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":83,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":84,"sValue":"0,0,0,0,0,0,0,0"},{"p":85,"sValue":"0,0,0,0,0,0,0,0"},{"p":86,"sValue":"0,0,0,0,0,0,0,0"},{"p":87,"sValue":"0,0,0,0,0,0,0,0"},{"p":88,"sValue":"0,0,0,0,0,0,0,0"},{"p":89,"sValue":"0,0,0,0,0,0,0,0"},{"p":90,"sValue":"0,0,0,0,0,0,0,0"},{"p":91,"sValue":"0,0,0,0,0,0,0,0"},{"p":92,"sValue":"0,0,0,0,0,0,0,0"},{"p":93,"sValue":"0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"179"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0,0,0,0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"900,0,0,0,0"},{"p":135,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":136,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":137,"sValue":"1440001"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":140,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":143,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":144,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":147,"sValue":"0,0,0,0,0,0,0,0,0,0,0,1800001,0,0,0,0,0,0,0,0,0"},{"p":148,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":149,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":150,"sValue":"0,0,0,0,0,0,0,0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0"},{"p":155,"sValue":"0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0"},{"p":159,"sValue":"0"},{"p":160,"sValue":"0"},{"p":161,"sValue":"0"},{"p":162,"sValue":"0"},{"p":163,"sValue":"0"},{"p":164,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":12,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":13,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":14,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":81,"sValue":"0,0,0,0,0,0,0,0"},{"p":82,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":83,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":84,"sValue":"0,0,0,0,0,0,0,0"},{"p":85,"sValue":"0,0,0,0,0,0,0,0"},{"p":86,"sValue":"0,0,0,0,0,0,0,0"},{"p":87,"sValue":"0,0,0,0,0,0,0,0"},{"p":88,"sValue":"0,0,0,0,0,0,0,0"},{"p":89,"sValue":"0,0,0,0,0,0,0,0"},{"p":90,"sValue":"0,0,0,0,0,0,0,0"},{"p":91,"sValue":"0,0,0,0,0,0,0,0"},{"p":92,"sValue":"0,0,0,0,0,0,0,0"},{"p":93,"sValue":"0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"0"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0,0,0,0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"0,0,0,0,0"},{"p":135,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":136,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":137,"sValue":"0"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":140,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":143,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":144,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":147,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":148,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":149,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":150,"sValue":"0,0,0,0,0,0,0,0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0"},{"p":155,"sValue":"0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0"},{"p":159,"sValue":"0"},{"p":160,"sValue":"0"},{"p":161,"sValue":"0"},{"p":162,"sValue":"0"},{"p":163,"sValue":"0"},{"p":164,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":12,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":13,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":14,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":81,"sValue":"0,0,0,0,0,0,0,0"},{"p":82,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":83,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":84,"sValue":"0,0,0,0,0,0,0,0"},{"p":85,"sValue":"0,0,0,0,0,0,0,0"},{"p":86,"sValue":"0,0,0,0,0,0,0,0"},{"p":87,"sValue":"0,0,0,0,0,0,0,0"},{"p":88,"sValue":"0,0,0,0,0,0,0,0"},{"p":89,"sValue":"0,0,0,0,0,0,0,0"},{"p":90,"sValue":"0,0,0,0,0,0,0,0"},{"p":91,"sValue":"0,0,0,0,0,0,0,0"},{"p":92,"sValue":"0,0,0,0,0,0,0,0"},{"p":93,"sValue":"0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"0"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0,0,0,0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"0,0,0,0,0"},{"p":135,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":136,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":137,"sValue":"0"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":140,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":143,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":144,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":147,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":148,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":149,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":150,"sValue":"0,0,0,0,0,0,0,0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0"},{"p":155,"sValue":"0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0"},{"p":159,"sValue":"0"},{"p":160,"sValue":"0"},{"p":161,"sValue":"0"},{"p":162,"sValue":"0"},{"p":163,"sValue":"0"},{"p":164,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRSectorCarrier_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber256","pmCounterNumber257","pmCounterNumber258","pmCounterNumber259","pmCounterNumber260","pmCounterNumber261","pmCounterNumber262","pmCounterNumber263","pmCounterNumber263On","pmCounterNumber265","pmCounterNumber266","pmCounterNumber267","pmCounterNumber267Auto","pmCounterNumber267AutoCbrs","pmCounterNumber267Man","pmCounterNumber267ManCbrs"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRSectorCarrier=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,15,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"10000"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRSectorCarrier=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,15,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"15000"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRSectorCarrier=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"15,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRSectorCarrier=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"15,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EUtranCellFDD"},"measTypes":{"sMeasTypesList":["pmCounterNumber272","pmCounterNumber273","pmCounterNumber274","pmCounterNumber275","pmCounterNumber276","pmCounterNumber277","pmCounterNumber278"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellDU_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber279","pmCounterNumber280","pmCounterNumber281","pmCounterNumber282","pmCounterNumber283","pmCounterNumber284","pmCounterNumber285","pmCounterNumber286","pmCounterNumber287","pmCounterNumber288","pmCounterNumber289","pmCounterNumber290","pmCounterNumber291","pmCounterNumber292","pmCounterNumber293","pmCounterNumber294","pmCounterNumber295","pmCounterNumber296","pmCounterNumber274"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0"},{"p":3,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0"},{"p":3,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0"},{"p":3,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0"},{"p":3,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":4,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0,0,0,0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EUtranCellFDD"},"measTypes":{"sMeasTypesList":["pmCounterNumber297"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellDU_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber297F0Distr","pmCounterNumber297F2Distr"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=GNBCUCPFunction_GNBCUCP"},"measTypes":{"sMeasTypesList":["pmCounterNumber300","pmCounterNumber301","pmCounterNumber302","pmCounterNumber303","pmCounterNumber304","pmCounterNumber305"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"180"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellCU_GNBCUCP"},"measTypes":{"sMeasTypesList":["pmCounterNumber306","pmCounterNumber307","pmCounterNumber308","pmCounterNumber309","pmCounterNumber310","pmCounterNumber311","pmCounterNumber312","pmCounterNumber313","pmCounterNumber314","pmCounterNumber315","pmCounterNumber316","pmCounterNumber317","pmCounterNumber318","pmCounterNumber319","pmCounterNumber320","pmCounterNumber321","pmCounterNumber322","pmCounterNumber323","pmCounterNumber324","pmCounterNumber324Act","pmCounterNumber326","pmCounterNumber326Act","pmCounterNumber328","pmCounterNumber329","pmCounterNumber330","pmCounterNumber331","pmCounterNumber332","pmCounterNumber333","pmCounterNumber334","pmCounterNumber335","pmCounterNumber336","pmCounterNumber337","pmCounterNumber338","pmCounterNumber339","pmCounterNumber340","pmCounterNumber341","pmCounterNumber342","pmCounterNumber343","pmCounterNumber343Mos","pmCounterNumber345","pmCounterNumber345Mos","pmCounterNumber347","pmCounterNumber348","pmCounterNumber349","pmCounterNumber350","pmCounterNumber350Mos","pmCounterNumber350Reatt","pmCounterNumber350ReattMos","pmCounterNumber354","pmCounterNumber354Mos","pmCounterNumber301","pmCounterNumber302","pmCounterNumber303","pmCounterNumber304","pmCounterNumber305","pmCounterNumber356","pmCounterNumber357","pmCounterNumber358"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"180"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"180"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"180"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"180"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"180"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"180"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"180"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"180"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"180"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"180"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"180"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"180"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=GNBDUFunction_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber359","pmCounterNumber360","pmCounterNumber361","pmCounterNumber362","pmCounterNumber363","pmCounterNumber364","pmCounterNumber365","pmCounterNumber366","pmCounterNumber367","pmCounterNumber368","pmCounterNumber369","pmCounterNumber370","pmCounterNumber371","pmCounterNumber372","pmCounterNumber373","pmCounterNumber374","pmCounterNumber375","pmCounterNumber376","pmCounterNumber377"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"32"},{"p":6,"sValue":"16"},{"p":7,"sValue":"0"},{"p":8,"sValue":"16"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellDU_GNBDU"},"measTypes":{"sMeasTypesList":["pmCounterNumber378","pmCounterNumber379","pmCounterNumber380","pmCounterNumber381","pmCounterNumber382","pmCounterNumber383","pmCounterNumber384","pmCounterNumber385","pmCounterNumber386","pmCounterNumber306","pmCounterNumber307","pmCounterNumber307ual","pmCounterNumber388","pmCounterNumber389","pmCounterNumber390","pmCounterNumber391","pmCounterNumber392","pmCounterNumber393","pmCounterNumber394","pmCounterNumber395","pmCounterNumber396","pmCounterNumber397","pmCounterNumber398","pmCounterNumber399","pmCounterNumber399Broadcasting","pmCounterNumber401","pmCounterNumber402","pmCounterNumber403","pmCounterNumber404","pmCounterNumber405","pmCounterNumber406","pmCounterNumber407","pmCounterNumber407Qos","pmCounterNumber409","pmCounterNumber410","pmCounterNumber410Drb","pmCounterNumber410DrbQos","pmCounterNumber413","pmCounterNumber413ResUe","pmCounterNumber415","pmCounterNumber416","pmCounterNumber417","pmCounterNumber418","pmCounterNumber419","pmCounterNumber420","pmCounterNumber421","pmCounterNumber422","pmCounterNumber423","pmCounterNumber424","pmCounterNumber425","pmCounterNumber426","pmCounterNumber427","pmCounterNumber428","pmCounterNumber429","pmCounterNumber430","pmCounterNumber431","pmCounterNumber432","pmCounterNumber433","pmCounterNumber434","pmCounterNumber435","pmCounterNumber436","pmCounterNumber437","pmCounterNumber438","pmCounterNumber439","pmCounterNumber440","pmCounterNumber441"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"1800000"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"1800001"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"3032642268"},{"p":18,"sValue":"20160056"},{"p":19,"sValue":"15120000"},{"p":20,"sValue":"816482268"},{"p":21,"sValue":"0"},{"p":22,"sValue":"2880"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"3780540"},{"p":26,"sValue":"2520"},{"p":27,"sValue":"0"},{"p":28,"sValue":"900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"5760004"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"1440004"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":46,"sValue":"2,1,1,2,2,3,2,1,1,0,0,0"},{"p":47,"sValue":"15"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"60"},{"p":54,"sValue":"15"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"179"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"1800000"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"1800001"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"5110563822"},{"p":18,"sValue":"20160056"},{"p":19,"sValue":"15120000"},{"p":20,"sValue":"1375923822"},{"p":21,"sValue":"0"},{"p":22,"sValue":"5376"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"3780504"},{"p":26,"sValue":"2352"},{"p":27,"sValue":"0"},{"p":28,"sValue":"900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"5760004"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"1440004"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":46,"sValue":"3,1,2,1,2,0,3,2,0,0,0,0"},{"p":47,"sValue":"14"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"56"},{"p":54,"sValue":"14"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"179"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"900"},{"p":12,"sValue":"900"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":46,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBDUFunction=1,NRCellDU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"900"},{"p":12,"sValue":"900"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":46,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=PpControlLink_GNBCUUP"},"measTypes":{"sMeasTypesList":["pmCounterNumber310","pmCounterNumber311","pmCounterNumber312","pmCounterNumber313","pmCounterNumber314","pmCounterNumber347","pmCounterNumber348","pmCounterNumber349"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUUPFunction=1,PpControlTermination=1,PpControlLink=internal","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"900"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"900"},{"p":8,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EUtranCellFDD"},"measTypes":{"sMeasTypesList":["pmCounterNumber442","pmCounterNumber443","pmCounterNumber444","pmCounterNumber445","pmCounterNumber446","pmCounterNumber447","pmCounterNumber448","pmCounterNumber448PCell","pmCounterNumber448SCell","pmCounterNumber448Volte","pmCounterNumber452","pmCounterNumber453","pmCounterNumber454","pmCounterNumber455","pmCounterNumber114","pmCounterNumber456","pmCounterNumber457","pmCounterNumber458","pmCounterNumber122","pmCounterNumber459","pmCounterNumber460","pmCounterNumber461","pmCounterNumber462","pmCounterNumber131","pmCounterNumber463","pmCounterNumber464","pmCounterNumber143","pmCounterNumber145","pmCounterNumber147","pmCounterNumber14916qam","pmCounterNumber149256Qam","pmCounterNumber14964Qam","pmCounterNumber149Iua16qam","pmCounterNumber149IuaQpsk","pmCounterNumber149Qpsk","pmCounterNumber471","pmCounterNumber472","pmCounterNumber473","pmCounterNumber474","pmCounterNumber475","pmCounterNumber476","pmCounterNumber477","pmCounterNumber478","pmCounterNumber248","pmCounterNumber249","pmCounterNumber479","pmCounterNumber250","pmCounterNumber251"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=FieldReplaceableUnit"},"measTypes":{"sMeasTypesList":["pmCounterNumber480","pmCounterNumber481"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"4,4,4"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"4,4,4"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"4,4,4"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":" , , "}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1","suspectFlag":"false","measResults":[{"p":1,"sValue":" "},{"p":2,"sValue":"4,4,4"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=RiEthernetPort"},"measTypes":{"sMeasTypesList":["pmCounterNumber482","pmCounterNumber483","pmCounterNumber484","pmCounterNumber485","pmCounterNumber486","pmCounterNumber487","pmCounterNumber488","pmCounterNumber489","pmCounterNumber490","pmCounterNumber491"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=P,RiEthernetPort=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"51885"},{"p":3,"sValue":"4628315"},{"p":4,"sValue":"9190"},{"p":5,"sValue":"0"},{"p":6,"sValue":"15493"},{"p":7,"sValue":"1956503"},{"p":8,"sValue":"7326"},{"p":9,"sValue":"0"},{"p":10,"sValue":" "}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=N,RiEthernetPort=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"37309"},{"p":3,"sValue":"2868954"},{"p":4,"sValue":"4551"},{"p":5,"sValue":"0"},{"p":6,"sValue":"915"},{"p":7,"sValue":"380361"},{"p":8,"sValue":"4549"},{"p":9,"sValue":"0"},{"p":10,"sValue":" "}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=B,RiEthernetPort=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"15490"},{"p":3,"sValue":"1512626"},{"p":4,"sValue":"7326"},{"p":5,"sValue":"0"},{"p":6,"sValue":"51883"},{"p":7,"sValue":"3492085"},{"p":8,"sValue":"9190"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=A,RiEthernetPort=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"916"},{"p":3,"sValue":"260228"},{"p":4,"sValue":"4549"},{"p":5,"sValue":"0"},{"p":6,"sValue":"37309"},{"p":7,"sValue":"2097258"},{"p":8,"sValue":"4551"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=RiLink"},"measTypes":{"sMeasTypesList":["pmCounterNumber492","pmCounterNumber493","pmCounterNumber494","pmCounterNumber495"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,RiLink=S3-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"1077"},{"p":2,"sValue":"1076"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,RiLink=S2-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"450"},{"p":2,"sValue":"450"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,RiLink=S1-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"427"},{"p":2,"sValue":"427"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,RiLink=R608-2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"2147483647"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,RiLink=R608-1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"2147483647"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=RiPort"},"measTypes":{"sMeasTypesList":["pmCounterNumber496","pmCounterNumber497","pmCounterNumber498"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,RiPort=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,RiPort=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,RiPort=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,RiPort=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,RiPort=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,RiPort=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=P","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=N","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=B","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,RiPort=A","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=K","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=C","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=B","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,RiPort=A","suspectFlag":"false","measResults":[{"p":1,"sValue":"0,0,0,0,0,0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=SfpChannel"},"measTypes":{"sMeasTypesList":["pmCounterNumber499","pmCounterNumber500","pmCounterNumber501"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=P,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2951"},{"p":2,"sValue":"3600"},{"p":3,"sValue":"2922"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=N,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"3018"},{"p":2,"sValue":"4200"},{"p":3,"sValue":"2953"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=K,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2809"},{"p":2,"sValue":"3500"},{"p":3,"sValue":"2812"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,SfpModule=DATA_2,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,SfpModule=DATA_2,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,SfpModule=DATA_2,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,SfpModule=DATA_1,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2810"},{"p":2,"sValue":"3100"},{"p":3,"sValue":"2830"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,SfpModule=DATA_1,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2717"},{"p":2,"sValue":"3600"},{"p":3,"sValue":"2775"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,SfpModule=DATA_1,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2700"},{"p":2,"sValue":"3900"},{"p":3,"sValue":"2773"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=C,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=B,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2744"},{"p":2,"sValue":"3200"},{"p":3,"sValue":"2775"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=B,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2863"},{"p":2,"sValue":"3800"},{"p":3,"sValue":"2898"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=A,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2684"},{"p":2,"sValue":"3900"},{"p":3,"sValue":"2737"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=A,SfpChannel=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"2892"},{"p":2,"sValue":"4400"},{"p":3,"sValue":"2893"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=SfpModule"},"measTypes":{"sMeasTypesList":["pmCounterNumber502","pmCounterNumber503"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,SfpModule=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,SfpModule=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"1310"},{"p":2,"sValue":"32552"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,SfpModule=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,SfpModule=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"1430"},{"p":2,"sValue":"32904"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,SfpModule=DATA_2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,SfpModule=DATA_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"1410"},{"p":2,"sValue":"33141"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=P","suspectFlag":"false","measResults":[{"p":1,"sValue":"1388"},{"p":2,"sValue":"32558"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=N","suspectFlag":"false","measResults":[{"p":1,"sValue":"1384"},{"p":2,"sValue":"32505"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=B","suspectFlag":"false","measResults":[{"p":1,"sValue":"1297"},{"p":2,"sValue":"32999"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,SfpModule=A","suspectFlag":"false","measResults":[{"p":1,"sValue":"1297"},{"p":2,"sValue":"33041"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=K","suspectFlag":"false","measResults":[{"p":1,"sValue":"1474"},{"p":2,"sValue":"32588"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=C","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=B","suspectFlag":"false","measResults":[{"p":1,"sValue":"1463"},{"p":2,"sValue":"32493"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,SfpModule=A","suspectFlag":"false","measResults":[{"p":1,"sValue":"1464"},{"p":2,"sValue":"32534"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EthernetPort"},"measTypes":{"sMeasTypesList":["pmCounterNumber482","pmCounterNumber483","pmCounterNumber484","pmCounterNumber485","pmCounterNumber486","pmCounterNumber487","pmCounterNumber488","pmCounterNumber489","pmCounterNumber504","pmCounterNumber490","pmCounterNumber505","pmCounterNumber506","pmCounterNumber507","pmCounterNumber491"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Transport=1,EthernetPort=TN_IDL_B_1","suspectFlag":"false","measResults":[{"p":1,"sValue":"22345"},{"p":2,"sValue":"1057"},{"p":3,"sValue":"2921772"},{"p":4,"sValue":"4472"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"9147991"},{"p":8,"sValue":"17099"},{"p":9,"sValue":"0"},{"p":10,"sValue":"7627"},{"p":11,"sValue":"3582"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=InterfaceIPv4"},"measTypes":{"sMeasTypesList":["pmCounterNumber508","pmCounterNumber509","pmCounterNumber510","pmCounterNumber511","pmCounterNumber512","pmCounterNumber513","pmCounterNumber514","pmCounterNumber515","pmCounterNumber516","pmCounterNumber517"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Transport=1,Router=vr_OAM,InterfaceIPv4=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"314834"},{"p":2,"sValue":"4561"},{"p":3,"sValue":"8697703"},{"p":4,"sValue":"16811"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,Router=vr_NR,InterfaceIPv4=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"19900"},{"p":2,"sValue":"388"},{"p":3,"sValue":"1260"},{"p":4,"sValue":"30"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,Router=vr_LTE,InterfaceIPv4=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"26656"},{"p":2,"sValue":"574"},{"p":3,"sValue":"14580"},{"p":4,"sValue":"243"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,Router=Node_Internal_F1,InterfaceIPv4=NRDU","suspectFlag":"false","measResults":[{"p":1,"sValue":" "},{"p":2,"sValue":" "},{"p":3,"sValue":" "},{"p":4,"sValue":" "},{"p":5,"sValue":" "},{"p":6,"sValue":" "},{"p":7,"sValue":" "},{"p":8,"sValue":" "},{"p":9,"sValue":" "},{"p":10,"sValue":" "}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,Router=Node_Internal_F1,InterfaceIPv4=NRCUCP","suspectFlag":"false","measResults":[{"p":1,"sValue":" "},{"p":2,"sValue":" "},{"p":3,"sValue":" "},{"p":4,"sValue":" "},{"p":5,"sValue":" "},{"p":6,"sValue":" "},{"p":7,"sValue":" "},{"p":8,"sValue":" "},{"p":9,"sValue":" "},{"p":10,"sValue":" "}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=SctpAssociation"},"measTypes":{"sMeasTypesList":["pmCounterNumber518","pmCounterNumber519","pmCounterNumber520","pmCounterNumber521","pmCounterNumber522","pmCounterNumber523","pmCounterNumber524","pmCounterNumber525","pmCounterNumber526","pmCounterNumber527","pmCounterNumber528","pmCounterNumber529"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Transport=1,SctpEndpoint=F1_NRDU,SctpAssociation=38472-10.0.0.1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"833"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"87820"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"87820"},{"p":12,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,SctpEndpoint=F1_NRCUCP,SctpAssociation=38472-10.0.0.2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"833"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"87820"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"87820"},{"p":12,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=VlanPort"},"measTypes":{"sMeasTypesList":["pmCounterNumber482","pmCounterNumber483","pmCounterNumber484","pmCounterNumber485","pmCounterNumber486","pmCounterNumber487","pmCounterNumber488","pmCounterNumber489","pmCounterNumber507"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Transport=1,VlanPort=vr_OAM.IF1","suspectFlag":"false","measResults":[{"p":1,"sValue":"1996"},{"p":2,"sValue":"341"},{"p":3,"sValue":"657544"},{"p":4,"sValue":"4205"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"9067777"},{"p":8,"sValue":"16814"},{"p":9,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,VlanPort=vr_NR.IF1","suspectFlag":"false","measResults":[{"p":1,"sValue":"8457"},{"p":2,"sValue":"343"},{"p":3,"sValue":"711892"},{"p":4,"sValue":"33"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"2368"},{"p":8,"sValue":"37"},{"p":9,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,Transport=1,VlanPort=vr_LTE.IF1","suspectFlag":"false","measResults":[{"p":1,"sValue":"11894"},{"p":2,"sValue":"343"},{"p":3,"sValue":"1006906"},{"p":4,"sValue":"234"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"20246"},{"p":8,"sValue":"248"},{"p":9,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=ConsumedEnergyMeasurement"},"measTypes":{"sMeasTypesList":["pmCounterNumber530","pmCounterNumber530Accumulated","pmCounterNumber532"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,NodeSupport=1,ConsumedEnergyMeasurement=1","suspectFlag":"true","measResults":[{"p":1,"sValue":" "},{"p":2,"sValue":" "},{"p":3,"sValue":" , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EnergyMeter"},"measTypes":{"sMeasTypesList":["pmCounterNumber530","pmCounterNumber530Accumulated","pmCounterNumber532","pmCounterNumber533"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,EnergyMeter=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"83"},{"p":2,"sValue":"34846"},{"p":3,"sValue":"333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,334,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333,333"},{"p":4,"sValue":"52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S1-1,EnergyMeter=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"12"},{"p":2,"sValue":"4947"},{"p":3,"sValue":"47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47,47"},{"p":4,"sValue":"53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S2-1,EnergyMeter=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"13"},{"p":2,"sValue":"5394"},{"p":3,"sValue":"52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,51,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52"},{"p":4,"sValue":"54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=Radio-S3-1,EnergyMeter=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"22"},{"p":2,"sValue":"9338"},{"p":3,"sValue":"89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89,89"},{"p":4,"sValue":"53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,52,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,52,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=R608,EnergyMeter=1","suspectFlag":"true","measResults":[{"p":1,"sValue":" "},{"p":2,"sValue":" "},{"p":3,"sValue":" , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "},{"p":4,"sValue":" , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=SupportUnit"},"measTypes":{"sMeasTypesList":["pmCounterNumber534"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,SupportUnit=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"18,18,18"}]},{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,SupportUnit=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"30,30,30"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=BbProcessingResource"},"measTypes":{"sMeasTypesList":["pmCounterNumber535","pmCounterNumber367","pmCounterNumber368","pmCounterNumber369","pmCounterNumber370","pmCounterNumber536","pmCounterNumber537","pmCounterNumber538","pmCounterNumber539","pmCounterNumber540","pmCounterNumber541","pmCounterNumber542","pmCounterNumber543","pmCounterNumber374","pmCounterNumber375","pmCounterNumber376","pmCounterNumber377","pmCounterNumber544","pmCounterNumber545","pmCounterNumber546","pmCounterNumber547","pmCounterNumber548","pmCounterNumber549","pmCounterNumber550","pmCounterNumber551"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,BbProcessingResource=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":20,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=ENodeBFunction"},"measTypes":{"sMeasTypesList":["pmCounterNumber359Aas","pmCounterNumber360Aas","pmCounterNumber554","pmCounterNumber555","pmCounterNumber365Actual","pmCounterNumber366Actual","pmCounterNumber558","pmCounterNumber559","pmCounterNumber560","pmCounterNumber561","pmCounterNumber562","pmCounterNumber563","pmCounterNumber564","pmCounterNumber565","pmCounterNumber566","pmCounterNumber567","pmCounterNumber568","pmCounterNumber569","pmCounterNumber570","pmCounterNumber571","pmCounterNumber572","pmCounterNumber573"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"5"},{"p":8,"sValue":"900,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"180"},{"p":10,"sValue":"0"},{"p":11,"sValue":"8000"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"10000"},{"p":15,"sValue":"1800"},{"p":16,"sValue":"10000"},{"p":17,"sValue":"1800"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EUtranCellFDD"},"measTypes":{"sMeasTypesList":["pmCounterNumber306","pmCounterNumber307","pmCounterNumber574","pmCounterNumber575","pmCounterNumber576","pmCounterNumber577","pmCounterNumber578","pmCounterNumber579","pmCounterNumber580","pmCounterNumber581","pmCounterNumber582","pmCounterNumber33","pmCounterNumber34","pmCounterNumber329","pmCounterNumber330","pmCounterNumber583","pmCounterNumber583Arp","pmCounterNumber583Csfb","pmCounterNumber583CsfbArp","pmCounterNumber583CsfbQci","pmCounterNumber583HoOngoing","pmCounterNumber583HoOngoingArp","pmCounterNumber583HoOngoingQci","pmCounterNumber583Qci","pmCounterNumber592","pmCounterNumber592Arp","pmCounterNumber594","pmCounterNumber595","pmCounterNumber596","pmCounterNumber597","pmCounterNumber598","pmCounterNumber599","pmCounterNumber599Arp","pmCounterNumber599Qci","pmCounterNumber602","pmCounterNumber602Arp","pmCounterNumber604","pmCounterNumber605","pmCounterNumber606","pmCounterNumber607","pmCounterNumber608","pmCounterNumber609","pmCounterNumber610","pmCounterNumber611","pmCounterNumber612","pmCounterNumber613","pmCounterNumber614","pmCounterNumber615","pmCounterNumber616","pmCounterNumber617","pmCounterNumber618","pmCounterNumber619","pmCounterNumber620","pmCounterNumber621","pmCounterNumber409","pmCounterNumber622","pmCounterNumber623","pmCounterNumber624","pmCounterNumber625","pmCounterNumber626","pmCounterNumber627","pmCounterNumber413ResUe","pmCounterNumber570","pmCounterNumber213Ce","pmCounterNumber629","pmCounterNumber630","pmCounterNumber631","pmCounterNumber631Uu","pmCounterNumber633","pmCounterNumber634","pmCounterNumber635","pmCounterNumber636","pmCounterNumber637","pmCounterNumber637FiltQci","pmCounterNumber637LastTTI","pmCounterNumber637LastTTIQci","pmCounterNumber641","pmCounterNumber642","pmCounterNumber643","pmCounterNumber350","pmCounterNumber350Ce","pmCounterNumber350Dta","pmCounterNumber350DtaCe","pmCounterNumber350Reatt","pmCounterNumber350ReattCe","pmCounterNumber350ReattDta","pmCounterNumber350ReattDtaCe","pmCounterNumber650","pmCounterNumber650ActiveUsers","pmCounterNumber652","pmCounterNumber652Ce","pmCounterNumber654","pmCounterNumber654Ce","pmCounterNumber354","pmCounterNumber354Ce","pmCounterNumber354Dta","pmCounterNumber354DtaCe","pmCounterNumber354GummeiNative","pmCounterNumber660","pmCounterNumber661","pmCounterNumber662","pmCounterNumber663","pmCounterNumber664","pmCounterNumber664Ce","pmCounterNumber664Dta","pmCounterNumber664DtaCe","pmCounterNumber664Em","pmCounterNumber664Hpa","pmCounterNumber664Mod","pmCounterNumber664ModCe","pmCounterNumber664Mos","pmCounterNumber664Mta","pmCounterNumber664MtaCe","pmCounterNumber675","pmCounterNumber675Ce","pmCounterNumber677","pmCounterNumber677Ce","pmCounterNumber677Dta","pmCounterNumber677DtaCe","pmCounterNumber677Em","pmCounterNumber677Hpa","pmCounterNumber677Mod","pmCounterNumber677ModCe","pmCounterNumber677Mos","pmCounterNumber677Mta","pmCounterNumber677MtaCe","pmCounterNumber688","pmCounterNumber689","pmCounterNumber690","pmCounterNumber691","pmCounterNumber692","pmCounterNumber693","pmCounterNumber694","pmCounterNumber694Em","pmCounterNumber696","pmCounterNumber696Em","pmCounterNumber698","pmCounterNumber699","pmCounterNumber699Em","pmCounterNumber701","pmCounterNumber701Em","pmCounterNumber703","pmCounterNumber704","pmCounterNumber705","pmCounterNumber706","pmCounterNumber7062","pmCounterNumber708","pmCounterNumber709","pmCounterNumber710","pmCounterNumber711","pmCounterNumber712","pmCounterNumber713","pmCounterNumber714","pmCounterNumber715","pmCounterNumber716","pmCounterNumber717","pmCounterNumber718","pmCounterNumber719","pmCounterNumber720"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"900"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0,0,0,0"},{"p":48,"sValue":"0,0,0,0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0,0,0,0"},{"p":54,"sValue":"0,0,0,0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":59,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0,0,0,0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0,0,0,0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0,0,0,0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0,0,0,0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0,0,0,0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0,0,0,0"},{"p":92,"sValue":"0"},{"p":93,"sValue":"0,0,0,0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0,0,0,0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0,0,0,0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0,0,0,0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0,0,0,0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0,0,0,0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0,0,0,0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"0,0,0,0"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0,0,0,0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0,0,0,0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"0"},{"p":135,"sValue":"0"},{"p":136,"sValue":"0"},{"p":137,"sValue":"0"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0"},{"p":140,"sValue":"0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0"},{"p":143,"sValue":"0"},{"p":144,"sValue":"0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0"},{"p":147,"sValue":"0"},{"p":148,"sValue":"0"},{"p":149,"sValue":"0"},{"p":150,"sValue":"0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":155,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0,0,0,0,0,0,0,0"},{"p":159,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"900"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0,0,0,0"},{"p":48,"sValue":"0,0,0,0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0,0,0,0"},{"p":54,"sValue":"0,0,0,0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":59,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0,0,0,0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"},{"p":74,"sValue":"0"},{"p":75,"sValue":"0"},{"p":76,"sValue":"0"},{"p":77,"sValue":"0"},{"p":78,"sValue":"0"},{"p":79,"sValue":"0"},{"p":80,"sValue":"0"},{"p":81,"sValue":"0,0,0,0"},{"p":82,"sValue":"0"},{"p":83,"sValue":"0,0,0,0"},{"p":84,"sValue":"0"},{"p":85,"sValue":"0,0,0,0"},{"p":86,"sValue":"0"},{"p":87,"sValue":"0,0,0,0"},{"p":88,"sValue":"0"},{"p":89,"sValue":"0"},{"p":90,"sValue":"0"},{"p":91,"sValue":"0,0,0,0"},{"p":92,"sValue":"0"},{"p":93,"sValue":"0,0,0,0"},{"p":94,"sValue":"0"},{"p":95,"sValue":"0,0,0,0"},{"p":96,"sValue":"0"},{"p":97,"sValue":"0,0,0,0"},{"p":98,"sValue":"0"},{"p":99,"sValue":"0"},{"p":100,"sValue":"0"},{"p":101,"sValue":"0"},{"p":102,"sValue":"0"},{"p":103,"sValue":"0"},{"p":104,"sValue":"0,0,0,0"},{"p":105,"sValue":"0"},{"p":106,"sValue":"0,0,0,0"},{"p":107,"sValue":"0"},{"p":108,"sValue":"0"},{"p":109,"sValue":"0"},{"p":110,"sValue":"0,0,0,0"},{"p":111,"sValue":"0"},{"p":112,"sValue":"0"},{"p":113,"sValue":"0,0,0,0"},{"p":114,"sValue":"0"},{"p":115,"sValue":"0,0,0,0"},{"p":116,"sValue":"0"},{"p":117,"sValue":"0,0,0,0"},{"p":118,"sValue":"0"},{"p":119,"sValue":"0,0,0,0"},{"p":120,"sValue":"0"},{"p":121,"sValue":"0"},{"p":122,"sValue":"0"},{"p":123,"sValue":"0,0,0,0"},{"p":124,"sValue":"0"},{"p":125,"sValue":"0"},{"p":126,"sValue":"0,0,0,0"},{"p":127,"sValue":"0"},{"p":128,"sValue":"0"},{"p":129,"sValue":"0"},{"p":130,"sValue":"0"},{"p":131,"sValue":"0"},{"p":132,"sValue":"0"},{"p":133,"sValue":"0"},{"p":134,"sValue":"0"},{"p":135,"sValue":"0"},{"p":136,"sValue":"0"},{"p":137,"sValue":"0"},{"p":138,"sValue":"0"},{"p":139,"sValue":"0"},{"p":140,"sValue":"0"},{"p":141,"sValue":"0"},{"p":142,"sValue":"0"},{"p":143,"sValue":"0"},{"p":144,"sValue":"0"},{"p":145,"sValue":"0"},{"p":146,"sValue":"0"},{"p":147,"sValue":"0"},{"p":148,"sValue":"0"},{"p":149,"sValue":"0"},{"p":150,"sValue":"0"},{"p":151,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":152,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":153,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":154,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":155,"sValue":"0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"},{"p":156,"sValue":"0"},{"p":157,"sValue":"0"},{"p":158,"sValue":"0,0,0,0,0,0,0,0"},{"p":159,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=BbProcessingResource"},"measTypes":{"sMeasTypesList":["pmCounterNumber550Burst","pmCounterNumber550Format","pmCounterNumber550X2Fwd","pmCounterNumber724","pmCounterNumber725"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,Equipment=1,FieldReplaceableUnit=BB-1,BbProcessingResource=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=EUtranCellFDD"},"measTypes":{"sMeasTypesList":["pmCounterNumber726","pmCounterNumber727","pmCounterNumber728","pmCounterNumber729","pmCounterNumber730","pmCounterNumber731","pmCounterNumber732","pmCounterNumber733","pmCounterNumber734","pmCounterNumber735","pmCounterNumber629CatMDrxNoSyncQci","pmCounterNumber629CatMDrxSyncQci","pmCounterNumber629CatMNoDrxNoSyncQci","pmCounterNumber629CatMNoDrxSyncQci","pmCounterNumber629DrxNoSyncQci","pmCounterNumber629DrxSync","pmCounterNumber629DrxSyncQci","pmCounterNumber629NoDrxNoSyncQci","pmCounterNumber629NoDrxSyncQci","pmCounterNumber629Qci","pmCounterNumber630CatMDrxNoSyncQci","pmCounterNumber630CatMDrxSyncQci","pmCounterNumber630CatMNoDrxNoSyncQci","pmCounterNumber630CatMNoDrxSyncQci","pmCounterNumber630DrxNoSyncQci","pmCounterNumber630DrxSync","pmCounterNumber630DrxSyncQci","pmCounterNumber630NoDrxNoSyncQci","pmCounterNumber630NoDrxSyncQci","pmCounterNumber630Qci","pmCounterNumber756","pmCounterNumber756Qci","pmCounterNumber758","pmCounterNumber758Qci","pmCounterNumber631Qci","pmCounterNumber631UuQci","pmCounterNumber762","pmCounterNumber633Limitations","pmCounterNumber633MissingPdus2Qci","pmCounterNumber633Qci","pmCounterNumber633RohcFail2Qci","pmCounterNumber633SrbTooLarge","pmCounterNumber768","pmCounterNumber769","pmCounterNumber770","pmCounterNumber771","pmCounterNumber771Qci","pmCounterNumber634Qci","pmCounterNumber635Qci","pmCounterNumber775","pmCounterNumber637Ca","pmCounterNumber637LastTTICa","pmCounterNumber637Qci","pmCounterNumber637TransPlmn0","pmCounterNumber637TransPlmn1","pmCounterNumber637TransPlmn2","pmCounterNumber637TransPlmn3","pmCounterNumber637TransPlmn4","pmCounterNumber637TransPlmn5","pmCounterNumber637TransPlmn6","pmCounterNumber637TransQci","pmCounterNumber787","pmCounterNumber641Trans","pmCounterNumber789","pmCounterNumber642Plmn0","pmCounterNumber642Plmn1","pmCounterNumber642Plmn2","pmCounterNumber642Plmn3","pmCounterNumber642Plmn4","pmCounterNumber642Plmn5","pmCounterNumber642Plmn6","pmCounterNumber642Qci","pmCounterNumber798"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,ENodeBFunction=1,EUtranCellFDD=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":6,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":7,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":8,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":9,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":10,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":11,"sValue":"0"},{"p":12,"sValue":"0"},{"p":13,"sValue":"0"},{"p":14,"sValue":"0"},{"p":15,"sValue":"0"},{"p":16,"sValue":"0"},{"p":17,"sValue":"0"},{"p":18,"sValue":"0"},{"p":19,"sValue":"0"},{"p":20,"sValue":"0"},{"p":21,"sValue":"0"},{"p":22,"sValue":"0"},{"p":23,"sValue":"0"},{"p":24,"sValue":"0"},{"p":25,"sValue":"0"},{"p":26,"sValue":"0"},{"p":27,"sValue":"0"},{"p":28,"sValue":"0"},{"p":29,"sValue":"0"},{"p":30,"sValue":"0"},{"p":31,"sValue":"0"},{"p":32,"sValue":"0"},{"p":33,"sValue":"0"},{"p":34,"sValue":"0"},{"p":35,"sValue":"0"},{"p":36,"sValue":"0"},{"p":37,"sValue":"0"},{"p":38,"sValue":"0"},{"p":39,"sValue":"0"},{"p":40,"sValue":"0"},{"p":41,"sValue":"0"},{"p":42,"sValue":"0,0,0,0,0,0,0,0,0,0"},{"p":43,"sValue":"0"},{"p":44,"sValue":"0"},{"p":45,"sValue":"0"},{"p":46,"sValue":"0"},{"p":47,"sValue":"0"},{"p":48,"sValue":"0"},{"p":49,"sValue":"0"},{"p":50,"sValue":"0"},{"p":51,"sValue":"0"},{"p":52,"sValue":"0"},{"p":53,"sValue":"0"},{"p":54,"sValue":"0"},{"p":55,"sValue":"0"},{"p":56,"sValue":"0"},{"p":57,"sValue":"0"},{"p":58,"sValue":"0"},{"p":59,"sValue":"0"},{"p":60,"sValue":"0"},{"p":61,"sValue":"0"},{"p":62,"sValue":"0"},{"p":63,"sValue":"0"},{"p":64,"sValue":"0"},{"p":65,"sValue":"0"},{"p":66,"sValue":"0"},{"p":67,"sValue":"0"},{"p":68,"sValue":"0"},{"p":69,"sValue":"0"},{"p":70,"sValue":"0"},{"p":71,"sValue":"0"},{"p":72,"sValue":"0"},{"p":73,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=GNBCUUPFunction_GNBCUUP"},"measTypes":{"sMeasTypesList":["pmCounterNumber799","pmCounterNumber799Gtpu","pmCounterNumber799NoCtxt","pmCounterNumber802","pmCounterNumber803","pmCounterNumber804","pmCounterNumber805","pmCounterNumber806","pmCounterNumber807","pmCounterNumber808"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUUPFunction=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"},{"p":3,"sValue":"0"},{"p":4,"sValue":"0"},{"p":5,"sValue":"0"},{"p":6,"sValue":"0"},{"p":7,"sValue":"0"},{"p":8,"sValue":"0"},{"p":9,"sValue":"0"},{"p":10,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=NRCellCU_GNBCUCP"},"measTypes":{"sMeasTypesList":["pmEndcUeCapabilityUlPdcpDelay"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=32","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=31","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=2","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"}]},{"measObjInstId":"ManagedElement=nodedntest,GNBCUCPFunction=1,NRCellCU=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"}]}]},{"measInfoId":{"sMeasInfoId":"PM=1,PmGroup=X2UTermination_GNBCUUP"},"measTypes":{"sMeasTypesList":["pmCounterNumber802","pmCounterNumber803"]},"measValuesList":[{"measObjInstId":"ManagedElement=nodedntest,GNBCUUPFunction=1,X2UTermination=1","suspectFlag":"false","measResults":[{"p":1,"sValue":"0"},{"p":2,"sValue":"0"}]}]}]}}}} \ No newline at end of file diff --git a/pmlog/src/test/resources/pm_report.json b/pmlog/src/test/resources/pm_report.json new file mode 100644 index 00000000..585c972c --- /dev/null +++ b/pmlog/src/test/resources/pm_report.json @@ -0,0 +1,223 @@ +{ + "event": { + "commonEventHeader": { + "domain": "perf3gpp", + "eventName": "perf3gpp_gnb-Ericsson_pmMeasResult", + "sourceName": "O-DU-1122", + "reportingEntityName": "", + "startEpochMicrosec": 1465839830100400, + "lastEpochMicrosec": 1676378616564000, + "timeZoneOffset": "+00:00" + }, + "perf3gppFields": { + "perf3gppFieldsVersion": "1.0", + "measDataCollection": { + "granularityPeriod": 900, + "measuredEntityUserName": "RNC Telecomville", + "measuredEntityDn": "SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1", + "measuredEntitySoftwareVersion": "", + "measInfoList": [ + { + "measInfoId": { + "sMeasInfoId": "" + }, + "measTypes": { + "sMeasTypesList": [ + "attTCHSeizures", + "succTCHSeizures", + "attImmediateAssignProcs", + "succImmediateAssignProcs" + ] + }, + "measValuesList": [ + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-997", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "813" + }, + { + "p": 2, + "sValue": "913" + }, + { + "p": 3, + "sValue": "1013" + }, + { + "p": 4, + "sValue": "1113" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-998", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "890" + }, + { + "p": 2, + "sValue": "901" + }, + { + "p": 3, + "sValue": "123" + }, + { + "p": 4, + "sValue": "234" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-999", + "suspectFlag": "true", + "measResults": [ + { + "p": 1, + "sValue": "456" + }, + { + "p": 2, + "sValue": "567" + }, + { + "p": 3, + "sValue": "678" + }, + { + "p": 4, + "sValue": "789" + } + ] + } + ] + }, + { + "measInfoId": { + "sMeasInfoId": "ENodeBFunction" + }, + "measTypes": { + "sMeasTypesList": [ + "attTCHSeizures1", + "succTCHSeizures2", + "attImmediateAssignProcs3", + "succImmediateAssignProcs4" + ] + }, + "measValuesList": [ + { + "measObjInstId": "ManagedElement=RNC-Gbg-1,ENodeBFunction=1", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "4" + }, + { + "p": 2, + "sValue": "86,87,2,6,77,96,75,33,24" + }, + { + "p": 3, + "sValue": "40" + }, + { + "p": 4, + "sValue": "90" + } + ] + } + ] + }, + { + "measInfoId": { + "sMeasInfoId": "" + }, + "measTypes": { + "sMeasTypesList": [ + "attTCHSeizures5", + "succTCHSeizures6", + "attImmediateAssignProcs7", + "succImmediateAssignProcs8" + ] + }, + "measValuesList": [ + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-997", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "238" + }, + { + "p": 2, + "sValue": "344" + }, + { + "p": 3, + "sValue": "563" + }, + { + "p": 4, + "sValue": "787" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-998", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "898" + }, + { + "p": 2, + "sValue": "905" + }, + { + "p": 3, + "sValue": "127" + }, + { + "p": 4, + "sValue": "238" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-999", + "suspectFlag": "true", + "measResults": [ + { + "p": 1, + "sValue": "454" + }, + { + "p": 2, + "sValue": "569" + }, + { + "p": 3, + "sValue": "672" + }, + { + "p": 4, + "sValue": "785" + } + ] + } + ] + } + ] + } + } + } +} \ No newline at end of file diff --git a/pmlog/src/test/resources/pm_report.json.gz b/pmlog/src/test/resources/pm_report.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..2d191d15fb29f08f39fec20c3e67ab065393d641 GIT binary patch literal 937 zcmV;a16KSWiwFp4oS|X>18{9$a%FIDa&#_gb8l_{?O021+c*%u=T{iIRw_ivdKK`Y z>p0s0wNvELLyMxI<&mqdM5-i}HXG!>FC|BtI=)ot5^tWno=?=mfrwg0jmiM`HH4ECUQ~BfJOE?%QU?vF72JJ3V8q#Miw%S z$nqUy>^PATgf2F0>^i{`MacK9hAxM1Igk*fvbke(fm5h^{k$eiW5(i;b4osE=^QXW z2c9RQX_MwGgi86$IKDCvvYLJwWR!`RtY<{T;-&&OFd2&}lfpu|n2f@tBtR9=|lTrihnidK+^A1lapuQ12ybKt-Iw z2TI^9iZ~SI)?S$AE7R2OF?SXCXL?U!NLGBS_Dx~UAKD5nmBl#50#9j@Kqxk-nxz7> zW|-s&E|U5VWOj>pCTMKFvXnDeZAx>+fmP)>Ura}rAkEYCI+kvLLWGSjAT zN+MbmP0Bwur1H7lUZ^XTylO)fAU?07G_3`8r*~Puyvcy~881Oyf&ao{AugwHE+GC} zW`=8RJ}awv82(GBG|@{ZB4*Ltf?yUM3Q344!|ye}CY$*fGAEx(=; ze%~z5NqCZzk}8w)6Zr;S3CWKsB*~=?e#ijc)g=Gh3B2pbr#CA*=}GC+ z87+GLtA1~{^j+QebW3-2&(j0>>FBntTL+JENDCbwd=wkfLHh>7r`AAKX_?M|mgzpA zW%eB8+goPWfA{~F76UhNZ)<3;wCsaVPeZz;JyxnQI<8X3FwgIqyp=qLJ)%lPilro1p3jwqQbV}o_8iK8_mzdE5>-6Er;!|H;y&sSSAz2U?&$6x L-;tlE&>sK*VDiiR literal 0 HcmV?d00001 diff --git a/pmlog/src/test/resources/pm_report_filtered.json b/pmlog/src/test/resources/pm_report_filtered.json new file mode 100644 index 00000000..b308ff4c --- /dev/null +++ b/pmlog/src/test/resources/pm_report_filtered.json @@ -0,0 +1,67 @@ +{ + "event": { + "commonEventHeader": { + "domain": "perf3gpp", + "eventId": "9efa1210-f285-455f-9c6a-3a659b1f1882", + "eventName": "perf3gpp_gnb-Ericsson_pmMeasResult", + "sourceName": "O-DU-1122", + "reportingEntityName": "", + "startEpochMicrosec": 951912000000, + "lastEpochMicrosec": 951912900000, + "timeZoneOffset": "+00:00" + }, + "perf3gppFields": { + "perf3gppFieldsVersion": "1.0", + "measDataCollection": { + "granularityPeriod": 900, + "measuredEntityUserName": "RNC Telecomville", + "measuredEntityDn": "SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1", + "measuredEntitySoftwareVersion": "", + "measInfoList": [ + { + "measInfoId": { + "sMeasInfoId": "" + }, + "measTypes": { + "sMeasTypesList": [ + "succImmediateAssignProcs" + ] + }, + "measValuesList": [ + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-997", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "1113" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-998", + "suspectFlag": "false", + "measResults": [ + { + "p": 1, + "sValue": "234" + } + ] + }, + { + "measObjInstId": "RncFunction=RF-1,UtranCell=Gbg-999", + "suspectFlag": "true", + "measResults": [ + { + "p": 1, + "sValue": "789" + } + ] + } + ] + } + ] + } + } + } +} \ No newline at end of file -- 2.16.6