From f682ace08a827bd260e4905b5ee1bddacf01c6e0 Mon Sep 17 00:00:00 2001 From: Anssi Mannila Date: Tue, 28 Sep 2021 13:11:25 +0300 Subject: [PATCH] Subscription REST interface update - Error values returned to xApp improved - Posibility for xApp to set E2 timeout value added - Posibility for xApp to set E2 retry count added - Posibility for xApp to set is routing needed for the subscription - Info log writings changed to debug log writings Change-Id: Ib8f5c815c4e05b4784c2435de8c38acd41ba07bd Signed-off-by: Anssi Mannila --- docs/images/REST_Subscription_Notification.png | Bin 0 -> 74268 bytes docs/images/REST_Subscription_Request.png | Bin 0 -> 124603 bytes docs/images/REST_Subscription_Response.png | Bin 0 -> 77245 bytes .../Routing_Manager_REST_interface_messages.png | Bin 0 -> 52170 bytes docs/images/source/SubManager REST pictures.odp | Bin 27801 -> 31034 bytes docs/user-guide.rst | 120 ++++-- e2ap/pkg/e2ap/msg_e2ap.go | 26 +- go.mod | 5 +- go.sum | 3 + pkg/control/control.go | 439 +++++++++++++------- pkg/control/duplicate.go | 4 +- pkg/control/e2ap.go | 2 +- pkg/control/registry.go | 95 +++-- pkg/control/restendpoint.go | 2 +- pkg/control/sdl_e2SubsDb.go | 17 +- pkg/control/subscription.go | 10 +- pkg/control/types.go | 30 ++ pkg/control/ut_ctrl_submgr_test.go | 43 +- pkg/control/ut_messaging_test.go | 454 ++++++++++++++------- pkg/control/ut_stub_rtmgr_test.go | 8 +- pkg/control/ut_test.go | 24 +- pkg/teststub/controlRmr.go | 2 +- pkg/teststub/controlRmrStub.go | 12 +- pkg/teststub/rmrenv.go | 12 +- pkg/teststub/testwrapper.go | 2 +- pkg/teststubdummy/stubRmrDummy.go | 8 +- pkg/teststube2ap/stubE2.go | 229 +++++++---- 27 files changed, 1052 insertions(+), 495 deletions(-) create mode 100644 docs/images/REST_Subscription_Notification.png create mode 100644 docs/images/REST_Subscription_Request.png create mode 100644 docs/images/REST_Subscription_Response.png create mode 100644 docs/images/Routing_Manager_REST_interface_messages.png diff --git a/docs/images/REST_Subscription_Notification.png b/docs/images/REST_Subscription_Notification.png new file mode 100644 index 0000000000000000000000000000000000000000..9097774cb66de3692d4b2a3ff49d98241b08af89 GIT binary patch literal 74268 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

