Updated simulators for DFC 20/83020/1
authorBjornMagnussonXA <bjorn.magnusson@est.tech>
Fri, 22 Mar 2019 09:48:38 +0000 (09:48 +0000)
committerBjornMagnussonXA <bjorn.magnusson@est.tech>
Fri, 22 Mar 2019 09:48:38 +0000 (09:48 +0000)
mr sim has a number of new test cases
Docker files/docker compose files added.
Minor adjustment to scripts.

Issue-ID: DCAEGEN2-1313

Change-Id: I0246a9d5c855cda4e7dea9830928cae98c5e1284
Signed-off-by: BjornMagnussonXA <bjorn.magnusson@est.tech>
test/mocks/datafilecollector-testharness/dr-sim/Dockerfile [new file with mode: 0644]
test/mocks/datafilecollector-testharness/dr-sim/README.md
test/mocks/datafilecollector-testharness/dr-sim/docker-compose.yml [new file with mode: 0644]
test/mocks/datafilecollector-testharness/ftps-sftp-server/README.md
test/mocks/datafilecollector-testharness/ftps-sftp-server/prepare.sh
test/mocks/datafilecollector-testharness/ftps-sftp-server/test_cases.yml
test/mocks/datafilecollector-testharness/mr-sim/Dockerfile [new file with mode: 0755]
test/mocks/datafilecollector-testharness/mr-sim/README.md
test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml [new file with mode: 0644]
test/mocks/datafilecollector-testharness/mr-sim/mr-sim.py
test/mocks/pnf-onboarding/unsecureAcmePnf.csar

diff --git a/test/mocks/datafilecollector-testharness/dr-sim/Dockerfile b/test/mocks/datafilecollector-testharness/dr-sim/Dockerfile
new file mode 100644 (file)
index 0000000..fc903d7
--- /dev/null
@@ -0,0 +1,18 @@
+#Common image for both dmmapDR and dmaapDR_redir
+
+FROM node:8
+
+WORKDIR /app
+
+COPY dmaapDR.js ./
+COPY dmaapDR_redir.js ./
+COPY package*.json ./
+COPY cert/ cert/
+
+RUN npm install express
+RUN npm install argparse
+
+EXPOSE 3906
+EXPOSE 3907
+EXPOSE 3908
+EXPOSE 3909
\ No newline at end of file
index 38ad1c5..f0cdf58 100644 (file)
@@ -1,3 +1,9 @@
+#Alternative to running python (as described below) on your machine, use the docker files.
+1. Build docker container with ```docker build -t drsim_common:latest .```
+2. Run the container ```docker-compose up```
+
+
+
 1. install nodejs
 2. install npm
 Make sure that you run these commands in the application directory "dr-sim"
diff --git a/test/mocks/datafilecollector-testharness/dr-sim/docker-compose.yml b/test/mocks/datafilecollector-testharness/dr-sim/docker-compose.yml
new file mode 100644 (file)
index 0000000..1ad4788
--- /dev/null
@@ -0,0 +1,17 @@
+version: '2'
+services:
+  drsim:
+    image: drsim_common:latest
+    ports:
+     - "3906:3906"
+     - "3907:3907"
+    container_name: drsim
+    command: node dmaapDR.js
+
+  drsim_redir:
+    image: drsim_common:latest
+    ports:
+     - "3908:3908"
+     - "3909:3909"
+    container_name: drsim_redir
+    command: node dmaapDR_redir.js    
\ No newline at end of file
index 5a16601..3bd6740 100644 (file)
@@ -15,6 +15,12 @@ Source: https://docs.docker.com/install/linux/linux-postinstall/
 
 then logout-login to activate it.
 
+###Prepare files for the simulator
+Run `prepare.sh` with an argument found in `test_cases.yml` (or add a new tc in that file) to create files (1MB, 5MB and 50MB files) and a large number of 
+symbolic links to these files to simulate PM files. The files names maches the files in
+the events produced by the MR simulator. The dirs with the files will be mounted
+by the ftp containers, defined in the docker-compse file, when started
+
 ###Starting/stopping the FTPS/SFTP server(s)
 
 Start: `docker-compose up`
index f1146a6..086d43a 100755 (executable)
@@ -37,7 +37,7 @@ then
 
                # Create symlinks
                N_SYMLINKS=${nf_array[$n]}-1
