Move PM-Mapper CSIT to project repo 74/121474/8
authorLasse Kaihlavirta <l.kaihlavirt@partner.samsung.com>
Fri, 21 May 2021 09:59:08 +0000 (12:59 +0300)
committerLasse Kaihlavirta <l.kaihlavirt@partner.samsung.com>
Wed, 26 May 2021 07:44:59 +0000 (10:44 +0300)
Issue-ID: DCAEGEN2-2746
Signed-off-by: Lasse Kaihlavirta <l.kaihlavirt@partner.samsung.com>
Change-Id: Ib96f8453fd7fecbaddaada1b11d3b8551bb7f8fa

70 files changed:
csit/.gitignore [new file with mode: 0644]
csit/README.md [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/addSubscriber.json [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/cbs.json [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/cert.jks [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/config.json [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/createFeed.json [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/jks.pass [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/mrserver.js [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/node.properties [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/provserver.properties [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/trust.jks [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/assets/trust.pass [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/docker-compose.yml [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/setup.sh [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/teardown.sh [new file with mode: 0644]
csit/plans/filesprocessingconfigpmmapper/testplan.txt [new file with mode: 0644]
csit/plans/pmmapper/assets/addFeed3.txt [new file with mode: 0644]
csit/plans/pmmapper/assets/addSubscriber.json [new file with mode: 0644]
csit/plans/pmmapper/assets/addSubscriber.txt [new file with mode: 0644]
csit/plans/pmmapper/assets/cbs.json [new file with mode: 0644]
csit/plans/pmmapper/assets/cert.jks [new file with mode: 0644]
csit/plans/pmmapper/assets/config.json [new file with mode: 0644]
csit/plans/pmmapper/assets/createFeed.json [new file with mode: 0644]
csit/plans/pmmapper/assets/jks.pass [new file with mode: 0644]
csit/plans/pmmapper/assets/mrserver.js [new file with mode: 0644]
csit/plans/pmmapper/assets/node.properties [new file with mode: 0644]
csit/plans/pmmapper/assets/provserver.properties [new file with mode: 0644]
csit/plans/pmmapper/assets/trust.jks [new file with mode: 0644]
csit/plans/pmmapper/assets/trust.pass [new file with mode: 0644]
csit/plans/pmmapper/docker-compose.yml [new file with mode: 0644]
csit/plans/pmmapper/setup.sh [new file with mode: 0644]
csit/plans/pmmapper/teardown.sh [new file with mode: 0644]
csit/plans/pmmapper/testplan.txt [new file with mode: 0644]
csit/prepare-csit.sh [new file with mode: 0755]
csit/run-csit.sh [new file with mode: 0755]
csit/run-project-csit.sh [new file with mode: 0755]
csit/scripts/common_functions.sh [new file with mode: 0755]
csit/scripts/kill-instance.sh [new file with mode: 0755]
csit/tests/filesprocessingconfigpmmapper/__init__.robot [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/.gitattributes [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/ABigFile.xml [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/config_10_1.env [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/config_1_1.env [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/config_1_10.env [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/assets/valid_metadata.json [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/filesprocessingconfigpmmapper.robot [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.py [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.pyc [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.py [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.pyc [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.py [new file with mode: 0644]
csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.pyc [new file with mode: 0644]
csit/tests/pmmapper/__init__.robot [new file with mode: 0644]
csit/tests/pmmapper/assets/.gitattributes [new file with mode: 0644]
csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml.gz [new file with mode: 0644]
csit/tests/pmmapper/assets/A_no_managed_element.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/A_no_measdata.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/C20190328.0000-0015.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/diff_vendor_metadata.json [new file with mode: 0644]
csit/tests/pmmapper/assets/new_radio/A20181004.0000-1000-0015-1000_5G.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/new_radio/C20190329.0000-0015.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/new_radio/PM202007171301+020024C202007171207+0200-1215+0200_45678.xml [new file with mode: 0644]
csit/tests/pmmapper/assets/new_radio/valid_metadata.json [new file with mode: 0644]
csit/tests/pmmapper/assets/pm_filter_config.json [new file with mode: 0644]
csit/tests/pmmapper/assets/pm_filter_regex_config.json [new file with mode: 0644]
csit/tests/pmmapper/assets/valid_metadata.json [new file with mode: 0644]
csit/tests/pmmapper/assets/vendor_filter_config.json [new file with mode: 0644]
csit/tests/pmmapper/pmmapper.robot [new file with mode: 0644]

diff --git a/csit/.gitignore b/csit/.gitignore
new file mode 100644 (file)
index 0000000..c8865c2
--- /dev/null
@@ -0,0 +1,2 @@
+env.properties
+archives/
diff --git a/csit/README.md b/csit/README.md
new file mode 100644 (file)
index 0000000..88d0411
--- /dev/null
@@ -0,0 +1,38 @@
+## Continuous System and Integration Testing (CSIT) for DCAEGEN2 PM-Mapper
+
+The directory structure:
+
+- **plans/** contains testing plans, each sub-folder represents a separate test plan with contents processed subsequently:
+    _startup.sh_ (serves docker containers startup), _testplan.txt_ (lists test suites), _teardown.sh_ (serves docker containers stopping and images removal)
+- **scripts/** contains shell scripts used on tests executions
+- **tests/** contains test suites that are processed by folder name (relative to _tests_ folder) taken from _testplan.txt_
+
+Test suites are executed using Robot framework.
+
+### Running on local environment
+
+Prerequisites:
+- maven
+- docker
+- docker-compose
+- settings.xml corresponding to the one under oparent repository 
+
+```bash
+
+Navigate to project directory
+```bash
+cd ~/<your_git_repo>/pm-mapper
+```
+
+Build a docker image from your pm-mapper directory:
+
+```bash
+mvn clean install docker:build
+```
+
+Execute tests from pm-mapper/csit folder:
+```bash
+cd csit
+./run-project-csit.sh
+```
+
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/addSubscriber.json b/csit/plans/filesprocessingconfigpmmapper/assets/addSubscriber.json
new file mode 100644 (file)
index 0000000..0666a7d
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "delivery":{
+       "url":"http://dcae-pm-mapper:8081/delivery",
+       "user":"username",
+       "password":"password",
+       "use100":true
+    },
+    "follow_redirect":false,
+    "metadataOnly":false,
+    "suspend":false,
+    "groupid":0,
+    "links":{
+       "self": "https://dmaap-dr-prov/subscribe/1",
+       "log": "https://dmaap-dr-prov/feedlog/1",
+       "feed": "https://dmaap-dr-prov/feed/1"
+    },
+    "subscriber":"pmmapper",
+    "decompress":true,
+    "privilegedSubscriber": true
+ }
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/cbs.json b/csit/plans/filesprocessingconfigpmmapper/assets/cbs.json
new file mode 100644 (file)
index 0000000..a29956f
--- /dev/null
@@ -0,0 +1,7 @@
+{
+    "ID": "cbs",
+    "Name": "config_binding_service",
+    "Tags": ["cbs"],
+    "Address": "ipaddress",
+    "Port": 10000
+}
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/cert.jks b/csit/plans/filesprocessingconfigpmmapper/assets/cert.jks
new file mode 100644 (file)
index 0000000..33dc9a3
Binary files /dev/null and b/csit/plans/filesprocessingconfigpmmapper/assets/cert.jks differ
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/config.json b/csit/plans/filesprocessingconfigpmmapper/assets/config.json
new file mode 100644 (file)
index 0000000..3f1009d
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "pm-mapper-filter": { "filters":[]},
+  "key_store_path": "/opt/app/pm-mapper/etc/certs/cert.jks",
+  "key_store_pass_path": "/opt/app/pm-mapper/etc/certs/jks.pass",
+  "trust_store_path": "/opt/app/pm-mapper/etc/certs/trust.jks",
+  "trust_store_pass_path": "/opt/app/pm-mapper/etc/certs/trust.pass",
+  "dmaap_dr_delete_endpoint": "https://dmaap-dr-node:8443/delete",
+  "dmaap_dr_feed_name": "1",
+  "aaf_identity": "aaf_admin@people.osaaf.org",
+  "aaf_password": "demo123456!",
+  "enable_http": true,
+  "streams_publishes": {
+    "dmaap_publisher": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/org.onap.dmaap.mr.VES_PM",
+        "client_role": "org.onap.dcae.pmPublisher",
+        "location": "csit-pmmapper",
+        "client_id": "1562763644939"
+      }
+    }
+  },
+  "streams_subscribes": {
+    "dmaap_subscriber": {
+      "type": "data_router",
+      "dmaap_info": {
+        "username": "username",
+        "password": "password",
+        "location": "csit-pmmapper",
+        "delivery_url": "http://dcae-pm-mapper:8081/delivery",
+        "subscriber_id": 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/createFeed.json b/csit/plans/filesprocessingconfigpmmapper/assets/createFeed.json
new file mode 100644 (file)
index 0000000..f93633d
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "name": "PM Mapper Feed",
+    "version": "m1.0",
+    "description": "PM Mapper Feed",
+    "business_description": "PM Mapper",
+    "suspend": false,
+    "deleted": false,
+    "changeowner": true,
+    "authorization": {
+      "classification": "unclassified",
+      "endpoint_addrs": [],
+      "endpoint_ids": [
+        {
+          "password": "pmmapper",
+          "id": "pmmapper"
+        }]
+    }
+  }
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/jks.pass b/csit/plans/filesprocessingconfigpmmapper/assets/jks.pass
new file mode 100644 (file)
index 0000000..ae8f7e7
--- /dev/null
@@ -0,0 +1 @@
+Er1tmip;T4w[%1}YE?x{fN9v
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/mrserver.js b/csit/plans/filesprocessingconfigpmmapper/assets/mrserver.js
new file mode 100644 (file)
index 0000000..cc84571
--- /dev/null
@@ -0,0 +1,28 @@
+var httpServer = function () {
+  var http = require('http'),
+      url = require('url'),
+      fs = require('fs'),
+
+      start = function (port) {
+        var server = http.createServer(function (req, res) {
+          processHttpRequest(res);
+        });
+        server.listen(port, function () {
+          console.log('Listening on ' + port + '...');
+        });
+      },
+
+      processHttpRequest = function (res) {
+        res.writeHead(200, {'Content-Type': 'text/plain'});
+        console.log('received message');
+        setTimeout(() => {
+          res.end('Published Successfully.\n');
+        }, 100);
+      };
+
+  return {
+    start: start
+  }
+}();
+
+httpServer.start(3904);
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/node.properties b/csit/plans/filesprocessingconfigpmmapper/assets/node.properties
new file mode 100644 (file)
index 0000000..7abaf60
--- /dev/null
@@ -0,0 +1,89 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright ï¿½ 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Modifications Copyright (C) 2021 Nokia Intellectual Property
+# * ===========================================================================
+# * 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.
+# *
+#-------------------------------------------------------------------------------
+#
+#    Configuration parameters set at startup for the DataRouter node
+#
+#    URL to retrieve dynamic configuration
+ProvisioningURL = https://dmaap-dr-prov:8443/internal/prov
+#
+#    URL to upload PUB/DEL/EXP logs
+LogUploadURL = https://dmaap-dr-prov:8443/internal/logs
+#
+#    The port number for http as seen within the server
+IntHttpPort = 8080
+#
+#    The port number for https as seen within the server
+IntHttpsPort = 8443
+#
+#    The external port number for https taking port mapping into account
+ExtHttpsPort = 443
+#
+#    The minimum interval between fetches of the dynamic configuration from the provisioning server
+MinProvFetchInterval = 10000
+#
+#    The minimum interval between saves of the redirection data file
+MinRedirSaveInterval = 10000
+#
+#    The path to the directory where log files are stored
+LogDir = /opt/app/datartr/logs
+#
+#    The retention interval (in days) for log files
+LogRetention = 30
+#
+#    The path to the directories where data and meta data files are stored
+SpoolDir = /opt/app/datartr/spool
+#
+#    The path to the redirection data file
+RedirectionFile = etc/redirections.dat
+#
+#    The type of keystore for https
+KeyStoreType = PKCS12
+#
+#    The type of truststore for https
+TrustStoreType = jks
+#
+#    The path to the file used to trigger an orderly shutdown
+QuiesceFile = etc/SHUTDOWN
+#
+#    The key used to generate passwords for node to node transfers
+NodeAuthKey = Node123!
+#
+#    DR_NODE DEFAULT ENABLED TLS PROTOCOLS
+NodeHttpsProtocols = TLSv1.1|TLSv1.2
+#
+#    AAF type to generate permission string
+AAFType = org.onap.dmaap-dr.feed
+#
+#    AAF default instance to generate permission string - default should be legacy
+AAFInstance = legacy
+#
+#    AAF action to generate permission string - default should be publish
+AAFAction = publish
+#
+#    AAF CADI enabled flag
+CadiEnabled = false
+#
+#    AAF Props file path
+AAFPropsFilePath = /opt/app/osaaf/local/org.onap.dmaap-dr.props
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/provserver.properties b/csit/plans/filesprocessingconfigpmmapper/assets/provserver.properties
new file mode 100644 (file)
index 0000000..cd333ef
--- /dev/null
@@ -0,0 +1,62 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright ï¿½ 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Modifications Copyright (C) 2021 Nokia Intellectual Property
+# * ===========================================================================
+# * 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.
+# *
+#-------------------------------------------------------------------------------
+
+#Jetty Server properties
+org.onap.dmaap.datarouter.provserver.http.port           = 8080
+org.onap.dmaap.datarouter.provserver.https.port          = 8443
+org.onap.dmaap.datarouter.provserver.https.relaxation    = true
+
+org.onap.dmaap.datarouter.provserver.aafprops.path       = /opt/app/osaaf/local/org.onap.dmaap-dr.props
+
+org.onap.dmaap.datarouter.provserver.accesslog.dir       = /opt/app/datartr/logs
+org.onap.dmaap.datarouter.provserver.spooldir            = /opt/app/datartr/spool
+org.onap.dmaap.datarouter.provserver.dbscripts           = /opt/app/datartr/etc/misc
+org.onap.dmaap.datarouter.provserver.logretention        = 30
+
+#DMAAP-597 (Tech Dept) REST request source IP auth
+# relaxation to accommodate OOM kubernetes deploy
+org.onap.dmaap.datarouter.provserver.isaddressauthenabled = false
+
+#Localhost address config
+org.onap.dmaap.datarouter.provserver.localhost = 127.0.0.1
+
+# Database access
+org.onap.dmaap.datarouter.db.driver   = org.mariadb.jdbc.Driver
+org.onap.dmaap.datarouter.db.url      = jdbc:mariadb://datarouter-mariadb:3306/datarouter
+org.onap.dmaap.datarouter.db.login    = datarouter
+org.onap.dmaap.datarouter.db.password = datarouter
+
+# PROV - DEFAULT ENABLED TLS PROTOCOLS
+org.onap.dmaap.datarouter.provserver.https.include.protocols = TLSv1.1|TLSv1.2
+
+# AAF config
+org.onap.dmaap.datarouter.provserver.cadi.enabled = false
+
+org.onap.dmaap.datarouter.provserver.passwordencryption   = PasswordEncryptionKey#@$%^&1234#
+org.onap.dmaap.datarouter.provserver.aaf.feed.type        = org.onap.dmaap-dr.feed
+org.onap.dmaap.datarouter.provserver.aaf.sub.type         = org.onap.dmaap-dr.sub
+org.onap.dmaap.datarouter.provserver.aaf.instance         = legacy
+org.onap.dmaap.datarouter.provserver.aaf.action.publish   = publish
+org.onap.dmaap.datarouter.provserver.aaf.action.subscribe = subscribe
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/trust.jks b/csit/plans/filesprocessingconfigpmmapper/assets/trust.jks
new file mode 100644 (file)
index 0000000..679c95a
Binary files /dev/null and b/csit/plans/filesprocessingconfigpmmapper/assets/trust.jks differ
diff --git a/csit/plans/filesprocessingconfigpmmapper/assets/trust.pass b/csit/plans/filesprocessingconfigpmmapper/assets/trust.pass
new file mode 100644 (file)
index 0000000..d3d01b0
--- /dev/null
@@ -0,0 +1 @@
+583Ls;XF(qDQu3p!L22gyh1t
\ No newline at end of file
diff --git a/csit/plans/filesprocessingconfigpmmapper/docker-compose.yml b/csit/plans/filesprocessingconfigpmmapper/docker-compose.yml
new file mode 100644 (file)
index 0000000..19edc25
--- /dev/null
@@ -0,0 +1,119 @@
+version: '3.3'
+
+services:
+  datarouter-prov:
+    image: nexus3.onap.org:10001/onap/dmaap/datarouter-prov:latest
+    container_name: datarouter-prov
+    hostname: dmaap-dr-prov
+    ports:
+     - "443:8443"
+     - "8443:8443"
+     - "8080:8080"
+    volumes:
+     - /var/tmp/provserver.properties:/opt/app/datartr/etc/provserver.properties
+    depends_on:
+      - mariadb
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://dmaap-dr-prov:8080/internal/prov"]
+      interval: 10s
+      timeout: 10s
+      retries: 5
+    networks:
+      pmmapper-network:
+        ipv4_address: $DR_PROV_IP
+    extra_hosts:
+      - "dmaap-dr-node:$DR_NODE_IP"
+      - "dcae-pm-mapper:$PMMAPPER_IP"
+
+  datarouter-node:
+    image: nexus3.onap.org:10001/onap/dmaap/datarouter-node:latest
+    container_name: datarouter-node
+    hostname: dmaap-dr-node
+    ports:
+     - "9443:8443"
+     - "9090:8080"
+    volumes:
+     - /var/tmp/node.properties:/opt/app/datartr/etc/node.properties
+    depends_on:
+      - datarouter-prov
+    networks:
+      pmmapper-network:
+        ipv4_address: $DR_NODE_IP
+    extra_hosts:
+      - "dmaap-dr-prov:$DR_PROV_IP"
+      - "dcae-pm-mapper:$PMMAPPER_IP"
+
+  node:
+    image: nexus3.onap.org:10001/node:10-slim
+    container_name: mr-simulator
+    volumes:
+      - /var/tmp/mrserver.js:/tmp/mrserver.js
+    command:
+      nodejs /tmp/mrserver.js
+    networks:
+      pmmapper-network:
+        ipv4_address: $NODE_IP
+
+  mariadb:
+    image: nexus3.onap.org:10001/mariadb:10.2.14
+    container_name: mariadb
+    ports:
+      - "3306:3306"
+    environment:
+      MYSQL_ROOT_PASSWORD: datarouter
+      MYSQL_DATABASE: datarouter
+      MYSQL_USER: datarouter
+      MYSQL_PASSWORD: datarouter
+    healthcheck:
+      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "--silent"]
+      interval: 10s
+      timeout: 30s
+      retries: 5
+    networks:
+      pmmapper-network:
+        ipv4_address: $MARIADB_IP
+
+  consul:
+    container_name: consul
+    image: nexus3.onap.org:10001/consul:latest
+    networks:
+      pmmapper-network:
+        ipv4_address: $CONSUL_IP
+
+  cbs:
+    container_name: cbs
+    image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.platform.configbinding.app-app:latest
+    environment:
+       CONSUL_HOST: $CONSUL_IP
+    networks:
+      pmmapper-network:
+        ipv4_address: $CBS_IP
+
+  pmmapper:
+    container_name: pmmapper
+    image: onap/org.onap.dcaegen2.services.pm-mapper:latest
+    ports:
+     - "8081:8081"
+    volumes:
+      - /var/tmp/:/opt/app/pm-mapper/etc/certs/
+    depends_on:
+      - datarouter-prov
+    environment:
+       CONFIG_BINDING_SERVICE_SERVICE_HOST: $CBS_IP
+       CONFIG_BINDING_SERVICE_SERVICE_PORT: 10000
+       HOSTNAME: pmmapper
+    networks:
+      pmmapper-network:
+        ipv4_address: $PMMAPPER_IP
+    extra_hosts:
+      - "dmaap-dr-node:$DR_NODE_IP"
+      - "message-router:$NODE_IP"
+
+
+networks:
+  pmmapper-network:
+    driver: bridge
+    ipam:
+      config:
+        - subnet: 172.18.0.0/16
+
diff --git a/csit/plans/filesprocessingconfigpmmapper/setup.sh b/csit/plans/filesprocessingconfigpmmapper/setup.sh
new file mode 100644 (file)
index 0000000..5f0b41b
--- /dev/null
@@ -0,0 +1,101 @@
+#!/bin/bash
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+TEST_PLANS_DIR=$WORKSPACE/plans/filesprocessingconfigpmmapper
+
+export GATEWAY_IP=172.18.0.1
+export DR_NODE_IP=172.18.0.2
+export DR_PROV_IP=172.18.0.3
+export CONSUL_IP=172.18.0.4
+export CBS_IP=172.18.0.5
+export MARIADB_IP=172.18.0.6
+export NODE_IP=172.18.0.7
+export PMMAPPER_IP=172.18.0.8
+
+for asset in provserver.properties node.properties cbs.json mrserver.js cert.jks jks.pass trust.jks trust.pass; do
+  cp $TEST_PLANS_DIR/assets/${asset} /var/tmp/
+done
+
+sed -i 's/datarouter-mariadb/'$MARIADB_IP'/g' /var/tmp/provserver.properties
+sed -i 's/ipaddress//g' /var/tmp/cbs.json
+
+# ------------------------------------
+#Prepare enviroment for client
+#install docker sdk
+echo "Uninstall docker-py and reinstall docker."
+pip uninstall -y docker-py
+pip uninstall -y docker
+pip install -U docker==2.7.0
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d mariadb consul cbs node
+
+echo "Waiting for MariaDB to come up healthy..."
+for i in {1..30}; do
+    mariadb_state=$(docker inspect --format='{{json .State.Health.Status}}' mariadb)
+    if [ $mariadb_state = '"healthy"' ]
+    then
+      break
+    else
+      sleep 2
+    fi
+done
+[ "$mariadb_state" != '"healthy"' ] && echo "Error: MariaDB container state not healthy" && exit 1
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d datarouter-node datarouter-prov
+
+unset http_proxy
+unset https_proxy
+curl --request PUT --data @/var/tmp/cbs.json http://$CONSUL_IP:8500/v1/agent/service/register
+curl 'http://'$CONSUL_IP':8500/v1/kv/pmmapper?dc=dc1' -X PUT \
+      -H 'Accept: application/json' \
+      -H 'Content-Type: application/json' \
+      -H 'X-Requested-With: XMLHttpRequest' \
+      --data @$TEST_PLANS_DIR/assets/config.json
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d pmmapper
+sleep 2
+
+# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb, Consul, CBS
+containers_ok=false
+for i in {1..5}; do
+    if [ $(docker inspect --format '{{ .State.Running }}' datarouter-node) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' datarouter-prov) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' mariadb) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' mr-simulator) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' consul) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' cbs) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' pmmapper) ]
+    then
+        echo "All required docker containers are up."
+        containers_ok=true
+        break
+    else
+        sleep $i
+    fi
+done
+[ "$containers_ok" = "false" ] && echo "Error: required container not running." && exit 1
+
+# Data Router Configuration.
+docker exec -i datarouter-prov sh -c \
+    "curl -k  -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$GATEWAY_IP"
+docker exec -i datarouter-prov sh -c \
+    "curl -k  -X PUT https://$DR_PROV_IP:8443/internal/api/PROV_AUTH_ADDRESSES?val=dmaap-dr-prov\|$GATEWAY_IP"
+
+# Create PM Mapper feed and create PM Mapper subscriber on data router
+curl -v -X POST -H "Content-Type:application/vnd.dmaap-dr.feed" -H "X-DMAAP-DR-ON-BEHALF-OF:pmmapper" \
+      --data-ascii @$TEST_PLANS_DIR/assets/createFeed.json \
+      --post301 --location-trusted -k https://${DR_PROV_IP}:8443
+curl -v -X POST -H "Content-Type:application/vnd.dmaap-dr.subscription" -H "X-DMAAP-DR-ON-BEHALF-OF:pmmapper" \
+      --data-ascii @$TEST_PLANS_DIR/assets/addSubscriber.json \
+      --post301 --location-trusted -k https://${DR_PROV_IP}:8443/subscribe/1
+
+docker cp pmmapper:/var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log /tmp/pmmapper.log
+sleep 10
+docker exec -it datarouter-prov sh -c "curl http://dmaap-dr-node:8080/internal/fetchProv"
+curl -k https://$DR_PROV_IP:8443/internal/prov
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v CONSUL_IP:${CONSUL_IP} -v DR_PROV_IP:${DR_PROV_IP} -v DMAAP_MR_IP:${DMAAP_MR_IP} -v CBS_IP:${CBS_IP} -v PMMAPPER_IP:${PMMAPPER_IP} -v DR_NODE_IP:${DR_NODE_IP} -v NODE_IP:${NODE_IP}"
diff --git a/csit/plans/filesprocessingconfigpmmapper/teardown.sh b/csit/plans/filesprocessingconfigpmmapper/teardown.sh
new file mode 100644 (file)
index 0000000..e08a34c
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/bash
+echo "Starting teardown script"
+TEST_PLANS_DIR=$WORKSPACE/plans/filesprocessingconfigpmmapper
+mkdir -p $WORKSPACE/archives
+docker exec pmmapper /bin/sh -c "cat /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log"
+kill-instance.sh pmmapper
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml logs > $WORKSPACE/archives/filesprocessingconfigpmmapper-docker-compose.log
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml down -v
diff --git a/csit/plans/filesprocessingconfigpmmapper/testplan.txt b/csit/plans/filesprocessingconfigpmmapper/testplan.txt
new file mode 100644 (file)
index 0000000..902faca
--- /dev/null
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [dcaegen2/services/pm-mapper.git]/csit/tests/.
+# Place the suites in run order.
+filesprocessingconfigpmmapper
diff --git a/csit/plans/pmmapper/assets/addFeed3.txt b/csit/plans/pmmapper/assets/addFeed3.txt
new file mode 100644 (file)
index 0000000..60544d9
--- /dev/null
@@ -0,0 +1,44 @@
+#-------------------------------------------------------------------------------
+# ============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.
+# *
+#-------------------------------------------------------------------------------
+{
+     "name": "Jettydemo",
+     "version": "m1.0",
+     "description": "Jettydemo",
+     "business_description": "Jettydemo",
+     "suspend": false,
+     "deleted": false,
+     "changeowner": true,
+     "authorization": {
+          "classification": "unclassified",
+          "endpoint_addrs": [
+               "<kafka-ip>",
+            ],
+          "endpoint_ids": [
+               {
+                    "password": "rs873m",
+                    "id": "rs873m"
+               }
+          ]
+     },
+}
+
diff --git a/csit/plans/pmmapper/assets/addSubscriber.json b/csit/plans/pmmapper/assets/addSubscriber.json
new file mode 100644 (file)
index 0000000..0666a7d
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "delivery":{
+       "url":"http://dcae-pm-mapper:8081/delivery",
+       "user":"username",
+       "password":"password",
+       "use100":true
+    },
+    "follow_redirect":false,
+    "metadataOnly":false,
+    "suspend":false,
+    "groupid":0,
+    "links":{
+       "self": "https://dmaap-dr-prov/subscribe/1",
+       "log": "https://dmaap-dr-prov/feedlog/1",
+       "feed": "https://dmaap-dr-prov/feed/1"
+    },
+    "subscriber":"pmmapper",
+    "decompress":true,
+    "privilegedSubscriber": true
+ }
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/addSubscriber.txt b/csit/plans/pmmapper/assets/addSubscriber.txt
new file mode 100644 (file)
index 0000000..95cc2af
--- /dev/null
@@ -0,0 +1,35 @@
+#-------------------------------------------------------------------------------
+# ============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.
+# *
+#-------------------------------------------------------------------------------
+{
+"delivery" :
+    {
+        "url" : "http://<kafka-ip>:7070/",
+        "user" : "datarouter",
+        "password" : "datarouter",
+        "use100" : true
+    },
+"metadataOnly" : false,
+"suspend" : false,
+"groupid" : 29,
+"subscriber" : "sg481n"
+}
diff --git a/csit/plans/pmmapper/assets/cbs.json b/csit/plans/pmmapper/assets/cbs.json
new file mode 100644 (file)
index 0000000..a29956f
--- /dev/null
@@ -0,0 +1,7 @@
+{
+    "ID": "cbs",
+    "Name": "config_binding_service",
+    "Tags": ["cbs"],
+    "Address": "ipaddress",
+    "Port": 10000
+}
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/cert.jks b/csit/plans/pmmapper/assets/cert.jks
new file mode 100644 (file)
index 0000000..33dc9a3
Binary files /dev/null and b/csit/plans/pmmapper/assets/cert.jks differ
diff --git a/csit/plans/pmmapper/assets/config.json b/csit/plans/pmmapper/assets/config.json
new file mode 100644 (file)
index 0000000..3f1009d
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "pm-mapper-filter": { "filters":[]},
+  "key_store_path": "/opt/app/pm-mapper/etc/certs/cert.jks",
+  "key_store_pass_path": "/opt/app/pm-mapper/etc/certs/jks.pass",
+  "trust_store_path": "/opt/app/pm-mapper/etc/certs/trust.jks",
+  "trust_store_pass_path": "/opt/app/pm-mapper/etc/certs/trust.pass",
+  "dmaap_dr_delete_endpoint": "https://dmaap-dr-node:8443/delete",
+  "dmaap_dr_feed_name": "1",
+  "aaf_identity": "aaf_admin@people.osaaf.org",
+  "aaf_password": "demo123456!",
+  "enable_http": true,
+  "streams_publishes": {
+    "dmaap_publisher": {
+      "type": "message_router",
+      "dmaap_info": {
+        "topic_url": "http://message-router:3904/events/org.onap.dmaap.mr.VES_PM",
+        "client_role": "org.onap.dcae.pmPublisher",
+        "location": "csit-pmmapper",
+        "client_id": "1562763644939"
+      }
+    }
+  },
+  "streams_subscribes": {
+    "dmaap_subscriber": {
+      "type": "data_router",
+      "dmaap_info": {
+        "username": "username",
+        "password": "password",
+        "location": "csit-pmmapper",
+        "delivery_url": "http://dcae-pm-mapper:8081/delivery",
+        "subscriber_id": 1
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/createFeed.json b/csit/plans/pmmapper/assets/createFeed.json
new file mode 100644 (file)
index 0000000..f93633d
--- /dev/null
@@ -0,0 +1,18 @@
+{
+    "name": "PM Mapper Feed",
+    "version": "m1.0",
+    "description": "PM Mapper Feed",
+    "business_description": "PM Mapper",
+    "suspend": false,
+    "deleted": false,
+    "changeowner": true,
+    "authorization": {
+      "classification": "unclassified",
+      "endpoint_addrs": [],
+      "endpoint_ids": [
+        {
+          "password": "pmmapper",
+          "id": "pmmapper"
+        }]
+    }
+  }
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/jks.pass b/csit/plans/pmmapper/assets/jks.pass
new file mode 100644 (file)
index 0000000..ae8f7e7
--- /dev/null
@@ -0,0 +1 @@
+Er1tmip;T4w[%1}YE?x{fN9v
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/mrserver.js b/csit/plans/pmmapper/assets/mrserver.js
new file mode 100644 (file)
index 0000000..a6a6130
--- /dev/null
@@ -0,0 +1,25 @@
+var httpServer = function() {
+var http = require('http'),
+url = require('url'),
+fs = require('fs'),
+
+start = function(port) {
+    var server = http.createServer(function(req, res) {
+    processHttpRequest(res);   
+    });
+    server.listen(port, function() {
+    console.log('Listening on ' + port + '...');
+    });
+},
+
+processHttpRequest = function(res) {
+    res.writeHead(200, {'Content-Type': 'text/plain'});
+    res.end('Published Successfully.\n');
+};
+
+return {
+    start: start               
+}
+}();
+
+httpServer.start(3904);
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/node.properties b/csit/plans/pmmapper/assets/node.properties
new file mode 100644 (file)
index 0000000..ddd4ebc
--- /dev/null
@@ -0,0 +1,87 @@
+#-------------------------------------------------------------------------------
+# ============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.
+# *
+#-------------------------------------------------------------------------------
+#
+#    Configuration parameters set at startup for the DataRouter node
+#
+#    URL to retrieve dynamic configuration
+ProvisioningURL = https://dmaap-dr-prov:8443/internal/prov
+#
+#    URL to upload PUB/DEL/EXP logs
+LogUploadURL = https://dmaap-dr-prov:8443/internal/logs
+#
+#    The port number for http as seen within the server
+IntHttpPort = 8080
+#
+#    The port number for https as seen within the server
+IntHttpsPort = 8443
+#
+#    The external port number for https taking port mapping into account
+ExtHttpsPort = 443
+#
+#    The minimum interval between fetches of the dynamic configuration from the provisioning server
+MinProvFetchInterval = 10000
+#
+#    The minimum interval between saves of the redirection data file
+MinRedirSaveInterval = 10000
+#
+#    The path to the directory where log files are stored
+LogDir = /opt/app/datartr/logs
+#
+#    The retention interval (in days) for log files
+LogRetention = 30
+#
+#    The path to the directories where data and meta data files are stored
+SpoolDir = /opt/app/datartr/spool
+#
+#    The path to the redirection data file
+RedirectionFile = etc/redirections.dat
+#
+#    The type of keystore for https
+KeyStoreType = PKCS12
+#
+#    The type of truststore for https
+TrustStoreType = jks
+#
+#    The path to the file used to trigger an orderly shutdown
+QuiesceFile = etc/SHUTDOWN
+#
+#    The key used to generate passwords for node to node transfers
+NodeAuthKey = Node123!
+#
+#    DR_NODE DEFAULT ENABLED TLS PROTOCOLS
+NodeHttpsProtocols = TLSv1.1|TLSv1.2
+#
+#    AAF type to generate permission string
+AAFType = org.onap.dmaap-dr.feed
+#
+#    AAF default instance to generate permission string - default should be legacy
+AAFInstance = legacy
+#
+#    AAF action to generate permission string - default should be publish
+AAFAction = publish
+#
+#    AAF CADI enabled flag
+CadiEnabled = false
+#
+#    AAF Props file path
+AAFPropsFilePath = /opt/app/osaaf/local/org.onap.dmaap-dr.props
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/provserver.properties b/csit/plans/pmmapper/assets/provserver.properties
new file mode 100644 (file)
index 0000000..20b5cb9
--- /dev/null
@@ -0,0 +1,60 @@
+#-------------------------------------------------------------------------------
+# ============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.
+# *
+#-------------------------------------------------------------------------------
+
+#Jetty Server properties
+org.onap.dmaap.datarouter.provserver.http.port           = 8080
+org.onap.dmaap.datarouter.provserver.https.port          = 8443
+org.onap.dmaap.datarouter.provserver.https.relaxation    = true
+
+org.onap.dmaap.datarouter.provserver.aafprops.path       = /opt/app/osaaf/local/org.onap.dmaap-dr.props
+
+org.onap.dmaap.datarouter.provserver.accesslog.dir       = /opt/app/datartr/logs
+org.onap.dmaap.datarouter.provserver.spooldir            = /opt/app/datartr/spool
+org.onap.dmaap.datarouter.provserver.dbscripts           = /opt/app/datartr/etc/misc
+org.onap.dmaap.datarouter.provserver.logretention        = 30
+
+#DMAAP-597 (Tech Dept) REST request source IP auth
+# relaxation to accommodate OOM kubernetes deploy
+org.onap.dmaap.datarouter.provserver.isaddressauthenabled = false
+
+#Localhost address config
+org.onap.dmaap.datarouter.provserver.localhost = 127.0.0.1
+
+# Database access
+org.onap.dmaap.datarouter.db.driver   = org.mariadb.jdbc.Driver
+org.onap.dmaap.datarouter.db.url      = jdbc:mariadb://datarouter-mariadb:3306/datarouter
+org.onap.dmaap.datarouter.db.login    = datarouter
+org.onap.dmaap.datarouter.db.password = datarouter
+
+# PROV - DEFAULT ENABLED TLS PROTOCOLS
+org.onap.dmaap.datarouter.provserver.https.include.protocols = TLSv1.1|TLSv1.2
+
+# AAF config
+org.onap.dmaap.datarouter.provserver.cadi.enabled = false
+
+org.onap.dmaap.datarouter.provserver.passwordencryption   = PasswordEncryptionKey#@$%^&1234#
+org.onap.dmaap.datarouter.provserver.aaf.feed.type        = org.onap.dmaap-dr.feed
+org.onap.dmaap.datarouter.provserver.aaf.sub.type         = org.onap.dmaap-dr.sub
+org.onap.dmaap.datarouter.provserver.aaf.instance         = legacy
+org.onap.dmaap.datarouter.provserver.aaf.action.publish   = publish
+org.onap.dmaap.datarouter.provserver.aaf.action.subscribe = subscribe
\ No newline at end of file
diff --git a/csit/plans/pmmapper/assets/trust.jks b/csit/plans/pmmapper/assets/trust.jks
new file mode 100644 (file)
index 0000000..679c95a
Binary files /dev/null and b/csit/plans/pmmapper/assets/trust.jks differ
diff --git a/csit/plans/pmmapper/assets/trust.pass b/csit/plans/pmmapper/assets/trust.pass
new file mode 100644 (file)
index 0000000..d3d01b0
--- /dev/null
@@ -0,0 +1 @@
+583Ls;XF(qDQu3p!L22gyh1t
\ No newline at end of file
diff --git a/csit/plans/pmmapper/docker-compose.yml b/csit/plans/pmmapper/docker-compose.yml
new file mode 100644 (file)
index 0000000..d612de2
--- /dev/null
@@ -0,0 +1,121 @@
+version: '3.3'
+
+services:
+  datarouter-prov:
+    image: nexus3.onap.org:10001/onap/dmaap/datarouter-prov:latest
+    container_name: datarouter-prov
+    hostname: dmaap-dr-prov
+    ports:
+     - "443:8443"
+     - "8443:8443"
+     - "8080:8080"
+    volumes:
+     - /var/tmp/provserver.properties:/opt/app/datartr/etc/provserver.properties
+     - /var/tmp/addSubscriber.txt:/opt/app/datartr/addSubscriber.txt
+     - /var/tmp/addFeed3.txt:/opt/app/datartr/addFeed3.txt
+    depends_on:
+      - mariadb
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://dmaap-dr-prov:8080/internal/prov"]
+      interval: 10s
+      timeout: 10s
+      retries: 5
+    networks:
+      pmmapper-network:
+        ipv4_address: $DR_PROV_IP
+    extra_hosts:
+      - "dmaap-dr-node:$DR_NODE_IP"
+      - "dcae-pm-mapper:$PMMAPPER_IP"
+
+  datarouter-node:
+    image: nexus3.onap.org:10001/onap/dmaap/datarouter-node:latest
+    container_name: datarouter-node
+    hostname: dmaap-dr-node
+    ports:
+     - "9443:8443"
+     - "9090:8080"
+    volumes:
+     - /var/tmp/node.properties:/opt/app/datartr/etc/node.properties
+    depends_on:
+      - datarouter-prov
+    networks:
+      pmmapper-network:
+        ipv4_address: $DR_NODE_IP
+    extra_hosts:
+      - "dmaap-dr-prov:$DR_PROV_IP"
+      - "dcae-pm-mapper:$PMMAPPER_IP"
+
+  node:
+    image: node:10-slim
+    container_name: mr-simulator
+    volumes:
+      - /var/tmp/mrserver.js:/tmp/mrserver.js
+    command:
+      nodejs /tmp/mrserver.js
+    networks:
+      pmmapper-network:
+        ipv4_address: $NODE_IP
+
+  mariadb:
+    image: mariadb:10.2.14
+    container_name: mariadb
+    ports:
+      - "3306:3306"
+    environment:
+      MYSQL_ROOT_PASSWORD: datarouter
+      MYSQL_DATABASE: datarouter
+      MYSQL_USER: datarouter
+      MYSQL_PASSWORD: datarouter
+    healthcheck:
+      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "--silent"]
+      interval: 10s
+      timeout: 30s
+      retries: 5
+    networks:
+      pmmapper-network:
+        ipv4_address: $MARIADB_IP
+
+  consul:
+    container_name: consul
+    image: nexus3.onap.org:10001/consul:latest
+    networks:
+      pmmapper-network:
+        ipv4_address: $CONSUL_IP
+
+  cbs:
+    container_name: cbs
+    image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.platform.configbinding.app-app:latest
+    environment:
+       CONSUL_HOST: $CONSUL_IP
+    networks:
+      pmmapper-network:
+        ipv4_address: $CBS_IP
+
+  pmmapper:
+    container_name: pmmapper
+    image: onap/org.onap.dcaegen2.services.pm-mapper:latest
+    ports:
+     - "8081:8081"
+    volumes:
+      - /var/tmp/:/opt/app/pm-mapper/etc/certs/
+    depends_on:
+      - datarouter-prov
+    environment:
+       CONFIG_BINDING_SERVICE_SERVICE_HOST: $CBS_IP
+       CONFIG_BINDING_SERVICE_SERVICE_PORT: 10000
+       HOSTNAME: pmmapper
+    networks:
+      pmmapper-network:
+        ipv4_address: $PMMAPPER_IP
+    extra_hosts:
+      - "dmaap-dr-node:$DR_NODE_IP"
+      - "message-router:$NODE_IP"
+
+
+networks:
+  pmmapper-network:
+    driver: bridge
+    ipam:
+      config:
+        - subnet: 172.18.0.0/16
+
diff --git a/csit/plans/pmmapper/setup.sh b/csit/plans/pmmapper/setup.sh
new file mode 100644 (file)
index 0000000..918b7f6
--- /dev/null
@@ -0,0 +1,94 @@
+#!/bin/bash
+# Place the scripts in run order:
+source ${SCRIPTS}/common_functions.sh
+
+docker login -u docker -p docker nexus3.onap.org:10001
+
+TEST_PLANS_DIR=$WORKSPACE/plans/pmmapper
+
+export GATEWAY_IP=172.18.0.1
+export DR_NODE_IP=172.18.0.2
+export DR_PROV_IP=172.18.0.3
+export CONSUL_IP=172.18.0.4
+export CBS_IP=172.18.0.5
+export MARIADB_IP=172.18.0.6
+export NODE_IP=172.18.0.7
+export PMMAPPER_IP=172.18.0.8
+
+for asset in provserver.properties addSubscriber.txt addFeed3.txt node.properties cbs.json mrserver.js cert.jks jks.pass trust.jks trust.pass; do
+  cp $TEST_PLANS_DIR/assets/${asset} /var/tmp/
+done
+
+sed -i 's/datarouter-mariadb/'$MARIADB_IP'/g' /var/tmp/provserver.properties
+#sed -i 's/<kafka-ip>/'$KAFKA_IP'/g' /var/tmp/addSubscriber.txt
+#sed -i 's/<kafka-ip>/'$KAFKA_IP'/g' /var/tmp/addFeed3.txt
+#sed -i 's/ipaddress/'$CBS_IP'/g' /var/tmp/cbs.json
+sed -i 's/ipaddress//g' /var/tmp/cbs.json
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d mariadb consul cbs node
+
+echo "Waiting for MariaDB to come up healthy..."
+for i in {1..30}; do
+    mariadb_state=$(docker inspect --format='{{json .State.Health.Status}}' mariadb)
+    if [ $mariadb_state = '"healthy"' ]
+    then
+      break
+    else
+      sleep 2
+    fi
+done
+[ "$mariadb_state" != '"healthy"' ] && echo "Error: MariaDB container state not healthy" && exit 1
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d datarouter-node datarouter-prov
+
+curl --request PUT --data @/var/tmp/cbs.json http://$CONSUL_IP:8500/v1/agent/service/register
+curl 'http://'$CONSUL_IP':8500/v1/kv/pmmapper?dc=dc1' -X PUT \
+      -H 'Accept: application/json' \
+      -H 'Content-Type: application/json' \
+      -H 'X-Requested-With: XMLHttpRequest' \
+      --data @$TEST_PLANS_DIR/assets/config.json
+
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml up -d pmmapper
+sleep 2
+
+# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb, Consul, CBS
+containers_ok=false
+for i in {1..5}; do
+    if [ $(docker inspect --format '{{ .State.Running }}' datarouter-node) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' datarouter-prov) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' mariadb) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' mr-simulator) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' consul) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' cbs) ] && \
+        [ $(docker inspect --format '{{ .State.Running }}' pmmapper) ]
+    then
+        echo "All required docker containers are up."
+        containers_ok=true
+        break
+    else
+        sleep $i
+    fi
+done
+[ "$containers_ok" = "false" ] && echo "Error: required container not running." && exit 1
+
+# Data Router Configuration.
+docker exec -i datarouter-prov sh -c \
+    "curl -k  -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$GATEWAY_IP"
+docker exec -i datarouter-prov sh -c \
+    "curl -k  -X PUT https://$DR_PROV_IP:8443/internal/api/PROV_AUTH_ADDRESSES?val=dmaap-dr-prov\|$GATEWAY_IP"
+
+# Create PM Mapper feed and create PM Mapper subscriber on data router
+curl -v -X POST -H "Content-Type:application/vnd.dmaap-dr.feed" -H "X-DMAAP-DR-ON-BEHALF-OF:pmmapper" \
+      --data-ascii @$TEST_PLANS_DIR/assets/createFeed.json \
+      --post301 --location-trusted -k https://${DR_PROV_IP}:8443
+curl -v -X POST -H "Content-Type:application/vnd.dmaap-dr.subscription" -H "X-DMAAP-DR-ON-BEHALF-OF:pmmapper" \
+      --data-ascii @$TEST_PLANS_DIR/assets/addSubscriber.json \
+      --post301 --location-trusted -k https://${DR_PROV_IP}:8443/subscribe/1
+
+docker cp pmmapper:/var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log /tmp/pmmapper.log
+sleep 10
+docker exec -it datarouter-prov sh -c "curl http://dmaap-dr-node:8080/internal/fetchProv"
+curl -k https://$DR_PROV_IP:8443/internal/prov
+
+#Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v CONSUL_IP:${CONSUL_IP} -v DR_PROV_IP:${DR_PROV_IP} -v DMAAP_MR_IP:${DMAAP_MR_IP} -v CBS_IP:${CBS_IP} -v PMMAPPER_IP:${PMMAPPER_IP} -v DR_NODE_IP:${DR_NODE_IP}"
diff --git a/csit/plans/pmmapper/teardown.sh b/csit/plans/pmmapper/teardown.sh
new file mode 100644 (file)
index 0000000..8ca608d
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/bash
+echo "Starting teardown script"
+TEST_PLANS_DIR=$WORKSPACE/plans/pmmapper
+mkdir -p $WORKSPACE/archives
+docker exec pmmapper /bin/sh -c "cat /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log"
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml logs > $WORKSPACE/archives/pmmapper-docker-compose.log
+docker-compose -f $TEST_PLANS_DIR/docker-compose.yml down -v
diff --git a/csit/plans/pmmapper/testplan.txt b/csit/plans/pmmapper/testplan.txt
new file mode 100644 (file)
index 0000000..a2cc01b
--- /dev/null
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [dcaegen2/services/pm-mapper.git]/csit/tests/.
+# Place the suites in run order.
+pmmapper
diff --git a/csit/prepare-csit.sh b/csit/prepare-csit.sh
new file mode 100755 (executable)
index 0000000..3cc143d
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/bash -x
+#
+# Copyright 2019-2021 Â© Samsung Electronics Co., Ltd.
+#
+# 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.
+#
+# This script installs common libraries required by CSIT tests
+#
+
+if [ -z "$WORKSPACE" ]; then
+    export WORKSPACE=`git rev-parse --show-toplevel`
+fi
+
+TESTPLANDIR=${WORKSPACE}/${TESTPLAN}
+
+# Assume that if ROBOT_VENV is set and virtualenv with system site packages can be activated, 
+# ci-management/jjb/integration/include-raw-integration-install-robotframework.sh has already
+# been executed
+
+if [ -f ${WORKSPACE}/env.properties ]; then
+    source ${WORKSPACE}/env.properties
+fi
+if [ -f ${ROBOT_VENV}/bin/activate ]; then
+    source ${ROBOT_VENV}/bin/activate
+else
+    rm -rf /tmp/ci-management
+    rm -f ${WORKSPACE}/env.properties
+    cd /tmp
+    git clone "https://gerrit.onap.org/r/ci-management"
+    source /tmp/ci-management/jjb/integration/include-raw-integration-install-robotframework.sh
+fi
+
+# install eteutils
+mkdir -p ${ROBOT_VENV}/src/onap
+rm -rf ${ROBOT_VENV}/src/onap/testsuite
+pip install --upgrade --extra-index-url="https://nexus3.onap.org/repository/PyPi.staging/simple" 'robotframework-onap==0.5.1.*' --pre
+
+pip freeze
+
diff --git a/csit/run-csit.sh b/csit/run-csit.sh
new file mode 100755 (executable)
index 0000000..fcbcbe1
--- /dev/null
@@ -0,0 +1,191 @@
+#!/bin/bash -x
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+# Modification Copyright 2019-2021 Â© Samsung Electronics Co., Ltd.
+#
+# 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.
+#
+# $1 project/functionality
+# $2 robot options
+#
+
+function on_exit(){
+    rc=$?
+    if [[ ${WORKSPACE} ]]; then
+        if [[ ${WORKDIR} ]]; then
+            rsync -av "$WORKDIR/" "$WORKSPACE/archives/$TESTPLAN"
+        fi
+        # Record list of active docker containers
+        docker ps --format "{{.Image}}" > "$WORKSPACE/archives/$TESTPLAN/_docker-images.log"
+
+        # show memory consumption after all docker instances initialized
+        docker_stats | tee "$WORKSPACE/archives/$TESTPLAN/_sysinfo-2-after-robot.txt"
+    fi
+    # Run teardown script plan if it exists
+    cd "${TESTPLANDIR}"
+    TEARDOWN="${TESTPLANDIR}/teardown.sh"
+    if [ -f "${TEARDOWN}" ]; then
+        echo "Running teardown script ${TEARDOWN}"
+        source_safely "${TEARDOWN}"
+    fi
+    exit $rc
+}
+# ensure that teardown and other finalizing steps are always executed
+trap on_exit EXIT
+
+function docker_stats(){
+    #General memory details
+    echo "> top -bn1 | head -3"
+    top -bn1 | head -3
+    echo
+
+    echo "> free -h"
+    free -h
+    echo
+
+    #Memory details per Docker
+    echo "> docker ps"
+    docker ps
+    echo
+
+    echo "> docker stats --no-stream"
+    docker stats --no-stream
+    echo
+}
+
+# save current set options
+function save_set() {
+    RUN_CSIT_SAVE_SET="$-"
+    RUN_CSIT_SHELLOPTS="$SHELLOPTS"
+}
+
+# load the saved set options
+function load_set() {
+    _setopts="$-"
+
+    # bash shellopts
+    for i in $(echo "$SHELLOPTS" | tr ':' ' ') ; do
+        set +o ${i}
+    done
+    for i in $(echo "$RUN_CSIT_SHELLOPTS" | tr ':' ' ') ; do
+        set -o ${i}
+    done
+
+    # other options
+    for i in $(echo "$_setopts" | sed 's/./& /g') ; do
+        set +${i}
+    done
+    set -${RUN_CSIT_SAVE_SET}
+}
+
+# set options for quick bailout when error
+function harden_set() {
+    set -xeo pipefail
+    set +u # enabled it would probably fail too many often
+}
+
+# relax set options so the sourced file will not fail
+# the responsibility is shifted to the sourced file...
+function relax_set() {
+    set +e
+    set +o pipefail
+}
+
+# wrapper for sourcing a file
+function source_safely() {
+    [ -z "$1" ] && return 1
+    relax_set
+    . "$1"
+    load_set
+}
+
+#
+# main
+#
+
+# set and save options for quick failure
+harden_set && save_set
+
+if [ $# -eq 0 ]
+then
+    echo
+    echo "Usage: $0 plans/<project>/<functionality> [<robot-options>]"
+    echo
+    echo "    <project>, <functionality>, <robot-options>:  "
+    echo "        The same values as for the '{project}-csit-{functionality}' JJB job template."
+    echo
+    exit 1
+fi
+
+if [ -z "$WORKSPACE" ]; then
+    export WORKSPACE=$(git rev-parse --show-toplevel)
+fi
+
+if [ -f "${WORKSPACE}/${1}/testplan.txt" ]; then
+    export TESTPLAN="${1}"
+else
+    echo "testplan not found: ${WORKSPACE}/${TESTPLAN}/testplan.txt"
+    exit 2
+fi
+
+export TESTOPTIONS="${2}"
+
+rm -rf "$WORKSPACE/archives/$TESTPLAN"
+mkdir -p "$WORKSPACE/archives/$TESTPLAN"
+
+TESTPLANDIR="${WORKSPACE}/${TESTPLAN}"
+
+# Run installation of prerequired libraries
+source_safely "${WORKSPACE}/prepare-csit.sh"
+
+# Activate the virtualenv containing all the required libraries installed by prepare-csit.sh
+source_safely "${ROBOT_VENV}/bin/activate"
+
+WORKDIR=$(mktemp -d --suffix=-robot-workdir)
+cd "${WORKDIR}"
+
+# Add csit scripts to PATH
+export PATH="${PATH}:${WORKSPACE}/docker/scripts:${WORKSPACE}/scripts:${ROBOT_VENV}/bin"
+export SCRIPTS="${WORKSPACE}/scripts"
+export ROBOT_VARIABLES=
+
+# Sign in to nexus3 docker repo
+docker login -u docker -p docker nexus3.onap.org:10001
+
+# Run setup script plan if it exists
+cd "${TESTPLANDIR}"
+SETUP="${TESTPLANDIR}/setup.sh"
+if [ -f "${SETUP}" ]; then
+    echo "Running setup script ${SETUP}"
+    source_safely "${SETUP}"
+fi
+
+# show memory consumption after all docker instances initialized
+docker_stats | tee "$WORKSPACE/archives/$TESTPLAN/_sysinfo-1-after-setup.txt"
+
+# Run test plan
+cd "$WORKDIR"
+echo "Reading the testplan:"
+cat "${TESTPLANDIR}/testplan.txt" | egrep -v '(^[[:space:]]*#|^[[:space:]]*$)' | sed "s|^|${WORKSPACE}/tests/|" > testplan.txt
+cat testplan.txt
+SUITES=$( xargs -a testplan.txt )
+
+echo ROBOT_VARIABLES="${ROBOT_VARIABLES}"
+echo "Starting Robot test suites ${SUITES} ..."
+relax_set
+python -m robot.run -N ${TESTPLAN} -v WORKSPACE:/tmp ${ROBOT_VARIABLES} ${TESTOPTIONS} ${SUITES}
+RESULT=$?
+load_set
+echo "RESULT: $RESULT"
+# Note that the final steps are done in on_exit function after this exit!
+exit $RESULT
diff --git a/csit/run-project-csit.sh b/csit/run-project-csit.sh
new file mode 100755 (executable)
index 0000000..12eb349
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash -x
+#
+# Copyright 2020-2021 Â© Samsung Electronics Co., Ltd.
+#
+# 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.
+#
+
+# $1 test options (passed on to run-csit.sh as such)
+#
+
+export TESTOPTIONS=${1}
+export WORKSPACE=$(git rev-parse --show-toplevel)/csit
+
+rm -rf ${WORKSPACE}/archives
+mkdir -p ${WORKSPACE}/archives
+cd ${WORKSPACE}
+
+# Execute all testsuites defined under plans subdirectory
+for dir in plans/*/
+do
+    dir=${dir%*/}  # remove the trailing /
+   ./run-csit.sh ${dir} ${TESTOPTIONS}
+done
diff --git a/csit/scripts/common_functions.sh b/csit/scripts/common_functions.sh
new file mode 100755 (executable)
index 0000000..684c418
--- /dev/null
@@ -0,0 +1,263 @@
+#!/bin/bash
+
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+
+function memory_details(){
+    #General memory details
+    echo "> top -bn1 | head -3"
+    top -bn1 | head -3
+    echo
+
+    echo "> free -h"
+    free -h
+    echo
+
+    #Memory details per Docker
+    echo "> docker ps"
+    docker ps
+    echo
+
+    echo "> docker stats --no-stream"
+    docker stats --no-stream
+    echo
+}
+function fibonacci_number(){
+    set +x
+    if [ $1 -le 1 ]
+    then
+        echo "1"
+    elif [ $1 -le 10 ]
+    then
+        Num=$1
+        f1=0
+        f2=1
+        fn=-1
+        for i in `eval echo {1..$Num}`;do
+            fn=$((f1+f2))
+            f1=$f2
+            f2=$fn
+        done
+        echo $fn
+    else
+        echo "30"
+    fi
+}
+function wait_curl_driver(){
+    #Parameters:
+    #CURL_COMMAND - the URL on which the curl command will be executed
+    #GREP_STRING - Desired string to be found inside the body response of the
+    #              previous curl command
+    #EXCLUDE_STRING - If the filtered string (GREP_STRING) must not exist in
+    #                 the body response of the curl
+    #WAIT_MESSAGE - the message to be displayed for logging purpose. (optional)
+    #REPEAT_NUMBER - the maximum number of tries before abandoning the curl
+    #                command (optional, by default = 15)
+    #MAX_TIME - Maximum time allowed for the transfer (in seconds)
+    #STATUS_CODE - A HTTP status code desired to be found by getting the link
+    #  /!\ IMPORTANT NOTICE: the usage of STATUS_CODE option turn GREP_STRING/
+    #  /!\ EXCLUDE_STRING/and the MAX_TIME options becomes obsolete with no
+    #  /!\ execution impact
+    #MEMORY_USAGE - If Parameters exists shows the memory usage after curl
+    #               execution(s)
+
+    repeat_max=15
+    parameters="$@"
+
+    #WAIT_MESSAGE
+    if [[ $parameters == *"WAIT_MESSAGE"* ]]
+    then
+        wait_message=`echo $parameters | sed -e "s/.*WAIT_MESSAGE=//g"`
+        wait_message=`echo $wait_message | sed -e "s/ .*//g"`
+    else
+        wait_message="wait ..."
+    fi
+
+    #REPEAT_NUMBER
+    if [[ $parameters == *"REPEAT_NUMBER"* ]]
+    then
+        repeat_max=`echo $parameters | sed -e "s/.*REPEAT_NUMBER=//g"`
+        repeat_max=`echo $repeat_max | sed -e "s/ .*//g"`
+    fi
+
+    #CURL_COMMAND
+    if [[ $parameters == *"CURL_COMMAND"* ]]
+    then
+        curl_command=`echo $parameters | sed -e 's/.*CURL_COMMAND=//g'`
+        curl_command=`echo $curl_command | sed -e 's/ .*//g'`
+    else
+        echo "-Curl is empty-"  # Or no parameterseter passed.
+        return 0
+    fi
+
+    #MAX_TIME
+    if [[ $parameters == *"MAX_TIME"* ]]
+    then
+        max_time=`echo $parameters | sed -e 's/.*MAX_TIME=//g'`
+        max_time=`echo $max_time | sed -e 's/ .*//g'`
+    else
+        max_time="5"
+    fi
+
+    exclude_string=""
+    #EXCLUDE_STRING
+    if [[ $parameters == *"EXCLUDE_STRING"* ]]
+    then
+        exclude_string="-v"
+    fi
+
+    status_code=""
+    #STATUS_CODE
+    if [[ $parameters == *"STATUS_CODE"* ]]
+    then
+        status_code=`echo $parameters | sed -e 's/.*STATUS_CODE=//g'`
+        status_code=`echo $status_code | sed -e 's/ .*//g'`
+    fi
+
+    for i in `eval echo {1..$repeat_max}`; do
+        response_code=`curl -o /dev/null --silent --head --write-out '%{http_code}' $curl_command`
+        echo "..."
+        if [[ ! -z $status_code ]] ; then
+            if [ "$status_code" -eq "$response_code" ]
+            then
+                echo "SUCCESS:Actual Status code <$response_code> match the expected code <$status_code>"
+                return 0
+            else
+                echo "WARNING:Expected <$status_code> but Actual <$response_code>"
+            fi
+        else
+            #GREP_STRING
+            if [[ $parameters == *"GREP_STRING"* ]]
+            then
+                grep_command=`echo $parameters | sed -e 's/.*GREP_STRING=//g'`
+                grep_command=`echo $grep_command | sed -e 's/ REPEAT_NUMBER=.*//g' | sed -e 's/ CURL_COMMAND=.*//g' | sed -e 's/ WAIT_MESSAGE=.*//g' | sed -e 's/ MAX_TIME=.*//g' | sed -e 's/ EXCLUDE_STRING.*//g'`
+            else
+                echo "-Grep_command is empty-"  # Or no parameters passed.
+                return 0
+            fi
+
+            str=`curl -sS -m$max_time $curl_command | grep "$grep_command"`
+            echo "BODY::$str"
+            if [[ ! -z $exclude_string ]]
+            then
+                if [[ -z $str ]]
+                then
+                    echo "SUCCESS: body response does not contains '$grep_command'";
+                    break;
+                else
+                    echo "Fall_Short: Body response still contains '$grep_command'"
+                fi
+            else
+                if [[ ! -z $str ]]
+                then
+                    echo "SUCCESS: body response contains '$grep_command'";
+                break;
+                else
+                    echo "Fall_Short: Element '$grep_command' not found yet # "$i""
+                fi
+            fi
+
+            if [ "$?" = "7" ]; then
+                echo 'Connection refused or can not connect to server/proxy';
+                str=''
+            fi
+        fi
+        seconds2sleep=`fibonacci_number $i`
+        echo $wait_message
+        echo "Iteration::$i out of $repeat_max "
+        echo "Quiet time for $seconds2sleep seconds ..."
+        sleep $seconds2sleep
+
+       # if waiting for a long time, log system load
+       if [ $i -gt 45 ]
+       then
+            memory_details
+       fi
+    done
+    #MEMORY_USAGE
+    if [[ $parameters == *"MEMORY_USAGE"* ]]
+    then
+        echo "==========================MEMORY USAGE=================================="
+        memory_details
+        echo "========================================================================"
+    fi
+    return 0
+}
+
+function run_simulator ()
+{
+   run_robottestlib
+   run_simulator_docker $1
+}
+
+function run_robottestlib ()
+{
+    #Start the robottest REST library if not started
+    if ! pgrep -f robottest > /dev/null
+    then
+        #Download the latest robottest jar
+        wget -q -O  ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar  "https://nexus.open-o.org/service/local/artifact/maven/redirect?r=snapshots&g=org.openo.integration&a=org.openo.robottest&e=jar&v=LATEST"
+        chmod +x  ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar
+        eval `java -cp ${SCRIPTS}/integration/mockserver/org.openo.robottest.jar  org.openo.robot.test.robottest.MyRemoteLibrary` &
+    fi
+}
+
+function run_simulator_docker ()
+{
+    #Start the simulator docker if not started
+    SIMULATOR_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' simulator`
+    if [[ -z $SIMULATOR_IP ]]
+    then
+        echo "Starting simulator docker..."
+        SIMULATOR_JSON=$1
+        if [[ -z $SIMULATOR_JSON ]]
+        then
+            SIMULATOR_JSON=main.json
+        fi
+        docker run -d -i -t --name simulator -e SIMULATOR_JSON=$SIMULATOR_JSON -p 18009:18009 -p 18008:18008  openoint/simulate-test-docker
+        SIMULATOR_IP=`docker inspect --format '{{ .NetworkSettings.IPAddress }}' simulator`
+    fi
+
+    #Set the simulator IP in robot variables
+    ROBOT_VARIABLES=${ROBOT_VARIABLES}" -v SIMULATOR_IP:${SIMULATOR_IP}  -v SCRIPTS:${SCRIPTS}"
+    echo ${ROBOT_VARIABLES}
+}
+
+function get_docker_compose_service ()
+{
+    local service=$1
+    local compose_file=${2:-docker-compose.yml}
+
+    echo $(docker-compose --file ./${compose_file} ps | grep $service |  cut -d " " -f1 )
+}
+
+function bypass_ip_adress ()
+{
+    local ip_address=$1
+
+    if [[ $no_proxy && $no_proxy != *$ip_address* ]]; then
+        export no_proxy=$no_proxy,$ip_address
+    fi
+}
+
+function wait_for_service_init ()
+{
+    local service_url=$1
+
+    for delay in {1..50}; do
+        curl -sS ${service_url} && break
+        echo "$delay - Waiting for $service_url..."
+        sleep $delay
+    done
+}
diff --git a/csit/scripts/kill-instance.sh b/csit/scripts/kill-instance.sh
new file mode 100755 (executable)
index 0000000..5997098
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Copyright 2016-2017 Huawei Technologies Co., Ltd.
+#
+# 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.
+#
+# $1 nickname for the instance
+
+mkdir -p $WORKSPACE/archives
+
+running_containers=$(docker ps --filter name=$1 -q)
+if [ -z "$running_containers" ]
+then
+    echo "$1 already terminated"
+else
+    echo "Stopping and removing containers"
+    docker logs $running_containers >> $WORKSPACE/archives/$1.log
+    docker stop $running_containers
+    docker rm $running_containers
+fi
+
diff --git a/csit/tests/filesprocessingconfigpmmapper/__init__.robot b/csit/tests/filesprocessingconfigpmmapper/__init__.robot
new file mode 100644 (file)
index 0000000..9eda6de
--- /dev/null
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation    Files Processing Config PM Mapper Testcases
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/.gitattributes b/csit/tests/filesprocessingconfigpmmapper/assets/.gitattributes
new file mode 100644 (file)
index 0000000..57cdc50
--- /dev/null
@@ -0,0 +1 @@
+*.gz binary
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/ABigFile.xml b/csit/tests/filesprocessingconfigpmmapper/assets/ABigFile.xml
new file mode 100644 (file)
index 0000000..8a3bcf4
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+       <fileHeader fileFormatVersion="32.435 V7.0" vendorName="Company NN" dnPrefix="DC=a1.companyNN.com,SubNetwork=1,IRPAgent=1">
+               <fileSender localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" elementType="RNC"/>
+               <measCollec beginTime="2000-03-01T14:00:00+02:00"/>
+       </fileHeader>
+       <measData>
+               <managedElement localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" userLabel="RNC Telecomville"/>
+               <measInfo>
+                       <job jobId="1231"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures</measType>
+                       <measType p="2">succTCHSeizures</measType>
+                       <measType p="3">attImmediateAssignProcs</measType>
+                       <measType p="4">succImmediateAssignProcs</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">234</r>
+                               <r p="2">345</r>
+                               <r p="3">567</r>
+                               <r p="4">789</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">890</r>
+                               <r p="2">901</r>
+                               <r p="3">123</r>
+                               <r p="4">234</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">456</r>
+                               <r p="2">567</r>
+                               <r p="3">678</r>
+                               <r p="4">789</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+               <measInfo measInfoId="ENodeBFunction">
+            <job jobId="1232"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures1</measType>
+            <measType p="2">succTCHSeizures2</measType>
+            <measType p="3">attImmediateAssignProcs3</measType>
+            <measType p="4">succImmediateAssignProcs4</measType>
+            <measValue measObjLdn="ManagedElement=RNC-Gbg-1,ENodeBFunction=1">
+                <r p="1">4</r>
+                <r p="2">86,87,2,6,77,96,75,33,24</r>
+                <r p="3">40</r>
+                <r p="4">90</r>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+               <measInfo>
+                       <job jobId="1233"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures5</measType>
+                       <measType p="2">succTCHSeizures6</measType>
+                       <measType p="3">attImmediateAssignProcs7</measType>
+                       <measType p="4">succImmediateAssignProcs8</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">238</r>
+                               <r p="2">344</r>
+                               <r p="3">563</r>
+                               <r p="4">787</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">898</r>
+                               <r p="2">905</r>
+                               <r p="3">127</r>
+                               <r p="4">238</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">454</r>
+                               <r p="2">569</r>
+                               <r p="3">672</r>
+                               <r p="4">785</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+       </measData>
+       <measData>
+               <managedElement localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" userLabel="RNC Telecomville"/>
+               <measInfo>
+                       <job jobId="1231"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures</measType>
+                       <measType p="2">succTCHSeizures</measType>
+                       <measType p="3">attImmediateAssignProcs</measType>
+                       <measType p="4">succImmediateAssignProcs</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">234</r>
+                               <r p="2">345</r>
+                               <r p="3">567</r>
+                               <r p="4">789</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">890</r>
+                               <r p="2">901</r>
+                               <r p="3">123</r>
+                               <r p="4">234</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">456</r>
+                               <r p="2">567</r>
+                               <r p="3">678</r>
+                               <r p="4">789</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+               <measInfo measInfoId="ENodeBFunction">
+                       <job jobId="1232"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures1</measType>
+                       <measType p="2">succTCHSeizures2</measType>
+                       <measType p="3">attImmediateAssignProcs3</measType>
+                       <measType p="4">succImmediateAssignProcs4</measType>
+                       <measValue measObjLdn="ManagedElement=RNC-Gbg-1,ENodeBFunction=1">
+                               <r p="1">4</r>
+                               <r p="2">86,87,2,6,77,96,75,33,24</r>
+                               <r p="3">40</r>
+                               <r p="4">90</r>
+                               <suspect>false</suspect>
+                       </measValue>
+               </measInfo>
+               <measInfo>
+                       <job jobId="1233"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures5</measType>
+                       <measType p="2">succTCHSeizures6</measType>
+                       <measType p="3">attImmediateAssignProcs7</measType>
+                       <measType p="4">succImmediateAssignProcs8</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">238</r>
+                               <r p="2">344</r>
+                               <r p="3">563</r>
+                               <r p="4">787</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">898</r>
+                               <r p="2">905</r>
+                               <r p="3">127</r>
+                               <r p="4">238</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">454</r>
+                               <r p="2">569</r>
+                               <r p="3">672</r>
+                               <r p="4">785</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+       </measData>
+       <fileFooter>
+               <measCollec endTime="2000-03-01T14:15:00+02:00"/>
+       </fileFooter>
+</measCollecFile>
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/config_10_1.env b/csit/tests/filesprocessingconfigpmmapper/assets/config_10_1.env
new file mode 100644 (file)
index 0000000..050d2f2
--- /dev/null
@@ -0,0 +1,3 @@
+PROCESSING_LIMIT_RATE=10
+THREADS_MULTIPLIER=1
+PROCESSING_THREADS_COUNT=1
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/config_1_1.env b/csit/tests/filesprocessingconfigpmmapper/assets/config_1_1.env
new file mode 100644 (file)
index 0000000..c138912
--- /dev/null
@@ -0,0 +1,3 @@
+PROCESSING_LIMIT_RATE=1
+THREADS_MULTIPLIER=1
+PROCESSING_THREADS_COUNT=1
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/config_1_10.env b/csit/tests/filesprocessingconfigpmmapper/assets/config_1_10.env
new file mode 100644 (file)
index 0000000..b4c290e
--- /dev/null
@@ -0,0 +1,3 @@
+PROCESSING_LIMIT_RATE=1
+THREADS_MULTIPLIER=1
+PROCESSING_THREADS_COUNT=10
diff --git a/csit/tests/filesprocessingconfigpmmapper/assets/valid_metadata.json b/csit/tests/filesprocessingconfigpmmapper/assets/valid_metadata.json
new file mode 100644 (file)
index 0000000..da809d7
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "productName": "gnb",
+    "vendorName": "Ericsson",
+    "lastEpochMicrosec": "1538478000000",
+    "sourceName": "oteNB5309",
+    "startEpochMicrosec": "1538478900000",
+    "timeZoneOffset": "UTC+05.00",
+    "location": "ftpes://192.168.0.101:22/ftp/rop/A20161224.1045-1100.bin.gz",
+    "compression": "gzip",
+    "fileFormatType": "org.3GPP.32.435#measCollec",
+    "fileFormatVersion": "V9"
+  }
\ No newline at end of file
diff --git a/csit/tests/filesprocessingconfigpmmapper/filesprocessingconfigpmmapper.robot b/csit/tests/filesprocessingconfigpmmapper/filesprocessingconfigpmmapper.robot
new file mode 100644 (file)
index 0000000..9648ef8
--- /dev/null
@@ -0,0 +1,149 @@
+*** Settings ***
+Documentation     Testing PM Mapper functionality
+Library           Collections
+Library           OperatingSystem
+Library           RequestsLibrary
+Library           Process
+Library           String
+Library           libraries/DockerContainerManager.py
+Library           libraries/LogReader.py
+
+*** Variables ***
+
+${ASSETS_PATH}                           %{WORKSPACE}/tests/filesprocessingconfigpmmapper/assets
+${NR_VALID_METADATA_PATH}                ${ASSETS_PATH}/valid_metadata.json
+${CLI_EXEC_CLI_PM_LOG_CLEAR}             docker exec pmmapper /bin/sh -c "echo -n "" > /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log"
+${PUBLISH_NODE_URL}                      https://${DR_NODE_IP}:8443/publish/1
+${CLI_EXEC_LOGS_LIST}                    docker exec datarouter-node /bin/sh -c "ls /opt/app/datartr/logs"
+${DOCKER_CLIENT_IMAGE}                   nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pm-mapper:latest
+${CLIENT_CONTAINER_NAME}                 pmmapper
+${FILE_PATH}                             ${ASSETS_PATH}/ABigFile.xml
+${CONFIG_ENVS_1_1}                       ${ASSETS_PATH}/config_1_1.env
+${CONFIG_ENVS_4_1}                       ${ASSETS_PATH}/config_4_1.env
+${CONFIG_ENVS_10_1}                      ${ASSETS_PATH}/config_10_1.env
+${CONFIG_ENVS_1_10}                      ${ASSETS_PATH}/config_1_10.env
+
+*** Test Cases ***
+
+Verify that PM Mapper rejects 6-9 messages when limitRate is 1 and threads count is 1
+    [Tags]                          FILES_PROCESSING_CONFIG_PM_MAPPER_1
+    [Documentation]                 Verify that PM Mapper rejects 6-9/10 messages. Configuration: limitRate=1, threadsCount=1
+    [Timeout]                       15 minute
+
+    RestartPmmapper                 ${CONFIG_ENVS_1_1}
+
+    ${testname}=                    Set Variable                    Afirst-
+
+    SendFilesToDatarouter           ${testname}
+    ${alllogs}=                     GetLogsOutput
+    ${filtered_logs}=               GetFilteredLogs                 ${alllogs}                                    ${testname}
+    ${dropped_nr}=                  GetDroppedNumber                ${filtered_logs}
+
+    Sleep                           40s
+    ${isCorrectDroppedCount}=       Evaluate  ${5} < ${dropped_nr} < ${10}
+    SavePmMapperLogsAndDroppedCount  config_1_1  ${dropped_nr}
+    Should Be True                  ${isCorrectDroppedCount}  Pm-mapper drop: ${dropped_nr} messages. Expected drop count: 6-9
+    ClearLogs
+
+Verify that PM Mapper rejects 0 messages when limitRate is 10 and threads count is 1
+    [Tags]                          FILES_PROCESSING_CONFIG_PM_MAPPER_2
+    [Documentation]                 Verify that PM Mapper rejects 0/10 messages. Configuration: limitRate=10, threadsCount=1
+    [Timeout]                       25 minute
+
+    RestartPmmapper                 ${CONFIG_ENVS_10_1}
+
+    ${testname}=                    Set Variable                    Athird-
+
+    SendFilesToDatarouter           ${testname}
+    ${alllogs}=                     GetLogsOutput
+    ${filtered_logs}=               GetFilteredLogs                 ${alllogs}                                    ${testname}
+    ${dropped_nr}=                  GetDroppedNumber                ${filtered_logs}
+
+    Sleep                           15s
+    SavePmMapperLogsAndDroppedCount  config_10_1  ${dropped_nr}
+    Should Be Equal As Numbers      ${dropped_nr}   0   Pm-mapper drop: ${dropped_nr} messages. Expected drop count: 0
+    ClearLogs
+
+Verify that PM Mapper rejects 0 messages when limitRate is 1 and threads count is 10
+    [Tags]                          FILES_PROCESSING_CONFIG_PM_MAPPER_3
+    [Documentation]                 Verify that PM Mapper rejects 0/10 messages. Configuration: limitRate=1, threadsCount=10
+    [Timeout]                       25 minute
+
+    RestartPmmapper                 ${CONFIG_ENVS_1_10}
+
+    ${testname}=                    Set Variable                    Afourth-
+
+    SendFilesToDatarouter           ${testname}
+    ${alllogs}=                     GetLogsOutput
+    ${filtered_logs}=               GetFilteredLogs                 ${alllogs}                                    ${testname}
+    ${dropped_nr}=                  GetDroppedNumber                ${filtered_logs}
+
+    Sleep                           15s
+    SavePmMapperLogsAndDroppedCount  config_1_10  ${dropped_nr}
+    Should Be Equal As Numbers      ${dropped_nr}   0   Pm-mapper drop: ${dropped_nr} messages. Expected drop count: 0
+    ClearLogs
+
+*** Keywords ***
+
+SendFilesToDatarouter
+    [Arguments]                     ${testnr}
+    FOR                             ${i}                             IN RANGE                     10
+                                    SendToDatarouter                 ${FILE_PATH}                 ${NR_VALID_METADATA_PATH}                 X-ONAP-RequestID=${i}        ${testnr}         ${i}
+    END
+    Sleep                           20s
+
+SendToDatarouter
+    [Arguments]                     ${filepath}                      ${metadatapath}            ${request_id}            ${testnr}      ${i}
+    ${pmdata}=                      Get File                         ${filepath}
+    ${metatdata}                    Get File                         ${metadatapath}
+    ${newFilename}                  Catenate                         SEPARATOR=                 ${testnr}               ${i}               .xml
+    ${resp}=                        PutCall                          ${PUBLISH_NODE_URL}/${newFilename}        ${request_id}    ${pmdata}    ${metatdata.replace("\n","")}    pmmapper
+    VerifyResponse                  ${resp.status_code}              204
+
+PutCall
+    [Arguments]                     ${url}                           ${request_id}              ${data}            ${meta}          ${user}
+    ${headers}=                     Create Dictionary                X-ONAP-RequestID=${request_id}                X-DMAAP-DR-META=${meta}    Content-Type=application/octet-stream     X-DMAAP-DR-ON-BEHALF-OF=${user}    Authorization=Basic cG1tYXBwZXI6cG1tYXBwZXI=
+    ${resp}=                        Evaluate                         requests.put('${url}', data="""${data}""", headers=${headers}, verify=False, allow_redirects=False)    requests
+    [Return]                        ${resp}
+
+VerifyResponse
+    [Arguments]                     ${actual_response_value}         ${expected_response_value}
+    Should Be Equal As Strings      ${actual_response_value}         ${expected_response_value}
+
+ClearLogs
+    Run Process                     ${CLI_EXEC_CLI_PM_LOG_CLEAR}                     shell=yes
+
+GetLogsOutput
+    ${filesString}=                   Run Process                      ${CLI_EXEC_LOGS_LIST}                     shell=yes
+    ${filesList}=                     Get Log Files List               ${filesString.stdout}
+    ${output}=                        Set Variable                     ${EMPTY}
+    FOR                               ${file}                          IN                                        @{filesList}
+                                      ${file_path}=                    Catenate                                  SEPARATOR=    "cat /opt/app/datartr/logs/      ${file}       "
+                                      ${exec}=                         Catenate                                  docker exec datarouter-node /bin/sh -c      ${file_path}
+                                      ${single_file}=                  Run Process                               ${exec}         shell=yes
+                                      ${output}=                       Catenate                                  SEPARATOR=\n         ${output}                  ${single_file.stdout}
+    END
+    [Return]                          ${output}
+
+GetFilteredLogs
+    [Arguments]                       ${all_logs}                      ${testname}
+    ${filtered_logs}=                 Filter Unique                    ${all_logs}                               ${testname}
+    [Return]                          ${filtered_logs}
+
+GetDroppedNumber
+    [Arguments]                       ${logs_output}
+    ${number}=                        Get Number Of Dropped Messages  ${logs_output}
+    [Return]                          ${number}
+
+RestartPmmapper
+    [Arguments]                       ${envs}
+    Remove Container                  ${CLIENT_CONTAINER_NAME}
+    Sleep                             5s
+    Run Pmmapper Container            ${DOCKER_CLIENT_IMAGE}      ${CLIENT_CONTAINER_NAME}        ${envs}        ${DR_NODE_IP}          ${NODE_IP}
+    Sleep                             15s
+
+SavePmMapperLogsAndDroppedCount
+    [Arguments]                       ${test_name}                ${dropped_count}
+    Run Process                      echo "Dropped: ${dropped_count}" > %{WORKSPACE}/archives/${test_name}_dropped_count.log  shell=yes
+    Run Process                      docker logs ${CLIENT_CONTAINER_NAME} > %{WORKSPACE}/archives/${test_name}_pm_mapper_container_logs.log  shell=yes
+
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.py b/csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.py
new file mode 100644 (file)
index 0000000..3e3ae58
--- /dev/null
@@ -0,0 +1,29 @@
+import docker
+from EnvsReader import EnvsReader
+from docker.types import Mount
+
+class DockerContainerManager:
+
+    def run_pmmapper_container(self, client_image, container_name, path_to_env, dr_node_ip, mr_ip):
+        client = docker.from_env()
+        environment = EnvsReader().read_env_list_from_file(path_to_env)
+        environment.append("CONFIG_BINDING_SERVICE_SERVICE_HOST=172.18.0.5")
+        environment.append("CONFIG_BINDING_SERVICE_SERVICE_PORT=10000")
+        environment.append("HOSTNAME=pmmapper")
+        client.containers.run(
+            image=client_image,
+            name=container_name,
+            environment=environment,
+            ports={'8081': 8081},
+            network='filesprocessingconfigpmmapper_pmmapper-network',
+            extra_hosts={'dmaap-dr-node': dr_node_ip, 'message-router': mr_ip},
+            user='root',
+            mounts=[Mount(target='/opt/app/pm-mapper/etc/certs/', source='/var/tmp/', type='bind')],
+            detach=True
+        )
+
+    def remove_container(self, container_name):
+        client = docker.from_env()
+        container = client.containers.get(container_name)
+        container.stop()
+        container.remove()
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.pyc b/csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.pyc
new file mode 100644 (file)
index 0000000..2bf62c3
Binary files /dev/null and b/csit/tests/filesprocessingconfigpmmapper/libraries/DockerContainerManager.pyc differ
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.py b/csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.py
new file mode 100644 (file)
index 0000000..cc60eed
--- /dev/null
@@ -0,0 +1,11 @@
+
+class EnvsReader:
+
+  def read_env_list_from_file(self, path):
+    f = open(path, "r")
+    r_list = []
+    for line in f:
+      line = line.strip()
+      if line[0] != "#":
+        r_list.append(line)
+    return r_list
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.pyc b/csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.pyc
new file mode 100644 (file)
index 0000000..831aa34
Binary files /dev/null and b/csit/tests/filesprocessingconfigpmmapper/libraries/EnvsReader.pyc differ
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.py b/csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.py
new file mode 100644 (file)
index 0000000..01718e3
--- /dev/null
@@ -0,0 +1,22 @@
+import re
+
+class LogReader:
+
+  def filter_unique(self, merged_logs_output, testname):
+    logs = merged_logs_output.splitlines()
+    del_logs = list(filter(lambda line: "|DEL|" in line, logs))
+    nrs_set = set()
+    ret_logs = set()
+    for log in del_logs:
+      filename = re.findall(testname + "\d", log)
+      if len(filename) > 0 and filename[0] not in nrs_set:
+        ret_logs.add(log)
+        nrs_set.add(filename[0])
+    return ret_logs
+
+  def get_number_of_dropped_messages(self, logs_output):
+    return len(list(filter(lambda line: "|429|" in line, logs_output)))
+
+  def get_log_files_list(self, fileNames):
+    files = fileNames.split()
+    return files
diff --git a/csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.pyc b/csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.pyc
new file mode 100644 (file)
index 0000000..d8e936c
Binary files /dev/null and b/csit/tests/filesprocessingconfigpmmapper/libraries/LogReader.pyc differ
diff --git a/csit/tests/pmmapper/__init__.robot b/csit/tests/pmmapper/__init__.robot
new file mode 100644 (file)
index 0000000..3e4501c
--- /dev/null
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation    PM Mapper Testcases
diff --git a/csit/tests/pmmapper/assets/.gitattributes b/csit/tests/pmmapper/assets/.gitattributes
new file mode 100644 (file)
index 0000000..57cdc50
--- /dev/null
@@ -0,0 +1 @@
+*.gz binary
diff --git a/csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml b/csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml
new file mode 100644 (file)
index 0000000..fadc8a6
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+       <fileHeader fileFormatVersion="32.435 V7.0" vendorName="Company NN" dnPrefix="DC=a1.companyNN.com,SubNetwork=1,IRPAgent=1">
+               <fileSender localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" elementType="RNC"/>
+               <measCollec beginTime="2000-03-01T14:00:00+02:00"/>
+       </fileHeader>
+       <measData>
+               <managedElement localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" userLabel="RNC Telecomville"/>
+               <measInfo>
+                       <job jobId="1231"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures</measType>
+                       <measType p="2">succTCHSeizures</measType>
+                       <measType p="3">attImmediateAssignProcs</measType>
+                       <measType p="4">succImmediateAssignProcs</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">234</r>
+                               <r p="2">345</r>
+                               <r p="3">567</r>
+                               <r p="4">789</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">890</r>
+                               <r p="2">901</r>
+                               <r p="3">123</r>
+                               <r p="4">234</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">456</r>
+                               <r p="2">567</r>
+                               <r p="3">678</r>
+                               <r p="4">789</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+               <measInfo measInfoId="ENodeBFunction">
+            <job jobId="1232"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures1</measType>
+            <measType p="2">succTCHSeizures2</measType>
+            <measType p="3">attImmediateAssignProcs3</measType>
+            <measType p="4">succImmediateAssignProcs4</measType>
+            <measValue measObjLdn="ManagedElement=RNC-Gbg-1,ENodeBFunction=1">
+                <r p="1">4</r>
+                <r p="2">86,87,2,6,77,96,75,33,24</r>
+                <r p="3">40</r>
+                <r p="4">90</r>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+               <measInfo>
+                       <job jobId="1233"/>
+                       <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+                       <repPeriod duration="PT1800S"/>
+                       <measType p="1">attTCHSeizures5</measType>
+                       <measType p="2">succTCHSeizures6</measType>
+                       <measType p="3">attImmediateAssignProcs7</measType>
+                       <measType p="4">succImmediateAssignProcs8</measType>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                               <r p="1">238</r>
+                               <r p="2">344</r>
+                               <r p="3">563</r>
+                               <r p="4">787</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                               <r p="1">898</r>
+                               <r p="2">905</r>
+                               <r p="3">127</r>
+                               <r p="4">238</r>
+                       </measValue>
+                       <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                               <r p="1">454</r>
+                               <r p="2">569</r>
+                               <r p="3">672</r>
+                               <r p="4">785</r>
+                               <suspect>true</suspect>
+                       </measValue>
+               </measInfo>
+       </measData>
+       <fileFooter>
+               <measCollec endTime="2000-03-01T14:15:00+02:00"/>
+       </fileFooter>
+</measCollecFile>
diff --git a/csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml.gz b/csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml.gz
new file mode 100644 (file)
index 0000000..32865fc
Binary files /dev/null and b/csit/tests/pmmapper/assets/A20181002.0000-1000-0015-1000_5G.xml.gz differ
diff --git a/csit/tests/pmmapper/assets/A_no_managed_element.xml b/csit/tests/pmmapper/assets/A_no_managed_element.xml
new file mode 100644 (file)
index 0000000..23e5c21
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="32.435 V10.0">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <measInfo measInfoId="some measInfoId">
+            <job jobId="some job Id"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="some duration"/>
+            <repPeriod duration="PT900S"/>
+            <measType p="1">a</measType>
+            <measType p="2">b</measType>
+            <measType p="3">c</measType>
+            <measValue measObjLdn="some measObjLdn">
+                <r p="1">86</r>
+                <r p="2">67</r>
+                <r p="3">14</r>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
\ No newline at end of file
diff --git a/csit/tests/pmmapper/assets/A_no_measdata.xml b/csit/tests/pmmapper/assets/A_no_measdata.xml
new file mode 100644 (file)
index 0000000..855b2e9
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="32.435 V10.0">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
diff --git a/csit/tests/pmmapper/assets/C20190328.0000-0015.xml b/csit/tests/pmmapper/assets/C20190328.0000-0015.xml
new file mode 100644 (file)
index 0000000..b6a3b43
--- /dev/null
@@ -0,0 +1,49 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="32.435 V10.0">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <managedElement swVersion="r0.1" localDn="Dublin1"/>
+        <measInfo measInfoId="measInfoId1">
+            <job jobId="jobId1"/>
+            <granPeriod endTime="2001-10-02T12:15:00Z" duration="PT100S"/>
+            <repPeriod duration="PT100S"/>
+            <measTypes>z1 a1 zz1 b1</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>1 11 111 1111</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <measData>
+        <managedElement swVersion="r0.2" localDn="Dublin2"/>
+        <measInfo measInfoId="measInfoId2">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2002-10-02T12:15:00Z" duration="PT200S"/>
+            <repPeriod duration="PT200S"/>
+            <measTypes>z2 a2 zz2 b2</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>2 22 222 2222</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <measData>
+        <managedElement swVersion="r0.3" localDn="Dublin3"/>
+        <measInfo measInfoId="measInfoId3">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2003-10-02T12:15:00Z" duration="PT300S"/>
+            <repPeriod duration="PT300S"/>
+            <measTypes>z3 a3 zz3 b3</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>3 33 333 3333</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
diff --git a/csit/tests/pmmapper/assets/diff_vendor_metadata.json b/csit/tests/pmmapper/assets/diff_vendor_metadata.json
new file mode 100644 (file)
index 0000000..0abf8e3
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "productName": "gnb",
+    "vendorName": "Anon",
+    "lastEpochMicrosec": "1538478000000",
+    "sourceName": "oteNB5309",
+    "startEpochMicrosec": "1538478900000",
+    "timeZoneOffset": "UTC+05.00",
+    "location": "ftpes://192.168.0.101:22/ftp/rop/A20161224.1045-1100.bin.gz",
+    "compression": "gzip",
+    "fileFormatType": "org.3GPP.32.435#measCollec",
+    "fileFormatVersion": "V9"
+  }
\ No newline at end of file
diff --git a/csit/tests/pmmapper/assets/new_radio/A20181004.0000-1000-0015-1000_5G.xml b/csit/tests/pmmapper/assets/new_radio/A20181004.0000-1000-0015-1000_5G.xml
new file mode 100644 (file)
index 0000000..8d42d62
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
+<measDataFile xmlns="http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData">
+    <fileHeader fileFormatVersion="28.532 V7.0" vendorName="Company NN" dnPrefix="DC=a1.companyNN.com,SubNetwork=1,IRPAgent=1">
+        <fileSender senderName="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1"/>
+        <measData beginTime="2000-03-01T14:00:00+02:00"/>
+    </fileHeader>
+    <measData>
+        <measEntity localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" userLabel="RNC Telecomville"/>
+        <measInfo>
+            <job jobId="1231"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures</measType>
+            <measType p="2">succTCHSeizures</measType>
+            <measType p="3">attImmediateAssignProcs</measType>
+            <measType p="4">succImmediateAssignProcs</measType>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                <r p="1">234</r>
+                <r p="2">345</r>
+                <r p="3">567</r>
+                <r p="4">789</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                <r p="1">890</r>
+                <r p="2">901</r>
+                <r p="3">123</r>
+                <r p="4">234</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                <r p="1">456</r>
+                <r p="2">567</r>
+                <r p="3">678</r>
+                <r p="4">789</r>
+                <suspect>true</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo measInfoId="ENodeBFunction">
+            <job jobId="1232"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures1</measType>
+            <measType p="2">succTCHSeizures2</measType>
+            <measType p="3">attImmediateAssignProcs3</measType>
+            <measType p="4">succImmediateAssignProcs4</measType>
+            <measValue measObjLdn="ManagedElement=RNC-Gbg-1,ENodeBFunction=1">
+                <r p="1">4</r>
+                <r p="2">86,87,2,6,77,96,75,33,24</r>
+                <r p="3">40</r>
+                <r p="4">90</r>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo>
+            <job jobId="1233"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures5</measType>
+            <measType p="2">succTCHSeizures6</measType>
+            <measType p="3">attImmediateAssignProcs7</measType>
+            <measType p="4">succImmediateAssignProcs8</measType>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                <r p="1">238</r>
+                <r p="2">344</r>
+                <r p="3">563</r>
+                <r p="4">787</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                <r p="1">898</r>
+                <r p="2">905</r>
+                <r p="3">127</r>
+                <r p="4">238</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                <r p="1">454</r>
+                <r p="2">569</r>
+                <r p="3">672</r>
+                <r p="4">785</r>
+                <suspect>true</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measData endTime="2000-03-01T14:15:00+02:00"/>
+    </fileFooter>
+</measDataFile>
diff --git a/csit/tests/pmmapper/assets/new_radio/C20190329.0000-0015.xml b/csit/tests/pmmapper/assets/new_radio/C20190329.0000-0015.xml
new file mode 100644 (file)
index 0000000..9c1b985
--- /dev/null
@@ -0,0 +1,49 @@
+<measDataFile xmlns="http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="28.532 V1.0">
+        <fileSender senderName="Dublin"/>
+        <measData beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <measEntity swVersion="r0.1" localDn="Dublin1"/>
+        <measInfo measInfoId="measInfoId1">
+            <job jobId="jobId1"/>
+            <granPeriod endTime="2001-10-02T12:15:00Z" duration="PT100S"/>
+            <repPeriod duration="PT100S"/>
+            <measTypes>z1 a1 zz1 b1</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>1 11 111 1111</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <measData>
+        <measEntity swVersion="r0.2" localDn="Dublin2"/>
+        <measInfo measInfoId="measInfoId2">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2002-10-02T12:15:00Z" duration="PT200S"/>
+            <repPeriod duration="PT200S"/>
+            <measTypes>attTCHSeizures succTCHSeizures2 zz2 b2</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>2 22 222 2222</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <measData>
+        <measEntity swVersion="r0.3" localDn="Dublin3"/>
+        <measInfo measInfoId="measInfoId3">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2003-10-02T12:15:00Z" duration="PT300S"/>
+            <repPeriod duration="PT300S"/>
+            <measTypes>z3 a3 zz3 succImmediateAssignProcs8</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>3 33 333 3333</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measData endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measDataFile>
diff --git a/csit/tests/pmmapper/assets/new_radio/PM202007171301+020024C202007171207+0200-1215+0200_45678.xml b/csit/tests/pmmapper/assets/new_radio/PM202007171301+020024C202007171207+0200-1215+0200_45678.xml
new file mode 100644 (file)
index 0000000..8d42d62
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="MeasDataCollection.xsl"?>
+<measDataFile xmlns="http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData http://www.3gpp.org/ftp/specs/archive/28_series/28.532#measData">
+    <fileHeader fileFormatVersion="28.532 V7.0" vendorName="Company NN" dnPrefix="DC=a1.companyNN.com,SubNetwork=1,IRPAgent=1">
+        <fileSender senderName="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1"/>
+        <measData beginTime="2000-03-01T14:00:00+02:00"/>
+    </fileHeader>
+    <measData>
+        <measEntity localDn="SubNetwork=CountryNN,MeContext=MEC-Gbg-1,ManagedElement=RNC-Gbg-1" userLabel="RNC Telecomville"/>
+        <measInfo>
+            <job jobId="1231"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures</measType>
+            <measType p="2">succTCHSeizures</measType>
+            <measType p="3">attImmediateAssignProcs</measType>
+            <measType p="4">succImmediateAssignProcs</measType>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                <r p="1">234</r>
+                <r p="2">345</r>
+                <r p="3">567</r>
+                <r p="4">789</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                <r p="1">890</r>
+                <r p="2">901</r>
+                <r p="3">123</r>
+                <r p="4">234</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                <r p="1">456</r>
+                <r p="2">567</r>
+                <r p="3">678</r>
+                <r p="4">789</r>
+                <suspect>true</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo measInfoId="ENodeBFunction">
+            <job jobId="1232"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures1</measType>
+            <measType p="2">succTCHSeizures2</measType>
+            <measType p="3">attImmediateAssignProcs3</measType>
+            <measType p="4">succImmediateAssignProcs4</measType>
+            <measValue measObjLdn="ManagedElement=RNC-Gbg-1,ENodeBFunction=1">
+                <r p="1">4</r>
+                <r p="2">86,87,2,6,77,96,75,33,24</r>
+                <r p="3">40</r>
+                <r p="4">90</r>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo>
+            <job jobId="1233"/>
+            <granPeriod duration="PT900S" endTime="2000-03-01T14:14:30+02:00"/>
+            <repPeriod duration="PT1800S"/>
+            <measType p="1">attTCHSeizures5</measType>
+            <measType p="2">succTCHSeizures6</measType>
+            <measType p="3">attImmediateAssignProcs7</measType>
+            <measType p="4">succImmediateAssignProcs8</measType>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-997">
+                <r p="1">238</r>
+                <r p="2">344</r>
+                <r p="3">563</r>
+                <r p="4">787</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-998">
+                <r p="1">898</r>
+                <r p="2">905</r>
+                <r p="3">127</r>
+                <r p="4">238</r>
+            </measValue>
+            <measValue measObjLdn="RncFunction=RF-1,UtranCell=Gbg-999">
+                <r p="1">454</r>
+                <r p="2">569</r>
+                <r p="3">672</r>
+                <r p="4">785</r>
+                <suspect>true</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measData endTime="2000-03-01T14:15:00+02:00"/>
+    </fileFooter>
+</measDataFile>
diff --git a/csit/tests/pmmapper/assets/new_radio/valid_metadata.json b/csit/tests/pmmapper/assets/new_radio/valid_metadata.json
new file mode 100644 (file)
index 0000000..f75adb8
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "productName": "gnb",
+    "vendorName": "Ericsson",
+    "lastEpochMicrosec": "1538478000000",
+    "sourceName": "oteNB5309",
+    "startEpochMicrosec": "1538478900000",
+    "timeZoneOffset": "UTC+05.00",
+    "location": "ftpes://192.168.0.101:22/ftp/rop/A20161224.1045-1100.bin.gz",
+    "compression": "gzip",
+    "fileFormatType": "org.3GPP.28.532#measData",
+    "fileFormatVersion": "V9"
+}
diff --git a/csit/tests/pmmapper/assets/pm_filter_config.json b/csit/tests/pmmapper/assets/pm_filter_config.json
new file mode 100644 (file)
index 0000000..79e3f98
--- /dev/null
@@ -0,0 +1,42 @@
+{
+    "pm-mapper-filter": { 
+        "filters":[{
+            "pmDefVsn": "1.0",
+            "nfType": "gnb",
+            "vendor": "Ericsson",
+            "measTypes": ["attTCHSeizures","succTCHSeizures2","succImmediateAssignProcs8"]
+        }]
+    },
+    "key_store_path": "/opt/app/pm-mapper/etc/cert.jks",
+    "key_store_pass_path": "/opt/app/pm-mapper/etc/jks.pass",
+    "trust_store_path": "/opt/app/pm-mapper/etc/trust.jks",
+    "trust_store_pass_path": "/opt/app/pm-mapper/etc/trust.pass",
+    "dmaap_dr_delete_endpoint": "https://dmaap-dr-node:8443/delete",
+    "dmaap_dr_feed_name": "1",
+    "aaf_identity": "aaf_admin@people.osaaf.org",
+    "aaf_password": "demo123456!",
+    "enable_http": true,
+    "streams_publishes": {
+      "dmaap_publisher": {
+        "type": "message_router",
+        "dmaap_info": {
+          "topic_url": "http://message-router:3904/events/org.onap.dmaap.mr.VES_PM",
+          "client_role": "org.onap.dcae.pmPublisher",
+          "location": "csit-pmmapper",
+          "client_id": "1562763644939"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "username",
+          "password": "password",
+          "location": "csit-pmmapper",
+          "delivery_url": "http://dcae-pm-mapper:8081/delivery",
+          "subscriber_id": 1
+        }
+      }
+    }
+}
\ No newline at end of file
diff --git a/csit/tests/pmmapper/assets/pm_filter_regex_config.json b/csit/tests/pmmapper/assets/pm_filter_regex_config.json
new file mode 100644 (file)
index 0000000..5cd7146
--- /dev/null
@@ -0,0 +1,42 @@
+{
+    "pm-mapper-filter": {
+        "filters":[{
+            "pmDefVsn": "1.0",
+            "nfType": "gnb",
+            "vendor": "Ericsson",
+            "measTypes": ["att.*"]
+        }]
+    },
+    "key_store_path": "/opt/app/pm-mapper/etc/cert.jks.b64",
+    "key_store_pass_path": "/opt/app/pm-mapper/etc/jks.pass",
+    "trust_store_path": "/opt/app/pm-mapper/etc/trust.jks.b64",
+    "trust_store_pass_path": "/opt/app/pm-mapper/etc/trust.pass",
+    "dmaap_dr_delete_endpoint": "https://dmaap-dr-node:8443/delete",
+    "dmaap_dr_feed_name": "1",
+    "aaf_identity": "aaf_admin@people.osaaf.org",
+    "aaf_password": "demo123456!",
+    "enable_http": true,
+    "streams_publishes": {
+      "dmaap_publisher": {
+        "type": "message_router",
+        "dmaap_info": {
+          "topic_url": "http://message-router:3904/events/org.onap.dmaap.mr.VES_PM",
+          "client_role": "org.onap.dcae.pmPublisher",
+          "location": "csit-pmmapper",
+          "client_id": "1562763644939"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "username",
+          "password": "password",
+          "location": "csit-pmmapper",
+          "delivery_url": "http://dcae-pm-mapper:8081/delivery",
+          "subscriber_id": 1
+        }
+      }
+    }
+}
\ No newline at end of file
diff --git a/csit/tests/pmmapper/assets/valid_metadata.json b/csit/tests/pmmapper/assets/valid_metadata.json
new file mode 100644 (file)
index 0000000..da809d7
--- /dev/null
@@ -0,0 +1,12 @@
+{
+    "productName": "gnb",
+    "vendorName": "Ericsson",
+    "lastEpochMicrosec": "1538478000000",
+    "sourceName": "oteNB5309",
+    "startEpochMicrosec": "1538478900000",
+    "timeZoneOffset": "UTC+05.00",
+    "location": "ftpes://192.168.0.101:22/ftp/rop/A20161224.1045-1100.bin.gz",
+    "compression": "gzip",
+    "fileFormatType": "org.3GPP.32.435#measCollec",
+    "fileFormatVersion": "V9"
+  }
\ No newline at end of file
diff --git a/csit/tests/pmmapper/assets/vendor_filter_config.json b/csit/tests/pmmapper/assets/vendor_filter_config.json
new file mode 100644 (file)
index 0000000..94d0911
--- /dev/null
@@ -0,0 +1,42 @@
+{
+    "pm-mapper-filter": {
+        "filters":[{
+            "pmDefVsn": "1.0",
+            "nfType": "gnb",
+            "vendor": "Ericsson",
+            "measTypes": []
+        }]
+    },
+    "key_store_path": "/opt/app/pm-mapper/etc/cert.jks",
+    "key_store_pass_path": "/opt/app/pm-mapper/etc/jks.pass",
+    "trust_store_path": "/opt/app/pm-mapper/etc/trust.jks",
+    "trust_store_pass_path": "/opt/app/pm-mapper/etc/trust.pass",
+    "dmaap_dr_delete_endpoint": "https://dmaap-dr-node:8443/delete",
+    "dmaap_dr_feed_name": "1",
+    "aaf_identity": "aaf_admin@people.osaaf.org",
+    "aaf_password": "demo123456!",
+    "enable_http": true,
+    "streams_publishes": {
+      "dmaap_publisher": {
+        "type": "message_router",
+        "dmaap_info": {
+          "topic_url": "http://message-router:3904/events/org.onap.dmaap.mr.VES_PM",
+          "client_role": "org.onap.dcae.pmPublisher",
+          "location": "csit-pmmapper",
+          "client_id": "1562763644939"
+        }
+      }
+    },
+    "streams_subscribes": {
+      "dmaap_subscriber": {
+        "type": "data_router",
+        "dmaap_info": {
+          "username": "username",
+          "password": "password",
+          "location": "csit-pmmapper",
+          "delivery_url": "http://dcae-pm-mapper:8081/delivery",
+          "subscriber_id": 1
+        }
+      }
+    }
+}
\ No newline at end of file
diff --git a/csit/tests/pmmapper/pmmapper.robot b/csit/tests/pmmapper/pmmapper.robot
new file mode 100644 (file)
index 0000000..f23d33c
--- /dev/null
@@ -0,0 +1,201 @@
+*** Settings ***
+Documentation     Testing PM Mapper functionality
+Library           Collections
+Library           OperatingSystem
+Library           RequestsLibrary
+Library           Process
+Library           String
+
+Test Setup        Create Session  mapper_session  ${PMMAPPER_BASE_URL}
+Test Teardown     CleanSessionsAndLogs
+
+*** Variables ***
+${CLI_EXEC_CLI_CONFIG}                   { head -n 100 | tail -50;} < /tmp/pmmapper.log
+${CLI_EXEC_CLI_SUBS}                     curl -k https://${DR_PROV_IP}:8443/internal/prov
+${PMMAPPER_BASE_URL}                     http://${PMMAPPER_IP}:8081
+${DELIVERY_ENDPOINT}                     /delivery
+${HEALTHCHECK_ENDPOINT}                  /healthcheck
+${RECONFIGURE_ENDPOINT}                  /reconfigure
+${ASSETS_PATH}                           %{WORKSPACE}/tests/pmmapper/assets
+${NO_MANAGED_ELEMENT_PATH}               ${ASSETS_PATH}/A_no_managed_element.xml
+${NO_MEASDATA_PATH}                      ${ASSETS_PATH}/A_no_measdata.xml
+${VALID_METADATA_PATH}                   ${ASSETS_PATH}/valid_metadata.json
+${NR_VALID_METADATA_PATH}                ${ASSETS_PATH}/new_radio/valid_metadata.json
+${DIFF_VENDOR_METADATA}                  ${ASSETS_PATH}/diff_vendor_metadata.json
+${NON_XML_FILE}                          ${ASSETS_PATH}/diff_vendor_metadata.json
+${CLI_EXEC_CLI_PM_LOG}                   docker exec pmmapper /bin/sh -c "cat /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log"
+${CLI_EXEC_CLI_PM_LOG_CLEAR}             docker exec pmmapper /bin/sh -c "echo -n "" > /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log"
+${PUBLISH_NODE_URL}                      https://${DR_NODE_IP}:8443/publish/1
+${TYPE-A_PM_DATA_FILE_PATH}              ${ASSETS_PATH}/A20181002.0000-1000-0015-1000_5G.xml
+${TYPE-C_PM_DATA_FILE_PATH}              ${ASSETS_PATH}/C20190328.0000-0015.xml
+${NR-TYPE-A_PM_DATA_FILE_PATH}           ${ASSETS_PATH}/new_radio/A20181004.0000-1000-0015-1000_5G.xml
+${NR-TYPE-C_PM_DATA_FILE_PATH}           ${ASSETS_PATH}/new_radio/C20190329.0000-0015.xml
+${NR-TYPE-PM_DATA_FILE_PATH}             ${ASSETS_PATH}/new_radio/PM202007171301+020024C202007171207+0200-1215+0200_45678.xml
+${CLI_EXEC_VENDOR_FILTER}                curl 'http://${CONSUL_IP}:8500/v1/kv/pmmapper?dc=dc1' -X PUT -H 'Accept: application/^Con' -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' --data @${ASSETS_PATH}/vendor_filter_config.json
+${CLI_EXEC_PM_FILTER}                    curl 'http://${CONSUL_IP}:8500/v1/kv/pmmapper?dc=dc1' -X PUT -H 'Accept: application/^Con' -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' --data @${ASSETS_PATH}/pm_filter_config.json
+${CLI_EXEC_PM_FILTER_regex}              curl 'http://${CONSUL_IP}:8500/v1/kv/pmmapper?dc=dc1' -X PUT -H 'Accept: application/^Con' -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' --data @${ASSETS_PATH}/pm_filter_regex_config.json
+${CLI_MESSAGE_ROUTER_TOPIC}              curl http://${DMAAP_MR_IP}:3904/events/PM_MAPPER/CG1/C1?timeout=1000 > /tmp/mr.log
+${CLI_MR_LOG}                            cat /tmp/mr.log
+
+
+*** Test Cases ***
+Verify PM Mapper Receive Configuraton From Config Binding Service
+    [Tags]                          PM_MAPPER_01
+    [Documentation]                 Verify 3gpp pm mapper successfully receive config data from CBS
+    CheckLog                        ${CLI_EXEC_CLI_CONFIG}           Received pm-mapper configuration from ConfigBinding Service
+
+Verify Health Check returns 200 when a REST GET request to healthcheck url
+    [Tags]                          PM_MAPPER_02
+    [Documentation]                 Verify Health Check returns 200 when a REST GET request to healthcheck url
+    [Timeout]                       1 minute
+    ${resp}=                        Get Request                      mapper_session  ${HEALTHCHECK_ENDPOINT}
+    VerifyResponse                  ${resp.status_code}              200
+
+Verify 3GPP PM Mapper responds appropriately when no metadata is provided
+    [Tags]                          PM_MAPPER_03
+    [Documentation]                 Verify 3GPP PM Mapper responds 400 with the message "Missing Metadata." when no metadata is provided
+    [Timeout]                       1 minute
+    ${headers}=                     Create Dictionary               X-ONAP-RequestID=3  Content-Type=application/xml
+    ${resp}=                        Put Request                     mapper_session  ${DELIVERY_ENDPOINT}/filename    data='${EMPTY}'    headers=${headers}
+    VerifyResponse                  ${resp.status_code}             400
+    VerifyResponse                  ${resp.content}                 Missing Metadata.
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}          RequestID=3
+
+Verify 3GPP PM Mapper responds appropriately when invalid metadata is provided
+    [Tags]                          PM_MAPPER_04
+    [Documentation]                 Verify 3GPP PM Mapper responds 400 with the message "Malformed Metadata." when invalid metadata is provided
+    [Timeout]                       1 minute
+    ${headers}=                     Create Dictionary               X-ONAP-RequestID=4  X-DMAAP-DR-META='not metadata'  Content-Type=application/xml
+    ${resp}=                        Put Request                     mapper_session  ${DELIVERY_ENDPOINT}/filename  data='${EMPTY}'  headers=${headers}
+    VerifyResponse                  ${resp.status_code}             400
+    VerifyResponse                  ${resp.content}                 Malformed Metadata.
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}          RequestID=4
+
+Verify that PM Mapper logs successful when a file that contains no measdata is provided
+    [Tags]                          PM_MAPPER_05
+    [Documentation]                 Verify that PM Mapper logs successful when a file that contains no measdata is provided
+    [Timeout]                       1 minute
+    SendToDatarouter                ${NO_MEASDATA_PATH}              ${VALID_METADATA_PATH}            X-ONAP-RequestID=5
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           MeasData is empty
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           RequestID=5
+
+Verify that PM Mapper throws Event failed validation against schema error when no managed element content is provided
+    [Tags]                          PM_MAPPER_06
+    [Documentation]                 Verify 3gpp pm mapper responds with an error when no managed element content is provided
+    [Timeout]                       1 minute
+    SendToDatarouter                ${NO_MANAGED_ELEMENT_PATH}       ${VALID_METADATA_PATH}             X-ONAP-RequestID=6
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           XML validation failed
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           RequestID=6
+
+Verify that PM Mapper maps Type-C xml file and publish 3gpp perf VES evnets to message router
+    [Tags]                          PM_MAPPER_07
+    [Documentation]                 Verify that PM Mapper maps Type-C xml file and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    SendToDatarouter                ${TYPE-C_PM_DATA_FILE_PATH}      ${VALID_METADATA_PATH}           X-ONAP-RequestID=7
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           Successfully published VES events to messagerouter
+
+Verify 3GPP PM Mapper maps Type-A file based on counter filtering and publish 3gpp perf VES evnets to message router
+    [Tags]                          PM_MAPPER_08
+    [Documentation]                 Verify 3GPP PM Mapper maps Type-A file and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    ${cli_cmd_output}=              Run Process                      ${CLI_EXEC_PM_FILTER}             shell=yes
+    ${resp}=                        Get Request                      mapper_session                    ${RECONFIGURE_ENDPOINT}
+    Sleep                           5s
+    SendToDatarouter                ${TYPE-A_PM_DATA_FILE_PATH}      ${VALID_METADATA_PATH}            X-ONAP-RequestID=8
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           Successfully published VES events to messagerouter
+
+Verify that PM Mapper correctly identifies a file that should not be mapped based on metadata filtering.
+    [Tags]                          PM_MAPPER_09
+    [Documentation]                 Verify that PM Mapper correctly identifies a file that should not be mapped based on metadata filtering.
+    [Timeout]                       1 minute
+    ${cli_cmd_output}=              Run Process                      ${CLI_EXEC_VENDOR_FILTER}         shell=yes
+    Should Be Equal As Strings      ${cli_cmd_output.rc}             0
+    ${resp}=                        Get Request                      mapper_session                    ${RECONFIGURE_ENDPOINT}
+    Sleep                           5s
+    SendToDatarouter                ${TYPE-A_PM_DATA_FILE_PATH}      ${DIFF_VENDOR_METADATA}           X-ONAP-RequestID=9
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           RequestID=9
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           Metadata does not match any filters
+
+Verify that PM Mapper correctly identifies a non-xml file.
+    [Tags]                          PM_MAPPER_10
+    [Documentation]                 Verify that PM Mapper correctly identifies a non-xml file.
+    [Timeout]                       1 minute
+    SendToDatarouter                ${NON_XML_FILE}                  ${VALID_METADATA_PATH}             X-ONAP-RequestID=10
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           PM measurement file must have an extension of .xml
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           RequestID=10
+
+Verify that PM Mapper correctly maps an NR Type-A file based on counter filtering and publish 3gpp perf VES events to message router.
+    [Tags]                          PM_MAPPER_11
+    [Documentation]                 Verify 3GPP PM Mapper maps an NR Type-A file and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    ${cli_cmd_output}=              Run Process                      ${CLI_EXEC_PM_FILTER}             shell=yes
+    ${resp}=                        Get Request                      mapper_session                    ${RECONFIGURE_ENDPOINT}
+    Sleep                           5s
+    SendToDatarouter                ${NR-TYPE-A_PM_DATA_FILE_PATH}   ${NR_VALID_METADATA_PATH}            X-ONAP-RequestID=11
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           Successfully published VES events to messagerouter
+
+Verify that PM Mapper correctly maps an NR Type-C file based on counter filtering and publish 3gpp perf VES events to message router.
+    [Tags]                          PM_MAPPER_12
+    [Documentation]                 Verify that PM Mapper maps an NR Type-C xml file and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    SendToDatarouter                ${NR-TYPE-C_PM_DATA_FILE_PATH}    ${NR_VALID_METADATA_PATH}           X-ONAP-RequestID=12
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}            Successfully published VES events to messagerouter
+
+Verify 3GPP PM Mapper maps Type-A file based on counter filtering with regexp
+    [Tags]                          PM_MAPPER_13
+    [Documentation]                 Verify 3GPP PM Mapper maps Type-A file based on counter filtering with wildcards/regexp and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    ${cli_cmd_output}=              Run Process                      ${CLI_EXEC_PM_FILTER_regex}             shell=yes
+    ${resp}=                        Get Request                      mapper_session                    ${RECONFIGURE_ENDPOINT}
+    Sleep                           5s
+    SendToDatarouter                ${TYPE-A_PM_DATA_FILE_PATH}      ${VALID_METADATA_PATH}            X-ONAP-RequestID=13
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}           Successfully published VES events to messagerouter
+
+Verify that password receive from CBS are successfully encrypted
+    [Tags]                          PM_MAPPER_14
+    [Documentation]                 Verify that password receive from CBS are successfully encrypted.
+    CheckLog                        ${CLI_EXEC_CLI_CONFIG}           "aaf_password": *****
+    CheckLog                        ${CLI_EXEC_CLI_CONFIG}           "password": *****
+
+Verify that PM Mapper correctly maps an NR Type-PM file based on counter filtering and publish 3gpp perf VES events to message router.
+    [Tags]                          PM_MAPPER_15
+    [Documentation]                 Verify that PM Mapper maps an NR Type-PM xml file and publish 3gpp perf VES evnets to message router.
+    [Timeout]                       1 minute
+    SendToDatarouter                ${NR-TYPE-PM_DATA_FILE_PATH}      ${NR_VALID_METADATA_PATH}           X-ONAP-RequestID=15
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}            RequestID=15
+    CheckLog                        ${CLI_EXEC_CLI_PM_LOG}            Successfully published VES events to messagerouter
+
+*** Keywords ***
+
+SendToDatarouter
+    [Arguments]                     ${filepath}                      ${metadatapath}            ${request_id}
+    ${pmdata}=                      Get File                         ${filepath}
+    ${metatdata}                    Get File                         ${metadatapath}
+    ${filename}                     Fetch From Right                 ${filepath}                /
+    ${resp}=                        PutCall                          ${PUBLISH_NODE_URL}/${filename}        ${request_id}    ${pmdata}    ${metatdata.replace("\n","")}    pmmapper
+    VerifyResponse                  ${resp.status_code}              204
+    Sleep                           10s
+
+PutCall
+    [Arguments]                     ${url}                           ${request_id}              ${data}            ${meta}          ${user}
+    ${headers}=                     Create Dictionary                X-ONAP-RequestID=${request_id}                X-DMAAP-DR-META=${meta}    Content-Type=application/octet-stream     X-DMAAP-DR-ON-BEHALF-OF=${user}    Authorization=Basic cG1tYXBwZXI6cG1tYXBwZXI=
+    ${resp}=                        Evaluate                         requests.put('${url}', data="""${data}""", headers=${headers}, verify=False, allow_redirects=False)    requests
+    [Return]                        ${resp}
+
+CheckLog
+    [Arguments]                     ${cli_exec_log_Path}             ${string_to_check_in_log}
+    ${cli_cmd_output}=              Run Process                      ${cli_exec_log_Path}                     shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}             0
+    Should Contain                  ${cli_cmd_output.stdout}         ${string_to_check_in_log}
+
+VerifyResponse
+    [Arguments]                     ${actual_response_value}         ${expected_response_value}
+    Should Be Equal As Strings      ${actual_response_value}         ${expected_response_value}
+
+ClearLogs
+    Run Process                     ${CLI_EXEC_CLI_PM_LOG_CLEAR}                     shell=yes
+
+CleanSessionsAndLogs
+    Delete All Sessions
+    ClearLogs