Update tests for Datafile Collector (DCAE SDK update)
[integration.git] / test / mocks / datafilecollector-testharness / mr-sim / mr-sim.py
1 import argparse
2 import os
3 import sys
4 import time
5 from time import sleep
6
7 from flask import Flask
8
9 app = Flask(__name__)
10
11 # Server info
12 HOST_IP = "0.0.0.0"
13 HOST_PORT = 2222
14 HOST_PORT_TLS = 2223
15
16 sftp_hosts = []
17 sftp_ports = []
18 ftpes_hosts = []
19 ftpes_ports = []
20 num_ftp_servers = 1
21
22
23 def sumList(ctrArray):
24     tmp = 0
25     for i in range(len(ctrArray)):
26         tmp = tmp + ctrArray[i]
27
28     return str(tmp)
29
30
31 def sumListLength(ctrArray):
32     tmp = 0
33     for i in range(len(ctrArray)):
34         tmp = tmp + len(ctrArray[i])
35
36     return str(tmp)
37
38
39 # Test function to check server running
40 @app.route('/',
41            methods=['GET'])
42 def index():
43     return 'Hello world'
44
45
46 # Returns the list of configured groups
47 @app.route('/groups',
48            methods=['GET'])
49 def group_ids():
50     global configuredGroups
51     return configuredGroups
52
53
54 # Returns the list of configured changeids
55 @app.route('/changeids',
56            methods=['GET'])
57 def change_ids():
58     global configuredChangeIds
59     return configuredChangeIds
60
61
62 # Returns the list of configured fileprefixes
63 @app.route('/fileprefixes',
64            methods=['GET'])
65 def fileprefixes():
66     global configuredPrefixes
67     return configuredPrefixes
68
69
70 # Returns number of polls
71 @app.route('/ctr_requests',
72            methods=['GET'])
73 def counter_requests():
74     global ctr_requests
75     return sumList(ctr_requests)
76
77
78 # Returns number of polls for all groups
79 @app.route('/groups/ctr_requests',
80            methods=['GET'])
81 def group_counter_requests():
82     global ctr_requests
83     global groupNames
84     tmp = ''
85     for i in range(len(groupNames)):
86         if (i > 0):
87             tmp = tmp + ','
88         tmp = tmp + str(ctr_requests[i])
89     return tmp
90
91
92 # Returns the total number of polls for a group
93 @app.route('/ctr_requests/<groupId>',
94            methods=['GET'])
95 def counter_requests_group(groupId):
96     global ctr_requests
97     global groupNameIndexes
98     return str(ctr_requests[groupNameIndexes[groupId]])
99
100
101 # Returns number of poll replies
102 @app.route('/ctr_responses',
103            methods=['GET'])
104 def counter_responses():
105     global ctr_responses
106     return sumList(ctr_responses)
107
108
109 # Returns number of poll replies for all groups
110 @app.route('/groups/ctr_responses',
111            methods=['GET'])
112 def group_counter_responses():
113     global ctr_responses
114     global groupNames
115     tmp = ''
116     for i in range(len(groupNames)):
117         if (i > 0):
118             tmp = tmp + ','
119         tmp = tmp + str(ctr_responses[i])
120     return tmp
121
122
123 # Returns the total number of poll replies for a group
124 @app.route('/ctr_responses/<groupId>',
125            methods=['GET'])
126 def counter_responses_group(groupId):
127     global ctr_responses
128     global groupNameIndexes
129     return str(ctr_responses[groupNameIndexes[groupId]])
130
131
132 # Returns the total number of files
133 @app.route('/ctr_files',
134            methods=['GET'])
135 def counter_files():
136     global ctr_files
137     return sumList(ctr_files)
138
139
140 # Returns the total number of file for all groups
141 @app.route('/groups/ctr_files',
142            methods=['GET'])
143 def group_counter_files():
144     global ctr_files
145     global groupNames
146     tmp = ''
147     for i in range(len(groupNames)):
148         if (i > 0):
149             tmp = tmp + ','
150         tmp = tmp + str(ctr_files[i])
151     return tmp
152
153
154 # Returns the total number of files for a group
155 @app.route('/ctr_files/<groupId>',
156            methods=['GET'])
157 def counter_files_group(groupId):
158     global ctr_files
159     global groupNameIndexes
160     return str(ctr_files[groupNameIndexes[groupId]])
161
162
163 # Returns number of unique files
164 @app.route('/ctr_unique_files',
165            methods=['GET'])
166 def counter_uniquefiles():
167     global fileMap
168     return sumListLength(fileMap)
169
170
171 # Returns number of unique files for all groups
172 @app.route('/groups/ctr_unique_files',
173            methods=['GET'])
174 def group_counter_uniquefiles():
175     global fileMap
176     global groupNames
177     tmp = ''
178     for i in range(len(groupNames)):
179         if (i > 0):
180             tmp = tmp + ','
181         tmp = tmp + str(len(fileMap[i]))
182     return tmp
183
184
185 # Returns the total number of unique files for a group
186 @app.route('/ctr_unique_files/<groupId>',
187            methods=['GET'])
188 def counter_uniquefiles_group(groupId):
189     global fileMap
190     global groupNameIndexes
191     return str(len(fileMap[groupNameIndexes[groupId]]))
192
193
194 # Returns tc info
195 @app.route('/tc_info',
196            methods=['GET'])
197 def testcase_info():
198     global tc_num
199     return tc_num
200
201
202 # Returns number of events
203 @app.route('/ctr_events',
204            methods=['GET'])
205 def counter_events():
206     global ctr_events
207     return sumList(ctr_events)
208
209
210 # Returns number of events for all groups
211 @app.route('/groups/ctr_events',
212            methods=['GET'])
213 def group_counter_events():
214     global ctr_events
215     global groupNames
216     tmp = ''
217     for i in range(len(groupNames)):
218         if (i > 0):
219             tmp = tmp + ','
220         tmp = tmp + str(ctr_events[i])
221     return tmp
222
223
224 # Returns the total number of events for a group
225 @app.route('/ctr_events/<groupId>',
226            methods=['GET'])
227 def counter_events_group(groupId):
228     global ctr_events
229     global groupNameIndexes
230     return str(ctr_events[groupNameIndexes[groupId]])
231
232
233 # Returns execution time in mm:ss
234 @app.route('/execution_time',
235            methods=['GET'])
236 def exe_time():
237     global startTime
238
239     stopTime = time.time()
240     minutes, seconds = divmod(stopTime - startTime, 60)
241     return "{:0>2}:{:0>2}".format(int(minutes), int(seconds))
242
243
244 # Returns the timestamp for first poll
245 @app.route('/exe_time_first_poll',
246            methods=['GET'])
247 def exe_time_first_poll():
248     global firstPollTime
249
250     tmp = 0
251     for i in range(len(groupNames)):
252         if (firstPollTime[i] > tmp):
253             tmp = firstPollTime[i]
254
255     if (tmp == 0):
256         return "--:--"
257     minutes, seconds = divmod(time.time() - tmp, 60)
258     return "{:0>2}:{:0>2}".format(int(minutes), int(seconds))
259
260
261 # Returns the timestamp for first poll for all groups
262 @app.route('/groups/exe_time_first_poll',
263            methods=['GET'])
264 def group_exe_time_first_poll():
265     global firstPollTime
266     global groupNames
267
268     tmp = ''
269     for i in range(len(groupNames)):
270         if (i > 0):
271             tmp = tmp + ','
272         if (firstPollTime[i] == 0):
273             tmp = tmp + "--:--"
274         else:
275             minutes, seconds = divmod(time.time() - firstPollTime[i], 60)
276             tmp = tmp + "{:0>2}:{:0>2}".format(int(minutes), int(seconds))
277     return tmp
278
279
280 # Returns the timestamp for first poll for a group
281 @app.route('/exe_time_first_poll/<groupId>',
282            methods=['GET'])
283 def exe_time_first_poll_group(groupId):
284     global ctr_requests
285     global groupNameIndexes
286
287     if (firstPollTime[groupNameIndexes[groupId]] == 0):
288         return "--:--"
289     minutes, seconds = divmod(time.time() - firstPollTime[groupNameIndexes[groupId]], 60)
290     return "{:0>2}:{:0>2}".format(int(minutes), int(seconds))
291
292
293 # Starts event delivery
294 @app.route('/start',
295            methods=['GET'])
296 def start():
297     global runningState
298     runningState = "Started"
299     return runningState
300
301
302 # Stops event delivery
303 @app.route('/stop',
304            methods=['GET'])
305 def stop():
306     global runningState
307     runningState = "Stopped"
308     return runningState
309
310
311 # Returns the running state
312 @app.route('/status',
313            methods=['GET'])
314 def status():
315     global runningState
316     return runningState
317
318
319 # Returns number of unique PNFs
320 @app.route('/ctr_unique_PNFs',
321            methods=['GET'])
322 def counter_uniquePNFs():
323     global pnfMap
324     return sumListLength(pnfMap)
325
326
327 # Returns number of unique PNFs for all groups
328 @app.route('/groups/ctr_unique_PNFs',
329            methods=['GET'])
330 def group_counter_uniquePNFs():
331     global pnfMap
332     global groupNames
333     tmp = ''
334     for i in range(len(groupNames)):
335         if (i > 0):
336             tmp = tmp + ','
337         tmp = tmp + str(len(pnfMap[i]))
338     return tmp
339
340
341 # Returns the unique PNFs for a group
342 @app.route('/ctr_unique_PNFs/<groupId>',
343            methods=['GET'])
344 def counter_uniquePNFs_group(groupId):
345     global pnfMap
346     global groupNameIndexes
347     return str(len(pnfMap[groupNameIndexes[groupId]]))
348
349
350 # Messages polling function
351 @app.route(
352     "/events/unauthenticated.VES_NOTIFICATION_OUTPUT/<consumerGroup>/<consumerId>",
353     methods=['GET'])
354 def MR_reply(consumerGroup, consumerId):
355     global ctr_requests
356     global ctr_responses
357     global args
358     global runningState
359     global firstPollTime
360     global groupNameIndexes
361     global changeIds
362     global filePrefixes
363     print("Received request at /events/unauthenticated.VES_NOTIFICATION_OUTPUT/ for consumerGroup: " + consumerGroup +
364           " with consumerId: " + consumerId)
365
366     groupIndex = groupNameIndexes[consumerGroup]
367     print("Setting groupIndex: " + str(groupIndex))
368
369     reqCtr = ctr_requests[groupIndex]
370     changeId = changeIds[groupIndex][reqCtr % len(changeIds[groupIndex])]
371     print("Setting changeid: " + changeId)
372     filePrefix = filePrefixes[changeId]
373     print("Setting file name prefix: " + filePrefix)
374
375     if (firstPollTime[groupIndex] == 0):
376         firstPollTime[groupIndex] = time.time()
377
378     ctr_requests[groupIndex] = ctr_requests[groupIndex] + 1
379     print("MR: poll request#: " + str(ctr_requests[groupIndex]))
380
381     if (runningState == "Stopped"):
382         ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
383         return buildOkResponse("[]")
384
385     if args.tc100:
386         return tc100(groupIndex, changeId, filePrefix, "sftp", "1MB")
387     elif args.tc101:
388         return tc100(groupIndex, changeId, filePrefix, "sftp", "5MB")
389     elif args.tc102:
390         return tc100(groupIndex, changeId, filePrefix, "sftp", "50MB")
391
392     elif args.tc110:
393         return tc110(groupIndex, changeId, filePrefix, "sftp")
394     elif args.tc111:
395         return tc111(groupIndex, changeId, filePrefix, "sftp")
396     elif args.tc112:
397         return tc112(groupIndex, changeId, filePrefix, "sftp")
398     elif args.tc113:
399         return tc113(groupIndex, changeId, filePrefix, "sftp")
400
401     elif args.tc120:
402         return tc120(groupIndex, changeId, filePrefix, "sftp")
403     elif args.tc121:
404         return tc121(groupIndex, changeId, filePrefix, "sftp")
405     elif args.tc122:
406         return tc122(groupIndex, changeId, filePrefix, "sftp")
407
408     elif args.tc1000:
409         return tc1000(groupIndex, changeId, filePrefix, "sftp")
410     elif args.tc1001:
411         return tc1001(groupIndex, changeId, filePrefix, "sftp")
412
413     elif args.tc1100:
414         return tc1100(groupIndex, changeId, filePrefix, "sftp", "1MB")
415     elif args.tc1101:
416         return tc1100(groupIndex, changeId, filePrefix, "sftp", "50MB")
417     elif args.tc1102:
418         return tc1100(groupIndex, changeId, filePrefix, "sftp", "50MB")
419     elif args.tc1200:
420         return tc1200(groupIndex, changeId, filePrefix, "sftp", "1MB")
421     elif args.tc1201:
422         return tc1200(groupIndex, changeId, filePrefix, "sftp", "5MB")
423     elif args.tc1202:
424         return tc1200(groupIndex, changeId, filePrefix, "sftp", "50MB")
425     elif args.tc1300:
426         return tc1300(groupIndex, changeId, filePrefix, "sftp", "1MB")
427     elif args.tc1301:
428         return tc1300(groupIndex, changeId, filePrefix, "sftp", "5MB")
429     elif args.tc1302:
430         return tc1300(groupIndex, changeId, filePrefix, "sftp", "50MB")
431
432     elif args.tc1500:
433         return tc1500(groupIndex, changeId, filePrefix, "sftp", "1MB")
434
435     elif args.tc500:
436         return tc500(groupIndex, changeId, filePrefix, "sftp", "1MB")
437     elif args.tc501:
438         return tc500(groupIndex, changeId, filePrefix, "sftp", "5MB")
439     elif args.tc502:
440         return tc500(groupIndex, changeId, filePrefix, "sftp", "50MB")
441     elif args.tc510:
442         return tc510(groupIndex, changeId, filePrefix, "sftp", "1MB")
443     elif args.tc511:
444         return tc511(groupIndex, changeId, filePrefix, "sftp", "1KB")
445
446     elif args.tc550:
447         return tc510(groupIndex, changeId, filePrefix, "sftp", "50MB")
448
449     elif args.tc710:
450         return tc710(groupIndex, changeId, filePrefix, "sftp")
451
452
453     elif args.tc200:
454         return tc100(groupIndex, changeId, filePrefix, "ftpes", "1MB")
455     elif args.tc201:
456         return tc100(groupIndex, changeId, filePrefix, "ftpes", "5MB")
457     elif args.tc202:
458         return tc100(groupIndex, changeId, filePrefix, "ftpes", "50MB")
459
460     elif args.tc210:
461         return tc110(groupIndex, changeId, filePrefix, "ftpes")
462     elif args.tc211:
463         return tc111(groupIndex, changeId, filePrefix, "ftpes")
464     elif args.tc212:
465         return tc112(groupIndex, changeId, filePrefix, "ftpes")
466     elif args.tc213:
467         return tc113(groupIndex, changeId, filePrefix, "ftpes")
468
469     elif args.tc220:
470         return tc120(groupIndex, changeId, filePrefix, "ftpes")
471     elif args.tc221:
472         return tc121(groupIndex, changeId, filePrefix, "ftpes")
473     elif args.tc222:
474         return tc122(groupIndex, changeId, filePrefix, "ftpes")
475
476     elif args.tc2000:
477         return tc1000(groupIndex, changeId, filePrefix, "ftpes")
478     elif args.tc2001:
479         return tc1001(groupIndex, changeId, filePrefix, "ftpes")
480
481     elif args.tc2100:
482         return tc1100(groupIndex, changeId, filePrefix, "ftpes", "1MB")
483     elif args.tc2101:
484         return tc1100(groupIndex, changeId, filePrefix, "ftpes", "50MB")
485     elif args.tc2102:
486         return tc1100(groupIndex, changeId, filePrefix, "ftpes", "50MB")
487     elif args.tc2200:
488         return tc1200(groupIndex, changeId, filePrefix, "ftpes", "1MB")
489     elif args.tc2201:
490         return tc1200(groupIndex, changeId, filePrefix, "ftpes", "5MB")
491     elif args.tc2202:
492         return tc1200(groupIndex, changeId, filePrefix, "ftpes", "50MB")
493     elif args.tc2300:
494         return tc1300(groupIndex, changeId, filePrefix, "ftpes", "1MB")
495     elif args.tc2301:
496         return tc1300(groupIndex, changeId, filePrefix, "ftpes", "5MB")
497     elif args.tc2302:
498         return tc1300(groupIndex, changeId, filePrefix, "ftpes", "50MB")
499
500     elif args.tc2500:
501         return tc1500(groupIndex, changeId, filePrefix, "ftpes", "1MB")
502
503     elif args.tc600:
504         return tc500(groupIndex, changeId, filePrefix, "ftpes", "1MB")
505     elif args.tc601:
506         return tc500(groupIndex, changeId, filePrefix, "ftpes", "5MB")
507     elif args.tc602:
508         return tc500(groupIndex, changeId, filePrefix, "ftpes", "50MB")
509     elif args.tc610:
510         return tc510(groupIndex, changeId, filePrefix, "ftpes", "1MB")
511     elif args.tc611:
512         return tc511(groupIndex, changeId, filePrefix, "ftpes", "1KB")
513     elif args.tc650:
514         return tc510(groupIndex, changeId, filePrefix, "ftpes", "50MB")
515     elif args.tc810:
516         return tc710(groupIndex, changeId, filePrefix, "ftpes")
517
518
519 #### Test case functions
520
521
522 def tc100(groupIndex, changeId, filePrefix, ftpType, fileSize):
523     global ctr_responses
524     global ctr_events
525
526     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
527
528     if (ctr_responses[groupIndex] > 1):
529         return buildOkResponse("[]")
530
531     seqNr = (ctr_responses[groupIndex] - 1)
532     nodeIndex = 0
533     nodeName = createNodeName(nodeIndex)
534     fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, fileSize)
535     msg = getEventHead(groupIndex, changeId, nodeName) + getEventName(fileName, ftpType, "onap", "pano",
536                                                                       nodeIndex) + getEventEnd()
537     fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
538     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
539     return buildOkResponse("[" + msg + "]")
540
541
542 # def tc101(groupIndex, ftpType):
543 #  global ctr_responses
544 #  global ctr_events
545 #
546 #  ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
547 #
548 #  if (ctr_responses[groupIndex] > 1):
549 #    return buildOkResponse("[]")
550 #
551 #  seqNr = (ctr_responses[groupIndex]-1)
552 #  nodeName = createNodeName(0)
553 #  fileName = createFileName(groupIndex, nodeName, seqNr, "5MB")
554 #  msg = getEventHead(groupIndex, nodeName) + getEventName(fileName,ftpType,"onap","pano") + getEventEnd()
555 #  fileMap[groupIndex][seqNr] = seqNr
556 #  ctr_events[groupIndex] = ctr_events[groupIndex]+1
557 #  return buildOkResponse("["+msg+"]")
558 #
559 # def tc102(groupIndex, ftpType):
560 #  global ctr_responses
561 #  global ctr_events
562 #
563 #  ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
564 #
565 #  if (ctr_responses[groupIndex] > 1):
566 #    return buildOkResponse("[]")
567 #
568 #  seqNr = (ctr_responses[groupIndex]-1)
569 #  nodeName = createNodeName(0)
570 #  fileName = createFileName(groupIndex, nodeName, seqNr, "50MB")
571 #  msg = getEventHead(groupIndex, nodeName) + getEventName(fileName,ftpType,"onap","pano") + getEventEnd()
572 #  fileMap[groupIndex][seqNr] = seqNr
573 #  ctr_events[groupIndex] = ctr_events[groupIndex]+1
574 #  return buildOkResponse("["+msg+"]")
575
576 def tc110(groupIndex, changeId, filePrefix, ftpType):
577     global ctr_responses
578     global ctr_events
579
580     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
581
582     if (ctr_responses[groupIndex] > 100):
583         return buildOkResponse("[]")
584
585     seqNr = (ctr_responses[groupIndex] - 1)
586     nodeIndex = 0
587     nodeName = createNodeName(nodeIndex)
588     fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
589     msg = getEventHead(groupIndex, changeId, nodeName) + getEventName(fileName, ftpType, "onap", "pano",
590                                                                       nodeIndex) + getEventEnd()
591     fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
592     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
593     return buildOkResponse("[" + msg + "]")
594
595
596 def tc111(groupIndex, changeId, filePrefix, ftpType):
597     global ctr_responses
598     global ctr_events
599
600     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
601
602     if (ctr_responses[groupIndex] > 100):
603         return buildOkResponse("[]")
604
605     nodeIndex = 0
606     nodeName = createNodeName(nodeIndex)
607     msg = getEventHead(groupIndex, changeId, nodeName)
608
609     for i in range(100):
610         seqNr = i + (ctr_responses[groupIndex] - 1)
611         if i != 0: msg = msg + ","
612         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
613         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
614         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
615
616     msg = msg + getEventEnd()
617     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
618
619     return buildOkResponse("[" + msg + "]")
620
621
622 def tc112(groupIndex, changeId, filePrefix, ftpType):
623     global ctr_responses
624     global ctr_events
625
626     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
627
628     if (ctr_responses[groupIndex] > 100):
629         return buildOkResponse("[]")
630
631     nodeIndex = 0
632     nodeName = createNodeName(nodeIndex)
633     msg = getEventHead(groupIndex, changeId, nodeName)
634
635     for i in range(100):
636         seqNr = i + (ctr_responses[groupIndex] - 1)
637         if i != 0: msg = msg + ","
638         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "5MB")
639         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
640         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
641
642     msg = msg + getEventEnd()
643     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
644
645     return buildOkResponse("[" + msg + "]")
646
647
648 def tc113(groupIndex, changeId, filePrefix, ftpType):
649     global ctr_responses
650     global ctr_events
651
652     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
653
654     if (ctr_responses[groupIndex] > 1):
655         return buildOkResponse("[]")
656
657     nodeIndex = 0
658     nodeName = createNodeName(nodeIndex)
659     msg = ""
660
661     for evts in range(100):  # build 100 evts
662         if (evts > 0):
663             msg = msg + ","
664         msg = msg + getEventHead(groupIndex, changeId, nodeName)
665         for i in range(100):  # build 100 files
666             seqNr = i + evts + 100 * (ctr_responses[groupIndex] - 1)
667             if i != 0: msg = msg + ","
668             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
669             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
670             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
671
672         msg = msg + getEventEnd()
673         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
674
675     return buildOkResponse("[" + msg + "]")
676
677
678 def tc120(groupIndex, changeId, filePrefix, ftpType):
679     global ctr_responses
680     global ctr_events
681
682     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
683
684     nodeIndex = 0
685     nodeName = createNodeName(nodeIndex)
686
687     if (ctr_responses[groupIndex] > 100):
688         return buildOkResponse("[]")
689
690     if (ctr_responses[groupIndex] % 10 == 2):
691         return  # Return nothing
692
693     if (ctr_responses[groupIndex] % 10 == 3):
694         return buildOkResponse("")  # Return empty message
695
696     if (ctr_responses[groupIndex] % 10 == 4):
697         return buildOkResponse(getEventHead(groupIndex, changeId, nodeName))  # Return part of a json event
698
699     if (ctr_responses[groupIndex] % 10 == 5):
700         return buildEmptyResponse(404)  # Return empty message with status code
701
702     if (ctr_responses[groupIndex] % 10 == 6):
703         sleep(60)
704
705     msg = getEventHead(groupIndex, changeId, nodeName)
706
707     for i in range(100):
708         seqNr = i + (ctr_responses[groupIndex] - 1)
709         if i != 0: msg = msg + ","
710         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
711         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
712         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
713
714     msg = msg + getEventEnd()
715     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
716
717     return buildOkResponse("[" + msg + "]")
718
719
720 def tc121(groupIndex, changeId, filePrefix, ftpType):
721     global ctr_responses
722     global ctr_events
723
724     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
725
726     if (ctr_responses[groupIndex] > 100):
727         return buildOkResponse("[]")
728
729     nodeIndex = 0
730     nodeName = createNodeName(nodeIndex)
731     msg = getEventHead(groupIndex, changeId, nodeName)
732
733     fileName = ""
734     for i in range(100):
735         seqNr = i + (ctr_responses[groupIndex] - 1)
736         if (seqNr % 10 == 0):  # Every 10th file is "missing"
737             fileName = createMissingFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
738         else:
739             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
740             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
741
742         if i != 0: msg = msg + ","
743         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
744
745     msg = msg + getEventEnd()
746     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
747
748     return buildOkResponse("[" + msg + "]")
749
750
751 def tc122(groupIndex, changeId, filePrefix, ftpType):
752     global ctr_responses
753     global ctr_events
754
755     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
756
757     if (ctr_responses[groupIndex] > 100):
758         return buildOkResponse("[]")
759
760     nodeIndex = 0
761     nodeName = createNodeName(nodeIndex)
762     msg = getEventHead(groupIndex, changeId, nodeName)
763
764     for i in range(100):
765         fileName = createFileName(groupIndex, filePrefix, nodeName, 0, "1MB")  # All files identical names
766         if i != 0: msg = msg + ","
767         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
768
769     fileMap[groupIndex][0] = 0
770     msg = msg + getEventEnd()
771     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
772
773     return buildOkResponse("[" + msg + "]")
774
775
776 def tc1000(groupIndex, changeId, filePrefix, ftpType):
777     global ctr_responses
778     global ctr_events
779
780     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
781
782     nodeIndex = 0
783     nodeName = createNodeName(nodeIndex)
784     msg = getEventHead(groupIndex, changeId, nodeName)
785
786     for i in range(100):
787         seqNr = i + (ctr_responses[groupIndex] - 1)
788         if i != 0: msg = msg + ","
789         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
790         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
791         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
792
793     msg = msg + getEventEnd()
794     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
795
796     return buildOkResponse("[" + msg + "]")
797
798
799 def tc1001(groupIndex, changeId, filePrefix, ftpType):
800     global ctr_responses
801     global ctr_events
802
803     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
804
805     nodeIndex = 0
806     nodeName = createNodeName(nodeIndex)
807     msg = getEventHead(groupIndex, changeId, nodeName)
808
809     for i in range(100):
810         seqNr = i + (ctr_responses[groupIndex] - 1)
811         if i != 0: msg = msg + ","
812         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "5MB")
813         msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
814         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
815
816     msg = msg + getEventEnd()
817     ctr_events[groupIndex] = ctr_events[groupIndex] + 1
818
819     return buildOkResponse("[" + msg + "]")
820
821
822 def tc1100(groupIndex, changeId, filePrefix, ftpType, filesize):
823     global ctr_responses
824     global ctr_events
825
826     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
827
828     msg = ""
829
830     batch = (ctr_responses[groupIndex] - 1) % 20
831
832     for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
833         if (pnfs > 0):
834             msg = msg + ","
835         nodeIndex = pnfs + batch * 35
836         nodeName = createNodeName(nodeIndex)
837         msg = msg + getEventHead(groupIndex, changeId, nodeName)
838
839         for i in range(100):  # 100 files per event
840             seqNr = i + int((ctr_responses[groupIndex] - 1) / 20)
841             if i != 0: msg = msg + ","
842             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, filesize)
843             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
844             seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
845             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
846
847         msg = msg + getEventEnd()
848         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
849
850     return buildOkResponse("[" + msg + "]")
851
852
853 def tc1200(groupIndex, changeId, filePrefix, ftpType, filesize):
854     global ctr_responses
855     global ctr_events
856
857     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
858
859     msg = ""
860
861     batch = (ctr_responses[groupIndex] - 1) % 20
862
863     for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
864         if (pnfs > 0):
865             msg = msg + ","
866         nodeIndex = pnfs + batch * 35
867         nodeName = createNodeName(nodeIndex)
868         msg = msg + getEventHead(groupIndex, changeId, nodeName)
869
870         for i in range(100):  # 100 files per event, all new files
871             seqNr = i + 100 * int((ctr_responses[groupIndex] - 1) / 20)
872             if i != 0: msg = msg + ","
873             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, filesize)
874             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
875             seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
876             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
877
878         msg = msg + getEventEnd()
879         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
880
881     return buildOkResponse("[" + msg + "]")
882
883
884 def tc1300(groupIndex, changeId, filePrefix, ftpType, filesize):
885     global ctr_responses
886     global ctr_events
887     global rop_counter
888     global rop_timestamp
889
890     if (rop_counter == 0):
891         rop_timestamp = time.time()
892
893     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
894
895     # Start a  event deliver for all 700 nodes every 15min
896     rop = time.time() - rop_timestamp
897     if ((rop < 900) & (rop_counter % 20 == 0) & (rop_counter != 0)):
898         return buildOkResponse("[]")
899     else:
900         if (rop_counter % 20 == 0) & (rop_counter > 0):
901             rop_timestamp = rop_timestamp + 900
902
903         rop_counter = rop_counter + 1
904
905     msg = ""
906
907     batch = (rop_counter - 1) % 20
908
909     for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
910         if (pnfs > 0):
911             msg = msg + ","
912         nodeIndex = pnfs + batch * 35
913         nodeName = createNodeName(nodeIndex)
914         msg = msg + getEventHead(groupIndex, changeId, nodeName)
915
916         for i in range(100):  # 100 files per event
917             seqNr = i + int((rop_counter - 1) / 20)
918             if i != 0: msg = msg + ","
919             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, filesize)
920             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
921             seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
922             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
923
924         msg = msg + getEventEnd()
925         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
926
927     return buildOkResponse("[" + msg + "]")
928
929
930 def tc1500(groupIndex, changeId, filePrefix, ftpType, filesize):
931     global ctr_responses
932     global ctr_events
933     global rop_counter
934     global rop_timestamp
935
936     if (rop_counter == 0):
937         rop_timestamp = time.time()
938
939     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
940
941     if (ctr_responses[groupIndex] <= 2000):  # first 25h of event doess not care of 15min rop timer
942
943         msg = ""
944
945         batch = (ctr_responses[groupIndex] - 1) % 20
946
947         for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
948             if (pnfs > 0):
949                 msg = msg + ","
950
951             nodeIndex = pnfs + batch * 35
952             nodeName = createNodeName(nodeIndex)
953             msg = msg + getEventHead(groupIndex, changeId, nodeName)
954
955             for i in range(100):  # 100 files per event
956                 seqNr = i + int((ctr_responses[groupIndex] - 1) / 20)
957                 if i != 0: msg = msg + ","
958                 if (seqNr < 100):
959                     fileName = createMissingFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
960                 else:
961                     fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
962                     seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
963                     fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
964                 msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
965
966             msg = msg + getEventEnd()
967             ctr_events[groupIndex] = ctr_events[groupIndex] + 1
968
969             rop_counter = rop_counter + 1
970         return buildOkResponse("[" + msg + "]")
971
972     # Start an event delivery for all 700 nodes every 15min
973     rop = time.time() - rop_timestamp
974     if ((rop < 900) & (rop_counter % 20 == 0) & (rop_counter != 0)):
975         return buildOkResponse("[]")
976     else:
977         if (rop_counter % 20 == 0):
978             rop_timestamp = time.time()
979
980         rop_counter = rop_counter + 1
981
982     msg = ""
983
984     batch = (rop_counter - 1) % 20
985
986     for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
987         if (pnfs > 0):
988             msg = msg + ","
989         nodeIndex = pnfs + batch * 35
990         nodeName = createNodeName(nodeIndex)
991         msg = msg + getEventHead(groupIndex, changeId, nodeName)
992
993         for i in range(100):  # 100 files per event
994             seqNr = i + int((rop_counter - 1) / 20)
995             if i != 0: msg = msg + ","
996             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, filesize)
997             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
998             seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
999             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
1000
1001         msg = msg + getEventEnd()
1002         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
1003
1004     return buildOkResponse("[" + msg + "]")
1005
1006
1007 def tc500(groupIndex, changeId, filePrefix, ftpType, filesize):
1008     global ctr_responses
1009     global ctr_events
1010
1011     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
1012
1013     if (ctr_responses[groupIndex] > 1):
1014         return buildOkResponse("[]")
1015
1016     msg = ""
1017
1018     for pnfs in range(700):
1019         if (pnfs > 0):
1020             msg = msg + ","
1021         nodeName = createNodeName(pnfs)
1022         msg = msg + getEventHead(groupIndex, changeId, nodeName)
1023
1024         for i in range(2):
1025             seqNr = i
1026             if i != 0: msg = msg + ","
1027             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, filesize)
1028             msg = msg + getEventName(fileName, ftpType, "onap", "pano", pnfs)
1029             seqNr = seqNr + pnfs * 1000000  # Create unique id for this node and file
1030             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
1031
1032         msg = msg + getEventEnd()
1033         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
1034
1035     return buildOkResponse("[" + msg + "]")
1036
1037
1038 def tc510(groupIndex, changeId, filePrefix, ftpType, fileSize):
1039     global ctr_responses
1040     global ctr_events
1041
1042     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
1043
1044     if (ctr_responses[groupIndex] > 5):
1045         return buildOkResponse("[]")
1046
1047     msg = ""
1048
1049     for pnfs in range(700):  # build events for 700 MEs
1050         if (pnfs > 0):
1051             msg = msg + ","
1052         nodeName = createNodeName(pnfs)
1053         msg = msg + getEventHead(groupIndex, changeId, nodeName)
1054         seqNr = (ctr_responses[groupIndex] - 1)
1055         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, fileSize)
1056         msg = msg + getEventName(fileName, ftpType, "onap", "pano", pnfs)
1057         seqNr = seqNr + pnfs * 1000000  # Create unique id for this node and file
1058         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
1059         msg = msg + getEventEnd()
1060         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
1061
1062     return buildOkResponse("[" + msg + "]")
1063
1064
1065 def tc511(groupIndex, changeId, filePrefix, ftpType, fileSize):
1066     global ctr_responses
1067     global ctr_events
1068
1069     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
1070
1071     if (ctr_responses[groupIndex] > 5):
1072         return buildOkResponse("[]")
1073
1074     msg = ""
1075
1076     for pnfs in range(700):  # build events for 700 MEs
1077         if (pnfs > 0):
1078             msg = msg + ","
1079         nodeName = createNodeName(pnfs)
1080         msg = msg + getEventHead(groupIndex, changeId, nodeName)
1081         seqNr = (ctr_responses[groupIndex] - 1)
1082         fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, fileSize)
1083         msg = msg + getEventName(fileName, ftpType, "onap", "pano", pnfs)
1084         seqNr = seqNr + pnfs * 1000000  # Create unique id for this node and file
1085         fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
1086         msg = msg + getEventEnd()
1087         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
1088
1089     return buildOkResponse("[" + msg + "]")
1090
1091
1092 def tc710(groupIndex, changeId, filePrefix, ftpType):
1093     global ctr_responses
1094     global ctr_events
1095
1096     ctr_responses[groupIndex] = ctr_responses[groupIndex] + 1
1097
1098     if (ctr_responses[groupIndex] > 100):
1099         return buildOkResponse("[]")
1100
1101     msg = ""
1102
1103     batch = (ctr_responses[groupIndex] - 1) % 20
1104
1105     for pnfs in range(35):  # build events for 35 PNFs at a time. 20 batches -> 700
1106         if (pnfs > 0):
1107             msg = msg + ","
1108         nodeIndex = pnfs + batch * 35
1109         nodeName = createNodeName(nodeIndex)
1110         msg = msg + getEventHead(groupIndex, changeId, nodeName)
1111
1112         for i in range(100):  # 100 files per event
1113             seqNr = i + int((ctr_responses[groupIndex] - 1) / 20)
1114             if i != 0: msg = msg + ","
1115             fileName = createFileName(groupIndex, filePrefix, nodeName, seqNr, "1MB")
1116             msg = msg + getEventName(fileName, ftpType, "onap", "pano", nodeIndex)
1117             seqNr = seqNr + (pnfs + batch * 35) * 1000000  # Create unique id for this node and file
1118             fileMap[groupIndex][seqNr * hash(filePrefix)] = seqNr
1119
1120         msg = msg + getEventEnd()
1121         ctr_events[groupIndex] = ctr_events[groupIndex] + 1
1122
1123     return buildOkResponse("[" + msg + "]")
1124
1125
1126 #### Functions to build json messages and respones ####
1127
1128 def createNodeName(index):
1129     return "PNF" + str(index)
1130
1131
1132 def createFileName(groupIndex, filePrefix, nodeName, index, size):
1133     global ctr_files
1134     ctr_files[groupIndex] = ctr_files[groupIndex] + 1
1135     return filePrefix + "20000626.2315+0200-2330+0200_" + nodeName + "-" + str(index) + "-" + size + ".tar.gz"
1136
1137
1138 def createMissingFileName(groupIndex, filePrefix, nodeName, index, size):
1139     global ctr_files
1140     ctr_files[groupIndex] = ctr_files[groupIndex] + 1
1141     return filePrefix + "MissingFile_" + nodeName + "-" + str(index) + "-" + size + ".tar.gz"
1142
1143
1144 # Function to build fixed beginning of an event
1145
1146 def getEventHead(groupIndex, changeId, nodename):
1147     global pnfMap
1148     pnfMap[groupIndex].add(nodename)
1149     headStr = """
1150         '{
1151           "event": {
1152             "commonEventHeader": {
1153               "startEpochMicrosec": 8745745764578,
1154               "eventId": "FileReady_1797490e-10ae-4d48-9ea7-3d7d790b25e1",
1155               "timeZoneOffset": "UTC+05.30",
1156               "internalHeaderFields": {
1157                 "collectorTimeStamp": "Tue, 09 18 2018 10:56:52 UTC"
1158               },
1159               "priority": "Normal",
1160               "version": "4.0.1",
1161               "reportingEntityName": \"""" + nodename + """",
1162               "sequence": 0,
1163               "domain": "notification",
1164               "lastEpochMicrosec": 8745745764578,
1165               "eventName": "Noti_RnNode-Ericsson_FileReady",
1166               "vesEventListenerVersion": "7.0.1",
1167               "sourceName": \"""" + nodename + """"
1168             },
1169             "notificationFields": {
1170               "notificationFieldsVersion": "2.0",
1171               "changeType": "FileReady",
1172               "changeIdentifier": \"""" + changeId + """",
1173               "arrayOfNamedHashMap": [
1174           """
1175     return headStr
1176
1177
1178 # Function to build the variable part of an event
1179 def getEventName(fn, type, user, passwd, nodeIndex):
1180     nodeIndex = nodeIndex % num_ftp_servers
1181     port = sftp_ports[nodeIndex]
1182     ip = sftp_hosts[nodeIndex]
1183     if (type == "ftpes"):
1184         port = ftpes_ports[nodeIndex]
1185         ip = ftpes_hosts[nodeIndex]
1186
1187     nameStr = """{
1188                   "name": \"""" + fn + """",
1189                   "hashMap": {
1190                     "fileFormatType": "org.3GPP.32.435#measCollec",
1191                     "location": \"""" + type + """://""" + user + """:""" + passwd + """@""" + ip + """:""" + str(
1192         port) + """/""" + fn + """",
1193                     "fileFormatVersion": "V10",
1194                     "compression": "gzip"
1195                   }
1196                 } """
1197     return nameStr
1198
1199
1200 # Function to build fixed end of an event
1201 def getEventEnd():
1202     endStr = """
1203               ]
1204             }
1205           }
1206         }'
1207         """
1208     return endStr
1209
1210
1211 # Function to build an OK reponse from a message string
1212 def buildOkResponse(msg):
1213     response = app.response_class(
1214         response=str.encode(msg),
1215         status=200,
1216         mimetype='application/json')
1217     return response
1218
1219
1220 # Function to build an empty message with status
1221 def buildEmptyResponse(status_code):
1222     response = app.response_class(
1223         response=str.encode(""),
1224         status=status_code,
1225         mimetype='application/json')
1226     return response
1227
1228
1229 if __name__ == "__main__":
1230
1231     # IP addresses to use for ftp servers, using localhost if not env var is set
1232     sftp_sims = os.environ.get('SFTP_SIMS', 'localhost:1022')
1233     ftpes_sims = os.environ.get('FTPES_SIMS', 'localhost:21')
1234     num_ftp_servers = int(os.environ.get('NUM_FTP_SERVERS', 1))
1235
1236     print("Configured sftp sims: " + sftp_sims)
1237     print("Configured ftpes sims: " + ftpes_sims)
1238     print("Configured number of ftp servers: " + str(num_ftp_servers))
1239
1240     tmp = sftp_sims.split(',')
1241     for i in range(len(tmp)):
1242         hp = tmp[i].split(':')
1243         sftp_hosts.append(hp[0])
1244         sftp_ports.append(hp[1])
1245
1246     tmp = ftpes_sims.split(',')
1247     for i in range(len(tmp)):
1248         hp = tmp[i].split(':')
1249         ftpes_hosts.append(hp[0])
1250         ftpes_ports.append(hp[1])
1251
1252     groups = os.environ.get('MR_GROUPS', 'OpenDcae-c12:PM_MEAS_FILES')
1253     print("Groups detected: " + groups)
1254     configuredPrefixes = os.environ.get('MR_FILE_PREFIX_MAPPING', 'PM_MEAS_FILES:A')
1255
1256     if not groups:
1257         groups = 'OpenDcae-c12:PM_MEAS_FILES'
1258         print("Using default group: " + groups)
1259     else:
1260         print("Configured groups: " + groups)
1261
1262     if not configuredPrefixes:
1263         configuredPrefixes = 'PM_MEAS_FILES:A'
1264         print("Using default changeid to file prefix mapping: " + configuredPrefixes)
1265     else:
1266         print("Configured changeid to file prefix mapping: " + configuredPrefixes)
1267
1268     # Counters
1269     ctr_responses = []
1270     ctr_requests = []
1271     ctr_files = []
1272     ctr_events = []
1273     startTime = time.time()
1274     firstPollTime = []
1275     runningState = "Started"
1276     # Keeps all responded file names
1277     fileMap = []
1278     # Keeps all responded PNF names
1279     pnfMap = []
1280     # Handles rop periods for tests that deliveres events every 15 min
1281     rop_counter = 0
1282     rop_timestamp = time.time()
1283
1284     # List of configured group names
1285     groupNames = []
1286     # Mapping between group name and index in groupNames
1287     groupNameIndexes = {}
1288     # String of configured groups
1289     configuredGroups = ""
1290     # String of configured change identifiers
1291     configuredChangeIds = ""
1292     # List of changed identifiers
1293     changeIds = []
1294     # List of filePrefixes
1295     filePrefixes = {}
1296
1297     tmp = groups.split(',')
1298     for i in range(len(tmp)):
1299         g = tmp[i].split(':')
1300         for j in range(len(g)):
1301             g[j] = g[j].strip()
1302             if (j == 0):
1303                 if configuredGroups:
1304                     configuredGroups = configuredGroups + ","
1305                 configuredGroups = configuredGroups + g[0]
1306                 groupNames.append(g[0])
1307                 groupNameIndexes[g[0]] = i
1308                 changeIds.append({})
1309                 ctr_responses.append(0)
1310                 ctr_requests.append(0)
1311                 ctr_files.append(0)
1312                 ctr_events.append(0)
1313                 firstPollTime.append(0)
1314                 pnfMap.append(set())
1315                 fileMap.append({})
1316                 if configuredGroups:
1317                     configuredChangeIds = configuredChangeIds + ","
1318             else:
1319                 changeIds[i][j - 1] = g[j]
1320                 if (j > 1):
1321                     configuredChangeIds = configuredChangeIds + ":"
1322                 configuredChangeIds = configuredChangeIds + g[j]
1323
1324     # Create a map between changeid and file name prefix
1325     tmp = configuredPrefixes.split(',')
1326     for i in range(len(tmp)):
1327         p = tmp[i].split(':')
1328         filePrefixes[p[0]] = p[1]
1329
1330     tc_num = "Not set"
1331     tc_help = "Not set"
1332
1333     parser = argparse.ArgumentParser()
1334
1335     # SFTP TCs with single ME
1336     parser.add_argument(
1337         '--tc100',
1338         action='store_true',
1339         help='TC100 - One ME, SFTP, 1 1MB file, 1 event')
1340     parser.add_argument(
1341         '--tc101',
1342         action='store_true',
1343         help='TC101 - One ME, SFTP, 1 5MB file, 1 event')
1344     parser.add_argument(
1345         '--tc102',
1346         action='store_true',
1347         help='TC102 - One ME, SFTP, 1 50MB file, 1 event')
1348
1349     parser.add_argument(
1350         '--tc110',
1351         action='store_true',
1352         help='TC110 - One ME, SFTP, 1MB files, 1 file per event, 100 events, 1 event per poll.')
1353     parser.add_argument(
1354         '--tc111',
1355         action='store_true',
1356         help='TC111 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll.')
1357     parser.add_argument(
1358         '--tc112',
1359         action='store_true',
1360         help='TC112 - One ME, SFTP, 5MB files, 100 files per event, 100 events, 1 event per poll.')
1361     parser.add_argument(
1362         '--tc113',
1363         action='store_true',
1364         help='TC113 - One ME, SFTP, 1MB files, 100 files per event, 100 events. All events in one poll.')
1365
1366     parser.add_argument(
1367         '--tc120',
1368         action='store_true',
1369         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')
1370     parser.add_argument(
1371         '--tc121',
1372         action='store_true',
1373         help='TC121 - One ME, SFTP, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
1374     parser.add_argument(
1375         '--tc122',
1376         action='store_true',
1377         help='TC122 - One ME, SFTP, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
1378
1379     parser.add_argument(
1380         '--tc1000',
1381         action='store_true',
1382         help='TC1000 - One ME, SFTP, 1MB files, 100 files per event, endless number of events, 1 event per poll')
1383     parser.add_argument(
1384         '--tc1001',
1385         action='store_true',
1386         help='TC1001 - One ME, SFTP, 5MB files, 100 files per event, endless number of events, 1 event per poll')
1387
1388     # SFTP TCs with multiple MEs
1389     parser.add_argument(
1390         '--tc500',
1391         action='store_true',
1392         help='TC500 - 700 MEs, SFTP, 1MB files, 2 new files per event, 700 events, all event in one poll.')
1393
1394     parser.add_argument(
1395         '--tc501',
1396         action='store_true',
1397         help='TC501 - 700 MEs, SFTP, 5MB files, 2 new files per event, 700 events, all event in one poll.')
1398
1399     parser.add_argument(
1400         '--tc502',
1401         action='store_true',
1402         help='TC502 - 700 MEs, SFTP, 50MB files, 2 new files per event, 700 events, all event in one poll.')
1403
1404     parser.add_argument(
1405         '--tc510',
1406         action='store_true',
1407         help='TC510 - 700 MEs, SFTP, 1MB files, 1 file per event, 3500 events, 700 event per poll.')
1408
1409     parser.add_argument(
1410         '--tc511',
1411         action='store_true',
1412         help='TC511 - 700 MEs, SFTP, 1KB files, 1 file per event, 3500 events, 700 event per poll.')
1413
1414     parser.add_argument(
1415         '--tc550',
1416         action='store_true',
1417         help='TC550 - 700 MEs, SFTP, 50MB files, 1 file per event, 3500 events, 700 event per poll.')
1418
1419     parser.add_argument(
1420         '--tc710',
1421         action='store_true',
1422         help='TC710 - 700 MEs, SFTP, 1MB files, 100 files per event, 3500 events, 35 event per poll.')
1423
1424     parser.add_argument(
1425         '--tc1100',
1426         action='store_true',
1427         help='TC1100 - 700 ME, SFTP, 1MB files, 100 files per event, endless number of events, 35 event per poll')
1428     parser.add_argument(
1429         '--tc1101',
1430         action='store_true',
1431         help='TC1101 - 700 ME, SFTP, 5MB files, 100 files per event, endless number of events, 35 event per poll')
1432     parser.add_argument(
1433         '--tc1102',
1434         action='store_true',
1435         help='TC1102 - 700 ME, SFTP, 50MB files, 100 files per event, endless number of events, 35 event per poll')
1436
1437     parser.add_argument(
1438         '--tc1200',
1439         action='store_true',
1440         help='TC1200 - 700 ME, SFTP, 1MB files, 100 new files per event, endless number of events, 35 event per poll')
1441     parser.add_argument(
1442         '--tc1201',
1443         action='store_true',
1444         help='TC1201 - 700 ME, SFTP, 5MB files, 100 new files per event, endless number of events, 35 event per poll')
1445     parser.add_argument(
1446         '--tc1202',
1447         action='store_true',
1448         help='TC1202 - 700 ME, SFTP, 50MB files, 100 new files per event, endless number of events, 35 event per poll')
1449
1450     parser.add_argument(
1451         '--tc1300',
1452         action='store_true',
1453         help='TC1300 - 700 ME, SFTP, 1MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1454     parser.add_argument(
1455         '--tc1301',
1456         action='store_true',
1457         help='TC1301 - 700 ME, SFTP, 5MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1458     parser.add_argument(
1459         '--tc1302',
1460         action='store_true',
1461         help='TC1302 - 700 ME, SFTP, 50MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1462
1463     parser.add_argument(
1464         '--tc1500',
1465         action='store_true',
1466         help='TC1500 - 700 ME, SFTP, 1MB files, 100 files per event, 35 events per poll, simulating 25h backlog of decreasing number of outdated files and then 20 event polls every 15min for 1h')
1467
1468     # FTPES TCs with single ME
1469     parser.add_argument(
1470         '--tc200',
1471         action='store_true',
1472         help='TC200 - One ME, FTPES, 1 1MB file, 1 event')
1473     parser.add_argument(
1474         '--tc201',
1475         action='store_true',
1476         help='TC201 - One ME, FTPES, 1 5MB file, 1 event')
1477     parser.add_argument(
1478         '--tc202',
1479         action='store_true',
1480         help='TC202 - One ME, FTPES, 1 50MB file, 1 event')
1481
1482     parser.add_argument(
1483         '--tc210',
1484         action='store_true',
1485         help='TC210 - One ME, FTPES, 1MB files, 1 file per event, 100 events, 1 event per poll.')
1486     parser.add_argument(
1487         '--tc211',
1488         action='store_true',
1489         help='TC211 - One ME, FTPES, 1MB files, 100 files per event, 100 events, 1 event per poll.')
1490     parser.add_argument(
1491         '--tc212',
1492         action='store_true',
1493         help='TC212 - One ME, FTPES, 5MB files, 100 files per event, 100 events, 1 event per poll.')
1494     parser.add_argument(
1495         '--tc213',
1496         action='store_true',
1497         help='TC213 - One ME, FTPES, 1MB files, 100 files per event, 100 events. All events in one poll.')
1498
1499     parser.add_argument(
1500         '--tc220',
1501         action='store_true',
1502         help='TC220 - One ME, FTPES, 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')
1503     parser.add_argument(
1504         '--tc221',
1505         action='store_true',
1506         help='TC221 - One ME, FTPES, 1MB files, 100 files per event, 100 events, 1 event per poll. 10% missing files')
1507     parser.add_argument(
1508         '--tc222',
1509         action='store_true',
1510         help='TC222 - One ME, FTPES, 1MB files, 100 files per event, 100 events. 1 event per poll. All files with identical name. ')
1511
1512     parser.add_argument(
1513         '--tc2000',
1514         action='store_true',
1515         help='TC2000 - One ME, FTPES, 1MB files, 100 files per event, endless number of events, 1 event per poll')
1516     parser.add_argument(
1517         '--tc2001',
1518         action='store_true',
1519         help='TC2001 - One ME, FTPES, 5MB files, 100 files per event, endless number of events, 1 event per poll')
1520
1521     parser.add_argument(
1522         '--tc2100',
1523         action='store_true',
1524         help='TC2100 - 700 ME, FTPES, 1MB files, 100 files per event, endless number of events, 35 event per poll')
1525     parser.add_argument(
1526         '--tc2101',
1527         action='store_true',
1528         help='TC2101 - 700 ME, FTPES, 5MB files, 100 files per event, endless number of events, 35 event per poll')
1529     parser.add_argument(
1530         '--tc2102',
1531         action='store_true',
1532         help='TC2102 - 700 ME, FTPES, 50MB files, 100 files per event, endless number of events, 35 event per poll')
1533
1534     parser.add_argument(
1535         '--tc2200',
1536         action='store_true',
1537         help='TC2200 - 700 ME, FTPES, 1MB files, 100 new files per event, endless number of events, 35 event per poll')
1538     parser.add_argument(
1539         '--tc2201',
1540         action='store_true',
1541         help='TC2201 - 700 ME, FTPES, 5MB files, 100 new files per event, endless number of events, 35 event per poll')
1542     parser.add_argument(
1543         '--tc2202',
1544         action='store_true',
1545         help='TC2202 - 700 ME, FTPES, 50MB files, 100 new files per event, endless number of events, 35 event per poll')
1546
1547     parser.add_argument(
1548         '--tc2300',
1549         action='store_true',
1550         help='TC2300 - 700 ME, FTPES, 1MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1551     parser.add_argument(
1552         '--tc2301',
1553         action='store_true',
1554         help='TC2301 - 700 ME, FTPES, 5MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1555     parser.add_argument(
1556         '--tc2302',
1557         action='store_true',
1558         help='TC2302 - 700 ME, FTPES, 50MB files, 100 files per event, endless number of events, 35 event per poll, 20 event polls every 15min')
1559
1560     parser.add_argument(
1561         '--tc2500',
1562         action='store_true',
1563         help='TC2500 - 700 ME, FTPES, 1MB files, 100 files per event, 35 events per poll, simulating 25h backlog of decreasing number of outdated files and then 20 event polls every 15min for 1h')
1564
1565     parser.add_argument(
1566         '--tc600',
1567         action='store_true',
1568         help='TC600 - 700 MEs, FTPES, 1MB files, 2 new files per event, 700 events, all event in one poll.')
1569
1570     parser.add_argument(
1571         '--tc601',
1572         action='store_true',
1573         help='TC601 - 700 MEs, FTPES, 5MB files, 2 new files per event, 700 events, all event in one poll.')
1574
1575     parser.add_argument(
1576         '--tc602',
1577         action='store_true',
1578         help='TC602 - 700 MEs, FTPES, 50MB files, 2 new files per event, 700 events, all event in one poll.')
1579
1580     parser.add_argument(
1581         '--tc610',
1582         action='store_true',
1583         help='TC610 - 700 MEs, FTPES, 1MB files, 1 file per event, 3500 events, 700 event per poll.')
1584
1585     parser.add_argument(
1586         '--tc611',
1587         action='store_true',
1588         help='TC611 - 700 MEs, FTPES, 1KB files, 1 file per event, 3500 events, 700 event per poll.')
1589
1590     parser.add_argument(
1591         '--tc650',
1592         action='store_true',
1593         help='TC610 - 700 MEs, FTPES, 50MB files, 1 file per event, 3500 events, 700 event per poll.')
1594
1595     parser.add_argument(
1596         '--tc810',
1597         action='store_true',
1598         help='TC810 - 700 MEs, FTPES, 1MB files, 100 files per event, 3500 events, 35 event per poll.')
1599
1600     args = parser.parse_args()
1601
1602     if args.tc100:
1603         tc_num = "TC# 100"
1604     elif args.tc101:
1605         tc_num = "TC# 101"
1606     elif args.tc102:
1607         tc_num = "TC# 102"
1608
1609     elif args.tc110:
1610         tc_num = "TC# 110"
1611     elif args.tc111:
1612         tc_num = "TC# 111"
1613     elif args.tc112:
1614         tc_num = "TC# 112"
1615     elif args.tc113:
1616         tc_num = "TC# 113"
1617
1618     elif args.tc120:
1619         tc_num = "TC# 120"
1620     elif args.tc121:
1621         tc_num = "TC# 121"
1622     elif args.tc122:
1623         tc_num = "TC# 122"
1624
1625     elif args.tc1000:
1626         tc_num = "TC# 1000"
1627     elif args.tc1001:
1628         tc_num = "TC# 1001"
1629
1630     elif args.tc1100:
1631         tc_num = "TC# 1100"
1632     elif args.tc1101:
1633         tc_num = "TC# 1101"
1634     elif args.tc1102:
1635         tc_num = "TC# 1102"
1636     elif args.tc1200:
1637         tc_num = "TC# 1200"
1638     elif args.tc1201:
1639         tc_num = "TC# 1201"
1640     elif args.tc1202:
1641         tc_num = "TC# 1202"
1642     elif args.tc1300:
1643         tc_num = "TC# 1300"
1644     elif args.tc1301:
1645         tc_num = "TC# 1301"
1646     elif args.tc1302:
1647         tc_num = "TC# 1302"
1648
1649     elif args.tc1500:
1650         tc_num = "TC# 1500"
1651
1652     elif args.tc500:
1653         tc_num = "TC# 500"
1654     elif args.tc501:
1655         tc_num = "TC# 501"
1656     elif args.tc502:
1657         tc_num = "TC# 502"
1658     elif args.tc510:
1659         tc_num = "TC# 510"
1660     elif args.tc511:
1661         tc_num = "TC# 511"
1662
1663     elif args.tc550:
1664         tc_num = "TC# 550"
1665
1666     elif args.tc710:
1667         tc_num = "TC# 710"
1668
1669     elif args.tc200:
1670         tc_num = "TC# 200"
1671     elif args.tc201:
1672         tc_num = "TC# 201"
1673     elif args.tc202:
1674         tc_num = "TC# 202"
1675
1676     elif args.tc210:
1677         tc_num = "TC# 210"
1678     elif args.tc211:
1679         tc_num = "TC# 211"
1680     elif args.tc212:
1681         tc_num = "TC# 212"
1682     elif args.tc213:
1683         tc_num = "TC# 213"
1684
1685     elif args.tc220:
1686         tc_num = "TC# 220"
1687     elif args.tc221:
1688         tc_num = "TC# 221"
1689     elif args.tc222:
1690         tc_num = "TC# 222"
1691
1692     elif args.tc2000:
1693         tc_num = "TC# 2000"
1694     elif args.tc2001:
1695         tc_num = "TC# 2001"
1696
1697     elif args.tc2100:
1698         tc_num = "TC# 2100"
1699     elif args.tc2101:
1700         tc_num = "TC# 2101"
1701     elif args.tc2102:
1702         tc_num = "TC# 2102"
1703     elif args.tc2200:
1704         tc_num = "TC# 2200"
1705     elif args.tc2201:
1706         tc_num = "TC# 2201"
1707     elif args.tc2202:
1708         tc_num = "TC# 2202"
1709     elif args.tc2300:
1710         tc_num = "TC# 2300"
1711     elif args.tc2301:
1712         tc_num = "TC# 2301"
1713     elif args.tc2302:
1714         tc_num = "TC# 2302"
1715
1716     elif args.tc2500:
1717         tc_num = "TC# 2500"
1718
1719     elif args.tc600:
1720         tc_num = "TC# 600"
1721     elif args.tc601:
1722         tc_num = "TC# 601"
1723     elif args.tc602:
1724         tc_num = "TC# 602"
1725     elif args.tc610:
1726         tc_num = "TC# 610"
1727     elif args.tc611:
1728         tc_num = "TC# 611"
1729     elif args.tc650:
1730         tc_num = "TC# 650"
1731     elif args.tc810:
1732         tc_num = "TC# 810"
1733
1734     else:
1735         print("No TC was defined")
1736         print("use --help for usage info")
1737         sys.exit()
1738
1739     print("TC num: " + tc_num)
1740
1741     for i in range(len(sftp_hosts)):
1742         print("Using " + str(sftp_hosts[i]) + ":" + str(sftp_ports[i]) + " for sftp server with index " + str(
1743             i) + " for sftp server address and port in file urls.")
1744
1745     for i in range(len(ftpes_hosts)):
1746         print("Using " + str(ftpes_hosts[i]) + ":" + str(ftpes_ports[i]) + " for ftpes server with index " + str(
1747             i) + " for ftpes server address and port in file urls.")
1748
1749     print("Using up to " + str(num_ftp_servers) + " ftp servers, for each protocol for PNFs.")
1750
1751
1752     def https_app(**kwargs):
1753         import ssl
1754         context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
1755         context.load_cert_chain('cert/cert.pem', 'cert/key.pem')
1756         app.run(ssl_context=context, **kwargs)
1757
1758
1759     from multiprocessing import Process
1760
1761     kwargs = dict(host=HOST_IP)
1762     Process(target=https_app, kwargs=dict(kwargs, port=HOST_PORT_TLS),
1763             daemon=True).start()
1764
1765     app.run(port=HOST_PORT, host=HOST_IP)