-               for ((l=1;l<=$N_SYMLINKS;l++))
+               for ((l=0;l<=$N_SYMLINKS;l++))
                do
                        SYMLINK_NAME=$FILE_SIZE"MB_"$l".tar.gz"
                        ln -s ./$FILE_NAME $DIRECTORY/$SYMLINK_NAME
index 8dba114..61275df 100644 (file)
@@ -9,3 +9,8 @@ TC2:
   size_files: 0.5 1 5
   number_files: 2 3 1
   directory_files: ftps ftps sftp
+
+TC_10000:
+  size_files: 1 1 5 5 50 50
+  number_files: 10000 10000 10000 10000 1 1
+  directory_files: ftps sftp ftps sftp ftps sftp
\ No newline at end of file
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/Dockerfile b/test/mocks/datafilecollector-testharness/mr-sim/Dockerfile
new file mode 100755 (executable)
index 0000000..5341bb0
--- /dev/null
@@ -0,0 +1,10 @@
+FROM python:3.6-alpine
+
+COPY . /app
+
+WORKDIR /app
+
+RUN pip install -r requirements.txt
+
+EXPOSE 2222
+
index b04b9ec..5746345 100644 (file)
@@ -1,3 +1,52 @@
+
+#Alternative to running python (as described below) on your machine, use the docker files.
+1. Build docker container with ```docker build -t mrsim:latest .```
+2. Run the container ```docker-compose up```
+The behavior can be changed by argument to the python script in the docker-compose.yml
+
+The simulator can be queried for statistics
+localhost:2222/ctr_requests   - return an integer of the number of get request to the event poll path
+localhost:2222/ctr_responses  - return an integer of the number of get responses to the event poll path
+localhost:2222/ctr_unique_files - returns an integer or the number of unique files. A unique file is the combination of node+file_sequence_number 
+
+
+##Common TC info
+File names for 1MB, 5MB and 50MB files
+Files in the format: <size-in-mb>MB_<sequence-number>.tar.gz    Ex. for 5MB file with sequence number 12:  5MB_12.tar.gz
+The sequence numbers are stepped so that all files have unique names
+Missing files (files that are not expected to be found in the ftp server. Format: MissingFile_<sequence-number>.tar.gz
+
+Limited event streams
+When the number of events are exhausted, empty replies are returned '[]'
+
+TC100 - One ME, SFTP, 1 1MB file, 1 event
+TC101 - One ME, SFTP, 1 5MB file, 1 event
+TC102 - One ME, SFTP, 1 50MB file, 1 event
+
+TC110 - One ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.
+TC111 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll.
+TC112 - One ME, SFTP, 5MB files, 100 files per event, 100 events, 1 event per poll.
+TC113 - One ME, SFTP, 1MB files, 100 files per event, 100 events. All events in one poll.
+
+
+TC120 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json
+TC121 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files
+TC122 - One ME, SFTP, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. 
+
+Endless event streams
+TC1000 - One ME, SFTP, 1MB files, 100 files per event, endless number of events, 1 event per poll
+TC1001 - One ME, SFTP, 5MB files, 100 files per event, endless number of events, 1 event per poll
+
+
+TC510 - 5 ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.
+
+
+TC200-TC202 same as TC100-TC102 but with FTPS
+TC210-TC213 same as TC110-TC113 but with FTPS
+TC2000-TC2001 same as TC1000-TC1001 but with FTPS
+TC610 same as TC510 but with FTPS
+
+
 ## Developer workflow
 
 1. ```sudo apt install python3-venv```
diff --git a/test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml b/test/mocks/datafilecollector-testharness/mr-sim/docker-compose.yml
new file mode 100644 (file)
index 0000000..7315e4b
--- /dev/null
@@ -0,0 +1,10 @@
+version: '2'
+
+services:
+  mrsim:
+    image: mrsim:latest
+    ports:
+     - "2222:2222"
+    container_name: mrsim
+    command: python mr-sim.py --tc100
+# Change -tc100 to other tc number for desired behavior.
\ No newline at end of file
index c37ae69..ef46535 100644 (file)
@@ -8,73 +8,432 @@ import json
 from flask import Flask
 app = Flask(__name__)
 
-DEFAULT_IP = "localhost"
+#Server info
+HOST_IP = "0.0.0.0"
+HOST_PORT = 2222
 
+#Test function to check server running
+@app.route('/',
+    methods=['GET'])
+def index():
+    return 'Hello world'
+
+#Returns number of polls
+@app.route('/ctr_requests',
+    methods=['GET'])
+def counter_requests():
+    global ctr_requests
+    return str(ctr_requests)
 
+#Returns number of replies
+@app.route('/ctr_responses',
+    methods=['GET'])
+def counter_responses():
+    global ctr_responses
+    return str(ctr_responses)
+
+#Returns number of unique files
+@app.route('/ctr_unique_files',
+    methods=['GET'])
+def counter_uniquefiles():
+    global fileMap
+    return str(len(fileMap))
+
+#Returns tc info
+@app.route('/tc_info',
+    methods=['GET'])
+def testcase_info():
+    global tc_num
+    return tc_num
+
+#Messages polling function
 @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("""
-        [{
+    global ctr_requests
+    global args
+
+    ctr_requests = ctr_requests + 1
+    print("MR: poll request#: " + str(ctr_requests))
+
+    if args.tc100:
+      return tc100("sftp")
+    elif args.tc101:
+      return tc101("sftp")
+    elif args.tc102:
+      return tc102("sftp")
+
+    elif args.tc110:
+      return tc110("sftp")
+    elif args.tc111:
+      return tc111("sftp")
+    elif args.tc112:
+      return tc112("sftp")
+    elif args.tc113:
+      return tc113("sftp")
+
+    elif args.tc120:
+      return tc120("sftp")
+    elif args.tc121:
+      return tc121("sftp")
+    elif args.tc122:
+      return tc122("sftp")
+
+    elif args.tc1000:
+      return tc1000("sftp")
+    elif args.tc1001:
+      return tc1001("sftp")
+
+    elif args.tc510:
+      return tc510("sftp")      
+
+
+    elif args.tc200:
+      return tc200("ftps")
+    elif args.tc201:
+      return tc201("ftps")
+    elif args.tc202:
+      return tc202("ftps")
+
+    elif args.tc210:
+      return tc210("ftps")
+    elif args.tc211:
+      return tc211("ftps")
+    elif args.tc212:
+      return tc212("ftps")
+    elif args.tc213:
+      return tc213("ftps")
+
+    elif args.tc220:
+      return tc220("ftps")
+    elif args.tc221:
+      return tc221("ftps")
+    elif args.tc222:
+      return tc222("ftps")
+
+    elif args.tc2000:
+      return tc2000("ftps")
+    elif args.tc2001:
+      return tc2001("ftps")
+
+    elif args.tc610:
+      return tc510("ftps")     
+
+
+#### Test case functions
+
+
+def tc100(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")
+
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+  return buildOkResponse("["+msg+"]")
+
+def tc101(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc102(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("50MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc110(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  seqNr = (ctr_responses-1)
+  msg = getEventHead() + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022) + getEventEnd()
+  fileMap[seqNr] = seqNr
+
+  return buildOkResponse("["+msg+"]")
+
+def tc111(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc112(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc113(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 1):
+    return buildOkResponse("[]")  
+  
+  msg = ""
+
+  for evts in range(100):  # build 100 evts
+    if (evts > 0):
+      msg = msg + ","
+    msg = msg + getEventHead()
+    for i in range(100):   # build 100 files
+      seqNr = i+evts+100*(ctr_responses-1)
+      if i != 0: msg = msg + ","
+      msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+      fileMap[seqNr] = seqNr
+
+    msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+
+def tc120(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+
+  if (ctr_responses % 10 == 2):
+    return  # Return nothing
+  
+  if (ctr_responses % 10 == 3):
+    return buildOkResponse("") # Return empty message
+
+  if (ctr_responses % 10 == 4):
+    return buildOkResponse(getEventHead()) # Return part of a json event
+
+  if (ctr_responses % 10 == 5):
+    return buildEmptyResponse(404) # Return empty message with status code
+
+  if (ctr_responses % 10 == 6):
+    sleep(60)
+
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc121(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if (seqNr%10 == 0):     # Every 10th file is "missing"
+      fn = "MissingFile_" + str(seqNr) + ".tar.gz"
+    else:
+      fn = "1MB_" + str(seqNr) + ".tar.gz"
+      fileMap[seqNr] = seqNr
+
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName(fn,ftptype,"onap","pano","localhost",1022)
+    
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc122(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 100):
+    return buildOkResponse("[]")  
+  
+  msg = getEventHead()
+
+  for i in range(100):
+    fn = "1MB_0.tar.gz"  # All files identical names
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName(fn,ftptype,"onap","pano","localhost",1022)
+
+  fileMap[0] = 0
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+
+def tc1000(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc1001(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  msg = getEventHead()
+
+  for i in range(100):
+    seqNr = i+(ctr_responses-1)
+    if i != 0: msg = msg + ","
+    msg = msg + getEventName("5MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    fileMap[seqNr] = seqNr
+
+  msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+def tc510(ftptype):
+  global ctr_responses
+  global ctr_unique_files
+
+  ctr_responses = ctr_responses + 1
+
+  if (ctr_responses > 5):
+    return buildOkResponse("[]")  
+
+  msg = ""
+
+  for evts in range(700):  # build events for 5 MEs
+    if (evts > 0):
+      msg = msg + ","
+    msg = msg + getEventHeadNodeName("PNF"+str(evts))
+    seqNr = (ctr_responses-1)
+    msg = msg + getEventName("1MB_" + str(seqNr) + ".tar.gz",ftptype,"onap","pano","localhost",1022)
+    seqNr = seqNr + evts*1000000 #Create unique id for this node and file
+    fileMap[seqNr] = seqNr
+    msg = msg + getEventEnd()
+
+  return buildOkResponse("["+msg+"]")
+
+#Mapping FTPS TCs
+def tc200(ftptype):
+  return tc100(ftptype)
+def tc201(ftptype):
+  return tc101(ftptype)
+def tc202(ftptype):
+  return tc102(ftptype)
+
+def tc210(ftptype):
+  return tc110(ftptype)
+def tc211(ftptype):
+  return tc111(ftptype)
+def tc212(ftptype):
+  return tc112(ftptype)
+def tc213(ftptype):
+  return tc113(ftptype)
+
+def tc220(ftptype):
+  return tc120(ftptype)
+def tc221(ftptype):
+  return tc121(ftptype)
+def tc222(ftptype):
+  return tc122(ftptype)
+
+def tc2000(ftptype):
+  return tc1000(ftptype)
+def tc2001(ftptype):
+  return tc1001(ftptype)
+
+#### Functions to build json messages and respones ####
+
+# Function to build fixed beginning of an event
+def getEventHead():
+  return getEventHeadNodeName("oteNB5309")
+
+def getEventHeadNodeName(nodename):
+  headStr = """
+        {
           "event": {
             "commonEventHeader": {
               "startEpochMicrosec": 8745745764578,
@@ -85,205 +444,267 @@ class Reply:
               },
               "priority": "Normal",
               "version": "4.0.1",
-              "reportingEntityName": "otenb5309",
+              "reportingEntityName": \"""" + nodename + """",
               "sequence": 0,
               "domain": "notification",
               "lastEpochMicrosec": 8745745764578,
               "eventName": "Noti_RnNode-Ericsson_FileReady",
               "vesEventListenerVersion": "7.0.1",
-              "sourceName": "oteNB5309"
+              "sourceName": \"""" + nodename + """"
             },
             "notificationFields": {
               "notificationFieldsVersion": "2.0",
               "changeType": "FileReady",
               "changeIdentifier": "PM_MEAS_FILES",
               "arrayOfNamedHashMap": [
-                {
-                  "name": \"""" +
-                                    self.file +
-                                    """",
+          """ 
+  return headStr
+
+# Function to build the variable part of an event
+def getEventName(fn,type,user,passwd,ip,port):
+    nameStr =        """{
+                  "name": \"""" + fn + """",
                   "hashMap": {
                     "fileFormatType": "org.3GPP.32.435#measCollec",
-                    "location": \"""" +
-                                    self.type +
-                                    """://""" +
-                                    self.user +
-                                    """:""" +
-                                    self.passwd +
-                                    """@""" +
-                                    self.ip +
-                                    """:""" +
-                                    str(self.port) +
-                                    """/""" +
-                                    self.file +
-                                    """",
+                    "location": \"""" + type + """://""" + user + """:""" + passwd + """@""" + ip + """:""" + str(port) + """/""" + fn + """",
                     "fileFormatVersion": "V10",
                     "compression": "gzip"
                   }
-                }
+                } """
+    return nameStr
+
+# Function to build fixed end of an event
+def getEventEnd():
+    endStr =  """
               ]
             }
           }
-        }]
-        """)
-
-
-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"]"
+        }
+        """
+    return endStr
+
+# Function to build an OK reponse from a message string
+def buildOkResponse(msg):
+  response = app.response_class(
+      response=str.encode(msg),
+      status=200,
+      mimetype='application/json')
+  return response
+
+# Function to build an empty message with status
+def buildEmptyResponse(status_code):
+  response = app.response_class(
+      response=str.encode(""),
+      status=status_code,
+      mimetype='application/json')
+  return response
 
 
-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")
+if __name__ == "__main__":
+  
+    #Counters
+    ctr_responses = 0
+    ctr_requests = 0
+    ctr_unique_files = 0
 
+    #Keeps all reponded file names
+    fileMap = {}
 
-def tc3():
-    prepareMrRespArrFtps()
+    tc_num = "Not set"
+    tc_help = "Not set"
 
+    parser = argparse.ArgumentParser()
 
-def tc4():
-    global mr_replies
+#SFTP TCs with single ME 
+    parser.add_argument(
+        '--tc100',
+        action='store_true',
+        help='TC100 - One ME, SFTP, 1 1MB file, 1 event')
+    parser.add_argument(
+        '--tc101',
+        action='store_true',
+        help='TC101 - One ME, SFTP, 1 5MB file, 1 event')
+    parser.add_argument(
+        '--tc102',
+        action='store_true',
+        help='TC102 - One ME, SFTP, 1 50MB file, 1 event')
 
-    for i in range(7):
-        mr_replies.append(
-            Reply(
-                port=21,
-                ip="localhost",
-                type="ftps",
-                file="1MB.tar.gz"))
+    parser.add_argument(
+        '--tc110',
+        action='store_true',
+        help='TC110 - One ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc111',
+        action='store_true',
+        help='TC111 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc112',
+        action='store_true',
+        help='TC112 - One ME, SFTP, 5MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc113',
+        action='store_true',
+        help='TC113 - One ME, SFTP, 1MB files, 100 files per event, 100 events. All events in one poll.')
 
-    # inserting and empty reply message
-    mr_replies[1].jsonreply = b""
-    mr_replies[2].jsonreply = b""
+    parser.add_argument(
+        '--tc120',
+        action='store_true',
+        help='TC120 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json')
+    parser.add_argument(
+        '--tc121',
+        action='store_true',
+        help='TC121 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
+    parser.add_argument(
+        '--tc122',
+        action='store_true',
+        help='TC122 - One ME, SFTP, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
 
-    # inserting a 404 error and delay
-    mr_replies[3].replytype = 2
-    mr_replies[3].sleepMs = 2000
+    parser.add_argument(
+        '--tc1000',
+        action='store_true',
+        help='TC1000 - One ME, SFTP, 1MB files, 100 files per event, endless number of events, 1 event per poll')
+    parser.add_argument(
+        '--tc1001',
+        action='store_true',
+        help='TC1001 - One ME, SFTP, 5MB files, 100 files per event, endless number of events, 1 event per poll')
 
-    # inserting and empty reply message
-    mr_replies[4].jsonreply = b""
+# SFTP TCs with multiple MEs
+    parser.add_argument(
+        '--tc510',
+        action='store_true',
+        help='TC510 - 5 MEs, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.')
 
-    # 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")
 
+# FTPS TCs with single ME
+    parser.add_argument(
+        '--tc200',
+        action='store_true',
+        help='TC200 - One ME, FTPS, 1 1MB file, 1 event')
+    parser.add_argument(
+        '--tc201',
+        action='store_true',
+        help='TC201 - One ME, FTPS, 1 5MB file, 1 event')
+    parser.add_argument(
+        '--tc202',
+        action='store_true',
+        help='TC202 - One ME, FTPS, 1 50MB file, 1 event')
 
-if __name__ == "__main__":
-    mr_replies = []
-    mr_counter = 0  # counting hits reaching MR instance
-    DR_block_single_req = 0
+    parser.add_argument(
+        '--tc210',
+        action='store_true',
+        help='TC210 - One ME, FTPS, 1MB files, 1 file per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc211',
+        action='store_true',
+        help='TC211 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc212',
+        action='store_true',
+        help='TC212 - One ME, FTPS, 5MB files, 100 files per event, 100 events, 1 event per poll.')
+    parser.add_argument(
+        '--tc213',
+        action='store_true',
+        help='TC213 - One ME, FTPS, 1MB files, 100 files per event, 100 events. All events in one poll.')
 
-    parser = argparse.ArgumentParser()
     parser.add_argument(
-        '--tc1',
+        '--tc220',
+        action='store_true',
+        help='TC220 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% of replies each: no response, empty message, slow response, 404-error, malformed json')
+    parser.add_argument(
+        '--tc221',
         action='store_true',
-        help='TC1: reply all queries with 1-1 files using SFTP')
+        help='TC221 - One ME, FTPS, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
     parser.add_argument(
-        '--tc2',
+        '--tc222',
         action='store_true',
-        help='TC2: Reply according to error scenarios, then return 1 file finally for SFTP ---NOTE: updated keys required')
+        help='TC222 - One ME, FTPS, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
+
     parser.add_argument(
-        '--tc3',
+        '--tc2000',
         action='store_true',
-        help='TC3: reply all queries with 1-1 files using FTPS')
+        help='TC2000 - One ME, FTPS, 1MB files, 100 files per event, endless number of events, 1 event per poll')
     parser.add_argument(
-        '--tc4',
+        '--tc2001',
         action='store_true',
-        help='TC4: Reply according to error scenarios, then return 1 file finally for FTPS ---NOTE: updated keys required')
+        help='TC2001 - One ME, FTPS, 5MB files, 100 files per event, endless number of events, 1 event per poll')    
+
+    parser.add_argument(
+        '--tc610',
+        action='store_true',
+        help='TC510 - 5 MEs, FTPS, 1MB files, 1 file per event, 100 events, 1 event per poll.')
 
     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()
+    
+
+    if args.tc100:
+        tc_num = "TC# 100"
+    elif args.tc101:
+        tc_num = "TC# 101"
+    elif args.tc102:
+        tc_num = "TC# 102"
+
+    elif args.tc110:
+        tc_num = "TC# 110"
+    elif args.tc111:
+        tc_num = "TC# 111"
+    elif args.tc112:
+        tc_num = "TC# 112"
+    elif args.tc113:
+        tc_num = "TC# 113"
+
+    elif args.tc120:
+        tc_num = "TC# 120"
+    elif args.tc121:
+        tc_num = "TC# 121"
+    elif args.tc122:
+        tc_num = "TC# 122"
+
+    elif args.tc1000:
+        tc_num = "TC# 1000"
+    elif args.tc1001:
+        tc_num = "TC# 1001"
+
+    elif args.tc510:
+        tc_num = "TC# 510"
+
+    elif args.tc200:
+        tc_num = "TC# 200"
+    elif args.tc201:
+        tc_num = "TC# 201"
+    elif args.tc202:
+        tc_num = "TC# 202"
+
+    elif args.tc210:
+        tc_num = "TC# 210"
+    elif args.tc211:
+        tc_num = "TC# 211"
+    elif args.tc212:
+        tc_num = "TC# 212"
+    elif args.tc213:
+        tc_num = "TC# 213"
+
+    elif args.tc220:
+        tc_num = "TC# 220"
+    elif args.tc221:
+        tc_num = "TC# 221"
+    elif args.tc222:
+        tc_num = "TC# 222"
+
+    elif args.tc2000:
+        tc_num = "TC# 2000"
+    elif args.tc2001:
+        tc_num = "TC# 2001"
+
+    elif args.tc610:
+        tc_num = "TC# 610"
 
     else:
         print("No TC was defined")
         print("use --help for usage info")
         sys.exit()
-    app.run(port=2222)
+
+    print(tc_num)
+    app.run(port=HOST_PORT, host=HOST_IP)
index 92ff8fc..37e4733 100644 (file)
Binary files a/test/mocks/pnf-onboarding/unsecureAcmePnf.csar and b/test/mocks/pnf-onboarding/unsecureAcmePnf.csar differ