From: demx8as6 Date: Mon, 31 May 2021 10:44:37 +0000 (+0200) Subject: Refactoring of the entire dev deployment X-Git-Tag: 2.2.0~13 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=53d47d4c8f037cb93aee17953879c834c648700f;p=oam.git Refactoring of the entire dev deployment new image versions - nexus3.onap.org:10001/onap/sdnc-image:2.1.5 - nexus3.onap.org:10001/onap/dmaap/zookeeper:6.0.3 - nexus3.onap.org:10001/onap/dmaap/kafka111:1.0.4 - nexus3.onap.org:10001/onap/dmaap/dmaap-mr:1.1.18 - nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.8.0 Integration of an O-DU O1 (hello-world) simulator - nexus3.o-ran-sc.org:10004/o-ran-sc/nts-ng-o-ran-du:1.3.1 Update of README Issue-Id: OAM-216 Change-Id: Ib730fcd745069516191aa759014562183e8b1023 Signed-off-by: demx8as6 --- diff --git a/solution/dev/.env b/solution/dev/.env new file mode 100644 index 0000000..a51149c --- /dev/null +++ b/solution/dev/.env @@ -0,0 +1,77 @@ +################################################################################ +# Copyright 2021 highstreet technologies and others +# +# 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. +# + +COMPOSE_PROJECT_NAME=smo + +# Credentials + +ADMIN_USERNAME=admin +ADMIN_PASSWORD=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U + +# Network settings +NETWORK_SUBNET_IP=172.40.0.0/16 +NETWORK_GATEWAY_IP=172.40.0.1 + +# PERSISTENCE (including SDN-R Database) +PERSISTENCE_IMAGE=docker.elastic.co/elasticsearch/elasticsearch-oss:7.9.3 +PERSISTENCE_IP=172.40.0.22 + +# SDN Controller +SDNC_IMAGE=nexus3.onap.org:10001/onap/sdnc-image:2.1.5 +SDNC_REST_PORT=8181 +SDNC_IP=172.40.0.23 +SDNC_CERT_DIR=/opt/opendaylight/current/certs + +# dependent components +## ZooKeeper +ZOOKEEPER_IMAGE=nexus3.onap.org:10001/onap/dmaap/zookeeper:6.0.3 +ZOOKEEPER_IP=172.40.0.24 + +## Kafka +KAFKA_IMAGE=nexus3.onap.org:10001/onap/dmaap/kafka111:1.0.4 +KAFKA_IP=172.40.0.25 + +## DMaaP +DMAAP_IMAGE=nexus3.onap.org:10001/onap/dmaap/dmaap-mr:1.1.18 +DMAAP_IP=172.40.0.26 + +## VES Collector +VES_COLLECTOR_IMAGE=nexus3.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.8.0 +VES_COLLECTOR_IP=172.40.0.27 + +## NTS NG settings +DOCKER_REPO=nexus3.o-ran-sc.org:10004/o-ran-sc/ +NTS_MANAGER_PORT=8300 +NTS_BUILD_VERSION=1.3.1 + +NTS_HOST_IP=10.20.11.118 +NTS_HOST_BASE_PORT=50000 +NTS_HOST_NETCONF_SSH_BASE_PORT=0 +NTS_HOST_NETCONF_TLS_BASE_PORT=1000 +NTS_HOST_TRANSFER_FTP_BASE_PORT=2000 +NTS_HOST_TRANSFER_SFTP_BASE_PORT=2000 +NTS_BUILD_DATE=2021-05-11T09:11:04Z + +NTS_NF_MOUNT_POINT_ADDRESSING_METHOD=docker-mapping + +SDN_CONTROLLER_PROTOCOL=http + +VES_COMMON_HEADER_VERSION=7.2.1 +VES_ENDPOINT_PROTOCOL=https +VES_ENDPOINT_PORT=8443 +VES_ENDPOINT_AUTH_METHOD=basic-auth +VES_ENDPOINT_USERNAME=sample1 +VES_ENDPOINT_PASSWORD=sample1 diff --git a/solution/dev/LICENSE b/solution/dev/LICENSE new file mode 100644 index 0000000..1c40cec --- /dev/null +++ b/solution/dev/LICENSE @@ -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 2021 Martin Skorupski + + 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/solution/dev/README.md b/solution/dev/README.md index 1ff3495..2747d09 100644 --- a/solution/dev/README.md +++ b/solution/dev/README.md @@ -1,5 +1,189 @@ -# Setup for development environment +# Service Management and Orchestration (SMO) -The purpose of this directory is to provide an setups for O-RAN component developers, who need to implement the O1 interface provider. +##### Table of Contents +[Service Management and Orchestration (SMO)](#service-management-and-orchestration-smo) +- [Introduction](#introduction) +- [Overview](#overview) +- [Prerequisites](#prerequisites) +- [Usage](#usage) + - [Bring Up Solution](#bring-up-solution) + - [Log files and karaf console](#log-files-and-karaf-console) + - [Customizing Solution](#customizing-solution) + - [Verification Solution](#verification-solution) + - [Access to SDN-R UX](#access-to-sdn-r-ux) + - [Terminate solution](#terminate-solution) + - [Cleanup](#cleanup) + - [Troubleshooting](#troubleshooting) -The SMO (Service Management and Orchestration) basically contains an OpenDaylight based NetConf Client, which is also used by the ONAP project, a VES Collector and a message router. +## Introduction + +With respect to OAM the SMO implements the O1-interface consumers. According to the O-RAN OAM Architecture and the O-RAN OAM Interface Specification, the SMO implements a NetConf Client for configuration and a HTTP/REST/VES server for receiving all kind of events in a VES format. + +The setup contains an OpenDaylight based NetConf client and a VES Collector. + +## Overview + +This docker-compose file starts a pre-configured, self-contained SDN-R solution +for developer test or demo purposes + + * **SDN-R** single node instance + + ... representing the NetConf consumer on the Service Management and + Orchestration framework (SMO) for the O1 interface based on + ODL-Silicon/ONAP-Istanbul + + * **VES collector** + + ... representing the VES (REST) provider at SMO for all kind of events. + + * **DMaaP** + ... representing SMO DMaaP component, includes message-router + +## Prerequisites + +``` +$ cat /etc/os-release | grep PRETTY_NAME +PRETTY_NAME="Ubuntu 20.04.2 LTS" + +$ docker --version +Docker version 20.10.2, build 20.10.2-0ubuntu1~20.04.2 + +$ docker-compose --version +docker-compose version 1.29.1, build c34c88b2 + +$ git --version +git version 2.25.1 + +``` + +## Usage + +### Bring Up Solution + +#### Check (adjust if required) environment variables + +``` +nano .env +``` + +#### Startup solution + +Please note that it is necessary to configure first the identity service, +before starting further docker images. + +``` +docker-compose up -d +``` + +The ntsim-ng configured for O1-interfaces nodes (e.g. O-DU) sends a ves:pnfRegistration event +every time the docker container is started. + +Due to the fact that the first VES event gets "lost" please stop and start the +ntsim-ng container **min 2 times**, AFTER you could log in to ODLUX (http://localhost:8181/odlux/index.html). + + +``` +docker-compose restart ntsim-ng-o-du-1122 + +docker-compose restart ntsim-ng-o-du-1122 +``` + + +![ves:pnfRegistration in ODLUX](docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png "ves:pnfRegistration in ODLUX") + +Once a new mount-point is created, it is possible to configure ntsim-ng, in a +way that automatically fault messaged are send to the ves-collector. + +``` +$ python config-ntsim-ngs.py +Set highstreet-O-DU-1122 True +``` + +'True' indicated that the settings through SDN-R to the NETCONF server were +successful. + +SDN-R reads the fault events from DMaaP and processes them. +Finally the fault events are visible in ODLUX. + +![ves:fault in ODLUX](docs/ves-fault-in-odlux.png "ves:fault in ODLUX") + + +### Log files and karaf console + +#### ODL karaf.logs + +``` +docker exec -it sdnr tail -f /opt/opendaylight/data/log/karaf.log +``` + +#### karaf console access (karaf:karaf) + +``` +ssh karaf@localhost -p 8101 +``` + +#### ves-collector logs + +``` +docker logs -f ves-collector +``` + +### Customizing Solution + +'.env' file contains customizing parameters + +### Verification Solution + +#### Access to SDN-R ODLUX + +##### Login into SDN-R + + http://:8181/odlux/index.html + + User: admin // see .env file + + Password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U + +In case of trouble, please update the commands with your customized '.env' file. + +### Terminate solution + +To stop all container: + +``` +docker-compose down +``` + +re-start solution at any point in time with +``` +docker-compose up -d +``` + +### Cleanup + +!!! be careful if other stopped containers are on the same system +``` +docker system prune -a -f +``` +### Troubleshooting + +In most cases the .env setting do not fit to the environment and need to be +adjusted. + +Please make sure that the network settings to not overlap with other networks. + +The commands ... +``` +docker ps -a +docker-compose ps + +## Prerequisites +# python3, tmux, libtmux +tmux new-session -n workspace -s integration + +# within tmux session +python tmux-logging.py +``` +... are your friends. + +![tmux logging](docs/tmux-logging.png "tmux logging") \ No newline at end of file diff --git a/solution/dev/config-ntsim-ngs.py b/solution/dev/config-ntsim-ngs.py new file mode 100644 index 0000000..319a26e --- /dev/null +++ b/solution/dev/config-ntsim-ngs.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +################################################################################ +# Copyright 2021 highstreet technologies GmbH +# +# 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. +# + +# importing the sys, json, requests library +import os +import sys +import json +import requests +import subprocess + +dockerFilter = subprocess.check_output("docker ps --format '{{.Names}}'", shell=True) +containers = dockerFilter.splitlines() + +mapping = dict({"ntsim-ng-o-ru": "highstreet-O-RU", "ntsim-ng-o-du": "highstreet-O-DU"}) +base = 'http://localhost:8181' +username = 'admin' +password = 'Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U' + +# REST to set event settings +def configEventSettings(nfName, nfType): + file = os.path.dirname(os.path.abspath(__file__)) + '/' + nfType + '/event-settings.json' + with open(file) as json_file: + body = json.load(json_file) + url = base + '/rests/data/network-topology:network-topology/topology=topology-netconf/node=' + nfName + '/yang-ext:mount/nts-network-function:simulation/network-function' + headers = { + 'content-type': 'application/yang-data+json', + 'accept': 'application/yang-data+json' + } + try: + response = requests.put(url, verify=False, auth=(username, password), json=body, headers=headers) + except requests.exceptions.Timeout: + sys.exit('HTTP request failed, please check you internet connection.') + except requests.exceptions.TooManyRedirects: + sys.exit('HTTP request failed, please check your proxy settings.') + except requests.exceptions.RequestException as e: + # catastrophic error. bail. + raise SystemExit(e) + + return response.status_code >= 200 and response.status_code < 300 + +# main +for container in containers: + name = container.decode("utf-8") + if "ntsim-ng" in name: + if "ntsim-ng-o-ru" in name: + nfName = mapping["ntsim-ng-o-ru"] + name[name.rindex("-"):] + print("Set", nfName, configEventSettings(nfName, "ntsim-ng-o-ru")) + if "ntsim-ng-o-du" in name: + nfName = mapping["ntsim-ng-o-du"] + name[name.rindex("-"):] + print("Set", nfName, configEventSettings(nfName, "ntsim-ng-o-du")) diff --git a/solution/dev/dmaap/MsgRtrApi.properties b/solution/dev/dmaap/MsgRtrApi.properties new file mode 100644 index 0000000..33ff0fd --- /dev/null +++ b/solution/dev/dmaap/MsgRtrApi.properties @@ -0,0 +1,169 @@ +############################################################################### +# ============LICENSE_START======================================================= +# org.onap.dmaap +# ================================================================================ +# Copyright � 2017 AT&T Intellectual Property. 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========================================================= +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +# +############################################################################### +############################################################################### +## +## Cambria API Server config +## +## - Default values are shown as commented settings. +## + +############################################################################### +## +## HTTP service +## +## - 3904 is standard as of 7/29/14. +# +## Zookeeper Connection +## +## Both Cambria and Kafka make use of Zookeeper. +## +#config.zk.servers=172.18.1.1 +config.zk.servers=zookeeper +#config.zk.root=/fe3c/cambria/config + + +############################################################################### +## +## Kafka Connection +## +## Items below are passed through to Kafka's producer and consumer +## configurations (after removing "kafka.") +## if you want to change request.required.acks it can take this one value +#kafka.metadata.broker.list=localhost:9092,localhost:9093 +kafka.metadata.broker.list=kafka:9092 +##kafka.request.required.acks=-1 +#kafka.client.zookeeper=${config.zk.servers} +consumer.timeout.ms=100 +zookeeper.connection.timeout.ms=6000 +zookeeper.session.timeout.ms=20000 +zookeeper.sync.time.ms=2000 +auto.commit.interval.ms=1000 +fetch.message.max.bytes =1000000 +auto.commit.enable=false + +#(backoff*retries > zksessiontimeout) +kafka.rebalance.backoff.ms=10000 +kafka.rebalance.max.retries=6 + + +############################################################################### +## +## Secured Config +## +## Some data stored in the config system is sensitive -- API keys and secrets, +## for example. to protect it, we use an encryption layer for this section +## of the config. +## +## The key is a base64 encode AES key. This must be created/configured for +## each installation. +#cambria.secureConfig.key= +## +## The initialization vector is a 16 byte value specific to the secured store. +## This must be created/configured for each installation. +#cambria.secureConfig.iv= + +## Southfield Sandbox +cambria.secureConfig.key=b/7ouTn9FfEw2PQwL0ov/Q== +cambria.secureConfig.iv=wR9xP5k5vbz/xD0LmtqQLw== +authentication.adminSecret=fe3cCompound +#cambria.secureConfig.key[pc569h]=YT3XPyxEmKCTLI2NK+Sjbw== +#cambria.secureConfig.iv[pc569h]=rMm2jhR3yVnU+u2V9Ugu3Q== + + +############################################################################### +## +## Consumer Caching +## +## Kafka expects live connections from the consumer to the broker, which +## obviously doesn't work over connectionless HTTP requests. The Cambria +## server proxies HTTP requests into Kafka consumer sessions that are kept +## around for later re-use. Not doing so is costly for setup per request, +## which would substantially impact a high volume consumer's performance. +## +## This complicates Cambria server failover, because we often need server +## A to close its connection before server B brings up the replacement. +## + +## The consumer cache is normally enabled. +#cambria.consumer.cache.enabled=true + +## Cached consumers are cleaned up after a period of disuse. The server inspects +## consumers every sweepFreqSeconds and will clean up any connections that are +## dormant for touchFreqMs. +#cambria.consumer.cache.sweepFreqSeconds=15 +cambria.consumer.cache.touchFreqMs=120000 +##stickforallconsumerrequests=false +## The cache is managed through ZK. The default value for the ZK connection +## string is the same as config.zk.servers. +#cambria.consumer.cache.zkConnect=${config.zk.servers} + +## +## Shared cache information is associated with this node's name. The default +## name is the hostname plus the HTTP service port this host runs on. (The +## hostname is determined via InetAddress.getLocalHost ().getCanonicalHostName(), +## which is not always adequate.) You can set this value explicitly here. +## +#cambria.api.node.identifier= + +#cambria.rateLimit.maxEmptyPollsPerMinute=30 +#cambria.rateLimitActual.delay.ms=10 + +############################################################################### +## +## Metrics Reporting +## +## This server can report its metrics periodically on a topic. +## +#metrics.send.cambria.enabled=true +#metrics.send.cambria.topic=cambria.apinode.metrics #msgrtr.apinode.metrics.dmaap +#metrics.send.cambria.sendEverySeconds=60 + +cambria.consumer.cache.zkBasePath=/fe3c/cambria/consumerCache +consumer.timeout=17 + +############################################################################## +#100mb +maxcontentlength=10000 + + +############################################################################## +#AAF Properties +msgRtr.namespace.aaf=org.onap.dmaap.mr.topic +msgRtr.topicfactory.aaf=org.onap.dmaap.mr.topicFactory|:org.onap.dmaap.mr.topic: +enforced.topic.name.AAF=org.onap.dmaap.mr +forceAAF=false +transidUEBtopicreqd=false +defaultNSforUEB=org.onap.dmaap.mr +############################################################################## +#Mirror Maker Agent +msgRtr.mirrormakeradmin.aaf=org.onap.dmaap.mr.mirrormaker|*|admin +msgRtr.mirrormakeruser.aaf=org.onap.dmaap.mr.mirrormaker|*|user +msgRtr.mirrormakeruser.aaf.create=org.onap.dmaap.mr.topicFactory|:org.onap.dmaap.mr.topic: +msgRtr.mirrormaker.timeout=15000 +msgRtr.mirrormaker.topic=org.onap.dmaap.mr.mmagent +msgRtr.mirrormaker.consumergroup=mmagentserver +msgRtr.mirrormaker.consumerid=1 + +kafka.max.poll.interval.ms=300000 +kafka.heartbeat.interval.ms=60000 +kafka.session.timeout.ms=240000 +kafka.max.poll.records=1000 \ No newline at end of file diff --git a/solution/dev/dmaap/cadi.properties b/solution/dev/dmaap/cadi.properties new file mode 100644 index 0000000..dca56c8 --- /dev/null +++ b/solution/dev/dmaap/cadi.properties @@ -0,0 +1,19 @@ +aaf_locate_url=https://aaf-locate.{{ include "common.namespace" . }}:8095 +aaf_url=https://AAF_LOCATE_URL/onap.org.osaaf.aaf.service:2.1 +aaf_env=DEV +aaf_lur=org.onap.aaf.cadi.aaf.v2_0.AAFLurPerm + +cadi_truststore=/appl/dmaapMR1/etc/org.onap.dmaap.mr.trust.jks +cadi_truststore_password=enc:mN6GiIzFQxKGDzAXDOs7b4j8DdIX02QrZ9QOWNRpxV3rD6whPCfizSMZkJwxi_FJ + +cadi_keyfile=/appl/dmaapMR1/etc/org.onap.dmaap.mr.keyfile + +cadi_alias=dmaapmr@mr.dmaap.onap.org +cadi_keystore=/appl/dmaapMR1/etc/org.onap.dmaap.mr.p12 +cadi_keystore_password=enc:_JJT2gAEkRzXla5xfDIHal8pIoIB5iIos3USvZQT6sL-l14LpI5fRFR_QIGUCh5W +cadi_x509_issuers=CN=intermediateCA_1, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_7, OU=OSAAF, O=ONAP, C=US:CN=intermediateCA_9, OU=OSAAF, O=ONAP, C=US + +cadi_loglevel=INFO +cadi_protocols=TLSv1.1,TLSv1.2 +cadi_latitude=37.78187 +cadi_longitude=-122.26147 \ No newline at end of file diff --git a/solution/dev/dmaap/logback.xml b/solution/dev/dmaap/logback.xml new file mode 100644 index 0000000..f02a2db --- /dev/null +++ b/solution/dev/dmaap/logback.xml @@ -0,0 +1,208 @@ + + + + ${module.ajsc.namespace.name} + + + + + ERROR + ACCEPT + DENY + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n + + + + + + + INFO + ACCEPT + DENY + + + + + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + class="ch.qos.logback.core.ConsoleAppender"> + + ERROR + ACCEPT + DENY + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + + + + "%d [%thread] %-5level %logger{1024} - %msg%n" + + + + 1000 + 0 + + + + + + + + + + + 1000 + 0 + + + + + + + + + + + + + + + + diff --git a/solution/dev/docker-compose.yml b/solution/dev/docker-compose.yml new file mode 100755 index 0000000..d1ab3d2 --- /dev/null +++ b/solution/dev/docker-compose.yml @@ -0,0 +1,194 @@ +################################################################################ +# Copyright 2021 highstreet technologies GmbH +# +# 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. +# +version: '3.8' +services: + persistence: + image: ${PERSISTENCE_IMAGE} + container_name: persistence + environment: + - discovery.type=single-node + networks: + oam: + ipv4_address: ${PERSISTENCE_IP} + + sdnr: + image: ${SDNC_IMAGE} + container_name: sdnr + ports: + - ${SDNC_REST_PORT}:8181 + - 8101:8101 + environment: + - SDNC_CONFIG_DIR=/opt/onap/ccsdk/data/properties + - ODL_CERT_DIR=${SDNC_CERT_DIR} + - ENABLE_ODL_CLUSTER=false + - SDNC_REPLICAS=0 + - CCSDK_REPLICAS=0 + - DOMAIN="" + - SDNRWT=true + - SDNRINIT=true + - SDNRONLY=true + - SDNRDBURL=http://persistence:9200 + - A1_ADAPTER_NORTHBOUND=false + - ODL_ADMIN_PASSWORD=${ADMIN_PASSWORD} + - JAVA_OPTS=-Xms256m -Xmx4g + volumes: + - ./sdnr/mountpoint-registrar.properties:/opt/opendaylight/etc/mountpoint-registrar.properties + - ./sdnr/certs/certs.properties:${SDNC_CERT_DIR}/certs.properties + - ./sdnr/certs/keys0.zip:${SDNC_CERT_DIR}/keys0.zip + networks: + oam: + ipv4_address: ${SDNC_IP} + depends_on: + - persistence + + zookeeper: + image: ${ZOOKEEPER_IMAGE} + container_name: zookeeper + ports: + - 2181:2181 + environment: + ZOOKEEPER_REPLICAS: 1 + ZOOKEEPER_TICK_TIME: 2000 + ZOOKEEPER_SYNC_LIMIT: 5 + ZOOKEEPER_INIT_LIMIT: 10 + ZOOKEEPER_MAX_CLIENT_CNXNS: 200 + ZOOKEEPER_AUTOPURGE_SNAP_RETAIN_COUNT: 3 + ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: 24 + ZOOKEEPER_CLIENT_PORT: 2181 + KAFKA_OPTS: -Djava.security.auth.login.config=/etc/zookeeper/secrets/jaas/zk_server_jaas.conf -Dzookeeper.kerberos.removeHostFromPrincipal=true -Dzookeeper.kerberos.removeRealmFromPrincipal=true -Dzookeeper.authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider -Dzookeeper.requireClientAuthScheme=sasl + ZOOKEEPER_SERVER_ID: + volumes: + - ./zookeeper/zk_server_jaas.conf:/etc/zookeeper/secrets/jaas/zk_server_jaas.conf + networks: + oam: + aliases: + - zookeeper + ipv4_address: ${ZOOKEEPER_IP} + + kafka: + image: ${KAFKA_IMAGE} + container_name: kafka + ports: + - 9092:9092 + environment: + enableCadi: 'false' + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS: 40000 + KAFKA_ZOOKEEPER_SESSION_TIMEOUT_MS: 40000 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL_PLAINTEXT:PLAINTEXT,EXTERNAL_PLAINTEXT:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: INTERNAL_PLAINTEXT://kafka:9092 + KAFKA_LISTENERS: INTERNAL_PLAINTEXT://0.0.0.0:9092 + KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL_PLAINTEXT + KAFKA_CONFLUENT_SUPPORT_METRICS_ENABLE: 'false' + KAFKA_OPTS: -Djava.security.auth.login.config=/etc/kafka/secrets/jaas/zk_client_jaas.conf + KAFKA_ZOOKEEPER_SET_ACL: 'true' + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + # Reduced the number of partitions only to avoid the timeout error for the first subscribe call in slow environment + KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS: 1 + volumes: + - ./kafka/zk_client_jaas.conf:/etc/kafka/secrets/jaas/zk_client_jaas.conf + networks: + oam: + aliases: + - kafka + ipv4_address: ${KAFKA_IP} + depends_on: + - zookeeper + + dmaap: + container_name: onap-dmaap + image: ${DMAAP_IMAGE} + ports: + - 3904:3904 + - 3905:3905 + environment: + enableCadi: 'false' + volumes: + - ./dmaap/MsgRtrApi.properties:/appl/dmaapMR1/bundleconfig/etc/appprops/MsgRtrApi.properties + - ./dmaap/logback.xml:/appl/dmaapMR1/bundleconfig/etc/logback.xml + - ./dmaap/cadi.properties:/appl/dmaapMR1/etc/cadi.properties + networks: + oam: + aliases: + - dmaap + ipv4_address: ${DMAAP_IP} + depends_on: + - zookeeper + - kafka + + ves-collector: + image: ${VES_COLLECTOR_IMAGE} + container_name: ves-collector + environment: + DMAAPHOST: onap-dmaap + ports: + - 8080:8080 + - 8443:8443 + volumes: + - ./ves-collector/collector.properties:/opt/app/VESCollector/etc/collector.properties + networks: + oam: + ipv4_address: ${VES_COLLECTOR_IP} + + ntsim-ng-o-du-1122: + image: "${DOCKER_REPO}nts-ng-o-ran-du:${NTS_BUILD_VERSION}" + container_name: ntsim-ng-o-du-1122 + hostname: "highstreet-O-DU-1122" + cap_add: + - SYS_ADMIN + stop_grace_period: 5m + environment: + NTS_NF_STANDALONE_START_FEATURES: "datastore-populate ves-heartbeat ves-file-ready ves-pnf-registration web-cut-through" + NTS_NF_MOUNT_POINT_ADDRESSING_METHOD: ${NTS_NF_MOUNT_POINT_ADDRESSING_METHOD} + NTS_HOST_IP: ${NTS_HOST_IP} + NTS_HOST_BASE_PORT: ${NTS_HOST_BASE_PORT} + NTS_HOST_NETCONF_SSH_BASE_PORT: ${NTS_HOST_NETCONF_SSH_BASE_PORT} + NTS_HOST_NETCONF_TLS_BASE_PORT: ${NTS_HOST_NETCONF_TLS_BASE_PORT} + NTS_HOST_TRANSFER_FTP_BASE_PORT: ${NTS_HOST_TRANSFER_FTP_BASE_PORT} + NTS_HOST_TRANSFER_SFTP_BASE_PORT: ${NTS_HOST_TRANSFER_SFTP_BASE_PORT} + NTS_BUILD_DATE: ${NTS_BUILD_DATE} + + SDN_CONTROLLER_PROTOCOL: ${SDN_CONTROLLER_PROTOCOL} + SDN_CONTROLLER_IP: ${SDNC_IP} + SDN_CONTROLLER_PORT: ${SDNC_REST_PORT} + SDN_CONTROLLER_USERNAME: ${ADMIN_USERNAME} + SDN_CONTROLLER_PASSWORD: ${ADMIN_PASSWORD} + + VES_COMMON_HEADER_VERSION: ${VES_COMMON_HEADER_VERSION} + VES_ENDPOINT_PROTOCOL: ${VES_ENDPOINT_PROTOCOL} + VES_ENDPOINT_IP: ${VES_COLLECTOR_IP} + VES_ENDPOINT_PORT: ${VES_ENDPOINT_PORT} + VES_ENDPOINT_AUTH_METHOD: ${VES_ENDPOINT_AUTH_METHOD} + VES_ENDPOINT_USERNAME: ${VES_ENDPOINT_USERNAME} + VES_ENDPOINT_PASSWORD: ${VES_ENDPOINT_PASSWORD} + volumes: + - ./ntsim-ng-o-du/config.json:/opt/dev/ntsim-ng/config/config.json + - ./ntsim-ng-o-du/o-ran-sc-du-hello-world-operational.xml:/opt/dev/deploy/data/o-ran-sc-du-hello-world-operational.xml + - ./ntsim-ng-o-du/o-ran-sc-du-hello-world-running.xml:/opt/dev/deploy/data/o-ran-sc-du-hello-world-running.xml + depends_on: + - sdnr + - ves-collector + networks: + oam: + +networks: + oam: + driver: bridge + ipam: + driver: default + config: + - subnet: ${NETWORK_SUBNET_IP} + gateway: ${NETWORK_GATEWAY_IP} diff --git a/solution/dev/docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png b/solution/dev/docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png new file mode 100644 index 0000000..feadd17 Binary files /dev/null and b/solution/dev/docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png differ diff --git a/solution/dev/docs/tmux-logging.png b/solution/dev/docs/tmux-logging.png new file mode 100644 index 0000000..b6ff3d1 Binary files /dev/null and b/solution/dev/docs/tmux-logging.png differ diff --git a/solution/dev/docs/ves-fault-in-odlux.png b/solution/dev/docs/ves-fault-in-odlux.png new file mode 100644 index 0000000..43bfad7 Binary files /dev/null and b/solution/dev/docs/ves-fault-in-odlux.png differ diff --git a/solution/dev/kafka/zk_client_jaas.conf b/solution/dev/kafka/zk_client_jaas.conf new file mode 100755 index 0000000..d4ef1eb --- /dev/null +++ b/solution/dev/kafka/zk_client_jaas.conf @@ -0,0 +1,5 @@ +Client { + org.apache.zookeeper.server.auth.DigestLoginModule required + username="kafka" + password="kafka_secret"; + }; \ No newline at end of file diff --git a/solution/dev/ntsim-ng-o-du/config.json b/solution/dev/ntsim-ng-o-du/config.json new file mode 100644 index 0000000..299a6cf --- /dev/null +++ b/solution/dev/ntsim-ng-o-du/config.json @@ -0,0 +1,136 @@ +{ + "container-rules": { + "excluded-modules": [], + "excluded-features": [] + }, + + "supervisor-rules": { + "netopeer": { + "path": "/usr/local/bin/netopeer2-server", + "args": ["-d", "-v2"], + "autorestart": true, + "stdout": "log/netopeer-stdout.log", + "stderr": "log/netopeer-stderr.log" + }, + + "ntsim-network-function": { + "path": "/opt/dev/ntsim-ng/ntsim-ng", + "args": ["-w/opt/dev/ntsim-ng", "-f"], + "nomanual": true + } + }, + + "datastore-random-generation-rules" : { + "excluded-modules": [ + "sysrepo", + "sysrepo-monitoring", + "ietf-yang-library", + "ietf-netconf-acm", + "ietf-netconf-monitoring", + "nc-notifications", + "ietf-keystore", + "ietf-truststore", + "ietf-system", + "ietf-netconf-server", + "nts-network-function" + ], + + "default-list-instances": 2, + "custom-list-instances" : [] + }, + + "datastore-populate-rules": { + "random-generation-enabled": true, + + "pre-generated-operational-data": [ + "/opt/dev/deploy/data/o-ran-sc-du-hello-world-operational.xml" + ], + "pre-generated-running-data": [ + "/opt/dev/deploy/data/o-ran-sc-du-hello-world-running.xml" + ] + }, + + "fault-rules" : { + "yang-notif-template" : "$$uint16_counter$$%%object%%%%affected-object%%%%fault-severity%%%%cleared%%%%text%%%%date-time%%", + "choosing-method" : "linear", + "faults" : [ + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11221']", + "severity" : "CRITICAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "false", + "text" : "O-RU Port Down" + }, + + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11221']", + "severity" : "NORMAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "true", + "text" : "O-RU Port Down" + }, + + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11222']", + "severity" : "CRITICAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "false", + "text" : "O-RU Port Down" + }, + + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11222']", + "severity" : "NORMAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "true", + "text" : "O-RU Port Down" + }, + + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11223']", + "severity" : "CRITICAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "false", + "text" : "O-RU Port Down" + }, + + { + "condition" : "O-RU Port Down", + "object" : "/o-ran-sc-du-hello-world:network-function/du-to-ru-connection[name='highstreet-O-RU-11223']", + "severity" : "NORMAL", + "date-time" : "$$time$$", + "specific-problem" : "O-RU Port Down", + + "fault-severity" : "CRITICAL", + "affected-object" : "%%object%%", + "cleared" : "true", + "text" : "O-RU Port Down" + } + ] + } +} \ No newline at end of file diff --git a/solution/dev/ntsim-ng-o-du/event-settings.json b/solution/dev/ntsim-ng-o-du/event-settings.json new file mode 100644 index 0000000..108b10a --- /dev/null +++ b/solution/dev/ntsim-ng-o-du/event-settings.json @@ -0,0 +1,23 @@ +{ + "nts-network-function:network-function": { + "fault-generation": { + "fault-delay-list": [ + { + "index": 0, + "delay-period": 20 + } + ] + }, + "ves": { + "pnf-registration": true, + "faults-enabled": true, + "heartbeat-period": 120 + }, + "netconf": { + "faults-enabled": false, + "call-home": false + }, + "mount-point-addressing-method": "docker-mapping", + "function-type": "NTS_FUNCTION_TYPE_O_RAN_O_DU" + } + } \ No newline at end of file diff --git a/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-operational.xml b/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-operational.xml new file mode 100644 index 0000000..f5b2cc4 --- /dev/null +++ b/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-operational.xml @@ -0,0 +1,20 @@ + + + highstreet-O-RU-11221 + LOCKED + ENABLED + connected + + + highstreet-O-RU-11222 + UNLOCKED + ENABLED + disconnected + + + highstreet-O-RU-11223 + LOCKED + DISABLED + unable-to-connect + + \ No newline at end of file diff --git a/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-running.xml b/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-running.xml new file mode 100644 index 0000000..72cd076 --- /dev/null +++ b/solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-running.xml @@ -0,0 +1,14 @@ + + + highstreet-O-RU-11221 + LOCKED + + + highstreet-O-RU-11222 + UNLOCKED + + + highstreet-O-RU-11223 + LOCKED + + \ No newline at end of file diff --git a/solution/dev/sdnr/certs/certs.properties b/solution/dev/sdnr/certs/certs.properties new file mode 100644 index 0000000..32373a4 --- /dev/null +++ b/solution/dev/sdnr/certs/certs.properties @@ -0,0 +1,2 @@ +keys0.zip +*********** diff --git a/solution/dev/sdnr/certs/keys0.zip b/solution/dev/sdnr/certs/keys0.zip new file mode 100644 index 0000000..588315f Binary files /dev/null and b/solution/dev/sdnr/certs/keys0.zip differ diff --git a/solution/dev/sdnr/mountpoint-registrar.properties b/solution/dev/sdnr/mountpoint-registrar.properties new file mode 100644 index 0000000..d6e01e2 --- /dev/null +++ b/solution/dev/sdnr/mountpoint-registrar.properties @@ -0,0 +1,30 @@ +[general] +dmaapEnabled=true +baseUrl=http://localhost:8181 +sdnrUser=admin +sdnrPasswd=${ODL_ADMIN_PASSWORD} + +[fault] +faultConsumerClass=org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.impl.DMaaPFaultVESMsgConsumer +TransportType=HTTPNOAUTH +host=onap-dmaap:3904 +topic=unauthenticated.SEC_FAULT_OUTPUT +contenttype=application/json +group=myG +id=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + +[pnfRegistration] +pnfRegConsumerClass=org.onap.ccsdk.features.sdnr.wt.mountpointregistrar.impl.DMaaPPNFRegVESMsgConsumer +TransportType=HTTPNOAUTH +host=onap-dmaap:3904 +topic=unauthenticated.VES_PNFREG_OUTPUT +contenttype=application/json +group=myG +id=C1 +timeout=2000 +limit=1000 +fetchPause=5000 + diff --git a/solution/dev/tmux-logging.py b/solution/dev/tmux-logging.py new file mode 100644 index 0000000..fc33594 --- /dev/null +++ b/solution/dev/tmux-logging.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +################################################################################ +# Copyright 2021 highstreet technologies GmbH +# +# 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. +# + +from libtmux import Pane, Server, Window, exc +from libtmux.common import has_gte_version + +def createLoggingWindow(): + logging = session.new_window(attach=False, window_name="logging") + sdnr = logging.list_panes()[0] + sdnr.send_keys('echo "sdnr"', enter=True) + sdnr.send_keys('docker exec -it sdnr tail -f /opt/opendaylight/data/log/karaf.log', enter=True) + + ntsim = logging.split_window(attach=False, vertical=True) + ntsim.send_keys('echo "ntsim"', enter=True) + ntsim.send_keys('docker exec -it ntsim-ng-o-du-1122 tail -f /opt/dev/ntsim-ng/log/log.txt', enter=True) + + ves = logging.split_window(attach=False, vertical=False) + ves.send_keys('echo "ves"', enter=True) + ves.send_keys('docker logs -f ves-collector', enter=True) + + env = ntsim.split_window(attach=False, vertical=False) + env.send_keys('htop', enter=True) + +# main +server = Server() +session = server.find_where({ "session_name": "integration" }) + +workspace = session.select_window("workspace") +pane = workspace.list_panes()[0] +# pane.send_keys('clear', enter=True) +pane.send_keys('docker-compose up -d', enter=True) +pane.send_keys('docker-compose ps', enter=True) + +# create logging window, if needed +logging = session.find_where({'window_name':'logging'}) +if logging is None: + createLoggingWindow() + + + diff --git a/solution/dev/ves-collector/collector.properties b/solution/dev/ves-collector/collector.properties new file mode 100644 index 0000000..ea4e2ac --- /dev/null +++ b/solution/dev/ves-collector/collector.properties @@ -0,0 +1,76 @@ +############################################################################### +## +## Collector Server config +## +## - Default values are shown as commented settings. +## +############################################################################### +## +## HTTP(S) service +## +## Normally: +## +## - 8080 is http service +## - https is disabled by default +## +## - At this time, the server always binds to 0.0.0.0 +## +## +#collector.service.port=8080 + +## Authentication is only supported via secure port +## When enabled - require valid keystore defined +collector.service.secure.port=8443 + +# auth.method flags: +# +# noAuth - default option - no security (http) +# certBasicAuth - auth by certificate and basic auth username / password (https) +auth.method=certBasicAuth + +## Combination of userid,hashPassword encoded pwd list to be supported +## userid and pwd comma separated; pipe delimitation between each pair +## Password is generated by crypt-password library using BCrypt algorithm stored in dcaegen2/sdk package +## or https://nexus.onap.org/#nexus-search;quick~crypt-password +header.authlist=sample1,$2a$10$0buh.2WeYwN868YMwnNNEuNEAMNYVU9.FSMJGyIKV3dGET/7oGOi6 + +## The keystore must be setup per installation when secure port is configured +collector.keystore.file.location=etc/keystore +collector.keystore.passwordfile=etc/passwordfile + +collector.cert.subject.matcher=etc/certSubjectMatcher.properties + +## The truststore must be setup per installation when mutual tls support is configured +collector.truststore.file.location=etc/truststore +collector.truststore.passwordfile=etc/trustpasswordfile + +## Schema Validation checkflag +## default no validation checkflag (-1) +## If enabled (1) - schemafile location must be specified +collector.schema.checkflag=1 +collector.schema.file={\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.4.1.json\",\"v7\":\"./etc/CommonEventFormat_30.2.1_ONAP.json\"} + +## Schema StndDefinedFields Validation checkflag +## default no validation checkflag (-1) +## If enabled (1) - schema files locations must be specified, mapping file path must be specified, schema reference path +## in event json must be specified, path to stndDefined data field in event json must be specified +collector.externalSchema.checkflag=1 +collector.externalSchema.schemasLocation=./etc/externalRepo/ +collector.externalSchema.mappingFileLocation=./etc/externalRepo/schema-map.json +event.externalSchema.schemaRefPath=$.event.stndDefinedFields.schemaReference +event.externalSchema.stndDefinedDataPath=$.event.stndDefinedFields.data + +## List all streamid per domain to be supported. The streamid should match to channel name on dmaapfile +collector.dmaap.streamid=fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling|notification=ves-notification|pnfRegistration=ves-pnfRegistration|3GPP-FaultSupervision=ves-3gpp-fault-supervision|3GPP-Heartbeat=ves-3gpp-heartbeat|3GPP-Provisioning=ves-3gpp-provisioning|3GPP-PerformanceAssurance=ves-3gpp-performance-assurance +collector.dmaapfile=./etc/DmaapConfig.json + +## Path to the file containing description of api versions +collector.description.api.version.location=etc/api_version_description.json + +## Event transformation Flag - when set expects configurable transformation +## defined under ./etc/eventTransform.json +## Enabled by default; to disable set to 0 +event.transform.flag=1 + +# Describes at what frequency (measured in minutes) should application try to fetch config from CBS +collector.dynamic.config.update.frequency=5 diff --git a/solution/dev/zookeeper/zk_server_jaas.conf b/solution/dev/zookeeper/zk_server_jaas.conf new file mode 100644 index 0000000..26bf460 --- /dev/null +++ b/solution/dev/zookeeper/zk_server_jaas.conf @@ -0,0 +1,4 @@ +Server { + org.apache.zookeeper.server.auth.DigestLoginModule required + user_kafka=kafka_secret; +}; \ No newline at end of file