diff options
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/assets/config.json | 35 | ||||
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/assets/docker-databus-controller.conf | 7 | ||||
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-e2e.yml | 11 | ||||
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/composefile/docker-compose-pmmapper.yml | 11 | ||||
-rwxr-xr-x | plans/dcaegen2-pmmapper/pmmapper/dmaapbc.sh | 51 | ||||
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/setup.sh | 68 | ||||
-rw-r--r-- | plans/dcaegen2-pmmapper/pmmapper/teardown.sh | 4 | ||||
-rw-r--r-- | plans/policy/api/setup.sh | 2 | ||||
-rw-r--r-- | tests/dcaegen2-pmmapper/pmmapper/pmmapper.robot | 29 | ||||
-rw-r--r-- | tests/policy/api/api-test.robot | 10 | ||||
-rw-r--r-- | tests/usecases/5G-bulkpm/BulkpmE2E.robot | 17 | ||||
-rw-r--r-- | tests/usecases/5G-bulkpm/assets/metadata.schema.json | 74 | ||||
-rw-r--r-- | tests/usecases/5G-bulkpm/resources/JsonValidatorLibrary.py | 38 | ||||
-rw-r--r-- | tests/usecases/5G-bulkpm/resources/bulkpm_keywords.robot | 1 |
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 |