| 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) |