From 69ba9110fc6d7e5e759a8fa24876efbf5eb2baed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Walstr=C3=B6m?= Date: Thu, 3 Oct 2024 15:25:03 +0200 Subject: [PATCH] test: Update infix-container for test specification --- .../container_basic/Readme.adoc | 8 +++++ .../infix_containers/container_basic/test.py | 23 +++++++++---- .../container_bridge/Readme.adoc | 9 ++++- .../infix_containers/container_bridge/test.py | 21 +++++++----- .../container_bridge/topology.png | Bin 6783 -> 6924 bytes .../container_phys/Readme.adoc | 6 +++- .../infix_containers/container_phys/test.py | 17 +++++----- .../container_phys/topology.png | Bin 6783 -> 6924 bytes .../container_veth/Readme.adoc | 16 ++++++++- .../infix_containers/container_veth/test.py | 31 ++++++++++++------ .../container_veth/topology.png | Bin 6783 -> 6924 bytes 11 files changed, 95 insertions(+), 36 deletions(-) diff --git a/test/case/infix_containers/container_basic/Readme.adoc b/test/case/infix_containers/container_basic/Readme.adoc index 541e6658..f8d56c73 100644 --- a/test/case/infix_containers/container_basic/Readme.adoc +++ b/test/case/infix_containers/container_basic/Readme.adoc @@ -20,6 +20,14 @@ endif::testgroup[] endif::topdoc[] ==== Test sequence . Set up topology and attach to target DUT +. Set hostname to 'container-host' +. Create container 'web' from bundled OCI image +. Verify container 'web' has started +. Verify container 'web' is reachable on http://container-host.local:91 +. Stop container 'web' +. Verify container 'web' is stopped +. Restart container 'web' +. Verify container 'web' is reachable on http://container-host.local:91 <<< diff --git a/test/case/infix_containers/container_basic/test.py b/test/case/infix_containers/container_basic/test.py index 0dab2cd3..d95059d7 100755 --- a/test/case/infix_containers/container_basic/test.py +++ b/test/case/infix_containers/container_basic/test.py @@ -20,6 +20,7 @@ from infamy.util import until def _verify(server): + # Should really use mDNS here.... url = infamy.Furl(f"http://[{server}]:91/index.html") return url.check("It works") @@ -35,7 +36,14 @@ with infamy.Test() as test: if not target.has_model("infix-containers"): test.skip() - with test.step(f"Create {NAME} container from bundled OCI image"): + with test.step("Set hostname to 'container-host'"): + target.put_config_dict("ietf-system", { + "system": { + "hostname": "container-host" + } + }) + + with test.step("Create container 'web' from bundled OCI image"): target.put_config_dict("infix-containers", { "containers": { "container": [ @@ -51,21 +59,24 @@ with infamy.Test() as test: } }) - with test.step(f"Verify {NAME} container has started"): + with test.step("Verify container 'web' has started"): c = infamy.Container(target) until(lambda: c.running(NAME), attempts=10) - with test.step(f"Verify {NAME} container responds"): + with test.step("Verify container 'web' is reachable on http://container-host.local:91"): until(lambda: _verify(addr), attempts=10) - with test.step(f"Verify {NAME} container can be stopped and restarted"): + with test.step("Stop container 'web'"): c = infamy.Container(target) c.action(NAME, "stop") + + with test.step("Verify container 'web' is stopped"): until(lambda: not c.running(NAME), attempts=10) + + with test.step("Restart container 'web'"): c.action(NAME, "restart") - with test.step(f"Verify {NAME} container still responds"): + with test.step("Verify container 'web' is reachable on http://container-host.local:91"): # Wait for it to restart and respond, or fail until(lambda: _verify(addr), attempts=10) - test.succeed() diff --git a/test/case/infix_containers/container_bridge/Readme.adoc b/test/case/infix_containers/container_bridge/Readme.adoc index e269b6ab..d521040d 100644 --- a/test/case/infix_containers/container_bridge/Readme.adoc +++ b/test/case/infix_containers/container_bridge/Readme.adoc @@ -4,6 +4,9 @@ Verify connectivity with a simple web server container from behind a docker0 bridge. As an added twist, this test also verifies content mounts, i.e., custom index.html from running-config. +This also verifies port forwarding from container internal port to a +port accessed from the host. + ==== Topology ifdef::topdoc[] image::../../test/case/infix_containers/container_bridge/topology.png[Container with bridge network topology] @@ -17,7 +20,11 @@ image::topology.png[Container with bridge network topology] endif::testgroup[] endif::topdoc[] ==== Test sequence -. Initialize +. Set up topology and attach to target DUT +. Create container 'web-docker0' from bundled OCI image +. Verify container 'web-docker0' has started +. Verify basic DUT connectivity, host:data can ping DUT 10.0.0.2 +. Verify container 'web-docker0' is reachable on http://10.0.0.2:8080 <<< diff --git a/test/case/infix_containers/container_bridge/test.py b/test/case/infix_containers/container_bridge/test.py index ac26c51d..ea4ebd37 100755 --- a/test/case/infix_containers/container_bridge/test.py +++ b/test/case/infix_containers/container_bridge/test.py @@ -10,6 +10,9 @@ Container with bridge network Verify connectivity with a simple web server container from behind a docker0 bridge. As an added twist, this test also verifies content mounts, i.e., custom index.html from running-config. + +This also verifies port forwarding from container internal port to a +port accessed from the host. """ import base64 import infamy @@ -23,14 +26,14 @@ with infamy.Test() as test: BODY = "

