aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/assets/config.json35
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf7
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml11
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml11
-rwxr-xr-xplans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh51
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/setup.sh68
-rw-r--r--plans/dcaegen2-pmmapper/pmmapper/teardown.sh4
-rw-r--r--plans/policy/api/setup.sh2
-rw-r--r--tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot29
-rw-r--r--tests/policy/api/api-test.robot10
-rw-r--r--tests/usecases/5G-bulkpm/BulkpmE2E.robot17
-rw-r--r--tests/usecases/5G-bulkpm/assets/metadata.schema.json74
-rw-r--r--tests/usecases/5G-bulkpm/resources/JsonValidatorLibrary.py38
-rw-r--r--tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot1
14 files changed, 304 insertions, 54 deletions
diff --git a/plans/dcaegen2-pmmapper/pmmapper/assets/config.json b/plans/dcaegen2-pmmapper/pmmapper/assets/config.json
index 2fe128ba..47b215f5 100644
--- a/plans/dcaegen2-pmmapper/pmmapper/assets/config.json
+++ b/plans/dcaegen2-pmmapper/pmmapper/assets/config.json
@@ -1 +1,34 @@
-{"pm-mapper-filter": "{ \"filters\":[]}", "3GPP.schema.file": "{\"3GPP_Schema\":\"./etc/3GPP_relaxed_schema.xsd\"}", "streams_subscribes": {}, "streams_publishes": {"pm_mapper_handle_out": {"type": "message_router", "aaf_password": null, "dmaap_info": {"topic_url": "https://we-are-message-router.us:3905/events/some-topic", "client_role": null, "location": null, "client_id": null}, "aaf_username": null}}, "streams_subscribes.pm_mapper_handle_out.message_router_topic": "unauthenticated.PM_VES_OUTPUT", "streams_subscribes.pm_mapper_handle_in.feed_id": "1", "services_calls": {}} \ No newline at end of file
+{
+ "pm-mapper-filter": "{ \"filters\":[]}",
+ "3GPP.schema.file": "{\"3GPP_Schema\":\"./etc/3GPP_relaxed_schema.xsd\"}",
+ "streams_subscribes": {
+ "dmaap_subscriber": {
+ "type": "data_router",
+ "aaf_username": null,
+ "aaf_password": null,
+ "dmaap_info": {
+ "location": "csit-pmmapper",
+ "delivery_url": "3gpppmmapper",
+ "username": "username",
+ "password": "password",
+ "subscriber_id": "subsriber_id"
+ }
+ }
+ },
+ "streams_publishes": {
+ "pm_mapper_handle_out": {
+ "type": "message_router",
+ "aaf_password": null,
+ "dmaap_info": {
+ "topic_url": "https://message-router:3904/events/org.onap.dmaap.onapCSIT.pm_mapper",
+ "client_role": "org.onap.dmaap.client.pub",
+ "location": "csit-pmmapper",
+ "client_id": null
+ },
+ "aaf_username": null
+ }
+ },
+ "buscontroller_feed_id": "1",
+ "buscontroller_feed_subscription_endpoint": "http://dmaap-bc:8080/webapi/dr_subs",
+ "services_calls": {}
+} \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf b/plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf
new file mode 100644
index 00000000..6ec13797
--- /dev/null
+++ b/plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf
@@ -0,0 +1,7 @@
+# environment settings for Dmaap Bus Controller Integration Test.
+DMAAPBC_INT_HTTPS_PORT=8443
+DMAAPBC_INSTANCE_NAME=ONAP-CSIT
+DMAAPBC_MR_CNAME=DMAAPMR
+DMAAPBC_DRPROV_FQDN=DMAAPDR
+DMAAPBC_CSIT=Yes
+DMAAPBC_PG_ENABLED=false \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml b/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml
index ee1649be..ff1b517a 100644
--- a/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml
+++ b/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml
@@ -64,7 +64,12 @@ services:
container_name: buscontroller
image: nexus3.onap.org:10001/onap/dmaap/buscontroller
ports:
- - "18080:8080"
- - "18443:8443"
+ - "18080:8080"
+ - "18443:8443"
extra_hosts:
- - "dmaap-dr-prov: dr-prov-ip" \ No newline at end of file
+ - "dmaap-dr-prov: DMAAPDR"
+ - "message-router: DMAAPMR"
+ volumes:
+ - /tmp/docker-databus-controller.conf:/opt/app/config/conf
+ depends_on:
+ - datarouter-prov \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml b/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml
new file mode 100644
index 00000000..de64b809
--- /dev/null
+++ b/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml
@@ -0,0 +1,11 @@
+version: '2.1'
+services:
+ pmmapper:
+ container_name: pmmapper
+ image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.pm-mapper:1.0-SNAPSHOT
+ environment:
+ CONFIG_BINDING_SERVICE_SERVICE_HOST: CBSIP
+ CONFIG_BINDING_SERVICE_SERVICE_PORT: 10000
+ HOSTNAME: pmmapper
+ extra_hosts:
+ - "dmaap-bc: BUSIP" \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh b/plans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh
index ffb1686c..bb8c6f26 100755
--- a/plans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh
+++ b/plans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh
@@ -1,18 +1,61 @@
#!/bin/bash
-
# $1 is the IP address of the buscontroller
# INITIALIZE: dmaap object
-JSON=/tmp/prov.dmaap
+JSON=/tmp/dmaap.json
cat << EOF > $JSON
{
"version": "1",
"topicNsRoot": "org.onap.dmaap",
"drProvUrl": "https://dmaap-dr-prov:8443",
-"dmaapName": "onapCSIT",
+"dmaapName": "DataRouter",
"bridgeAdminTopic": "MM_AGENT_PROV"
}
EOF
echo "Initializing /dmaap endpoint"
-curl -v -X POST -d @${JSON} -H "Content-Type: application/json" http://$1:8080/webapi/dmaap \ No newline at end of file
+curl -v -X POST -d @${JSON} -H "Content-Type: application/json" http://$1:8080/webapi/dmaap
+
+# INITIALIZE: dcaeLocation object
+JSON=/tmp/dcaeLocation.json
+cat << EOF > $JSON
+{
+"dcaeLocationName": "csit-pmmapper",
+"dcaeLayer": "central-cloud",
+"clli": "CSIT",
+"zone": "zoneA"
+}
+EOF
+
+echo "Initializing /dcaeLocations endpoint"
+curl -v -X POST -d @${JSON} -H "Content-Type: application/json" http://$1:8080/webapi/dcaeLocations
+
+# INITIALIZE: MR object in 1 site
+DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
+JSON=/tmp/mr.json
+cat << EOF > $JSON
+{
+"dcaeLocationName": "csit-pmmapper",
+"fqdn": "$DMAAP_MR_IP",
+"topicProtocol" : "http",
+"topicPort": "3904"
+}
+EOF
+
+echo "Initializing /mr_clusters endpoint"
+curl -v -X POST -d @${JSON} -H "Content-Type: application/json" http://$1:8080/webapi/mr_clusters
+
+# CREATING: DR feed
+JSON=/tmp/feed.json
+cat << EOF > $JSON
+{
+"feedName":"pmmapper",
+"feedVersion": "1",
+"feedDescription":"PM Mapper Feed",
+"owner":"bulkpm",
+"asprClassification": "unclassified"
+}
+EOF
+echo "Initializing /feeds endpoint"
+curl -v -X POST -d @${JSON} -H "Content-Type: application/json" http://$1:8080/webapi/feeds
+sleep 5 \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/setup.sh b/plans/dcaegen2-pmmapper/pmmapper/setup.sh
index 5d8cce62..b50d155d 100644
--- a/plans/dcaegen2-pmmapper/pmmapper/setup.sh
+++ b/plans/dcaegen2-pmmapper/pmmapper/setup.sh
@@ -32,12 +32,10 @@ else
fi
done
-# Get IP address of DMAAP, KAFKA, Zookeeper
+# Get IP address of KAFKA, Zookeeper
KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $KAFKA)
ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ZOOKEEPER)
-DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
-sleep 2
# Shutdown DMAAP Container
docker kill $DMAAP
@@ -50,7 +48,10 @@ docker login -u docker -p docker nexus3.onap.org:10001
docker-compose up -d
sleep 5
-# Clone DMaaP Data Router repo
+# Get IP address of DMAAP Message Router.
+DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
+
+# Clone DMaaP Data Router repo and Initialization of Data Router, Consul, Config Binding Service and Buscontroller
mkdir -p $WORKSPACE/archives/dmaapdr
cd $WORKSPACE/archives/dmaapdr
git clone --depth 1 https://gerrit.onap.org/r/dmaap/datarouter -b master
@@ -58,7 +59,8 @@ cd $WORKSPACE/archives/dmaapdr/datarouter/datarouter-docker-compose/src/main/res
mkdir docker-compose
cd $WORKSPACE/archives/dmaapdr/datarouter/datarouter-docker-compose/src/main/resources/docker-compose
cp $WORKSPACE/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml $WORKSPACE/archives/dmaapdr/datarouter/datarouter-docker-compose/src/main/resources/docker-compose/docker-compose.yml
-
+cp $WORKSPACE/plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf /tmp/
+sed -i 's/DMAAPMR/'$DMAAP_MR_IP'/g' /tmp/docker-databus-controller.conf
docker login -u docker -p docker nexus3.onap.org:10001
docker-compose up -d
echo "Disregard the message ERROR: for datarouter-node Container 1234456 is unhealthy, this is expected behaiour at this stage"
@@ -72,38 +74,31 @@ sed -i 's/datarouter-mariadb/'$MARIADB'/g' $WORKSPACE/archives/dmaapdr/dataroute
docker-compose up -d
DR_PROV_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-prov)
docker kill buscontroller
-sed -i 's/dr-prov-ip/'$DR_PROV_IP'/g' docker-compose.yml
+sed -i 's/DMAAPDR/'$DR_PROV_IP'/g' docker-compose.yml
+sed -i 's/DMAAPMR/'$DMAAP_MR_IP'/g' docker-compose.yml
docker-compose up -d
+sed -i 's/DMAAPDR/'$DR_PROV_IP'/g' /tmp/docker-databus-controller.conf
-# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb
+# Wait for initialization of Docker container for datarouter-node, datarouter-prov and mariadb, Consul, CBS, Buscontroller
for i in {1..10}; 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 }}' mariadb) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' consul) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' cbs) ] && \
+ [ $(docker inspect --format '{{ .State.Running }}' buscontroller) ]
then
- echo "DR Service Running"
+ echo "Data Router, Consul, Config Binding Service, Buscontroller Services Running"
break
else
echo sleep $i
sleep $i
fi
done
-
sleep 5
-
-# Get IP address of datarrouger-prov, datarouter-node, fileconsumer-node.
-DR_PROV_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-prov)
+# Data Router Configuration.
DR_NODE_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' datarouter-node)
DR_GATEWAY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' datarouter-prov)
-
-# Get IP address of DMAAP, KAFKA, Zookeeper, ConfigBindingService
-DMAAP_MR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $DMAAP)
-KAFKA_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $KAFKA)
-ZOOKEEPER_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $ZOOKEEPER)
-CBS_IP=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cbs)
-
-# Data Router Configuration:
-# Create default feed on data router
docker exec -i datarouter-prov sh -c "curl -k -X PUT https://$DR_PROV_IP:8443/internal/api/NODES?val=dmaap-dr-node\|$DR_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\|$DR_GATEWAY_IP"
docker exec datarouter-prov /bin/sh -c "echo '${DR_NODE_IP}' dmaap-dr-node >> /etc/hosts"
@@ -119,5 +114,32 @@ sed -i 's/ipaddress/'${CBS_IP}'/g' /tmp/cbs.json
curl --request PUT --data @/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/^Con' -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' --data @$WORKSPACE/plans/dcaegen2-pmmapper/pmmapper/assets/config.json
+# PM Mapper startup and configuration
+mkdir /tmp/docker-compose
+cd /tmp/docker-compose
+cp $WORKSPACE/plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml /tmp/docker-compose/docker-compose.yml
+CBS_IP=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cbs)
+sed -i 's/CBSIP/'$CBS_IP'/g' docker-compose.yml
+sed -i 's/BUSIP/'$DMAAPBC_IP'/g' docker-compose.yml
+docker-compose up -d
+
+# Wait for initialization of Docker container for 3GPP PM Mapper
+for i in {1..10}; do
+ if [ $(docker inspect --format '{{ .State.Running }}' pmmapper) ]
+ then
+ echo "PM Mapper Service Running"
+ break
+ else
+ echo sleep $i
+ sleep $i
+ fi
+done
+PMMAPPER_IP=$(docker inspect '--format={{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pmmapper)
+docker exec datarouter-prov /bin/sh -c "echo '${PMMAPPER_IP}' 3gpppmmapper >> /etc/hosts"
+sleep 10
+docker exec pmmapper /bin/sh -c "cat /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log" > /tmp/pmmapper.log
+cat /tmp/pmmapper.log
+curl -k https://$DR_PROV_IP:8443/internal/prov
+
#Pass any variables required by Robot test suites in ROBOT_VARIABLES
-ROBOT_VARIABLES="-v DR_PROV_IP:${DR_PROV_IP} -v DMAAPBC_IP:${DMAAPBC_IP} -v DMAAP_MR_IP:${DMAAP_MR_IP} -v CBS_IP:${CBS_IP} -v DR_SUBSCIBER_IP:${DR_SUBSCIBER_IP}" \ No newline at end of file
+ROBOT_VARIABLES="-v DR_PROV_IP:${DR_PROV_IP} -v DMAAPBC_IP:${DMAAPBC_IP} -v DMAAP_MR_IP:${DMAAP_MR_IP} -v CBS_IP:${CBS_IP} -v PMMAPPER_IP:${PMMAPPER_IP}" \ No newline at end of file
diff --git a/plans/dcaegen2-pmmapper/pmmapper/teardown.sh b/plans/dcaegen2-pmmapper/pmmapper/teardown.sh
index 5b910121..08e1c770 100644
--- a/plans/dcaegen2-pmmapper/pmmapper/teardown.sh
+++ b/plans/dcaegen2-pmmapper/pmmapper/teardown.sh
@@ -7,4 +7,6 @@ kill-instance.sh datarouter-node
kill-instance.sh datarouter-prov
kill-instance.sh mariadb
kill-instance.sh cbs
-kill-instance.sh consul \ No newline at end of file
+kill-instance.sh consul
+kill-instance.sh buscontroller
+kill-instance.sh pmmapper \ No newline at end of file
diff --git a/plans/policy/api/setup.sh b/plans/policy/api/setup.sh
index dcfcb9ea..5ba95e9a 100644
--- a/plans/policy/api/setup.sh
+++ b/plans/policy/api/setup.sh
@@ -28,4 +28,4 @@ for i in {1..10}; do
sleep $i
done
-ROBOT_VARIABLES="-v POLICY_API_IP:${POLICY_API_IP}" \ No newline at end of file
+ROBOT_VARIABLES="-v POLICY_API_IP:${POLICY_API_IP}"
diff --git a/tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot b/tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot
index ccfa4968..1e3d9e91 100644
--- a/tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot
+++ b/tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot
@@ -1,35 +1,32 @@
*** Settings ***
Documentation Testing PM Mapper functionality
-Resource ../../common.robot
Library Collections
-Library json
Library OperatingSystem
Library RequestsLibrary
-Library HttpLibrary.HTTP
-Library String
Library Process
*** Variables ***
-${BC_URL} http://${DMAAPBC_IP}:8080/webapi
-${CLI_EXEC_CLI} curl http://${CBS_IP}:10000/service_component/pmmapper
-${FEED1_DATA} { "feedName":"feed1", "feedVersion": "csit", "feedDescription":"generated for CSIT", "owner":"dgl", "asprClassification": "unclassified" }
-
+${CLI_EXEC_CLI_CONFIG} { head -n 5 | tail -1;} < /tmp/pmmapper.log
+${CLI_EXEC_CLI_SUBS} curl -k https://${DR_PROV_IP}:8443/internal/prov
*** Test Cases ***
-Verify pmmapper configuration in consul through CBS
+Verify PM Mapper Receive Configuraton From Config Binding Service
[Tags] PM_MAPPER_01
- [Documentation] Verify pmmapper configuraiton in consul through CBS
- ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI} shell=yes
+ [Documentation] Verify 3gpp pm mapper successfully receive config data from CBS
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI_CONFIG} shell=yes
Log ${cli_cmd_output.stdout}
- Should Contain ${cli_cmd_output.stdout} pm-mapper-filter
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} Received pm-mapper configuration
-Create DR Feed through Bus Controller
+Verify 3GPP PM Mapper Subscribes to Data Router
[Tags] PM_MAPPER_02
- [Documentation] Create Feed on Data Router through Bus Controller
- ${resp}= PostCall ${BC_URL}/feeds ${FEED1_DATA}
- Should Be Equal As Integers ${resp.status_code} 200
+ [Documentation] Verify 3gpp pm mapper subscribes to data router
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI_SUBS} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} 3gpppmmapper
*** Keywords ***
diff --git a/tests/policy/api/api-test.robot b/tests/policy/api/api-test.robot
index 3753b3d8..7ea24738 100644
--- a/tests/policy/api/api-test.robot
+++ b/tests/policy/api/api-test.robot
@@ -8,8 +8,8 @@ Library json
Healthcheck
[Documentation] Runs Policy Api Health check
${auth}= Create List healthcheck zb!XztG34
- Log Creating session http://${POLICY_API_IP}:6969
- ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth}
+ Log Creating session https://${POLICY_API_IP}:6969
+ ${session}= Create Session policy https://${POLICY_API_IP}:6969 auth=${auth}
${headers}= Create Dictionary Accept=application/json Content-Type=application/json
${resp}= Get Request policy /healthcheck headers=${headers}
Log Received response from policy ${resp.text}
@@ -19,10 +19,10 @@ Healthcheck
Statistics
[Documentation] Runs Policy Api Statistics
${auth}= Create List healthcheck zb!XztG34
- Log Creating session http://${POLICY_API_IP}:6969
- ${session}= Create Session policy http://${POLICY_API_IP}:6969 auth=${auth}
+ Log Creating session https://${POLICY_API_IP}:6969
+ ${session}= Create Session policy https://${POLICY_API_IP}:6969 auth=${auth}
${headers}= Create Dictionary Accept=application/json Content-Type=application/json
${resp}= Get Request policy /statistics headers=${headers}
Log Received response from policy ${resp.text}
Should Be Equal As Strings ${resp.status_code} 200
- Should Be Equal As Strings ${resp.json()['code']} 200 \ No newline at end of file
+ Should Be Equal As Strings ${resp.json()['code']} 200
diff --git a/tests/usecases/5G-bulkpm/BulkpmE2E.robot b/tests/usecases/5G-bulkpm/BulkpmE2E.robot
index 28de4c24..4b85e6ba 100644
--- a/tests/usecases/5G-bulkpm/BulkpmE2E.robot
+++ b/tests/usecases/5G-bulkpm/BulkpmE2E.robot
@@ -19,6 +19,11 @@ ${TARGETURL_SUBSCR} http://${DMAAP_MR_IP}:3904/events/unaut
${CLI_EXEC_CLI} curl -k https://${DR_PROV_IP}:8443/internal/prov
${CLI_EXEC_CLI_FILECONSUMER} docker exec fileconsumer-node /bin/sh -c "ls /opt/app/subscriber/delivery | grep .gz"
+${CLI_EXEC_CLI_FILECONSUMER_CP} docker cp fileconsumer-node:/opt/app/subscriber/delivery/xNF.pm.xml.gz.M %{WORKSPACE}
+${CLI_EXEC_RENAME_METADATA} mv %{WORKSPACE}/xNF.pm.xml.gz.M %{WORKSPACE}/metadata.json
+${metadataSchemaPath} %{WORKSPACE}/tests/usecases/5G-bulkpm/assets/metadata.schema.json
+${metadataJsonPath} %{WORKSPACE}/metadata.json
+
*** Test Cases ***
Send VES File Ready Event to VES Collector
@@ -77,3 +82,15 @@ Verify Fileconsumer Receive PM file from Data Router
Log ${cli_cmd_output.stdout}
Should Be Equal As Strings ${cli_cmd_output.rc} 0
Should Contain ${cli_cmd_output.stdout} xNF.pm.xml.gz
+
+Verify File Consumer Receive valid metadata from Data Router
+ [Tags] Bulk_PM_E2E_06
+ [Documentation] Check PM XML file is delivered to the FileConsumer Simulator with valid metadata
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI_FILECONSUMER} shell=yes
+ Log ${cli_cmd_output.stdout}
+ Should Be Equal As Strings ${cli_cmd_output.rc} 0
+ Should Contain ${cli_cmd_output.stdout} xNF.pm.xml.gz.M
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_CLI_FILECONSUMER_CP} shell=yes
+ ${cli_cmd_output}= Run Process ${CLI_EXEC_RENAME_METADATA} shell=yes
+ ${validation_result}= Validate ${metadataSchemaPath} ${metadataJsonPath}
+ Should Be Equal As Strings ${validation_result} 0
diff --git a/tests/usecases/5G-bulkpm/assets/metadata.schema.json b/tests/usecases/5G-bulkpm/assets/metadata.schema.json
new file mode 100644
index 00000000..a41b3544
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/assets/metadata.schema.json
@@ -0,0 +1,74 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "$id": "metadata.schema.json",
+ "title": "DataRouter PM File Metadata",
+ "description": "Metadata for 3GPP PM files that are placed on the DMaaP Data Router by the Data File Collector (VES 7.1)",
+ "type": "object",
+
+ "properties": {
+ "productName": {
+ "description": "from the FileReady event eventName",
+ "type": "string"
+ },
+
+ "vendorName": {
+ "description": "from the FileReady event eventName",
+ "type": "string"
+ },
+
+ "lastEpochMicrosec": {
+ "description": "the latest unix epoch time associated with the FileReady event",
+ "type": "string"
+ },
+
+ "sourceName": {
+ "description": "the name of the entity experiencing the event",
+ "type": "string"
+ },
+
+ "startEpochMicrosec": {
+ "description": "the earliest unix epoch time associated with the FileReady event",
+ "type": "string"
+ },
+
+ "timeZoneOffset": {
+ "description": "the timezone offset from UTC",
+ "type": "string",
+ "pattern": "^(?:(?:[a-zA-Z]{3})[+-](?:[01][0-9]|2[0-3]).[0-5][0-9])$"
+ },
+
+ "location": {
+ "description": "follows the format <protocol>://<ip address>:<port>/<path>/<filename>, the IP address is the node ip address, the port of the protocol server",
+ "type": "string"
+ },
+
+ "compression": {
+ "description": "specifies if the file is compressed",
+ "type": "string",
+ "enum": [ "gzip" ]
+ },
+
+ "fileFormatType": {
+ "description": "the file format",
+ "type": "string"
+ },
+
+ "fileFormatVersion": {
+ "description": "the version of the file format",
+ "type": "string"
+ }
+ },
+
+ "required": [
+ "productName",
+ "vendorName",
+ "lastEpochMicrosec",
+ "sourceName",
+ "startEpochMicrosec",
+ "timeZoneOffset",
+ "location",
+ "compression",
+ "fileFormatType",
+ "fileFormatVersion"
+ ]
+}
diff --git a/tests/usecases/5G-bulkpm/resources/JsonValidatorLibrary.py b/tests/usecases/5G-bulkpm/resources/JsonValidatorLibrary.py
new file mode 100644
index 00000000..12d5d856
--- /dev/null
+++ b/tests/usecases/5G-bulkpm/resources/JsonValidatorLibrary.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+
+import sys
+import logging
+from simplejson import load
+from jsonschema import validate, ValidationError, SchemaError
+
+
+class JsonValidatorLibrary(object):
+
+ def __init__(self):
+ pass
+
+ def validate(self, schemaPath, jsonPath):
+ logging.info("Schema path: " + schemaPath)
+ logging.info("JSON path: " + jsonPath)
+ schema = None
+ data = None
+ try:
+ schema = load(open(schemaPath, 'r'))
+ data = load(open(jsonPath, 'r'))
+ except (IOError, ValueError, OSError) as e:
+ logging.error(e.message)
+ return 1
+
+ try:
+ validate(data, schema)
+ except (ValidationError, SchemaError) as e:
+ logging.error(e.message)
+ return 1
+
+ # logger.log("JSON validation successful")
+ print("JSON validation successful")
+ return 0
+
+if __name__ == '__main__':
+ lib = JsonValidatorLibrary()
+ # sys.exit(JsonValidatorLibrary().validate(sys.argv[1], sys.argv[2]))
diff --git a/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot b/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot
index 6859ea0d..9ef56c83 100644
--- a/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot
+++ b/tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot
@@ -2,6 +2,7 @@
Documentation The main interface for interacting with VES. It handles low level stuff like managing the http request library and VES required fields
Library RequestsLibrary
Library ../resources/xNFLibrary.py
+Library ../resources/JsonValidatorLibrary.py
Library OperatingSystem
Library Collections
Library requests