~XiCZkk+Z8bAY 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 literal 0 HcmV?d00001 diff --git a/docs/images/Routing_Manager_REST_interface_messages.png b/docs/images/Routing_Manager_REST_interface_messages.png new file mode 100644 index 0000000000000000000000000000000000000000..bb005301daee6a593d736e86b036b089e8640bd3 GIT binary patch literal 52170 zcmeFYWmj8m)HO<5inO@9OL6z&?heHrin~K7?oiyNxKrGrI20?cA-F>bPOy{vdEe*T z`2%N+lP}rX8QIzES}W_CYtETyH5FOZPeh;K;NVc@<)k#=;6BvA!M*#5^d5GG7T|XV zd-~umA+LpmgtWe`x&?bl=pp^hL(|#X!`sZw3eLvK+0lx{-NMbv%E|q^vj_M?p9mZr z1)RK;xRy`u8PHp7{x3P)rJ~>$t73}6BBVy?p`JE$S8%-ljxoPlfqyZ-3;0p90Q()T zy1KZ!`f8)Jv}LGTA@$>nx|mE(t6Iq#_^{x+Bd3hN8=4)nx9c zg0gUMVHgq~Q!)oS2Xv^!M|M@5t|10P3}aJrFZowI3=n%A4)x_#NhEPZDulAN_T56W z1f%tpY~Hzfb(>jN6iFnANPA+Yr+_qv3aOd`27D-1+?{?aA>|r02Cq%0neCun(4DdCfL368(9OnWjOBzD`1-Lav zIWSEq9v>?qnB*a$#=Sn!uY30IqA>>IN66otD}^P~zedS*JS5rAEWUms7=IN95)JzN zlS$MLB(9DU^oCntKne+#B8ZsJa$pH;O$S(9>i`i{JjOqDd77^GKe^_LQeh1=pGQt- zT1m=Ajr9<_N+;Fh^`TBRzrn3@aga-glk9It1R}O-hTCT}Rz0;Q+ODc@He2b?f1s0Q z89F+Nz&l4}S-U5C(ysDGDO58s1d-jSoKhlpqlT>+i<2QAY)T$d(6||0QCHKlw_3C$PtE7H){^1 z%ede5?%7^2Q`t`(^X&{WOQws!plaNC@XRB9q;BMNYd$^Q@p&;06(se!eV`xy811yb zXW9P;gNk2oRj!MSm~QU%d~fsaqwC=zTL)C{>JPCL&Vg1Z)0mU6b7)g3`+K@a+x|n~ zy-@&GhAu5jc3DHj*Fk*-^1n=T3jn~x}D)*2EX^kln(Qx6ui z3_CT@JKjd3l)~%l^+2IAEi|P-LZJE?V9b&6bP6HLFqj;lfReqvj^}krw)xZ@S0+-2 z%@U!xy&j%*8Q8`^N$T|5ZD*b5P6V-AqR5YT?fC)S45-UzoE7DDZ$PC6eA+af52W$7 zNR(7hS>9@=kPoYU90i3=V_oMd&(D+Owu{Hq>_8E0L|&ZDZQ4eYv)rDYCHz_OQVO=m zyqQOD5qvbF)tsU^x$G^=^62BdB*XvIwM=%Dy-5IS_fbOP?FIEY%M|8ZF%HnTY773zq3T}554Sl|QDD>j+ zMZS`7$B(quo=wKza%WcXv#~tRkN%8u{-|N{&6X(MQGZpBcUIR1L%QSG#6l7z8}OpX zL`xHO-9gUb7EFq*=_vF&@z?U((A1R9DSJhmNCF0x208Ha2ILVpJH+b=S(R4EVU}*na z_TScD#3A3`jWcWXv^nyI+fhz!N6>Nkc-OF~)CsQ0t{@uj+Q>bM+DN<&C zPfroO$o+GbgtN%zn~6BR$0z%7`D862iRi}VcfOkm&w4=%+d_4Ygh-SZyNkj`n-xS>D=e z){=#G){rVzE|{FmSlD+*<`O;TaN>%|_;Ig1l|(f~VNk`QOqFnTbn~YXhc1o!CC|gA z-VF9VmHV(!QFSW%oU_o9)oV%b((T_7C+t=4UJ#Fj4UdwKeblS>RceUZ#w5 z6tJEtZOSRTVXr26M;*p)Eqn@azcUoeD^#xWdjjo~E^=3$vC^p0bC`N8aSLzvFof>yS zJPgLZ2eN?jXh&X;>)~p$&xk?<4b^*}1{aCE2~NGBSDO$W2TZ*>KNN=v$kQ~rKKGw8 z9WT6B_~Qr;lCOu*+52U9B657`Aa0)7R7Xu!98fXP!~EOc$A8Quxl;Vppo<;Utn$r}ub!WKNqM!M6btE|p$rx`Ll$-OMadg!&GYx-o&RNqH0Zh3>5z>n z_~?=u^%Rn+Gg|rtgc5&dqoCmvzFHlm2k&THJydnZ*9zSnua8U3uh_n*TuA!XYbYFu z-20^iEecsxxV%VKPNar%{;m!Zzj0NheTu-)d)_?l$A7<=A?R52g_`xo!pFnmDlzvf zT4G(9#mZ!>QO5KVR0+kbJsr50x879VWvKF#;M;PI&wd*DV;&vuHM0L#{FZrEN8Dre z;2D$fk@5qa?Gx1ORqu1)Vk6my!6Vd8R*~PuKG3D*gKw2^{! z>mm=HNFuXUd#3Jyh+o3eOk%6}cbv&8PKoTkR+YHhk?_ir<{f$VX`!B5rc{3$I-5y% zyqv-m%ZN6Q2dWaYezTp$vXr9I88ukreGFQNDFwAso8)0*PGrb}GpIVEUg>(A7{6ti zAqy*atHtrw3H)Gk8e`0Vv1)z>J&)}q`o|t;{cqG0_;mSkx$mzi3SK~Gi~R&k7++RE zS=XhV`os3g-4xq?GbgR}7QYn|DpO2fmp$#cpR;V%%u(6AGjYRqnLfp_wPf+<~E|RpX2UDJ&#X-^yIzTgf8Bh zzd)P5zz99k8(V_9ZFc)vxIS9%ibJZ!|4C*?9-UG#u!!{Yn%yoErN+$$0&Za zhFPWGpRObiWWoaJ1bNFT!(57gG2tV!xuHKm_-YvqrihGdVcFCbC3~A}r3k|)((7tI zGOr89pt|172eqE&Wo9!JY<`$OZVfoh)fqs_+#A|-2kp7?RsC)M7?I$+{A<_Gjfp&e zLlOCl2m#tV%K>h(b~hFJmgFw+=b^2(<1`@x!x`5LsqKNEQF8a7&hOVR4>3%q*aBu5 zx@-c^#srF6M2_V%XGM@hVZ8wtB09O=7Q5+m|9v)780_G?IrB@z9}qRSJBNDBRtEU^ zq--}K5NyFP&t9KUyXD}N+b>)RBuep-b!;ZXdb&$Y?hUM#pPHVW{ ze;fpU_aURgJ_EnupU$%QA|gH+orSGS)5b!b>1otP7}~m&xCT zAQ8pOSR-C!we5I>W581m9WKhCFiWrFrzv;(^&mhs{?$A$m|z6GEj=aYf3V1k-*A5k zLey1twOck+y#=>BE&h&}keID5$n`_ljwDn>B$^A0#Tqr%+ok>xU;I zSaPUd8g$iy+i@7T(@ef8(l||~rJ!>ng<;6>oi6l?X@E6fcG7eKd!E_sQ+3!8Jf#*$ zl#LV*W39x|<`F7Ly+EM1NUkDPm`fg6Xs7y!h~;dgW|tG7Zc!Kdci~R@SC#;I$05t= zc?*zHwtuM2KnT5uQTUBun)ia={FQEoX;ZZTYADp=Jb$HUkteuLQ2Exe8*Z;NSbB%3 zCF7K|Fs7wqer!AtI!!ZhKNx5hwQcm#vb+OsT&MxOys6FJMlGh~~BL8ibP z5$h9Lu8(pT8Bgn8P%U4&aK593;bh~+*2DQXvgn|_sl-0_>pYiQLZ!uCgDz39F?-TM z5TD!`k-BsexhN!Dyw|T-Mi4if$Z4a&!eYC{03#4|nzBNlWx1(XPfyr_^$~l#*OG*$RoxKr2(s-eS7_0MDH+?C!( z%kmFV>0^L^#Yj7XcaYoQdqgtWEU0DR=}^h|nq#?rx-PP_)K*=W-5mJ1OKWT(;J}~txNgTqV93jXbK>SDvR_YznGXDwiILQeX-uU zH^rD+sHj_Pi85nfn)+klX}1$q?Ou+G?Jjuq`8elA+7KZNuk~PnAd?x2K_GFfz`%Lx zX_|W3PdL)p?D$#^{72c5L|#1X-E0Za*B^%pwMVpChtFtDvE+P0&vQz!W6|`D=?&g>lp(@~7d6>hvxDQGx9+G@{c_fRfx%)2l|V@cN3uZ>T8E3|$38 zIQ89E)b;a2zde34bqM137CYe}VP;`&gTlPwR;}^khub~@CcDtJz)#hvsg8X*ICL8z zPTwKRHj8^n4gR8~tl^_<<#qJDwwImrYp2kuw-V&1zS4-|z6z*%n@)r$6LDJdYBhNQ zf&yPm^~OPqhJx63{}4X~vBuB4Ig5_KDt8-O~-5HHuQ+= z2Xyf$C-(LgoX71IvyGWm*+iZfRYu)ce-pb^u06lQdfz};?DSLwDHa|TiZzbWw+lI|K&0pW%HN>9+-yaRC`8P} zq^S7W9s7glNIiD+c6PcXFd>JCRo~^gn3=Ff$gOHS`B{Fkp02h9kU~dme}@SwvalpV z4z{aK{jme1ue62}1vng+!b|4J5=OL^c{uG?9k<#!0w=k@Lygi&L>(Ievnp?3?L$#h zeZf-uFUXCYH1XEBme!V-a_F+9v1~8u;_N%umGnP;TCQ$uosGK2&(Z401B~l3_tz#g z#wW&Ue`=j_jnz<$ow|1Jjv??nt$3T}6oWs+D&--paB_r=4e%MGTjjpYI4yy!ZU@Zn z{FH22S3I)A4%HS}jeYlJjmwd%%XK?j8Gz=~Zy|?rNyOU`%)AB;lt~{STP`IUh?-y4 zMyFzeuGwFwBw@S~fo6H7V@`rF2_pKLc@={p8lG-jUaytwLs%`FJw(~-N^_TpHBGbx zy4c)eE_kcpjP{umFh)|atitea7*U)ZBX|qfmA|j-*o|M*eNIFc0qWPccGl6F@h*PR z;VAv(<8`@jm{tM`J3{eU`o}~jh@N1g!5#O{{+jWHL{XH43;j9U}7 zBpGeQ*G|7VzmoNYQsMX`0to`AE$+a}$HLh0OTl`qAc@-)N&DeUC7EMT`!J{Ka&@W3 z`%maFkSFYP1&nv1Q%+RkwlbZx-hDNCw%%z~Xfu=}OEiHZG7RV=G@S*yYJ^P&p(Yy` zLhpRbs;Wx-yP36h&ckD$<=DV05O?O|c9}zQmA8^x`!MRTs7ZR`;KmIlO0DBvJoI)WEuOxU zQFOkHOT~7Ty{>RRUv8rhD;D+$?KTxuR{G@=s*xa^@OproU9F+GvJ~D9 z5jJ+y<)YKyZ(ewQ*ODYDCPdTce!N%@#ob(ze)X$oRBr2KP2j9_!bj>0!H|d=o2ul8 zwUAJ;lb_MkrVD;bv^JL3e(5e^gb~ZjFsiVMFMP`n^~MgO@*!z&7grEC5FB0ETF{m| zF@Px{^_RN7ZDF^AY3_*AI;z1XaH<)R*rxt|0>@n}vuX{T*-2CIJa)>BDX=O4&xw~_ z^OjV*9JE}*`Ix+LcZ$V#aCeTbX}Hb-3rt^go{k${+y(jn1htyA3U4PNi8On{SCLqZ zl69fQ6u=Oy|Go_p9QSE6U*MXtKnlssBSoE6l32S!QVN>kOq;R?iLj-r^0 z*M%|~L&l=Iat8+CLK1Z|nP;#G(;d&ki)}ud1k`=S^hT9L;`_eVj^}JYAs~7ss4S%q zYhw@c+0o(01^$P@o#)F8R8JGjb1k0$^K7-E;YGTlzAZ~}C3^wetv-^U-Ste&ejUNm z6uaYLzNIQ&@|fHERBGui_D~lgNtYI z8Yz@jkU{?ix$GA8B(}cXXArM7Im9&Ni-B{2jAm3dwJ0=jJVZZJfBnMoOS=3Y)J~7K zDj-?bq@NpjxSmfZX#S&p!RP<9Wj?AB%V15z za!J0Yziig5j0F6$+4&q;n<02`bdPN-magx}oFMEmu^a@U&)~vcN=@#@+#m zensR3JQ$OE79+`Kf`ZpOgR=}4b(flV6UI)$yP@i|jP}kWqlO;E)|zvtP*Sh`R=~4< zzWmz0lbzD-JYHGaH({_A^P)G?Otfc7Nhw1k@Uav-P-|fk#~e!f$aMs%PHvMqy~*Yu z`eq24ZYAd{vvNegrwHnO2KS*Cn1>Yw)C(83<3!6B?e%45M`W*TaAuCj@?1td>riz{axJIc8mb(==yzRM3%ik^cUWP96VVVRw^)MdCa0^c9ZL|fC zDU5KFcDW^&y6})tU5}%_DJWthVMz{#d((3)dJQ5*p^2{WYU(C%BzX|hU2ABDqj$1r z%ezOLys?aJlKNWr&R+NMrq(b_2b24ouMl{`_U2d3HkIx0HPz^qB9m zAu{q^#5PaSAZtYGix)%i+Iw;Kiu3{R4Avfe5%(ca{~3b$=VjnGD&YOta78krA~bN> zx5kybawTU=pVy-8+~A+S+%L*^aBJ%x7LIBz5N( zjg9|W5^iMvrsoS+q7>40HX3VWVjY+j$s=6{aC4}Y2CH^}6fs}FYjcqI-5+)Krx$IODKGP$a`?WKK@M<(1i!fbx3cBv zTIi7TO+E5Mok8L)B#X@Wtl7heYUkrAL#N4(AmOt_HgI7)b)40IMA!6g{?o@Wx-$GN zA_VJN|C?jWGNUUetNz4MA>KE7yEWm%#mCR&P*zt{3na~^{3F+%r*)edQ5tK!ZM)l? zZ*8Y5BU%~3QE@*s0iBwot%U%Rhcl-iijja${sB)R7Li>cCLtc4ra}*vwxU0QP3S$3 z=bxLCR^Rz=OlSHiHK`9`Ogr7pP$dFbbI+P@40~e|dVBFck77_=ZIS}X{@Ko836oGJ zKa*lwdb)(v8OC4mE$e@jY}Z-u7_Ia4-`Ra*J@C)}QR=u-V|BPGtWQ{JP9r*es4tb% z5O{0<>Hx&epH?7igUS(xXtKQSq2&A2w5(7DNHDvP5Pw^kLceKbjkgZ zSB;8^dCJaD$`+vF-2{AKtl zEiba3;S9lT%EW{`1`&I&ks2(o|45)j(dBdEGnMGN%K6M0iq7(KFJJwlNo$!l2?6z; zx2_(TO=-b)QzC;lGcI5wxU-)oVNdZ?>0u^S`=H`j4)1bK2~uKO2KO1GYx+u#mV1Bh$e4t5MIGVy<0}qp0%{_ z*Iu`slH2=~FRb|?&iBAF7LlET%ci+n9*v*G*O!-6hr{?(rT)&iNp~JO*8~}kHWxie z$`46{+gK$M8=AD&18nsKTz{>ed_h~8;11~ki9h?6X0u_xEBhqkm%!|VUnO3`;m#A0s`wVW)X z95=eVRuyYF%e7zR(3>rf|5mM{sBS=Y^=?1(`M3}8N3{6x#sA@Ca4VBLVI`7+hK-No zq3$qSp4z%yR9=0dAi70j$w}F)x*)*7UVMRP8M2#BdI$Zf|K;Qt%J@_a`mM-(^8b1P zx_uvh=q8VORsDuRjt@(nE$!q>aASy)U6t{9o=q}-YgHaYyOwWq39(4=&rnUMt3QDv zXzo{q>yhISKSH0t=&{L%a5@hq7Nbr6QJv=@XQv%6M$tVTy zuC*+p^MpArqaX_^z{`CzkFH|05B1)cJ(v$`y2;iv;BhuDDX$$FdXNs!?Vbdiq+so) zXt<@7*iD3#m4VuA=jlddpld{S4!DBjY>ZJ=;T67LwSZ&SSOhxPo* zT6w2(2##$l=j4se#8sfndtsSJLvd7<$y$>d@2}v++2KCLFS?#9Cz?U|Vd!*UZxAT@ zClFB@z8o12?vq;a`=s3HdePY{3k@IRMP_$>$z=lN07zVBgf04nYc-U!0EyqmudX;h!% zUmvR*RXfbu?c&Aj)l8HN+VbVlxWK*)#@XV22loer9AXN0f~7psyCyV9anhbE>DPmW%XM&Au-{RZFP0y zQTvaaf}B@j2HvlG`xYQs=VSqlZ;LGd^BsIJ$@~9$Ilhtp=R<*m`~O`X|DQCoK%GI< z#l<;oqiT63vwZTGv2L2Xo1(8Eh$i|D|DN+qQt~gosV+A!hd6ukwsOP2V7)FwVJ<;C zY0&MvRM3b2GXHS>{7OMU8K&lXIa^x3c^&>%Sb0RyM#gWuQMRj-t$ARgNN4wxy?XSZ zE5*V_Nz|lR%Pu~|rrz)MZ|Hxu^9NL$5MnCs_59=w1^`V_&;qV_!3($Z13-o*t) zC8(pX{sb5VH*;^B()Xn*Q>&SmIXCHw;9kJqQj&Tn1JG&wd>L@s#ZBV5H~h$;tmS~e ziGn65+<=*YG0^NFTPG4Q#Ye$@6b`D@%qeT0$95m{5sr+0%Wprvr}}c4bw6z6-bsk; zE!LF(X7Ue++vCqH{6xWS>K&vU$El|@Z#`5Ms@q)v-wPl;3IadZ2>|1ckSN1Wmzn*| zKS^2MF%ED$j5vIC2iux%ae*hgY&@6B)1H)0P@?%Tb6qoyMaHQYxR&CYvm@f!~Jx$|6UZo5Gr^%avV>&j_8k0f+sMXjMos z+8^>$CTEK%j}ke&`Lhl;&|l;Bx4RCDNL1psBbWBsuyY|go^w+d8N$6OQ#Ig{BWIBHar#_J}%5YS2*&~N`` zOU#@8_JmHV$*bcPx?1L>gw>n=D*QTrt zlaCi?)f(qGuhyAm9Vrv7yUX1L-2u4IC#8M&ExQH>Hyr9|=JRWH>x&|{SM}?02~LS2 zAcQCIk->f|>gM->%0GP0p$UmRYMGbtg>HFDMmAE@CspZY{Iw`XFqUwAGTwbHdA98$ z41x)xDV(I5YW)4ZHc;dh6jh^<`8&=H!(=izUWhei`!}AyqM=iYs~f90iDZb`<?SQ_&1Fr4!|(?&Wsr)#6=4A%ke~T-?~^Om_1HL` zLekqlqX}yP)m+ZyscYB#+Y-moHZ$#Nug|~!GBdy7!qXnb#owRq(YcsRSUk(OP z9@pSdJE{bUuqQ9tu6_I5-sm2EquEsJR(yFQA~AX@TS|%8ppri7$D>kqQa*x?nWco- zfvi|bx!<`{@OV$2qn4e6(p%{P&pAJ97=Y(2N9dcEi~;jY3i0H`m zUBD3K<*rhzvJ`msbIirBab@RP(6RW(5m%`)D$*bY5ZawlhYQRqvd7JNfLxaqCG*QF09tfYijUguvG1&MY6Ddf^R49BF7 zohU!mt@&Mp~B-~PC`28RufzFkjI?mwbowxFdB^KJp=*Qp)W(m@d z{nFxO*9qObu(+(Z_FApJ+!w8%%ySH6xe*u`q3#~wr#`L9yM5xPQC5x*r#ucdHB>f2 zweT>$r*Lsx1+f#6;xEkqq8_S#R%R_%dqxLJsI0CzYK?O;m-~=p*O3M|w5{)|+I|cu z*>B&Udq10qS~^4K8Lai!m^PC!C*DYkzEBD?IWk3aq!r zV}FoHzX9D4QA%OS0sR)BAF=(vop5~W?Y$RloWCCDGxMh6RqoCoeE8@d>D|C-`MD9> z7$n^LrX}_Xoih9O*}fdwx2$;5Hi1*6z_YyqtI+xZlc9 z3oe=^&9Sq1G?D23>g|Vc8A;l^yOtjOZy=}NUGhFL+f~}#X;lY_vKx?t%*qw%)ylb0 zh-*ay@Ns(_Q!n_2Cf}6lzh5&?yvzdu;;EcDnH7%ALQlHF+^)h?JRe z`8{4m16fYY1myeM68&a}GPtA#cVbVMv*yXQkLB2?!+whW`M%R`eth=o6;V?}jtQV| z1w$0RtfI{~l5#j-99^&w*>2}9s0Mo{kbWi4HRgFOUK1*_^E|~}dOwu%x)oK;2kjZ3 z$4-_ybLue5+I6X+35towmnU8*SmOAv1PbwJFRBID-%7Bpify>^*GBOJHltG0aHf^w zh<8&>qRnW}11NZ6C^yBOYw1>hUsp-nrpgN+CO*{nXpL(u$V5xidr4wGic_I~)o#18 z?RiKmbRgXk%<5BuRk_sW^3j-_*@pzBHP4=&!v!8}lS!ajfy);M4u&#b~Onb=^Mm`sAFSeFjA&oaYJ^9h)y!&2n(Tfthao@S5$NP z1p@>~Ev z$J|C(J-iW0w);JCL)S3~5?<}dC@ry>Py(qbw;BG? zP@l_D$ZWylLNH^IX?GJDJ=m6GanL<|(_kiElWgevWDsY zwUUx^C=xX@c(NMrYSa}d3n^i+!ICq3H%;=`mlqq+=^BUNEYdNu2xL4vUv*5m3$SR; z47?l*Nh=O1%ay13iIVkerMT(_Hw_)fL{g@-zq-R-wjVFaVBx@4iRRKR7#nQ*BbD-+^iL8Vz8O zEZf!9F3$RRAM0f@Q)q>7Sye1BMht2GxXBJYmtex?nDuIc)23d(s>qjlG6!E7prMiX z>x{J`xwIzU@T3U4kFs6?z&>SMg#K)pHm~4YvLlq$7e^I`x*fpZaHvwY-^_zOm4!q} zBljtGvfMyuC4Gwa5AoXSF~nj(6!M={SDnMWvN8>!x83;qpmRUSH)CWpq~v#0L30GO zCbdMPfGaktz?Sf1ntlld!`IFqPQbM~k3^5pHi@4{ty?S$tG*;lJ80wS?fJG`%1#Tr{`D4p z09E+j$;N)C(y3 z^0-}$Zm8X(MLr`tP9pJ>_>O`C)85*aF5sE&1?MBgKeeK)NW&0=Y1^&g; z6HufrXfVXJhuO1Kw2SJLH-!p)v3A{@(aSwMlPlq;*1V@>)w(q0J$Y#s|6LmvAQadd zq&kHz0${++PAU0I;g^_dU?ymU=rym<+i`!nTT#ydsb_sXh2&QG5?Dr zEz5&isQ?%v<4?BLN$wUT94Fl+{FV{X|1mhDe%KE6+kxQZ=C^u)T`gwCIBA^nyTHx_eP5Y- zd~r~Yo6<)&?rrX}V`bPDgBd_iV5QW8+d|-Q63eyBy(3U5Qr>bnQl|7d^=mTPyraq}(HvP~tYp^_ufwiGsM)aEuk>I&0JGW0FfpK40IH=g}>Bn)% zLNfKBq)}Z&?Ll)HbzizJG%4h3n={QkZ*}F~EB!Ig z#O=Y{XR+UK*i06m<$yU;*l!*Z?jWwSQ9Z$QpNEV&@98p3t5}5S&!<;s!v8b`lnw_C zkmav+PMHL1T=%3blh|;U*LCLToS#LrU_@uAa1MGuDZJn+%5>!s#Jh?1^|)J(qT0-? zdI(0SH7pQf_>Uo(Eed}r-0+z#KTuI7;&O5UGn|&!s4+laH}5xsCHbhYXuO-B3q*rZ z;i+O_7Nu`X0d#zP+-_si?Y0?d999I@pP<-Q*} zOcU*HM77Ms6>IR0*!MUY$9>;l|DFbu0RxFqBt2b#3&+1kh5>Rd68R8_2I&gMD6^jP zp1nhrG{Wxz?4QVL7t!X#)T{?I`2Mt&P^8^qY+Y%knDQW9J!z#_8s&4EBPi#M+?4fl zJqZip6`iSUP8#}4;r3rgaA;-J8De;D$)liW(uG!Xn#ZJ4>B%$L#0q2B@-i2YM-S6# zH%775tH^A>yi#Q1HBJarl3I6yF@$U<5MX?JB z38PO?fX>_Qe)1G*S3}@y{CV=VbO~aC5qUuC320X(4(w9o<}^&pBnR;>*aaKEs*aZ5 zvP`IHW~TFsQrWCWUD)nUH9otdy13P6Dj4@8`qO*rNCc-JC4GffpLp@0hx6!|7?v*!qk~E#@f;xLx`@Kji>hq#_m( z7EfHaZ??K5zoCn&SlT`ga)EY3WJI^fEUb(Y%-T!!B=g)YEta{Anz+)9$r`*Rayn(G zrEIJx)WiGB<6rp0VSY?FHC|@wC*z*8uw7`oKy*JJF!904UjG}<5N+a9xxtEF#^%}| z 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

FEhLP7p-1E85EbjBZ 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 Z{{#BZ|A79#KyiFfLN8JzEvvt^{|~m#hV%dc diff --git a/docs/user-guide.rst b/docs/user-guide.rst index aca93d5..268fe5a 100755 --- a/docs/user-guide.rst +++ b/docs/user-guide.rst @@ -28,65 +28,78 @@ Overview Subscription Manager is a basic platform service in RIC. It is responsible for managing E2 subscriptions from xApps to the E2 Node (eNodeB or gNodeB). -xApp can subscribe and unsubscribe messages from E2 Node through Subscription Manager. Subscription Manager manages subscriptions -and message routing of the subscribed messages between E2 Termination and xApps. If one xApp has already made a subscription -and then another xApp initiates identical subscription, Subscription Manager does not forward the subscription to E2 Node but merges the -subscriptions internally. In merge case Subscription Manager just updates the message routing information to Routing Manager and -sends response to xApp. +xApp can make subscriptions to E2 Node through Subscription Manager. xApp can subscribe REPORT, INSERT, CONTROL and POLICY type services +from E2 Node. For some of those subscription types E2 Node sends E2 Indication messages back to xApp. For those messages there need to be +created route between E2 Termination and xApp. Subscription Manager manages E2 subscriptions and message request routing of the subscribed +messages from Routing Manager. If one xApp has already made a subscription and then another xApp initiates identical subscription, Subscription +Manager does not forward the subscription to E2 Node but merges the subscriptions internally and request Routing Manager to create route also +for the second xApp and sends response to xApp. xApp can indicate in the request should Subscription Manager send request for Routing Manager +to create route for the E2 subscription in the request. Interface between xApp and Subscription Manager is HTTP based REST interface. Interface codes are generated with help of Swagger from a -yaml definition file. REST interface is used also between Subscription Manager and Routing Manager. Subscription Manager and -E2 Termination interface is based on RMR messages. xApp should use also Swagger generated code when it implements subscription REST -interface towards Subscription Manager. +yaml definition file. REST interface is used also between Subscription Manager and Routing Manager. Subscription Manager and E2 Termination +interface is based on RMR messages. xApp should use also Swagger generated code when it implements subscription REST interface towards Subscription +Manager. .. image:: images/PlaceInRICSoftwareArchitecture.png :width: 600 :alt: Place in RIC's software architecture picture -One xApp generated REST subscription message can contain multiple E2 subscriptions. For every E2 subscription in the message there is also -xApp generated xApp instance id. In E2 interface there can be only one ongoing E2 subscription or subscription delete procedure towards +One xApp generated REST subscription request message can contain multiple E2 subscriptions. For every E2 subscription in the message there must be +also xApp generated xApp instance id. In E2 interface there can be only one ongoing E2 subscription or subscription delete procedure towards E2 Node at any time. That is because Subscription Manager is able to merge new E2 subscriptions only which those it has already received -successful response from E2 Node. E2 subscriptions and delete subscriptions may be therefore queued in Subscription Manager. +successful response from E2 Node. E2 subscriptions and delete subscriptions may be therefore queued for a moment in Subscription Manager. Subscription Manager may need to do reties towards E2 Node during subscribe or subscription delete procedure. Retries will increase completion time of the procedure. This needs to be considered in xApp's implementation. Subscription Manager sends REST notification to xApp for every -completed E2 subscription procedure regardless is the E2 subscription successful or not. Notification is not sent for E2 subscription delete +completed E2 subscription procedure. That is regardless was the E2 subscription successful or not. Notification is not sent for E2 subscription delete procedures. Subscription Manager allocates globally unique REST request id for each new REST subscription request. That is returned to xApp in response. When xApp wants to delete REST subscription, xApp need to use the same id in deletion request. -Subscription Manager allocates unique id also for the E2 subscriptions (E2 instance id). The id called 'InstanceId' in E2 specification. +Subscription Manager allocates also unique id for every E2 subscriptions (E2 instance id). The id called 'InstanceId' in E2 specification. In successful case the REST notification contains the id generated for the REST request, xApp instance id and E2 instance id. From xApp point -of view xApp instance id identifies received REST notification for the E2 subscription in the REST request. REST notification contains also Subscription +of view xApp instance id identifies response REST notification for the E2 subscription in the REST request. REST notification contains also Subscription Manager generated E2 instance id. xApp can use that to map received E2 Indication message to E2 subscription. If E2 subscription procedure is unsuccessful -then E2 instance id is 0 and the notification contains non-zero error cause string. +then E2 instance id is 0 and the notification contains non-zero error cause string and source of that error information. xApp need to be able preserve Subscription Manager allocated REST request id over xApp restart. The id is needed for deletion of the REST subscription and if there is need to resend the same REST request. -Three different type of subscriptions are supported. REPORT, POLICY and INSERT. REPORT and INSERT works the same way from subscription point of view. -REPORT and INSERT type REST subscription request can contain content for multiple E2 subscriptions. POLICY subscription can also contain content for multiple -E2 subscriptions but using in that way may not be feasible. REPORT, POLICY and INSERT type subscriptions in the same REST request are not supported supported -in Subscription Manager. +Three different type subscriptions are supported. REPORT, POLICY and INSERT. REPORT and INSERT works the same way from subscription point of view. +REPORT and INSERT type REST subscription request can contain multiple E2 subscriptions. POLICY subscription can also contain multiple E2 subscriptions but +using it in that way may not be feasible. REPORT, POLICY and INSERT type subscriptions in the same REST request are not supported supported in Subscription Manager. -REPORT and INSERT type subscription can contain content for multiple E2 subscriptions. If there is need to resend the same REST request, the request must -contain Subscription Manager allocated id for the REST request, which was returned to xApp when the request was sent first time. The request must also -contain the same content as first time. Reason for xApp to resend the same request could be timeout or some failure which is not permanent in E2 Node or -xApp restart. In retry cases Subscription Manager retries the E2 subscriptions which does not exist in its records. For others Subscription Manager -returns successful REST notification without sending any messages to E2 Node. One REST Subscription request can contain E2 subscriptions to only one E2 Node. +REPORT and INSERT type subscription can contain multiple E2 subscriptions. If xApp needs to resend the same REST request, the request must contain Subscription +Manager allocated id for the REST request, which was returned to xApp when the request was sent first time. The request must also contain the same content as +first time. Reason for xApp to resend the same request could be timeout or some failure which is not permanent like E2 interface connection break or xApp restart. +In retry case Subscription Manager retries the E2 subscriptions towards to E2 Node in the request message which it does not have record. For subscriptions +which record is found Subscription Manager returns successful REST notification to xApp without forwarding request to E2 Node. One REST Subscription request can +contain E2 subscriptions only for one E2 Node. + +Subscription Manager indicates to xApp in response notification if there has happened any error or timeout. xApp can send retry based on that information but +resending should happen after Subscription Manager has processed the previous request completely otherwise the request is rejected. If timeout happens response +notification contains information where it happened. Timeout can happen in E2, Routing Manager and SDL interface. If there is need to change REPORT or INSERT type subscription then previously made subscription need to be deleted first. If there are any REPORT or INSERT type E2 subscription which need to change frequently, it is not good idea to bundle them with other REPORT or INSERT type E2 subscriptions in the same REST subscription request. -POLICY type subscription can contain content for multiple E2 subscriptions but it may not be feasible as POLICY subscription may change. Idea in POLICY -subscription is that xApp can send changed contend to E2 Node without making new subscription but just send update. In such case it is not good idea to bundle -the POLICY type E2 subscription with any other POLICY type E2 subscriptions in the same REST subscription request. +POLICY type subscription can contain multiple E2 subscriptions but it may not be feasible as POLICY subscription may change. Idea in POLICY subscription is that +xApp can send changed contend to E2 Node without making new subscription but just send update. Message contend can be changed frequently. In such case it may not +be good idea to bundle the POLICY type E2 subscription with any other POLICY type E2 subscriptions in the same REST subscription request. + +xApp must be able to preserve is the Subscription Manager allocated REST requests ids over restart or send the same request as was sent restart. If xApp is able +to send exactly the same requests then Subscription manager can identify the request and send same responses back to xApp. This way xApp can restore the identifies +related to existing subscriptions. Another alternative is store needed information in database. Subscription manager calculates md5 sum over the REST Subscription +request message. That is how it can detect identical request coming from a specific xApp. -In xApp restart case only mandatory thing what is required xApp to be able preserve is the Subscription Manager allocated REST requests ids. That is if xApp -can generate the equal requests otherwise as were done first time before restart. xApp can resent the same REST requests to Subscription Manager as first time -before restart. REST request id must be placed in the REST request. That is the only way for Subscription Manager to identify already made subscriptions in it -records and work as expected, i.e. not run into problems and return successful REST notifications to xApp without sending any messages to E2 Node. +xApp can set in the request how many times Subscription Manager will retry subscription in E2 interface if there is timeout. xApp can also set time Subscription +Manager Will wait response from E2 Node. xApp may need to update POLICY type subscription frequently. In such case it is not necessary feasible that +Subscription Manager retries outdated subscription. By default Subscription Manager retries twice and response waiting time is two seconds. + +In error case REST notification contains source of error. Source of error can be Subscription Manager, Routing Manager, E2 Node, ASN1 encoding/decoding and DBAAS/SDL. +The error information received from these sources is directly copied in the response. Architecture ------------ @@ -112,6 +125,41 @@ Architecture of the xApp who makes the first subscription. E2 Node uses Subscription Manager allocated RIC Requestor ID in all RIC Indication messages it sends to RIC for the subscription. In merge case subscription in E2 Node is created only for the first requestor. + More information about Routing manager, how routes are created and related signaling can be found from here (Note that there is still + RMR based interface between xApp and Subscription Manager in the pictures on those pages): + + ``_ + + ``_ + + + * Subscription Request message + + .. image:: images/REST_Subscription_Request.png + :width: 600 + :alt: Subscription Request message + + + * Subscription RESTRequest Response message + + .. image:: images/REST_Subscription_Response.png + :width: 600 + :alt: REST Subscription Request Response message + + + * Subscription Request Notification message + + .. image:: images/REST_Subscription_Notification.png + :width: 600 + :alt: REST Subscription Notification message + + * Routing Manager REST interface messages + + .. image:: images/Routing_Manager_REST_interface_messages.png + :width: 600 + :alt: Routing Manager REST interface messages + + * Subscription procedure * Successful case @@ -393,13 +441,19 @@ REST interface for debugging and testing Example: curl -s GET "http://10.244.0.181:8080/ric/v1/metrics" - Get subscriptions + Get REST subscriptions + + .. code-block:: none + + Example: curl -X GET "http://10.244.0.181:8080/ric/v1/restsubscriptions" + + Get E2 subscriptions .. code-block:: none Example: curl -X GET "http://10.244.0.181:8088/ric/v1/subscriptions" - Delete single subscription from db + Delete single E2 subscription from db .. code-block:: none diff --git a/e2ap/pkg/e2ap/msg_e2ap.go b/e2ap/pkg/e2ap/msg_e2ap.go index 1e3ea70..202cb65 100644 --- a/e2ap/pkg/e2ap/msg_e2ap.go +++ b/e2ap/pkg/e2ap/msg_e2ap.go @@ -235,19 +235,19 @@ const ( E2AP_TimeToWaitW2ms uint64 = 2 E2AP_TimeToWaitW5ms uint64 = 3 E2AP_TimeToWaitW10ms uint64 = 4 - E2AP_TimeToWaitW20ms uint64 = 4 - E2AP_TimeToWaitW30ms uint64 = 5 - E2AP_TimeToWaitW40ms uint64 = 6 - E2AP_TimeToWaitW50ms uint64 = 7 - E2AP_TimeToWaitW100ms uint64 = 8 - E2AP_TimeToWaitW200ms uint64 = 9 - E2AP_TimeToWaitW500ms uint64 = 10 - E2AP_TimeToWaitW1s uint64 = 11 - E2AP_TimeToWaitW2s uint64 = 12 - E2AP_TimeToWaitW5s uint64 = 13 - E2AP_TimeToWaitW10s uint64 = 14 - E2AP_TimeToWaitW20s uint64 = 15 - E2AP_TimeToWaitW60 uint64 = 16 + E2AP_TimeToWaitW20ms uint64 = 5 + E2AP_TimeToWaitW30ms uint64 = 6 + E2AP_TimeToWaitW40ms uint64 = 7 + E2AP_TimeToWaitW50ms uint64 = 8 + E2AP_TimeToWaitW100ms uint64 = 9 + E2AP_TimeToWaitW200ms uint64 = 10 + E2AP_TimeToWaitW500ms uint64 = 11 + E2AP_TimeToWaitW1s uint64 = 12 + E2AP_TimeToWaitW2s uint64 = 13 + E2AP_TimeToWaitW5s uint64 = 14 + E2AP_TimeToWaitW10s uint64 = 15 + E2AP_TimeToWaitW20s uint64 = 16 + E2AP_TimeToWaitW60 uint64 = 17 ) var E2AP_TimeToWaitStrMap = map[string]uint64{ diff --git a/go.mod b/go.mod index c8df5aa..6290905 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.12 replace gerrit.o-ran-sc.org/r/ric-plt/sdlgo => gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.7.0 -replace gerrit.o-ran-sc.org/r/ric-plt/xapp-frame => gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.3 +replace gerrit.o-ran-sc.org/r/ric-plt/xapp-frame => gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.5 replace gerrit.o-ran-sc.org/r/com/golog => gerrit.o-ran-sc.org/r/com/golog.git v0.0.2 @@ -14,11 +14,8 @@ require ( gerrit.o-ran-sc.org/r/ric-plt/e2ap v0.0.0-00010101000000-000000000000 gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.7.0 gerrit.o-ran-sc.org/r/ric-plt/xapp-frame v0.0.0-00010101000000-000000000000 - github.com/go-openapi/errors v0.19.3 github.com/go-openapi/runtime v0.19.4 github.com/go-openapi/strfmt v0.19.4 - github.com/go-openapi/swag v0.19.7 - github.com/go-openapi/validate v0.19.6 github.com/gorilla/mux v1.7.1 github.com/segmentio/ksuid v1.0.3 github.com/spf13/viper v1.4.0 diff --git a/go.sum b/go.sum index 8d66bc0..c8d994f 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,8 @@ gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.7.0 h1:mxlBo54jxwHHFmGYzFI+fBIkOGwarQ gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.7.0/go.mod h1:KCHu4JkWnw2Ro6P747wU9S2t7zxFLmBNCiYvGZo3CHo= gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.3 h1:C5nhnmSZLdysSiQ7vMkpNaKrooPwiBZ79dcXWRVtZTU= gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.3/go.mod h1:MRTeTBLROgTA2t91SXYjTbRsxoOhMMvvkK/ChLVRZUU= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.5 h1:PEc4Lv6cn8hQM1Ak3wE3MwhCa4v7triRjdhXwsTUMUw= +gerrit.o-ran-sc.org/r/ric-plt/xapp-frame.git v0.8.5/go.mod h1:Z9SajRPqZ7N1/y+Lzp5lUzq24fvrcjQg3cMBXRQVkiM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -87,6 +89,7 @@ github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOX github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc= github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= diff --git a/pkg/control/control.go b/pkg/control/control.go index 3ebcbcd..aaad625 100755 --- a/pkg/control/control.go +++ b/pkg/control/control.go @@ -30,6 +30,7 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" rtmgrclient "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/common" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" httptransport "github.com/go-openapi/runtime/client" "github.com/go-openapi/strfmt" @@ -85,7 +86,7 @@ type Control struct { CntRecvMsg uint64 ResetTestFlag bool Counters map[string]xapp.Counter - LoggerLevel uint32 + LoggerLevel int } type RMRMeid struct { @@ -96,9 +97,24 @@ type RMRMeid struct { type SubmgrRestartTestEvent struct{} type SubmgrRestartUpEvent struct{} +type PackSubscriptionRequestErrortEvent struct { + ErrorInfo ErrorInfo +} + +func (p *PackSubscriptionRequestErrortEvent) SetEvent(errorInfo *ErrorInfo) { + p.ErrorInfo = *errorInfo +} + +type SDLWriteErrortEvent struct { + ErrorInfo ErrorInfo +} + +func (s *SDLWriteErrortEvent) SetEvent(errorInfo *ErrorInfo) { + s.ErrorInfo = *errorInfo +} func init() { - xapp.Logger.Info("SUBMGR") + xapp.Logger.Debug("SUBMGR") viper.AutomaticEnv() viper.SetEnvPrefix("submgr") viper.AllowEmptyEnv(true) @@ -131,7 +147,7 @@ func NewControl() *Control { xapp.Resource.InjectRoute("/ric/v1/restsubscriptions", c.GetAllRestSubscriptions, "GET") xapp.Resource.InjectRoute("/ric/v1/symptomdata", c.SymptomDataHandler, "GET") - go xapp.Subscription.Listen(c.SubscriptionHandler, c.QueryHandler, c.SubscriptionDeleteHandlerCB) + go xapp.Subscription.Listen(c.RESTSubscriptionHandler, c.RESTQueryHandler, c.RESTSubscriptionDeleteHandler) if readSubsFromDb == "false" { return c @@ -154,7 +170,7 @@ func (c *Control) SymptomDataHandler(w http.ResponseWriter, r *http.Request) { // //------------------------------------------------------------------- func (c *Control) GetAllRestSubscriptions(w http.ResponseWriter, r *http.Request) { - xapp.Logger.Info("GetAllRestSubscriptions() called") + xapp.Logger.Debug("GetAllRestSubscriptions() called") response := c.registry.GetAllRestSubscriptions() w.Write(response) } @@ -167,7 +183,7 @@ func (c *Control) ReadE2Subscriptions() error { var subIds []uint32 var register map[uint32]*Subscription for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ { - xapp.Logger.Info("Reading E2 subscriptions from db") + xapp.Logger.Debug("Reading E2 subscriptions from db") subIds, register, err = c.ReadAllSubscriptionsFromSdl() if err != nil { xapp.Logger.Error("%v", err) @@ -179,7 +195,7 @@ func (c *Control) ReadE2Subscriptions() error { return nil } } - xapp.Logger.Info("Continuing without retring") + xapp.Logger.Debug("Continuing without retring") return err } @@ -190,7 +206,7 @@ func (c *Control) ReadRESTSubscriptions() error { var err error var restSubscriptions map[string]*RESTSubscription for i := 0; dbRetryForever == "true" || i < dbTryCount; i++ { - xapp.Logger.Info("Reading REST subscriptions from db") + xapp.Logger.Debug("Reading REST subscriptions from db") restSubscriptions, err = c.ReadAllRESTSubscriptionsFromSdl() if err != nil { xapp.Logger.Error("%v", err) @@ -200,7 +216,7 @@ func (c *Control) ReadRESTSubscriptions() error { return nil } } - xapp.Logger.Info("Continuing without retring") + xapp.Logger.Debug("Continuing without retring") return err } @@ -209,58 +225,56 @@ func (c *Control) ReadRESTSubscriptions() error { //------------------------------------------------------------------- func (c *Control) ReadConfigParameters(f string) { + c.LoggerLevel = int(xapp.Logger.GetLevel()) + xapp.Logger.Debug("LoggerLevel %v", c.LoggerLevel) + // viper.GetDuration returns nanoseconds e2tSubReqTimeout = viper.GetDuration("controls.e2tSubReqTimeout_ms") * 1000000 if e2tSubReqTimeout == 0 { e2tSubReqTimeout = 2000 * 1000000 } - xapp.Logger.Info("e2tSubReqTimeout %v", e2tSubReqTimeout) + xapp.Logger.Debug("e2tSubReqTimeout %v", e2tSubReqTimeout) + e2tSubDelReqTime = viper.GetDuration("controls.e2tSubDelReqTime_ms") * 1000000 if e2tSubDelReqTime == 0 { e2tSubDelReqTime = 2000 * 1000000 } - xapp.Logger.Info("e2tSubDelReqTime %v", e2tSubDelReqTime) + xapp.Logger.Debug("e2tSubDelReqTime %v", e2tSubDelReqTime) e2tRecvMsgTimeout = viper.GetDuration("controls.e2tRecvMsgTimeout_ms") * 1000000 if e2tRecvMsgTimeout == 0 { e2tRecvMsgTimeout = 2000 * 1000000 } - xapp.Logger.Info("e2tRecvMsgTimeout %v", e2tRecvMsgTimeout) + xapp.Logger.Debug("e2tRecvMsgTimeout %v", e2tRecvMsgTimeout) e2tMaxSubReqTryCount = viper.GetUint64("controls.e2tMaxSubReqTryCount") if e2tMaxSubReqTryCount == 0 { e2tMaxSubReqTryCount = 1 } - xapp.Logger.Info("e2tMaxSubReqTryCount %v", e2tMaxSubReqTryCount) + xapp.Logger.Debug("e2tMaxSubReqTryCount %v", e2tMaxSubReqTryCount) e2tMaxSubDelReqTryCount = viper.GetUint64("controls.e2tMaxSubDelReqTryCount") if e2tMaxSubDelReqTryCount == 0 { e2tMaxSubDelReqTryCount = 1 } - xapp.Logger.Info("e2tMaxSubDelReqTryCount %v", e2tMaxSubDelReqTryCount) + xapp.Logger.Debug("e2tMaxSubDelReqTryCount %v", e2tMaxSubDelReqTryCount) readSubsFromDb = viper.GetString("controls.readSubsFromDb") if readSubsFromDb == "" { readSubsFromDb = "true" } - xapp.Logger.Info("readSubsFromDb %v", readSubsFromDb) + xapp.Logger.Debug("readSubsFromDb %v", readSubsFromDb) dbTryCount = viper.GetInt("controls.dbTryCount") if dbTryCount == 0 { dbTryCount = 200 } - xapp.Logger.Info("dbTryCount %v", dbTryCount) + xapp.Logger.Debug("dbTryCount %v", dbTryCount) dbRetryForever = viper.GetString("controls.dbRetryForever") if dbRetryForever == "" { dbRetryForever = "true" } - xapp.Logger.Info("dbRetryForever %v", dbRetryForever) - - c.LoggerLevel = viper.GetUint32("logger.level") - if c.LoggerLevel == 0 { - c.LoggerLevel = 3 - } - xapp.Logger.Info("LoggerLevel %v", c.LoggerLevel) + xapp.Logger.Debug("dbRetryForever %v", dbRetryForever) // Internal cfg parameter, used to define a wait time for RMR route clean-up. None default // value 100ms used currently only in unittests. @@ -268,7 +282,7 @@ func (c *Control) ReadConfigParameters(f string) { if waitRouteCleanup_ms == 0 { waitRouteCleanup_ms = 5000 * 1000000 } - xapp.Logger.Info("waitRouteCleanup %v", waitRouteCleanup_ms) + xapp.Logger.Debug("waitRouteCleanup %v", waitRouteCleanup_ms) } //------------------------------------------------------------------- @@ -279,9 +293,12 @@ func (c *Control) HandleUncompletedSubscriptions(register map[uint32]*Subscripti xapp.Logger.Debug("HandleUncompletedSubscriptions. len(register) = %v", len(register)) for subId, subs := range register { if subs.SubRespRcvd == false { - subs.NoRespToXapp = true - xapp.Logger.Debug("SendSubscriptionDeleteReq. subId = %v", subId) - c.SendSubscriptionDeleteReq(subs) + // If policy subscription has already been made successfully unsuccessful update should not be deleted. + if subs.PolicyUpdate == false { + subs.NoRespToXapp = true + xapp.Logger.Debug("SendSubscriptionDeleteReq. subId = %v", subId) + c.SendSubscriptionDeleteReq(subs) + } } } } @@ -301,7 +318,7 @@ func (c *Control) Run() { //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) GetOrCreateRestSubscription(p *models.SubscriptionParams, md5sum string, xAppRmrEndpoint string) (*RESTSubscription, string, error) { +func (c *Control) GetOrCreateRestSubscription(p *models.SubscriptionParams, md5sum string, xAppRmrEndpoint string) (*RESTSubscription, string, string, error) { var restSubId string var restSubscription *RESTSubscription @@ -309,56 +326,54 @@ func (c *Control) GetOrCreateRestSubscription(p *models.SubscriptionParams, md5s prevRestSubsId, exists := restDuplicateCtrl.GetLastKnownRestSubsIdBasedOnMd5sum(md5sum) if p.SubscriptionID == "" { + // Subscription does not contain REST subscription Id if exists { restSubscription, err = c.registry.GetRESTSubscription(prevRestSubsId, false) if restSubscription != nil { + // Subscription not found restSubId = prevRestSubsId if err == nil { - xapp.Logger.Info("Existing restSubId %s found by MD5sum %s for a request without subscription ID - using previous subscription", prevRestSubsId, md5sum) + xapp.Logger.Debug("Existing restSubId %s found by MD5sum %s for a request without subscription ID - using previous subscription", prevRestSubsId, md5sum) } else { - xapp.Logger.Info("Existing restSubId %s found by MD5sum %s for a request without subscription ID - Note: %s", prevRestSubsId, md5sum, err.Error()) + xapp.Logger.Debug("Existing restSubId %s found by MD5sum %s for a request without subscription ID - Note: %s", prevRestSubsId, md5sum, err.Error()) } } else { - xapp.Logger.Info("None existing restSubId %s referred by MD5sum %s for a request without subscription ID - deleting cached entry", prevRestSubsId, md5sum) + xapp.Logger.Debug("None existing restSubId %s referred by MD5sum %s for a request without subscription ID - deleting cached entry", prevRestSubsId, md5sum) restDuplicateCtrl.DeleteLastKnownRestSubsIdBasedOnMd5sum(md5sum) } } if restSubscription == nil { restSubId = ksuid.New().String() - restSubscription, err = c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid) - if err != nil { - xapp.Logger.Error("%s", err.Error()) - c.UpdateCounter(cRestSubFailToXapp) - return nil, "", err - } + restSubscription = c.registry.CreateRESTSubscription(&restSubId, &xAppRmrEndpoint, p.Meid) } } else { + // Subscription contains REST subscription Id restSubId = p.SubscriptionID - xapp.Logger.Info("RestSubscription ID %s provided via REST request", restSubId) - + xapp.Logger.Debug("RestSubscription ID %s provided via REST request", restSubId) restSubscription, err = c.registry.GetRESTSubscription(restSubId, false) if err != nil { + // Subscription with id in REST request does not exist xapp.Logger.Error("%s", err.Error()) c.UpdateCounter(cRestSubFailToXapp) - return nil, "", err + return nil, "", models.SubscriptionInstanceRejectCauseRESTSubscriptionWithGivenIDDoesNotExist, err } if !exists { - xapp.Logger.Info("Existing restSubscription found for ID %s, new request based on md5sum", restSubId) + xapp.Logger.Debug("Existing restSubscription found for ID %s, new request based on md5sum", restSubId) } else { - xapp.Logger.Info("Existing restSubscription found for ID %s(%s), re-transmission based on md5sum match with previous request", prevRestSubsId, restSubId) + xapp.Logger.Debug("Existing restSubscription found for ID %s(%s), re-transmission based on md5sum match with previous request", prevRestSubsId, restSubId) } } - return restSubscription, restSubId, nil + return restSubscription, restSubId, "", nil } //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionResponse, error) { +func (c *Control) RESTSubscriptionHandler(params interface{}) (*models.SubscriptionResponse, int) { c.CntRecvMsg++ c.UpdateCounter(cRestSubReqFromXapp) @@ -371,16 +386,17 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR } if p.ClientEndpoint == nil { - xapp.Logger.Error("ClientEndpoint == nil") + err := fmt.Errorf("ClientEndpoint == nil") + xapp.Logger.Error("%v", err) c.UpdateCounter(cRestSubFailToXapp) - return nil, fmt.Errorf("") + return c.GetSubscriptionResponse(models.SubscriptionInstanceRejectCauseInvalidRESTRequestMessage, err.Error(), "SUBMGR", ""), common.SubscribeBadRequestCode } _, xAppRmrEndpoint, err := ConstructEndpointAddresses(*p.ClientEndpoint) if err != nil { xapp.Logger.Error("%s", err.Error()) c.UpdateCounter(cRestSubFailToXapp) - return nil, err + return c.GetSubscriptionResponse(models.SubscriptionInstanceRejectCauseInvalidRESTRequestMessage, err.Error(), "SUBMGR", ""), common.SubscribeBadRequestCode } md5sum, err := CalculateRequestMd5sum(params) @@ -388,10 +404,10 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR xapp.Logger.Error("Failed to generate md5sum from incoming request - %s", err.Error()) } - restSubscription, restSubId, err := c.GetOrCreateRestSubscription(p, md5sum, xAppRmrEndpoint) + restSubscription, restSubId, rejectCause, err := c.GetOrCreateRestSubscription(p, md5sum, xAppRmrEndpoint) if err != nil { xapp.Logger.Error("Failed to get/allocate REST subscription") - return nil, err + return c.GetSubscriptionResponse(rejectCause, err.Error(), "SUBMGR", ""), common.SubscribeBadRequestCode } subResp.SubscriptionID = &restSubId @@ -402,22 +418,85 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR restDuplicateCtrl.DeleteLastKnownRestSubsIdBasedOnMd5sum(md5sum) c.registry.DeleteRESTSubscription(&restSubId) c.UpdateCounter(cRestSubFailToXapp) - return nil, err + return c.GetSubscriptionResponse(models.SubscriptionInstanceRejectCauseInvalidRESTRequestMessage, err.Error(), "SUBMGR", ""), common.SubscribeBadRequestCode } duplicate := restDuplicateCtrl.IsDuplicateToOngoingTransaction(restSubId, md5sum) if duplicate { - xapp.Logger.Info("Retransmission blocker direct ACK for request of restSubsId %s restSubId MD5sum %s as retransmission", restSubId, md5sum) + err := fmt.Errorf("Retransmission blocker direct ACK for request of restSubsId %s restSubId MD5sum %s as retransmission", restSubId, md5sum) + xapp.Logger.Debug("%s", err) c.UpdateCounter(cRestSubRespToXapp) - return &subResp, nil + return &subResp, common.SubscribeCreatedCode } c.WriteRESTSubscriptionToDb(restSubId, restSubscription) - - go c.processSubscriptionRequests(restSubscription, &subReqList, p.ClientEndpoint, p.Meid, &restSubId, xAppRmrEndpoint, md5sum) + e2SubscriptionDirectives, err := c.GetE2SubscriptionDirectives(p) + if err != nil { + xapp.Logger.Error("%s", err) + return c.GetSubscriptionResponse(models.SubscriptionInstanceRejectCauseInvalidRESTRequestMessage, err.Error(), "SUBMGR", ""), common.SubscribeBadRequestCode + } + go c.processSubscriptionRequests(restSubscription, &subReqList, p.ClientEndpoint, p.Meid, &restSubId, xAppRmrEndpoint, md5sum, e2SubscriptionDirectives) c.UpdateCounter(cRestSubRespToXapp) - return &subResp, nil + return &subResp, common.SubscribeCreatedCode +} + +//------------------------------------------------------------------- +// +//------------------------------------------------------------------- +func (c *Control) GetE2SubscriptionDirectives(p *models.SubscriptionParams) (*E2SubscriptionDirectives, error) { + + e2SubscriptionDirectives := &E2SubscriptionDirectives{} + if p == nil || p.E2SubscriptionDirectives == nil { + e2SubscriptionDirectives.E2TimeoutTimerValue = e2tSubReqTimeout + e2SubscriptionDirectives.E2MaxTryCount = int64(e2tMaxSubReqTryCount) + e2SubscriptionDirectives.CreateRMRRoute = true + xapp.Logger.Debug("p == nil || p.E2SubscriptionDirectives == nil. Using default values for E2TimeoutTimerValue = %v and E2RetryCount = %v RMRRoutingNeeded = true", e2tSubReqTimeout, e2tMaxSubReqTryCount) + } else { + if p.E2SubscriptionDirectives.E2TimeoutTimerValue >= 1 && p.E2SubscriptionDirectives.E2TimeoutTimerValue <= 10 { + e2SubscriptionDirectives.E2TimeoutTimerValue = time.Duration(p.E2SubscriptionDirectives.E2TimeoutTimerValue) * 1000000000 // Duration type cast returns nano seconds + } else { + return nil, fmt.Errorf("p.E2SubscriptionDirectives.E2TimeoutTimerValue out of range (1-10 seconds): %v", p.E2SubscriptionDirectives.E2TimeoutTimerValue) + } + if p.E2SubscriptionDirectives.E2RetryCount == nil { + xapp.Logger.Error("p.E2SubscriptionDirectives.E2RetryCount == nil. Using default value") + e2SubscriptionDirectives.E2MaxTryCount = int64(e2tMaxSubReqTryCount) + } else { + if *p.E2SubscriptionDirectives.E2RetryCount >= 0 && *p.E2SubscriptionDirectives.E2RetryCount <= 10 { + e2SubscriptionDirectives.E2MaxTryCount = *p.E2SubscriptionDirectives.E2RetryCount + 1 // E2MaxTryCount = First sending plus two retries + } else { + return nil, fmt.Errorf("p.E2SubscriptionDirectives.E2RetryCount out of range (0-10): %v", *p.E2SubscriptionDirectives.E2RetryCount) + } + } + if p.E2SubscriptionDirectives.RMRRoutingNeeded == nil { + xapp.Logger.Error("p.E2SubscriptionDirectives.RMRRoutingNeeded == nil") + e2SubscriptionDirectives.CreateRMRRoute = true + } else { + e2SubscriptionDirectives.CreateRMRRoute = *p.E2SubscriptionDirectives.RMRRoutingNeeded + } + } + xapp.Logger.Debug("e2SubscriptionDirectives.E2TimeoutTimerValue: %v", e2SubscriptionDirectives.E2TimeoutTimerValue) + xapp.Logger.Debug("e2SubscriptionDirectives.E2MaxTryCount: %v", e2SubscriptionDirectives.E2MaxTryCount) + xapp.Logger.Debug("e2SubscriptionDirectives.CreateRMRRoute: %v", e2SubscriptionDirectives.CreateRMRRoute) + return e2SubscriptionDirectives, nil +} + +//------------------------------------------------------------------- +// +//------------------------------------------------------------------- +func (c *Control) GetSubscriptionResponse(rejectCause string, errorCause string, errorSource string, timeoutType string) *models.SubscriptionResponse { + subResp := models.SubscriptionResponse{} + subscriptionInstance := models.SubscriptionInstance{} + subscriptionInstance.RejectCause = &rejectCause + subscriptionInstance.ErrorCause = &errorCause + subscriptionInstance.ErrorSource = &errorSource + if timeoutType != "" { + subscriptionInstance.TimeoutType = &timeoutType + } + subResp.SubscriptionInstances = append(subResp.SubscriptionInstances, &subscriptionInstance) + xapp.Logger.Error("etSubscriptionResponse() %+v", subscriptionInstance) + + return &subResp } //------------------------------------------------------------------- @@ -425,12 +504,13 @@ func (c *Control) SubscriptionHandler(params interface{}) (*models.SubscriptionR //------------------------------------------------------------------- func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription, subReqList *e2ap.SubscriptionRequestList, - clientEndpoint *models.SubscriptionParamsClientEndpoint, meid *string, restSubId *string, xAppRmrEndpoint string, md5sum string) { + clientEndpoint *models.SubscriptionParamsClientEndpoint, meid *string, restSubId *string, xAppRmrEndpoint string, md5sum string, e2SubscriptionDirectives *E2SubscriptionDirectives) { - xapp.Logger.Info("Subscription Request count=%v ", len(subReqList.E2APSubscriptionRequests)) + xapp.Logger.Debug("Subscription Request count=%v ", len(subReqList.E2APSubscriptionRequests)) var xAppEventInstanceID int64 var e2EventInstanceID int64 + errorInfo := &ErrorInfo{} defer restDuplicateCtrl.SetMd5sumFromLastOkRequest(*restSubId, md5sum) @@ -442,22 +522,23 @@ func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription if trans == nil { // Send notification to xApp that prosessing of a Subscription Request has failed. err := fmt.Errorf("Tracking failure") - c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans) + errorInfo.ErrorCause = err.Error() + c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans, errorInfo) continue } - xapp.Logger.Info("Handle SubscriptionRequest index=%v, %s", index, idstring(nil, trans)) + xapp.Logger.Debug("Handle SubscriptionRequest index=%v, %s", index, idstring(nil, trans)) - subRespMsg, err := c.handleSubscriptionRequest(trans, &subReqMsg, meid, *restSubId) + subRespMsg, errorInfo, err := c.handleSubscriptionRequest(trans, &subReqMsg, meid, *restSubId, e2SubscriptionDirectives) - xapp.Logger.Info("Handled SubscriptionRequest index=%v, %s", index, idstring(nil, trans)) + xapp.Logger.Debug("Handled SubscriptionRequest index=%v, %s", index, idstring(nil, trans)) if err != nil { - c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans) + c.sendUnsuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, err, clientEndpoint, trans, errorInfo) } else { e2EventInstanceID = (int64)(subRespMsg.RequestId.InstanceId) restSubscription.AddMd5Sum(md5sum) - xapp.Logger.Info("SubscriptionRequest index=%v processed successfullyfor %s. endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", + xapp.Logger.Debug("SubscriptionRequest index=%v processed successfullyfor %s. endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", index, *restSubId, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans)) c.sendSuccesfullResponseNotification(restSubId, restSubscription, xAppEventInstanceID, e2EventInstanceID, clientEndpoint, trans) } @@ -469,25 +550,28 @@ func (c *Control) processSubscriptionRequests(restSubscription *RESTSubscription // //------------------------------------------------------------------ func (c *Control) handleSubscriptionRequest(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, meid *string, - restSubId string) (*e2ap.E2APSubscriptionResponse, error) { + restSubId string, e2SubscriptionDirectives *E2SubscriptionDirectives) (*e2ap.E2APSubscriptionResponse, *ErrorInfo, error) { + + errorInfo := ErrorInfo{} err := c.tracker.Track(trans) if err != nil { xapp.Logger.Error("XAPP-SubReq Tracking error: %s", idstring(err, trans)) + errorInfo.ErrorCause = err.Error() err = fmt.Errorf("Tracking failure") - return nil, err + return nil, &errorInfo, err } - subs, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c) + subs, errorInfo, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c, e2SubscriptionDirectives.CreateRMRRoute) if err != nil { xapp.Logger.Error("XAPP-SubReq Assign error: %s", idstring(err, trans)) - return nil, err + return nil, &errorInfo, err } // // Wake subs request // - go c.handleSubscriptionCreate(subs, trans) + go c.handleSubscriptionCreate(subs, trans, e2SubscriptionDirectives) event, _ := trans.WaitEvent(0) //blocked wait as timeout is handled in subs side err = nil @@ -495,37 +579,54 @@ func (c *Control) handleSubscriptionRequest(trans *TransactionXapp, subReqMsg *e switch themsg := event.(type) { case *e2ap.E2APSubscriptionResponse: trans.Release() - return themsg, nil + return themsg, &errorInfo, nil case *e2ap.E2APSubscriptionFailure: err = fmt.Errorf("E2 SubscriptionFailure received") - return nil, err + errorInfo.SetInfo(err.Error(), models.SubscriptionInstanceErrorSourceE2Node, "") + return nil, &errorInfo, err + case *PackSubscriptionRequestErrortEvent: + err = fmt.Errorf("E2 SubscriptionRequest pack failure") + return nil, &themsg.ErrorInfo, err + case *SDLWriteErrortEvent: + err = fmt.Errorf("SDL write failure") + return nil, &themsg.ErrorInfo, err default: - err = fmt.Errorf("unexpected E2 subscription response received") + err = fmt.Errorf("Unexpected E2 subscription response received") + errorInfo.SetInfo(err.Error(), models.SubscriptionInstanceErrorSourceE2Node, "") break } } else { err = fmt.Errorf("E2 subscription response timeout") + errorInfo.SetInfo(err.Error(), "", models.SubscriptionInstanceTimeoutTypeE2Timeout) + if subs.PolicyUpdate == true { + return nil, &errorInfo, err + } } xapp.Logger.Error("XAPP-SubReq E2 subscription failed %s", idstring(err, trans, subs)) c.registry.RemoveFromSubscription(subs, trans, waitRouteCleanup_ms, c) - return nil, err + return nil, &errorInfo, err } //------------------------------------------------------------------- // //------------------------------------------------------------------- func (c *Control) sendUnsuccesfullResponseNotification(restSubId *string, restSubscription *RESTSubscription, xAppEventInstanceID int64, err error, - clientEndpoint *models.SubscriptionParamsClientEndpoint, trans *TransactionXapp) { + clientEndpoint *models.SubscriptionParamsClientEndpoint, trans *TransactionXapp, errorInfo *ErrorInfo) { // Send notification to xApp that prosessing of a Subscription Request has failed. e2EventInstanceID := (int64)(0) - errorCause := err.Error() + if errorInfo.ErrorSource == "" { + // Submgr is default source of error + errorInfo.ErrorSource = models.SubscriptionInstanceErrorSourceSUBMGR + } resp := &models.SubscriptionResponse{ SubscriptionID: restSubId, SubscriptionInstances: []*models.SubscriptionInstance{ &models.SubscriptionInstance{E2EventInstanceID: &e2EventInstanceID, - ErrorCause: &errorCause, + ErrorCause: &errorInfo.ErrorCause, + ErrorSource: &errorInfo.ErrorSource, + TimeoutType: &errorInfo.TimeoutType, XappEventInstanceID: &xAppEventInstanceID}, }, } @@ -533,11 +634,11 @@ func (c *Control) sendUnsuccesfullResponseNotification(restSubId *string, restSu restSubscription.SetProcessed(err) c.UpdateRESTSubscriptionInDB(*restSubId, restSubscription, false) if trans != nil { - xapp.Logger.Info("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", - errorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans)) + xapp.Logger.Debug("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", + errorInfo.ErrorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans)) } else { - xapp.Logger.Info("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v", - errorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID) + xapp.Logger.Debug("Sending unsuccessful REST notification (cause %s) to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v", + errorInfo.ErrorCause, clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID) } c.UpdateCounter(cRestSubFailNotifToXapp) @@ -566,7 +667,7 @@ func (c *Control) sendSuccesfullResponseNotification(restSubId *string, restSubs // Mark REST subscription request processesd. restSubscription.SetProcessed(nil) c.UpdateRESTSubscriptionInDB(*restSubId, restSubscription, false) - xapp.Logger.Info("Sending successful REST notification to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", + xapp.Logger.Debug("Sending successful REST notification to endpoint=%v:%v, XappEventInstanceID=%v, E2EventInstanceID=%v, %s", clientEndpoint.Host, *clientEndpoint.HTTPPort, xAppEventInstanceID, e2EventInstanceID, idstring(nil, trans)) c.UpdateCounter(cRestSubNotifToXapp) @@ -576,42 +677,41 @@ func (c *Control) sendSuccesfullResponseNotification(restSubId *string, restSubs //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) SubscriptionDeleteHandlerCB(restSubId string) error { +func (c *Control) RESTSubscriptionDeleteHandler(restSubId string) int { c.CntRecvMsg++ c.UpdateCounter(cRestSubDelReqFromXapp) - xapp.Logger.Info("SubscriptionDeleteRequest from XAPP") + xapp.Logger.Debug("SubscriptionDeleteRequest from XAPP") restSubscription, err := c.registry.GetRESTSubscription(restSubId, true) if err != nil { xapp.Logger.Error("%s", err.Error()) if restSubscription == nil { // Subscription was not found - return nil + return common.UnsubscribeNoContentCode } else { if restSubscription.SubReqOngoing == true { err := fmt.Errorf("Handling of the REST Subscription Request still ongoing %s", restSubId) xapp.Logger.Error("%s", err.Error()) - return err + return common.UnsubscribeBadRequestCode } else if restSubscription.SubDelReqOngoing == true { // Previous request for same restSubId still ongoing - return nil + return common.UnsubscribeBadRequestCode } } } xAppRmrEndPoint := restSubscription.xAppRmrEndPoint go func() { - xapp.Logger.Info("Deleteting handler: processing instances = %v", restSubscription.InstanceIds) + xapp.Logger.Debug("Deleteting handler: processing instances = %v", restSubscription.InstanceIds) for _, instanceId := range restSubscription.InstanceIds { xAppEventInstanceID, err := c.SubscriptionDeleteHandler(&restSubId, &xAppRmrEndPoint, &restSubscription.Meid, instanceId) if err != nil { xapp.Logger.Error("%s", err.Error()) - //return err } - xapp.Logger.Info("Deleteting instanceId = %v", instanceId) + xapp.Logger.Debug("Deleteting instanceId = %v", instanceId) restSubscription.DeleteXappIdToE2Id(xAppEventInstanceID) restSubscription.DeleteE2InstanceId(instanceId) } @@ -622,7 +722,7 @@ func (c *Control) SubscriptionDeleteHandlerCB(restSubId string) error { c.UpdateCounter(cRestSubDelRespToXapp) - return nil + return common.UnsubscribeNoContentCode } //------------------------------------------------------------------- @@ -633,7 +733,7 @@ func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string, var xAppEventInstanceID int64 subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{instanceId}) if err != nil { - xapp.Logger.Info("Subscription Delete Handler subscription for restSubId=%v, E2EventInstanceID=%v not found %s", + xapp.Logger.Debug("Subscription Delete Handler subscription for restSubId=%v, E2EventInstanceID=%v not found %s", restSubId, instanceId, idstring(err, nil)) return xAppEventInstanceID, nil } @@ -668,8 +768,8 @@ func (c *Control) SubscriptionDeleteHandler(restSubId *string, endPoint *string, //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) QueryHandler() (models.SubscriptionList, error) { - xapp.Logger.Info("QueryHandler() called") +func (c *Control) RESTQueryHandler() (models.SubscriptionList, error) { + xapp.Logger.Debug("RESTQueryHandler() called") c.CntRecvMsg++ @@ -677,7 +777,7 @@ func (c *Control) QueryHandler() (models.SubscriptionList, error) { } func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) { - xapp.Logger.Info("TestRestHandler() called") + xapp.Logger.Debug("RESTTestRestHandler() called") pathParams := mux.Vars(r) s := pathParams["testId"] @@ -686,7 +786,7 @@ func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) { if contains := strings.Contains(s, "deletesubid="); contains == true { var splits = strings.Split(s, "=") if subId, err := strconv.ParseInt(splits[1], 10, 64); err == nil { - xapp.Logger.Info("RemoveSubscriptionFromSdl() called. subId = %v", subId) + xapp.Logger.Debug("RemoveSubscriptionFromSdl() called. subId = %v", subId) c.RemoveSubscriptionFromSdl(uint32(subId)) return } @@ -694,7 +794,7 @@ func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) { // This can be used to remove all subscriptions db from if s == "emptydb" { - xapp.Logger.Info("RemoveAllSubscriptionsFromSdl() called") + xapp.Logger.Debug("RemoveAllSubscriptionsFromSdl() called") c.RemoveAllSubscriptionsFromSdl() c.RemoveAllRESTSubscriptionsFromSdl() return @@ -702,11 +802,11 @@ func (c *Control) TestRestHandler(w http.ResponseWriter, r *http.Request) { // This is meant to cause submgr's restart in testing if s == "restart" { - xapp.Logger.Info("os.Exit(1) called") + xapp.Logger.Debug("os.Exit(1) called") os.Exit(1) } - xapp.Logger.Info("Unsupported rest command received %s", s) + xapp.Logger.Debug("Unsupported rest command received %s", s) } //------------------------------------------------------------------- @@ -723,7 +823,7 @@ func (c *Control) rmrSendToE2T(desc string, subs *Subscription, trans *Transacti params.PayloadLen = len(trans.Payload.Buf) params.Payload = trans.Payload.Buf params.Mbuf = nil - xapp.Logger.Info("MSG to E2T: %s %s %s", desc, trans.String(), params.String()) + xapp.Logger.Debug("MSG to E2T: %s %s %s", desc, trans.String(), params.String()) err = c.SendWithRetry(params, false, 5) if err != nil { xapp.Logger.Error("rmrSendToE2T: Send failed: %+v", err) @@ -742,7 +842,7 @@ func (c *Control) rmrSendToXapp(desc string, subs *Subscription, trans *Transact params.PayloadLen = len(trans.Payload.Buf) params.Payload = trans.Payload.Buf params.Mbuf = nil - xapp.Logger.Info("MSG to XAPP: %s %s %s", desc, trans.String(), params.String()) + xapp.Logger.Debug("MSG to XAPP: %s %s %s", desc, trans.String(), params.String()) err = c.SendWithRetry(params, false, 5) if err != nil { xapp.Logger.Error("rmrSendToXapp: Send failed: %+v", err) @@ -784,7 +884,7 @@ func (c *Control) Consume(msg *xapp.RMRParams) (err error) { case xapp.RIC_SUB_DEL_FAILURE: go c.handleE2TSubscriptionDeleteFailure(msg) default: - xapp.Logger.Info("Unknown Message Type '%d', discarding", msg.Mtype) + xapp.Logger.Debug("Unknown Message Type '%d', discarding", msg.Mtype) } return } @@ -793,7 +893,7 @@ func (c *Control) Consume(msg *xapp.RMRParams) (err error) { // handle from XAPP Subscription Request //------------------------------------------------------------------ func (c *Control) handleXAPPSubscriptionRequest(params *xapp.RMRParams) { - xapp.Logger.Info("MSG from XAPP: %s", params.String()) + xapp.Logger.Debug("MSG from XAPP: %s", params.String()) c.UpdateCounter(cSubReqFromXapp) subReqMsg, err := c.e2ap.UnpackSubscriptionRequest(params.Payload) @@ -815,7 +915,7 @@ func (c *Control) handleXAPPSubscriptionRequest(params *xapp.RMRParams) { } //TODO handle subscription toward e2term inside AssignToSubscription / hide handleSubscriptionCreate in it? - subs, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c) + subs, _, err := c.registry.AssignToSubscription(trans, subReqMsg, c.ResetTestFlag, c, true) if err != nil { xapp.Logger.Error("XAPP-SubReq: %s", idstring(err, trans)) return @@ -829,7 +929,8 @@ func (c *Control) handleXAPPSubscriptionRequest(params *xapp.RMRParams) { //------------------------------------------------------------------ func (c *Control) wakeSubscriptionRequest(subs *Subscription, trans *TransactionXapp) { - go c.handleSubscriptionCreate(subs, trans) + e2SubscriptionDirectives, _ := c.GetE2SubscriptionDirectives(nil) + go c.handleSubscriptionCreate(subs, trans, e2SubscriptionDirectives) event, _ := trans.WaitEvent(0) //blocked wait as timeout is handled in subs side var err error if event != nil { @@ -854,7 +955,7 @@ func (c *Control) wakeSubscriptionRequest(subs *Subscription, trans *Transaction break } } - xapp.Logger.Info("XAPP-SubReq: failed %s", idstring(err, trans, subs)) + xapp.Logger.Debug("XAPP-SubReq: failed %s", idstring(err, trans, subs)) //c.registry.RemoveFromSubscription(subs, trans, 5*time.Second) } @@ -862,7 +963,7 @@ func (c *Control) wakeSubscriptionRequest(subs *Subscription, trans *Transaction // handle from XAPP Subscription Delete Request //------------------------------------------------------------------ func (c *Control) handleXAPPSubscriptionDeleteRequest(params *xapp.RMRParams) { - xapp.Logger.Info("MSG from XAPP: %s", params.String()) + xapp.Logger.Debug("MSG from XAPP: %s", params.String()) c.UpdateCounter(cSubDelReqFromXapp) subDelReqMsg, err := c.e2ap.UnpackSubscriptionDeleteRequest(params.Payload) @@ -900,6 +1001,7 @@ func (c *Control) handleXAPPSubscriptionDeleteRequest(params *xapp.RMRParams) { if subs.NoRespToXapp == true { // Do no send delete responses to xapps due to submgr restart is deleting uncompleted subscriptions + xapp.Logger.Debug("XAPP-SubDelReq: subs.NoRespToXapp == true") return } @@ -921,8 +1023,9 @@ func (c *Control) handleXAPPSubscriptionDeleteRequest(params *xapp.RMRParams) { //------------------------------------------------------------------- // SUBS CREATE Handling //------------------------------------------------------------------- -func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *TransactionXapp) { +func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *TransactionXapp, e2SubscriptionDirectives *E2SubscriptionDirectives) { + var event interface{} = nil var removeSubscriptionFromDb bool = false trans := c.tracker.NewSubsTransaction(subs) subs.WaitTransactionTurn(trans) @@ -933,7 +1036,7 @@ func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *Tran subRfMsg, valid := subs.GetCachedResponse() if subRfMsg == nil && valid == true { - event := c.sendE2TSubscriptionRequest(subs, trans, parentTrans) + event = c.sendE2TSubscriptionRequest(subs, trans, parentTrans, e2SubscriptionDirectives) switch event.(type) { case *e2ap.E2APSubscriptionResponse: subRfMsg, valid = subs.SetCachedResponse(event, true) @@ -941,29 +1044,37 @@ func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *Tran case *e2ap.E2APSubscriptionFailure: removeSubscriptionFromDb = true subRfMsg, valid = subs.SetCachedResponse(event, false) - xapp.Logger.Info("SUBS-SubReq: internal delete due failure event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans)) + xapp.Logger.Debug("SUBS-SubReq: internal delete due failure event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans)) c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans) case *SubmgrRestartTestEvent: // This simulates that no response has been received and after restart subscriptions are restored from db xapp.Logger.Debug("Test restart flag is active. Dropping this transaction to test restart case") - return + case *PackSubscriptionRequestErrortEvent, *SDLWriteErrortEvent: + subRfMsg, valid = subs.SetCachedResponse(event, false) default: - xapp.Logger.Info("SUBS-SubReq: internal delete due default event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans)) - removeSubscriptionFromDb = true - subRfMsg, valid = subs.SetCachedResponse(nil, false) - c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans) + if subs.PolicyUpdate == false { + xapp.Logger.Debug("SUBS-SubReq: internal delete due default event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans)) + removeSubscriptionFromDb = true + subRfMsg, valid = subs.SetCachedResponse(nil, false) + c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans) + } } xapp.Logger.Debug("SUBS-SubReq: Handling (e2t response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans)) } else { xapp.Logger.Debug("SUBS-SubReq: Handling (cached response %s) %s", typeofSubsMessage(subRfMsg), idstring(nil, trans, subs, parentTrans)) } + err := c.UpdateSubscriptionInDB(subs, removeSubscriptionFromDb) + if err != nil { + subRfMsg, valid = subs.SetCachedResponse(event, false) + c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans) + } + //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete) if valid == false { c.registry.RemoveFromSubscription(subs, parentTrans, waitRouteCleanup_ms, c) } - c.UpdateSubscriptionInDB(subs, removeSubscriptionFromDb) parentTrans.SendEvent(subRfMsg, 0) } @@ -1000,7 +1111,7 @@ func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *Tran //------------------------------------------------------------------- // send to E2T Subscription Request //------------------------------------------------------------------- -func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} { +func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp, e2SubscriptionDirectives *E2SubscriptionDirectives) interface{} { var err error var event interface{} = nil var timedOut bool = false @@ -1012,13 +1123,26 @@ func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *Transact trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionRequest(subReqMsg) if err != nil { xapp.Logger.Error("SUBS-SubReq: %s", idstring(err, trans, subs, parentTrans)) - return event + return &PackSubscriptionRequestErrortEvent{ + ErrorInfo{ + ErrorSource: models.SubscriptionInstanceErrorSourceASN1, + ErrorCause: err.Error(), + }, + } } // Write uncompleted subscrition in db. If no response for subscrition it need to be re-processed (deleted) after restart - c.WriteSubscriptionToDb(subs) + err = c.WriteSubscriptionToDb(subs) + if err != nil { + return &SDLWriteErrortEvent{ + ErrorInfo{ + ErrorSource: models.SubscriptionInstanceErrorSourceDBAAS, + ErrorCause: err.Error(), + }, + } + } - for retries := uint64(0); retries < e2tMaxSubReqTryCount; retries++ { + for retries := int64(0); retries < e2SubscriptionDirectives.E2MaxTryCount; retries++ { desc := fmt.Sprintf("(retry %d)", retries) if retries == 0 { c.UpdateCounter(cSubReqToE2) @@ -1027,7 +1151,7 @@ func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *Transact } c.rmrSendToE2T(desc, subs, trans) if subs.DoNotWaitSubResp == false { - event, timedOut = trans.WaitEvent(e2tSubReqTimeout) + event, timedOut = trans.WaitEvent(e2SubscriptionDirectives.E2TimeoutTimerValue) if timedOut { c.UpdateCounter(cSubReqTimerExpiry) continue @@ -1035,6 +1159,7 @@ func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *Transact } else { // Simulating case where subscrition request has been sent but response has not been received before restart event = &SubmgrRestartTestEvent{} + xapp.Logger.Debug("Restart event, DoNotWaitSubResp == true") } break } @@ -1085,7 +1210,7 @@ func (c *Control) sendE2TSubscriptionDeleteRequest(subs *Subscription, trans *Tr // handle from E2T Subscription Response //------------------------------------------------------------------- func (c *Control) handleE2TSubscriptionResponse(params *xapp.RMRParams) { - xapp.Logger.Info("MSG from E2T: %s", params.String()) + xapp.Logger.Debug("MSG from E2T: %s", params.String()) c.UpdateCounter(cSubRespFromE2) subRespMsg, err := c.e2ap.UnpackSubscriptionResponse(params.Payload) @@ -1116,7 +1241,7 @@ func (c *Control) handleE2TSubscriptionResponse(params *xapp.RMRParams) { // handle from E2T Subscription Failure //------------------------------------------------------------------- func (c *Control) handleE2TSubscriptionFailure(params *xapp.RMRParams) { - xapp.Logger.Info("MSG from E2T: %s", params.String()) + xapp.Logger.Debug("MSG from E2T: %s", params.String()) c.UpdateCounter(cSubFailFromE2) subFailMsg, err := c.e2ap.UnpackSubscriptionFailure(params.Payload) if err != nil { @@ -1146,7 +1271,7 @@ func (c *Control) handleE2TSubscriptionFailure(params *xapp.RMRParams) { // handle from E2T Subscription Delete Response //------------------------------------------------------------------- func (c *Control) handleE2TSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) { - xapp.Logger.Info("MSG from E2T: %s", params.String()) + xapp.Logger.Debug("MSG from E2T: %s", params.String()) c.UpdateCounter(cSubDelRespFromE2) subDelRespMsg, err := c.e2ap.UnpackSubscriptionDeleteResponse(params.Payload) if err != nil { @@ -1176,7 +1301,7 @@ func (c *Control) handleE2TSubscriptionDeleteResponse(params *xapp.RMRParams) (e // handle from E2T Subscription Delete Failure //------------------------------------------------------------------- func (c *Control) handleE2TSubscriptionDeleteFailure(params *xapp.RMRParams) { - xapp.Logger.Info("MSG from E2T: %s", params.String()) + xapp.Logger.Debug("MSG from E2T: %s", params.String()) c.UpdateCounter(cSubDelFailFromE2) subDelFailMsg, err := c.e2ap.UnpackSubscriptionDeleteFailure(params.Payload) if err != nil { @@ -1230,18 +1355,20 @@ func typeofSubsMessage(v interface{}) string { //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) WriteSubscriptionToDb(subs *Subscription) { +func (c *Control) WriteSubscriptionToDb(subs *Subscription) error { xapp.Logger.Debug("WriteSubscriptionToDb() subId = %v", subs.ReqId.InstanceId) err := c.WriteSubscriptionToSdl(subs.ReqId.InstanceId, subs) if err != nil { xapp.Logger.Error("%v", err) + return err } + return nil } //------------------------------------------------------------------- // //------------------------------------------------------------------- -func (c *Control) UpdateSubscriptionInDB(subs *Subscription, removeSubscriptionFromDb bool) { +func (c *Control) UpdateSubscriptionInDB(subs *Subscription, removeSubscriptionFromDb bool) error { if removeSubscriptionFromDb == true { // Subscription was written in db already when subscription request was sent to BTS, except for merged request @@ -1249,10 +1376,12 @@ func (c *Control) UpdateSubscriptionInDB(subs *Subscription, removeSubscriptionF } else { // Update is needed for successful response and merge case here if subs.RetryFromXapp == false { - c.WriteSubscriptionToDb(subs) + err := c.WriteSubscriptionToDb(subs) + return err } } subs.RetryFromXapp = false + return nil } //------------------------------------------------------------------- @@ -1307,27 +1436,29 @@ func (c *Control) SendSubscriptionDeleteReq(subs *Subscription) { xapp.Logger.Debug("Sending subscription delete due to restart. subId = %v", subs.ReqId.InstanceId) // Send delete for every endpoint in the subscription - subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{} - subDelReqMsg.RequestId = subs.GetReqId().RequestId - subDelReqMsg.RequestId.Id = ricRequestorId - subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId - mType, payload, err := c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg) - if err != nil { - xapp.Logger.Error("SendSubscriptionDeleteReq() %s", idstring(err)) - return - } - for _, endPoint := range subs.EpList.Endpoints { - params := &xapp.RMRParams{} - params.Mtype = mType - params.SubId = int(subs.GetReqId().InstanceId) - params.Xid = "" - params.Meid = subs.Meid - params.Src = endPoint.String() - params.PayloadLen = len(payload.Buf) - params.Payload = payload.Buf - params.Mbuf = nil - subs.DeleteFromDb = true - c.handleXAPPSubscriptionDeleteRequest(params) + if subs.PolicyUpdate == false { + subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{} + subDelReqMsg.RequestId = subs.GetReqId().RequestId + subDelReqMsg.RequestId.Id = ricRequestorId + subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId + mType, payload, err := c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg) + if err != nil { + xapp.Logger.Error("SendSubscriptionDeleteReq() %s", idstring(err)) + return + } + for _, endPoint := range subs.EpList.Endpoints { + params := &xapp.RMRParams{} + params.Mtype = mType + params.SubId = int(subs.GetReqId().InstanceId) + params.Xid = "" + params.Meid = subs.Meid + params.Src = endPoint.String() + params.PayloadLen = len(payload.Buf) + params.Payload = payload.Buf + params.Mbuf = nil + subs.DeleteFromDb = true + c.handleXAPPSubscriptionDeleteRequest(params) + } } } @@ -1365,6 +1496,22 @@ func (c *Control) PrintRESTSubscriptionRequest(p *models.SubscriptionParams) { fmt.Println(" Meid = nil") } + if p.E2SubscriptionDirectives == nil { + fmt.Println(" E2SubscriptionDirectives = nil") + } else { + fmt.Println(" E2SubscriptionDirectives") + if p.E2SubscriptionDirectives.E2RetryCount == nil { + fmt.Println(" E2RetryCount == nil") + } else { + fmt.Printf(" E2RetryCount = %v\n", *p.E2SubscriptionDirectives.E2RetryCount) + } + fmt.Printf(" E2TimeoutTimerValue = %v\n", p.E2SubscriptionDirectives.E2TimeoutTimerValue) + if p.E2SubscriptionDirectives.RMRRoutingNeeded == nil { + fmt.Println(" RMRRoutingNeeded == nil") + } else { + fmt.Printf(" RMRRoutingNeeded = %v\n", *p.E2SubscriptionDirectives.RMRRoutingNeeded) + } + } for _, subscriptionDetail := range p.SubscriptionDetails { if p.RANFunctionID != nil { fmt.Printf(" RANFunctionID = %v\n", *p.RANFunctionID) diff --git a/pkg/control/duplicate.go b/pkg/control/duplicate.go index 6900941..2110f1f 100644 --- a/pkg/control/duplicate.go +++ b/pkg/control/duplicate.go @@ -97,7 +97,7 @@ func (d *duplicateCtrl) DeleteLastKnownRestSubsIdBasedOnMd5sum(md5sum string) { if !exists { if md5sum == "" { - xapp.Logger.Info("Attempted to delete a cached md5sum, md5sum not set yet") + xapp.Logger.Debug("Attempted to delete a cached md5sum, md5sum not set yet") } else { xapp.Logger.Error("Attempted to delete a cached md5sum %s, but the value was not found", md5sum) } @@ -133,7 +133,7 @@ func (d *duplicateCtrl) IsDuplicateToOngoingTransaction(restSubsId string, md5su entry, present := d.ongoingRequestMap[md5sum] if present { - xapp.Logger.Info("Collision detected. REST subs ID %s has ongoing transaction with md5sum : %s started at %s\n", entry.restSubsId, md5sum, entry.startTime.Format(time.ANSIC)) + xapp.Logger.Debug("Collision detected. REST subs ID %s has ongoing transaction with md5sum : %s started at %s\n", entry.restSubsId, md5sum, entry.startTime.Format(time.ANSIC)) d.collCount++ return true } diff --git a/pkg/control/e2ap.go b/pkg/control/e2ap.go index 7c2826b..0aa5ebe 100644 --- a/pkg/control/e2ap.go +++ b/pkg/control/e2ap.go @@ -51,7 +51,7 @@ type E2ap struct { // //----------------------------------------------------------------------------- func (c *E2ap) FillSubscriptionReqMsgs(params interface{}, subreqList *e2ap.SubscriptionRequestList, restSubscription *RESTSubscription) error { - xapp.Logger.Info("FillSubscriptionReqMsgs") + xapp.Logger.Debug("FillSubscriptionReqMsgs") p := params.(*models.SubscriptionParams) diff --git a/pkg/control/registry.go b/pkg/control/registry.go index 72a2100..4b48687 100644 --- a/pkg/control/registry.go +++ b/pkg/control/registry.go @@ -22,6 +22,7 @@ package control import ( "encoding/json" "fmt" + "strings" "sync" "time" @@ -115,7 +116,7 @@ func (r *Registry) GetAllRestSubscriptions() []byte { return restSubscriptionsJson } -func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) (*RESTSubscription, error) { +func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *string, maid *string) *RESTSubscription { r.mutex.Lock() defer r.mutex.Unlock() newRestSubscription := RESTSubscription{} @@ -125,15 +126,15 @@ func (r *Registry) CreateRESTSubscription(restSubId *string, xAppRmrEndPoint *st newRestSubscription.SubDelReqOngoing = false r.restSubscriptions[*restSubId] = &newRestSubscription newRestSubscription.xAppIdToE2Id = make(map[int64]int64) - xapp.Logger.Info("Registry: Created REST subscription successfully. restSubId=%v, subscriptionCount=%v, e2apSubscriptionCount=%v", *restSubId, len(r.restSubscriptions), len(r.register)) - return &newRestSubscription, nil + xapp.Logger.Debug("Registry: Created REST subscription successfully. restSubId=%v, subscriptionCount=%v, e2apSubscriptionCount=%v", *restSubId, len(r.restSubscriptions), len(r.register)) + return &newRestSubscription } func (r *Registry) DeleteRESTSubscription(restSubId *string) { r.mutex.Lock() defer r.mutex.Unlock() delete(r.restSubscriptions, *restSubId) - xapp.Logger.Info("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions)) + xapp.Logger.Debug("Registry: Deleted REST subscription successfully. restSubId=%v, subscriptionCount=%v", *restSubId, len(r.restSubscriptions)) } func (r *Registry) GetRESTSubscription(restSubId string, IsDelReqOngoing bool) (*RESTSubscription, error) { @@ -150,7 +151,6 @@ func (r *Registry) GetRESTSubscription(restSubId string, IsDelReqOngoing bool) ( } else { return restSubscription, fmt.Errorf("Registry: REST request is still ongoing for the endpoint=%v, restSubId=%v, SubDelReqOngoing=%v, SubReqOngoing=%v", restSubscription, restSubId, restSubscription.SubDelReqOngoing, restSubscription.SubReqOngoing) } - return restSubscription, nil } return nil, fmt.Errorf("Registry: No valid subscription found with restSubId=%v", restSubId) } @@ -168,7 +168,7 @@ func (r *Registry) QueryHandler() (models.SubscriptionList, error) { return resp, nil } -func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool) (*Subscription, error) { +func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, rmrRoutecreated bool) (*Subscription, error) { if len(r.subIds) > 0 { subId := r.subIds[0] r.subIds = r.subIds[1:] @@ -179,8 +179,10 @@ func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubs subs := &Subscription{ registry: r, Meid: trans.Meid, + RMRRouteCreated: rmrRoutecreated, SubReqMsg: subReqMsg, valid: true, + PolicyUpdate: false, RetryFromXapp: false, SubRespRcvd: false, DeleteFromDb: false, @@ -189,9 +191,7 @@ func (r *Registry) allocateSubs(trans *TransactionXapp, subReqMsg *e2ap.E2APSubs } subs.ReqId.Id = subReqMsg.RequestId.Id subs.ReqId.InstanceId = subId - if resetTestFlag == true { - subs.DoNotWaitSubResp = true - } + r.SetResetTestFlag(resetTestFlag, subs) if subs.EpList.AddEndpoint(trans.GetEndpoint()) == false { r.subIds = append(r.subIds, subs.ReqId.InstanceId) @@ -236,9 +236,10 @@ func (r *Registry) findExistingSubs(trans *TransactionXapp, subReqMsg *e2ap.E2AP return nil, false } -func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control) (*Subscription, error) { +func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap.E2APSubscriptionRequest, resetTestFlag bool, c *Control, createRMRRoute bool) (*Subscription, ErrorInfo, error) { var err error var newAlloc bool + errorInfo := ErrorInfo{} r.mutex.Lock() defer r.mutex.Unlock() @@ -247,9 +248,9 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. // actionType, err := r.CheckActionTypes(subReqMsg) if err != nil { - xapp.Logger.Info("CREATE %s", err) + xapp.Logger.Debug("CREATE %s", err) err = fmt.Errorf("E2 content validation failed") - return nil, err + return nil, errorInfo, err } // @@ -260,17 +261,19 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. xapp.Logger.Debug("CREATE %s. Existing subscription for Policy found.", subs.String()) // Update message data to subscription subs.SubReqMsg = subReqMsg + subs.PolicyUpdate = true subs.SetCachedResponse(nil, true) - return subs, nil + r.SetResetTestFlag(resetTestFlag, subs) + return subs, errorInfo, nil } } subs, endPointFound := r.findExistingSubs(trans, subReqMsg) if subs == nil { - if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag); err != nil { + if subs, err = r.allocateSubs(trans, subReqMsg, resetTestFlag, createRMRRoute); err != nil { xapp.Logger.Error("%s", err.Error()) err = fmt.Errorf("subscription not allocated") - return nil, err + return nil, errorInfo, err } newAlloc = true } else if endPointFound == true { @@ -278,7 +281,7 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. subs.RetryFromXapp = true xapp.Logger.Debug("CREATE subReqMsg.InstanceId=%v. Same subscription %s already exists.", subReqMsg.InstanceId, subs.String()) c.UpdateCounter(cDuplicateE2SubReq) - return subs, nil + return subs, errorInfo, nil } // @@ -288,16 +291,20 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. defer subs.mutex.Unlock() epamount := subs.EpList.Size() - xapp.Logger.Info("AssignToSubscription subs.EpList.Size()=%v", subs.EpList.Size()) + xapp.Logger.Debug("AssignToSubscription subs.EpList.Size()=%v", subs.EpList.Size()) r.mutex.Unlock() // // Subscription route updates // - if epamount == 1 { - err = r.RouteCreate(subs, c) + if createRMRRoute == true { + if epamount == 1 { + errorInfo, err = r.RouteCreate(subs, c) + } else { + errorInfo, err = r.RouteCreateUpdate(subs, c) + } } else { - err = r.RouteCreateUpdate(subs, c) + xapp.Logger.Debug("RMR route not created: createRMRRoute=%v", createRMRRoute) } r.mutex.Lock() @@ -307,7 +314,7 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. } // Delete already added endpoint for the request subs.EpList.DelEndpoint(trans.GetEndpoint()) - return nil, err + return nil, errorInfo, err } if newAlloc { @@ -315,31 +322,45 @@ func (r *Registry) AssignToSubscription(trans *TransactionXapp, subReqMsg *e2ap. } xapp.Logger.Debug("CREATE %s", subs.String()) xapp.Logger.Debug("Registry: substable=%v", r.register) - return subs, nil + return subs, errorInfo, nil } -func (r *Registry) RouteCreate(subs *Subscription, c *Control) error { +func (r *Registry) RouteCreate(subs *Subscription, c *Control) (ErrorInfo, error) { + errorInfo := ErrorInfo{} subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)} err := r.rtmgrClient.SubscriptionRequestCreate(subRouteAction) if err != nil { + if strings.Contains(err.Error(), "status 400") { + errorInfo.TimeoutType = models.SubscriptionInstanceTimeoutTypeRTMGRTimeout + } else { + errorInfo.ErrorSource = models.SubscriptionInstanceErrorSourceRTMGR + } + errorInfo.ErrorCause = err.Error() c.UpdateCounter(cRouteCreateFail) xapp.Logger.Error("%s", err.Error()) err = fmt.Errorf("RTMGR route create failure") } - return err + return errorInfo, err } -func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) error { +func (r *Registry) RouteCreateUpdate(subs *Subscription, c *Control) (ErrorInfo, error) { + errorInfo := ErrorInfo{} subRouteAction := SubRouteInfo{subs.EpList, uint16(subs.ReqId.InstanceId)} err := r.rtmgrClient.SubscriptionRequestUpdate(subRouteAction) if err != nil { + if strings.Contains(err.Error(), "status 400") { + errorInfo.TimeoutType = models.SubscriptionInstanceTimeoutTypeRTMGRTimeout + } else { + errorInfo.ErrorSource = models.SubscriptionInstanceErrorSourceRTMGR + } + errorInfo.ErrorCause = err.Error() c.UpdateCounter(cRouteCreateUpdateFail) xapp.Logger.Error("%s", err.Error()) err = fmt.Errorf("RTMGR route update failure") - return err + return errorInfo, err } c.UpdateCounter(cMergedSubscriptions) - return err + return errorInfo, err } func (r *Registry) CheckActionTypes(subReqMsg *e2ap.E2APSubscriptionRequest) (uint64, error) { @@ -397,13 +418,15 @@ func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *Transaction subs.mutex.Lock() defer subs.mutex.Unlock() - xapp.Logger.Info("CLEAN %s", subs.String()) + xapp.Logger.Debug("CLEAN %s", subs.String()) if epamount == 0 { // // Subscription route delete // - r.RouteDelete(subs, trans, c) + if subs.RMRRouteCreated == true { + r.RouteDelete(subs, trans, c) + } // // Subscription release @@ -421,7 +444,9 @@ func (r *Registry) RemoveFromSubscription(subs *Subscription, trans *Transaction // // Subscription route update // - r.RouteDeleteUpdate(subs, c) + if subs.RMRRouteCreated == true { + r.RouteDeleteUpdate(subs, c) + } } }() @@ -483,3 +508,13 @@ func (r *Registry) GetSubscriptionFirstMatch(subIds []uint32) (*Subscription, er } return nil, fmt.Errorf("No valid subscription found with subIds %v", subIds) } + +func (r *Registry) SetResetTestFlag(resetTestFlag bool, subs *Subscription) { + if resetTestFlag == true { + // This is used in submgr restart unit tests + xapp.Logger.Debug("resetTestFlag == true") + subs.DoNotWaitSubResp = true + } else { + xapp.Logger.Debug("resetTestFlag == false") + } +} diff --git a/pkg/control/restendpoint.go b/pkg/control/restendpoint.go index 2e64f05..dc565d4 100644 --- a/pkg/control/restendpoint.go +++ b/pkg/control/restendpoint.go @@ -62,7 +62,7 @@ func ConstructEndpointAddresses(clientEndpoint models.SubscriptionParamsClientEn xAppRMREndPoint = host + ":" + strconv.FormatInt(*clientEndpoint.RMRPort, 10) } - xapp.Logger.Info("xAppHttpEndPoint=%v, xAppRrmEndPoint=%v", xAppHTTPEndPoint, xAppRMREndPoint) + xapp.Logger.Debug("xAppHttpEndPoint=%v, xAppRrmEndPoint=%v", xAppHTTPEndPoint, xAppRMREndPoint) return xAppHTTPEndPoint, xAppRMREndPoint, nil } diff --git a/pkg/control/sdl_e2SubsDb.go b/pkg/control/sdl_e2SubsDb.go index c2526bc..2afa36e 100644 --- a/pkg/control/sdl_e2SubsDb.go +++ b/pkg/control/sdl_e2SubsDb.go @@ -30,13 +30,14 @@ import ( ) type SubscriptionInfo struct { - Valid bool - ReqId RequestId - Meid xapp.RMRMeid - EpList xapp.RmrEndpointList - SubReqMsg e2ap.E2APSubscriptionRequest - SubRespMsg e2ap.E2APSubscriptionResponse - SubRespRcvd string + Valid bool + ReqId RequestId + Meid xapp.RMRMeid + EpList xapp.RmrEndpointList + SubReqMsg e2ap.E2APSubscriptionRequest + SubRespMsg e2ap.E2APSubscriptionResponse + SubRespRcvd string + PolicyUpdate bool } func CreateSdl() Sdlnterface { @@ -51,6 +52,7 @@ func (c *Control) WriteSubscriptionToSdl(subId uint32, subs *Subscription) error subscriptionInfo.Meid = *subs.Meid subscriptionInfo.EpList = subs.EpList subscriptionInfo.SubReqMsg = *subs.SubReqMsg + subscriptionInfo.PolicyUpdate = subs.PolicyUpdate if typeofSubsMessage(subs.SubRFMsg) == "SubResp" { subscriptionInfo.SubRespRcvd = "SubResp" @@ -118,6 +120,7 @@ func (c *Control) CreateSubscription(subscriptionInfo *SubscriptionInfo, jsonSub subReq := e2ap.E2APSubscriptionRequest{} subReq = subscriptionInfo.SubReqMsg subs.SubReqMsg = &subReq + subs.PolicyUpdate = subscriptionInfo.PolicyUpdate if subscriptionInfo.SubRespRcvd == "SubResp" { subs.SubRespRcvd = true diff --git a/pkg/control/subscription.go b/pkg/control/subscription.go index 6ea2c1f..1152520 100644 --- a/pkg/control/subscription.go +++ b/pkg/control/subscription.go @@ -23,7 +23,6 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" - //"reflect" "sync" ) @@ -35,15 +34,17 @@ type Subscription struct { valid bool // valid registry *Registry // Registry ReqId RequestId // ReqId (Requestor Id + Seq Nro a.k.a subsid) - Meid *xapp.RMRMeid // Meid/ RanName + Meid *xapp.RMRMeid // Meid/RanName EpList xapp.RmrEndpointList // Endpoints + RMRRouteCreated bool // Does subscription have RMR route TransLock sync.Mutex // Lock transactions, only one executed per time for subs TheTrans TransactionIf // Ongoing transaction SubReqMsg *e2ap.E2APSubscriptionRequest // Subscription information SubRFMsg interface{} // Subscription information + PolicyUpdate bool // This is true when policy subscrition is being updated. Used not to send delete for update after timeout or restart RetryFromXapp bool // Retry form xApp for subscription that already exist SubRespRcvd bool // Subscription response received - DeleteFromDb bool // Delete subscription form db + DeleteFromDb bool // Delete subscription from db NoRespToXapp bool // Send no response for subscription delete to xApp after restart DoNotWaitSubResp bool // Test flag. Response is not waited for Subscription Request } @@ -160,8 +161,6 @@ func (s *Subscription) IsMergeable(trans *TransactionXapp, subReqMsg *e2ap.E2APS return false } } - //reflect.DeepEqual(acts.ActionDefinitionChoice, actt.ActionDefinitionChoice) - if acts.SubsequentAction.Present != actt.SubsequentAction.Present || acts.SubsequentAction.Type != actt.SubsequentAction.Type || acts.SubsequentAction.TimetoWait != actt.SubsequentAction.TimetoWait { @@ -169,6 +168,5 @@ func (s *Subscription) IsMergeable(trans *TransactionXapp, subReqMsg *e2ap.E2APS } } } - return true } diff --git a/pkg/control/types.go b/pkg/control/types.go index c8c09dc..0123357 100644 --- a/pkg/control/types.go +++ b/pkg/control/types.go @@ -20,6 +20,8 @@ package control import ( + "time" + "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" ) @@ -41,3 +43,31 @@ type Sdlnterface interface { Remove(keys []string) error RemoveAll() error } + +type E2SubscriptionDirectives struct { + // How many times E2 subscription request is retried + // Required: true + // Maximum: 10 + // Minimum: 0 + E2MaxTryCount int64 + + // How long time response is waited from E2 node + // Maximum: 10s + // Minimum: 1s + E2TimeoutTimerValue time.Duration + + // Subscription needs RMR route from E2Term to xApp + CreateRMRRoute bool +} + +type ErrorInfo struct { + ErrorCause string + ErrorSource string + TimeoutType string +} + +func (e *ErrorInfo) SetInfo(errorCause string, errorSource string, timeoutType string) { + e.ErrorCause = errorCause + e.ErrorSource = errorSource + e.TimeoutType = timeoutType +} diff --git a/pkg/control/ut_ctrl_submgr_test.go b/pkg/control/ut_ctrl_submgr_test.go index ee7bc82..16c69b1 100644 --- a/pkg/control/ut_ctrl_submgr_test.go +++ b/pkg/control/ut_ctrl_submgr_test.go @@ -55,6 +55,8 @@ func createSubmgrControl(srcId teststub.RmrSrcId, rtgSvc teststub.RmrRtgSvc) *te mainCtrl = &testingSubmgrControl{} mainCtrl.RmrControl.Init("SUBMGRCTL", srcId, rtgSvc) mainCtrl.c = NewControl() + mainCtrl.c.LoggerLevel = int(xapp.Logger.GetLevel()) + xapp.Logger.Debug("Test: LoggerLevel %v", mainCtrl.c.LoggerLevel) xapp.Logger.Debug("Replacing real db with test db") mainCtrl.c.e2SubsDb = CreateMock() // This overrides real E2 Subscription database for testing mainCtrl.c.restSubsDb = CreateRestSubsDbMock() // This overrides real REST Subscription database for testing @@ -76,17 +78,8 @@ func (mc *testingSubmgrControl) SimulateRestart(t *testing.T) { if err != nil { mc.TestError(t, "%v", err) } else { - mainCtrl.c.registry.register = nil mainCtrl.c.registry.subIds = subIds mainCtrl.c.registry.register = register - - mc.TestLog(t, "register:") - for subId, subs := range register { - mc.TestLog(t, " subId=%v", subId) - mc.TestLog(t, " subs.SubRespRcvd=%v", subs.SubRespRcvd) - mc.TestLog(t, " subs=%v\n", subs) - } - mc.TestLog(t, "mainCtrl.c.registry.register:") for subId, subs := range mainCtrl.c.registry.register { mc.TestLog(t, " subId=%v", subId) @@ -94,6 +87,18 @@ func (mc *testingSubmgrControl) SimulateRestart(t *testing.T) { mc.TestLog(t, " subs=%v\n", subs) } } + restSubscriptions, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl() + if err != nil { + mc.TestError(t, "%v", err) + } else { + mainCtrl.c.registry.restSubscriptions = restSubscriptions + mc.TestLog(t, "mainCtrl.c.registry.restSubscriptions:") + for restSubId, restSubs := range mainCtrl.c.registry.restSubscriptions { + mc.TestLog(t, " restSubId=%v", restSubId) + mc.TestLog(t, " restSubs=%v\n", restSubs) + } + } + go mainCtrl.c.HandleUncompletedSubscriptions(mainCtrl.c.registry.register) } @@ -136,7 +141,7 @@ func (mc *testingSubmgrControl) wait_registry_empty(t *testing.T, secs int) bool } time.Sleep(100 * time.Millisecond) } - mc.TestError(t, "(submgr) no registry empty within %d secs: %d", secs, cnt) + mc.TestError(t, "(submgr) no registry empty within %d secs: %d, register: %v", secs, cnt, mc.c.registry.register) return false } @@ -311,6 +316,8 @@ func (mc *testingSubmgrControl) GetCounterValuesBefore(t *testing.T) { } func (mc *testingSubmgrControl) VerifyCounterValues(t *testing.T) { + + // Check that expected counters are added ok currentCountersMap := mc.GetCurrentCounterValues(t, toBeAddedCountersMap) for _, toBeAddedCounter := range toBeAddedCountersMap { if currentCounter, ok := currentCountersMap[toBeAddedCounter.Name]; ok == true { @@ -329,6 +336,22 @@ func (mc *testingSubmgrControl) VerifyCounterValues(t *testing.T) { } } + // Check that not any unexpected counter are added + for _, currentCounter := range currentCountersMap { + if _, ok := toBeAddedCountersMap[currentCounter.Name]; ok == false { + if beforeCounter, ok := countersBeforeMap[currentCounter.Name]; ok == true { + if currentCounter.Value != beforeCounter.Value { + mc.TestError(t, "Error: unexpected counter value added: counterName %v, current value %v, expected value %v", + currentCounter.Name, beforeCounter.Value, beforeCounter.Value) + + //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value) + } + } else { + mc.TestError(t, "Counter %v not in countersBeforeMap", beforeCounter.Name) + } + } + } + // Make map empty //fmt.Printf("toBeAddedCountersMap=%v\n",toBeAddedCountersMap) toBeAddedCountersMap = make(map[string]Counter) diff --git a/pkg/control/ut_messaging_test.go b/pkg/control/ut_messaging_test.go index bc1b6d3..cd8a832 100644 --- a/pkg/control/ut_messaging_test.go +++ b/pkg/control/ut_messaging_test.go @@ -2134,6 +2134,7 @@ func TestSubReqNokAndSubDelOkWithRestartInMiddle(t *testing.T) { mainCtrl.SimulateRestart(t) xapp.Logger.Debug("mainCtrl.SimulateRestart done") + // Submgr send delete for uncompleted subscription delreq, delmsg := e2termConn1.RecvSubsDelReq(t) e2termConn1.SendSubsDelResp(t, delreq, delmsg) @@ -2419,6 +2420,7 @@ func TestRESTSubReqAndRouteNok(t *testing.T) { }) const subReqCount int = 1 + // Add delay for rtmgt HTTP handling so that HTTP response is received before notify on XAPP side waiter := rtmgrHttp.AllocNextSleep(50, false) newSubsId := mainCtrl.get_registry_next_subid(t) @@ -2430,7 +2432,7 @@ func TestRESTSubReqAndRouteNok(t *testing.T) { waiter.WaitResult(t) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", e2SubsId) // Del xappConn1.SendRESTSubsDelReq(t, &restSubId) @@ -2472,7 +2474,7 @@ func TestRESTSubReqAndRouteUpdateNok(t *testing.T) { params = xappConn2.GetRESTSubsReqReportParams(subReqCount) params.SetMeid("RAN_NAME_1") restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for second subscriber : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for second subscriber : %v", restSubId2) xappConn2.ExpectRESTNotificationNok(t, restSubId2, "allFail") waiter.WaitResult(t) // e2SubsId2 := xappConn2.WaitRESTNotification(t, restSubId2) - TOD: missing delete @@ -2617,11 +2619,15 @@ func TestRESTSubReqRetransmission(t *testing.T) { // Subs Create const subReqCount int = 1 + // const e2Timeout int64 = 2 + // const e2RetryCount int64 = 2 + // const routingNeeded bool = true // In order to force both XAPP's to create their own subscriptions, force rtmgr to block a while so that 2nd create // gets into execution before the rtmgrg responds for the first one. waiter := rtmgrHttp.AllocNextSleep(10, true) params := xappConn1.GetRESTSubsReqReportParams(subReqCount) + // params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) restSubId1 := xappConn1.SendRESTSubsReq(t, params) xappConn2.SendRESTSubsReq(t, params) @@ -2635,7 +2641,7 @@ func TestRESTSubReqRetransmission(t *testing.T) { e2termConn1.SendSubsResp(t, crereq, cremsg) e2SubsIdA := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) + xapp.Logger.Debug("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) // Del1 xappConn1.SendRESTSubsDelReq(t, &restSubId1) @@ -3324,12 +3330,12 @@ func TestRESTSubReqAndSubDelOkTwoParallel(t *testing.T) { //Req1 params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId1 := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send 1st REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send 1st REST subscriber request for subscriberId : %v", restSubId1) //Req2 params = xappConn2.GetRESTSubsReqReportParams(subReqCount) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send 2nd REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send 2nd REST subscriber request for subscriberId : %v", restSubId2) crereq1, cremsg1 := e2termConn1.RecvSubsReq(t) crereq2, cremsg2 := e2termConn1.RecvSubsReq(t) @@ -3343,9 +3349,9 @@ func TestRESTSubReqAndSubDelOkTwoParallel(t *testing.T) { e2termConn1.SendSubsResp(t, crereq2, cremsg2) e2SubsIdA := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) + xapp.Logger.Debug("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) e2SubsIdB := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) + xapp.Logger.Debug("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) //Del1 deleteSubscription(t, xappConn1, e2termConn1, &restSubId1) @@ -3377,12 +3383,12 @@ func TestRESTSameSubsDiffRan(t *testing.T) { params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send 1st REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send 1st REST subscriber request for subscriberId : %v", restSubId1) params = xappConn1.GetRESTSubsReqReportParams(subReqCount) params.SetMeid("RAN_NAME_2") restSubId2, e2SubsId2 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send 2nd REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send 2nd REST subscriber request for subscriberId : %v", restSubId2) //Del1 deleteSubscription(t, xappConn1, e2termConn1, &restSubId1) @@ -3417,11 +3423,11 @@ func TestRESTSubReqRetryInSubmgr(t *testing.T) { params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) // Catch the first message and ignore it crereq, cremsg := e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore REST subscriber request for subscriber : %v", restSubId) // The second request is being handled normally crereq, cremsg = e2termConn1.RecvSubsReq(t) @@ -3496,13 +3502,13 @@ func TestRESTSubReqRetryNoRespSubDelRespInSubmgr(t *testing.T) { params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 1st REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 1st REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) delreq, delmsg := e2termConn1.RecvSubsDelReq(t) xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") @@ -3531,20 +3537,20 @@ func TestREST2eTermNotRespondingToSubReq(t *testing.T) { params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 1st REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 1st REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsDelReq(t) - xapp.Logger.Info("Ignore 1st INTERNAL delete request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 1st INTERNAL delete request for subscriber : %v", restSubId) xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") e2termConn1.RecvSubsDelReq(t) - xapp.Logger.Info("Ignore 2nd INTERNAL delete request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 2nd INTERNAL delete request for subscriber : %v", restSubId) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) @@ -3609,20 +3615,20 @@ func TestRESTSubReqTwoRetriesNoRespAtAllInSubmgr(t *testing.T) { params := xappConn1.GetRESTSubsReqReportParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 1st REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 1st REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) - xapp.Logger.Info("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 2nd REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsDelReq(t) - xapp.Logger.Info("Ignore 1st INTERNAL delete request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 1st INTERNAL delete request for subscriber : %v", restSubId) xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") e2termConn1.RecvSubsDelReq(t) - xapp.Logger.Info("Ignore 2nd INTERNAL delete request for subscriber : %v", restSubId) + xapp.Logger.Debug("Ignore 2nd INTERNAL delete request for subscriber : %v", restSubId) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) @@ -3690,7 +3696,7 @@ func TestRESTSubReqSubFailRespInSubmgr(t *testing.T) { xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") e2termConn1.SendSubsDelResp(t, delreq1, delmsg1) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", e2SubsId) // REST subscription sill there to be deleted xappConn1.SendRESTSubsDelReq(t, &restSubId) @@ -3964,9 +3970,9 @@ func TestRESTSubReqAndSubDelOkSameAction(t *testing.T) { waiter := rtmgrHttp.AllocNextSleep(10, true) restSubId2 := xappConn2.SendRESTSubsReq(t, params) waiter.WaitResult(t) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) e2SubsId2 := xappConn2.WaitAnyRESTNotification(t) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId2) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId2) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560", "localhost:13660"}) @@ -4164,9 +4170,9 @@ func TestRESTSubReqAndSubDelNoAnswerSameActionParallel(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq1, delmsg1) e2SubsIdA := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) + xapp.Logger.Debug("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) e2SubsIdB := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) + xapp.Logger.Debug("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) // Del1 xappConn1.SendRESTSubsDelReq(t, &restSubId1) @@ -4271,9 +4277,9 @@ func TestRESTSubReqAndSubDelNokSameActionParallel(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) e2SubsIdA := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) + xapp.Logger.Debug("TEST: 1.st XAPP notification received e2SubsId=%v", e2SubsIdA) e2SubsIdB := <-xappConn1.ListedRESTNotifications - xapp.Logger.Info("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) + xapp.Logger.Debug("TEST: 2.nd XAPP notification received e2SubsId=%v", e2SubsIdB) // Del1 xappConn1.SendRESTSubsDelReq(t, &restSubId1) @@ -4304,17 +4310,15 @@ func TestRESTSubReqPolicyAndSubDelOk(t *testing.T) { Counter{cRestSubDelRespToXapp, 1}, }) - const subReqCount int = 1 - params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST Policy subscriber request for subscriberId : %v", restSubId) + xapp.Logger.Debug("Send REST Policy subscriber request for subscriberId : %v", restSubId) crereq1, cremsg1 := e2termConn1.RecvSubsReq(t) xappConn1.ExpectRESTNotification(t, restSubId) e2termConn1.SendSubsResp(t, crereq1, cremsg1) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) xappConn1.SendRESTSubsDelReq(t, &restSubId) delreq, delmsg := e2termConn1.RecvSubsDelReq(t) @@ -4390,15 +4394,20 @@ func TestRESTSubReqPolicyChangeAndSubDelOk(t *testing.T) { }) const subReqCount int = 1 + const e2Timeout int64 = 1 + const e2RetryCount int64 = 0 + const routingNeeded bool = true // Req params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params) // Policy change - // GetRESTSubsReqPolicyParams sets some coutners on tc side. + // GetRESTSubsReqPolicyParams sets some counters on tc side. params = xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) params.SetSubscriptionID(&restSubId) params.SetTimeToWait("w200ms") restSubId, e2SubsId = createSubscription(t, xappConn1, e2termConn1, params) @@ -4439,7 +4448,7 @@ func TestRESTSubReqPolicyChangeAndSubDelOk(t *testing.T) { // | RESTSubReq | | // |---------------->| | // | | | -// | RESTSubUpdateFail | +// | RESTSubUpdateFail(400 Bad request) // | | | // | RESTSubDelReq | | // |---------------->| | @@ -4470,17 +4479,14 @@ func TestRESTSubReqPolicyChangeNOk(t *testing.T) { Counter{cRestSubDelRespToXapp, 1}, }) - const subReqCount int = 1 - // Req params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params) // Policy change - params = xappConn1.GetRESTSubsReqPolicyParams(subReqCount) - restSubIdUpd := strings.ToUpper(restSubId) + restSubIdUpd := strings.ToUpper(restSubId) // This makes RESTSubReq to fail params.SetSubscriptionID(&restSubIdUpd) params.SetTimeToWait("w200ms") @@ -4574,13 +4580,13 @@ func TestRESTSubReqAndSubDelOkTwoE2termParallel(t *testing.T) { xappConn1.ExpectRESTNotification(t, restSubId1) e2termConn1.SendSubsResp(t, crereq1, cremsg1) e2SubsId1 := xappConn1.WaitRESTNotification(t, restSubId1) - xapp.Logger.Info("TEST: REST notification received e2SubsId1=%v", e2SubsId1) + xapp.Logger.Debug("TEST: REST notification received e2SubsId1=%v", e2SubsId1) // Resp2 xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn2.SendSubsResp(t, crereq2, cremsg2) e2SubsId2 := xappConn2.WaitRESTNotification(t, restSubId2) - xapp.Logger.Info("TEST: REST notification received e2SubsId2=%v", e2SubsId2) + xapp.Logger.Debug("TEST: REST notification received e2SubsId2=%v", e2SubsId2) // Delete1 xappConn1.SendRESTSubsDelReq(t, &restSubId1) @@ -4626,7 +4632,7 @@ func TestRESTSubReqAndSubDelOkTwoE2termParallel(t *testing.T) { func TestRESTSubReqAsn1EncodeFail(t *testing.T) { CaseBegin("TestRESTSubReqAsn1EncodeFail") - xapp.Logger.Info("Xapp-frame, v0.8.1 sufficient REST API validation") + xapp.Logger.Debug("Xapp-frame, v0.8.1 sufficient REST API validation") } @@ -4750,7 +4756,7 @@ func TestRESTSubReqNokAndSubDelOkWithRestartInMiddle(t *testing.T) { //Req mainCtrl.SetResetTestFlag(t, true) // subs.DoNotWaitSubResp will be set TRUE for the subscription restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) e2termConn1.RecvSubsReq(t) @@ -4831,17 +4837,13 @@ func TestRESTSubReqAndSubDelOkWithRestartInMiddle(t *testing.T) { // Create subscription restSubId, e2SubsId := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriber : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriber : %v", restSubId) // Check subscription queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"}) - // When SDL support for the REST Interface is added - // the submgr restart statement below should be removed - // from the comment. - - // mainCtrl.SimulateRestart(t) - // xapp.Logger.Debug("mainCtrl.SimulateRestart done") + mainCtrl.SimulateRestart(t) + xapp.Logger.Debug("mainCtrl.SimulateRestart done") // Check subscription queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"}) @@ -4934,7 +4936,7 @@ func TestRESTSubReqAndSubDelOkSameActionWithRestartsInMiddle(t *testing.T) { // Create subscription 1 restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriber 1 : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriber 1 : %v", restSubId1) // Create subscription 2 with same action params = xappConn2.GetRESTSubsReqReportParams(subReqCount) @@ -4942,30 +4944,22 @@ func TestRESTSubReqAndSubDelOkSameActionWithRestartsInMiddle(t *testing.T) { xapp.Subscription.SetResponseCB(xappConn2.SubscriptionRespHandler) xappConn2.ExpectAnyNotification(t) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) e2SubsId2 := xappConn2.WaitAnyRESTNotification(t) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId2) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId2) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560", "localhost:13660"}) - // When SDL support for the REST Interface is added - // the submgr restart statement below should be removed - // from the comment. - - // mainCtrl.SimulateRestart(t) - // xapp.Logger.Debug("mainCtrl.SimulateRestart done") + mainCtrl.SimulateRestart(t) + xapp.Logger.Debug("mainCtrl.SimulateRestart done") // Delete subscription 1, and wait until it has removed the first endpoint subepcnt := mainCtrl.get_subs_entrypoint_cnt(t, e2SubsId1) xappConn1.SendRESTSubsDelReq(t, &restSubId1) mainCtrl.wait_subs_entrypoint_cnt_change(t, e2SubsId1, subepcnt, 10) - // When SDL support for the REST Interface is added - // the submgr restart statement below should be removed - // from the comment. - - // mainCtrl.SimulateRestart(t) - // xapp.Logger.Debug("mainCtrl.SimulateRestart done") + mainCtrl.SimulateRestart(t) + xapp.Logger.Debug("mainCtrl.SimulateRestart done") queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13660"}) // Delete subscription 2 @@ -5024,13 +5018,13 @@ func TestRESTSubReqAndSubDelOkSameActionWithRestartsInMiddle(t *testing.T) { func TestRESTReportSubReqAndSubDelOk(t *testing.T) { CaseBegin("TestRESTReportSubReqAndSubDelOk") - subReqCount := 1 + const subReqCount int = 1 testIndex := 1 RESTReportSubReqAndSubDelOk(t, subReqCount, testIndex) } func RESTReportSubReqAndSubDelOk(t *testing.T, subReqCount int, testIndex int) { - xapp.Logger.Info("TEST: TestRESTReportSubReqAndSubDelOk with testIndex %v", testIndex) + xapp.Logger.Debug("TEST: TestRESTReportSubReqAndSubDelOk with testIndex %v", testIndex) // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -5043,7 +5037,7 @@ func RESTReportSubReqAndSubDelOk(t *testing.T, subReqCount int, testIndex int) { e2termConn1.SendSubsResp(t, crereq, cremsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) e2SubsId = append(e2SubsId, instanceId) resp, _ := xapp.Subscription.QuerySubscriptions() assert.Equal(t, resp[i].SubscriptionID, (int64)(instanceId)) @@ -5084,13 +5078,11 @@ func TestRESTPolicySubReqAndSubDelOk(t *testing.T) { } */ func RESTPolicySubReqAndSubDelOk(t *testing.T, subReqCount int, testIndex int) { - xapp.Logger.Info("TEST: TestRESTPolicySubReqAndSubDelOk with testIndex %v", testIndex) + xapp.Logger.Debug("TEST: TestRESTPolicySubReqAndSubDelOk with testIndex %v", testIndex) // Req params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - //params := xappConn1.GetRESTSubsReqPolicyParams1(subReqCount) - //restSubId := xappConn1.SendRESTPolicySubsReq(t, params) var e2SubsId []uint32 for i := 0; i < subReqCount; i++ { @@ -5098,7 +5090,7 @@ func RESTPolicySubReqAndSubDelOk(t *testing.T, subReqCount int, testIndex int) { xappConn1.ExpectRESTNotification(t, restSubId) e2termConn1.SendSubsResp(t, crereq, cremsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) e2SubsId = append(e2SubsId, instanceId) } @@ -5121,8 +5113,6 @@ func RESTPolicySubReqAndSubDelOk(t *testing.T, subReqCount int, testIndex int) { func TestRESTTwoPolicySubReqAndSubDelOk(t *testing.T) { - subReqCount := 2 - mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ Counter{cRestSubReqFromXapp, 1}, Counter{cRestSubRespToXapp, 1}, @@ -5135,6 +5125,8 @@ func TestRESTTwoPolicySubReqAndSubDelOk(t *testing.T) { Counter{cRestSubDelRespToXapp, 1}, }) + const subReqCount int = 2 + // Req params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) @@ -5154,8 +5146,6 @@ func TestRESTTwoPolicySubReqAndSubDelOk(t *testing.T) { } func TestRESTPolicySubReqAndSubDelOkFullAmount(t *testing.T) { - subReqCount := 19 - mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ Counter{cRestSubReqFromXapp, 1}, Counter{cRestSubRespToXapp, 1}, @@ -5168,6 +5158,7 @@ func TestRESTPolicySubReqAndSubDelOkFullAmount(t *testing.T) { Counter{cRestSubDelRespToXapp, 1}, }) + const subReqCount int = 19 // Req params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) @@ -5184,6 +5175,7 @@ func TestRESTPolicySubReqAndSubDelOkFullAmount(t *testing.T) { mainCtrl.VerifyCounterValues(t) } + func TestRESTTwoReportSubReqAndSubDelOk(t *testing.T) { subReqCount := 2 @@ -5306,7 +5298,7 @@ func TestRESTSubReqReportSameActionDiffEventTriggerDefinitionLen(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5317,7 +5309,7 @@ func TestRESTSubReqReportSameActionDiffEventTriggerDefinitionLen(t *testing.T) { params.SetSubEventTriggerDefinition(eventTriggerDefinition) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5353,7 +5345,7 @@ func TestRESTSubReqReportSameActionDiffActionListLen(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5369,7 +5361,7 @@ func TestRESTSubReqReportSameActionDiffActionListLen(t *testing.T) { params.AppendActionToActionToBeSetupList(actionId, actionType, actionDefinition, subsequestActionType, timeToWait) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5405,7 +5397,7 @@ func TestRESTSubReqReportSameActionDiffActionID(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5415,7 +5407,7 @@ func TestRESTSubReqReportSameActionDiffActionID(t *testing.T) { params.SetSubActionIDs(int64(2)) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5446,21 +5438,27 @@ func TestRESTSubReqDiffActionType(t *testing.T) { Counter{cRestSubDelRespToXapp, 2}, }) + const e2Timeout int64 = 2 + const e2RetryCount int64 = 2 + const routingNeeded bool = true + // Req1 params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) // Req2 params = xappConn2.GetRESTSubsReqReportParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) params.SetMeid("RAN_NAME_1") restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5491,21 +5489,27 @@ func TestRESTSubReqPolicyAndSubDelOkSameAction(t *testing.T) { Counter{cRestSubDelRespToXapp, 2}, }) + const e2Timeout int64 = 2 + const e2RetryCount int64 = 2 + const routingNeeded bool = true + // Req1 params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) // Req2 params = xappConn2.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) params.SetMeid("RAN_NAME_1") restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5541,7 +5545,7 @@ func TestRESTSubReqReportSameActionDiffActionDefinitionLen(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5552,7 +5556,7 @@ func TestRESTSubReqReportSameActionDiffActionDefinitionLen(t *testing.T) { params.SetSubActionDefinition(actionDefinition) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5588,7 +5592,7 @@ func TestRESTSubReqReportSameActionDiffActionDefinitionContents(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5599,7 +5603,7 @@ func TestRESTSubReqReportSameActionDiffActionDefinitionContents(t *testing.T) { params.SetSubActionDefinition(actionDefinition) restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5635,7 +5639,7 @@ func TestRESTSubReqReportSameActionDiffSubsAction(t *testing.T) { //Subs Create restSubId1, e2SubsId1 := createSubscription(t, xappConn1, e2termConn1, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId1) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId1) queryXappSubscription(t, int64(e2SubsId1), "RAN_NAME_1", []string{"localhost:13560"}) @@ -5644,7 +5648,7 @@ func TestRESTSubReqReportSameActionDiffSubsAction(t *testing.T) { params.SetMeid("RAN_NAME_1") params.SetTimeToWait("w200ms") restSubId2 := xappConn2.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId2) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId2) crereq, cremsg := e2termConn1.RecvSubsReq(t) xappConn2.ExpectRESTNotification(t, restSubId2) e2termConn1.SendSubsResp(t, crereq, cremsg) @@ -5696,8 +5700,8 @@ func TestRESTSubReqReportSameActionDiffSubsAction(t *testing.T) { //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionResponseDecodeFail(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionResponseDecodeFail") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionResponseDecodeFail") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -5721,7 +5725,7 @@ func TestRESTUnpackSubscriptionResponseDecodeFail(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, crereq.RequestId.InstanceId, 10) @@ -5767,8 +5771,8 @@ func TestRESTUnpackSubscriptionResponseDecodeFail(t *testing.T) { //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionResponseUnknownInstanceId(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionResponseUnknownInstanceId") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionResponseUnknownInstanceId") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -5795,7 +5799,7 @@ func TestRESTUnpackSubscriptionResponseUnknownInstanceId(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, orgInstanceId, 10) @@ -5846,8 +5850,8 @@ func TestRESTUnpackSubscriptionResponseUnknownInstanceId(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionResponseNoTransaction(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionResponseNoTransaction") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionResponseNoTransaction") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -5877,7 +5881,7 @@ func TestRESTUnpackSubscriptionResponseNoTransaction(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, crereq.RequestId.InstanceId, 10) @@ -5923,8 +5927,8 @@ func TestRESTUnpackSubscriptionResponseNoTransaction(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionFailureDecodeFail(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionFailureDecodeFail") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionFailureDecodeFail") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -5949,7 +5953,7 @@ func TestRESTUnpackSubscriptionFailureDecodeFail(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, crereq.RequestId.InstanceId, 10) @@ -5994,8 +5998,8 @@ func TestRESTUnpackSubscriptionFailureDecodeFail(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionFailureUnknownInstanceId(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionFailureUnknownInstanceId") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionFailureUnknownInstanceId") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -6021,7 +6025,7 @@ func TestRESTUnpackSubscriptionFailureUnknownInstanceId(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, crereq.RequestId.InstanceId, 10) @@ -6066,8 +6070,8 @@ func TestRESTUnpackSubscriptionFailureUnknownInstanceId(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionFailureNoTransaction(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionFailureNoTransaction") - subReqCount := 1 + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionFailureNoTransaction") + const subReqCount int = 1 // Req params := xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -6098,7 +6102,7 @@ func TestRESTUnpackSubscriptionFailureNoTransaction(t *testing.T) { e2termConn1.SendSubsDelResp(t, delreq, delmsg) instanceId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", instanceId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", instanceId) // Wait that subs is cleaned mainCtrl.wait_subs_clean(t, crereq.RequestId.InstanceId, 10) @@ -6140,7 +6144,7 @@ func TestRESTUnpackSubscriptionFailureNoTransaction(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteResponseDecodeFail(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteResponseDecodeFail") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteResponseDecodeFail") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6200,7 +6204,7 @@ func TestRESTUnpackSubscriptionDeleteResponseDecodeFail(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteResponseUnknownInstanceId(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteResponseUnknownInstanceId") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteResponseUnknownInstanceId") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6261,7 +6265,7 @@ func TestRESTUnpackSubscriptionDeleteResponseUnknownInstanceId(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteResponseNoTransaction(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteResponseNoTransaction") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteResponseNoTransaction") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6323,7 +6327,7 @@ func TestRESTUnpackSubscriptionDeleteResponseNoTransaction(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteFailureDecodeFail(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteFailureDecodeFail") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteFailureDecodeFail") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6383,7 +6387,7 @@ func TestRESTUnpackSubscriptionDeleteFailureDecodeFail(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteailureUnknownInstanceId(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteailureUnknownInstanceId") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteailureUnknownInstanceId") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6444,7 +6448,7 @@ func TestRESTUnpackSubscriptionDeleteailureUnknownInstanceId(t *testing.T) { // //----------------------------------------------------------------------------- func TestRESTUnpackSubscriptionDeleteFailureNoTransaction(t *testing.T) { - xapp.Logger.Info("TEST: TestRESTUnpackSubscriptionDeleteFailureNoTransaction") + xapp.Logger.Debug("TEST: TestRESTUnpackSubscriptionDeleteFailureNoTransaction") // Req var params *teststube2ap.RESTSubsReqParams = nil @@ -6510,12 +6514,10 @@ func TestRESTSubReqFailAsn1PackSubReqError(t *testing.T) { mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ Counter{cRestSubReqFromXapp, 1}, Counter{cRestSubRespToXapp, 1}, - Counter{cSubDelReqToE2, 1}, - Counter{cSubDelFailFromE2, 1}, Counter{cRestSubFailNotifToXapp, 1}, }) - subReqCount := 1 + const subReqCount int = 1 var params *teststube2ap.RESTSubsReqParams = nil params = xappConn1.GetRESTSubsReqReportParams(subReqCount) @@ -6523,17 +6525,13 @@ func TestRESTSubReqFailAsn1PackSubReqError(t *testing.T) { // Req restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId) // E2t: Receive SubsDelReq - delreq, delmsg := e2termConn1.RecvSubsDelReq(t) xappConn1.ExpectRESTNotificationNok(t, restSubId, "allFail") - // Subscription does not exist in in E2 Node. - e2termConn1.SendSubsDelFail(t, delreq, delmsg) - e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", e2SubsId) e2ap_wrapper.AllowE2apToProcess(e2ap_wrapper.SUB_REQ, true) // Wait that subs is cleaned @@ -6541,6 +6539,183 @@ func TestRESTSubReqFailAsn1PackSubReqError(t *testing.T) { mainCtrl.VerifyCounterValues(t) } +func TestRESTSubReqPolicyUpdateTimeoutAndSubDelOkSameAction(t *testing.T) { + CaseBegin("TestRESTSubReqPolicyUpdateTimeoutAndSubDelOkSameAction") + + mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ + Counter{cRestSubReqFromXapp, 2}, + Counter{cRestSubRespToXapp, 2}, + Counter{cSubReqToE2, 2}, + Counter{cSubRespFromE2, 1}, + Counter{cRestSubNotifToXapp, 1}, + Counter{cRestSubFailNotifToXapp, 1}, + Counter{cRestSubDelReqFromXapp, 1}, + Counter{cSubDelReqToE2, 1}, + Counter{cSubDelRespFromE2, 1}, + Counter{cRestSubDelRespToXapp, 1}, + }) + + const e2Timeout int64 = 1 + const e2RetryCount int64 = 0 + const routingNeeded bool = false + + // Req1 + params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + + // Subs Create + restSubId := xappConn1.SendRESTSubsReq(t, params) + xapp.Logger.Debug("Send REST subscribe request for subscriberId : %v", restSubId) + + crereq1, cremsg1 := e2termConn1.RecvSubsReq(t) + xappConn1.ExpectRESTNotification(t, restSubId) + e2termConn1.SendSubsResp(t, crereq1, cremsg1) + e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) + + // Policy change + params = xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + params.SetSubscriptionID(&restSubId) + params.SetTimeToWait("w200ms") + restSubId = xappConn1.SendRESTSubsReq(t, params) + xapp.Logger.Debug("Send REST subscribe request for subscriberId : %v", restSubId) + + crereq1, cremsg1 = e2termConn1.RecvSubsReq(t) + xappConn1.ExpectRESTNotification(t, restSubId) + // SubsResp is missing + e2SubsId = xappConn1.WaitRESTNotification(t, restSubId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", e2SubsId) + + // Del + xappConn1.SendRESTSubsDelReq(t, &restSubId) + delreq, delmsg := e2termConn1.RecvSubsDelReq(t) + e2termConn1.SendSubsDelResp(t, delreq, delmsg) + + waitSubsCleanup(t, e2SubsId, 10) + + mainCtrl.VerifyCounterValues(t) +} + +//----------------------------------------------------------------------------- +// TestPolicyUpdateRESTSubReqAndSubDelOkWithRestartInMiddle +// +// stub stub +// +-------+ +---------+ +---------+ +// | xapp | | submgr | | e2term | +// +-------+ +---------+ +---------+ +// | | | +// | RESTSubReq | | +// |---------------->| | +// | | | +// | RESTSubResp | | +// |<----------------| | +// | | SubReq | +// | |------------->| +// | | | +// | | SubResp | +// | |<-------------| +// | | | +// | RESTNotif | | +// |<----------------| | +// | | | +// | RESTSubReq | | +// |---------------->| | +// | | | +// | RESTSubResp | | +// |<----------------| | +// | | SubReq | +// | |------------->| +// | | +// | Submgr restart | +// | | | +// | RESTSubDelReq | | +// |---------------->| | +// | | | +// | | SubDelReq | +// | |------------->| +// | | | +// | | SubDelResp | +// | |<-------------| +// | | | +// | RESTSubDelResp | | +// |<----------------| | +// +//----------------------------------------------------------------------------- + +func TestPolicyUpdateRESTSubReqAndSubDelOkWithRestartInMiddle(t *testing.T) { + CaseBegin("TestPolicyUpdateRESTSubReqAndSubDelOkWithRestartInMiddle") + + mainCtrl.CounterValuesToBeVeriefied(t, CountersToBeAdded{ + Counter{cRestSubReqFromXapp, 2}, + Counter{cRestSubRespToXapp, 2}, + Counter{cSubReqToE2, 2}, + Counter{cSubRespFromE2, 1}, + Counter{cRestSubNotifToXapp, 1}, + Counter{cRestSubNotifToXapp, 1}, + Counter{cRestSubDelReqFromXapp, 1}, + Counter{cSubDelReqToE2, 1}, + Counter{cRestSubDelRespToXapp, 1}, + }) + + // Remove possible existing subscription + mainCtrl.removeExistingSubscriptions(t) + + const e2Timeout int64 = 1 + const e2RetryCount int64 = 0 + const routingNeeded bool = false + + // Req1 + params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + // Create subscription + restSubId := xappConn1.SendRESTSubsReq(t, params) + xapp.Logger.Debug("Send REST subscribe request for subscriberId : %v", restSubId) + + crereq1, cremsg1 := e2termConn1.RecvSubsReq(t) + xappConn1.ExpectRESTNotification(t, restSubId) + e2termConn1.SendSubsResp(t, crereq1, cremsg1) + e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) + + // Check subscription + queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"}) + + // Policy change + params = xappConn1.GetRESTSubsReqPolicyParams(subReqCount) + params.SetSubscriptionDirectives(e2Timeout, e2RetryCount, routingNeeded) + params.SetSubscriptionID(&restSubId) + params.SetTimeToWait("w200ms") + mainCtrl.SetResetTestFlag(t, true) // subs.DoNotWaitSubResp will be set TRUE for the subscription + restSubId = xappConn1.SendRESTSubsReq(t, params) + xapp.Logger.Debug("Send REST subscribe request for subscriberId : %v", restSubId) + + crereq1, cremsg1 = e2termConn1.RecvSubsReq(t) + mainCtrl.SetResetTestFlag(t, false) + + // SubsResp is missing due to submgr restart + + mainCtrl.SimulateRestart(t) + xapp.Logger.Debug("mainCtrl.SimulateRestart done") + + // Check subscription + queryXappSubscription(t, int64(e2SubsId), "RAN_NAME_1", []string{"localhost:13560"}) + + xapp.Logger.Debug("Here 1") + //<-time.After(3 * time.Second) + xapp.Logger.Debug("Here 2") + + // Delete subscription + xappConn1.SendRESTSubsDelReq(t, &restSubId) + delreq, delmsg := e2termConn1.RecvSubsDelReq(t) + e2termConn1.SendSubsDelResp(t, delreq, delmsg) + + //Wait that subs is cleaned + waitSubsCleanup(t, e2SubsId, 10) + + mainCtrl.VerifyCounterValues(t) +} + //////////////////////////////////////////////////////////////////////////////////// // Services for UT cases //////////////////////////////////////////////////////////////////////////////////// @@ -6552,13 +6727,13 @@ func createSubscription(t *testing.T, fromXappConn *teststube2ap.E2Stub, toE2ter params = fromXappConn.GetRESTSubsReqReportParams(subReqCount) } restSubId := fromXappConn.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId) crereq1, cremsg1 := toE2termConn.RecvSubsReq(t) fromXappConn.ExpectRESTNotification(t, restSubId) toE2termConn.SendSubsResp(t, crereq1, cremsg1) e2SubsId := fromXappConn.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) return restSubId, e2SubsId } @@ -6572,23 +6747,24 @@ func createXapp2MergedSubscription(t *testing.T, meid string) (string, uint32) { xapp.Subscription.SetResponseCB(xappConn2.SubscriptionRespHandler) restSubId := xappConn2.SendRESTSubsReq(t, params) xappConn2.ExpectRESTNotification(t, restSubId) - xapp.Logger.Info("Send REST subscriber request for subscriberId : %v", restSubId) + xapp.Logger.Debug("Send REST subscriber request for subscriberId : %v", restSubId) e2SubsId := xappConn2.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) return restSubId, e2SubsId } func createXapp1PolicySubscription(t *testing.T) (string, uint32) { + params := xappConn1.GetRESTSubsReqPolicyParams(subReqCount) restSubId := xappConn1.SendRESTSubsReq(t, params) - xapp.Logger.Info("Send REST Policy subscriber request for subscriberId : %v", restSubId) + xapp.Logger.Debug("Send REST Policy subscriber request for subscriberId : %v", restSubId) crereq1, cremsg1 := e2termConn1.RecvSubsReq(t) xappConn1.ExpectRESTNotification(t, restSubId) e2termConn1.SendSubsResp(t, crereq1, cremsg1) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("REST notification received e2SubsId=%v", e2SubsId) return restSubId, e2SubsId } @@ -6606,7 +6782,7 @@ func createXapp1ReportSubscriptionE2Fail(t *testing.T) (string, uint32) { xappConn1.ExpectRESTNotification(t, restSubId) e2termConn1.SendSubsDelResp(t, delreq1, delmsg1) e2SubsId := xappConn1.WaitRESTNotification(t, restSubId) - xapp.Logger.Info("TEST: REST notification received e2SubsId=%v", e2SubsId) + xapp.Logger.Debug("TEST: REST notification received e2SubsId=%v", e2SubsId) return restSubId, e2SubsId } @@ -6651,14 +6827,14 @@ func sendAndReceiveMultipleE2SubReqs(t *testing.T, count int, fromXappConn *test var e2SubsId []uint32 for i := 0; i < count; i++ { - xapp.Logger.Info("TEST: %d ===================================== BEGIN CRE ============================================", i+1) + xapp.Logger.Debug("TEST: %d ===================================== BEGIN CRE ============================================", i+1) crereq, cremsg := toE2termConn.RecvSubsReq(t) fromXappConn.ExpectRESTNotification(t, restSubId) toE2termConn.SendSubsResp(t, crereq, cremsg) instanceId := fromXappConn.WaitRESTNotification(t, restSubId) e2SubsId = append(e2SubsId, instanceId) - xapp.Logger.Info("TEST: %v", e2SubsId) - xapp.Logger.Info("TEST: %d ===================================== END CRE ============================================", i+1) + xapp.Logger.Debug("TEST: %v", e2SubsId) + xapp.Logger.Debug("TEST: %d ===================================== END CRE ============================================", i+1) <-time.After(100 * time.Millisecond) } return e2SubsId @@ -6667,11 +6843,11 @@ func sendAndReceiveMultipleE2SubReqs(t *testing.T, count int, fromXappConn *test func sendAndReceiveMultipleE2DelReqs(t *testing.T, e2SubsIds []uint32, toE2termConn *teststube2ap.E2Stub) { for i := 0; i < len(e2SubsIds); i++ { - xapp.Logger.Info("TEST: %d ===================================== BEGIN DEL ============================================", i+1) + xapp.Logger.Debug("TEST: %d ===================================== BEGIN DEL ============================================", i+1) delreq, delmsg := toE2termConn.RecvSubsDelReq(t) toE2termConn.SendSubsDelResp(t, delreq, delmsg) <-time.After(1 * time.Second) - xapp.Logger.Info("TEST: %d ===================================== END DEL ============================================", i+1) + xapp.Logger.Debug("TEST: %d ===================================== END DEL ============================================", i+1) <-time.After(100 * time.Millisecond) } diff --git a/pkg/control/ut_stub_rtmgr_test.go b/pkg/control/ut_stub_rtmgr_test.go index cc09efd..91a8fd8 100644 --- a/pkg/control/ut_stub_rtmgr_test.go +++ b/pkg/control/ut_stub_rtmgr_test.go @@ -106,7 +106,7 @@ func (tc *testingHttpRtmgrStub) http_handler(w http.ResponseWriter, r *http.Requ if err != nil { tc.Error("%s", err.Error()) } - tc.Info("handling SubscriptionID=%d Address=%s Port=%d", *req.SubscriptionID, *req.Address, *req.Port) + tc.Debug("handling SubscriptionID=%d Address=%s Port=%d", *req.SubscriptionID, *req.Address, *req.Port) id = *req.SubscriptionID } if r.Method == http.MethodPut { @@ -115,7 +115,7 @@ func (tc *testingHttpRtmgrStub) http_handler(w http.ResponseWriter, r *http.Requ if err != nil { tc.Error("%s", err.Error()) } - tc.Info("handling put") + tc.Debug("handling put") } var code int = 0 @@ -128,7 +128,7 @@ func (tc *testingHttpRtmgrStub) http_handler(w http.ResponseWriter, r *http.Requ } if tc.eventWaiter.sleep != 0 { <-time.After(time.Duration(tc.eventWaiter.sleep) * time.Millisecond) - tc.Info("sleeping done, %v", id) + tc.Debug("sleeping done, %v", id) } } case http.MethodDelete: @@ -154,7 +154,7 @@ func (tc *testingHttpRtmgrStub) http_handler(w http.ResponseWriter, r *http.Requ if waiter != nil { waiter.SetResult(true) } - tc.Info("Method=%s Reply with code %d", r.Method, code) + tc.Debug("Method=%s Reply with code %d", r.Method, code) w.WriteHeader(code) } diff --git a/pkg/control/ut_test.go b/pkg/control/ut_test.go index 5072cf4..8656d5d 100644 --- a/pkg/control/ut_test.go +++ b/pkg/control/ut_test.go @@ -35,7 +35,7 @@ import ( //----------------------------------------------------------------------------- func CaseBegin(desc string) *teststub.TestWrapper { tent := teststub.NewTestWrapper(desc) - tent.Info(desc) + tent.Debug(desc) return tent } @@ -104,7 +104,7 @@ func ut_test_init() func() { defer os.Remove(cfgfilename) os.Setenv("CFG_FILE", cfgfilename) */ - tent.Info("Using cfg file %s", os.Getenv("CFG_FILE")) + tent.Debug("Using cfg file %s", os.Getenv("CFG_FILE")) //--------------------------------- // Static routetable for rmr @@ -152,12 +152,12 @@ func ut_test_init() func() { rt.AddMeid(e2term2src.String(), []string{"RAN_NAME_11", "RAN_NAME_12"}) rt.Enable() - tent.Info("rttable[%s]", rt.Table()) + tent.Debug("rttable[%s]", rt.Table()) //--------------------------------- // //--------------------------------- - tent.Info("### submgr ctrl run ###") + tent.Debug("### submgr ctrl run ###") mainCtrl = createSubmgrControl(mainsrc, teststub.RmrRtgSvc{}) // @@ -168,13 +168,13 @@ func ut_test_init() func() { //env variables. Re-create rt info. for i := 0; i < int(10)*2; i++ { if os.Getenv("RMR_SEED_RT") == rt.FileName() { - tent.Info("Waiting that alarm alternates RMR_SEED_RT=%s", os.Getenv("RMR_SEED_RT")) + tent.Debug("Waiting that alarm alternates RMR_SEED_RT=%s", os.Getenv("RMR_SEED_RT")) time.Sleep(500 * time.Millisecond) } else { - tent.Info("Alarm has alternated RMR_SEED_RT=%s, so waiting 0.5 secs before restoring it", os.Getenv("RMR_SEED_RT")) + tent.Debug("Alarm has alternated RMR_SEED_RT=%s, so waiting 0.5 secs before restoring it", os.Getenv("RMR_SEED_RT")) time.Sleep(500 * time.Millisecond) rt.Enable() - tent.Info("rttable[%s]", rt.Table()) + tent.Debug("rttable[%s]", rt.Table()) break } } @@ -187,31 +187,31 @@ func ut_test_init() func() { //--------------------------------- // //--------------------------------- - tent.Info("### xapp1 stub run ###") + tent.Debug("### xapp1 stub run ###") xappConn1 = teststube2ap.CreateNewE2Stub("xappstub1", xapp1src, teststub.RmrRtgSvc{}, "RMRXAPP1STUB", teststubPortSeed, "RAN_NAME_1", "localhost", 13560, 8080) //--------------------------------- // //--------------------------------- - tent.Info("### xapp2 stub run ###") + tent.Debug("### xapp2 stub run ###") xappConn2 = teststube2ap.CreateNewE2Stub("xappstub2", xapp2src, teststub.RmrRtgSvc{}, "RMRXAPP2STUB", teststubPortSeed, "RAN_NAME_2", "localhost", 13660, 8080) //--------------------------------- // //--------------------------------- - tent.Info("### e2term1 stub run ###") + tent.Debug("### e2term1 stub run ###") e2termConn1 = teststube2ap.CreateNewE2termStub("e2termstub1", e2term1src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB1", teststubPortSeed) //--------------------------------- // //--------------------------------- - tent.Info("### e2term2 stub run ###") + tent.Debug("### e2term2 stub run ###") e2termConn2 = teststube2ap.CreateNewE2termStub("e2termstub2", e2term2src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB2", teststubPortSeed) //--------------------------------- // Just to test dummy stub //--------------------------------- - tent.Info("### dummy stub run ###") + tent.Debug("### dummy stub run ###") dummystub = teststubdummy.CreateNewRmrDummyStub("dummystub", dummysrc, teststub.RmrRtgSvc{}, "DUMMYSTUB", teststubPortSeed) //--------------------------------- diff --git a/pkg/teststub/controlRmr.go b/pkg/teststub/controlRmr.go index 71d66fe..011819b 100644 --- a/pkg/teststub/controlRmr.go +++ b/pkg/teststub/controlRmr.go @@ -60,6 +60,6 @@ func (tc *RmrControl) TestError(t *testing.T, pattern string, args ...interface{ } func (tc *RmrControl) TestLog(t *testing.T, pattern string, args ...interface{}) { - tc.Info(fmt.Sprintf(pattern, args...)) + tc.Debug(fmt.Sprintf(pattern, args...)) t.Logf(fmt.Sprintf(pattern, args...)) } diff --git a/pkg/teststub/controlRmrStub.go b/pkg/teststub/controlRmrStub.go index d710dca..7edc22b 100644 --- a/pkg/teststub/controlRmrStub.go +++ b/pkg/teststub/controlRmrStub.go @@ -101,17 +101,17 @@ func (tc *RmrStubControl) Consume(msg *xapp.RMRParams) (err error) { msg.PayloadLen = len(cPay) if msg.Mtype == tc.InitMsg { - tc.Info("Testing message ignore %s", msg.String()) + tc.Debug("Testing message ignore %s", msg.String()) tc.SetActive() return } if tc.IsCheckXid() == true && strings.Contains(msg.Xid, tc.GetDesc()) == false { - tc.Info("Ignore %s", msg.String()) + tc.Debug("Ignore %s", msg.String()) return } - tc.Info("Consume %s", msg.String()) + tc.Debug("Consume %s", msg.String()) tc.PushMsg(msg) return } @@ -161,14 +161,14 @@ func RmrStubControlWaitAlive(seconds int, mtype int, rmr *xapp.RMRClient, tent * params.Mbuf = nil if len(allRmrStubs) == 0 { - tent.Info("No rmr stubs so no need to wait those to be alive") + tent.Debug("No rmr stubs so no need to wait those to be alive") return true } status := false i := 1 for ; i <= seconds*2 && status == false; i++ { - tent.Info("SEND TESTPING: %s", params.String()) + tent.Debug("SEND TESTPING: %s", params.String()) rmr.SendWithRetry(params, false, 0) status = true @@ -181,7 +181,7 @@ func RmrStubControlWaitAlive(seconds int, mtype int, rmr *xapp.RMRClient, tent * if status == true { break } - tent.Info("Sleep 0.5 secs and try routes again") + tent.Debug("Sleep 0.5 secs and try routes again") time.Sleep(500 * time.Millisecond) } diff --git a/pkg/teststub/rmrenv.go b/pkg/teststub/rmrenv.go index 4b1f1b7..8c1f125 100644 --- a/pkg/teststub/rmrenv.go +++ b/pkg/teststub/rmrenv.go @@ -96,7 +96,7 @@ func (rrt *RmrRouteTable) Enable() { } os.Setenv("RMR_SEED_RT", rrt.tmpfile) os.Setenv("RMR_RTG_SVC", "-1") - xapp.Logger.Info("Using rt file %s", os.Getenv("RMR_SEED_RT")) + xapp.Logger.Debug("Using rt file %s", os.Getenv("RMR_SEED_RT")) } func (rrt *RmrRouteTable) Disable() { @@ -105,7 +105,7 @@ func (rrt *RmrRouteTable) Disable() { os.Unsetenv("RMR_SEED_RT") os.Unsetenv("RMR_RTG_SVC") rrt.tmpfile = "" - xapp.Logger.Info("Not using rt file ") + xapp.Logger.Debug("Not using rt file ") } } @@ -120,13 +120,13 @@ type RmrSrcId struct { func (rsi *RmrSrcId) Enable() { if rsi.Port > 0 { os.Setenv("RMR_SRC_ID", rsi.String()) - xapp.Logger.Info("Using src id %s", os.Getenv("RMR_SRC_ID")) + xapp.Logger.Debug("Using src id %s", os.Getenv("RMR_SRC_ID")) } } func (rsi *RmrSrcId) Disable() { os.Unsetenv("RMR_SRC_ID") - xapp.Logger.Info("Not using Using src id") + xapp.Logger.Debug("Not using Using src id") } //----------------------------------------------------------------------------- @@ -139,11 +139,11 @@ type RmrRtgSvc struct { func (rrs *RmrRtgSvc) Enable() { if rrs.Port > 0 { os.Setenv("RMR_RTG_SVC", rrs.String()) - xapp.Logger.Info("Using rtg svc %s", os.Getenv("RMR_SRC_ID")) + xapp.Logger.Debug("Using rtg svc %s", os.Getenv("RMR_SRC_ID")) } } func (rrs *RmrRtgSvc) Disable() { os.Unsetenv("RMR_RTG_SVC") - xapp.Logger.Info("Not using Using rtg svc") + xapp.Logger.Debug("Not using Using rtg svc") } diff --git a/pkg/teststub/testwrapper.go b/pkg/teststub/testwrapper.go index 7752be8..d75dea3 100644 --- a/pkg/teststub/testwrapper.go +++ b/pkg/teststub/testwrapper.go @@ -52,7 +52,7 @@ func (tw *TestWrapper) TestError(t *testing.T, pattern string, args ...interface // //----------------------------------------------------------------------------- func (tw *TestWrapper) TestLog(t *testing.T, pattern string, args ...interface{}) { - tw.Info(fmt.Sprintf(pattern, args...)) + tw.Debug(fmt.Sprintf(pattern, args...)) t.Logf(fmt.Sprintf(pattern, args...)) } diff --git a/pkg/teststubdummy/stubRmrDummy.go b/pkg/teststubdummy/stubRmrDummy.go index 2520c54..b11ac6f 100644 --- a/pkg/teststubdummy/stubRmrDummy.go +++ b/pkg/teststubdummy/stubRmrDummy.go @@ -54,7 +54,7 @@ func CreateNewRmrDummyStub(desc string, srcId teststub.RmrSrcId, rtgSvc teststub //----------------------------------------------------------------------------- func (tc *RmrDummyStub) SendReq(t *testing.T, plen int) { - tc.Info("SendReq") + tc.Debug("SendReq") len := plen if len == 0 { len = 100 @@ -77,7 +77,7 @@ func (tc *RmrDummyStub) SendReq(t *testing.T, plen int) { } func (tc *RmrDummyStub) SendResp(t *testing.T, plen int) { - tc.Info("SendReq") + tc.Debug("SendReq") len := plen if len == 0 { len = 100 @@ -99,7 +99,7 @@ func (tc *RmrDummyStub) SendResp(t *testing.T, plen int) { } func (tc *RmrDummyStub) RecvReq(t *testing.T) bool { - tc.Info("RecvReq") + tc.Debug("RecvReq") msg := tc.WaitMsg(15) if msg != nil { @@ -115,7 +115,7 @@ func (tc *RmrDummyStub) RecvReq(t *testing.T) bool { } func (tc *RmrDummyStub) RecvResp(t *testing.T) bool { - tc.Info("RecvResp") + tc.Debug("RecvResp") msg := tc.WaitMsg(15) if msg != nil { diff --git a/pkg/teststube2ap/stubE2.go b/pkg/teststube2ap/stubE2.go index 72baf27..a021cd0 100644 --- a/pkg/teststube2ap/stubE2.go +++ b/pkg/teststube2ap/stubE2.go @@ -30,6 +30,7 @@ import ( "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap_wrapper" "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststub" clientmodel "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientmodel" + //"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" ) @@ -47,9 +48,11 @@ type RmrTransactionId struct { } type E2RestIds struct { - RestSubsId string - E2SubsId uint32 - ErrorCause string + RestSubsId string + E2SubsId uint32 + ErrorCause string + ErrorSource string + TimeoutType string } func (trans *RmrTransactionId) String() string { @@ -118,7 +121,7 @@ func (tc *E2Stub) NewRmrTransactionId(xid string, ranname string) *RmrTransactio trans.xid = xid } trans.meid = &xapp.RMRMeid{RanName: ranname} - tc.Info("New test %s", trans.String()) + tc.Debug("New test %s", trans.String()) return trans } @@ -205,7 +208,7 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra trans = tc.NewRmrTransactionId("", "RAN_NAME_1") } - tc.Info("SendSubsReq %s", trans.String()) + tc.Debug("SendSubsReq %s", trans.String()) e2SubsReq := e2asnpacker.NewPackerSubscriptionRequest() //--------------------------------- @@ -234,7 +237,7 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra params.Xid = trans.xid params.Mbuf = nil - tc.Info("SEND SUB REQ: %s", params.String()) + tc.Debug("SEND SUB REQ: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s %s", trans.String(), snderr.Error()) @@ -247,7 +250,7 @@ func (tc *E2Stub) SendSubsReq(t *testing.T, rparams *E2StubSubsReqParams, oldTra // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xapp.RMRParams) { - tc.Info("RecvSubsReq") + tc.Debug("RecvSubsReq") e2SubsReq := e2asnpacker.NewPackerSubscriptionRequest() //--------------------------------- @@ -258,7 +261,7 @@ func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xap if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_REQ"] { tc.TestError(t, "Received wrong mtype expected %s got %s, error", "RIC_SUB_REQ", xapp.RicMessageTypeToName[msg.Mtype]) } else { - tc.Info("Recv Subs Req") + tc.Debug("Recv Subs Req") packedData := &e2ap.PackedData{} packedData.Buf = msg.Payload unpackerr, req := e2SubsReq.UnPack(packedData) @@ -278,7 +281,7 @@ func (tc *E2Stub) RecvSubsReq(t *testing.T) (*e2ap.E2APSubscriptionRequest, *xap // //----------------------------------------------------------------------------- func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, msg *xapp.RMRParams) { - tc.Info("SendSubsResp") + tc.Debug("SendSubsResp") e2SubsResp := e2asnpacker.NewPackerSubscriptionResponse() //--------------------------------- @@ -319,7 +322,7 @@ func (tc *E2Stub) SendSubsResp(t *testing.T, req *e2ap.E2APSubscriptionRequest, //params.Xid = msg.Xid params.Mbuf = nil - tc.Info("SEND SUB RESP: %s", params.String()) + tc.Debug("SEND SUB RESP: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) @@ -341,16 +344,16 @@ func (tc *E2Stub) SendInvalidE2Asn1Resp(t *testing.T, msg *xapp.RMRParams, msgTy params.Mbuf = nil if params.Mtype == xapp.RIC_SUB_RESP { - tc.Info("SEND INVALID ASN.1 SUB RESP") + tc.Debug("SEND INVALID ASN.1 SUB RESP") } else if params.Mtype == xapp.RIC_SUB_FAILURE { - tc.Info("SEND INVALID ASN.1 SUB FAILURE") + tc.Debug("SEND INVALID ASN.1 SUB FAILURE") } else if params.Mtype == xapp.RIC_SUB_DEL_RESP { - tc.Info("SEND INVALID ASN.1 SUB DEL RESP") + tc.Debug("SEND INVALID ASN.1 SUB DEL RESP") } else if params.Mtype == xapp.RIC_SUB_DEL_FAILURE { - tc.Info("SEND INVALID ASN.1 SUB DEL FAILURE") + tc.Debug("SEND INVALID ASN.1 SUB DEL FAILURE") } snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { @@ -362,7 +365,7 @@ func (tc *E2Stub) SendInvalidE2Asn1Resp(t *testing.T, msg *xapp.RMRParams, msgTy // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { - tc.Info("RecvSubsResp") + tc.Debug("RecvSubsResp") e2SubsResp := e2asnpacker.NewPackerSubscriptionResponse() var e2SubsId uint32 @@ -389,7 +392,7 @@ func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { if unpackerr != nil { tc.TestError(t, "RIC_SUB_RESP unpack failed err: %s", unpackerr.Error()) } - tc.Info("Recv Subs Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Debug("Recv Subs Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return e2SubsId } } else { @@ -403,7 +406,7 @@ func (tc *E2Stub) RecvSubsResp(t *testing.T, trans *RmrTransactionId) uint32 { //----------------------------------------------------------------------------- func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg *xapp.RMRParams) { - tc.Info("SendSubsFail") + tc.Debug("SendSubsFail") e2SubsFail := e2asnpacker.NewPackerSubscriptionFailure() //--------------------------------- @@ -424,7 +427,7 @@ func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg params.Xid = msg.Xid params.Mbuf = nil - tc.Info("SEND SUB FAIL: %s", params.String()) + tc.Debug("SEND SUB FAIL: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) @@ -435,7 +438,7 @@ func (tc *E2Stub) SendSubsFail(t *testing.T, fparams *E2StubSubsFailParams, msg // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsFail(t *testing.T, trans *RmrTransactionId) uint32 { - tc.Info("RecvSubsFail") + tc.Debug("RecvSubsFail") e2SubsFail := e2asnpacker.NewPackerSubscriptionFailure() var e2SubsId uint32 @@ -462,7 +465,7 @@ func (tc *E2Stub) RecvSubsFail(t *testing.T, trans *RmrTransactionId) uint32 { if unpackerr != nil { tc.TestError(t, "RIC_SUB_FAILURE unpack failed err: %s", unpackerr.Error()) } - tc.Info("Recv Subs Fail rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Debug("Recv Subs Fail rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return e2SubsId } } else { @@ -481,7 +484,7 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub trans = tc.NewRmrTransactionId("", "RAN_NAME_1") } - tc.Info("SendSubsDelReq %s", trans.String()) + tc.Debug("SendSubsDelReq %s", trans.String()) e2SubsDelReq := e2asnpacker.NewPackerSubscriptionDeleteRequest() //--------------------------------- // xapp activity: Send Subs Del Req @@ -507,7 +510,7 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub params.Xid = trans.xid params.Mbuf = nil - tc.Info("SEND SUB DEL REQ: %s", params.String()) + tc.Debug("SEND SUB DEL REQ: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s %s", trans.String(), snderr.Error()) @@ -520,7 +523,7 @@ func (tc *E2Stub) SendSubsDelReq(t *testing.T, oldTrans *RmrTransactionId, e2Sub // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequest, *xapp.RMRParams) { - tc.Info("RecvSubsDelReq") + tc.Debug("RecvSubsDelReq") e2SubsDelReq := e2asnpacker.NewPackerSubscriptionDeleteRequest() //--------------------------------- @@ -531,7 +534,7 @@ func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequ if msg.Mtype != xapp.RICMessageTypes["RIC_SUB_DEL_REQ"] { tc.TestError(t, "Received wrong mtype expected %s got %s, error", "RIC_SUB_DEL_REQ", xapp.RicMessageTypeToName[msg.Mtype]) } else { - tc.Info("Recv Subs Del Req") + tc.Debug("Recv Subs Del Req") packedData := &e2ap.PackedData{} packedData.Buf = msg.Payload @@ -551,7 +554,7 @@ func (tc *E2Stub) RecvSubsDelReq(t *testing.T) (*e2ap.E2APSubscriptionDeleteRequ // //----------------------------------------------------------------------------- func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapp.RMRParams) { - tc.Info("SendSubsDelResp") + tc.Debug("SendSubsDelResp") e2SubsDelResp := e2asnpacker.NewPackerSubscriptionDeleteResponse() //--------------------------------- @@ -577,7 +580,7 @@ func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDelete params.Xid = msg.Xid params.Mbuf = nil - tc.Info("SEND SUB DEL RESP: %s", params.String()) + tc.Debug("SEND SUB DEL RESP: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) @@ -588,7 +591,7 @@ func (tc *E2Stub) SendSubsDelResp(t *testing.T, req *e2ap.E2APSubscriptionDelete // //----------------------------------------------------------------------------- func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { - tc.Info("RecvSubsDelResp") + tc.Debug("RecvSubsDelResp") e2SubsDelResp := e2asnpacker.NewPackerSubscriptionDeleteResponse() //--------------------------------- @@ -609,7 +612,7 @@ func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { if unpackerr != nil { tc.TestError(t, "RIC_SUB_DEL_RESP unpack failed err: %s", unpackerr.Error()) } - tc.Info("Recv Subs Del Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) + tc.Debug("Recv Subs Del Resp rmr: xid=%s subid=%d, asn: instanceid=%d", msg.Xid, msg.SubId, resp.RequestId.InstanceId) return } } else { @@ -621,7 +624,7 @@ func (tc *E2Stub) RecvSubsDelResp(t *testing.T, trans *RmrTransactionId) { // //----------------------------------------------------------------------------- func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDeleteRequest, msg *xapp.RMRParams) { - tc.Info("SendSubsDelFail") + tc.Debug("SendSubsDelFail") e2SubsDelFail := e2asnpacker.NewPackerSubscriptionDeleteFailure() //--------------------------------- @@ -649,7 +652,7 @@ func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDelete params.Xid = msg.Xid params.Mbuf = nil - tc.Info("SEND SUB DEL FAIL: %s", params.String()) + tc.Debug("SEND SUB DEL FAIL: %s", params.String()) snderr := tc.SendWithRetry(params, false, 5) if snderr != nil { tc.TestError(t, "RMR SEND FAILED: %s", snderr.Error()) @@ -667,15 +670,15 @@ func (tc *E2Stub) SendSubsDelFail(t *testing.T, req *e2ap.E2APSubscriptionDelete func (tc *E2Stub) SubscriptionRespHandler(resp *clientmodel.SubscriptionResponse) { if tc.subscriptionId == "SUBSCRIPTIONID NOT SET" { - tc.Info("REST notification received for %v while no SubscriptionID was not set for E2EventInstanceID=%v, XappEventInstanceID=%v (%v)", + tc.Debug("REST notification received for %v while no SubscriptionID was not set for E2EventInstanceID=%v, XappEventInstanceID=%v (%v)", *resp.SubscriptionID, *resp.SubscriptionInstances[0].E2EventInstanceID, *resp.SubscriptionInstances[0].XappEventInstanceID, tc) tc.CallBackNotification <- *resp.SubscriptionInstances[0].E2EventInstanceID } else if tc.subscriptionId == *resp.SubscriptionID { - tc.Info("REST notification received SubscriptionID=%s, E2EventInstanceID=%v, RequestorID=%v (%v)", + tc.Debug("REST notification received SubscriptionID=%s, E2EventInstanceID=%v, RequestorID=%v (%v)", *resp.SubscriptionID, *resp.SubscriptionInstances[0].E2EventInstanceID, *resp.SubscriptionInstances[0].XappEventInstanceID, tc) tc.CallBackNotification <- *resp.SubscriptionInstances[0].E2EventInstanceID } else { - tc.Info("MISMATCHING REST notification received SubscriptionID=%s<>%s, E2EventInstanceID=%v, XappEventInstanceID=%v (%v)", + tc.Debug("MISMATCHING REST notification received SubscriptionID=%s<>%s, E2EventInstanceID=%v, XappEventInstanceID=%v (%v)", tc.subscriptionId, *resp.SubscriptionID, *resp.SubscriptionInstances[0].E2EventInstanceID, *resp.SubscriptionInstances[0].XappEventInstanceID, tc) } } @@ -698,7 +701,7 @@ func (tc *E2Stub) ExpectRESTNotificationNok(t *testing.T, restSubsId string, exp func (tc *E2Stub) expectNotification(t *testing.T, restSubsId string, expectError string) { - tc.Info("### Started to wait REST notification for %v on port %v f(RMR port %v), %v responses expected", restSubsId, *tc.clientEndpoint.HTTPPort, *tc.clientEndpoint.RMRPort, tc.requestCount) + tc.Debug("### Started to wait REST notification for %v on port %v f(RMR port %v), %v responses expected", restSubsId, *tc.clientEndpoint.HTTPPort, *tc.clientEndpoint.RMRPort, tc.requestCount) tc.restSubsIdList = []string{restSubsId} xapp.Subscription.SetResponseCB(tc.ListedRestNotifHandler) if tc.requestCount == 0 { @@ -714,18 +717,18 @@ func (tc *E2Stub) expectNotification(t *testing.T, restSubsId string, expectErro } else if e2Ids.ErrorCause == "" && expectError == "allFail" { tc.TestError(t, "### Unexpected ok cause received from REST notifications |%s:%s| (%v)", e2Ids.RestSubsId, restSubsId, tc) } else if e2Ids.ErrorCause != "" && expectError == "allOk" { - tc.TestError(t, "### Unexpected error cause (%s) received from REST notifications |%s:%s| (%v)", e2Ids.ErrorCause, e2Ids.RestSubsId, restSubsId, tc) + tc.TestError(t, "### Unexpected ErrorCause: (%s), ErrorSource: (%s), TimeoutType: (%s) received from REST notifications |%s:%s| (%v)", e2Ids.ErrorCause, e2Ids.ErrorSource, e2Ids.TimeoutType, e2Ids.RestSubsId, restSubsId, tc) } else { tc.requestCount-- if tc.requestCount == 0 { - tc.Info("### All expected REST notifications received for %s (%v)", e2Ids.RestSubsId, tc) + tc.Debug("### All expected REST notifications received for %s (%v)", e2Ids.RestSubsId, tc) } else { - tc.Info("### Expected REST notifications received for %s, (%v)", e2Ids.RestSubsId, tc) + tc.Debug("### Expected REST notifications received for %s, (%v)", e2Ids.RestSubsId, tc) } if e2Ids.ErrorCause != "" && expectError == "allFail" { - tc.Info("### REST Notification: %s, ErrorCause: %v", e2Ids.RestSubsId, e2Ids.ErrorCause) + tc.Debug("### REST Notification: RestSubsId: %s, ErrorCause: %s, ErrorSource: (%s), TimeoutType: (%s)", e2Ids.RestSubsId, e2Ids.ErrorCause, e2Ids.ErrorSource, e2Ids.TimeoutType) } - tc.Info("### REST Notification received Notif for %s : %v", e2Ids.RestSubsId, e2Ids.E2SubsId) + tc.Debug("### REST Notification received Notif for %s : %v", e2Ids.RestSubsId, e2Ids.E2SubsId) tc.ListedRESTNotifications <- e2Ids if len(tc.ListedRESTNotifications) > 1 { panic("expectNotification - ListedRESTNotifications stacking up") @@ -745,17 +748,17 @@ func (tc *E2Stub) WaitRESTNotification(t *testing.T, restSubsId string) uint32 { select { case e2SubsId := <-tc.ListedRESTNotifications: if e2SubsId.RestSubsId == restSubsId { - tc.Info("### Expected REST notifications received %s, e2SubsId %v for endpoint=%s, (%v)", e2SubsId.RestSubsId, e2SubsId.E2SubsId, tc.clientEndpoint, tc) + tc.Debug("### Expected REST notifications received %s, e2SubsId %v for endpoint=%s, (%v)", e2SubsId.RestSubsId, e2SubsId.E2SubsId, tc.clientEndpoint, tc) return e2SubsId.E2SubsId } else { tc.TestError(t, "### Unexpected REST notification %s received, expected %s for endpoint=%s, (%v)", e2SubsId.RestSubsId, restSubsId, tc.clientEndpoint, tc) - xapp.Logger.Info("CALL STACK:\n %s", stack) + xapp.Logger.Debug("CALL STACK:\n %s", stack) return 0 } case <-time.After(15 * time.Second): err := fmt.Errorf("### Timeout 15s expired while waiting REST notification for subsId: %v", restSubsId) tc.TestError(t, "%s", err.Error()) - xapp.Logger.Info("CALL STACK:\n %s", stack) + xapp.Logger.Debug("CALL STACK:\n %s", stack) panic("WaitRESTNotification - timeout error") } } @@ -763,10 +766,10 @@ func (tc *E2Stub) WaitRESTNotification(t *testing.T, restSubsId string) uint32 { // Note, this function should be followed by a handling of <-xappConn1.RESTNotification. func (tc *E2Stub) ExpectAnyNotification(t *testing.T) { go func() { - tc.Info("### Started waiting ANY REST notifications received for endpoint=%s, (%v)", tc.clientEndpoint, tc) + tc.Debug("### Started waiting ANY REST notifications received for endpoint=%s, (%v)", tc.clientEndpoint, tc) select { case e2SubsId := <-tc.CallBackNotification: - tc.Info("### ANY REST notifications received e2SubsId %v for endpoint=%s, (%v) via CallBackNotification", e2SubsId, tc.clientEndpoint, tc) + tc.Debug("### ANY REST notifications received e2SubsId %v for endpoint=%s, (%v) via CallBackNotification", e2SubsId, tc.clientEndpoint, tc) tc.RESTNotification <- (uint32)(e2SubsId) case <-time.After(15 * time.Second): err := fmt.Errorf("### Timeout 15s expired while waiting ANY REST notification") @@ -780,7 +783,7 @@ func (tc *E2Stub) WaitAnyRESTNotification(t *testing.T) uint32 { select { case e2SubsId := <-tc.RESTNotification: - tc.Info("### Expected ANY REST notification received - e2SubsId %v for endpoint=%s, (%v)", e2SubsId, tc.clientEndpoint, tc) + tc.Debug("### Expected ANY REST notification received - e2SubsId %v for endpoint=%s, (%v)", e2SubsId, tc.clientEndpoint, tc) return e2SubsId case <-time.After(15 * time.Second): @@ -797,20 +800,20 @@ func (tc *E2Stub) ListedRestNotifHandler(resp *clientmodel.SubscriptionResponse) } else { for i, subsId := range tc.restSubsIdList { if *resp.SubscriptionID == subsId { - //tc.Info("Listed REST notifications received SubscriptionID=%s, InstanceID=%v, XappEventInstanceID=%v", + //tc.Debug("Listed REST notifications received SubscriptionID=%s, InstanceID=%v, XappEventInstanceID=%v", // *resp.SubscriptionID, *resp.SubscriptionInstances[0].InstanceID, *resp.SubscriptionInstances[0].XappEventInstanceID) tc.restSubsIdList = append(tc.restSubsIdList[:i], tc.restSubsIdList[i+1:]...) - //tc.Info("Removed %s from Listed REST notifications, %v entries left", *resp.SubscriptionID, len(tc.restSubsIdList)) + //tc.Debug("Removed %s from Listed REST notifications, %v entries left", *resp.SubscriptionID, len(tc.restSubsIdList)) - if resp.SubscriptionInstances[0].ErrorCause != nil { - tc.CallBackListedNotifications <- E2RestIds{*resp.SubscriptionID, uint32(*resp.SubscriptionInstances[0].E2EventInstanceID), *resp.SubscriptionInstances[0].ErrorCause} - } else { - tc.CallBackListedNotifications <- E2RestIds{*resp.SubscriptionID, uint32(*resp.SubscriptionInstances[0].E2EventInstanceID), ""} - } + // if resp.SubscriptionInstances[0].ErrorCause != nil { + tc.CallBackListedNotifications <- *tc.GetE2RestIds(resp) + // } else { + // tc.CallBackListedNotifications <- E2RestIds{*resp.SubscriptionID, uint32(*resp.SubscriptionInstances[0].E2EventInstanceID), "", "", ""} + // } if len(tc.restSubsIdList) == 0 { - tc.Info("All listed REST notifications received for endpoint=%s", tc.clientEndpoint) + tc.Debug("All listed REST notifications received for endpoint=%s", tc.clientEndpoint) } return @@ -821,11 +824,45 @@ func (tc *E2Stub) ListedRestNotifHandler(resp *clientmodel.SubscriptionResponse) } } +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +func (tc *E2Stub) GetE2RestIds(resp *clientmodel.SubscriptionResponse) *E2RestIds { + + e2RestIds := &E2RestIds{} + if resp != nil { + if resp.SubscriptionID != nil { + e2RestIds.RestSubsId = *resp.SubscriptionID + } + if resp.SubscriptionInstances != nil { + if resp.SubscriptionInstances[0].E2EventInstanceID != nil { + e2RestIds.E2SubsId = uint32(*resp.SubscriptionInstances[0].E2EventInstanceID) + } + if resp.SubscriptionInstances[0].ErrorCause != nil { + e2RestIds.ErrorCause = *resp.SubscriptionInstances[0].ErrorCause + } else { + e2RestIds.ErrorCause = "nil" + } + if resp.SubscriptionInstances[0].ErrorSource != nil { + e2RestIds.ErrorSource = *resp.SubscriptionInstances[0].ErrorSource + } else { + e2RestIds.ErrorSource = "nil" + } + if resp.SubscriptionInstances[0].TimeoutType != nil { + e2RestIds.TimeoutType = *resp.SubscriptionInstances[0].TimeoutType + } else { + e2RestIds.TimeoutType = "nil" + } + } + } + return e2RestIds +} + //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- func (tc *E2Stub) WaitListedRestNotifications(t *testing.T, restSubsIds []string) { - tc.Info("Started to wait REST notifications %v on port %v f(RMR port %v)", restSubsIds, *tc.clientEndpoint.HTTPPort, *tc.clientEndpoint.RMRPort) + tc.Debug("Started to wait REST notifications %v on port %v f(RMR port %v)", restSubsIds, *tc.clientEndpoint.HTTPPort, *tc.clientEndpoint.RMRPort) tc.restSubsIdList = restSubsIds xapp.Subscription.SetResponseCB(tc.ListedRestNotifHandler) @@ -834,7 +871,7 @@ func (tc *E2Stub) WaitListedRestNotifications(t *testing.T, restSubsIds []string go func() { select { case e2Ids := <-tc.CallBackListedNotifications: - tc.Info("Listed Notification waiter received Notif for %s : %v", e2Ids.RestSubsId, e2Ids.E2SubsId) + tc.Debug("Listed Notification waiter received Notif for %s : %v", e2Ids.RestSubsId, e2Ids.E2SubsId) tc.ListedRESTNotifications <- e2Ids case <-time.After(15 * time.Second): err := fmt.Errorf("Timeout 15s expired while waiting Listed REST notification") @@ -848,11 +885,11 @@ func (tc *E2Stub) WaitListedRestNotifications(t *testing.T, restSubsIds []string //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- -func (tc *E2Stub) SendRESTSubsReq(t *testing.T, params *RESTSubsReqParams) string { // This need to be edited according to new specification - tc.Info("======== Posting REST Report subscriptions to Submgr ======") +func (tc *E2Stub) SendRESTSubsReq(t *testing.T, params *RESTSubsReqParams) string { + tc.Debug("======== Posting REST subscriptions to Submgr ======") if params == nil { - tc.Info("SendRESTReportSubsReq: params == nil") + tc.Debug("SendRESTReportSubsReq: params == nil") return "" } @@ -862,14 +899,41 @@ func (tc *E2Stub) SendRESTSubsReq(t *testing.T, params *RESTSubsReqParams) strin if err != nil { // Swagger generated code makes checks for the values that are inserted the subscription function // If error cause is unknown and POST is not done, the problem is in the inserted values - tc.Error("======== REST report subscriptions failed %s ========", err.Error()) + tc.Error("======== REST subscription request failed %s ========", err.Error()) + if resp != nil { + tc.PrintSubscriptionInsctanceErrorInfo(resp) + } else { + tc.Error("Subscribe resp == nil") + } return "" } tc.subscriptionId = *resp.SubscriptionID - tc.Info("======== REST report subscriptions posted successfully. SubscriptionID = %s, RequestCount = %v ========", *resp.SubscriptionID, tc.requestCount) + tc.Debug("======== REST subscriptions posted successfully. SubscriptionID = %s, RequestCount = %v ========", *resp.SubscriptionID, tc.requestCount) return *resp.SubscriptionID } +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +func (tc *E2Stub) PrintSubscriptionInsctanceErrorInfo(resp *clientmodel.SubscriptionResponse) { + for _, subscriptionInstance := range resp.SubscriptionInstances { + if subscriptionInstance != nil { + if subscriptionInstance.RejectCause != nil { + tc.Error("subscriptionInstance.RejectCause= %s", *subscriptionInstance.RejectCause) + } + if subscriptionInstance.ErrorCause != nil { + tc.Error("subscriptionInstance.ErrorCause= %s", *subscriptionInstance.ErrorCause) + } + if subscriptionInstance.ErrorSource != nil { + tc.Error("subscriptionInstance.ErrorSource= %s", *subscriptionInstance.ErrorSource) + } + if subscriptionInstance.TimeoutType != nil { + tc.Error("subscriptionInstance.TimeoutType = %s", *subscriptionInstance.TimeoutType) + } + } + } +} + //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- @@ -896,8 +960,6 @@ func (p *RESTSubsReqParams) GetRESTSubsReqReportParams(subReqCount int, clientEn var rANFunctionID int64 = 33 p.SubsReqParams.RANFunctionID = &rANFunctionID - // reqId := int64(1) - //seqId := int64(1) actionId := int64(1) actionType := "report" subsequestActioType := "continue" @@ -945,7 +1007,7 @@ func (p *RESTSubsReqParams) SetEndpointHost(host string) { if p.SubsReqParams.ClientEndpoint.Host != "" { if p.SubsReqParams.ClientEndpoint.Host != host { - // Renaming toto, print something tc.Info("Posting REST subscription request to Submgr") + // Renaming toto, print something tc.Debug("Posting REST subscription request to Submgr") err := fmt.Errorf("hostname change attempt: %s -> %s", p.SubsReqParams.ClientEndpoint.Host, host) panic(err) } @@ -965,6 +1027,20 @@ func (p *RESTSubsReqParams) SetHTTPEndpoint(HTTP_port int64, host string) { } } +func (p *RESTSubsReqParams) SetE2SubscriptionDirectives(E2RetryCount int64, E2TimeoutTimerValue int64, RMRRoutingNeeded bool) { + + E2SubscriptionDirectives := &clientmodel.SubscriptionParamsE2SubscriptionDirectives{} + p.SubsReqParams.E2SubscriptionDirectives = E2SubscriptionDirectives + p.SubsReqParams.E2SubscriptionDirectives.E2RetryCount = &E2RetryCount + p.SubsReqParams.E2SubscriptionDirectives.E2TimeoutTimerValue = E2TimeoutTimerValue + p.SubsReqParams.E2SubscriptionDirectives.RMRRoutingNeeded = &RMRRoutingNeeded +} + +func (p *RESTSubsReqParams) RemoveE2SubscriptionDirectives() { + + p.SubsReqParams.E2SubscriptionDirectives = nil +} + func (p *RESTSubsReqParams) SetSubActionTypes(actionType string) { for _, subDetail := range p.SubsReqParams.SubscriptionDetails { @@ -1057,23 +1133,32 @@ func (p *RESTSubsReqParams) SetSubscriptionID(SubscriptionID *string) { p.SubsReqParams.SubscriptionID = *SubscriptionID } +func (p *RESTSubsReqParams) SetXappEventInstanceID(xappEventInstanceId int64) { + + for _, subDetail := range p.SubsReqParams.SubscriptionDetails { + if subDetail != nil { + subDetail.XappEventInstanceID = &xappEventInstanceId + } + } +} + //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- func (tc *E2Stub) SendRESTSubsDelReq(t *testing.T, subscriptionID *string) { - tc.Info("======== Posting REST DELETE subscription(s) to Submgr ======") + tc.Debug("======== Posting REST DELETE subscription(s) to Submgr ======") if *subscriptionID == "" { tc.Error("REST error in deleting subscriptions. Empty SubscriptionID = %s", *subscriptionID) } - tc.Info("REST deleting E2 subscriptions. SubscriptionID = %s", *subscriptionID) + tc.Debug("REST deleting E2 subscriptions. SubscriptionID = %s", *subscriptionID) err := xapp.Subscription.Unsubscribe(*subscriptionID) if err != nil { tc.Error("REST Delete subscription failed %s", err.Error()) } - tc.Info("REST delete subscription pushed to submgr successfully. SubscriptionID = %s", *subscriptionID) + tc.Debug("REST delete subscription pushed to submgr successfully. SubscriptionID = %s", *subscriptionID) } //----------------------------------------------------------------------------- @@ -1107,9 +1192,6 @@ func (p *RESTSubsReqParams) GetRESTSubsReqPolicyParams(subReqCount int, clientEn p.SubsReqParams.Meid = meid var rANFunctionID int64 = 33 p.SubsReqParams.RANFunctionID = &rANFunctionID - - // reqId := int64(1) - //seqId := int64(1) actionId := int64(1) actionType := "policy" subsequestActioType := "continue" @@ -1138,5 +1220,14 @@ func (p *RESTSubsReqParams) GetRESTSubsReqPolicyParams(subReqCount int, clientEn } p.SubsReqParams.SubscriptionDetails = append(p.SubsReqParams.SubscriptionDetails, subscriptionDetail) } +} + +func (p *RESTSubsReqParams) SetSubscriptionDirectives(e2Timeout int64, e2RetryCount int64, routingNeeded bool) { + + e2SubscriptionDirectives := &clientmodel.SubscriptionParamsE2SubscriptionDirectives{} + e2SubscriptionDirectives.E2TimeoutTimerValue = e2Timeout + e2SubscriptionDirectives.E2RetryCount = &e2RetryCount + e2SubscriptionDirectives.RMRRoutingNeeded = &routingNeeded + p.SubsReqParams.E2SubscriptionDirectives = e2SubscriptionDirectives } -- 2.16.6