From e5de5f501af2051d92623f6cdf372f1ae2660d79 Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 26 Jan 2025 00:58:44 -0500 Subject: [PATCH 01/29] added in validation for input files and permissions while creating directory --- Base.txt | 38 ++++++++++++++++++++++++++++++++++++++ dump.rdb | Bin 0 -> 132168 bytes vmms/ec2SSH.py | 7 ++++++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 Base.txt create mode 100644 dump.rdb diff --git a/Base.txt b/Base.txt new file mode 100644 index 00000000..61ae5ec0 --- /dev/null +++ b/Base.txt @@ -0,0 +1,38 @@ +# Autolab - autograding docker image + +FROM ubuntu:22.04 +MAINTAINER Carnegie Mellon University + +# prevent installing ssh and gnupg as dependencies of build-essential +COPY apt-preferences /etc/apt/preferences.d/00autolab-ignores + +# clean up apt cache/metadata so it doesn't use space in the image +RUN apt-get update && apt-get upgrade -y &&\ + apt-get install -y \ + build-essential wget sudo git \ + python2 python3 \ + # 15-462 + nodejs \ + # 15-213 and general purpose tools + llvm clang clang-format &&\ + apt-get clean && rm -rf /var/lib/apt/lists + +# Install autodriver +# Autodriver makefile uses sudo, remove it afterwards in case it's unsafe +WORKDIR /home +RUN useradd autolab && useradd autograde +RUN mkdir autolab autograde output &&\ + chown autolab:autolab autolab output &&\ + chown autograde:autograde autograde +RUN git clone https://github.com/autolab/Tango.git &&\ + cd Tango/autodriver &&\ + make clean && make &&\ + install -c -o root -g root -m 4755 autodriver /usr/bin/autodriver &&\ + rm -rf /home/Tango +RUN env SUDO_FORCE_REMOVE=yes dpkg -P sudo + +WORKDIR /tmp +RUN wget -q https://c0.cs.cmu.edu/downloads/cc0-debian.deb && dpkg -i cc0-debian.deb && rm cc0-debian.deb + +# restore default directory requred for autolab interface to work +WORKDIR /home \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..30ec8252acf87bd4c79f411818d43a7db2bfdb49 GIT binary patch literal 132168 zcmeFad3c<6c`p2Fu`Jn>#EFvt&N3s*OPpXwvq`ep^zQq5CnSVXO?bQY#*MTojf*`8e4kb;`W);+{|REV|Gcz z7Mt%nwKNeK7>c&Z!=n?EQ>maSxvO<*_*80XamQS0c5ZO;)bO!L2-~)>{ql)R7Pn8O z=I)-JIkBWHZX2DRiD>Q0VjKKMrf2SrbhNa>-+_TWEvCqFZ znaCw=W7DUGC#MF71|!LBsnOWrE;uWbQAmvj_nv2JvDzMH8ww(7(9P%$Ki?LsjZxB8L`k#dZffBQ5hI6W2XF+cFVZJQ`eo1{;nn?Kn0wJeE2v51&Yl4}7g< zV((&mfQ5oq3rhqCt)b6FRP2%f8y~uS`}|01amV!hT&J|~mzWn^?=8gBSH`fxp!s;) zJ#$MFp~V~1t@os{TRX?o?e|@^wAe8*cq^UcHG?wFXKo$HTx zcX!{s@Kn?6%|WY!-MsgQ?Wx(>Q>m%B*_)sFopjUf;lZ)#snom1hVM$fL!>RyP%T!` zO-A-S*`-esYO9 zd0%Qtz|LKUEnYS_v;XtWb17;6A7Jo{ZChFlp@-Oc5}PIN-v7tV!=s~JceIG9dwKdP ztRuiK-Tw*r&p)*ekDN>?|M%|g@1Ju%y#mdDO zo2>d`_f~(g(JC+Y+4Plfxw1bRI~vKo*woT+_D!U*XUg70*Q4l7bj@IMk>AU|iG91U z*#WZaLG&g%4`tp2IhT18U3X)bc6~PcCO-VV%$s-^-o*Kb8uUZ<55KGrS-k97G{A>U zw{XvKS)X%6Tx4~Zp(Nc7ySB{pq@uVCEwF?pXcR;9BJEkUZcrU1}f&Kk=6A56u6>zi*L$RQpeSQ}!oT{DjO8zGAiiwW)b|;5+zJ zp{JTKtQiZw4!@dZY@u?O4WV5&x0~jFt2Zp>Hq`uYtG)31itI+4>h6iQ@=Y~08)EwyBPnZ>sm@H`O2IKJcH)Y^tsBN1*8&!KYrt{yy0GV$(O^AMzM%9%xw~ICFk- znQGyVpt--Ry;0_Vw5``Z(9aT z-+A@Ic*(y0U~c+fKbYFiav#$?hH+Qv_O#h!sH_evr>zYH58sVy&xNARK>m??Wr>TFQ>!% zVa(}H=0UTo1Dg!C9czsx`@5qH$8!66S9{QVvbe858nm21`}zqC@4Sk7Ptfz7vVHyE zGW$A=IX`^vDeR$O*L(M0n~vF;ef>;!Uw;@o6YP38*!^^IUr+oT_I23eA4>J*_Vr&K z_;Qe#MEm+jGW$CIbL@D~KGziMK6^Z!ysI^JPil02|7U_$*vo^ClTUsZQ^&p$$S-5> z3|i(RFGZTq&9|8Iqoeyqu>O%dwvEjIKF@T1y?Jha=HLUDMW&`_P7R+tdGAt|1X%bG zJyW*u93;`gbFdqm+efqj2{5+z($4;-+5WC?9(+4CJT#nHci32F-8q=VE+7gHRQU(x|~5;o-0W>L(!7Y@Jd+oZH{y~Qsq=q zwnW^ab=d-1&rw-Vw|qHdPz*=V`uf+Mor``R2ckzK%~$oqvrZ;UaG->?+tJ?}&7;8H z?_swG+iq=*C;F2|7jDh7c7GGxG*m=^dxMriphDp+QL4iB7C@_!R8SI)5c7MEx0ylgeP+&aRH9Ph-$_z}o-?xIG93E_;K|1Kx$_fws&%fX0DqSBwJ(O2>g^G!9&~kSZAm z&g8~{_rf^v#ENm?yXzVU92f^ivg5$@Z%5<6Ty7jlq+6%cSgP}M`ilR&+BookO2>gO zWyXOa7zbKP#(_UdH{Dq}4k#o%Z;cf_nleq@kQtA3>9DLQGD#>r=hB`jX*xwJGObXK zA+eH$J5ES;C|%GaUf9`2M(_o2hQ(Y9Ib?bL^T+=e%}sw@p%~NYK8Z- zE!7&2^(VU*Qu$$^B}g7G!oVZ&zz_^f!Z2_-^-z%bW*H3pI1dBgd+tf})qiyV?sT`B zfr0z8Fz^s|KYaFs-JdPOKlxzjv7r7O{6|X*9LG);qt)TrR7AxBeW;T2;m_S&dFO&bl z?MD;Ao`#wT>WBr2Si@t1Lg}8V$^>ip0wGF_scXIv_9zE;WS4gt-gY$C6+}kSe2Vko z(61N_9dapO5Hz*|3;MeAv}y$wjO9my!bLwCFBu7n7ya=59sPZU)u5{#KD*n-TVvh* zvEGI8{7kSt=s8iG3EmyF9FH7>cXk|xg5A`+gXFi%hJt^|U-Vyo?)R|=gI(|0|CV&r z$P5J!WQT$U?15m{La_UD#i1bn3Je9XF+7-x=Z1n`8F)U3PoSaTiR@7D3eXqrvrUPf zv#E4qHa8M{GH5*k`hboTPmaSt@RdLc&_FOZ%AB9e&I7l=JmBZ&ffq9Kz+B}#aE?A+ zJ`cPtGY{MV^FTklfA5aYK9~nyD4homW#@sn!aQ&?HxK+qW**QH23)y?0Xa?2y61sJ zZ^L7NN6C!iI0Anc^Im=} zD6)io1&u%%2JBocU_gN#Nc5FpK!F`V5CD3goI)T20d3Dq=Paw?-ql((CZ z6oqD0n`I=Q@Oj+=#YE(as|1bHb;nZ`QP%`XHY>(}WOS7=pc(`uOUHl}5Rfb`1i2{y zn1Sx(MPdM)3FK*tHJZ{b8K25jgU(1Rf0&4?Uqz*V4*5Rhnm2%u=6ayiHG zHO3V=p45Q;Bg4L-X%46-(!MTka1m28LplO-v;QA0DaJU|Xz?;hC6J_d& zDmwoG_wuH^&VNb9nipG<(*L@w(*Ji>(@#tyb3j4r&x6$eOkP0ocR2yY-xj3)j}(Q& z&z1;>zXZZzkosS-cw5P_0I6FJFtkp{#LsEsj_pyQ#rN&NT~E& za6WS`xE;;~2aD%|bldakriIdbf#67@C+nI>a)xT?3Y-C0CM@%og#!pUw96Hnh)FAzQatQooPx%1dUu~|0~Fg^PC`ROb*AOkg^d zBt$?Eu4D(cjW+{97?~crNP@6#yFnsZbvM{V1fhm7z*#1LzO@-3<@LG=!g%8ogp}-( zk_p;D%at9@GzHpnJs=2q4OG~^M2noOORlBplEEkvui7r|kXFcGd6qJnip`*RHG;4z z29&Y`Wk-UZ!X%JC5=8ssu{C!CP!V2$BCHz(B&$OJ*0YJ|0SAG=Ra=8V%~yh+hGz&F zMIcQLY*U8DE562p1H&@HH1CP7OY6R>_#TjijBI!!ZOX!mHF0_a$ne z2-lzoirWCffY;_qP&Wv8U0eySLKwg_sEW9DwZN-X5jUXw-*QMvWPI8OX#lQC4kbDS z6Sf4L#Z?aELb^SsxUdPlmMUUU4ZX2d z#0)}#TN-p7s2v5?zYaA1p+M#-&k#w^wBdZiCsNg2BRniC4 zFrAP|7!0oPl^{^K4U~z7s&WErfWXRq00{?Q0}!a&LhyP3fm;y>^f#!VsP;)<-F_lu zBxr0ukuUio@)1#mkDsWN7c8iTGJc{$BExIxCxSWP4eclDM<{TlK}UhwQDEKsKnyeijh-@~ zvZU?U9592Hu5z+snVuCUEdg!@jwxz_N>Bzkia63?UCFjYg;!iTq|g>`xt04s@@Ngr zV6yZ?Sbza^Axu z2a{pNKCr5Zpz1zQ3IZ!hf!>uU&_3RjNUR9~-2*S4zrcmCK9s<=*%pv6bXS)TCRfS_ zvEr$N1aSaE_#B~_ zmPj&;t%$6uhh1DIEYr1IN273uaaoJ;70GurPZV6$QK zO4PIFD6o-s!q>rZpci4lz%td;h*LoA$ANWE0q8*3*i(QYlO_q@d{XmeSrUBK;Uy!C z^Da)fI__8?BoJtwF@QBxBwJE_0%QY9h>|psqw=8wCA?taKzMOeK+#E5oC2UE;NqqL zI1RiCUa;fLljenzhME)o(Q`8uK|?SJBv(!XUGIu~|J=sS0s{yK?p>yuxh`ZTdUHL@ zL>tx?Qb!y>qd;ThfZ`~$&+&?G>msMKq(gfo6}C8y5FF zczCsJ5deahp8IGvTjc6mvPHTpvPC{v%ob^zZRrEcbE$dYV}*1PL=8TlPZ#N0n;N{c z(nNHQo+vjF^<_*%`%%6~Hh(k|F+%>u!Duml^k6n(R}w!MG^IU_-Df3jpIs0q9Y##2ij7XCl^sb3E12cdtz~O-ND*<3N>0nj4KxyV+ zQ7&-(KHvtTMUpVj4fL!~4Q(!Nptrv}_PXE(W)Kq0qB!yfM1new0*zlvU|T>4>XZa2 z!xH1D6lXHH8rE6pD3E2G!&$=DIfJ!KUgvF|AO)P4Y&k@byl$HL=)sa>!D^)hH6uas zVpxI%CE}r1g#<7R)Q2Tp6$v0}2*nR>4xX?DH5KoB6gzVMK!e7R){X`1rUqh-Urit> zF6F2wf6x|WNE32&9;gAv0IM+td1Hj8X));0Jqatjd1^G~A0wE+3CqCQI%a6O5MPQ zQUmWo2yjP(`iW{sfUO~5YM#6aOdkXr`|bHIkCk>7zp;F>KEs5x$|8|HwkQn!t5N-0>-_8#)Et zhycLe;sa})0^;a6(AWTA3Ob~WTE0YzF6lBfY5Rs4mNi;|5;9)UTnHReW!h(Phw?lh z!UZ%^cSC>_hAiO~y20MUai9zVs;&a12_q|4fxhBxAioMk;dXeDt3bUN!PQoQm4x7i zLV%4RpaW$LC6R~V#(H=NYA+;-xTss?RO;09%)OD0mP{SVo@^b-Jm9&w3evLMg7t7j6UP5goLG?BgFc{?9NG@BgjpWw~ zZ6s$mK^w`wHQPuO#)N1gNFa43RVOvob96IIIu_5VoT|B$tT{4GfT9rWg`7=NgaTgV z5Eu&tXfw`X!3Ts8T~hzp5IN$1?_k4uk@cEzNMv zgFxeN0u<{S5Fx;ffEfKhD;vB=08cx|1%ljdhbSRdt zG6)nNf7u{V<6&^+Dgf!@ef`nRDH>koFbJza@5*eEda(iP>?w{Q3e3 z*PuqSJ*bgveAmF}sre(RvH8K+;K=0M?2*w<3mc1EyC7q2=XPg%$Oh4uzc09M zb}o7)Wn|4Q{oRTFNc*M5GP0a9;FnE~pUm`--JR_r zyC1td*mZxf=TC|~WCve@9)x@ipuHm z(>L6nD?ao{)zdm&cE)AKu7t1Dq#Yd4`vL62cEz#J@EaUfv_d>{STqH ze^Y}pf%OyyAz46U69GW>2?Bi9c}KK7mlFxf!|5eGHn@- ze~Rl#M3_=NUEl-|3-N?3yUj4fMVjSsP_at-`SZdCZ3!+mMtd!x6DoeXTcvn_Z0R} zuccE1Tr*(l~Xq&f0+7qCk+_#~Ih>=weyn~`+Ii6+s6fZC`3tA#tCPK0W*@RWD zgR3qD)rNv-vP2(H911c*!QxFIClH9m`;%)51U5=12vGu%GS+vt+FpGybK|RTV#*Z9T6;aec5e%ch zuM?*3fG@}kYq}^>xT)X-#1HyDuX?zT16cr9LwSM1WmC-1-qLnf&!29>`M z6k(vZCXTR_BUou3EG`CU8pz%Vd)Jf-Z6HNh%{&Mp#jr1XM)K*+NY(tiq=0HEGC$O4rAR<&`i}my;H|LcA7J^<-GM2K01>eAvn<-oDEeHd4E|WiQV4XniiosW{ z6Nqk@P9XXk>jW5@;#`7b1PAvmmX%qOC#*2xn6B@cifn^UP*7>h^%TRf9MvT}N@KK; z#LLNroxoN7-EmYowwg|$unAneP5@+rpc8nG!(L;NK*uqV0#(%r^sUqg zJTh`_<1_+0(YqgNP_sZieZ#1HsIfHyK=8??N6}D8D&jni3yey;Va0;%0G{^<-ym=Z z6P9o!6ci|^EL03zfZ74o@I6tj`1bb{%7-dwfU&$pDAp6{PWDHS_OC?;uB;$KmBjJ> z_}Zqyjp760M3}5@8r(!?fguC|%GUT_^Z4KRGGW})eP1zYLNPo-plFB=c9^gQ_904k zXo_N3igj3-WEl(2h8`oTzQYkAfiQiNuapV*6+Zs!fq*qy2v-IOAqW7SP;yNY;KC44 zFTc><|1nba9?-keHoT@tppMsoOorIOn;=6>-5LXG#(>7B0R>+*3{CVH$@MhD6>MK; z$S~jmEz2V02T_))nxwc}uYzk}K>1ZLg8?N< zp(+XE7sh~k`G%Wf>&X}2CwcuhU5onzYbl7huJ8p(J%&oXA1G9V*J zR9W7%DHjKpP_-n&7kok`JYCbt5GQeJQ8iq=2qsr&1ghXbDH&LX1KmYRAd3T7EYgf^ z*4iN~Q5^@OD{-Jp*l?}jaRddoZD|E--3sE!K+xDD0ZX%vPun&N>7o!ChFhMaiD4)p z)m@vTU1TJ3B+m6XL>~yeAvvHPbVHmEiQ`VCIH0FsAgCA#s*rUb-R_B8%Dz>_9J z`n+JN1P68i3MxpQFvAIkD%-xwfI5)pe4SM#5h_bXRj^4xvO~7w%cfqLF`O)<2~>;& zHEsq)ASl@kHm8lKeQveQAhzi?gA)h}T2RvPR=`;ER>0WY?9J)6=hICKr3oXn3rhl| zi7}M!^0Gu(EJr(G&cX?SBqbj=NX1|n$tO+H7jXyDMLfb}LY~Orx|DAsDhU`X91boJ zFxGvvA1cX<%Aq`2kPR3s%7-^|z*tX}fU%Bo40O(=`C^Yeer`IOE+Rv^h>}ki`3y=I zIavREF$lgnaz42w9H^BZh`s@ihJ;JA64(JKs37ub*`j40I*ARQBo)qtv@x0@Y{}qh zofI@UD1c;0ptKN_5nA9Rs9XyQZ@+9FsJa%E291`i1p{o`+;rs5`P6(@K3yaVX@qNX z0~cNj>Z2L}-Ea(|lGdXe-dJiNi7;TgL2ZQf+zA@rJK)(41d3RULMx0$3nH#LJ{7ib z8)5}i3NnY`dk};iKEhaR<9vkcJ{nFV7`SdrKUC`|@CL{nr)f%%4Br815arXfMe&m2hY8VUHCG{g z*_RXrhfX4000O~KKw2P)Iu{agUf1!;)`3+s$E%G3t67Mkd1R%02yBGC{qc*P1?oc( zt}Y_pR1Tu+5Co77+Cf;mlX%@7gy=@l*kNOo>nhMXAh8a~YMf}AoUX}X(G^+KawN^i zIUh8IIFyhXilq^T;+qgg9>O`(614mvP!cv)$QUXM8{4@!nwJknk4BoW>W?M+lcjkA zg=OISeLMPliqv4fgAlSidKOaogrSxodAyh~^hnS$iE2nEAz|op>Y*U<&9a1{A7>JV zU>*40b5Eiup-1=cPIs%BgrWPh2}2KI_d}LYu=}&cgrV3^AYtfqu#OJGc=Zm#-c8g& zNFoFnTc(;DQ8`q{T_D!@3PM4oJX`iek0V5eBRHDZ87LwabrA~6K^tH@0uTAZiY+ss zB=kv2qg>7nc`T3XROJxRQ=A4Q6kD+n(#QUp63`Tv^gwF*ELaixH; z{bW<3d*ywgP71=N+5Wxhbx8=v5D2L9}_!}$E%bg^z=H1gwtYf;-k8nq1^+fis6=ovhJZO7q> z;i<97DQFIeJl)hj7CE$VE4Dk>8OhcT%%a+XqrvrOu;Iwkj$<>!W2wXP@QKv;z}Jf9 z0~QRf2d$ycMO4&0Fkad`AT9hQ<^|V#3-R=oG1NP7Jl8vLW4iU8Gk*WMalDtFt5@SNfM+l z3zF-rP)Mdzs_t--teOr3q#(gEj;ZAXMO0Kf@K~mHpf}$``j#C_@CI z&P9KnyTFxuU>7JD3io~w^8L5n+8R&v$9ooT&Funv|0cL;sJIK<8?+2YZi_UZ8^rL) ze^7F8;}^@8fp6vGM$bJr4mqH^?%(&_^nqw*8MrgM49sJ92D|2i-5)P512=pfmVxnL z*X-Eez}`FrJdtT1_-SRp;0LIml?4nQcsA2M@JVPNc$xWF=l47J zLi@m(()NKr%(f4F3fc$$Ip-sIb4D~sAqX(hHqd}WK<#|Mx(jJT?$u=F}u zx()2;?<;Bp^5S7o4X&Lnc413l-42AH8a!HM5@*rP(gs3retcgk1G%^ z#84m{ssMsjw}Gm+fzlGf0y7xikM&2i6+(esYgZAszWB@E0ze)BM#rO7a)ztD{*Q0u z>)(xDKL;g5jkpQaJ_fwXO(52In}Feplp;~!B4Q-y7SwFk<=8NM_jwcdaK=*@R*+4Z z^i;x-X-U)wUAM)M2@NHJpMU$sO(0fa0@kw$l$r?(Zy#*}y#)hNVG~I9$GX?r1khFB z0*e650CiaeKrmc&4~U-qwN0}Ja0mc|1|0M1kD

