Refactoring of the entire dev deployment 69/6169/1
authordemx8as6 <martin.skorupski@highstreet-technologies.com>
Mon, 31 May 2021 10:44:37 +0000 (12:44 +0200)
committerdemx8as6 <martin.skorupski@highstreet-technologies.com>
Mon, 31 May 2021 10:45:33 +0000 (12:45 +0200)
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 <martin.skorupski@highstreet-technologies.com>
22 files changed:
solution/dev/.env [new file with mode: 0644]
solution/dev/LICENSE [new file with mode: 0644]
solution/dev/README.md
solution/dev/config-ntsim-ngs.py [new file with mode: 0644]
solution/dev/dmaap/MsgRtrApi.properties [new file with mode: 0644]
solution/dev/dmaap/cadi.properties [new file with mode: 0644]
solution/dev/dmaap/logback.xml [new file with mode: 0644]
solution/dev/docker-compose.yml [new file with mode: 0755]
solution/dev/docs/nstim-ng-connected-after-ves-pnf-registration-in-odlux.png [new file with mode: 0644]
solution/dev/docs/tmux-logging.png [new file with mode: 0644]
solution/dev/docs/ves-fault-in-odlux.png [new file with mode: 0644]
solution/dev/kafka/zk_client_jaas.conf [new file with mode: 0755]
solution/dev/ntsim-ng-o-du/config.json [new file with mode: 0644]
solution/dev/ntsim-ng-o-du/event-settings.json [new file with mode: 0644]
solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-operational.xml [new file with mode: 0644]
solution/dev/ntsim-ng-o-du/o-ran-sc-du-hello-world-running.xml [new file with mode: 0644]
solution/dev/sdnr/certs/certs.properties [new file with mode: 0644]
solution/dev/sdnr/certs/keys0.zip [new file with mode: 0644]
solution/dev/sdnr/mountpoint-registrar.properties [new file with mode: 0644]
solution/dev/tmux-logging.py [new file with mode: 0644]
solution/dev/ves-collector/collector.properties [new file with mode: 0644]
solution/dev/zookeeper/zk_server_jaas.conf [new file with mode: 0644]

