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