_oeA;3L|3D~M3gLA;Tl>z81*x1SdNg#aHW<(V|WXKn${;&xYWdsGEE~Sfr>7NEFV3Wy*ld7b{%Ek><-v zJOYIoAlpJ#yb9)9$a*1-w5Sx`L@i{n3P3~Jigcku4_QVZ^n4%%hz*>(K;g(Qp@-}q z1O#_Bs93m;qd>IrDM62bEOEi0S*RM*DJUEfDc=suo-LA!uc^8wF@#L}D)@^TOW<8q z(&2U((q&PCuF{H8AW_f=Rg3~v41{Zmg^QeEQ7jxwT%=eS#)0~jj=(rjDG?}dA*+)< zVBKQjI}r?=T&CI@Q72SS7-;;!QAu(XMzmN-ckub?4bpV0uzM-o$hdaJz zQUWCrCQfmpOon(!BLa$`0tS++2aZ;Ofl^YS^fG{SLWKii!84HTPh6~zxIQq@HrEW~ zU=^uQ$4RW*Ni1)8#?VOw26ru!zt~z1P~6zMmji?ajlCQ|4uTcR)`)wnUf6tMn*Dp2%*3`8q`8myHa4?vj75t#-0TrJ%ohQpaTft zYrbuIs>sk`f)qV44>=4&DWU@nWddh`h?pca+2L)|57~s`i%woKR5A+`K%i_EsA?f9 zjTNLKNFX7NU0`1mGJ~El@iGyh^n|wDHse8U-Ff zM+5JGVT**u$hIZfVU2YJn$m1j^lZ*0ITZ|q;3*Uw7S4($X@*q6lt4a|BL+&;0)^<| zi&F~}*uhe@K=dNj0ssKNRJA~C6R8Dw1OWR`u-MijP|G6l28bM%EmBf_87fG9%VD5( z#I<~{jTKc2XROGTVbwDX&W2thO|}GGCrA}nHJ4X$7m5o20h&inO?H(m0;@$1S6u{F z?;|c|k7pMFIL9TA7TJJJv!fko` z(D#D34j1i1_XRCO7#IhJz&-Q}N)2v0U*;bAPCiQD!_Q4(bHT0$_WgDGU?Srln#sC{ z?!sn*U3Ue$KT&iK9r`A?hmHli=Ej1Yd+6lA7lK1~AomcSbq{?L3|{S%P085Vc=|>= z#|d&l>o8I|4P)_zVNea83W%>Fy}pXJzq&I}vy078NJ2E7c_ zz6)%z0n<~dca06-m3jw^0SrMflxj+v!6*i;gH|X^z!ku>Jl`@H+XpLw?h+2n0iYyi z0W}yU zMg|8S$l|~P_CT;}A=v%7A`Zk~0UQ8t;e)B}91i@-!1F5+Iu7^<2-=s)DE0rKrQqwW*bsL4VrXu7>e#e8ay&IU zH@mdhZVg--7N$p*9$Px}@Y0#38y4G#XJ;pmO{K<`-oLngCN(!Rnd+Eb60ybRyG|`l zLeXiA1#r-o0ZmKJxXMq`69X!bjK@~%^Zkk>mK1Hx$AA4(w@Zz3bGe$Zzl5d2)Jm z_#`zwdIH@2m$Z#dpBkQ=8XTI4BnKv&CdURkA`CVkd7xQYY#zF-W#{D7Y~+Vcqp6|m zo90I%4{o12JwLZ}`_c`OFEw@W1EFSS@??;S9G@849bUYxBw1iCH9J=pEwFR+^vpD* z0-QQEIdv@3g+d1QqL6{9V#ok=6}5GhrVRWUN*U;0n8fx3R~*cy4E!2O85jum|0bji z{9)wD?S+tmzbl3e+={&|ICAUI*CGxI88}rMGBCaHzp(LO|KLJ@`WhRB4BV3o8HlD^ z{~*2n(azsWw?9=DGVoL`WMCvz8ZvM`6Ebi+c5~OhV#q*c^f)e)B5f*~ta28sI+X0W zv>xUaR#9zBml?yw1xXfpUshO8aX8L{S0Iu?oiY>9Cm7o)d<;94LZyyoC=K{tjJoH z3{ia=>Ej-6yE^YEkj&|aL`@SU98qd38MWTRRjo{PTa8g$J(@FKysG6Gwch?@iTHkV zF=~DN(G}wRPX?_gU^(Apj9M6hz|~t({k4KXqVXlSqNh-@0xlbl)+~pH>@8Y=es4#S z3DN_(jjD2#&1tesSfnFCr4LNqo)!XSzTy*=Q*>WJX15*?C|#xtr*$+$#|l2&uAIK6 zr*r?NWYtkTZ?yUV9V;84Kfa*@^wkIhE?*}9l|7FJ=s&IptNy0k0Dbu|BwV31Di}Kl zCr=F@i|od>Eo{HM%INH_IyyhT+UPtUNp3?EdSQ6J4-Lo<26iS=AWZ=%1t$nL6ZcJvqdw7p*gT7B1T+o{Rf z)5CM46T#sUKK)@tr6+>cFGPM$F~Ft+u{}9Ew~uIvIC3P7W!d!D;b;3I*F86cGI$@^ z_gCqIZ_Ds#_hxvs>&{^JLI`iL=ks|U?PU7U|IYI1_mBNB$D=(w@E18goyqcO{~P|v zbWDP%{-fy|M{{(#Tt=rqny1qrnK_rE)5AcgCs)$xmsO+FuPvMY5Bz0@PX9d6=|5+l z&T{Ep|FvX!X1>A2ZP4$3?Ogi0P5AM~kLI;3&owxmbbONl zxr`|)BFTjvmG?nAM^cJq8#uV^WJYpHT4P~PmO0-F(X4{Yer1zyZ{g*yKX!wcPg~&g${CIkXE4Y=KFC`MKZEGU;!rg-MTBFzHW}GU-_I$r6!$VFSR*TYNY6 z`@a`qz?-%@I%?hl8lOqGEY*X&U0KydS5P2ngI7c;%p0Q5(+o&yZ5`@*L450&GOwx7 z-D%-IhlilH$0pr;7Eh5$?^}&YuSx{0z5^80b$JZv>5oS*atWvx1~etBv*?>jSo0xfO~mU{(!b5W6g`16WVpz6WZ^r#sf?u>YzXb@Nh*tlP3cHHb(^fExM#- zh=50mM8LBpm$WZonR%cp5%BGDBH+)~AOe1dh=5xwh=7R#5nyi`BH*QRBA_&(+oye# zq&b7beMQzagJm>F36m!0(6;7Cil{<^FC~)D*QGIxLyCmR+eFA9A&`U2EA52~G6CTg z0o_r^*Xe~Ao03SL;!*voYdZQ1bl~2vLO}PfTZ>GrlxJY>1cms`Xc?d^;!iYk&#L| z0D^fF<+0rL3FhsjODMtB&9(;-23*^q7*Nk$pz(7#W!{FWKF88MQ6*JJR1^)D!oI2b zj7q^8VEd#i!GM61E`;(34lN2`!wng-30Yivr7oZ#vtI`WtgZ`)6@xblx`2zW?5x)= zuo@-UbM{5h*ng#v$+xkT;I#+?jy5O;)bT9v1_1=Hojw5Adw zkbtbjh`eGDw&CHdV?YFt%tP=79daP8!*?n%VAVjrs(e6cN5_h@K(eT?M;HLw+IS4Q zd^ag4xH5bvcNc&`0I0$hD6po+zTQ<`M-c{`X;8CW?HKSX&34Jgv)tPzqe(tbK`jr# zlep;6u1<#yPb74o#Ysb?WX)kHfdD;##qqEd@HT~qKu!zYePo5%E>`f{UaZ-!zzM#F zW;@sg-q2>dGYAFd8q{o8`!=v{vt4h)NAJiutC)`Hk&voEJ5bh5QKT3K%e~-htVDXE zA?mW~iJ~T2xL~;g$5@ITQUrp6H2)k7l$h-b$s1+SJ5^marMJN%A(%DW6^-|=q1g`h zfj6+(ZVsV9v_ZQ%YM%wxeIJZAJ}>Ahiep)#pt3wfZQ>M^^7(wb;u3S%uPq`oKMYn<@W)o#Vc{# zzACdoy@q1!+dA%NAOZlO9NK)mr;L5uPz%aSZx6m8z{RZ(+UF6;@S z=XUE&&C( z1X86gftwf3V@`0LyAVr7Ve z3E1Eg_-aucaPIx-Ca+W*pisPnLq!M43!2B{ItyKVa+tFSmF`7>D zl;Rky;xi%B;RKq<=kFwuHee>>5-98fSC_g37IrRrCBE9`t3Vjg-(6bLk(&XYN$-9W zxC9C^!M#sow*?)yV0{a>6!if&4HlDk9tv9Sz!F1GpSuI1cV3~ogF~Os=>u-enFYR{ ziQWOTz!A^~aL5(#@V@iu{mG0z;O?wG;C}3GX!H*D{7F$CaPTG22c&{s_l|ufCl$Vb z;48tw+feAn4OxA_OQ2imI0l;FccyQ+J*N*i9JCICGrD~cRrU_TVPHBK_%aILnHU{8 zKamaJxda3PH{}Hak7ug8|FKdauv8ho^YM&8;BgQL{1fwAoqydKf$Hx6RB{?*KA4pU zJOT26@8{$JEg5;hCFuPVkiyCBLGS;v_BvSYcjcTyJCJKVYY_^qW)ad>wFo`7nlxyz z+#)oaR|eHS1gx7304sfi=kPizOBosn0VI?6bk*c_)ZER0Ajsu8+p;CgcNJ3x7a_ED zYC2?a8$Qm242`l(UZ@}g;ss8yj0~un!&|BjDr^Cn9Nr=okj>$3i6{D_=Tf=&t*(|J zdAtY$j|44~sIzkt!#gjh9tslQEQ{azaRvim0{ErI@b)|s1pqi7h~Gy5FgyCL^Rrn1 zFaQ9oJOKQ8CVgwN5&(Xe9x77^9qdK`aPT^8ZeNVuv$w6Y2LNEX1OV9UGXQX~6YN66 zIRJQ11^@^I0LC)a+K4HfwFAJqd4L2$fa`V)j89J=85y1#gdpC7rO_JCL9|Ba)eGa; z?qFvmI|4k2Mu4Ni_3wjdjo;mYER%V=;9nI70So@T9<+u&7g5m^FkU(ZxC?)YjRx0y z3-NR~;}o3F%>c=C>*+K$-g#$w_pg_Y03XSZ0RLJ#0z8u$0fr%4qpdgsJoBk^(`@Mo zU>YVa@;t|ooCWM3Bifvzgn5p}HA!c185dO@EW;wnnykosia_e5%7-*gp#*`d+yV*+ zP^Jy2bqgp61iNxXK&*R3WnUE{pnh8b#?xzBh9GtaXo{m%)WX&JyO}!lcQ?)U<9~^y zf*tc4INL45(r366vC2qs^(Z<`j(7fVE+~`SgT?< z-uTs>glXUc&f)~*>_HsK#{JZ(LCgG;+BDnlpUgJDD0B* zJzXV=;nk`;t15+7HxRExfsAwLqI0?H!wSA`a=G^-5bzo_i?fciK)mr&gh2IUNP^44 z`p@f}4dDR}PJ)9N=Xu8z4ULyAMbib@)(l?aAxlhwfxr&&imcjPrChLgwG^SMv%nfz zoGUfMxh&4!O?e!69c6KP2nb?ZKH^%Zfhdv-H8?+DakfdrQ}=Prrd*$p44n-7v}O4u zly-8YW66x;XarCN4sO!E2y+4%GCb4Ks7fDkvT!0O;|Hov1EotrfgwakLU0&Y>I6zl zJFCzG7tRx@n|WYGX=gzukSpyhtOOf+Ba9&kpg}6cehl3RK2(nz;fCD^Y8MP{$%gac z{5Vj5oX6M+!Qa47r_N(Liw z887gyd`Cxps=AUN`g;11kvkLOMH}%Zs_LQ<0(5T;0W}W+jV~3VImQqf+jR+FCrOXA zZAq2Fj>bza+y*I}7kv^$0*1*;jweaF16M^-3GuY!@Iqy0Z?YBxVRF?WAW^Xl#DRs6 zuel6t;1Cdd@~g$>?&1)T*hJo;ZUg}%%T!Y%9tUb40@i&ej5R(XK4|Sj96-ThJ=Ia5cO?pJC?Vh?48RcvG@xj(b_`gzXb?pUUb{jvbf8o+w2UM} zS1qJUBtvI%lA-s4Wax<%lA-UeOETnuWN0KS8M^-MNH#o|lME%&t-g6{5jJAzJX_M1utzaaUF}*cyjPAhB?9szDe9>Yy5I zn`wqo;K`wM{B({I_-N329J@2q~MM95Dvfo zDh4V$x*{)ziWLJ;(KYZ=6I6u-)eE`+AlkZG4nx^M=Vi^%7!Y}Wje@Rc&K8UWo3xwD z<2(oxw>*P^FTYJVy2FreShakffL0-&ly!(5;5gHw2#0h?i=jbNsDx}ERELGU@se(? z!eVfw)I$)27Y9o`1klX|-}l(j5+7lHFZfFOnu8tvMKFkfoU(nmDc-#>Tr?5H#*6yl z_XI5|EI#o3`4nh|+Nmdk?iaEqg03&-Oawp5n+QxW5qtq#2zI@1e=_}6A!8zVFl!<> zi(<&n278_KJbm;$S5)q{P(Ph;HTJF&@lyvfZ_DbGdU>u zV$eE{oeDa}F(^sONQl|*APMpG=;P<7vl3z%B*aQyLj0MGg!s`)3GoN%+sY-xbVfoP z0}1hgY{=kGI*(wp_?L`sKs*Ng3=~pKkC91Ojbat({w~ovjyc z?UZ;@Hweb?;W{7?G$n~}IfU)Ogi2qi9wTkX5IsQ^DMgZa!I53pBlVC97G%j$a(hC_ zWKd`!D4z_La%W)qQ+5)%}P2O4B*9qjl2UKUM0&JCq%u-wFft$=m?_8<_$62802ZE|XVN z$Iv!?TRj@DH$-BSuettSwVLbCl!Wtt3hNkxn(NSFsrP!S7k`(@VqMBaKY zVrABQ2a#yVdJiPpJu67G*V2HWcohcx&~8oXDH5<#g5taV=?Zo@o&T`1PUMi^)fEy|rk+FJ$nP+wbv`)w%hy{%+{q z$t7{24`k#+SgPxhOs{nx^jiN*q1T%Dm1PChT9XkD)moD;VX4SKMXhxj`$5^7+4U=E z&Fs1xYOTN4Wn^ou2eP%+Co+!%)mnFbBKtT#{H@I6xD-8(!L9AGR`tmnAi`c#Xw9K4 zjwCDt7D!SN6xj^hzR9Uvrnb&BL6zd_hAPk^@2a|GGaMh{Rlzdx%0|0YBkZec(bqUV z7dfW9MKum}@oUOYE^JY)&xQ#%r+BQ2J+>K+&j@1GTw-M^N(t- zw7p2a89eNb#5Y5?JMY{RDLCZK~ z)_mpMIMB^IsB=N|t2w&)nH=5xPZ_#7e)w4@ave7K?$0$XJ{;_N|Ng%8VL8J%Ka^#h zAHg1i>f2z?vqi@F=3fBgd7FpFDp$OF7#>Ih%RP`A;&G^RHG?&c98MmCXVN zwTBhl~kYJT*y6?CRi!Q9$c0crmb3xV=G>YwCD^egi~SP_*PS5KQ4p9BYb};u_#S z4MS9&&j3fxvZ^V0rb)A=PU%3R5eA`hk`m$^&(P({5UZZTJWys*tu_xtS9hx)Esg_u zh9K6TSi9Y(Fb=GmT~i;10MzO6{_Yh6LBXT4GS9keW3}nGBN%vVgWA+;-wM_(Ly5&3 z-m6aWG6BIg&|1gpjtG>Yz~O8de5h-y$wa-@VxI#4HCbFr$6+yt= z=vJ^r48SpM-NZnm;fVp4)IF%IAxTTn;kHIX9F4$-Xn|l2ke?Ei$C;6bMTXkU^!fGiwAM3a&KP<_Qvq+$vAt zID!nD1aw*xBxz`1UXdjarzu1CG{+%1QFI{F78GiP?p2us3I>&nn*%EDg=h}gtakOL zMD=^&%3WYhYOvl-mxmDo#2XX=>bMC+8{ehMX|76=3l<~Z7=ImzZ6 zo%d9zzTs$!R7Dmdu1TCTrH~-l4sBPuRFkW@RI6?Rs|HpiqxDFws@Epal!%v}2UcMN zHWUHk2mvkwE}#)Zt7=DpR~cH>(|BFCj6qq9E~yY`52^LO$}lvz)OFsMDaGO`!}M?w z$8oq2FgC>tPRbfYho) zvPcGOB04Y=VcVTp#~84|M}Y)FfxZSsfjW`_(Z(;h!F5K`DN81GQ#0W(z)_B7hJp7J z96_`sMuf^+lE5XAH%tOzZ5f4?c`igSs>aHdD3B=RS6&*qxAoa3x7ARZ>%1|J@m@2;v^hZk_ z>P5w1c>hk&4Ht53yE?GRVB4`)h`mk37LMh+?%IRilSRegqe06Fq!>H_IB*s9o}lMD zWiht@meCHwR`A2;oiOmKbC!hQ->;&Hk zlfXaYki=x3*(<)9OENES(+8a2!rgqWbmX)AXI_TrBB5*EEIK1aLoD4=hM-B_B$*?TJ zcpw*$JVF*gX3QHBX_x{7sG)^Cla)9rpJ}-sgL+wXO*FpJN|48dY;;XgE`XwII)=eY zux4`2(DUamkX!@OK}fCv>EItXExz{QHNDltYhacENH`zl!fPIR{M<%{*R&!yIE}=E zTcbfuG(qDp2o5hRHgD*ZsVTVQiWq5w1aMtfiIr;g9`tU@Ay81*0Vi_KQ&mW?mUnhuuvaN|R z*2Tn-(E&tB02&<-z%w%7aO45waeN2b(so$Dr0FoWGi`wror7ptfE`#2{GSub8QQg? G)C2%?-Z^^! literal 0 HcmV?d00001 diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index c6616afc..870145a1 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -516,12 +516,13 @@ def copyIn(self, vm, inputFiles): domain_name = self.domainName(vm) + # Creates directory and add permissions result = subprocess.run( ["ssh"] + self.ssh_flags + [ "%s@%s" % (self.ec2User, domain_name), - "(mkdir autolab)", + "(mkdir -p autolab && chmod 755 autolab)", ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -533,6 +534,10 @@ def copyIn(self, vm, inputFiles): self.log.info("%s" % line) self.log.info("Standard Error: %s" % result.stderr) self.log.info("Return Code: %s" % result.returncode) + + # Validate inputFiles structure + if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): + self.log.info("Error: Invalid inputFiles Structure") # Copy the input files to the input directory for file in inputFiles: From 2283fbeaa34af4d92b8ac64ba6299051e250e128 Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 26 Jan 2025 00:59:59 -0500 Subject: [PATCH 02/29] removed unnecessary files --- Base.txt | 38 -------------------------------------- dump.rdb | Bin 132168 -> 0 bytes 2 files changed, 38 deletions(-) delete mode 100644 Base.txt delete mode 100644 dump.rdb diff --git a/Base.txt b/Base.txt deleted file mode 100644 index 61ae5ec0..00000000 --- a/Base.txt +++ /dev/null @@ -1,38 +0,0 @@ -# Autolab - autograding docker image - -FROM ubuntu:22.04 -MAINTAINER Carnegie Mellon University - -# prevent installing ssh and gnupg as dependencies of build-essential -COPY apt-preferences /etc/apt/preferences.d/00autolab-ignores - -# clean up apt cache/metadata so it doesn't use space in the image -RUN apt-get update && apt-get upgrade -y &&\ - apt-get install -y \ - build-essential wget sudo git \ - python2 python3 \ - # 15-462 - nodejs \ - # 15-213 and general purpose tools - llvm clang clang-format &&\ - apt-get clean && rm -rf /var/lib/apt/lists - -# Install autodriver -# Autodriver makefile uses sudo, remove it afterwards in case it's unsafe -WORKDIR /home -RUN useradd autolab && useradd autograde -RUN mkdir autolab autograde output &&\ - chown autolab:autolab autolab output &&\ - chown autograde:autograde autograde -RUN git clone https://github.com/autolab/Tango.git &&\ - cd Tango/autodriver &&\ - make clean && make &&\ - install -c -o root -g root -m 4755 autodriver /usr/bin/autodriver &&\ - rm -rf /home/Tango -RUN env SUDO_FORCE_REMOVE=yes dpkg -P sudo - -WORKDIR /tmp -RUN wget -q https://c0.cs.cmu.edu/downloads/cc0-debian.deb && dpkg -i cc0-debian.deb && rm cc0-debian.deb - -# restore default directory requred for autolab interface to work -WORKDIR /home \ No newline at end of file diff --git a/dump.rdb b/dump.rdb deleted file mode 100644 index 30ec8252acf87bd4c79f411818d43a7db2bfdb49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132168 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 G)C2%?-Z^^! From 5cc5004bbe9f6999f89abbef7c0b25fd8f787fdb Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 26 Jan 2025 01:21:45 -0500 Subject: [PATCH 03/29] added thread pool for scp commands --- vmms/ec2SSH.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 870145a1..a61d4d78 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -16,6 +16,7 @@ import time import logging import threading +from concurrent.futures import ThreadPoolExecutor import config import backoff import boto3 @@ -539,20 +540,33 @@ def copyIn(self, vm, inputFiles): if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): self.log.info("Error: Invalid inputFiles Structure") - # Copy the input files to the input directory - for file in inputFiles: - self.log.info("%s - %s" % (file.localFile, file.destFile)) + # Function to execute scp command for a single file + def scp_file(file): + self.log.info("Copying %s to %s", file.localFile, file.destFile) ret = timeout_with_retries( ["scp"] + self.ssh_flags + [ file.localFile, - "%s@%s:~/autolab/%s" % (self.ec2User, domain_name, file.destFile), + f"{self.ec2User}@{domain_name}:~/autolab/{file.destFile}", ], config.Config.COPYIN_TIMEOUT, ) if ret != 0: - return ret + self.log.error("Failed to copy file %s to %s", file.localFile, file.destFile) + return ret + + # TODO: Not sure what max-concurrent should be here + max_concurrent = 5 + + # Limit the number of concurrent SCP commands + with ThreadPoolExecutor(max_workers=max_concurrent) as executor: + results = list(executor.map(scp_file, inputFiles)) + + # Check for failures + if any(ret != 0 for ret in results): + self.log.info("Copy-in Error: One or more files failed to copy") + return -1 return 0 From 81422e1ad207f5fe976173c2c7cc516ee9351da2 Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 26 Jan 2025 14:50:45 -0500 Subject: [PATCH 04/29] added more in-depth print statements --- vmms/ec2SSH.py | 9 +++++---- worker.py | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index a61d4d78..2428a8e0 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -511,7 +511,7 @@ def waitVM(self, vm, max_secs): # Sleep a bit before trying again time.sleep(config.Config.TIMER_POLL_INTERVAL) - def copyIn(self, vm, inputFiles): + def copyIn(self, vm, inputFiles, job_id): """copyIn - Copy input files to VM""" self.log.info("copyIn %s - writing files" % self.instanceName(vm.id, vm.name)) @@ -532,9 +532,9 @@ def copyIn(self, vm, inputFiles): # Print the output and error for line in result.stdout: - self.log.info("%s" % line) - self.log.info("Standard Error: %s" % result.stderr) - self.log.info("Return Code: %s" % result.returncode) + self.log.info("%s for job $s" % line, job_id) + self.log.info("Standard Error: %s, job: %s" % result.stderr, job_id) + self.log.info("Return Code: %s, job: %s" % result.returncode, job_id) # Validate inputFiles structure if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): @@ -553,6 +553,7 @@ def scp_file(file): config.Config.COPYIN_TIMEOUT, ) if ret != 0: + # why did the scp fail self.log.error("Failed to copy file %s to %s", file.localFile, file.destFile) return ret diff --git a/worker.py b/worker.py index 1d197337..b2068edd 100644 --- a/worker.py +++ b/worker.py @@ -288,7 +288,10 @@ def run(self): ) # Copy input files to VM - ret["copyin"] = self.vmms.copyIn(vm, self.job.input) + self.log.debug(f"Before copyIn: ret[copyin] = {ret['copyin']}, job_id: {str(self.job.id)}") + ret["copyin"] = self.vmms.copyIn(vm, self.job.input, self.job.id) + self.log.debug(f"After copyIn: ret[copyin] = {ret['copyin']}, job_id: {str(self.job.id)}") + if ret["copyin"] != 0: Config.copyin_errors += 1 msg = "Error: Copy in to VM failed (status=%d)" % (ret["copyin"]) From 9760759f54e0dde2975ea90b760b2149f3fc1e1a Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 2 Feb 2025 14:14:26 -0500 Subject: [PATCH 05/29] reverted threading and added logging --- vmms/ec2SSH.py | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 2428a8e0..ff0b8419 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -523,7 +523,7 @@ def copyIn(self, vm, inputFiles, job_id): + self.ssh_flags + [ "%s@%s" % (self.ec2User, domain_name), - "(mkdir -p autolab && chmod 755 autolab)", + "(mkdir -p autolab && chmod 775 autolab)", ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -533,41 +533,28 @@ def copyIn(self, vm, inputFiles, job_id): # Print the output and error for line in result.stdout: self.log.info("%s for job $s" % line, job_id) - self.log.info("Standard Error: %s, job: %s" % result.stderr, job_id) self.log.info("Return Code: %s, job: %s" % result.returncode, job_id) + if result.stderr != 0: + self.log.info("Standard Error: %s, job: %s" % result.stderr, job_id) # Validate inputFiles structure if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): - self.log.info("Error: Invalid inputFiles Structure") + self.log.info("Error: Invalid inputFiles Structure, job: %s", job_id) - # Function to execute scp command for a single file - def scp_file(file): - self.log.info("Copying %s to %s", file.localFile, file.destFile) + for file in inputFiles: + self.log.info("%s - %s" % (file.localFile, file.destFile)) ret = timeout_with_retries( ["scp"] + self.ssh_flags + [ file.localFile, - f"{self.ec2User}@{domain_name}:~/autolab/{file.destFile}", + "%s@%s:~/autolab/%s" % (self.ec2User, domain_name, file.destFile), ], config.Config.COPYIN_TIMEOUT, ) if ret != 0: - # why did the scp fail - self.log.error("Failed to copy file %s to %s", file.localFile, file.destFile) - return ret - - # TODO: Not sure what max-concurrent should be here - max_concurrent = 5 - - # Limit the number of concurrent SCP commands - with ThreadPoolExecutor(max_workers=max_concurrent) as executor: - results = list(executor.map(scp_file, inputFiles)) - - # Check for failures - if any(ret != 0 for ret in results): - self.log.info("Copy-in Error: One or more files failed to copy") - return -1 + self.log.info("Copy-in Error: SCP failure, job: %s", job_id) + return ret return 0 From f508a15ea7bf217540f63200fcc2eecb66d33f68 Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 9 Feb 2025 12:12:43 -0500 Subject: [PATCH 06/29] reverted thread pool --- dump.rdb | Bin 0 -> 370347 bytes vmms/ec2SSH.py | 23 ++++++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..5ef85bb10d719f9303daef99e378ea8f37a20c08 GIT binary patch literal 370347 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 literal 0 HcmV?d00001 diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index ff0b8419..a0ac1362 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -541,20 +541,33 @@ def copyIn(self, vm, inputFiles, job_id): if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): self.log.info("Error: Invalid inputFiles Structure, job: %s", job_id) - for file in inputFiles: - self.log.info("%s - %s" % (file.localFile, file.destFile)) + def scp_file(file): + self.log.info("Copying %s to %s", file.localFile, file.destFile) ret = timeout_with_retries( ["scp"] + self.ssh_flags + [ file.localFile, - "%s@%s:~/autolab/%s" % (self.ec2User, domain_name, file.destFile), + f"{self.ec2User}@{domain_name}:~/autolab/{file.destFile}", ], config.Config.COPYIN_TIMEOUT, ) if ret != 0: - self.log.info("Copy-in Error: SCP failure, job: %s", job_id) - return ret + # why did the scp fail + self.log.error("Failed to copy file %s to %s", file.localFile, file.destFile) + return ret + + # TODO: Not sure what max-concurrent should be here + max_concurrent = 5 + + # Limit the number of concurrent SCP commands + with ThreadPoolExecutor(max_workers=max_concurrent) as executor: + results = list(executor.map(scp_file, inputFiles)) + + # Check for failures + if any(ret != 0 for ret in results): + self.log.info("Copy-in Error: One or more files failed to copy") + return -1 return 0 From e460603c5502f4e0ffc82c47fc7aff2864a7225f Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 9 Feb 2025 12:13:01 -0500 Subject: [PATCH 07/29] remove dump --- dump.rdb | Bin 370347 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb deleted file mode 100644 index 5ef85bb10d719f9303daef99e378ea8f37a20c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370347 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 From 0b3f866c4c2bac6738748135fc969ca32cd67ab9 Mon Sep 17 00:00:00 2001 From: evanyeyeye <14984764+evanyeyeye@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:47:17 -0500 Subject: [PATCH 08/29] Small fixces --- vmms/ec2SSH.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index a0ac1362..fc8a6056 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -532,17 +532,17 @@ def copyIn(self, vm, inputFiles, job_id): # Print the output and error for line in result.stdout: - self.log.info("%s for job $s" % line, job_id) - self.log.info("Return Code: %s, job: %s" % result.returncode, job_id) + self.log.info("%s for job %s" % (line, job_id)) + self.log.info("Return Code: %s, job: %s" % (result.returncode, job_id)) if result.stderr != 0: - self.log.info("Standard Error: %s, job: %s" % result.stderr, job_id) + self.log.info("Standard Error: %s, job: %s" % (result.stderr, job_id)) # Validate inputFiles structure if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): - self.log.info("Error: Invalid inputFiles Structure, job: %s", job_id) + self.log.info("Error: Invalid inputFiles Structure, job: %s" % (job_id)) def scp_file(file): - self.log.info("Copying %s to %s", file.localFile, file.destFile) + self.log.info("Copying %s to %s" % (file.localFile, file.destFile)) ret = timeout_with_retries( ["scp"] + self.ssh_flags @@ -554,7 +554,7 @@ def scp_file(file): ) if ret != 0: # why did the scp fail - self.log.error("Failed to copy file %s to %s", file.localFile, file.destFile) + self.log.error("Failed to copy file %s to %s" (file.localFile, file.destFile)) return ret # TODO: Not sure what max-concurrent should be here From 9a27e47095230d1577fa731722f91f934f79608b Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 9 Feb 2025 13:06:38 -0500 Subject: [PATCH 09/29] reverted threading --- vmms/ec2SSH.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index fc8a6056..5ed08fde 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -541,33 +541,21 @@ def copyIn(self, vm, inputFiles, job_id): if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): self.log.info("Error: Invalid inputFiles Structure, job: %s" % (job_id)) - def scp_file(file): - self.log.info("Copying %s to %s" % (file.localFile, file.destFile)) + + for file in inputFiles: + self.log.info("%s - %s" % (file.localFile, file.destFile)) ret = timeout_with_retries( ["scp"] + self.ssh_flags + [ file.localFile, - f"{self.ec2User}@{domain_name}:~/autolab/{file.destFile}", + "%s@%s:~/autolab/%s" % (self.ec2User, domain_name, file.destFile), ], config.Config.COPYIN_TIMEOUT, ) if ret != 0: - # why did the scp fail - self.log.error("Failed to copy file %s to %s" (file.localFile, file.destFile)) - return ret - - # TODO: Not sure what max-concurrent should be here - max_concurrent = 5 - - # Limit the number of concurrent SCP commands - with ThreadPoolExecutor(max_workers=max_concurrent) as executor: - results = list(executor.map(scp_file, inputFiles)) - - # Check for failures - if any(ret != 0 for ret in results): - self.log.info("Copy-in Error: One or more files failed to copy") - return -1 + self.log.info("Copy-in Error: SCP failure, job: %s", job_id) + return ret return 0 From 52326da2e7e6afbbde509f742d3ef505e4573116 Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 9 Feb 2025 13:08:20 -0500 Subject: [PATCH 10/29] small fixes --- vmms/ec2SSH.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 5ed08fde..e05cc1d0 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -554,7 +554,7 @@ def copyIn(self, vm, inputFiles, job_id): config.Config.COPYIN_TIMEOUT, ) if ret != 0: - self.log.info("Copy-in Error: SCP failure, job: %s", job_id) + self.log.info("Copy-in Error: SCP failure, job: %s" % (job_id)) return ret return 0 From 014ad498cb813cf665241b883c05d175f715d5d6 Mon Sep 17 00:00:00 2001 From: Soma Narita Date: Tue, 11 Feb 2025 01:29:12 -0500 Subject: [PATCH 11/29] stressTest.py working --- .gitignore | 9 ++ clients/tango-cli.py | 14 +- dump.rdb | Bin 0 -> 117450 bytes jobManager.py | 4 + requirements.txt | 1 + restful_tango/tangoREST.py | 7 +- tangoObjects.py | 2 + tests/sample_test/expected_output.txt | 1 + tests/sample_test/input/autograde-Makefile | 2 + tests/sample_test/input/hello.sh | 3 + tests/sample_test/sample_test.yaml | 10 ++ tests/stressTest.py | 158 +++++++++++++++++++++ worker.py | 25 +++- 13 files changed, 231 insertions(+), 5 deletions(-) create mode 100644 dump.rdb create mode 100644 tests/sample_test/expected_output.txt create mode 100644 tests/sample_test/input/autograde-Makefile create mode 100755 tests/sample_test/input/hello.sh create mode 100644 tests/sample_test/sample_test.yaml create mode 100644 tests/stressTest.py diff --git a/.gitignore b/.gitignore index 14ed0260..02540cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ scripts/*.sh vmms/id_rsa* courselabs/* dockerTmp/* +id_ed25519 +id_ed25519.pub # config config.py @@ -27,3 +29,10 @@ pip-selfcheck.json # Backup files *.bak + +# Tests +tests/my_tests/* +tests/sample_test/output +tests/sample_test/output/* +tests/sample_test/log.txt +tests/sample_test/summary.txt \ No newline at end of file diff --git a/clients/tango-cli.py b/clients/tango-cli.py index 83dd12ce..d9f5ab8d 100755 --- a/clients/tango-cli.py +++ b/clients/tango-cli.py @@ -116,6 +116,10 @@ "--notifyURL", help="Complete URL for Tango to give callback to once job is complete.", ) +parser.add_argument( + "--callbackURL", + help="Complete URL for Tango to give callback to once job is complete.", +) parser.add_argument( "--disableNetwork", action="store_true", @@ -127,7 +131,8 @@ parser.add_argument("--accessKeyId", default="", help="AWS account access key ID") parser.add_argument("--accessKey", default="", help="AWS account access key content") parser.add_argument("--instanceType", default="", help="AWS EC2 instance type") - +parser.add_argument("--ec2", action="store_true", help="Enable ec2SSH VMMS") +parser.add_argument("--stopBefore", default="", help="Stops the worker before a function is executed") def checkKey(): if args.key is None: @@ -210,11 +215,11 @@ def tango_upload(): if res != 0: raise Exception("Invalid usage: [upload] " + upload_help) - f = open(args.filename) dirs = args.filename.split("/") filename = dirs[len(dirs) - 1] header = {"Filename": filename} + f = open(args.filename, 'rb') response = requests.post( "%s://%s:%d/upload/%s/%s/" % (_tango_protocol, args.server, args.port, args.key, args.courselab), @@ -257,10 +262,15 @@ def tango_addJob(): if args.notifyURL: requestObj["notifyURL"] = args.notifyURL + if args.callbackURL: + requestObj["callback_url"] = args.callbackURL + requestObj["accessKeyId"] = args.accessKeyId requestObj["accessKey"] = args.accessKey requestObj["disable_network"] = args.disableNetwork requestObj["instanceType"] = args.instanceType + requestObj["ec2Vmms"] = args.ec2 + requestObj["stopBefore"] = args.stopBefore response = requests.post( "%s://%s:%d/addJob/%s/%s/" diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..55d6d316c583e5d479bd0097a31c6bd2292f9473 GIT binary patch literal 117450 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 literal 0 HcmV?d00001 diff --git a/jobManager.py b/jobManager.py index c31b9bc4..8f4e7185 100644 --- a/jobManager.py +++ b/jobManager.py @@ -77,7 +77,10 @@ def __manage(self): if job.vm.ec2_vmms: from vmms.ec2SSH import Ec2SSH + self.log.error('beforeec2ssh') vmms = Ec2SSH(job.accessKeyId, job.accessKey) + self.log.error('afterec2ssh') + newVM = copy.deepcopy(job.vm) newVM.id = self._getNextID() try: @@ -90,6 +93,7 @@ def __manage(self): else: # Try to find a vm on the free list and allocate it to # the worker if successful. + self.log.error('huh?') if Config.REUSE_VMS: preVM = vm else: diff --git a/requirements.txt b/requirements.txt index 0591f3e7..548d9625 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ urllib3==1.26.19 docker==5.0.3 backoff==2.2.1 pytz +pyyaml diff --git a/restful_tango/tangoREST.py b/restful_tango/tangoREST.py index 39774111..c60cf44d 100644 --- a/restful_tango/tangoREST.py +++ b/restful_tango/tangoREST.py @@ -166,7 +166,11 @@ def convertJobObj(self, dirName, jobObj): ec2_vmms = False if "ec2Vmms" in jobObj: - ec2_vmms = True + ec2_vmms = jobObj["ec2Vmms"] + + stopBefore = "" + if "stopBefore" in jobObj: + stopBefore = jobObj["stopBefore"] instance_type = None if "instanceType" in jobObj and len(jobObj["instanceType"]) > 0: @@ -198,6 +202,7 @@ def convertJobObj(self, dirName, jobObj): accessKey=accessKey, accessKeyId=accessKeyId, disableNetwork=disableNetwork, + stopBefore=stopBefore ) self.log.debug("inputFiles: %s" % [file.localFile for file in input]) diff --git a/tangoObjects.py b/tangoObjects.py index 2dc03dbe..89418e26 100644 --- a/tangoObjects.py +++ b/tangoObjects.py @@ -100,6 +100,7 @@ def __init__( accessKeyId=None, accessKey=None, disableNetwork=None, + stopBefore="", ): self.assigned = False self.retries = 0 @@ -120,6 +121,7 @@ def __init__( self.accessKeyId = accessKeyId self.accessKey = accessKey self.disableNetwork = disableNetwork + self.stopBefore = stopBefore def __repr__(self): self.syncRemote() diff --git a/tests/sample_test/expected_output.txt b/tests/sample_test/expected_output.txt new file mode 100644 index 00000000..70c379b6 --- /dev/null +++ b/tests/sample_test/expected_output.txt @@ -0,0 +1 @@ +Hello world \ No newline at end of file diff --git a/tests/sample_test/input/autograde-Makefile b/tests/sample_test/input/autograde-Makefile new file mode 100644 index 00000000..10870823 --- /dev/null +++ b/tests/sample_test/input/autograde-Makefile @@ -0,0 +1,2 @@ +autograde: + bash hello.sh diff --git a/tests/sample_test/input/hello.sh b/tests/sample_test/input/hello.sh new file mode 100755 index 00000000..46c0d0e9 --- /dev/null +++ b/tests/sample_test/input/hello.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "Hello world" diff --git a/tests/sample_test/sample_test.yaml b/tests/sample_test/sample_test.yaml new file mode 100644 index 00000000..587f5a10 --- /dev/null +++ b/tests/sample_test/sample_test.yaml @@ -0,0 +1,10 @@ +num_submissions: 5 +submission_delay: 0.1 +autograder_image: ec2_213_llvm_14_s25 +output_file: log.txt +tango_port: 3001 +cli_path: /home/snarita/Autolab/Tango/clients/tango-cli.py +instance_type: t2.micro +timeout: 180 +ec2: True +expected_output: expected_output.txt diff --git a/tests/stressTest.py b/tests/stressTest.py new file mode 100644 index 00000000..3a35e39e --- /dev/null +++ b/tests/stressTest.py @@ -0,0 +1,158 @@ +import argparse +import subprocess +import time +import os +import sys + +import asyncio +import tornado.web + +import yaml + +test_dir = "" +sub_num = 0 +finished_tests = dict() +start_time = time.time() +expected_output = "" + +def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '█', printEnd = "\r"): + """ + Call in a loop to create terminal progress bar + @params: + iteration - Required : current iteration (Int) + total - Required : total iterations (Int) + prefix - Optional : prefix string (Str) + suffix - Optional : suffix string (Str) + decimals - Optional : positive number of decimals in percent complete (Int) + length - Optional : character length of bar (Int) + fill - Optional : bar fill character (Str) + printEnd - Optional : end character (e.g. "\r", "\r\n") (Str) + """ + percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) + filledLength = int(length * iteration // total) + bar = fill * filledLength + '-' * (length - filledLength) + print(f'\r{prefix} |{bar}| {percent}% {suffix}', end = printEnd) + # Print New Line on Complete + if iteration == total: + print() + +def run_stress_test(num_submissions, submission_delay, autograder_image, output_file, tango_port, cli_path, + job_name, job_path, instance_type, timeout, ec2): + printProgressBar(0, num_submissions, prefix = 'Jobs Added:', suffix = 'Complete', length = 50) + with open(output_file, 'a') as f: + f.write(f"Stress testing with {num_submissions} submissions\n") + + for i in range(1, num_submissions + 1): + command = [ + 'python3', cli_path, + '-P', str(tango_port), + '-k', 'test', + '-l', job_name, + '--runJob', job_path, + '--image', autograder_image, + '--instanceType', instance_type, + '--timeout', str(timeout), + '--callbackURL', ("http://localhost:8888/autograde_done?id=%d" % (i)) + ] + if ec2: + command += ['--ec2'] + subprocess.run(command, stdout=f, stderr=f) + f.write(f"Submission {i} completed\n") + printProgressBar(i, num_submissions, prefix = 'Jobs Added:', suffix = 'Complete', length = 50) + if submission_delay > 0: + time.sleep(submission_delay) + print() + +class AutogradeDoneHandler(tornado.web.RequestHandler): + def post(self): + global finished_tests + global test_dir + global sub_num + global start_time + id = self.get_query_argument("id") + fileBody = self.request.files["file"][0]["body"].decode() + scoreJson = fileBody.split("\n")[-2] + with open(os.path.join(test_dir, "output", "output%s.txt" % id), 'w') as f: + f.write(fileBody) + finished_tests[str(id)] = scoreJson + printProgressBar(len(finished_tests), sub_num, prefix = 'Tests Done:', suffix = 'Complete', length = 50) + if len(finished_tests) == sub_num: + self.write("ok") + print() + create_summary() + print("Test Summary in summary.txt") + sys.exit() + self.write("ok") + +def create_summary(): + success = [] + failed = [] + for i in range(1, sub_num + 1): + if expected_output == finished_tests[str(i)]: + success.append(i) + else: + failed.append(i) + with open(os.path.join(test_dir, "summary.txt"), 'w') as f: + f.write("Total Time: %d seconds\n" % (time.time() - start_time)) + f.write("Total Succeeded: %d / %d\n" % (len(success), sub_num)) + f.write("Total Failed: %d / %d\n" % (len(failed), sub_num)) + f.write("\n===========================================================\n") + f.write("The expected value is:\n") + f.write(expected_output) + f.write("\n\n===========================================================\n") + f.write("Failed Cases:\n") + for i in range(1, len(failed)): + f.write("Test Case #%d: %s\n" % (i, finished_tests[str(i)])) + +def make_app(): + return tornado.web.Application([ + (r"/autograde_done", AutogradeDoneHandler), + ]) + +async def notifyServer(): + app = make_app() + app.listen(8888) + printProgressBar(0, sub_num, prefix = 'Tests Done:', suffix = 'Complete', length = 50) + shutdown_event = asyncio.Event() + await shutdown_event.wait() + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Stress test script for Tango") + parser.add_argument('--test_dir', type=str, required=True, help="Directory to run the test in") + + args = parser.parse_args() + + dirname = os.path.basename(args.test_dir) + + test_dir = args.test_dir + + with open(os.path.join(args.test_dir, dirname + '.yaml'), 'r') as f: + data = yaml.load(f, Loader=yaml.SafeLoader) + + with open(os.path.join(args.test_dir, data["expected_output"]), 'r') as f: + expected_output = f.read() + + sub_num = data["num_submissions"] + finished_tests = dict() + start_time = time.time() + + subprocess.run("rm -rf %s/output" % args.test_dir, shell=True) + subprocess.run("mkdir %s/output" % args.test_dir, shell=True) + + print() + + run_stress_test( + data["num_submissions"], + data["submission_delay"], + data["autograder_image"], + os.path.join(args.test_dir, data["output_file"]), + data["tango_port"], + data["cli_path"], + dirname, + os.path.join(args.test_dir, 'input'), + data["instance_type"], + data["timeout"], + data["ec2"] + ) + + asyncio.run(notifyServer()) \ No newline at end of file diff --git a/worker.py b/worker.py index 1d197337..fea5ac32 100644 --- a/worker.py +++ b/worker.py @@ -152,7 +152,7 @@ def notifyServer(self, job): except Exception as e: self.log.debug("Error in notifyServer: %s" % str(e)) - def afterJobExecution(self, hdrfile, msg, returnVM): + def afterJobExecution(self, hdrfile, msg, returnVM, killVM=True): self.jobQueue.makeDead(self.job.id, msg) # Update the text that users see in the autodriver output file @@ -161,7 +161,8 @@ def afterJobExecution(self, hdrfile, msg, returnVM): os.chmod(self.job.outputFile, 0o644) # Thread exit after termination - self.detachVM(return_vm=returnVM) + if killVM: + self.detachVM(return_vm=returnVM) self.notifyServer(self.job) return @@ -254,6 +255,11 @@ def run(self): ) ) self.log.debug("Waiting for VM") + if (self.job.stopBefore == "waitvm"): + msg = "Execution stopped before %s" % self.job.stopBefore + returnVM = True + self.afterJobExecution(hdrfile, msg, returnVM, False) + return ret["waitvm"] = self.vmms.waitVM(vm, Config.WAITVM_TIMEOUT) self.log.debug("Waited for VM") @@ -287,6 +293,11 @@ def run(self): ) ) + if (self.job.stopBefore == "copyin"): + msg = "Execution stopped before %s" % self.job.stopBefore + returnVM = True + self.afterJobExecution(hdrfile, msg, returnVM, False) + return # Copy input files to VM ret["copyin"] = self.vmms.copyIn(vm, self.job.input) if ret["copyin"] != 0: @@ -306,6 +317,11 @@ def run(self): % (datetime.now().ctime(), self.job.name, self.job.id, ret["copyin"]) ) + if (self.job.stopBefore == "runjob"): + msg = "Execution stopped before %s" % self.job.stopBefore + returnVM = True + self.afterJobExecution(hdrfile, msg, returnVM, False) + return # Run the job on the virtual machine ret["runjob"] = self.vmms.runJob( vm, @@ -326,6 +342,11 @@ def run(self): % (datetime.now().ctime(), self.job.name, self.job.id, ret["runjob"]) ) + if (self.job.stopBefore == "copyout"): + msg = "Execution stopped before %s" % self.job.stopBefore + returnVM = True + self.afterJobExecution(hdrfile, msg, returnVM, False) + return # Copy the output back. ret["copyout"] = self.vmms.copyOut(vm, self.job.outputFile) if ret["copyout"] != 0: From 1c506a21ffaa8606c6bd4aa8926ffb5cba061bfa Mon Sep 17 00:00:00 2001 From: Kester Date: Sun, 16 Feb 2025 11:56:28 -0500 Subject: [PATCH 12/29] Incorporated PDL correctness changes --- jobManager.py | 14 ++++++++++++-- preallocator.py | 1 + tangoObjects.py | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/jobManager.py b/jobManager.py index c31b9bc4..2c3916e9 100644 --- a/jobManager.py +++ b/jobManager.py @@ -116,8 +116,11 @@ def __manage(self): Worker(job, vmms, self.jobQueue, self.preallocator, preVM).start() except Exception as err: - self.log.error("job failed during creation %d %s" % (job.id, str(err))) - self.jobQueue.makeDead(job.id, str(err)) + if job is None: + self.log.info("job_manager: job is None") + else: + self.log.error("job failed during creation %d %s" % (job.id, str(err))) + self.jobQueue.makeDead(job.id, str(err)) if __name__ == "__main__": @@ -133,6 +136,13 @@ def __manage(self): tango.resetTango(tango.preallocator.vmms) for key in tango.preallocator.machines.keys(): tango.preallocator.machines.set(key, [[], TangoQueue(key)]) + + # The above call sets the total pool empty. But the free pool which + # is a queue in redis, may not be empty. When the job manager restarts, + # resetting the free queue using the key doesn't change its content. + # Therefore we empty the queue, thus the free pool, to keep it consistent + # with the total pool. + tango.preallocator.machines.get(key)[1].make_empty() jobs = JobManager(tango.jobQueue) print("Starting the stand-alone Tango JobManager") diff --git a/preallocator.py b/preallocator.py index 9d7670e9..93e9c822 100644 --- a/preallocator.py +++ b/preallocator.py @@ -47,6 +47,7 @@ def update(self, vm, num): self.lock.acquire() if vm.name not in self.machines: self.machines.set(vm.name, [[], TangoQueue(vm.name)]) + self.machines.get(vm.name)[1].make_empty() self.log.debug("Creating empty pool of %s instances" % (vm.name)) self.lock.release() diff --git a/tangoObjects.py b/tangoObjects.py index 2dc03dbe..628ef213 100644 --- a/tangoObjects.py +++ b/tangoObjects.py @@ -319,6 +319,12 @@ def remove(self, item): def _clean(self): self.__db.delete(self.key) + def make_empty(self): + while True: + item = self.__db.lpop(self.key) + if item is None: + break + # This is an abstract class that decides on # if we should initiate a TangoRemoteDictionary or TangoNativeDictionary From b7531184d733630ef43e31938d34cc10e0c8b083 Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 20:46:39 -0500 Subject: [PATCH 13/29] Added some stabilization time --- vmms/ec2SSH.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index e05cc1d0..9b309e31 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -506,6 +506,10 @@ def waitVM(self, vm, max_secs): self.log.debug("VM %s: ssh returned with %d" % (vm.name, ret)) if (ret != -1) and (ret != 255): + additional_wait = 10 # seconds + self.log.info("Instance %s is ready. Waiting an additional %d seconds for stabilization.", vm.name, + additional_wait) + time.sleep(additional_wait) return 0 # Sleep a bit before trying again @@ -541,7 +545,6 @@ def copyIn(self, vm, inputFiles, job_id): if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): self.log.info("Error: Invalid inputFiles Structure, job: %s" % (job_id)) - for file in inputFiles: self.log.info("%s - %s" % (file.localFile, file.destFile)) ret = timeout_with_retries( From e6c19f3c851ea494c25f87309b477bac68caf71a Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 21:29:14 -0500 Subject: [PATCH 14/29] Changed stabilization --- vmms/ec2SSH.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 9b309e31..65a34c76 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -507,8 +507,8 @@ def waitVM(self, vm, max_secs): if (ret != -1) and (ret != 255): additional_wait = 10 # seconds - self.log.info("Instance %s is ready. Waiting an additional %d seconds for stabilization.", vm.name, - additional_wait) + self.log.info("Instance %s is ready. Waiting an additional %d seconds for stabilization." % (vm.name, + additional_wait)) time.sleep(additional_wait) return 0 @@ -540,7 +540,7 @@ def copyIn(self, vm, inputFiles, job_id): self.log.info("Return Code: %s, job: %s" % (result.returncode, job_id)) if result.stderr != 0: self.log.info("Standard Error: %s, job: %s" % (result.stderr, job_id)) - + # Validate inputFiles structure if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): self.log.info("Error: Invalid inputFiles Structure, job: %s" % (job_id)) @@ -573,14 +573,14 @@ def runJob(self, vm, runTimeout, maxOutputFileSize, disableNetwork): ) # Setting ulimits for VM and running job runcmd = ( - "/usr/bin/time --output=time.out autodriver \ + "/usr/bin/time --output=time.out autodriver \ -u %d -f %d -t %d -o %d autolab > output 2>&1 " - % ( - config.Config.VM_ULIMIT_USER_PROC, - config.Config.VM_ULIMIT_FILE_SIZE, - runTimeout, - maxOutputFileSize, - ) + % ( + config.Config.VM_ULIMIT_USER_PROC, + config.Config.VM_ULIMIT_FILE_SIZE, + runTimeout, + maxOutputFileSize, + ) ) # no logging for now @@ -661,9 +661,9 @@ def destroyVM(self, vm): self.log.debug("no instances found with instance id %s", vm.instance_id) # Keep the vm and mark with meaningful tags for debugging if ( - hasattr(config.Config, "KEEP_VM_AFTER_FAILURE") - and config.Config.KEEP_VM_AFTER_FAILURE - and vm.keep_for_debugging + hasattr(config.Config, "KEEP_VM_AFTER_FAILURE") + and config.Config.KEEP_VM_AFTER_FAILURE + and vm.keep_for_debugging ): self.log.info("Will keep VM %s for further debugging" % vm.name) # delete original name tag and replace it with "failed-xyz" @@ -773,7 +773,7 @@ def getPartialOutput(self, vm): ) sshcmd = ( - ["ssh"] + self.ssh_flags + ["%s@%s" % (self.ec2User, domain_name), runcmd] + ["ssh"] + self.ssh_flags + ["%s@%s" % (self.ec2User, domain_name), runcmd] ) output = subprocess.check_output(sshcmd, stderr=subprocess.STDOUT).decode( From 6facb4e2761d34d0f7903edb00c22bfa339eb8dc Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 21:34:56 -0500 Subject: [PATCH 15/29] Added timeout using aws waiter --- vmms/ec2SSH.py | 67 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 65a34c76..6b714642 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -378,34 +378,47 @@ def initializeVM(self, vm): if not newInstance: raise ValueError("Cannot find new instance for %s" % vm.name) - # Wait for instance to reach 'running' state - start_time = time.time() - while True: - - filters = [{"Name": "instance-state-name", "Values": ["running"]}] - instances = self.boto3resource.instances.filter(Filters=filters) - instanceRunning = False - - # reload the state of the new instance - try_load_instance(newInstance) - for inst in instances.filter(InstanceIds=[newInstance.id]): - self.log.debug("VM %s %s: is running" % (vm.name, newInstance.id)) - instanceRunning = True - - if instanceRunning: - break - - if time.time() - start_time > config.Config.INITIALIZEVM_TIMEOUT: - raise ValueError( - "VM %s %s: timeout (%d seconds) before reaching 'running' state" - % (vm.name, newInstance.id, config.Config.TIMER_POLL_INTERVAL) - ) + # Use an AWS waiter to wait for the instance to reach the "running" state. + ec2_client = boto3.client("ec2") + waiter = ec2_client.get_waiter("instance_running") + max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL + self.log.info("Waiting for instance %s (%s) to reach 'running' state...", vm.name, newInstance.id) + waiter.wait( + InstanceIds=[newInstance.id], + WaiterConfig={ + "Delay": config.Config.TIMER_POLL_INTERVAL, + "MaxAttempts": max_attempts, + }, + ) - self.log.debug( - "VM %s %s: Waiting to reach 'running' from 'pending'" - % (vm.name, newInstance.id) - ) - time.sleep(config.Config.TIMER_POLL_INTERVAL) + # # Wait for instance to reach 'running' state + # start_time = time.time() + # while True: + # + # filters = [{"Name": "instance-state-name", "Values": ["running"]}] + # instances = self.boto3resource.instances.filter(Filters=filters) + # instanceRunning = False + # + # # reload the state of the new instance + # try_load_instance(newInstance) + # for inst in instances.filter(InstanceIds=[newInstance.id]): + # self.log.debug("VM %s %s: is running" % (vm.name, newInstance.id)) + # instanceRunning = True + # + # if instanceRunning: + # break + # + # if time.time() - start_time > config.Config.INITIALIZEVM_TIMEOUT: + # raise ValueError( + # "VM %s %s: timeout (%d seconds) before reaching 'running' state" + # % (vm.name, newInstance.id, config.Config.TIMER_POLL_INTERVAL) + # ) + # + # self.log.debug( + # "VM %s %s: Waiting to reach 'running' from 'pending'" + # % (vm.name, newInstance.id) + # ) + # time.sleep(config.Config.TIMER_POLL_INTERVAL) # Assign name to EC2 instance self.boto3resource.create_tags( From 53a2858f130619434a14d20a2297bae6672526b6 Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 21:36:05 -0500 Subject: [PATCH 16/29] Syntax issues --- vmms/ec2SSH.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 6b714642..c06978c0 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -382,7 +382,7 @@ def initializeVM(self, vm): ec2_client = boto3.client("ec2") waiter = ec2_client.get_waiter("instance_running") max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL - self.log.info("Waiting for instance %s (%s) to reach 'running' state...", vm.name, newInstance.id) + self.log.info("Waiting for instance %s (%s) to reach 'running' state..." % (vm.name, newInstance.id)) waiter.wait( InstanceIds=[newInstance.id], WaiterConfig={ From e23e8e3b371c319414ae160efe593b7567b61ced Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 22:06:13 -0500 Subject: [PATCH 17/29] Syntax issues and logging --- vmms/ec2SSH.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index c06978c0..4d4e24cb 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -379,6 +379,7 @@ def initializeVM(self, vm): raise ValueError("Cannot find new instance for %s" % vm.name) # Use an AWS waiter to wait for the instance to reach the "running" state. + self.log.info("Waiting for new instance to reach running state for %s" % vm.name); ec2_client = boto3.client("ec2") waiter = ec2_client.get_waiter("instance_running") max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL @@ -519,7 +520,7 @@ def waitVM(self, vm, max_secs): self.log.debug("VM %s: ssh returned with %d" % (vm.name, ret)) if (ret != -1) and (ret != 255): - additional_wait = 10 # seconds + additional_wait = 2 # seconds self.log.info("Instance %s is ready. Waiting an additional %d seconds for stabilization." % (vm.name, additional_wait)) time.sleep(additional_wait) @@ -556,7 +557,7 @@ def copyIn(self, vm, inputFiles, job_id): # Validate inputFiles structure if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): - self.log.info("Error: Invalid inputFiles Structure, job: %s" % (job_id)) + self.log.info("Error: Invalid inputFiles Structure, job: %s" % job_id) for file in inputFiles: self.log.info("%s - %s" % (file.localFile, file.destFile)) @@ -570,7 +571,7 @@ def copyIn(self, vm, inputFiles, job_id): config.Config.COPYIN_TIMEOUT, ) if ret != 0: - self.log.info("Copy-in Error: SCP failure, job: %s" % (job_id)) + self.log.info("Copy-in Error: SCP failure, job: %s" % job_id) return ret return 0 From d78f88bd1ba1e8736f49bf97de140b84797b6b92 Mon Sep 17 00:00:00 2001 From: Soma Narita Date: Wed, 19 Feb 2025 22:34:27 -0500 Subject: [PATCH 18/29] readme updated --- README.md | 73 +++++++++++++++++++++++++---- dump.rdb | Bin 117450 -> 122213 bytes tests/sample_test/sample_test.yaml | 1 + tests/stressTest.py | 12 +++-- 4 files changed, 73 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index d6bcb348..2da007a5 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,7 @@ -Tango -====== +# Tango Tango is a standalone RESTful Web service that runs and manages jobs. A job is a set of files that must satisfy the following constraints: @@ -16,13 +15,13 @@ Upon receiving a job, Tango will copy all of the job's input files into a VM, ru A brief overview of the Tango respository: -* `tango.py` - Main tango server -* `jobQueue.py` - Manages the job queue -* `jobManager.py` - Assigns jobs to free VMs -* `worker.py` - Shepherds a job through its execution -* `preallocator.py` - Manages pools of VMs -* `vmms/` - VMMS library implementations -* `restful_tango/` - HTTP server layer on the main Tango +- `tango.py` - Main tango server +- `jobQueue.py` - Manages the job queue +- `jobManager.py` - Assigns jobs to free VMs +- `worker.py` - Shepherds a job through its execution +- `preallocator.py` - Manages pools of VMs +- `vmms/` - VMMS library implementations +- `restful_tango/` - HTTP server layer on the main Tango Tango was developed as a distributed grading system for [Autolab](https://github.com/autolab/Autolab) at Carnegie Mellon University and has been extensively used for autograding programming assignments in CMU courses. @@ -35,7 +34,63 @@ Please feel free to use Tango at your school/organization. If you run into any p 3. [Read the documentation for the VMMS API](https://docs.autolabproject.com/tango-vmms/). 4. [Test whether Tango is set up properly and can process jobs](https://docs.autolabproject.com/tango-cli/). +## Stress Testing Tango + +To stress test Tango by running a large number of submissions, use `stressTest.py`. Currently, this is not a feature on the master branch. To use this feature, go on the `copy-in`. + +### Setting up the testing directory + +Create your testing directory by copying the  `sample_test` directory into the `my_tests` directory. + +``` +cp -r sample_tests my_tests/ +``` + +A brief overview of the testing directory + +- `input` - Directory to put your input files +- `output` - Directory for the autograder output for each of the test submissions +- `.yaml` - Yaml file to configure the stress test +- `expected_output.txt` - Expected JSON output of the autograder +- `summary.txt` - Summary of the autograder outputs +- `log.txt` - Log of the submissions + +First, rename the `sample_test.yaml` to be `.yaml` + +``` +mv sample_test.yaml .yaml +``` + +Next, update the Yaml file. + +```yaml +num_submissions: 5 +submission_delay: 0.1 +autograder_image: +output_file: log.txt +tango_port: 3001 +cli_path: /clients/tango-cli.py +instance_type: +timeout: 180 +ec2: True +expected_output: expected_output.txt +stop_before: +``` + +After creating the Yaml file, copy the `autograde-Makefile`, `autograde.tar` and the file to submit in the `input` directory. + +### Running the stress test + +``` +virtualenv env +source env/bin/activate +pip install -r requirements.txt +cd /tests +python3 stressTest.py --test_dir my_tests/ +``` + ## Python 2 Support + Tango now runs on Python 3. However, there is a legacy branch [master-python2](https://github.com/autolab/Tango/tree/master-python2) which is a snapshot of the last Python 2 Tango commit for legacy reasons. You are strongly encouraged to upgrade to the current Python 3 version of Tango if you are still on the Python 2 version, as future enhancements and bug fixes will be focused on the current master. We will not be backporting new features from `master` to `master-python2`. diff --git a/dump.rdb b/dump.rdb index 55d6d316c583e5d479bd0097a31c6bd2292f9473..9d0a0f7a7fc38f28947909b234ab9d89d0fc346e 100644 GIT binary patch literal 122213 zcmeHwYkVAMdGGA5wA$6pNu0#7bMfp-PV5A&=YCn=R+jD9PHcxbB=IGYW@l$DC6;8Q zl@mh(GA)pVr3JF>X?vi^xlmG|7oZK70uJhFKlH{qO`&kwGL922E!UP(8rq)oyfd>q zv)cFFnU#uSE&Cz)z%L(SGXH&^_kVlt+`VhxVTNJ3SL0JgZfttsv@z8#r-T&uYN!1_ zWXB5A=QFRi>xHp#H8wMC zENwbldbG5$7}KVw$4*Qbxzgjsjwz!sHD<)8OSe(Q@agf=D4iK$qX#s7bZo*fL*n|j z32odc6;~TNH_Wm8@X3>>$A?*Ac$yPS#rCoBtF#kFX|$)kFEfu?RljGXh#PF=%(aongUQG#f zG{o|=8^Xh5IeI(%lZU7o`t9L^#W209t>57)dZhm1nXd z&kFe*Pw$|5OsX$jICF~rVnDf;(T7q58GFis8UC#QyUMt0`JiLr?jiK`;* z6O)CJPg5~^jv5~MNcgdtEd5Hy#HpD=>Aup&#Eqf&zD##`&)CTe;lB3x$w^&1IkLLD zxJjR!nVL3EYT4<{^zChhfx`4C-AxT=x_UNiGlj_$Q(DeQ6|||uGgOYIXC?TTYF`(b z$&U7){lm!UO~sUX-JR_N2eb!`eCB^dMmH5>Ce>}W?V|?F)%#{Y932?dCURpFBXjg# z>T)xFRmV)$D0WWH6cVdvKTB;kSHEF)Bei+(h49HjitdRHu%*%NV&~wh$nXP`S-Lk= zj3*viHI_f~hC6RB6>lCb6i%f#Z`ST?ADx^oq!pUF5K=E6&P`4jJH~R`c&1eBK%XCd zI9|H#lg0MJl%^Yl&#o`3cg+~|9wSS$EX|5(K~8f#%`u$#$Y3sK$=!pppKZAX?@=_qhAR>q>YW-ll-=M z-7)GOGkPq-ry2RIYOekDc6tgxac1O!3$c-Kskq0C9SO10>=FHrHd>!NHI}$G^IV1`+n9 zm5lwKURFtQjGSU6CdI1s{h6CA_-6qAuLtO$Wc{v_y& zTz%-rj)gde2z(&`@RhVc0KRzX0$)PF??b>}`73|7wepK8S%%?HT>06mmEVRvEAd%2 zmy;!qWdvE(J+N=B{J~()3k|?tz{8#wYhcgA`ydGHNjpE!Td*f?`~Z7i!owc+eSz`E zeME%4gs|^(m+rpbhk!phKlFcg|0CM>zuvxr-}>F%q5!)-pW;*S%p<+^#VX+2Z+&>; zD|tnfb(zZwl2G;5zdlyrQsZO#)MN?!)W6c+^*;r>{s&>#|7~m6f7#vjH+Xjaq-WRf zuX^f73j@>I_^Ffh+vu*?=27G1$;lKv{oe&^{;FA)f>-=i_ACD*_L{$XZ*PSUaGv|` zEYR{KHNDFu5BW(1>=W}tUug