diff --git a/solution/dev/.env b/solution/dev/.env
new file mode 100644 (file)
index 0000000..a51149c
--- /dev/null
@@ -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 (file)
index 0000000..1c40cec
--- /dev/null
@@ -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.
index 1ff3495..2747d09 100644 (file)
@@ -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://<host_ip>: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 (file)
index 0000000..319a26e
--- /dev/null
@@ -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 (file)
index 0000000..33ff0fd
--- /dev/null
@@ -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=<use-something-unique-to-this-instance>
+
+#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 (file)
index 0000000..dca56c8
--- /dev/null
@@ -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 (file)
index 0000000..f02a2db
--- /dev/null
@@ -0,0 +1,208 @@
+<!--
+     ============LICENSE_START=======================================================
+     Copyright Â© 2019 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=========================================================
+ -->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="false">
+  <contextName>${module.ajsc.namespace.name}</contextName>
+  <jmxConfigurator />
+  <property name="logDirectory" value="${AJSC_HOME}/log" />
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <filter class="ch.qos.logback.classic.filter.LevelFilter">
+      <level>ERROR</level>
+      <onMatch>ACCEPT</onMatch>
+      <onMismatch>DENY</onMismatch>
+    </filter>
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+      </pattern>
+    </encoder>
+  </appender>
+
+  <appender name="INFO" class="ch.qos.logback.core.ConsoleAppender">
+    <filter class="ch.qos.logback.classic.filter.LevelFilter">
+      <level>INFO</level>
+      <onMatch>ACCEPT</onMatch>
+      <onMismatch>DENY</onMismatch>
+    </filter>
+  </appender>
+
+  <appender name="DEBUG" class="ch.qos.logback.core.ConsoleAppender">
+
+    <encoder>
+      <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+    </encoder>
+  </appender>
+
+  <appender name="ERROR" class="ch.qos.logback.core.ConsoleAppender"> class="ch.qos.logback.core.ConsoleAppender">
+    <filter class="ch.qos.logback.classic.filter.LevelFilter">
+      <level>ERROR</level>
+      <onMatch>ACCEPT</onMatch>
+      <onMismatch>DENY</onMismatch>
+    </filter>
+    <encoder>
+      <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+    </encoder>
+  </appender>
+
+
+  <!-- Msgrtr related loggers -->
+  <logger name="org.onap.dmaap.dmf.mr.service" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.service.impl" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.resources" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.resources.streamReaders" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.backends" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.backends.kafka" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.backends.memory" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.beans" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.constants" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.exception" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.listener" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.metabroker" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.metrics.publisher" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.metrics.publisher.impl" level="INFO" />
+
+
+
+  <logger name="org.onap.dmaap.dmf.mr.security" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.security.impl" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.transaction" level="INFO" />
+  <logger name="com.att.dmf.mr.transaction.impl" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.metabroker" level="INFO" />
+  <logger name="org.onap.dmaap.dmf.mr.metabroker" level="INFO" />
+
+  <logger name="org.onap.dmaap.dmf.mr.utils" level="INFO" />
+  <logger name="org.onap.dmaap.mr.filter" level="INFO" />
+
+  <!--<logger name="com.att.nsa.cambria.*" level="INFO" />-->
+
+  <!-- Msgrtr loggers in ajsc -->
+  <logger name="org.onap.dmaap.service" level="INFO" />
+  <logger name="org.onap.dmaap" level="INFO" />
+
+
+  <!-- Spring related loggers -->
+  <logger name="org.springframework" level="WARN" additivity="false"/>
+  <logger name="org.springframework.beans" level="WARN" additivity="false"/>
+  <logger name="org.springframework.web" level="WARN" additivity="false" />
+  <logger name="com.blog.spring.jms" level="WARN" additivity="false" />
+
+  <!-- AJSC Services (bootstrap services) -->
+  <logger name="ajsc" level="WARN" additivity="false"/>
+  <logger name="ajsc.RouteMgmtService" level="INFO" additivity="false"/>
+  <logger name="ajsc.ComputeService" level="INFO" additivity="false" />
+  <logger name="ajsc.VandelayService" level="WARN" additivity="false"/>
+  <logger name="ajsc.FilePersistenceService" level="WARN" additivity="false"/>
+  <logger name="ajsc.UserDefinedJarService" level="WARN" additivity="false" />
+  <logger name="ajsc.UserDefinedBeansDefService" level="WARN" additivity="false" />
+  <logger name="ajsc.LoggingConfigurationService" level="WARN" additivity="false" />
+
+  <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet
+    logging) -->
+  <logger name="ajsc.utils" level="WARN" additivity="false"/>
+  <logger name="ajsc.utils.DME2Helper" level="INFO" additivity="false" />
+  <logger name="ajsc.filters" level="DEBUG" additivity="false" />
+  <logger name="ajsc.beans.interceptors" level="DEBUG" additivity="false" />
+  <logger name="ajsc.restlet" level="DEBUG" additivity="false" />
+  <logger name="ajsc.servlet" level="DEBUG" additivity="false" />
+  <logger name="com.att" level="WARN" additivity="false" />
+  <logger name="com.att.ajsc.csi.logging" level="WARN" additivity="false" />
+  <logger name="com.att.ajsc.filemonitor" level="WARN" additivity="false"/>
+
+  <logger name="com.att.nsa.dmaap.util" level="INFO" additivity="false"/>
+  <logger name="com.att.cadi.filter" level="INFO" additivity="false" />
+
+
+  <!-- Other Loggers that may help troubleshoot -->
+  <logger name="net.sf" level="WARN" additivity="false" />
+  <logger name="org.apache.commons.httpclient" level="WARN" additivity="false"/>
+  <logger name="org.apache.commons" level="WARN" additivity="false" />
+  <logger name="org.apache.coyote" level="WARN" additivity="false"/>
+  <logger name="org.apache.jasper" level="WARN" additivity="false"/>
+
+  <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging.
+    May aid in troubleshooting) -->
+  <logger name="org.apache.camel" level="WARN" additivity="false" />
+  <logger name="org.apache.cxf" level="WARN" additivity="false" />
+  <logger name="org.apache.camel.processor.interceptor" level="WARN" additivity="false"/>
+  <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" additivity="false" />
+  <logger name="org.apache.cxf.service" level="WARN" additivity="false" />
+  <logger name="org.restlet" level="DEBUG" additivity="false" />
+  <logger name="org.apache.camel.component.restlet" level="DEBUG" additivity="false" />
+  <logger name="org.apache.kafka" level="DEBUG" additivity="false" />
+  <logger name="org.apache.zookeeper" level="INFO" additivity="false" />
+  <logger name="org.I0Itec.zkclient" level="DEBUG" additivity="false" />
+
+  <!-- logback internals logging -->
+  <logger name="ch.qos.logback.classic" level="INFO" additivity="false"/>
+  <logger name="ch.qos.logback.core" level="INFO" additivity="false" />
+
+  <!-- logback jms appenders & loggers definition starts here -->
+  <!-- logback jms appenders & loggers definition starts here -->
+  <appender name="auditLogs" class="ch.qos.logback.core.ConsoleAppender">
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+    </filter>
+    <encoder>
+      <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+    </encoder>
+  </appender>
+  <appender name="perfLogs" class="ch.qos.logback.core.ConsoleAppender">
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+    </filter>
+    <encoder>
+      <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+    </encoder>
+  </appender>
+  <appender name="ASYNC-audit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>1000</queueSize>
+    <discardingThreshold>0</discardingThreshold>
+    <appender-ref ref="Audit-Record-Queue" />
+  </appender>
+
+  <logger name="AuditRecord" level="INFO" additivity="FALSE">
+    <appender-ref ref="STDOUT" />
+  </logger>
+  <logger name="AuditRecord_DirectCall" level="INFO" additivity="FALSE">
+    <appender-ref ref="STDOUT" />
+  </logger>
+  <appender name="ASYNC-perf" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>1000</queueSize>
+    <discardingThreshold>0</discardingThreshold>
+    <appender-ref ref="Performance-Tracker-Queue" />
+  </appender>
+  <logger name="PerfTrackerRecord" level="INFO" additivity="FALSE">
+    <appender-ref ref="ASYNC-perf" />
+    <appender-ref ref="perfLogs" />
+  </logger>
+  <!-- logback jms appenders & loggers definition ends here -->
+
+  <root level="DEBUG">
+    <appender-ref ref="DEBUG" />
+    <appender-ref ref="ERROR" />
+    <appender-ref ref="INFO" />
+    <appender-ref ref="STDOUT" />
+  </root>
+
+</configuration>
diff --git a/solution/dev/docker-compose.yml b/solution/dev/docker-compose.yml
new file mode 100755 (executable)
index 0000000..d1ab3d2
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
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 (executable)
index 0000000..d4ef1eb
--- /dev/null
@@ -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 (file)
index 0000000..299a6cf
--- /dev/null
@@ -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" : "<alarm-notif xmlns=\"urn:o-ran:fm:1.0\"><fault-id>$$uint16_counter$$</fault-id><fault-source>%%object%%</fault-source><affected-objects><name>%%affected-object%%</name></affected-objects><fault-severity>%%fault-severity%%</fault-severity><is-cleared>%%cleared%%</is-cleared><fault-text>%%text%%</fault-text><event-time>%%date-time%%</event-time></alarm-notif>",
+        "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 (file)
index 0000000..108b10a
--- /dev/null
@@ -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 (file)
index 0000000..f5b2cc4
--- /dev/null
@@ -0,0 +1,20 @@
+<network-function xmlns="urn:o-ran-sc:yang:o-ran-sc-du-hello-world">
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11221</name>
+      <administrative-state>LOCKED</administrative-state>
+      <operational-state>ENABLED</operational-state>
+      <status>connected</status>
+    </du-to-ru-connection>
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11222</name>
+      <administrative-state>UNLOCKED</administrative-state>
+      <operational-state>ENABLED</operational-state>
+      <status>disconnected</status>
+    </du-to-ru-connection>
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11223</name>
+      <administrative-state>LOCKED</administrative-state>
+      <operational-state>DISABLED</operational-state>
+      <status>unable-to-connect</status>
+    </du-to-ru-connection>
+  </network-function>
\ 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 (file)
index 0000000..72cd076
--- /dev/null
@@ -0,0 +1,14 @@
+<network-function xmlns="urn:o-ran-sc:yang:o-ran-sc-du-hello-world">
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11221</name>
+      <administrative-state>LOCKED</administrative-state>
+    </du-to-ru-connection>
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11222</name>
+      <administrative-state>UNLOCKED</administrative-state>
+    </du-to-ru-connection>
+    <du-to-ru-connection>
+      <name>highstreet-O-RU-11223</name>
+      <administrative-state>LOCKED</administrative-state>
+    </du-to-ru-connection>
+  </network-function>
\ 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 (file)
index 0000000..32373a4
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..d6e01e2
--- /dev/null
@@ -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 (file)
index 0000000..fc33594
--- /dev/null
@@ -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 (file)
index 0000000..ea4e2ac
--- /dev/null
@@ -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 (file)
index 0000000..26bf460
--- /dev/null
@@ -0,0 +1,4 @@
+Server {
+       org.apache.zookeeper.server.auth.DigestLoginModule required
+       user_kafka=kafka_secret;
+};
\ No newline at end of file