diff options
Diffstat (limited to 'test/mocks/datafilecollector-testharness/mr-sim')
5 files changed, 357 insertions, 0 deletions
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/.gitignore b/test/mocks/datafilecollector-testharness/mr-sim/.gitignore new file mode 100644 index 000000000..e4c889be6 --- /dev/null +++ b/test/mocks/datafilecollector-testharness/mr-sim/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +.env/ +.pydevproject
\ No newline at end of file diff --git a/test/mocks/datafilecollector-testharness/mr-sim/README.md b/test/mocks/datafilecollector-testharness/mr-sim/README.md new file mode 100644 index 000000000..b04b9ec64 --- /dev/null +++ b/test/mocks/datafilecollector-testharness/mr-sim/README.md @@ -0,0 +1,46 @@ +## Developer workflow + +1. ```sudo apt install python3-venv``` +2. ```source .env/bin/activate/``` +3. ```pip3 install "anypackage"``` #also include in source code +4. ```pip3 freeze | grep -v "pkg-resources" > requirements.txt``` #to create a req file +5. ```FLASK_APP=mr-sim.py flask run``` + + or + + ```python3 mr-sim.py ``` + +6. Check/lint/format the code before commit/amed by ```autopep8 --in-place --aggressive --aggressive mr-sim.py``` + + +## User workflow on *NIX + + +When cloning/fetching from the repository first time: +1. `git clone` +2. `cd "..." ` #navigate to this folder +3. `source setup.sh ` #setting up virtualenv and install requirements + + you'll get a sourced virtualenv shell here, check prompt +4. `(env) $ python3 mr-sim.py --help` + + alternatively + + `(env) $ python3 mr-sim.py --tc1` + +Every time you run the script, you'll need to step into the virtualenv by following step 3 first. + +## User workflow on Windows + +When cloning/fetching from the repository first time: + +1. 'git clone' +2. then step into the folder +3. 'pip3 install virtualenv' +4. 'pip3 install virtualenvwrapper-win' +5. 'mkvirtualenv env' +6. 'workon env' +7. 'pip3 install -r requirements.txt' #this will install in the local environment then +8. 'python3 dfc-sim.py' + +Every time you run the script, you'll need to step into the virtualenv by step 2+6.
\ No newline at end of file diff --git a/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py b/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py new file mode 100644 index 000000000..c37ae698a --- /dev/null +++ b/test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py @@ -0,0 +1,289 @@ +import argparse +import os +from werkzeug import secure_filename +from flask import Flask, render_template, request +from time import sleep +import sys +import json +from flask import Flask +app = Flask(__name__) + +DEFAULT_IP = "localhost" + + +@app.route( + "/events/unauthenticated.VES_NOTIFICATION_OUTPUT/OpenDcae-c12/C12", + methods=['GET']) +def MR_reply(): + global mr_counter + global mr_replies + + mr_counter = mr_counter + 1 + print("MR receiver counter: " + str(mr_counter)) + + if mr_replies[mr_counter].sleepMs != 0: + sleep(mr_replies[mr_counter].sleepMs / 1000.0) + print("Sleeping: " + str(mr_replies[mr_counter].sleepMs) + " ms") + + if mr_replies[mr_counter].replytype == 0: + #print (str(mr_replies[mr_counter].jsonreply)) + print("Regular reply") + response = app.response_class( + response=mr_replies[mr_counter].jsonreply, + status=200, + mimetype='application/json') + + return response + + if mr_replies[mr_counter].replytype == 2: + + print("error: 404") + response = app.response_class( + response="", + status=404, + mimetype='application/json') + + return response + + if mr_replies[mr_counter].replytype == 1: + print("do nothing, sink request") + return + + +class Reply: + """An instance of the reply event, which can be configured to behave in a certain way + (delay, error code, reply body""" + + def to_json(self): + return self.jsonreply + + def __init__( + self, + ip=DEFAULT_IP, + file="1MB.tar.gz", + sleepMs=0, + replyType=0, + port=1022, + type="ftps"): + self.sleepMs = sleepMs + self.ip = ip + self.file = file + self.port = port + self.replytype = replyType # 0 for reply, 1 timeout, 2 deny + self.user = "onap" + self.passwd = "pano" + self.type = type + self.jsonreply = str.encode(""" + [{ + "event": { + "commonEventHeader": { + "startEpochMicrosec": 8745745764578, + "eventId": "FileReady_1797490e-10ae-4d48-9ea7-3d7d790b25e1", + "timeZoneOffset": "UTC+05.30", + "internalHeaderFields": { + "collectorTimeStamp": "Tue, 09 18 2018 10:56:52 UTC" + }, + "priority": "Normal", + "version": "4.0.1", + "reportingEntityName": "otenb5309", + "sequence": 0, + "domain": "notification", + "lastEpochMicrosec": 8745745764578, + "eventName": "Noti_RnNode-Ericsson_FileReady", + "vesEventListenerVersion": "7.0.1", + "sourceName": "oteNB5309" + }, + "notificationFields": { + "notificationFieldsVersion": "2.0", + "changeType": "FileReady", + "changeIdentifier": "PM_MEAS_FILES", + "arrayOfNamedHashMap": [ + { + "name": \"""" + + self.file + + """", + "hashMap": { + "fileFormatType": "org.3GPP.32.435#measCollec", + "location": \"""" + + self.type + + """://""" + + self.user + + """:""" + + self.passwd + + """@""" + + self.ip + + """:""" + + str(self.port) + + """/""" + + self.file + + """", + "fileFormatVersion": "V10", + "compression": "gzip" + } + } + ] + } + } + }] + """) + + +def replyFactory( + ip=DEFAULT_IP, + file="1MB.tar.gz", + factoryport=1022, + count=1, + factorytype="ftps"): + aggregatedReply = "" + # first item does not require . + aggregatedReply = Reply(ip, file, port=factoryport).to_json() + for i in range(count - 1): + aggregatedReply = aggregatedReply + b", " + \ + Reply(ip, file, port=factoryport, type=factorytype).to_json() + #print(b"aggregated reply: " + aggregatedReply) + return b"[" + aggregatedReply + b"]" + + +def prepareMrRespArrSftp(): + global mr_replies + + for i in range(400): # prepare 400 regular replies + mr_replies.append( + Reply( + port=1022, + ip="localhost", + type="sftp", + file="1MB.tar.gz")) + #mr_replies[0] is not used + + +def prepareMrRespArrFtps(): + global mr_replies + + for i in range(400): + mr_replies.append( + Reply( + port=21, + ip="localhost", + type="ftps", + file="1MB.tar.gz")) + + +def tc1(): + prepareMrRespArrSftp() + # no mutation needed in this TC + + +def tc2(): + global mr_replies + + for i in range(7): + mr_replies.append( + Reply( + port=1022, + ip="localhost", + type="sftp", + file="1MB.tar.gz")) + + # inserting and empty reply message + mr_replies[1].jsonreply = b"" + mr_replies[2].jsonreply = b"" + + # inserting a 404 error and delay + mr_replies[3].replytype = 2 + mr_replies[3].sleepMs = 2000 + + # inserting and empty reply message + mr_replies[4].jsonreply = b"" + + # sink the message + mr_replies[5].replytype = 1 + + # reply with one proper file finally + mr_replies[6] = Reply( + port=1022, + ip="localhost", + type="sftp", + file="1MB.tar.gz") + + +def tc3(): + prepareMrRespArrFtps() + + +def tc4(): + global mr_replies + + for i in range(7): + mr_replies.append( + Reply( + port=21, + ip="localhost", + type="ftps", + file="1MB.tar.gz")) + + # inserting and empty reply message + mr_replies[1].jsonreply = b"" + mr_replies[2].jsonreply = b"" + + # inserting a 404 error and delay + mr_replies[3].replytype = 2 + mr_replies[3].sleepMs = 2000 + + # inserting and empty reply message + mr_replies[4].jsonreply = b"" + + # sink the message + mr_replies[5].replytype = 1 + + # reply with one proper file finally + mr_replies[6] = Reply( + port=21, + ip="localhost", + type="fftp", + file="1MB.tar.gz") + + +if __name__ == "__main__": + mr_replies = [] + mr_counter = 0 # counting hits reaching MR instance + DR_block_single_req = 0 + + parser = argparse.ArgumentParser() + parser.add_argument( + '--tc1', + action='store_true', + help='TC1: reply all queries with 1-1 files using SFTP') + parser.add_argument( + '--tc2', + action='store_true', + help='TC2: Reply according to error scenarios, then return 1 file finally for SFTP ---NOTE: updated keys required') + parser.add_argument( + '--tc3', + action='store_true', + help='TC3: reply all queries with 1-1 files using FTPS') + parser.add_argument( + '--tc4', + action='store_true', + help='TC4: Reply according to error scenarios, then return 1 file finally for FTPS ---NOTE: updated keys required') + + args = parser.parse_args() + + if args.tc1: + print("TC: #1") + tc1() + elif args.tc2: + print("TC: #2") + tc2() + elif args.tc3: + print("TC: #3") + tc3() + elif args.tc4: + print("TC: #4") + tc4() + + else: + print("No TC was defined") + print("use --help for usage info") + sys.exit() + app.run(port=2222) diff --git a/test/mocks/datafilecollector-testharness/mr-sim/requirements.txt b/test/mocks/datafilecollector-testharness/mr-sim/requirements.txt new file mode 100644 index 000000000..6f02fb6e3 --- /dev/null +++ b/test/mocks/datafilecollector-testharness/mr-sim/requirements.txt @@ -0,0 +1,6 @@ +Click==7.0 +Flask==1.0.2 +itsdangerous==1.1.0 +Jinja2==2.10 +MarkupSafe==1.1.0 +Werkzeug==0.14.1 diff --git a/test/mocks/datafilecollector-testharness/mr-sim/setup.sh b/test/mocks/datafilecollector-testharness/mr-sim/setup.sh new file mode 100755 index 000000000..6661d0bb8 --- /dev/null +++ b/test/mocks/datafilecollector-testharness/mr-sim/setup.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +virtualenv --version > /dev/null || { echo 'Virtualenv command is not available, exiting' ; sleep 10; exit 1; } +pip3 --version > /dev/null || { echo 'python3-pip package is not available, exiting' ; sleep 10; exit 1; } + + +if [ -d ".env" ]; then + echo ".env is prepared" +else + virtualenv --no-site-packages --distribute -p python3 .env +fi + +source .env/bin/activate && pip3 install -r requirements.txt |