Seperating usecase test suite dependencies

  # Refactoring BulkPM Dataplane test suite

Signed-off-by: efiacor <fiachra.corcoran@est.tech>
Change-Id: I4b2ad0dc5147e10ffc55f4ec210a29f073cd865b
Issue-ID: INT-832
Signed-off-by: efiacor <fiachra.corcoran@est.tech>
diff --git a/tests/usecases-5G-bulkpm/5G-bulkpm/BulkpmE2E.robot b/tests/usecases-5G-bulkpm/5G-bulkpm/BulkpmE2E.robot
new file mode 100644
index 0000000..fe3b1ce
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/BulkpmE2E.robot
@@ -0,0 +1,125 @@
+*** Settings ***
+Documentation	  Testing E2E VES,Dmaap,DFC,DR with File Ready event feed from xNF
+Library           RequestsLibrary
+Library           OperatingSystem
+Library           Collections
+Library           Process
+Resource          resources/bulkpm_keywords.robot
+Library           resources/JsonValidatorLibrary.py
+Library           resources/xNFLibrary.py
+
+
+*** Variables ***
+${VESC_URL}                              http://%{VESC_IP}:%{VESC_PORT}
+${GLOBAL_APPLICATION_ID}                 robot-ves
+${VES_ANY_EVENT_PATH}                    /eventListener/v7
+${HEADER_STRING}                         content-type=application/json
+${EVENT_DATA_FILE}                       %{WORKSPACE}/tests/usecases-5G-bulkpm/5G-bulkpm/assets/json_events/FileExistNotification.json
+
+${TARGETURL_TOPICS}                      http://${DMAAP_MR_IP}:3904/topics
+${TARGETURL_SUBSCR}                      http://${DMAAP_MR_IP}:3904/events/unauthenticated.VES_NOTIFICATION_OUTPUT/OpenDcae-c12/C12?timeout=1000
+${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 .xml"
+${CLI_EXEC_CLI_DFC_LOG}                  docker exec dcaegen2-datafile-collector /bin/sh -c "cat /var/log/ONAP/application.log" > %{WORKSPACE}/archives/dfc_docker.log
+${CLI_EXEC_CLI_DFC_LOG_GREP}             grep "Datafile file published" %{WORKSPACE}/archives/dfc_docker.log
+${CLI_EXEC_CLI_FILECONSUMER_CP}          docker cp fileconsumer-node:/opt/app/subscriber/delivery/A20181002.0000-1000-0015-1000_5G.xml.M %{WORKSPACE}
+${CLI_EXEC_RENAME_METADATA}              mv %{WORKSPACE}/A20181002.0000-1000-0015-1000_5G.xml.M  %{WORKSPACE}/archives/metadata.json
+${CLI_EXEC_CLI_PMMAPPER_LOG}             docker exec dcaegen2-pm-mapper /bin/sh -c "cat /var/log/ONAP/dcaegen2/services/pm-mapper/pm-mapper_output.log" > %{WORKSPACE}/archives/pmmapper_docker.log
+${CLI_EXEC_CLI_PMMAPPER_LOG_GREP}        grep "XML validation successful Event" %{WORKSPACE}/archives/pmmapper_docker.log
+${CLI_EXEC_CLI_PMMAPPER_LOG_GREP_VES}    grep "Successfully published VES events to messagerouter" %{WORKSPACE}/archives/pmmapper_docker.log
+${metadataSchemaPath}                    %{WORKSPACE}/tests/usecases-5G-bulkpm/5G-bulkpm/assets/metadata.schema.json
+${metadataJsonPath}                      %{WORKSPACE}/archives/metadata.json
+
+*** Test Cases ***
+
+Send VES File Ready Event to VES Collector
+    [Tags]    Bulk_PM_E2E_01
+    [Documentation]   Send VES File Ready Event
+    ${evtdata}=   Get Event Data From File   ${EVENT_DATA_FILE}
+    ${headers}=   Create Header From String    ${HEADER_STRING}
+    ${resp}=  Publish Event To VES Collector    ${VESC_URL}  ${VES_ANY_EVENT_PATH}  ${headers}  ${evtdata}
+    Sleep     15s
+    ${resp}=  Publish Event To VES Collector    ${VESC_URL}  ${VES_ANY_EVENT_PATH}  ${headers}  ${evtdata}
+    Sleep     5s
+    ${resp}=  Publish Event To VES Collector    ${VESC_URL}  ${VES_ANY_EVENT_PATH}  ${headers}  ${evtdata}
+    Sleep     5s
+    ${resp}=  Publish Event To VES Collector    ${VESC_URL}  ${VES_ANY_EVENT_PATH}  ${headers}  ${evtdata}
+    Sleep     5s
+    Log    Receive HTTP Status code ${resp.status_code}
+    Should Be Equal As Strings 	${resp.status_code} 	202
+
+Check VES Notification Topic is existing in Message Router
+    [Tags]                          Bulk_PM_E2E_02
+    [Documentation]                 Get the VES Notification topic on message router
+    [Timeout]                       1 minute
+    Sleep                           10s
+    ${resp}=                        GetCall                         ${TARGETURL_TOPICS}
+    log                             ${TARGETURL_TOPICS}
+    log                             'JSON Response Code :'${resp}
+    ${topics}=                      Evaluate                        $resp.json().get('topics')
+    log                             ${topics}
+    ${ListLength}=                  Get Length                      ${topics}
+    log                             ${ListLength}
+    List Should Contain Value       ${topics}                       unauthenticated.VES_NOTIFICATION_OUTPUT
+
+Verify Data File Collector successfully publishes the PM XML file to the Data Router
+    [Tags]                          Bulk_PM_E2E_03
+    [Documentation]                 Check that DFC publishes the PM XML to the Data Router
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_DFC_LOG}        shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_DFC_LOG_GREP}    shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    Should Contain                  ${cli_cmd_output.stdout}        Datafile file published
+
+
+Verify Default Feed And File Consumer Subscription On Datarouter
+    [Tags]                          Bulk_PM_E2E_04
+    [Documentation]                 Verify Default Feed And File Consumer Subscription On Datarouter
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI}                     shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    Should Contain                  ${cli_cmd_output.stdout}        https://dmaap-dr-prov/publish/1
+    Should Contain                  ${cli_cmd_output.stdout}        http://datarouter-subscriber:7070
+
+
+Verify Fileconsumer Receive PM file from Data Router
+    [Tags]                          Bulk_PM_E2E_05
+    [Documentation]                 Check  PM XML file exists on the File Consumer Simulator
+    ${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}        A20181002.0000-1000-0015-1000_5G.xml
+
+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}        A20181002.0000-1000-0015-1000_5G.xml.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
+
+Verify PM-Mapper successfully receives uncompressed the PM XML file
+    [Tags]                          Bulk_PM_E2E_07
+    [Documentation]                 Check that PM-Mapper receives the uncompressed PM XML file
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_PMMAPPER_LOG}        shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_PMMAPPER_LOG_GREP}    shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    Should Contain                  ${cli_cmd_output.stdout}        XML validation successful Event
+
+Verify PM-Mapper successfully publishes VES event the Message Router
+    [Tags]                          Bulk_PM_E2E_08
+    [Documentation]                 Check that PM-Mapper publishes VES onto the Message Router
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_PMMAPPER_LOG}    shell=yes
+    Log                             ${cli_cmd_output.stdout}
+    Should Be Equal As Strings      ${cli_cmd_output.rc}            0
+    ${cli_cmd_output}=              Run Process                     ${CLI_EXEC_CLI_PMMAPPER_LOG_GREP_VES}    shell=yes
+    Should Contain                  ${cli_cmd_output.stdout}        Successfully published VES events to messagerouter
\ No newline at end of file
diff --git a/tests/usecases-5G-bulkpm/5G-bulkpm/__init__.robot b/tests/usecases-5G-bulkpm/5G-bulkpm/__init__.robot
new file mode 100644
index 0000000..7114fd4
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation    5G Bulk PM E2E Testcases
diff --git a/tests/usecases-5G-bulkpm/5G-bulkpm/assets/json_events/FileExistNotification.json b/tests/usecases-5G-bulkpm/5G-bulkpm/assets/json_events/FileExistNotification.json
new file mode 100644
index 0000000..02f092d
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/assets/json_events/FileExistNotification.json
@@ -0,0 +1,33 @@
+{
+    "event": {
+        "commonEventHeader": {
+            "version": "4.0.1",
+            "vesEventListenerVersion": "7.0.1",
+            "domain": "notification",
+            "eventName": "Noti_RnNode-Ericsson_FileReady",
+            "eventId": "FileReady_1797490e-10ae-4d48-9ea7-3d7d790b25e1",
+            "lastEpochMicrosec": 8745745764578,
+            "priority": "Normal",
+            "reportingEntityName": "otenb5309",
+            "sequence": 0,
+            "sourceName": "oteNB5309",
+            "startEpochMicrosec": 8745745764578,
+            "timeZoneOffset": "UTC+05.30"
+        },
+        "notificationFields": {
+            "changeIdentifier": "PM_MEAS_FILES",
+            "changeType": "FileReady",
+            "notificationFieldsVersion": "2.0",
+            "arrayOfNamedHashMap": [
+                { "name": "A20181002.0000-1000-0015-1000_5G.xml.gz",
+                  "hashMap":{
+                            "location": "sftp://admin:admin@sftp:22/A20181002.0000-1000-0015-1000_5G.xml.gz",
+                            "compression": "gzip",
+                            "fileFormatType": "org.3GPP.32.435#measCollec",
+                            "fileFormatVersion": "V10"
+                            }
+                }
+        ]
+    }
+}
+}
\ No newline at end of file
diff --git a/tests/usecases-5G-bulkpm/5G-bulkpm/assets/metadata.schema.json b/tests/usecases-5G-bulkpm/5G-bulkpm/assets/metadata.schema.json
new file mode 100644
index 0000000..a41b354
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/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/5G-bulkpm/resources/JsonValidatorLibrary.py b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/JsonValidatorLibrary.py
new file mode 100644
index 0000000..ed376ff
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/JsonValidatorLibrary.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+import logging
+
+from jsonschema import validate, ValidationError, SchemaError
+from simplejson import load
+
+
+class JsonValidatorLibrary(object):
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def validate(schema_path, json_path):
+        logging.info("Schema path: " + schema_path)
+        logging.info("JSON path: " + json_path)
+        schema = None
+        data = None
+        try:
+            schema = load(open(schema_path, 'r'))
+            data = load(open(json_path, '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/5G-bulkpm/resources/bulkpm_keywords.robot b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/bulkpm_keywords.robot
new file mode 100644
index 0000000..9ef56c8
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/bulkpm_keywords.robot
@@ -0,0 +1,39 @@
+ *** Settings ***
+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
+Library           Collections
+Library           String
+
+*** Variables ***
+
+*** Keywords ***
+
+Get Event Data From File
+    [Arguments]    ${jsonfile}
+    ${data}=    OperatingSystem.Get File    ${jsonfile}
+    #Should Not Be_Equal    ${data}    None
+    [return]    ${data}
+
+Publish Event To VES Collector
+    [Documentation]    Send an event to VES Collector
+    [Arguments]     ${url}  ${evtpath}   ${httpheaders}    ${evtdata}
+    Log    Creating session ${url}
+    ${session}=    Create Session 	dcaegen2-d1 	${url}
+    ${resp}= 	Post Request 	dcaegen2-d1 	${evtpath}     data=${evtdata}   headers=${httpheaders}
+    #Log    Received response from dcae ${resp.json()}
+    [return] 	${resp}
+PostCall
+    [Arguments]    ${url}    		${data}
+    ${headers}=    Create Dictionary    Accept=application/json    Content-Type=application/json
+    ${resp}=       Evaluate    requests.post('${url}',data='${data}', headers=${headers},verify=False)    requests
+    [Return]       ${resp}
+
+GetCall
+    [Arguments]     ${url}
+    ${resp}=    	Evaluate    requests.get('${url}')    requests
+    [Return]    	${resp}
diff --git a/tests/usecases-5G-bulkpm/5G-bulkpm/resources/xNFLibrary.py b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/xNFLibrary.py
new file mode 100644
index 0000000..b70d809
--- /dev/null
+++ b/tests/usecases-5G-bulkpm/5G-bulkpm/resources/xNFLibrary.py
@@ -0,0 +1,30 @@
+'''
+Created on Aug 18, 2017
+
+@author: sw6830
+'''
+import time
+import uuid
+
+from robot.api import logger
+
+
+class xNFLibrary(object):
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def create_header_from_string(dict_str):
+        logger.info("Enter create_header_from_string: dictStr")
+        return dict(u.split("=") for u in dict_str.split(","))
+
+    @staticmethod
+    def Generate_UUID(self):
+        """generate a uuid"""
+        return uuid.uuid4()
+
+
+if __name__ == '__main__':
+    lib = xNFLibrary()
+    time.sleep(100000)