From a6021e21b2bd03b18a3081b7f3364b3ec9fcc170 Mon Sep 17 00:00:00 2001 From: elliott1 Date: Fri, 27 Aug 2021 12:39:38 -0500 Subject: [PATCH] fixed merge conflicts --- examples/test_performance/REAME.md | 33 ++++++ examples/test_performance/change_nfs.py | 59 +++++++++ examples/test_performance/clear_files.py | 32 +++++ examples/test_performance/data-copy.txt | 3 + examples/test_performance/data.txt | 0 examples/test_performance/graph.png | Bin 0 -> 38972 bytes examples/test_performance/make_data.py | 65 ++++++++++ examples/test_performance/make_graph.py | 110 +++++++++++++++++ examples/test_performance/test_performance.sh | 112 ++++++++++++++++++ 9 files changed, 414 insertions(+) create mode 100644 examples/test_performance/REAME.md create mode 100755 examples/test_performance/change_nfs.py create mode 100755 examples/test_performance/clear_files.py create mode 100644 examples/test_performance/data-copy.txt create mode 100644 examples/test_performance/data.txt create mode 100644 examples/test_performance/graph.png create mode 100755 examples/test_performance/make_data.py create mode 100755 examples/test_performance/make_graph.py create mode 100755 examples/test_performance/test_performance.sh diff --git a/examples/test_performance/REAME.md b/examples/test_performance/REAME.md new file mode 100644 index 000000000..4d053e0e1 --- /dev/null +++ b/examples/test_performance/REAME.md @@ -0,0 +1,33 @@ +TEST PERFORMANCE +== +This directory contains a script that generates a graph of how the latency and throughput of an NF chain changes based on its length + +Optional Libraries +-- +matplotlib library is required for graph generation. +If libpcap is not installed run (might need to update/upgrade): +``` +sudo apt-get install python3-matplotlib +``` + +Compilation and Execution +-- +``` +cd examples/test_performance + ./test_performanmce.sh -s [specific lengths of NFs] + + OR + + ./test_performanmce.sh -i [one int specifying the max # of NFs] + + ``` + +SUMMARY: + +test_performance.sh -- a script that generates data based on a changing # of NFs + +make_data.py -- parses through NF data and outputs it to a data.txt + +make_graph.py -- uses the appropriate data in the data.txt file to make a graph + +clear_files.py -- resets data.txt file so that the script can run again diff --git a/examples/test_performance/change_nfs.py b/examples/test_performance/change_nfs.py new file mode 100755 index 000000000..6ce11e31d --- /dev/null +++ b/examples/test_performance/change_nfs.py @@ -0,0 +1,59 @@ +#!/usr/bin/python + +### This script modifies the example_nf_deploy.json file so that it runs (input - 1) simple_forward NFs +### It runs (input -1) simple_forward NFs, 1 speed tester, or (input) total nfs + +import json +import sys + +num_nfs = 1 + +if len(sys.argv) == 2: + num_nfs = int(sys.argv[1]) + +print(f"did it work-change nfs: {num_nfs}") + +with open("../example_nf_deploy.json", "r+") as file: + json_data = file.read() +data = json.loads(json_data) + +### finds the last NF, deletes it, replaces it with modified parameters, adds another NF +while(num_nfs - 1 > len(data["simple_forward"])): + nf_index_to_change = len(data["simple_forward"]) - 1 + + simple_forward_json = data["simple_forward"][nf_index_to_change]["parameters"] + # print(len(data["simple_forward"])) + # print(f"simple_forward_json: {simple_forward_json}") + if (len(data["simple_forward"]) < 8): + start_nf = simple_forward_json[:-1] + else: + start_nf = simple_forward_json[:-1] + # print(f"start_nf: {start_nf}") + # print(f"start_nf[0]: {start_nf[0]} is type {type(start_nf[0])}") + + # print(f"str((int(start_nf[0]) +1 ) : {(int(start_nf[0]) +1 )}" ) + if (len(data["simple_forward"]) < 9): + start_nf = start_nf + str((int(start_nf[0]) +1 ) ) #makes new destination by concatenating the ID of the last nf (to be added) + else: + start_nf = start_nf + str((int(start_nf[0:2]) +1 ) ) + # print(f"start nf after concatenation: {start_nf}") + + + if (len(data["simple_forward"]) < 8): + end_nf = start_nf[-1] + " -d 1" # causes the last NF to route back to the speed_tester + else: + end_nf = start_nf[-2:] + " -d 1" # causes the last NF to route back to the speed_tester + + # print(f"end_nf: {end_nf}") + start_nf_dict = {"parameters":start_nf} + end_nf_dict = {"parameters":end_nf} + + del data["simple_forward"][nf_index_to_change] + + data["simple_forward"].append(start_nf_dict) + data["simple_forward"].append(end_nf_dict) + +new_data = json.dumps(data, indent=2) + +with open("../example_nf_deploy_test_p_template.json", "w") as file: + json.dump(data, file, indent=8) diff --git a/examples/test_performance/clear_files.py b/examples/test_performance/clear_files.py new file mode 100755 index 000000000..cc48523b1 --- /dev/null +++ b/examples/test_performance/clear_files.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +# This script resets the data.txt and example_nf_deploy scripts and returns them to their original state + +import json + +with open("data.txt", 'r+') as f: + with open("data-copy.txt", "w") as file: + file.write(f.read()) + f.truncate(0) + +with open("../example_nf_deploy_test_p_template.json", "w") as f: + f.write("") + data = { + "globals": [ + { + "TTL": 1 + }, + { + "directory": "output_files" + } + ], + "simple_forward": [ + { + "parameters": "2 -d 1" + } + ], + "speed_tester": [ + { + "parameters": "1 -d 2 -l -c 16000" + } + ]} + json.dump(data, f, indent=8) diff --git a/examples/test_performance/data-copy.txt b/examples/test_performance/data-copy.txt new file mode 100644 index 000000000..a85bcdc95 --- /dev/null +++ b/examples/test_performance/data-copy.txt @@ -0,0 +1,3 @@ +5,8254222,1997083, +10,4521436,3337751, +15,2104461,6486186, diff --git a/examples/test_performance/data.txt b/examples/test_performance/data.txt new file mode 100644 index 000000000..e69de29bb diff --git a/examples/test_performance/graph.png b/examples/test_performance/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..132064b5aee20928249269e260d669da9de4e39f GIT binary patch literal 38972 zcmce;1z1&W*Dktf6(l941Ob&2P`Z=_qLe7z0)ljhGzKg}5D@`MK|;E_l$H{Z?(Xj1 zW4+(`|NVb^?{lubuXC=muJ=`0>tU`rpZPpv+~dCQF$10|KDv5^<_ZFVxcXQY`3!-; zY(O9|iZ9{9JLmP&Ztxej!^6iam*C}b$ruGcU$&LibU+}8UZDTSNS8=6gEs{or8OL% z+n6}Iys&?XuzKNWYiZ+XX=cdi{LW~(*k)WK|!h;H*WlE0Qt|kketwq_vmx{KRD_C+pDsB7AL~agq-3$9O$AZP`nkzuD_Hr<&%Zkw_H<*IVC7 zb$F*jzHs4K*N$z`ArQR0yZb3}A6kRp_rJpLn;Je?wGIs0o5^b#I*1tMe_hZ-LPFB_ zQ1sd}O%Bvp$H7Fxncbm0lcd(yfBQhe#ANQDH}3vlBNc3I|A#k1=_}s%*Uyade4sI- zB_UDfymk%SH9ieh�HaNaQoba#`uAqzZ=|V!C_l5SkH5L<75{>1BSE9Ff zok{P?OQQEI1NvUkXQ;8u_=Ya`JOuNMFaIg}F|+pVTV031N>^_xMyTksk;(5)L8 zSqz317VA8F=}#$lo(;pF0+x>-6B{>mUF@FGtn|+7r)+5G4<$DZVl$?sZU>~ zuU_@;%zc=NtM;dYcWoIrdzIXB*lu9F8XsNEYU#^kOm(<^7jd{Q!pMjiEV;Vae|4~O zU@;3864&n^&n1m-=Do!KQ73tlSEiGam_+yfK7ZAngyZ4i@u%RWTzjk#SqWbS z9qN*yp`k&s*3`_*+juc|!+{)K!qD)9gwV@mtc-9*US3{Q{FYQbZS7|5ot-i&D%aXg z_~5^!q@<7G;WNYzo0AU+=!CDqIEYGh4FP1zPoGW_hkyF?28FtGczBp-)|(n7;gL>S_VGF15F$IC8Xd~F)lqwpRf@y!S zpL=-v+SFkDs{ha#sPnZf$~3`KjYhzlL*H{RVs)fcN&Ia0dHHHV+w5GVeo1qCyqNas z*%^ztxZbm8&x~hV!boXpIhsQmN}GcjB=o-WTiwZ2&;2qxYrNE#8ChgAp$G9|l?Mxt z@N-_?-J!e}Z!HJ&9{l?C>n1O6kC(Tya@f1~?;q#tRo@g6(p1aU<5bI3O-fE)<0&sM zC%ty+9F8pIGF$ zmhV57lOscX`toJ|uZ5PGy*-kN35g)Fu?bTW=iz676~!AEh?EKWD;3dt^V3HI9WE}1 z(^P!>@;9z6A8*)CcpeCi@_QWGmhW_mNFy6e3IiGq!-fh?M>e|J+Qn& z35*mo*_v)N5AfS#!&UePKn-pqpZ*Q;i+n__JGWTwXZ z#nf2av z+kI7JJw~Iar?>d$8y2fld~kR2BP>KgK>-5s;K2hzZ|+;STD)B&+xZSLe=#ea)vo-_;Y_GR z6CQ(yPpJ6urPkI~*Ny6fyQZDARR`nlgm&~V{X&CUG)p5?`BSS7f1|=`yS}L1OKsR) z>J5vDv8er?ni_vF@$wQ8kr>};?Zwigt&mNwp2Lgnkmfo>cL+95caC?eUQ4Qc z&OdtEF$2?4d%njldVV-Vb>IBjaIuAddipK-XkHvxLI^}qBWB|6szm_vqmaR_Us@a# z*REY-6cIV8;_)Y95MMb8r59T!e!l;@ps)~qZ^omTy@~S5p309^ICYoV%@o?-jh0W> zudO+o-uO*6P4DqEZ7^ECj#3|Sc7pX%&jof+#`eSoCZEY-7lixZ>!z0CDtzTS4^9X4 zy?^%h@?;A;Ef0?56u;`mqzJ-+P*5_V|MaO3geAwdVR8g9Jv|{eH@AOOd%OJVXn8Mv zZ;Bk{?EJjp&V0vyltK*u4FQ3H8z!*kTiV-;nzOWuuds$+p7K7hS?Wo_hXu9pC(x=d zLlsuwtMh|fv0SXj7lt&x1Ss&F?b1>_#lCS8jYsRfriL$>G$kP{G8+G+zGuV?PRZe9(~PmlV0k zCr_RP2GfgGjFwmc5c%}+BO~17o=TSu`;i=7_qAe(O*dha^yKJP!aI9Qy^lVHhqK(c z@!;XZhqS{vbF;IuPoI8-BWR(cC0xU^TCX!0sSwR8{p|Vkms7vq-!EJnet)_fj_S)8 zahH;Uw?A~k&NlzyGSOFmm2vxUhRIvN+5YzZ`9p=A0q3>Dtr=dko||UBS}A;W)HvEySAlI zeMLkiS%&F4KUEwW{qQn)b4)M&@c$Y>rdvow@#96ajljZFK!+x#2^?LCVQ2JPW(`)JB^Y0nDzb^M#(1|c;g<=51cELXk1R6jku0$ ziThq*VAOrRUzhk`*lBt`rWlWqgru8AR`!pxxwLd$6i>>B5EK{rg+Nlq)B>KzxsdIE zuB080?M8Lo#Tf&hD=|sf^Zwj{9d;a?ipY~OmtszF<(CEzY5S%y*-vSMl0N3C36jhWh~=2BO%El30)CdnheghY&Ezfm%2Am!DO@qH(4>o+?R1HAH4N}TrAAa z#Kc>-HB(pTJFNQ4u-ou(yAANiC=ML@%TSgGi*>E8cK!z%oT~GRZcW(1_l2FF#1L5x zVcxUOYP*?J)dRpTE{~CQrY|#1x1YgHmTgEO3L(08Eo~UC(zi-9PPEjkI-Xgx_{yu1 zei%Fkg9o0bg~U_G3q8;6`idjE=|h;s#+0P>BagUjhER-obs-^E!@T%+TBC7Yh zD&^)@AtmqZ%nuOGfIsF1e+&sZ`FlVO{!wr7hzuctZSL$yNlGGE6=P9vc;6O7a3Cfj z!C+uuxMwwdjnB06-Djb15m8a7%}ra_B@L%XJM1$l87ds8Rwq|igp$P7sw39P zrOO;TmqwjqI+t(4rKFT;;6-{JrFbbH&P7T_a>F zSw2>f1Ok=n9#24>a1f90Fd>83RcP8(GVvuck`3S& zU}SD4CLtlAX@F36c6R$w!NCMuySty^+E6H2bMp+u#}C&9hK)Xb`h@MXI$o`fMAn=i zTcC%)NcZ;X#-K)H-pAI~IVeLB=bk6~H`v+n&rS|XCro&wVL|y` zg)NFGu^RFF_3NQORc2oxU~qT&XU|BXynsY)9114`rADEYyoLr(p?F7Ap2^R~GcB!@Wix*RkwJ6nK9G>zVsGB!x2UtJ<_#s?3 zvycG07;3(onDQ~W?QxlzfK8RuoBEu8{P@w*(NV0Qs+6E-Jvv_P&SNt!s`Gj-LZjTC zr74slG=PlFuscZ_;gglcfsllxSwDe){ z{{Hn7WMPHY?3tGGueTydn7wV%GhYRFyZS}xOw2`ENW?3~IR+~yh-+OVBT@dqV@gO& zmMl@bOS(Dv)-QGD)0?+%yHgde`;X+5&(qL~x)LJ{@-+~j<2^a;W?M*3G&O=6-@JK) zX>4kmATYl`91;+4B?Vjn+B7+ zX1YeFog)8)VagZlI+OYrJqZb(6j7o>gC07nrPgDcZQQkjqx&nlwbR?RkM{pRhG7n_qqi2N#GV;w5Q7x^hFgihpFTU%Q>WyT$<^5jsi5N+pZ!N@n5VU-*G z*{wdZmRT(mBAQV6>{ab3E@|)YF3FfaufF4UI$rg<@Nc%Zx=F`Z7We(tFd~W5ryic3 zb8m^n^ZuzsVd-)Ja6@CO-No*It3&~S-2@y4a4f}TW4x!v)BX0HI|a=Iw1Q7_s`s@X zKY8-$`}dn>137U>8JXb??mKrr!RA=%O$)ur#wPdh;hT5w-pM*T7KyR4u|0yDgZ={8 z6HIcEToF)6wZ#fKtn#=Ytdm22h~|A62vGj_ulM+kZEbR2I5elB{8ZH-9zbxQ+VX~w zsS50#{&9lJ?uURgG*lSLB&BKp1|Yq#^fAMLnB65 zSRHk^8x%KGnd(@j6FH5WQ9Q%Szs3SzWN2y-Kkwi-33iU%+`%Fx^@$hrwRi3$B~jix zJa?a*kMVtjIoYpWJYX9q4C~y{3xLb~$^?T(CB>^AY*|Iz3MVYD3#iP1#O$2!sQY+h znBdi%y2N{}bS-tgMY+-Ce;mHpPk)!P57@I6S0^BkyiBfT@0*OX>PoK*}Cv#j19uu8xTVeC(Y z<#~)aIl#)+GD}WiRRD^rMF=KkKjZnME&_?2U_I}3p*2E%6=O?1B=Y`fzEOqA;efvH zpQi>LG>n3SFjKM3Z=%cvh=?YCq&Xr#rLk@9j|dAd<<^1ceS^&3Rf&3DKbyiEtE_Un|EDAyeWipH4YPV~yMM}))Yw0M z&A<{x*Fu4)mK5@92xgf@>K76cR@wdE-lE6S!&t9hzjg_>`qVAD64%G}gaHkwq+crA zQJl=ob?h5b*T>MUfZL!vXZS#VeQCSRcW=cP;&jooiJFQM;JQ~W`6tg$e3c|{s;Ycm zwmGhoC|jYgPF>Px{|b#Lm7ph0*`C^DoC})zYhghly1VO=q=y@~XF`iBv6ZbFU~EhR z!{(4_-IxnjV`H7?0Y-j4?c@WbwE}jOFnN@KQl&bV*7pShlsP*^15!`V&BS&1UiEnc zS>0^wvF;6$u1Nxq-p@^fSrg>?k zN{6271AIdS>^-{8$0{Sh+Y9&3w$}MGENcP_(NDPB9Et|*%EhiTS9R}TAPP+|!dahb>#ecA4p^*_^>n%tDC5m3t%Tllgn_^gfiT95fmc%wIN(w(iX<`g+*Rt3y>&wljT z$H3VGzIYztkz5TCaFUi`hTM{&ROCmV>w*H~l(rp;WO> z+1$Jf+s~Yp%ev?LFd`!2;-Ti5BpJ&{V*7T$)F$!%dI`vf*~x-%=Pqzu3LsY z(ej^SVjwgE=SL2#=j+$6_oIL)%h$?=Z$u)|EJ;s=lZC%`FK|ZRVbsE@0DM0h1D`$n zWTT~})u<<$K^q;-v^EliV2adb1+vvq28oO?oO=Rvtf%{R5w-8>EsMeCk&smAYb`EC zib#2+0tWJcqPT3M=45he%J;t@+GfaBz%m-tPb9mP{_g@>wM;RSIvMA<^TI|8ApsfqAO zOl0&ggFj9@;YVN|WuP$Zx=uz#<=Vf4gNrNN@Yyro@9OnmBO^f0u?%oud#occ(X{Ds%W{ zR1g-umqxRoLTvg-o={&1%KRgPH#RQ8AMPr*JzCrUc6u0C>rnxX(b;%#5}i? zd1U+lKsdIUB|GgdD*HzjbcM&oeE>#zr-@d`9vi_$^}N(t_n!6W;X`h$@~^^9yX~8N zU5k5z8e?B||COvLUmREilfcM^x7Z^s@b?IvXT!F1N*KKs;#`QSs8CR84%%3N+5%)( z^$vF8N-!B2S$DC8IzrObRj{h6iq?>qk1yY0LD5}4l1ukvOiU02wh<$sdEbqW>i9>+ ziMTNF@%7Rdn)ls-#RaO#h|#|jj6i3J&A013F%))Qy~NF(E9ds1g^`}V?zs{MJ_RB^ zzHY<@t91Oz>0V@aG~}M%@oLEg@w)Ehy1fA`eebI}&e4#l$}a)a7$*mX^F51xc_15| z`#qujq=0ROhLWIdP>Z=0VdLSoZOt^V@c>O8`SBz1V_DgcXbokovh*JfrE^eR#CB4$ ze1F)2<@W8z07Sn-ASR`zHmj{oPnU(M{jQWC{wX$=V~t7Dbw0Ht64{(Ku96Ywdyt^qHrSzz2MT}wZjviwW@ME<*; z*jUn7N>EF_k&G#@USHngNq-d>D9zxvLWa=a7iK=F1AsU631{nf1Urt;>2@2p=@?W} z#!bQ0hWQ!|#=NZx0%JFC-@Z-AlctpLWpVM9+28aqP^@H)jlV+~^ykJrKvgvFxOH%V z)_15yoU@<^5^10nw3YNDpk@*m7e}*}0U;sIuku-$wtJN%9s`99hej(iQBhRxZN;P( z133{;v!O~$OYhl?>i~RJ|2FWp_9@r;$%Zt|y+6zy_Xifk{825^#xDbOoFZzZb?x4_ ze3OzfofUUI%@GnsmNB>VrKF`X-@A9s%*^c4<;y(6ba%QsLX*1VJ+$szkA{Y7$9#OG+de-GL7>FIEhrX z+BTj{4&A-A*UDBm`4cEdbcI~}?$YLFecj2%isO-zcsJKaWN~ATuH>u5Bcq2>_d7wL z56Gxr>^>Hoe;K)Cm=-VQbQuTOWMT|@cY-Jh{o2oN7oL+}v;h~U+aH~*Xie>CmMYG~ zHo^o{KzWd*i+|4y({h5)aRv8uKL##U`6>k&R@GtBd6j{$*FI~86%aq#Cl@;jP+o)_ z&L5tN?TI!8MW*Faq%Q6~D>t*4 z#oyBggiOpJI{`6HwG3k1<8YsLd8>++AI?Zezb*;9^{VG0a-xTc)~Pci*yS9f=$+zoTEP?;!+!Tp<@|^V)?Cgk!^NLDGUi8^`kpBccWO^b zUyTlep4Wni;m45jL!>FKjE{thPg6dc_0sdAh7I1Iik;$S|aWx_0(!g;Q_nFNGLP zi3*#PS$F+>>%N`!+>X1rprCgv}l>&X18CKeKlXe~V(e-Av z2$&tvJ41E#V8U12(?{a`&y6qo-q}{EsL{Ua1M|q9=V=-1LK?(ms9gb8|kQ?CTD`CPa8YopMgjRnH*=>qypmuUoW`?I>^ z?!SIrG3GJ#5WSY3e2GYD-1Nl~o)Ww9K!B8_T*StPQCzQ??_fDa+j9A@(24!+>x$*- z5$UX(dpKV>d#z75YBI-e6%_0m@x_FZ_PI8PEDhy~x%;$n4|LU01i`nL`_YSKoIi!~ zHa&H78*|)C8_%_&X_+`Qi(~E4^R$reA(F6gdk0?(ET1@$y#aS9i0}P{FsIWzT&#LQ ztHb+1B^;K4#zLfiKTu|b{~3RT=4KzSaaUQzaD~dsBD9KmAuSx#!zR1m{r$0U-+E4^ zkCH^+hIS+;*7AUWFduBSG$ky7iL4G|ntKSfT-@OzwEQvfB@E;AFxji{S*^J3nA7mL z-DgnHW&Du&(DVEWpbC!@PGXX8o@Qm6A6w?2{spF_wgR?Dmc}?^4&+OqF>#C8ep`*P62!ZAmo3?a=JO(~q@79M^yRP~B zUyq|EiFi?naWIy~`Ms*zDdjox9eS=yqNq5%COn?Ua6}Z_e&c`fRftR@udaMyGF3Qf zcruW^=vEC7AdAY0rb@aWWszJ`*shB=CeIFvdD__$78f*_gli+%eP7h0130=Q|0cDk z^RW;XTOS1)f?wKQ&(I%D-yK<{jEl>f!0cBzl5fS+Z%>{QpV0r@( zL?c@bZNf3_iXT)>ebx@e#=Fa8#Kgo12?+^;>-+>uOG|`2LqkI#lDrwR^c%87*U0wv z_OynC^rEP5QvSa{HNwEah!V78x^m?Tt>OPl4eGzi%E}}vO1rn*Ck3S?kN5fMm0B(= zT!g;Y4~zG0JNqMU7j?emUW?Bja&dEVDj;OFw7z!#c&cDn7|{NeB`GDZMeG1|?HYO> zv|sP__2~Z`D*Vvtm!T~kIsr`MM<|exwiw~$il%P4`vd^>-?4^9GoQTG5&W7;t`nNZ>K@1E^gydIBQ41_wp7 zXA@gyRh1}DOb4&`xd#ae2>&DikpqH)3Y(3MjZtZ7X;~Wipaz4EkKU3)|~tjkHsfOgW|E z!fS0!C6_+WqulwfgmXItHS^-eAUT%?iER`;SF2~SS#MK~=ub<2W`6$t*nD8tf!~o1 zqTsx1{`VFX29$_An+b8_moLA0U!3o2gtxu}pBdP;Fc5iGBm7V+3pc=;2jA8ZS`!0- zvwJCcegNtzSliAhpt9fgnHM(`fHZz|bcEJT#lT>S$r|2zWB$)Ksli(B+JBW*CDvns zP`LzoV|?rQ+@FO(NRKUkp(Bv$1?v2y&$w5gD!E%(p-L9fmfzL7)1$giERtU5E?w*!?AW1sN zo`LPwtxM9<(rAkiF)gjm`iiaijT>%1EGgBAH->RU_oEc+GM?it_TfW`d;J0r2jc_H z($js33v90=X`-?TFMRpf^s&zuXEs(f8j%i?D1zSXn2=p+LE^z`NM>0Y81LRw$5AV1 z=i9T~wZHjPCrf(kx=kJxYu&^I!yfna>}2ADx2qDR76XL36^;)w)v`Co-8a4gTZ2G^ z@?J;<{F^aJ>9g9s`G-BdzO%-0PX`iz4jq`9u1s-?(hANvJbJG)`YB+4&561JkY{xC z@pT5WWYZYyD&;PtQj4@1XYdJ?o~%s}c^t%reD>T`p1e5kDklg?-!8JsoY>WIxcV{d zTOrp#E}B5ry1_$IHb;?|h$uUA7Q5zF5J{$s38AtG&J&hmzDvw4At~+YmN4f1!aVR0 z!KpUZ+u`4NLcM!CO5V-;;V)^4 z*&!|~C3;mn=jg;ccFUh-jlWy_9_(Jz%&P-yp!xT;5p?aVp8^p?F@ay0*`AzS%uC{U zF}c8bO$!}dA!I3of`ksZ`x_J7OvBC{mi%o!DRL|jiDg3Rb*)E=|BZ@pDYqKE~iqXcCez_*X6WK6+;;obh0KeHX9!O zBjz=P%XSmM&g#ErT;@*B+tJ5y5_q6e`QKk4Z! zIKBSfvdWf4&I!9d)pj#AF;D&y!LCU_rW$dw-m6Gf?}y=C`m*HY%mppbN%=o<_ZDgV zvGY4yJ1Ce+*{!-vFpC_L$8uyt1=0qQ_tZ zVFT`Jd&H)8$Y|8c@kXTl(_*wzy4|zk?Y>9a+R7u$%oORc__2jteKEIHRXxDigeH!p z{0@CBdsj=Ca71UDocD&?UXMg|)$YD>GS}Kx96PGRB+UCPbNBcQ=hu$W@|4ms&r;c) zdB92FnSKnJy6bhVNC?*~_chhbzDy@mOh)@LC(&WDxT!_uFhG+7Guv&_zd1T?+5^=! z=QeXSjNgj3nZML(MZ-(Dt(=9dv9ZFWtl?l{MLoOPJ#xIi==RgpgV9D{{JGJFf?z5h zOh^@I%PIgEgW3r?8Or&Eg&8pM?YDtccxRu9R5!53v-q320b`z#KjG$JVKXFbg2-?z z0;!z)yb~Jx9s;4t@UUys``(;u%b-a?>?9e3! z+`F*BXqlbsq%YoG@PPQ24U1OTLJ;}K9s*dZ>tur|gA^1^<2*9f{`<4h-+cxgi+o&0ZK&tTmvOI2#3qnD3EsjNgPr6Jp<=kBwphdr zxihZ6emQ=22uSe8EwSvzdWD07hnL_av-{N|=O-ACFzPsED8I_H{>{~&@B$uEg557& z3mXT+Vqn?%_<5Qm_P}%_RK_Y+Pnzy}AJEwjy#z%_@?;<0oAm-?pmnXoJOT>++He-6 z508=0!Gy~>dgZMQ3Tok8r>xaTPTGpn5B`HJhvU)E;5G z()}Lkm#)vCQ9}z}w8Xrp6HaoZn`g1HK_bv(Tg!x(#OQi6pLpMd4`jEzv5^I)BB- zN|jcYYm`CqQBQ^YtcUL@7AI?Ef`=U3ir!9Ol#gKl(1|iKjDeq}+a|6oN zO}J^)Jy-Ts`c4-(vhz_bk@{Y@0nk5l<2W*1(h#qkkx=KKD#hsRV ztiwfSx>4C#0yua7Ap&qqf&ppZVu!(CUS144qU^+4w_inZCnxCHz>ivT1|n#Fklvh& zTyY+$=oGs~(kBU3ZFSmunG~hQ{!;P=a?X;JCF60tSA}E1>96-d-s(K4bgl^KG{F*W z8#>z`(07a9-&oUCw95&M6MF7K<#Ap znlo&FBsKs!M2>Rpfuc%%)%KOm2D0NF@T~%g*)%VOOj)laq7tLg$U|JZ^vA{qvBuF| zbUV*DfGZjx)w*&B*kXQSfay47=(0~Kv3JQBkwn8+hByVt#nen76STzW`b`s*>e(!B7ofpd8VW^Fh^SHj4{)s`%kQrIN|t{_su%% z#QhB|NqM=<2gg(^gq=-52MZo;#I?(ip`FF=RDw=M61Em?33 z402kVTFFIErz$mdU4_%ILejgA)RnVJC#>VW-ial-DV@m6F$yDDapf^pRao>yZ;EppbEX z3yQl&GD~|6$g$3z{A7o&DV+yZ-n9;0GRXCx^->er925pUH`h|VW-o1?pMZfv#`KZ3 zV^emG7?Mw?|_&GzuNip32K3 zRZV|kd%A3I_tXf!#l?V`G?lhCKXEpgl$`u~JC3E$`10hM6{HQv8`05V>rEL54|if3 zdv|$wuh8fbaMwjFHE4oGxvye|@L$%Hvm9ZjhZAF{3}y2SehE-6?)xWrcXG3%%mb$l z#n^SGPd4^~TKJk@+_TCs4UBWL!?ANL+NX5t|HJ}JZRdq2Q^wHoZnvS}-KXyJj%!y| zhm4?^iq-2xp;qy1hDa>D$U|sy!4!Q?`Csp2@!N1!pAVTz+TOL@>q{wp`4ZzQjo<|> z6i3a?7R{)Wje)nrje;H;c)y^;(0;8H?$7Dg#%62|0XynP}h|TcGbV{TTh`0O} z0^{j;Wr>Vyk3Ej>Z7w9Z^_%XPtbNwe$x7B4$Q_UfXsIqXPuVbki?_m*2X3SkxxGqD zpev()nEDaXW9L*nS$KTk8ZFkVD2Ixr#w<+F?73Ashe$bkol_4M;6#a!9W87U|B$pP z8r3oAX5tKVS-oYIsn%1KKkJq(Q9?Un?9yTq00-|e^thUcg_wfj{MSvw+?m7o!9?L-rr^?{Dd9zqU6CJGm3lqABV%K-=k}Z}~@3`xXg_P`xpx__1uHZuRjU zbkJot+_wxNU`~q@{lRWuVl&`y@A74clZ(Fwoj;(0XO@1%*cch@9q)8u9gHS3H=yn; zf=e+w^7D6XZBo)AI|-8R_aHAY8NGHzgh~)rot1E1(Js0K%2iyvq+{6jjuYFl%Y<3m z3UGrKxoG(<<2EeWFpIJSJu9xIndG;ku-=;Tk(5tWzPt0*9?4uBXhH&=!bOwHU*F;I zkd%kC$gYWY=Y8v(TpicF-bxxLWtX2*pjn~PeAoM2=ufggT31m3*AGfZ?(qf$+Q~?L z#|+&kf!&&6_@o%;M@p0RM8)nCX$hET$JF4iQ7w@Ua->#K1y2z&Cr#n{70TRl$=eN45ip=Lu9R$^h-QAYg--D9V)8nIA=qNM4l8ZH< zPc-V9T;mWYy5wPkM4Cc3YrH3g>)QRZ*W;qPg1>FjMt_0TDH02@IcTH>%fLNvs0jQh zCT^Dr{*Fk~a`S@(Id$V%z=TMSZf0*PY(>Vo75reDlnp~V5w+povY6dn$9H~yOq`ro zp;DDelQOPS630kNa*UKlzVi|khyh5M(NgddTtmn2>!gU5$|;G6V5TeXf9*)rpd&7tYJy+t@>BfBa1YwbrSbPWVgv1cR*n-y}i4Ug!?H;<59=i{vS< zPx352CR5UH$0eMtAJ6L`--2}z-8Z4y_N9XCv`fPG!*wT9u;pRRG^;=SjYJ~c4*CrR zZ^<5TIj;Tg1SN2|7#fd3I`hJHTjA8re}r6Tzpr|rS$p9%C!Vuo!+Bi*^WxB--`{=n zLC2;qo{!at52yC7xP*kR(kTGq!F=IQ5vcS6$Hm0!?%Kte`x^uCjoKv;PE_A~zjv@g?z!p9FUZ7nQ1lWX)CfrcI`5X-or6~Tm+p*l*MPPFh<2p77pn_A59+!&ryJhK zPIIS6Za#OEMoQ`e$U04*AXVbOaQZTM{kdB0eTuQWth&eiA^iyy3vY3kC_kPZFA0%z zbHj8pC9e*r=wDeMNsBYVy=q@o`-n)l_+%*!jeKyn&d=O%UE3%OR@B7!Ru^2(Yx$fx zHpg5P#pp=7U*q5`9jthsn3I!J|FF88-ZWHZvRWzN=`zPK?!YalN&_PP2<@;Gwma?flbJOOaHoI zv3-$gZ74axEQGGN3E38@f2e~`(&rTrP(imA$lgiUn?;>x_#T$oD77KV(kw}Q6kmA@fld*V)% zAg4E;5)lW0=He*S1S}9o2cPv1)&9c^z#x*U|DyBj9C|BsZti01xm}JD)6T8ke6wD2 zi{susPT^81{~{_yIjo!-8jWh2SASceT4+&y=Z7ic5-(vg!q3dw2OYdM?)S}}ou5Iy zcA%Hwz5dVPU}vQ&U_qayHd)n$xb03yMNO2>@9t!`GTACv~<}cGS+1ey69s%{)L~liiHneuaHi7wYdl|*C#to(C_v`KujA!)JZ##iUHNG`(-e5X zo?7_*zZ+7fFh!E&!sD{j*t`!h?ne7G2Kj2+Kte2is)9Xg=TA7Yxz}e{=I#Q!D??b+ zOT8wEX>vf{$u)E+3oCp@xODuduY)OyyHdU@3wnhpYQet5!*jd<8sb{%O0zdbJ#yCk zNlh{Xzr2$AxL0LJLfRcwoh-iRAhmYg01#*xh2k3TP8Oyre}JXC)?ZzDK9uNdT_obR z+e1H5{)P%cBhW8S867?BxAvB3w@b?32mGifam4?jl{FgX1Ht(Jmyz^$yrU8zWUzsO zM&75YzWJM&jQ4JbF zgA032O%1v&^s$0M1P(q0Dl#&XL$hEOS~0<2iNOf2CUP&afJISD{;;%o((bPc#;2}f zeB*43Jy4mGu`Rc)EZyGTYKFpG#S=VHv_?%RS65Vf>}~twq8ZOLrJ&OV3Ac;EeAr%c z6b&HwaUY07j{-%Iv`JUIRV^nsw-PjCv?oaDBauJ=H$WQ%SZY^!sHv%^mzHj`t7Spw z0|;&yjMoLMi<&{~yNnpBb}vPtJkIt8&_iJ4epF)+Wl*c}C!oxsZA!!?C#u5)I=Bj( z8=9H|`^?GV8=07%rzu8&QBUMl1Ul{6fM%~*9C%mz6s!w-1AAlFh^fU-S6y`Mhj*7! z5(LIQ2No?+8I(XaBr7wAJ$T#6z-QpoB-D1qLiXbaI>`&IvgiKwqI$`#*!gFq(3A*T zSG0;=`9kCC3*gTXKL6E(3N+C_CRD$x2*|P}-}3VQ+-Nc{X5!#zM~i>h&_=EpCp=^% z?6OW!IJ8PkMnQp_*=HU~{javFe2~xF<)PbNo;6&m9hBcZ?+Y*Y_UQ7@4VGgSUjl=V0Vl^Y#Lpx0F1T9ymB)IZTjX z71f!EodduYmEI-lExtJuD(sWIdsA|$(Ij(I%4PZQWzhJ3fmbiz;3p%?v{V3^tDrl)uCA^yUgYlGKQ~fWckWpZ5`zr3@Zom3*S9DT zd{6B{0yII!+%N7hDWpczh5{j|JKZRf;h4b*{fQYSCPyV~AvDNLi|BrH!pGR9eH?ur`@9Dm3h#bdO6FWp^3pA^J&~qZ)cw+ zO};71E6Y!qU|^HMC9y;L`F5S`eU0RCh<$zNH?c8w6u%%U7m1l$YkgrlI8eR@ew&kZ zEPBts=Sn%OATT>F_25)Gul-spogkDn)dfGh*@xEOzY98l!RiCaiwQb=Ouh($1_>RF zB~9?ig~hBcVUNSSjuX&mf6nirl`(Sip@z>L*pU~sh=mV!4h~X<4vy1zsR;OAQh}K} zq6y4wf3jn&CwYu7LD^de1`zRY0^^H|VM6b7Yx_e;5l}x=c$1NIH-cemfgNpo6W3L0 ziu zQxV`|Ux=|yfO#NGuX;F@T-(x;1Ns-CTR)3uuK5{7FFfd?tg>>T;RY0aY9)_e0iytq zoT;r{XL_I-7}78Nf`qfp3m&7yh>q^4OJX=dugsvGwnF^HxyP9nQa=ZJEg*1!JBhdYx{ki(wKy^;9t#N`tNkU>(X>yN-g_TtXtjEE$LIph~ z7SKLl;BjP+?kWRgx%#j(Cn#Xx!$r5Cfd=@@Y@`?i3s?5pvrioQH9GJB6{~+94uDEX zNPr_eg99}*G@wF5l~Sw*pegtk$Yf~OL5VK2J;m$SOn{&>E(r*P<<{8mqL#A~yh!a_ z2Bh{j>zP5s*=XQA5)RLO_)0W*rt}FlO-EZr5QE$vQiiD6~VDCfd#M^`041$JhJe zaG=Kz9{4JtpX-qVZsVRZJ0oyMY!6%HYKmAzpl3_R`)tqfE*09F%u(5L0(*M}4A{^Fhx_&cT2rJ5 zYMd8CKe=FPY6|_hm-zU2QVI%IaMSSfK(BBF1n2;8{JOfkw}E@)&e;PhVaIfM&Prfz zZZ6u)U8F(Q&F~Jm6rTT9-J3vT`TzUgH$qAw$xJAXWC%rQxFZ=#NEtJWkTPYK$}Lk; z#!yOzLdh&s#uAcwmWT`yp$O-F{r-Ee{j9V1S zI2Z}!3eXjw`ES|x6$N4rK~~#fhKZWhRFHn}Zf4HIvmdX0xmGrFU+?wtXO3p_M;80* z&o`1SM87SSIDS=PSik-rocwXO3Iu-Cp5>lYr7X|0es5PVe(B*6WZ+Yxp!>7A%x4o* zzKQ8^wc$%UcM3Kgxh}lNd-aBf-zuJC^4qt+UNQ2Ep1UwMhL{)cf>Bu*zoICx3HQK| zVc4`OSGa1Ev*MlZOU9dirt2KNmTknP@rVSqVsx(uW=uI#=3M*La>fj*6UPOUu(>RJZlVym+>#oer^TUQu#1-K@q?{~ZShg`w{DRJyyy?wPmXD_w5el# z&FeDWo_(b@_B8qANr63k(mqH3>lHgtxec(z%EEmUSmT*=MS?xH(r6p=^85^ySWe!a3t{#iy)1-jSRL72$H!0F6D1`E{ zY4&}an%ac){KQuS21ipO_!}H^!D~P#(Ifd&s^b1znj+R z&B&&hlDA-Xb=@-S5UhhNLcY({{kZKvg}%4&Ufwj;8zWUk*7iYI3KicR`;6kQ`5zg@ zJ#A+6o2^y91v5g(-7c!(vuk@&toWsJ5-dXqj_ULG6}#4AJl=csC>WCFb;UcX)tSj| z9*cK>|G8}3h-@Tu>71|Rm?XjQeVNQRX5R-H%_~pBZJ1(VPBHMv$h#=Ub>QXCWY+f| zwjeCLBHfeA+LhnbEF_q|Y%{cESXzJURAq126KUK~#lNp80Ram=EG&VPSL&3LWEf)) zY;kIihH=iZHZ-u;^NnQ?o&PDPoTtj#PeXZGzjy1D$@}<(_Z9QX3kr^2-LqxrP67Xk z(|7CGjVXWorqsz~jrc8`a_1q_7LM-?4^t?5oPQ)JsBYk41N*xxbW6WbE_$l*>p+MZ_Tj!Mlmn{q4HV1=&W{n!>8vV zh7M=Q!w-6UeVG*38F^nU3#ELj>SXZ9X5UJ3?N5_@r=U=Npo|3KjJr0um6=!8Jno!* z=VR9_IIvbnE#EBM!0~xmv9k1*+o$aSE=hgQ_y{0LRvC4EpXFK|Qt{zIL6P@RX<1zi z;HO^fr5PTTb2o20k29QWqHu+JED8I9zG6Az<;gZH@R)lRWoSLO0@0WH zIj5R*Q1w)cx%O>dJr4VEC*C(DleWc5xp(dKDdT=Q2eC;J5l8A~I*FFvR=l^u-(6W` z2RUfOCWc~U@LatmtL!(m+f0QXKb>Yt<%Da)hx(Ro69fsa_gMwlBs<$ zV*~u)lcbw%6KzF}?DNh10q>T!%gSLkv$hi78E01(ClaZs^c)Q8``x~(NgQz%jW7{R z*N4^jb4xDs6H^JsvFu#S2A*aM)3&{rniA5@KDW$E3$U=HZ4>cj+vodu`{P$LlRKN2 z7j63-MTD!T-(G*N+S}vM5mZ8^q$YgtIJ4;f;)BncZIAQN@vbOl-P-pNzQxNsJv;;j zQ(B(|HZtoze|d8%#>yty^(RJFlfsL&m2O+B)i_G3Xqtwj!{zTWA##(ND<_@5f6p@> z9e%XJ^LW=!uVr6{vW$Lv7czO%`&cPiR!>pEqe^#b=BGT~-$AOj$Z9=FE!N30GMZAy zIn{09vm$m?fWh%-c}#0h^+}m~-qR)5YlBEAUlAiOJ!~`I%dSIm`}NkrkeTqjvNG5E zx2Yu%8aCaCMtZOGxjxjLh-|3LG|K4PHL0_53o_k&@SdcN<3%pCnZ-XQ3m^uzEU&H{ zus0`@=QW*|-=sVn`;&J^vMtg3^J;u@a=B30*jqZ{+S-2TU@R`Mp8hgC{K3r70F}N^ zQY;JU-p38R&42!M7v@#$Up*r%XhS)EoaEyp5|^4T_M<^&-e7rk87HNVI_0&ceKTP` zB)B)E=4$zEn@j|giiAbf*S1o1=XWHtu?j!p?MMy(!8$tP?3idZP{U*K6nvG9SS>Z` z`<**titQ~vJhxE}ZC&=auV*S=#dCrdyBqpU=3GxVYFcy0&b5sdn?!nf=tBzgVD!mBXo1;^DW2 z)vw2%MkD@n$+6W%MQJL`*N)X}dTAaCO^Obfyvnrtz|Vm>d3FT0TiL0r?Zw3;pB0O> zvGpX^B7yY$)2AEpXJV!F63(AL;yRV9r=-~s5_ayK@29hao#KE74UQ(}&T+FCy1(`A z2(A}xaf0jjdhL<5x9!Y5J+D8P-Vdw{@ar#;>YD%AT=FYe$?l-fQcg{D!=szq1=CMI zRT_23*tUiGNAI3Re>3nR}?@N+*Bn}{#TM6sB zWbe#XLk4!<4Bb1F^%=KQFE#Ns#4+)H)(@$V)F~a=!=h=(&b`sio%+Nb>!93OBTvoZ zzni(Avso=<9}qAq(r(IOI&#&eECD0MzH+ULunB` zX+gM(o{74zDE?28=2OXJkPB`&l<2s=5WPdP|WOP6IT={iqpr_Qc$jhT=We&K6p&_RcT!qGMYrlm)J#VNEyGNlkW~i{jAbDfW zZC(DIZ9|Kbn`cf4d&^5vQ@swO3X`w7gKD96>EG<}4tgd!FtZZIH?nt^E)4oFcs=)G z_&HbseYJIuJZBi^Q}u7fE^P@MDk`yJWk2tDJ;ff}M$UP|dXFLzX-k^Y{*xEHt2qox zJcPt7g~S{Z+Ia_@BAy1QkhMja6b=4F&RP_AMM*JwkMHRjH88M|6X26OA9VP`mLWVp zJH4~YGIbh|!hF+YWDsC3C@7l+JVdBm4sUoE6Lax9UcX~OL^49xsF~JHW`HpmFsb=% zw!0~*jmwj7y4Tc}Wxl1VsW4m}reqGL?$6y-{OYv~WUbUw4vi}_{*CHYHRq$(D|lY; zVE35~)JSx@L4`oRox~=(fRMP;}H^yy#igG`Fn z_REz_54BGkINr8jetS70Q|a)HEzw6Vx)$qa4}bJh7EGecv}7Hcy?-Au!ZLI0JX+5_ zjHEuJz(79v{m$d&=5E*Dk3gjz@TMtUI-O5hoj5RMstA{}nQ}%*9A(UOvWtcY{58oJ zsnp6Zj&+PIAL*R zOy3WSr_>pt^x`zR{w;EPyrDrYir8Qz`b=a5dH4w9wKR^C_wiXawf|k1Ys$Uz`=*-* z4Y;s9d6$I^wVwqg$+@%|DJLgKnU0akF3XdW@{3XqnQ@LUjhRr&No+}>X^5rLdOmiz z*+>nr;YU>yS&1>UF>>r2@=JpKFHg{C2pMIQ*W@Hwp+1U``*YHiYE;SEtdJ(6Qo;H< zvdDAwYsk@_yrt2(rinRSgC}v$ok0xZI2S}8)+$bYxUv{6F7>PCL;zremfcZ?&$UG5 z-N)|m_1Zn4jQbiE=NSDq==rq#=X*^&{Gn@{#HSc9fS=|3I@0R&T8^z=hy+JYs9Wvk zc$aO>f+H`o+S6i^lDJln3MP#g4{b19ILpSw6!J!QUglfDRNh7ptDq6;0C@h{y#6Hr zs98rkP?~CY`vB*gi;7n#FI@WTwq0CP=Hk+Cv%!)@-(&uwUjiVM{wO6DT3T4e5+>Ln zW%Riyh32eDrk9Bayx@&^FDlx-KSFc^w+E|~8nTq^H?f)OJ=CCLYuEJj{(Z@P7ejfP zN0I$@Tef@bwXDarF8un}`C`khTdh^dda*7KA(x9J)_wSFC_CVG;*9Emr`cMYsXlmj;KbCMScXO;%V6Ujtu#^E$kw@=pnE6T}gXJ&XR`Jrlrlu zXfp?M_}m~~|Deq?pS#)$d#+}V8XElK(c^7XEXlL8MNtpDoOjjLv`t6mg69vj01vzl z)fnIdn)4luuk_?Ke4A$5x|Oi_S@*v^j3BlcfT{q=HVF&M$#KKJeW%&_R8~ac4vJ0jUL>}mHv8k?h--uuk&jUu9axj^Af3{~7Eh``M%PSshW%xa?R?x%C zVt7qJ03q$8)~Tx(e>!H4o;WT#c;Z=TcY)(mlmrM?qgu3B#nN98N2_{z^g*J9bWvBb z*uM`5wg-rV*nUJ}IT^<7E$r;O2=Zf=vEujc+!tHf+4arr3rDswFfu-XA?`i==sU#3 z&LZFNGK-y^T@_IQ9GuP|FtI~aR0Fkg)F|}L5DBSnYB~cBr2@g?;pG)UftBzu+kX7f zSDdU8Axso>h@w7dr5Aep`Ygc6YE#&TVmb9u9JWM%AKDUr{o)%XRC8F4npdq4e|KCt zEcManbK%h(;l3o^?b|=6gq^yU{Zv^=d)LpUsUzd&$2}oVeE;;szpA=g#o9VmN%Udv8TowNj`o%zV=aN3Q(n&u}?dU_sg z;*lUf>rG3x2W`fDT$|<08QzyKUeqbB?YTBgA--mcn1BnPbM{m>!r~z)vYQT;`$;#Y zBqs}iFb@7+o`RJa2gcT2+$Jg#_(z)B+UBfgfb?;2Scf2a@7rumM#%i7xV*;#MruwV z?&+gwJY)qniBj-ak|9hn{-wek|dm*V5&vj*bs zp}5H2?>~BzPHv2gzMI&Rb6LyH%}twAYhnJ6>D{0p$7feYTxh}dQ$px!K0G#75A^WE zDbXAmESaxzD)d5^ha(>5Z%e=4ozpBk1kVi;5oWc%KC7(jH`ATZa``nzp`>SM?5x7z zixxAXCLnkO!{L#mC|l%~yLA_vbhO2vXa9}`<~GZkol7gB;*xJzSlIlRsVT3<=^)A@ zRTTy?lXrz3NreU0DUvC%=2JcFr%qE_HbE+;^ZEKL0uBZ` zg#a+{_V)HyQO5T4Jksy8=7p+GywtLu@VhAZcoLhYZbk`2F=%#*S$0(YW^UBmc`9PbDH8qN0sUt{eU-a)+U8N<#wi?f*la zo1R|Z3=nL)mb(!mw$A_V1rU*z-UfXI5yAH8S+hMs-}_7CdYkf@1X$Yk{rOY=?si*{ zi0incXhWPWucK*_OOvAW>4^|ISGv;WP`hqQs{OU$yQSm12P}@0donpglmY_-SpXIT zBKT#_R4kZbL`|ANO8Bg;KFl-R2xP>qTk8k}1@OAs-7a=us1Tsr`ltg0q#-WPmY^k$ zj_$%MZ2cDr78A1;YTR(Np9U}yGGL-z2Zby8L;wNc*2_86k}>HS_HZAs{5aQHy>yX- z(C6nuHgWB^A3Hu4&eFEQs4PC9WoOmD)vfP>Fza8j-D~L=KBwuN>wminyaU>ZFu@0x za2h)cKqKLNW?*8-hDr#|B$!A@W9$OgvK2{H>jHr zk;5PHD2D})-5;9o@m}D`Zc=!&HkV%JEP0qQ-+RY3KEa}v-j6Zm*%np_Wnbt93r7jp ziT7X4Vzmd=QG4{Qimk(I+T?szlIg#|XE}k&K;5aqF9Ey-Z2Zm1l@s|ZqGddw>dVVN zYVxD$jvpOOoHD-mQIZ){fZe-EpwFz|KuyQgZr)jalC=l0q)ptu9@DhFee;DUgM4w+ z9H<;93XFdT)=(^>hQ;OCGm?=JGRWlsCpaAh+}6s{r@r^bu2)uJ zc{7Huj;^VxzNmeF^#**c`uWrjWt*^fjFbMJxdU7K`G;W?u3)>KgB2^^cd5JW6FsHi z#=L%G%bfjFC3il4t#BoK6+tUjR#-`pP zsQ`DEmUP~>vi0)rBnAdqEnsH3JqZ^E^Xi`z;<9gU&E5$&rJk;Vi?Tg%2&>DsKO|AY zWr?p07b<$M*OTWi(O;x9;a?ll;wd6bx1Ql}u|o9Z@OZj&m7I&U%mx{mOYgS;?ms{7 zI&|x)@+ore{$0vefzu_rtV1}dg6|K20xHiPj;-s6O+DL{fy`p2eEW>Jm%Osicm?|1 zRr7VcL9|GJ!6W~{{iF3d%a5e}+YEhmFRWLKdmg`Mb=mlbi*oDH{f6mfOa~0sqtYJ~ ziMY4w?sxBU3=( z`U-h8lowAEu8F4q`3tG>g0TK_QcxAz0=^dv9hc@TGqlXSUilXkjOjS`NXK*8d|vl^ zO2+X0AxpJ}z5_dxWJg-g_{BN2pUX{2NI&xJNq|$k8=TT{4o-QU#MvbEn5?_@+zZqk z(pFcCzv-P(%-H!7D#)+zl}m%NPaVxNg!*5f@HxTKEX}WLyy;^s?N)X<_giFb|9)@o z3t$X)WR4e{&+s+&ruz1=u)u{^t_$#jQAia_(8Rz_@H{#5=>85Mc zw(ZtgL&N4PvSQ3`)AEmfd}>33QhAKZY&#O`IcW*u?#OBKuoon|Xo0 z48V3d3I$h2Bn}7OW6rROkzuk%bu(@=2dURf=9Oy}F`U@bG==(Te;x0PW27Oz8Q;GB zt+y7JCY*<^zTe{I-6^JikCoLqWSb26`Z+WZ;r-bdf7GoY&kpre_OB%i-7)$k@~{)x zCjSW|Q}Qc^^*0X`A8?blTO(x5x?8xxfLE6r=K|NJ>hzLmEz zFw`kg0+y6wb#s}!{upOMGdo2#^ZuPd$e*sKHws;v*T`{ z?lHpF*KJe1VZ|?6jH<5D<=6Va)L5H2QNCieLsXgPcFO9T2mnl7{xK%cv4goU(_T`I_QwOvcTu1ZF?_JRKTcgYIJ;qfp?)odVMu564r8xO{HZ@Zjp%fBU@P6G*B+^+i|f~}l!G7hlDtq?q7 z+s|@dOHM@N6O-u7r5#u&K{uE)kG zPTKArI$en2*o3!k;fjEVz6V_tVDcq!e~6vl1Y1i;R<=m57DnjZA|b?~_KL6thOrl}xUjHCWeXn>Ja$Yl(MR-t;`A8HeJxq1Q^P-NoBp1?aU+nd zG)sTi#z5Vm4DY))(Q`KNL1ZL$EcfB`x@cVA)WrU@c{kb_;FJXZmZPg{6uz(RN7w?Y z+uC&CMuUY3@;>!Z*a{qo;|4P+8~v16SS}Vhr4vwfsG{`r$dz#jrc32U>DS!YD$oATJ|a~puAnsn-A4gA7q3r{4lUf zH)+c^$sn*(6q3Cj;2PA6Wt$g2ohUN8J9abIn#%L9_^ZpTpI)$EoqcA%(Q7KV`(>=E zZR#CfMQMcS2*9jmyprlF$30Gj#L*B6Sh6W8)@MvU+)A>_@+~`3LCSO0E|0((&JM@Dv@zSFrtfPv8Ws?nG+{TQv+`#u1IG z6L%OZ{AlQ3SvB$5s{MKWpqdz8c)>PVm)zS}W7{~py1?bo<3D2a!2VHl!RsF-GqwEX zXB59%n!jXv&c(v>(zyy*yp=yNce>hf%4&0;XKlOJ7%!(k;T)nQ1dCl0r|s(tkQbvW zE{RCJ{SLs!xPb2N2eyox_RhjlU;MtZFRNkrpvH7 z9XWC&J$TRZlBaleb@d@2GY*IO2^Ac6Cy~iME40urXTGP%UZh8BpQ1mVov*t&e8=uz zb!={n!JJk(9wX_O=+myx(sYF8?XN9^U%!rN-j7iIcX6CMy`ZEG(NU<$Lc4a+1LWp5 z_9Or(bqBA$;JxgeSYf&3I~ zXOi#W;3bqPda8hwV}{SAJsM6+G!kJatcEoNxB`!nv^aj}5ZYcy3FA10F$#wr#HL0F2)`@B9*exJ{?}tX>oJhfAUKB+Fxa)9VPn& z8R^1zB`|m8H8ejJN+)}l*6BM0g7>#tUQ|E<*uf=jd-|P?CEjNej{MWq2#*VK{2(~d zc*0L#xdH;NTAZ|cu+me)_XCt&xR5g8*4cUBK+_VRS#2mA4q6vWJqux!RKet$46EKb z1A{9eg(H#rM7sVzyhVbrCbf3}O1cx}COSrr?Wjr-UL?XDiuM7vYFIZ=E_e@40%}>P zT?AuIs)LX9r8wxHk;3Y+bqEE+Hm5_7@PGXHk!{^9SRD2}`Q5Ef1~CC)DS?TN)s>YeG7E+_ z!1?Ga#kq|IGuA_0z--}sgrSSTY{M`Sw@5_uQ3wlyXNPE!1m`PU&$yBD?%DuW??f?- za9t5ips*aqMZ@v-0SJ-mmKH6*3wHvX@Vq*fQU^oQ&K*0*jCB40Iils*t2~2!1lI9; zdqy0d;#0V>0Q2YT)h6XRPFU_L&)|RGMZspgNa6C&AxYR1{faVX>%zO`Z`P%~)F+(U zQ)ftnv9?Z9V~>x8^0K#GeCsX8)Q%ll$R1HTsBz#Ji4+EhwwwQs)c5VYfUv?~xNH`-fyaL71hmXIKi{3xL5Ea|}@NeU{*5lU3gUKE7o@`t+Ai+%K0dQ*dj_y&60Byov!_AKe`sw`Bjeqj?S!Ei0&;bY$~K!qSI zcKQc*9dbOrt4`q$ne~gVaa*5b;CP8`R-3n9b2A!KymCnF7yjO(8(|@MZ3D53)PwCE zMQp_D&wV%bg!bD%QI}`YNp>*az6a?F zZtHGs+q)-Ds_YGMC?S1s_Gn``QMG-)0rWP17Q=eH}o^H?A?#C~^w3|$zw z>YF!tSy( zfZs;tYipYC`{6OoEp69DMTx5|2ib+QoBg*}WSc?ZZ& z?|+^yE z+tT7d)L{EF^XnHG-ZnAkaqUyL+unh=zkc&(C4iQjOT9eM6e&x1Gh29wdR)%_*Ipi% zY8XXMOm=Fr=UJJL#dk%D@XDVSOurux(9Sa5n>K}1U(kV^VAC4L$M2*dQ!AkYyz+l; zzx}~3?#9~6qR`>PoLF%x(d30Ns{sVQ>0Z z+ZHsg(Ko|Nxz6{>K&c^_94TtJH#0Lc8-LRFBhjqklGrKK!qK)RMp7ATF?wj}n-NHy zE7Gc$FQ;LRjyi{?1-)G>J+-_b*j=t& z)n_}sY(wYP&^l6P6chVTCHH>7S6Vff;=%=F_Ax)dR?+=1nl4Kd-ra@ z*@le%hxc%3!KRau??@+?+5aJZ;*wY=LDD4=Sf!c={Hhl}Vx&Xu(Eh$?h@Cf1P!mu8 zPRdAKSze%8TZ(F@594Q=?9Y&UrxBA>atr1tv@IYWIhzMBUJyf*0Zf=5-iu$ukZT%O zTxH$GBY#{lMRymgDf*Yxixy)6ro!H(8Xa+(3$I(5ua=~uBT|!aKmM_#XK5*nee)+s zYkSR*uyAZ2&9iQPC;WV9lxTW{3an1e123=A=%FD~Bx|01o>oMQNWGpb2f6TKqo=>7 ze(8M6$svVW%jReWUSySjus|pAn&EaJjd;5XB`wuix5}CZ(Q+KQFcByu_x)$9)|oF)0{D)jP(AMqX)ex<C^zNy=J@%-{}&}=X@#4S&NhlLzQP5q%cVTu@;;)Ro_|bgdZEWTN>@e(j1}K1G7uD( zI>i>4gl#?<7=T;uY!xrl|LNfyOwH@)Cr)=?@Acb}^x<$dI1a>t%w?*Zpi&W%h8~0! zl=hp8T^&eAuU-|yvu5`XwGdn-TQy?T0;`SYNP1>)lKVpIi;KqZ5M*aAR&MT%{uRX5 z-1Z}4Say1^t7~fBfjPH*dpVbu_kIg;IAsHhi#^nN_|kVROw$XWXw`B-Ppkj`beElE!_S&| zE@NN|>q$Phqg4%4AE{?wWN!I0NE1#xTC#%I&`UK4&BtOQR4zTPyUP~Jr{iD!&-B6Y z^J$pEUMym;ComNb-Q8ynji%lF0{K}^j<%84ybcilgb^P$eUP}X^nV3W9vl@>q{N7< z6^;z|6B6uMuLIA{DP{8j!zTz{`d}`p(^&iLOo>1lh9Dc%_n-6g4{?l$+h!{$h}KUJ z|DT5Xciq=AKBnuuc!u8?`tn5p3e~@C|H6Oib=DqW`dceGWjz)%vF)+35B{?dbP0;6 zn&a!bw>Jy=-ZARo$i(H|1W+*Ot@*{wzY$xHm{B(OvJPfM0XU)e?}jDDl* z^*A8rm=w9j!qP^8LW%9G%faMiUvw`S3M#4yNI_Y>WBUxm?ng;?qU*YN4?VW<&d|q( zG~+#hFScjC*bg(Cf!`*|csm z$F^@j+H>2|ibmHcts^y<@ly9e-v~OglL{>@)xPs26fw&lPWNr>b!JEF;d}RqhrW#g zn<$$LmjPj6KoG^{_V4k1k5fFz-@4Zzwm|*WTbX_)^Jwa=Hn9-8T)lOjMRKb7t(cf<7y;LdE$y~h>0n$KR{#G zO){&s30RMe_McI|zGA=I8*_(4VH+Ro=elw?L%| zJ3^gfw-KkNtG`m)H%Hv~4f!!TVq`7??t$fffMpi|_gnGh1FqP`(0_Ly>TjK>p_kQN|3*~jD zE6iza7TS@{qDD!pkn`dKzlczAJj*-_H9~u@Goe{FFJ<*76TY-2jmvx+HtZNqPyE{> z}-6X#?g!1t=pENtJw&}d(bNkNL=bOYVgY5^0ztS98-ape}OrU&zO@7CQpQTOU zAD2`km$3^c^ghvNZhsxO@2khrG@F~%)aL5`ZG+9qxeCA6R?jRq=i?&Gg)T68FWY6X z3j@&1!H73E3uxyIBF&9X?4K>3wz)_f9)Tm}rkm?uUEvgS6Jy@G4!fOp`o(ct&*cmp zcIJW`A!2DtMK|av|Lt)A=;dAZ%&*{NAKw7F>_R1rR|Uaz zvuNgsmJdzz3M*Stp5u^M_j`mrgQ;{vG-H!dnUMzr3Sg8vDgy&Nm{M$LA%vL2(APi# zGcFQ|-A09cOq*zbgZR0~(ZKQb!d1gg+1WWfNp|{!uWNJEhO+B(RI3twY&zCs$gs4r z;3!^y!1m1|x+C^Yef!ufZFhZ?nn;WZu&|n5<4a2`I-04@Z73G?kT%DD)5mD4$(|Ii zTVTZe+KtP1&aT^xkZ&t=ug^`GoZbW}g1f`Es- zfQoV#)5U0l87^LU3pPmqZtQ5Ib;HJ~E?m!6ZJ30SuCaIbrv}NJH=QIyEb1E{Jk2nC zA#z~4g#D_kD{|)+;^YVj3>FkSCn&Qdi;o<){QRf=}R6RfxPzHROr0ukAqnWkhiDGfIxSr|4hkZq_ z@02NGMr)@pL)>KKVJP2D!~?hV72(Zq(xTmIQDxs$zO7<|;_B63W2sb_+%^kQ|6STA z=9H>I=lLtVf9FKMVN+nSD{)x$>c<63xb6t!3|bWJ(IPQ1*-7wkeHL``+I3#}5p`T!mCJK>3cZ?Iqpk+lmUF5p%>d zcM1l3tdO#AhjE8`5c;&p?3({~OA~%;tGXSkYO&8mFit4x!+=FD zzwFoW9A@$Q0iS5_&{V!38cuEwd&G}>rg{5zIpn*WUw~TwH_g^*<8nis-}1B-1`A79 z1);ZZy->ynj@{sIM@-qyU;45wFt;5R7p~G43gx3kx8DhWba|EGv-wP3&YbRiVsXi9 z2~{H;kB^4&9X)2*85wI1XT>AVZZWFScem8pmS}DOzVJuO?Gjj% zteWU#oxm2vP3w1bZe#0~bG6Zz#(p_~KPPOoY;Dt{Ltmi#uws5=S6g?Xa0?Q0?5mCO z8y_iTSZsm7FkgXn=l7DV`!o1$r#VB)gE@VxsTuiR=6X1krm?5eZiL%VXCuCS-n--K zZdqk~M26(2vWOpEiFFtyA3u7hDH=4k%@}XR;kRs!&w79lM>P(q(-ZUm93WFeF|Ut0 zPew-`UAK;eM&u}{Zfy1zd@=`;TIrf;>0i}`g2Q?w{ z?{duo?7j9TttiSleX16zuC_95aut6@=ZDu~V|^-Fy0UbcJI8zF*Tk5$U6{1#tw`gB z7@9}2$vyjF-+yJrBz8mM)5{qDGK3Y9=6)`sxCH}5rlH>>o<6=@RIBFYI;zElYXmAo zf`h9z$@G%Y*%RstH3Bv0wAE?CD)e8JX{wND{NJ;aJ{f)Up9Io#PweFo41@|`-CH2u zo$n9^0oHKxN&1cB&PGZ~cS!ewgM+zll#N-lu(PwQJS-enz7UN)IBF46vuKe*4%IZ+ zFX5U=$#Q68S72xNA}bsJQZ^c!Cmex593~8eJdel>r(b)XjP!)si$N!VQ(ht0u zri9zndu2%l!D6^MiT+>zl>AZDAWHsTi+#I5XdqmyFteg>uSp2OTsV07Ga236wnK#k z@_|37xVRWB?7B=d_cT~1sik5N4h{OfoT$j+J*yHv)nj{U2H)5Dee+YnGxE->&kCGv zORSA<1(kSPSy(WT0EuU335TH*XATKy!nSI#aH4P)Bjb=jp$rcXQ}70ej$Sk)FvCRs z1u8EK3rwwSq-^wDvsHs{l5}s%$M`QAHT|~>G~Wj#F;l7ECx8o{#%49a;lN#XJFCHr zsCG~cv}Cp)vD!Anr$l153ks&A*^!^ek2F~&GJE~Yi&{ebH(-Jt9vQjF4?}0$k_Qwb z5^11pIr{m3_(W@)Gjt}^+$oiWbbC!5Dory!Obcp_btnioOR>tz> zWb?@!aca)w7?#a}Aa0 z0{^Hgr4|KNe(&E@`*bsJ!D~2wUv6oYTY z;Q+NhAE0->t?);Z;;N&l)%*KmPzvHxc(I z3O!4QoX6n~M`_md{~8qGO)V;D>wKXgvatL?bCz|!kV(6$Ht{PM@OjQ0!!M%y0l=Ya%ePLtY*?7x@T+ z^@E1I+we3IRT^|g>!~6dx82#yyB9bFf{Fk*f;6k|e^Hu|6}Vv8mag+TLtp0S%*;J> z>I6^6J~vd^F1;mae3)AI0u=rZF0HtI`|IsDK3IE{-2sP40$iA&p%1TN@xgAC? zhU!{_ads;8I`F5K8RZs3=P}dWZ0-CyHAsMFkWAWdHAW@SnUqrn=+rB2Nuz4#XbqFGmNkDv_SJ;wT4XXYXm)>x-p;O{Z4&v9-Ih{oXwq?Eo(?Kw)d-&D($o0Vu z^=}OCin3y%a=QFa&cWa~W9F+P8xeiMK8c?&7zdq_iadD#1mHzXXtaz9{vCCBDg17m zA>`dKSzQ=I@k2X~@LpnP=8u8`z8{4vN47+ZHw_CM>DA>mC1NSm?{Y4ll+|!%XEoh* zHqWmv1niW-a9p6~+rY6f<6-zZW^$IT)8ZWiF*!kInVFmOf3fd{0ns58b`&8gsfWeC z4UZpb%=ND=T$s7gv6*jF^0ca|BYLen0T69(|H%JkJ#kuu@Zyifz}{XInih}zBln=% zLYJ9C9ejKf-4$Qe8YwLy#K&%ZjAJQrJ?Jtt@xQm8(jRkr!X;&M3yM~@@Whs{j+wl8 zw}9Fr{N;!@CV)obhm`exVtK^h3W2@mpI<=b3ST<)7u%!0QE~6`;&d$y(-B`7 z=%2uLRDizdXnHUQylnXu>B^QCl-(Ap(RqgFpx&rXo1^I7z3<9a=l?>phvTP53*W-&RF0vC2BG#Mq4&n#L846w$4U`rU&H|K0^zemvf(Z^l-wXx7d{O* zpY?XWT^~^)#Mlx-&|j0LCFM-5&*~gMhHHKEiR(6m0E2e#;!sIW8z(Aw$yzo(3ha7g zW!Cb1&0)Inc+xn(Sg7J$W9u`rpOVH2wT-7@U06E#+SO_8c8EMM_t>^xN_gn3w&g*S zdu%zrBRVWjX3f;MALd!z?-Dkze`cc1Y<}B3X|&{bgpZo>gcq;e$4Arjjn#iG8yyl3 z^9=tS{i$}_Kr{+k*Yg9$rGLLXdy?_uYj0;~>W2@f?fQyz9zJ}yS5)-8x_ZdB#(3M~ zpFb_UnEMkTY1Nqe_N{?^{xZ`}npJN5;yd@g%>BX85$P*%teo6!Vz)5abvG~&8lGlP z=ifhbY@D2F@C(L8@AvGyA|0>br3aH*#ILe8ll&f$td18jtEm9L9${)~`XDhe3*nd; zP8stR&qs1vnwn40T|7N6?>t}FDAV(e{A*5+CMG7N?0XNPvxv$Y%ZB?M6AwEkr1tFm zBz2y`BGH&2{{sDGMGOkg($H^i#Z*Q#0)1n4JN`Xj(;!f#r=^AOkoWw377?yisBh{T z+e)eZd=Z^U!E~4(ayVW?Jx1bWzQcgD_{HD0*4FnLEWaL5Ki1yeoerRxg_YGl0fCCi zL*)m4vPrDxgc9)?4jSyPh3)#^UWClj0+-~llWZ=wns2_|4#Ag`I(QImeKlN)4Mjvm zFx5q&O}nW}&a3$!eR3-2)YR09f1;UFTYGyf%lj>OXoM4+QUEN2hS)TD$Ydwx`pp3+ z(A7vxZo`cJ?yB{i85tSyF5VxQj@l8zC$EQ6dmBE(?y6&mH0_Be+!bdMw6V2KPfs77 zcOP*n&V?%nA4V#!q5a2e6As=QW}b$I2EDg#ul4lxow4nC^Yzw4JZTfibEm(2IsErz z-QazOTfxWt=`Ih~g-_K$iqX;4wK|tH^B_K61fLJMG~3oxO+0K`=-uQp-EW64G;*zQ z$BIw#Z>UEKP8Xz<7Null&?xofhIQ1S0GT)+sHMAyxOp&g-cPz6 zO(`&^77&t@)Iu}l2LsbY=NzZ$etGP7(m_|7v^KG5d~}$&T}SxBu;>0YSV4n$p*5B^ zOXZE1(O9G{i2Xn}A3Zgdj*iZry?amdg((|l>3WwLW8-r-B;?`1v@T4O7}@G-yzWJ^ zjrRHa8@KI0YhjVxn5dW)85xR%Bex)L4_(3iS+7VrT`s@?gFpGALOa$G%D;qqIF`vP_My&c@oHbIk zG*aGp_)(P)VL+2^?#D=kYs7tdAp@u0wfc^M!t2U+Omcb@yp~!Qu#&%pzbzSIyuIk5 zh9hWtYU=v#ot&gg&Un)?DvV%^Q>;kM7$L<{QI%gl!K(N$Jp2j!0i)gf_Nn4qJggr% zXJo`z%|R*(JkCgx$2xu-rvMvFmIKq%3!XIS-HaQhV{Du?K5oN%#O*Ae#cm`uu`saS zsv=!7B;HB@t`#^7AE7PBv!bG+#~&}h>DtQAp9OO?3<{_2V=CuBOW< z@n7$<*x1+yQBjMDqYUe)(=#)Fh^?-!c&Nm$z2PMdE;>drkj9R|Y#EEJU)j>PqC{ez z$NzI7xScCF1`5;kiHN`902G-qB8B zyK7-#5v$-u=za9IsDO NIjKR;Jbvls{{Y{yeLDaE literal 0 HcmV?d00001 diff --git a/examples/test_performance/make_data.py b/examples/test_performance/make_data.py new file mode 100755 index 000000000..4f0b8cc29 --- /dev/null +++ b/examples/test_performance/make_data.py @@ -0,0 +1,65 @@ +#!/usr/bin/python + +### This script creates the data necessary to make a graph of how +### the latency and throughput of an NF chain changes based on length +### outputs 3 numbers to 'data.txt': [#nfs, TX average, and latency average] + +import sys + +num_nfs = 1 + +if len(sys.argv) == 2: + num_nfs = sys.argv[1] + +print(f"Did it work? (make_data.py): {num_nfs}") + +file1 = open("../output_files/log-speed_tester-1.txt", "r") + +TX_data = [] +latency_data = [] + +### adds the correct values from the log-speed_tester file +for line in file1.readlines(): + if ('TX pkts per second: ' in line): + index = line.index(': ') + 3 # spacing is weird in the data file + TX_data.append(line[index:]) + if ('Avg latency nanoseconds: ' in line): + index = line.index(': ') + 2 + latency_data.append(line[index:]) + # if ('TX pkts per second: ' in line): + # datapoint = line.split(" ") + # print(f"datapoint[5] is {datapoint[5]} with type {type(datapoint[5])}") + # TX_data.append(datapoint[5]) + # if ('Avg latency nanoseconds: ' in line): + # datapoint = line.split(" ") + # latency_data.append(datapoint[3]) + + ### alternative way of adding data that uses exact spacing + + +file1.close() + +### find the averages of the data + +TX_average = 0 + +for x in TX_data: + TX_average+=int(x) + +TX_average /= len(TX_data) + +latency_average = 0 + +for x in latency_data: + latency_average+=int(x) +latency_average /= len(latency_data) + +##writes the data out as 3 values, all seperated by commas, to the data.txt file + +f = open("data.txt", "a") +f.write(str(num_nfs)) +f.write(',') +f.write(str(int(TX_average))) +f.write(',') +f.write(str(int(latency_average))) +f.write(',\n') diff --git a/examples/test_performance/make_graph.py b/examples/test_performance/make_graph.py new file mode 100755 index 000000000..b6bc1c60c --- /dev/null +++ b/examples/test_performance/make_graph.py @@ -0,0 +1,110 @@ +#!/usr/bin/python + +### This script creates a graph, using data from the "data.txt" file, measuring +### how the latency and throughput of an NF chain changes based on length + +from matplotlib import pyplot as plt + +x_axis = [] + +y_axis_latency = [] + +y_axis_throughput = [] + +file = open("data.txt", "r") + +for line in file.readlines(): + linedata = line.split(",") + x_axis.append(int(linedata[0])) + y_axis_latency.append(int(linedata[1])) + y_axis_throughput.append(int(linedata[2])) + + +# x_axis.sort() +# y_axis_latency.sort() +# y_axis_throughput.sort() + +fig,ax = plt.subplots() +# make a plot +ax.plot(x_axis, y_axis_latency, color="red", marker="o") +# set x-axis label +ax.set_xlabel("NFs",fontsize=14) +# set y-axis label +ax.set_ylabel("Latency (ns)",color="red",fontsize=14) + +ax2=ax.twinx() +# make a plot with different y-axis using second axis object +ax2.plot(x_axis, y_axis_throughput,color="blue",marker="o") +ax2.set_ylabel("TX pkts per second",color="blue",fontsize=14) +plt.show() +# save the plot as a file +fig.savefig('graph.png', + format='png', + dpi=100, + bbox_inches='tight') + + + + + + + +# from matplotlib import pyplot as plt + +# ### we need to make a 2nd y-axis, so we use the twinx() fnx +# ax = plt.subplot() +# twin1 = ax.twinx() + +# ### create empty lists to store in future data +# x_axis = [] + +# y_axis_latency = [] + +# y_axis_throughput = [] + +# ###reads in data from file, adds them to empty variables +# file = open("data.txt", "r") + +# for line in file.readlines(): +# linedata = line.split(",") +# x_axis.append(int(linedata[0])) +# y_axis_latency.append(int(linedata[1])) +# y_axis_throughput.append(int(linedata[2])) + +# # for datapoint in x_axis: +# # print(f"x value: {datapoint}") + +# # for datapoint in y_axis_latency: +# # print(f"y value: {datapoint}") + +# # for datapoint in y_axis_throughput: +# # print(f"y value: {datapoint}") + +# #ax.set_ylim(30000, 100000) +# #twin1.set_ylim(15000000, 40000000) + +# ### plot the data +# p1, = ax.plot(x_axis, y_axis_latency,"-b", label="Latency (ns)") +# ax.set_xlabel("NF Chain Length") +# ax.set_ylabel("Latency (ns)") + +# ax.autoscale(enable=False, axis='both', tight=None) + +# p2, = twin1.plot(x_axis, y_axis_throughput, "-r", label="TX pkts per second") +# twin1.set_ylabel("TX pkts per second") + +# ###creates the legend and sets colors +# ax.yaxis.label.set_color(p1.get_color()) +# twin1.yaxis.label.set_color(p2.get_color()) + +# tkw = dict(size=4, width=1.5) +# ax.tick_params(axis='y', colors=p1.get_color(), **tkw) +# twin1.tick_params(axis='y', colors=p2.get_color(), **tkw) +# ax.tick_params(axis='x', **tkw) + +# ax.legend(handles=[p1, p2]) + + + +# ### saves the .png file in test_performance directory +# plt.savefig('performance_graph.png') diff --git a/examples/test_performance/test_performance.sh b/examples/test_performance/test_performance.sh new file mode 100755 index 000000000..c21c8aad6 --- /dev/null +++ b/examples/test_performance/test_performance.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +echo "Type of script (iterative (i) or selective (s) ) = $1" + +python3 ./clear_files.py + +if [[ $1 = "-s" ]] +then + echo "Running selective version" + NUM_NFS_LIST=( "$@" ) + + # check that inputs are valid (positive) integers + + VALID_INPUT=true + + for (( i=1; i<${#NUM_NFS_LIST[@]}; i++)); + do + if [[ ${NUM_NFS_LIST[$i]} =~ ^[+]?[0-9]+$ ]]; + then + : + else + VALID_INPUT=false + fi + done + + if [[ "$VALID_INPUT" != true ]]; + then + echo "Error: your inputs (desired chain lengths) must be positive integers" + exit 0 + fi + + # run manager at each chain length + for (( i=1; i<${#NUM_NFS_LIST[@]}; i++)); + do + echo "Running ${NUM_NFS_LIST[$i]} NFs" + python3 change_nfs.py ${NUM_NFS_LIST[$i]} # adds an additional simple_forward NF for the next loop iteration + + echo "Running onvm mgr" + cd ../../ + ./onvm/go.sh -k 1 -n 0xFFFFF -s stdout -t 30 & + + sleep 15s + + echo "Running ${NUM_NFS_LIST[$i]} NFs" + cd examples + python3 run_group.py example_nf_deploy_test_p_template.json # starts running the set NFs for 30sec, enough time to collect ample data + + wait + + cd test_performance + echo "Making data" + python3 make_data.py ${NUM_NFS_LIST[$i]} # adds the data and averages it + + done + + python3 ./make_graph.py # makes the graph + + python3 ./clear_files.py # resets data files and nf_deploy json files + +elif [[ $1 = "-i" ]] +then + echo "Running iterative version" + NUM_NFS=2 + + # check if the input is valid + VALID_INPUT=true + + if [[ $2 =~ ^[+]?[0-9]+$ ]]; + then + : + else + VALID_INPUT=false + fi + + if [[ "$VALID_INPUT" != true ]]; + then + echo "Error: your input (max NFs) must be a positive integer" + exit 0 + fi + + # iterate through each version of the NF + while [ $NUM_NFS -le $2 ] + do + echo "Running $NUM_NFS NFs" + echo "Running onvm mgr" + cd ../../ + ./onvm/go.sh -k 1 -n 0xFFFFF -s stdout -t 30 & + + sleep 15s + + echo "Running $NUM_NFS NFs" + cd examples + python3 ./run_group.py ./example_nf_deploy_test_p_template.json # starts running the set NFs for 30sec, enough time to collect ample data + + sleep 30s + + cd test_performance + echo "Making data" + python3 ./make_data.py $NUM_NFS # adds the data and averages it + + NUM_NFS=$((NUM_NFS+1)) + + echo "Changing NFs" + python3 ./change_nfs.py $NUM_NFS # adds an additional simple_forward NF for the next loop iteration + done + + python3 ./make_graph.py # makes the graph + + python3 ./clear_files.py # resets data files +else + echo "Error: incorrect 1st input; must be either \"-i\" or \"-s\"" +fi