Kilroy was here

" URL = f"http://{DUTIP}:8080/index.html" - with test.step("Initialize"): + with test.step("Set up topology and attach to target DUT"): env = infamy.Env() target = env.attach("target", "mgmt") if not target.has_model("infix-containers"): test.skip() - with test.step(f"Create {NAME} container from bundled OCI image"): + with test.step("Create container 'web-docker0' from bundled OCI image"): _, ifname = env.ltop.xlate("target", "data") enc = base64.b64encode(BODY.encode('utf-8')) target.put_config_dict("ietf-interfaces", { @@ -84,18 +87,18 @@ with infamy.Test() as test: } }) - with test.step(f"Verify {NAME} container has started"): + with test.step("Verify container 'web-docker0' has started"): c = infamy.Container(target) until(lambda: c.running(NAME), attempts=10) - with test.step(f"Verify {NAME} container responds"): - _, hport = env.ltop.xlate("host", "data") - url = infamy.Furl(URL) + _, hport = env.ltop.xlate("host", "data") + url = infamy.Furl(URL) - with infamy.IsolatedMacVlan(hport) as ns: - ns.addip(OURIP) + with infamy.IsolatedMacVlan(hport) as ns: + ns.addip(OURIP) + with test.step("Verify basic DUT connectivity, host:data can ping DUT 10.0.0.2"): ns.must_reach(DUTIP) - + with test.step("Verify container 'web-docker0' is reachable on http://10.0.0.2:8080"): until(lambda: url.nscheck(ns, "Kilroy was here"), attempts=10) test.succeed() diff --git a/test/case/infix_containers/container_bridge/topology.png b/test/case/infix_containers/container_bridge/topology.png index c5eff8f6908929e55be5d77096c1acbc69eed2ea..8b93e191dbb919e47cfdf7c625566c56f9540c6f 100644 GIT binary patch literal 6924 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 UG|w~3;iCw-M^B{k(E2|A1O94oPyhe` diff --git a/test/case/infix_containers/container_phys/Readme.adoc b/test/case/infix_containers/container_phys/Readme.adoc index fff617ed..107dabee 100644 --- a/test/case/infix_containers/container_phys/Readme.adoc +++ b/test/case/infix_containers/container_phys/Readme.adoc @@ -16,7 +16,11 @@ image::topology.png[Container with physical interface topology] endif::testgroup[] endif::topdoc[] ==== Test sequence -. Initialize +. Set up topology and attach to target DUT +. Create container 'web-phys' from bundled OCI image +. Verify container 'web-phys' has started +. Verify host:data can ping 10.0.0.2 +. Verify container 'web-phys' is reachable on http://10.0.0.2:91 <<< diff --git a/test/case/infix_containers/container_phys/test.py b/test/case/infix_containers/container_phys/test.py index d8c6d42a..63001e54 100755 --- a/test/case/infix_containers/container_phys/test.py +++ b/test/case/infix_containers/container_phys/test.py @@ -20,14 +20,14 @@ with infamy.Test() as test: OURIP = "10.0.0.1" URL = f"http://{DUTIP}:91/index.html" - with test.step("Initialize"): + with test.step("Set up topology and attach to target DUT"): env = infamy.Env() target = env.attach("target", "mgmt") if not target.has_model("infix-containers"): test.skip() - with test.step(f"Create {NAME} container from bundled OCI image"): + with test.step("Create container 'web-phys' from bundled OCI image"): _, ifname = env.ltop.xlate("target", "data") target.put_config_dict("ietf-interfaces", { @@ -63,18 +63,19 @@ with infamy.Test() as test: } }) - with test.step(f"Verify {NAME} container has started"): + with test.step("Verify container 'web-phys' has started"): c = infamy.Container(target) until(lambda: c.running(NAME), attempts=10) - with test.step(f"Verify {NAME} container responds"): - _, hport = env.ltop.xlate("host", "data") - url = infamy.Furl(URL) + _, hport = env.ltop.xlate("host", "data") + url = infamy.Furl(URL) - with infamy.IsolatedMacVlan(hport) as ns: - ns.addip(OURIP) + with infamy.IsolatedMacVlan(hport) as ns: + ns.addip(OURIP) + with test.step("Verify host:data can ping 10.0.0.2"): ns.must_reach(DUTIP) + with test.step("Verify container 'web-phys' is reachable on http://10.0.0.2:91"): until(lambda: url.nscheck(ns, "It works"), attempts=10) test.succeed() diff --git a/test/case/infix_containers/container_phys/topology.png b/test/case/infix_containers/container_phys/topology.png index c5eff8f6908929e55be5d77096c1acbc69eed2ea..8b93e191dbb919e47cfdf7c625566c56f9540c6f 100644 GIT binary patch literal 6924 zcma)Bby!q=w;dE^L?i@3KpG_lDQN~lS{X_~@|8|eL|Q^XTDl}g8bRfyrIC;>3F#b4 zIwS}9Hs5pqy3hUN9vcsFzr|M`SmwOVgpu8YQ>yj<^ZPBkHfL+`%IWj%Ry=@KEgvgQr;a)m8?3N>PX zR@+`?(OT5x8>d>OP(0?KP26dFXY~&D@ju(9+lGRLI-w8+;)blY)1~tR4n`Cn0-+`s zfq^%<%&lnHX+?^;W__dJyISiMFeA)mcE;H zP#W)?O`rw`2eUFWcimzs3jRIc)J96xyklZwDl5gzeqTU58R+eeh>BvSAdEGLOy%U^ zseLu~zQ`ucqq({HcYzVxhI%}=<4lA9WL{4IzeV@00X9Qqn7pRb4TPFi4jMDm*Qf4u z*Nv5xHM63kg2cn{FR3R(tNW*uD+q))=Q|ue0wI0lfhT17Q}F-39gUc{I5#)9RB>n3 zATk7kfhtXHX?ah!<&%i+2rJ8NKlW|F*iSdQC^<)NRip(Ux%*4Acb$jHfA(0+sY+S*T_&X(>H5)w*CO1>I~ixn8v8H(~& zp}ldtDCWq(E_3oESO?e+wnC_QH!sqM3%{CeYHwGrcHNq7t~)!~u)QzN$SB>7M0ig& znHOVFUY=*CZ~b~pZGOwh%91chg_0_x(FJ*VG-8hIGM0Vma&2vG-*NLD@hdAUBer|> zJ{RXh)t)}x8?&#QY54l}Yg0h|QeTGq->f~+2+XO1rltTdFA0;Dt}YE3S)s#xd&TR; zSy?A1r-L8g45~P}xKJm%{as1IBs79c+w&a+B=oBq_y}oU8*6JZuTzPnt`8w0D$2@Y z&g#lPU!yE)SsbnGbO;K1+u!r1| zf19*?n4y1k(9OZbgy)sCyR}7q?;pgxv*-xfEjqfsvHZ!_*4zMXNk(bUKNoo7$9j9G zS64%$$rtA4WU*}i{e1Uq+)T!`{w`c>CYUxc&$Kb!I@LhV82ur-b}gvo=;#QUwzucx zM|xT@+0zrwz5!orLl?1lli(k1ym_FYKp3{_3JH~#lmu=^QI)PDr!V>(vvF+ZQ35=Qrh0qTWM$`m_!0ohbq;6Y0B%0-V^N8f zSI;#fqSfcO5J#z@p`lF;3}nhnPWa<<-NVBNrzgh%sm1`3mg6kL0ev;jLpb z>zx&WzA+~>G&J0l`DJBJ8r!=a`KxlAiOeAu+|yMRo_Lkh*onMeC- zU|^u6v=q(^ne$Hd#j*OQq@;ZKpsK7K92*-O5D<`)!`AoQab@T$GVQKjSwd1$IIVDZ zclU>b?%Njl2yf+QrPi@NJ`b#|^AZzB{H~C9c6Eu1i&s&#kBn4&`_?@^KHk;U)!#30 z|Nhg$Cu{bMD5bQoU+EYadQAB-60X}T1$9Luw#K`^La7C=U%&47<_#dbqrE*_HKo#N zP1i3XJ3BiW$^<7+o0Wy7vAsRGaR%xb(Jhh9;X)I|+4Q&;$lG0RZe3m77n9X(=EV$> zZo7DY#=@nKqaA^E#7N|K=M8#H4^>Drwoj!a?ylay|NNM!a{jx!D<69E6}FYkuXp-~ z?|FungtQ9`o97}RDcjrIa4UUdX~7Q_^eIFB9&F83Id2g9H}qvFOjS9PMDkd>GXFzN zOblzWzcFQRWknYB@ZRa?fXZkL4J~cm;X;y9^qt3v{BkolH0VZ0N9TTqMUU56^rQlN z#YIJ#{8A;|omPkWgoK2ssHhI1+PPihE4UdZ&mw<^O!h{hpC3MeyU?VC+0U@fv*z`p zs$WEYem;&2X>D!2X{M!KxpQo2Vq)^>Q74oO3PW1LNJR=dy2qX3>CAhpBPKv$2dp9i zK>!*^4nadI?(^}fJJlc%6HtQ9Ei5cvyjWjdwKX?)f@(y@B7bmv%vEKmp{1>@prEk0 zxX4w-T*RIi#W``xdOgV4*jVc>YHhf%vA!O%MR4QB4L}ML6Vt0#uiC#+AU+*G{ibha zW20weWTd6lH1ks5z@WIOsIu>L;A&oez6pFCh2qGJ>OCDWOS*4INJ8R;JKzg%DK0GJ zyLV5`DGY&-oQ1VtS<%zh);2OiIWDP*;lv@=uJ9-@0{+eX*>(+``;k>g`cXncdvJ7 zD31Nv)2B}j4JXIPZEbA43yBI&So91|bU z;>XOwLdC5k-Beg!?sak`q`m-EImXqSl3QnUp^G-X9;)yb{!@Hs=l$+(RgZy@k!RL+ zjSUTxdXj}Yw@A-7Mzqq608*&f$wfAJ-kc2~`7@`545ic4|Jd8xkC>T;9@e~^xxljn zct(LtVr3o0-mZ<7#;BPC4xF6!*C&9gKbtKDX^6oc_`Z7=*bf8-IMe#|0*ZqAqobl) zF>8V}b|*)Fx3!B@He~lVFgym8yAWzDm-esa-C~QL$;vle92{27!8ed;0QoKqs;;JH z0>o=#qUQ5wj@!3yi;B7q49%iaq-p(DU-0Uu!u;4YR>V|5%AZcVjRlC@bEC7$xn~d!^Lf_BAeE>Je7U) z#mhu4d#luw(Md@mq+kacl3Wg>4|f(r9x_+6p->q4jKq&0uRkCnBKrA(PKDTg?&mch zY3WH{g;&Q12i4`u6fe*4r7^z?)-lMl)BQR!ndAM9cnP4PwxOY+n%c|VrM?t#XL&if zyU&X7nMz!D%pLdy1OzVo&TMR;akIB62pOb2*eOF^QC2vu(M+DTFnCQnQO};X4GzZ2 zXBgDD#Rk6jQYBB#pYd=E?cvS0v6ei65q{{W?Tb5>KOa}y}YHRrMfzqSsj*{k&ccI z$i$Rwo72BMG&EEIlyKgdOyD!QgH8?I7q}UETP1Fq_PWQ@=g(&#zuPY{VYWMS=R7nVpS6Wl^b>sVMwD)aELz+P_#hur8cXm2DI#}LY zXO!;@I){gZbo>mXt$JG-%orEob&5MALE$!YP$xmdz6O0omPlu}GwoaE-cPnDG)Jp?5rsoT#BuTXd|y#&%MCvJ6X#Onb93q(pDbp9mG7 zjL_d@2g=F%`nqEJn811+o6v##7)FOXE;W_j@M3uHuV338ymhV5l&D#!0!X4Te^yrB zI69KbKyXGLTg_0Fwn$R?`ue^j*56y2nU%hrX@I38ARw3vVdLYA+}3xI{{kG8hfPk- z%+$1XN9cY_$#vJ6%_36>||isNJzrZ>Dod@M)u*u zhp0u)%uXKz@$qqSLsO@F!lGOwS^G1-Shhl)a%ls?d$Ui z2ifXQ;Pdq$QOxLD=uS~N{CSr$#0$5ju$^M>MSo^$VWH4{4OB=D30`Za>#JTlF}*~B zLuGn9Df^pxkld9&e++9qlqTCu`Rh*h^o)0KhdWA2N|BL~5ttZuZtl=z%qDuh38kZ| zN-UFGR21bAoZeniQW7Ej*24p|S=tud6dM~`2ao2HC#9YzZsUAkP>T>}=-BF&rrvab zWy-jlsfmeid`dJ5b;Z8{n0%e=Ju%(UTKN>SAFwWnAKL0{A_Jj&_e319fyuF}zm9uT z_SneDqjPg}!AV9szZfeE8z03kE^2FPMkgjd)6>h($e07fEiEbDdZMk})83x<`Ev!x z!`rtfV9}sXvcHjk@4B-fDk6eiSeQNh^BhN>mYb_6E9uQM>*@Tt1g{l><|pj3AXN3oO6L;;Y1CL9?Rui-;vB)Nu~T0~u)7r0e` z%uS;A0D0(2%(fY+V^^bIEU+0jFulVngr}u3xw03rf;DTa5M~X#$!FXYNM`WGWNIHG zeBgVTEa_l$;iU++Iz5-4pMsK7S#>WmK7Mh2Uar&aIyH5L*O_O95%tn-UZdKFNHVXt zv*w|A_vAU1%>cIkhw+oWd)^>*C-jp2| z7l*ZY>mK_VG9pql_^?J^?o*9-02#S0gp55y87-NK4a{ZC=M0i?e^^&M=$ zZMH$y_|Lhy(>sTfxJ;J0okKyIux+oa_w4OApnLeHU*Q0)2QV2XH7{PgX#e@+! zo=2ePkzO0BN=i)h&}0^sln9E6>7M?)yE!8Qg`HkP1chP{-qF(1T3T9Cd(Xp>N8|+Z z16~pg>~;484=LXtj0GjE&&+?{dc<$Z}3k)1Cvm47*&v-FaJFz2-rv{0gANr~X zx+X#21Fol|Lj`#8-!S`@R#z#I_)Xb0H8lYNEp5?k5Uml=7Od##9`%gaS8~YkcAMRLLT7JrCi$e}2?lr40Xc+0P2Sh9cE-jI)Ae`~j}n$v!F6b8YFc!C6oUQ>fbjbD4v2w- zC+;RgtOdX82-)OSCdc*h3Wad`nLVXD(G`x%8nc#$1ggC?{Xg*8#70@?YeaQ_~Dbln}9g!h_xIou_C(ctC|D-aE;qv!VTP9 zILhPg+W;_Bj!V5zn#eCoq-SI}uMVfx^Fz}B>c>ra_00WW9d2-MKGOffuNyyIa*k!H z3ts=rYj15$NKAa6pa0k3;I%7PtX{m3M@9y$QczLx8dMI9j_PV^_P4gSwzLG?%;1c( zuV5GFUw1B-KW*@**uX^8*D2mi-5Q!XlAVpMrL}dbYNNJsLPu6c1}2)bv$KKxPzdbo?7#qpP~M$=DbgfZ?^0ha z;YJUWQF7E7PC$m8iRn2su}CH~y5}MRF_h#0{RLn#%s?i~?DR}bSo$9R&I&16B=gQZ zO~Qa78yg#Adz2tef4B;xziu=XO{fNi*ouRs7`X5Z4E?Y?FA<1PiPAEnH*ekm*|3K; z`uh5<;ykHc#4BwV;Gp?!LMzMSIDj} zNVnm`w1%6~2H*|tE`)$&8XtJ*LzT)HXR#^|NhdJ2vf>~`Zl+HrV9mZ|XFFkABO_T9 zW(PDN^`YOHr-SmQ-XwOA<2gP#>q0~8e6+g^dZAzI;c91hH@rps&7T2adz%?Vr>vqP zz|Rk}n~CA!n+yzf?)xv=)LaS+po@g$1fO}K=|x#u5hweI2<2|qTh%o+WHO+8AhIxK zw!ME0elb%&QzmT_v|OJjzGW^eC#NSxT-!m7GeuQcP>`FG69)HpNLZp#7nbs15lCgA z{TS%$69s5wWo6aYo<`kP!QpVNmtdHD=uulxP*7F|U5*vlzR^;f+jGM}2^}4v2MO){ zP}Q7%OTqMJ#q(h_33jIk#UNy@bg-S64%GK}|!$ zpV%1@LE4Vr%T2k`9?M03=TUE8AB@mW;5X38B1}R9uv(Nn`XVo+ayx&Ff{-rr zI$1Fyx-2_Vx)jNVPKBQApxOq=R&k z-n;Z7(mMg(`kVLXn|U8Ie3?mdzk7Gjo;_z1r2IsN^326E2n2#sPF6|2*gD}IVnjs=Y+pwE?TNh2lv+GwB*lm1`_-61pD~N zN3s>l*Pn_|PyQwK)vSIu_VWus?&e)%m21x^3VK>Prw1PW=oowa` z+%}LKbZ~Pa-9L>$c#EoBp18`xv$r#1ZPZ84-oG+do|~I%GU34Uj6W(9q!G;xcpYQP<=7_QXrMJ0a11*_tW0*3mrl!8!2=Z;Xh` z#^q4yD2HqQmv7!&n{ACV{Jr}saP3fn@6DzX?0JUv|2lyWffRv|V3qVdm-6L{Z<{ez z*iPD?7J*o0WDRdJE^4WBs-gM!=C^M#b(3d}es^_pArRyI#BaRoCPkgsB>E{Yh_H(j zArKKV295J!I@S|ax>fGN=!|dQ7&z>g2Md1vQmD9!LN(Ub5>2cuEZlS5GL@7hifS1x zFeLXw2L%QWmfEGq#l=O#LsN`f-g7^H{+##?yNHO};m%+A*y}+dA?^oTi*s%9x){uB z7BMXL{d?Q}joGTIs&Mh+!KS7r2u*D*2MQ(q2{}@1nVpeQW4_2hPoF+jpl5csQDy_wQ;f@j5wja!;wO9BXV$OHL-9c;IzRVAON3oqSzUS(zGw zKrksXQ_VNLV^mjHN8&EswIU@a_u3tELgIe?`jxJPUHbEf%a?F;q^hcFb0iL{Iyu>(G30{V&hke=v+h*+I4U+V(a%VP_tXB-QTLr?ZK{B%h=>S? z04!NiQL(q@OchY%d2|39>g`n{drN!ag0M+@LSdmmg6Eg;hz}o{XKh_X$6=}5oSZ;y z^X;uI>7#F9S0k{;=u{P(rV2csn&YLZsq9wI>CDVbUS8e-ydGA-=nT5Kt}Z1tmHWX1 z-2)_vfXnd7p`S>}_Op3qAH+@6onxynB0UEXKUh%i;CoBWwiPVXkXkBVBamebVKbZ~IMP20Zbx~`RvINHy}-m{sasowTR?3*Emhlej-x&%S9 zvHgM3)eRyDE}LF-ZL|IskF8?C?I9{UPy(nYi`D1Rd$NgXX($`FAHJuNxV$_*Um7vY z>g1$kuakoV!%wC6T;8HEYscWaB?_r8coN^&w8 zt&F6kq@v>A$-01hR804ql?*<7`qXXu6)v-$G~s*q0NPVNUHsLAa~$-vw6z8WzuMXq z6%~U{Fe=grL~~58PRT1%)0Zz_E-Wr;YiZ?c<&2My*ZLKH{hE`VZCIe?=;&x6bhyx! zQa94OPPP%n^y<~Cpr9c8`;}>FbN#tG%v1qPl`}Il(FqB^^lt*pfwJQGbT3}K7)+z0 zp%E)UjF8A%SXjW6+8PaiH3QDuT^Z}??hXzQm*LcVWyUP#?))?QD*kz8na80}K%EO= zZyov7i5ZA!%5pHjc4VZyu&}VGNR^!?LWbXRyuxLy%z>Is?4`g*pud8G0wk^_>WVxY z5#r{nJiY3$CJtcPnYp<_t?OI!%8#bd7<2PKSCo=O-S;AzrrSQ=PA@Dx7g^QYEmZ@B z02G^@mG!*RwPAkq1)+zA5+#1;&K(wUPxr3mM`2-Mb>r;&xU@85D=WTdo@>8rZ|D?X z$9$*Z=Z`1z)KTSe zNP{jeF7B3L=i%Y0!FEjwe3*8FB;2}n>#o%((@sBfa&y0{tE;|(%XaE_?c1`lvLfR) zf!nv^Zy7dDH-+D|82p@)!u7|I2tl?u)$lGYE$#aG*6wZ7U#CSH!SvbaY(S`-|E5s_xECfaz1{4%XJz`uh54v`@~ZQwXMt zhzJ@wx~PMLgXHAo{(cP|oe?NiswqMbPexu|SWr;p2|@6BsPCo{$fc6Ge+5Q6^q z?_X(YX~=Y;6)i$vcJ#jsiU~lly}iAD0mW|juuW-bXvoOOh|O~kS5mS|&gL#L-rL>1 z(W4~Z*Wcg0XfGlna{KmeT$7`N1AGi7oqLtLB< z&o(nXy}2>l+S}X9a7`n^3#+4}gV!zBP*r`H(siEyxq?Cup9fbeH+$`$NQwhh4Gn*q z;E)hZi4_a2$uVL7!Gi}UeO0Bv@nM^ z#;rF=iQkm`cM0B^WkxSR7bvtk1sZ}s&mSM|fj>n``u+QN**vZnzgA1_=3gfQq}{i= zWM&lAc<%@bs_{ev1Tr(tjEvxfLV40S<<~T<;q&wJGNK6$1^{Sg4thpL8BtMgZa>1v z6P&W+%IH-OF7hq0vsEYX-Qy-UFJE6@<;>ombft-EFL7?}*(fD3NhB(8c%*+h9z}}1SrunFwmlbV1YsA zHun#AS3xhJB9Se^%m_r|=|_(qiDo}?aM%VQ#of>`HZ**Dm-gsAKp(#CN5S|^Tl*GM zh$jBIZmBIdA76VzgP&GVWd4gfvipfElasid9QUJxZHNN9?>Ra;rNsNG$;pMT+e>m$ zDBW^L%H05@u&^)@5s?~iA8fh4{!4D|4KA)}ATqo8_OY*KQG%h&Otys=l~3e!bt`c= zqBtNic3%R4u%=rUHUD7GN1?B^Mckh-+mdMCHdv-CB zrO6+NZEbB$*luols7S_C)yZi$l1s*FqDnEP%iZ05&0up?z&3{a?m3RFwaL2t{Cr?= zsGcNImkrQ-5LADEe*hc`o5T(B&CBZqLIso|>p5;C+rCTA7dNshBYORiB=JdH=kMJH zDD42&%YuSmGcp1j3;-@>=H}OUd8=HvdBwz@+dp=&w6w&1cm<2OnV4LOYGFReX20a_`QzQ^K);TpO6PT-ggPKb8gxB{vW5l~ zq=SNj4oM102c^2Xw$|L%#_j(qMSMP+jrrQO?0<+on6&lLVm$_ODtG(~eW`AKzS-5) zm6@5Dl(-fIBIHxZYE(-@!|`_wQ2~)mUg3t38iCVM?p2#%pTy*QXjlF&dTFbt%kI-s+jucy=dl}`o3v=G=RxKI>VBe_(+Y+)JYdz)$!TO{ge$T&X?@$x;O(y4 zam(=Vrqw28}R8kC>JmIqVhJ{RbCGr{3Z)pXElb#-+l#KeOZ#S-ku)2C}0 zT;1Ff6B8*ZDUS#QPEJl@5|VWWSKw5}Ge!mmaN_FkWo6*~?%uzD|JpV4%NMWDU%!4G zVlCvbq*kD#s-iMzA=GtEuiP2E^D}w>SD!I;Cs;TTtt)hPry>1RW|W6O4|d zS^a;R9)xB9AzCw&g&NvGL9&j;$lax-$>Lfm&z`Mt-OifHpN=4`QUj?SdDiEPpACzR z)sU5yH87Y8qPz0CB|+Hkb@hC6Bv)(f4K7cI(2x)VL&Fvmg@bQEL_nI5oat&7Xjpn4 z+kIEC?r6;3Z_u;v-=Dj9(RF?5(bQ9@WON57E|Nsx1K~?b3LOK(H{f2|NjPweNxZ12 zXwn0>Sm=H_I`S!9%YXkeUe{V1DB|S>UAa9}WC9eGhsR?@T?#`(LkBNh=+DtMG&YWn zih4Vr9k8y1Uh8^+OKExb>=~LoQl_j>u)C*6{CLl>ARcT8GYd=5L<%TTXf5vUJ23&W zR=ec5aHiVho1{?N=KVQWd3k>{2?b4ffPe$10+cvB{EUQz1X?kWe?|rm4%;?X?nI}# zavG6h>F8rR?u_!uFG|mT$#ipm5JbBU%5K~uE3keAUFn7*Kp1UZ_{`Qwr zz3)R(gWoqKRaK)z>9u>oRY=W`(-;8{SXhYG2!$~^2Y%=@N`$Q%Fd|q=e;$FG;Nj(c zEGI`hrlzK5f4F0rj1B!Kj7GoPOov>!O|~vIo#4Jgoy>M?nfl>NYwPfi8>e5~WHKMf z<6eOS1RrYvl625B6&0eK_plvJjNHh!Cr$b{0sLfRvWvBZe6OgF9~W0vSQ!~h44bI5 zOCIs=xi+t?SlPaCaw_SZQQ^`p)w^)v0t$S-v^07ay3d<8Zvv=TIOmM6f|Tg!U}UKy z`oa-#_;x`iLw1d&Nr*C3;=4SPF_3M+vi|P zyW84s2nt5?gaidm+LnSOG%6YbQ`H#y&&%#Ps;c&|C%IxGOO7O$WkUSTyi6@EW7c}> z05suf+}UX+#r?0&>r+66m$|uFgl%Vzj}GBr2IZwGBnL{XcX?yVEQSgpT*+S`Mky(E zLqjft*W~-VyKVpU-@p;Z1_u|GmdalBWi>a;+U^hNc_~)CG@YpOn4O*7WAf|t{UH&J z`AfZe5Ex+Y#WYJ0e1fTR--m|)c|hzSj9}fNx&+KA_YLf>Hi@@XONM*>sLOAT+J0>K zI!aNF&V^p-Yg*^_o0C;rV;3>f=B(Hiy>4$i^GP;bjU3Rap`zC(Ym7ppkLyk7>%TgzC z?fsli@^`?yQ9SfT@@k!PhZ5)s2&g*5u&Ybhej!5H6MR5xbMtE_r-6Y1O$`m>0xi%l zU;t}%Qa>s@xApa;-8UO5G@_!S0?go&yEq#3q z93YRy&csag$$}n%PEFhQDLx)tB3vx8Tie^Pw4CQtn9;yOQ7Av>rw;_L<;>Of2x)Zw}#5NZFwKpbWx=~<=g9rOZ-u=m+V;CMj&&9u;g00&zg z_=n4Cyh2VPMz*uFGb1bO6KJD91NcYytorsuk$`km6fLVvEQ>nC$J{pY;V~=W}oCr>sf^K2?`07m6kdX#+obIJOvqA(Kta~|whve)~)ewdgJ zeEtf#+!XF6Pb>IIS1$yI*-f6Yl-TN^3~A^@h^*?|uC(B)j%s@#Q1-Oj`6Drgko z0J!HcMAM@;SEyBXuwkqZf@wa9dmV#UfjJ7KWxe;(%yE>TUjuXuV0&odAoKX1S7ZQx z+Vd!FtUoa0tf1J!=1*eurahYGH;amjt~^QDtD_eGT^#`I0z(ZLYq2j44h`9qj;6?j z9~>T*6c?X6(OSopbThg7?y|hC)h`+XQy0OQQY}u{>QO@CW@cW(!+mMu+r;b_XvFH# zFzl*-Lqfh*QR3m@@%^=gUN=q#k=$tQ`3h#lOG}0M`Rr`v`Gtj?^XZVY;3uWN$IRJ0 zp*WenmGV{nXfi}{v#Pngw~5OYHs)gZm?j(`|La$1?ewmnxBgqrAasJ@E0;v>d2)ON z!>s^nww;ZQAAd5Vy zEv~FQg3|e?x|n4h**5)lItZ44I(yR9M5E_SPn0dGNL{f7a8}>ype=33?@5Iweue!xfG~hf+YEIkU00#;%E^qFPyAwzsqU2hYB~ zu_}-9PQe==f`VG2ud2f7K&WJ>@%o`T+L`1oz@!Q-WH~GdlUtZI++uaEy%;Z>EJr_DTxVX5~)%&!IjE~mpsKE*++tAa~3kV2+rdYHu>qK3J z@w_xLX}))2LJ!*elXP-2vNJbatSl`(_BV_G0vAKmva=6|Ot3(*L6i)aE|q&8xk91g zHv79}5F`S5P4hp+4czl`E)jc=mfFq+3r^e3vW0XsNKFLTjCsM&H0&k+JMfRdg7IwT zYW{zJT?qPEO#t_oG7&bZuBR8?SWiKOkae8=aSHqj{Qe;eR<4sT2O&PWb<|ovst|Q)Enf UG|w~3;iCw-M^B{k(E2|A1O94oPyhe` diff --git a/test/case/infix_containers/container_veth/Readme.adoc b/test/case/infix_containers/container_veth/Readme.adoc index ba61cdbf..8fb69568 100644 --- a/test/case/infix_containers/container_veth/Readme.adoc +++ b/test/case/infix_containers/container_veth/Readme.adoc @@ -3,6 +3,16 @@ Verify connectivity with a simple web server container from behind a regular bridge, a VETH pair connects the container to the bridge. +.... + .-------------. .---------------. .--------. + | | tgt |---------| mgmt | | | web- | + | host | data |---------| data | target | | server | + '-------------' '---------------' '--------' + | / + br0 / + `----- veth0 -----' +.... + ==== Topology ifdef::topdoc[] image::../../test/case/infix_containers/container_veth/topology.png[Container with VETH pair topology] @@ -16,7 +26,11 @@ image::topology.png[Container with VETH pair topology] endif::testgroup[] endif::topdoc[] ==== Test sequence -. Initialize +. Set up topology and attach to target DUT +. Create 'web-br0-veth' container from bundled OCI image +. Verify container 'web-br0-veth' has started +. Verify basic DUT connectivity, host:data can ping DUT 10.0.0.2 +. Verify container 'web-br0-veth' is reachable on http://10.0.0.2:91 <<< diff --git a/test/case/infix_containers/container_veth/test.py b/test/case/infix_containers/container_veth/test.py index 323d6371..09600be8 100755 --- a/test/case/infix_containers/container_veth/test.py +++ b/test/case/infix_containers/container_veth/test.py @@ -3,11 +3,22 @@ # Verify connectivity with a simple web server container from behind a # regular bridge, a VETH pair connects the container to the bridge. # -""" +r""" Container with VETH pair Verify connectivity with a simple web server container from behind a regular bridge, a VETH pair connects the container to the bridge. + +.... + .-------------. .---------------. .--------. + | | tgt |---------| mgmt | | | web- | + | host | data |---------| data | target | | server | + '-------------' '---------------' '--------' + | / + br0 / + `----- veth0 -----' +.... + """ import base64 import infamy @@ -20,14 +31,14 @@ with infamy.Test() as test: OURIP = "10.0.0.1" URL = f"http://{DUTIP}:91/index.html" - with test.step("Initialize"): + with test.step("Set up topology and attach to target DUT"): env = infamy.Env() target = env.attach("target", "mgmt") if not target.has_model("infix-containers"): test.skip() - with test.step(f"Create {NAME} container from bundled OCI image"): + with test.step("Create 'web-br0-veth' container from bundled OCI image"): _, ifname = env.ltop.xlate("target", "data") target.put_config_dict("ietf-interfaces", { "interfaces": { @@ -86,18 +97,18 @@ with infamy.Test() as test: } }) - with test.step(f"Verify {NAME} container has started"): + with test.step("Verify container 'web-br0-veth' has started"): c = infamy.Container(target) until(lambda: c.running(NAME), attempts=10) - with test.step(f"Verify {NAME} container responds"): - _, hport = env.ltop.xlate("host", "data") - url = infamy.Furl(URL) + _, hport = env.ltop.xlate("host", "data") + url = infamy.Furl(URL) - with infamy.IsolatedMacVlan(hport) as ns: - ns.addip(OURIP) + with infamy.IsolatedMacVlan(hport) as ns: + ns.addip(OURIP) + with test.step("Verify basic DUT connectivity, host:data can ping DUT 10.0.0.2"): ns.must_reach(DUTIP) - + with test.step("Verify container 'web-br0-veth' is reachable on http://10.0.0.2:91"): until(lambda: url.nscheck(ns, "It works"), attempts=10) test.succeed() diff --git a/test/case/infix_containers/container_veth/topology.png b/test/case/infix_containers/container_veth/topology.png index c5eff8f6908929e55be5d77096c1acbc69eed2ea..8b93e191dbb919e47cfdf7c625566c56f9540c6f 100644 GIT binary patch literal 6924 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 UG|w~3;iCw-M^B{k(E2|A1O94oPyhe`