BGJIun 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 diff --git a/tests/sample_test/sample_test.yaml b/tests/sample_test/sample_test.yaml index 587f5a10..43dd5030 100644 --- a/tests/sample_test/sample_test.yaml +++ b/tests/sample_test/sample_test.yaml @@ -8,3 +8,4 @@ instance_type: t2.micro timeout: 180 ec2: True expected_output: expected_output.txt +stop_before: diff --git a/tests/stressTest.py b/tests/stressTest.py index 3a35e39e..bd4f02f7 100644 --- a/tests/stressTest.py +++ b/tests/stressTest.py @@ -37,7 +37,7 @@ def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, print() def run_stress_test(num_submissions, submission_delay, autograder_image, output_file, tango_port, cli_path, - job_name, job_path, instance_type, timeout, ec2): + job_name, job_path, instance_type, timeout, ec2, stopBefore): printProgressBar(0, num_submissions, prefix = 'Jobs Added:', suffix = 'Complete', length = 50) with open(output_file, 'a') as f: f.write(f"Stress testing with {num_submissions} submissions\n") @@ -56,6 +56,8 @@ def run_stress_test(num_submissions, submission_delay, autograder_image, output_ ] if ec2: command += ['--ec2'] + if stopBefore is not None: + command += ['--stopBefore', stopBefore] subprocess.run(command, stdout=f, stderr=f) f.write(f"Submission {i} completed\n") printProgressBar(i, num_submissions, prefix = 'Jobs Added:', suffix = 'Complete', length = 50) @@ -78,6 +80,7 @@ def post(self): printProgressBar(len(finished_tests), sub_num, prefix = 'Tests Done:', suffix = 'Complete', length = 50) if len(finished_tests) == sub_num: self.write("ok") + self.flush() print() create_summary() print("Test Summary in summary.txt") @@ -101,8 +104,8 @@ def create_summary(): f.write(expected_output) f.write("\n\n===========================================================\n") f.write("Failed Cases:\n") - for i in range(1, len(failed)): - f.write("Test Case #%d: %s\n" % (i, finished_tests[str(i)])) + for i in range(0, len(failed)): + f.write("Test Case #%d: %s\n" % (failed[i], finished_tests[str(failed[i])])) def make_app(): return tornado.web.Application([ @@ -152,7 +155,8 @@ async def notifyServer(): os.path.join(args.test_dir, 'input'), data["instance_type"], data["timeout"], - data["ec2"] + data["ec2"], + data["stop_before"], ) asyncio.run(notifyServer()) \ No newline at end of file From c8263eea950e0f1248ae0dba1ec471739d7adbfc Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 22:50:22 -0500 Subject: [PATCH 19/29] Fixed client region --- vmms/ec2SSH.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index 4d4e24cb..c5762739 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -380,8 +380,7 @@ def initializeVM(self, vm): # Use an AWS waiter to wait for the instance to reach the "running" state. self.log.info("Waiting for new instance to reach running state for %s" % vm.name); - ec2_client = boto3.client("ec2") - waiter = ec2_client.get_waiter("instance_running") + waiter = self.boto3client.get_waiter("instance_running") max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL self.log.info("Waiting for instance %s (%s) to reach 'running' state..." % (vm.name, newInstance.id)) waiter.wait( From 3c22e1f3aabde92dd2e80b709a4abc0f72cf49d3 Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 23:00:40 -0500 Subject: [PATCH 20/29] Revert stop before --- tangoObjects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tangoObjects.py b/tangoObjects.py index 34860f08..1c7e8c46 100644 --- a/tangoObjects.py +++ b/tangoObjects.py @@ -121,7 +121,7 @@ def __init__( self.accessKeyId = accessKeyId self.accessKey = accessKey self.disableNetwork = disableNetwork - self.stopBefore = stopBefore + self.stopBefore = "" def __repr__(self): self.syncRemote() From 1b83595e6ebf3e7760613afac3196f4a27e731d0 Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 23:16:16 -0500 Subject: [PATCH 21/29] Revert sleep --- tangoObjects.py | 2 +- vmms/ec2SSH.py | 4 ---- worker.py | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tangoObjects.py b/tangoObjects.py index 1c7e8c46..03c33c58 100644 --- a/tangoObjects.py +++ b/tangoObjects.py @@ -121,7 +121,7 @@ def __init__( self.accessKeyId = accessKeyId self.accessKey = accessKey self.disableNetwork = disableNetwork - self.stopBefore = "" + self.stopBefore = "stopBefore" def __repr__(self): self.syncRemote() diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index c5762739..d1de7568 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -519,10 +519,6 @@ def waitVM(self, vm, max_secs): self.log.debug("VM %s: ssh returned with %d" % (vm.name, ret)) if (ret != -1) and (ret != 255): - additional_wait = 2 # seconds - self.log.info("Instance %s is ready. Waiting an additional %d seconds for stabilization." % (vm.name, - additional_wait)) - time.sleep(additional_wait) return 0 # Sleep a bit before trying again diff --git a/worker.py b/worker.py index f768a502..0c6b6614 100644 --- a/worker.py +++ b/worker.py @@ -255,7 +255,7 @@ def run(self): ) ) self.log.debug("Waiting for VM") - if (self.job.stopBefore == "waitvm"): + if self.job.stopBefore == "waitvm": msg = "Execution stopped before %s" % self.job.stopBefore returnVM = True self.afterJobExecution(hdrfile, msg, returnVM, False) From 47388c9a1c0340af6047b6d67c5ae916bb63dd58 Mon Sep 17 00:00:00 2001 From: Kester Date: Wed, 19 Feb 2025 23:40:24 -0500 Subject: [PATCH 22/29] Revert aws waiter --- vmms/ec2SSH.py | 80 +++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index d1de7568..aac4e921 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -378,47 +378,47 @@ def initializeVM(self, vm): if not newInstance: raise ValueError("Cannot find new instance for %s" % vm.name) - # Use an AWS waiter to wait for the instance to reach the "running" state. - self.log.info("Waiting for new instance to reach running state for %s" % vm.name); - waiter = self.boto3client.get_waiter("instance_running") - max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL - self.log.info("Waiting for instance %s (%s) to reach 'running' state..." % (vm.name, newInstance.id)) - waiter.wait( - InstanceIds=[newInstance.id], - WaiterConfig={ - "Delay": config.Config.TIMER_POLL_INTERVAL, - "MaxAttempts": max_attempts, - }, - ) + # # Use an AWS waiter to wait for the instance to reach the "running" state. + # self.log.info("Waiting for new instance to reach running state for %s" % vm.name); + # waiter = self.boto3client.get_waiter("instance_running") + # max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL + # self.log.info("Waiting for instance %s (%s) to reach 'running' state..." % (vm.name, newInstance.id)) + # waiter.wait( + # InstanceIds=[newInstance.id], + # WaiterConfig={ + # "Delay": config.Config.TIMER_POLL_INTERVAL, + # "MaxAttempts": max_attempts, + # }, + # ) + + # Wait for instance to reach 'running' state + start_time = time.time() + while True: + + filters = [{"Name": "instance-state-name", "Values": ["running"]}] + instances = self.boto3resource.instances.filter(Filters=filters) + instanceRunning = False + + # reload the state of the new instance + try_load_instance(newInstance) + for inst in instances.filter(InstanceIds=[newInstance.id]): + self.log.debug("VM %s %s: is running" % (vm.name, newInstance.id)) + instanceRunning = True + + if instanceRunning: + break + + if time.time() - start_time > config.Config.INITIALIZEVM_TIMEOUT: + raise ValueError( + "VM %s %s: timeout (%d seconds) before reaching 'running' state" + % (vm.name, newInstance.id, config.Config.TIMER_POLL_INTERVAL) + ) - # # Wait for instance to reach 'running' state - # start_time = time.time() - # while True: - # - # filters = [{"Name": "instance-state-name", "Values": ["running"]}] - # instances = self.boto3resource.instances.filter(Filters=filters) - # instanceRunning = False - # - # # reload the state of the new instance - # try_load_instance(newInstance) - # for inst in instances.filter(InstanceIds=[newInstance.id]): - # self.log.debug("VM %s %s: is running" % (vm.name, newInstance.id)) - # instanceRunning = True - # - # if instanceRunning: - # break - # - # if time.time() - start_time > config.Config.INITIALIZEVM_TIMEOUT: - # raise ValueError( - # "VM %s %s: timeout (%d seconds) before reaching 'running' state" - # % (vm.name, newInstance.id, config.Config.TIMER_POLL_INTERVAL) - # ) - # - # self.log.debug( - # "VM %s %s: Waiting to reach 'running' from 'pending'" - # % (vm.name, newInstance.id) - # ) - # time.sleep(config.Config.TIMER_POLL_INTERVAL) + self.log.debug( + "VM %s %s: Waiting to reach 'running' from 'pending'" + % (vm.name, newInstance.id) + ) + time.sleep(config.Config.TIMER_POLL_INTERVAL) # Assign name to EC2 instance self.boto3resource.create_tags( From 4d24ee54d8e174baf1e9a699c22127118a874979 Mon Sep 17 00:00:00 2001 From: Evan Shi <14984764+evanyeyeye@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:35:44 -0400 Subject: [PATCH 23/29] Update .gitignore --- .gitignore | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 02540cd2..0bc5e9ba 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,7 @@ scripts/*.sh vmms/id_rsa* courselabs/* dockerTmp/* -id_ed25519 -id_ed25519.pub + # config config.py @@ -31,8 +30,8 @@ pip-selfcheck.json *.bak # Tests -tests/my_tests/* -tests/sample_test/output -tests/sample_test/output/* -tests/sample_test/log.txt -tests/sample_test/summary.txt \ No newline at end of file +tests/* +!tests/*.py +!tests/sample_test/input +!tests/sample_test/sample_test.yaml +!tests/sample_test/expected_output.yaml From f609b07a149f547a791ba76dc8e21f0504a66786 Mon Sep 17 00:00:00 2001 From: Evan Shi <14984764+evanyeyeye@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:37:13 -0400 Subject: [PATCH 24/29] Clean dump --- .gitignore | 3 +++ dump.rdb | Bin 117450 -> 0 bytes 2 files changed, 3 insertions(+) delete mode 100644 dump.rdb diff --git a/.gitignore b/.gitignore index 0bc5e9ba..deda9fd6 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,9 @@ pip-selfcheck.json # Backup files *.bak +# Redis +*.rdb + # Tests tests/* !tests/*.py diff --git a/dump.rdb b/dump.rdb deleted file mode 100644 index 55d6d316c583e5d479bd0097a31c6bd2292f9473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117450 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 From 158f0af2fc5d2d1dc50c6aa3087008cd6a527156 Mon Sep 17 00:00:00 2001 From: Evan Shi <14984764+evanyeyeye@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:50:48 -0400 Subject: [PATCH 25/29] Quality improvements --- jobManager.py | 19 ++++--- vmms/ec2SSH.py | 145 ++++++++++++++++++++++++++++--------------------- 2 files changed, 93 insertions(+), 71 deletions(-) diff --git a/jobManager.py b/jobManager.py index 2be2147f..da47012a 100644 --- a/jobManager.py +++ b/jobManager.py @@ -11,9 +11,9 @@ # import copy -import time import logging import threading +import time import traceback from datetime import datetime @@ -21,8 +21,6 @@ from config import Config from tangoObjects import TangoQueue from worker import Worker -from preallocator import Preallocator -from jobQueue import JobQueue class JobManager(object): @@ -77,9 +75,7 @@ def __manage(self): if job.vm.ec2_vmms: from vmms.ec2SSH import Ec2SSH - self.log.error('beforeec2ssh') vmms = Ec2SSH(job.accessKeyId, job.accessKey) - self.log.error('afterec2ssh') newVM = copy.deepcopy(job.vm) newVM.id = self._getNextID() @@ -89,11 +85,12 @@ def __manage(self): self.log.error("ERROR initialization VM: %s", e) self.log.error(traceback.format_exc()) if preVM is None: - raise Exception("EC2 SSH VM initialization failed: see log") + raise Exception( + "EC2 SSH VM initialization failed: see log" + ) else: # Try to find a vm on the free list and allocate it to # the worker if successful. - self.log.error('huh?') if Config.REUSE_VMS: preVM = vm else: @@ -117,13 +114,17 @@ def __manage(self): ) # Mark the job assigned self.jobQueue.assignJob(job.id, preVM) - Worker(job, vmms, self.jobQueue, self.preallocator, preVM).start() + Worker( + job, vmms, self.jobQueue, self.preallocator, preVM + ).start() except Exception as err: if job is None: self.log.info("job_manager: job is None") else: - self.log.error("job failed during creation %d %s" % (job.id, str(err))) + self.log.error( + "job failed during creation %d %s" % (job.id, str(err)) + ) self.jobQueue.makeDead(job.id, str(err)) diff --git a/vmms/ec2SSH.py b/vmms/ec2SSH.py index aac4e921..b2621192 100644 --- a/vmms/ec2SSH.py +++ b/vmms/ec2SSH.py @@ -8,22 +8,19 @@ # Ec2Exception - EC2 raises this if it encounters any problem # ec2CallError - raised by ec2Call() function # -# TODO: this currently probably does not work on Python 3 yet -import subprocess +import logging import os import re -import time -import logging +import subprocess import threading -from concurrent.futures import ThreadPoolExecutor -import config +import time + import backoff import boto3 from botocore.exceptions import ClientError -import pytz - +import config from tangoObjects import TangoMachine # suppress most boto logging @@ -223,13 +220,6 @@ def __init__(self, accessKeyId=None, accessKey=None): taggedAMIs = [self.img2ami[key].id for key in self.img2ami] ignoredAMIs = list(set(imageAMIs) - set(taggedAMIs)) - self.log.info("imageAMIs") - self.log.info(imageAMIs) - self.log.info("taggedAMIs") - self.log.info(taggedAMIs) - self.log.info("ignoredAMIs") - self.log.info(ignoredAMIs) - if len(ignoredAMIs) > 0: self.log.info( "Ignored images %s for lack of or ill-formed name tag" @@ -378,40 +368,38 @@ def initializeVM(self, vm): if not newInstance: raise ValueError("Cannot find new instance for %s" % vm.name) - # # Use an AWS waiter to wait for the instance to reach the "running" state. - # self.log.info("Waiting for new instance to reach running state for %s" % vm.name); - # waiter = self.boto3client.get_waiter("instance_running") - # max_attempts = config.Config.INITIALIZEVM_TIMEOUT // config.Config.TIMER_POLL_INTERVAL - # self.log.info("Waiting for instance %s (%s) to reach 'running' state..." % (vm.name, newInstance.id)) - # waiter.wait( - # InstanceIds=[newInstance.id], - # WaiterConfig={ - # "Delay": config.Config.TIMER_POLL_INTERVAL, - # "MaxAttempts": max_attempts, - # }, - # ) - # Wait for instance to reach 'running' state start_time = time.time() while True: - filters = [{"Name": "instance-state-name", "Values": ["running"]}] + filters = [ + {"Name": "instance-state-name", "Values": ["running"]} + ] instances = self.boto3resource.instances.filter(Filters=filters) instanceRunning = False # reload the state of the new instance try_load_instance(newInstance) for inst in instances.filter(InstanceIds=[newInstance.id]): - self.log.debug("VM %s %s: is running" % (vm.name, newInstance.id)) + self.log.debug( + "VM %s %s: is running" % (vm.name, newInstance.id) + ) instanceRunning = True if instanceRunning: break - if time.time() - start_time > config.Config.INITIALIZEVM_TIMEOUT: + if ( + time.time() - start_time + > config.Config.INITIALIZEVM_TIMEOUT + ): raise ValueError( "VM %s %s: timeout (%d seconds) before reaching 'running' state" - % (vm.name, newInstance.id, config.Config.TIMER_POLL_INTERVAL) + % ( + vm.name, + newInstance.id, + config.Config.TIMER_POLL_INTERVAL, + ) ) self.log.debug( @@ -422,7 +410,8 @@ def initializeVM(self, vm): # Assign name to EC2 instance self.boto3resource.create_tags( - Resources=[newInstance.id], Tags=[{"Key": "Name", "Value": vm.name}] + Resources=[newInstance.id], + Tags=[{"Key": "Name", "Value": vm.name}], ) self.log.info( @@ -524,9 +513,11 @@ def waitVM(self, vm, max_secs): # Sleep a bit before trying again time.sleep(config.Config.TIMER_POLL_INTERVAL) - def copyIn(self, vm, inputFiles, job_id): + def copyIn(self, vm, inputFiles, job_id=None): """copyIn - Copy input files to VM""" - self.log.info("copyIn %s - writing files" % self.instanceName(vm.id, vm.name)) + self.log.info( + "copyIn %s - writing files" % self.instanceName(vm.id, vm.name) + ) domain_name = self.domainName(vm) @@ -548,11 +539,18 @@ def copyIn(self, vm, inputFiles, job_id): self.log.info("%s for job %s" % (line, job_id)) self.log.info("Return Code: %s, job: %s" % (result.returncode, job_id)) if result.stderr != 0: - self.log.info("Standard Error: %s, job: %s" % (result.stderr, job_id)) + self.log.info( + "Standard Error: %s, job: %s" % (result.stderr, job_id) + ) # Validate inputFiles structure - if not inputFiles or not all(hasattr(file, 'localFile') and hasattr(file, 'destFile') for file in inputFiles): - self.log.info("Error: Invalid inputFiles Structure, job: %s" % job_id) + if not inputFiles or not all( + hasattr(file, "localFile") and hasattr(file, "destFile") + for file in inputFiles + ): + self.log.info( + "Error: Invalid inputFiles Structure, job: %s" % job_id + ) for file in inputFiles: self.log.info("%s - %s" % (file.localFile, file.destFile)) @@ -561,7 +559,8 @@ def copyIn(self, vm, inputFiles, job_id): + self.ssh_flags + [ file.localFile, - "%s@%s:~/autolab/%s" % (self.ec2User, domain_name, file.destFile), + "%s@%s:~/autolab/%s" + % (self.ec2User, domain_name, file.destFile), ], config.Config.COPYIN_TIMEOUT, ) @@ -582,19 +581,21 @@ def runJob(self, vm, runTimeout, maxOutputFileSize, disableNetwork): ) # Setting ulimits for VM and running job runcmd = ( - "/usr/bin/time --output=time.out autodriver \ + "/usr/bin/time --output=time.out autodriver \ -u %d -f %d -t %d -o %d autolab > output 2>&1 " - % ( - config.Config.VM_ULIMIT_USER_PROC, - config.Config.VM_ULIMIT_FILE_SIZE, - runTimeout, - maxOutputFileSize, - ) + % ( + config.Config.VM_ULIMIT_USER_PROC, + config.Config.VM_ULIMIT_FILE_SIZE, + runTimeout, + maxOutputFileSize, + ) ) # no logging for now ret = timeout( - ["ssh"] + self.ssh_flags + ["%s@%s" % (self.ec2User, domain_name), runcmd], + ["ssh"] + + self.ssh_flags + + ["%s@%s" % (self.ec2User, domain_name), runcmd], runTimeout * 2, ) @@ -606,7 +607,9 @@ def copyOut(self, vm, destFile): outputFile on the Tango host. """ self.log.info( - "copyOut %s - writing to %s", self.instanceName(vm.id, vm.name), destFile + "copyOut %s - writing to %s", + self.instanceName(vm.id, vm.name), + destFile, ) domain_name = self.domainName(vm) @@ -651,7 +654,10 @@ def copyOut(self, vm, destFile): return timeout( ["scp"] + self.ssh_flags - + ["%s@%s:output" % (config.Config.EC2_USER_NAME, domain_name), destFile], + + [ + "%s@%s:output" % (config.Config.EC2_USER_NAME, domain_name), + destFile, + ], config.Config.COPYOUT_TIMEOUT, ) @@ -667,12 +673,14 @@ def destroyVM(self, vm): InstanceIds=[vm.instance_id] ) if not instances: - self.log.debug("no instances found with instance id %s", vm.instance_id) + self.log.debug( + "no instances found with instance id %s", vm.instance_id + ) # Keep the vm and mark with meaningful tags for debugging if ( - hasattr(config.Config, "KEEP_VM_AFTER_FAILURE") - and config.Config.KEEP_VM_AFTER_FAILURE - and vm.keep_for_debugging + hasattr(config.Config, "KEEP_VM_AFTER_FAILURE") + and config.Config.KEEP_VM_AFTER_FAILURE + and vm.keep_for_debugging ): self.log.info("Will keep VM %s for further debugging" % vm.name) # delete original name tag and replace it with "failed-xyz" @@ -694,7 +702,9 @@ def destroyVM(self, vm): if not self.useDefaultKeyPair: self.deleteKeyPair() except Exception as e: - self.log.error("destroyVM failed: %s for vm %s" % (e, vm.instance_id)) + self.log.error( + "destroyVM failed: %s for vm %s" % (e, vm.instance_id) + ) Ec2SSH.release_vm_semaphore() @@ -708,7 +718,10 @@ def getVMs(self): try: vms = list() filters = [ - {"Name": "instance-state-name", "Values": ["running", "pending"]} + { + "Name": "instance-state-name", + "Values": ["running", "pending"], + } ] # gets all running instances instances = self.boto3resource.instances.filter(Filters=filters) @@ -725,8 +738,13 @@ def getVMs(self): instance.tags, "Name" ) # inst name PREFIX-serial-IMAGE # Name tag is the standard form of prefix-serial-image - if not (instName and re.match("%s-" % config.Config.PREFIX, instName)): - self.log.debug("getVMs: Instance id %s skipped" % vm.instance_id) + if not ( + instName + and re.match("%s-" % config.Config.PREFIX, instName) + ): + self.log.debug( + "getVMs: Instance id %s skipped" % vm.instance_id + ) continue # instance without name tag or proper prefix vm.name = instName @@ -740,7 +758,8 @@ def getVMs(self): vms.append(vm) self.log.debug( - "getVMs: Instance id %s, name %s" % (vm.instance_id, vm.name) + "getVMs: Instance id %s, name %s" + % (vm.instance_id, vm.name) ) except Exception as e: self.log.debug("getVMs Failed: %s" % e) @@ -782,11 +801,13 @@ def getPartialOutput(self, vm): ) sshcmd = ( - ["ssh"] + self.ssh_flags + ["%s@%s" % (self.ec2User, domain_name), runcmd] + ["ssh"] + + self.ssh_flags + + ["%s@%s" % (self.ec2User, domain_name), runcmd] ) - output = subprocess.check_output(sshcmd, stderr=subprocess.STDOUT).decode( - "utf-8" - ) + output = subprocess.check_output( + sshcmd, stderr=subprocess.STDOUT + ).decode("utf-8") return output From 20c89948b7944972e07f2e8867c631b0faef2120 Mon Sep 17 00:00:00 2001 From: Evan Shi <14984764+evanyeyeye@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:51:03 -0400 Subject: [PATCH 26/29] Fix gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index deda9fd6..cf9322d8 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,4 @@ tests/* !tests/*.py !tests/sample_test/input !tests/sample_test/sample_test.yaml -!tests/sample_test/expected_output.yaml +!tests/sample_test/expected_output.txt From 128a2e7512881e762b52c2023e225d97ecf85d31 Mon Sep 17 00:00:00 2001 From: Evan Shi <14984764+evanyeyeye@users.noreply.github.com> Date: Mon, 17 Mar 2025 15:51:56 -0400 Subject: [PATCH 27/29] Update .gitignore --- .gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitignore b/.gitignore index cf9322d8..2449cfd7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,3 @@ pip-selfcheck.json # Tests tests/* !tests/*.py -!tests/sample_test/input -!tests/sample_test/sample_test.yaml -!tests/sample_test/expected_output.txt From 54937614cc2d3cc4068e777665980ac871a5dd0a Mon Sep 17 00:00:00 2001 From: Soma Narita Date: Mon, 31 Mar 2025 13:16:20 -0400 Subject: [PATCH 28/29] fixed stressTest termination --- dump.rdb | Bin 122213 -> 1030860 bytes tests/stressTest.py | 22 ++++++++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/dump.rdb b/dump.rdb index 9d0a0f7a7fc38f28947909b234ab9d89d0fc346e..4a64e6358eaad94c2747721a8ca7849029bfd356 100644 GIT binary patch literal 1030860 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%0A`|`nLKdPQUv~s|No=A& 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

BGJIun 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 K{P Date: Mon, 7 Apr 2025 15:00:11 -0400 Subject: [PATCH 29/29] updated .gitignore for security key --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 2449cfd7..cc8c68f9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ scripts/*.sh # exclude vmms/id_rsa* +vmms/id_ed25519* courselabs/* dockerTmp/*