From e54cb21d554940a93423c79733cabaf039c1590b Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Fri, 4 Jul 2014 22:06:02 -0700 Subject: [PATCH] Use the `state_graph.py` for all states diagrams Switch to using the `state_graph.py` and dot output as the source of all of the state diagrams (this makes it easy for anyone to recreate them by just running the script in the tools directory). Also update the state diagram creator to have engine states as well as retry states and replaces all existing state diagrams with the updated prettified versions. Also adjusts some nits around wording and grammar that were encountered during this updating process. Change-Id: Ia783aed6c4136763e1e34cbd0b3e57ffb1109abe --- doc/source/img/engine_states.png | Bin 24631 -> 0 bytes doc/source/img/engine_states.svg | 8 ++ doc/source/img/engine_states.txt | 13 --- doc/source/img/flow_states.png | Bin 25297 -> 0 bytes doc/source/img/flow_states.svg | 8 ++ doc/source/img/retry_states.png | Bin 12571 -> 0 bytes doc/source/img/retry_states.svg | 8 ++ doc/source/img/task_states.png | Bin 10359 -> 0 bytes doc/source/img/task_states.svg | 8 ++ doc/source/states.rst | 99 +++++++++++----------- tools/generate_states.sh | 32 ++++++++ tools/state_graph.py | 137 +++++++++++++++++++++---------- 12 files changed, 205 insertions(+), 108 deletions(-) delete mode 100644 doc/source/img/engine_states.png create mode 100644 doc/source/img/engine_states.svg delete mode 100644 doc/source/img/engine_states.txt delete mode 100644 doc/source/img/flow_states.png create mode 100644 doc/source/img/flow_states.svg delete mode 100644 doc/source/img/retry_states.png create mode 100644 doc/source/img/retry_states.svg delete mode 100644 doc/source/img/task_states.png create mode 100644 doc/source/img/task_states.svg create mode 100755 tools/generate_states.sh mode change 100644 => 100755 tools/state_graph.py diff --git a/doc/source/img/engine_states.png b/doc/source/img/engine_states.png deleted file mode 100644 index 3fc83da326a6e3cd280c2d3f2d374047c8e88405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24631 zcmdqJbyU{twmWYCggD(azoxzi&Kw?p(a5kMG#diH(WTd#t7npJSdef!*XDk@?Qfr;e*BFF0B+z~y}F z`&dX0pNOrq_ZZ+q9R2_FgV&moC8}MJ{_+C9WP>BQ#8)BbX2LZiR?R!R2P_z}kreME z8HOsN8ylt5me@C?Tkr4ilJ8c8SAA)(o}uHWm8vwEif#(Vfophgm(AGV^}Xg9Yjo`5bj^adE%g z=l(h9=;+3rnyI4RB&4Ka*C<3h%JdL{F`F?3nx)wT-_ORe>4yget!;0s(&ID6FtW3+ z;rQ-JXlf?(kyKy6@_ZRYWOO&2EJ4(}x~8V)cAA~DbBdtzk2Hy=L`Ktw*TQi%h55EB znD9eBJUL&aUD;i1#9}pKx1fz(9w!^w{IJBCL|?kJ35vcFirb}hllfu`Rch%VKmiUkofvAo_NV6^u<1A zSHo<>@s4(t&KtFSN@2GLdsbRniL$h$><`4fz3b*|HAM_Ql~kBnx;Kp7lW4JOe{(Ty9ZOD!TzX?)K`W?^I)em7UzGs%C zqF(P%&n*y#vU|6^;bfbwDYDXLoO8t71D@JPXvHf_KA6czjQe z=3jbtfBl*eBrGBV7dfg{Q>L07xU3lXdE@1fMLApj9u@A_(NTpY-WAkU?XAzuISAn1 zk(6{GqYH0~lw!frBjobTRVU%x@6uRl39ro*+JV0tKg`13* zSM8Ku!O*3LZ7*&<*fbi?=6IXgsHVTcq*ib}JxI4b6YoTiX5%9olh;lnRPv#?xkCLZf?7*V`#~EjVoT?w+~O)bgOS# z73AkX3k|(V#l}|j>67$kN^f5HJqG60ednb?+`b~;^4)8q-0NXakslh&9!*hlI&ObZXpxkZ1Pj2($VgdVpUp~ETAGSV zTYD59Mv##8>B%v&%&-NsPI|)k)SC(u8=EG5@?@t{vWbhQ{s=+ro#%S_@6QRI_s^d{ zVY$LPz_Xp7{}Iig+=1FczOw z%tshk#B1-q?O}x2$w! zL~eEHpD2+j+|9wS6>$81rEfmfcj8|Uq{SlD^QQonpzF`%;)erys>m{z6)mc2yQ#+$ zJ5SEz{1{+2Xgr%B>vFiW0?+7Obv0aF(^{r9gU8W*7cwbyUa`U0h!+6_S{sp*HLh&9 za*5nhA1Qt;EqQx+;bXSoh#ft!U=#g_+5w%?)_f@ry3-r7I5;>|oWj_)dayP7>Lf#n zN{rgVX=Gx{*y7zczYl!*k}T@2Ra^4v)whvy%OjF{nhM*=pL28N4?ALE=_@}x+3)ck z92l@3E;i_Wb<0Dc-T3YB@G#sQH#c_~$5HnKgPzkF%F}QBKMN}-9PI3RnFL&xhvz!t zJUu)roO>z9EsN?Tkw*=UDH)~;fp<|4C^Cpuzn%xR9>esV^>G&FI|IAtBH zb&m@A-jh0MAyop`ir3d1jMs4ZQ%HG9rf^X5Tt5Ex_BLaT#p36zX+v21`oRl1sXlM* zVjgp}_7vwT=OliTfNB{;FD5p5WFShVEU`l`VQ$b9LCO~%#H?diY8ToWSC-ir7%Cq# ze!3CY(Cgb%PA=#a6co#*Z$tD_B_F>a2j^j%`<9v{a2aAgP0_AB z#KgorIzHZ4q~y2zmS0rwv9~q_3twi0=OCKhe{;Ua)y3r++hdW-yi%DUU;NiwyX)(U zxhk>I(TrIO)2OEa3;X=}^K5KvCo3Bn5u#M-Gi?!Et=~HnP_;r?xrwO8ZVDZDk>((@ zBsgKsK_nzFJH?8oV8!*^aR2GV_{Pv6c6d%Q0UFP}3qHVBA49qO8lD}hz5 zuIC;QBzm+akbs{Wlcz}{ zp1i(uytuHs&HJ;D4<}Ct^9$t|Fj7mhGc(slS0@|TqS_}smRJU3qaSm`rlzhgEG$e- zDQan1XlSs;iR}yxrn-!uWIP=bk#Wa3z3I_6YWRYOZ~MECqo4tvI+z{wyzcYhMBx*hIVAMC3t z_lTX=?!_?q(-}yA@YuTVl6?2laAZk^S15BqZ)BWsQF?k~e}DhPgdSYY_7~;p{Dzi2 zAtdbg8}$^LV>&qT4k;;03&*|!R>SNkT;^Y1EAIXr$BVO4CgkSf(S2t(1#qLuC_+RM zdHM2XKAW-POx_HJJJ!~Pb#--iXls+FC$3c0KF5NVM$#XMo<&5^r9*`vzE)9M%5_9H z(P?UY81LTZ)tu;V;-QzNRBj&A7|Fq@|G5!U$T#Nk&_lW>&iUiD?p(MuH*eaJ%`Ytp z`5d|Vc&e#g!-YM|(F%J}0SSF>ntVU0*kyHs#cIDz?BrH!Y*CgRgGLYer|``nG;Pk` z1+c}hdk!p<4=>5srvEOmePG=W5O=W8dL{RmqK~zj8g&w zFA;y{QHDbAv$fD?e4rJgTjSD|z%>t*^0shFloB^DFC#uC7E?5D*23GU57h(NSy}73 z5-u*hxOMyAla5?Oo7|4p+lY*8Ds1u^&c1+ zZRUs_2M75aEYcZd=&(8n-8?mNjtBcoE+ zRlO>mdWSjbI!l}VZ9U~miZ25L1o-%687=Zq&=nFmVgH;SIcCIo?M*#R^*yNqRCrg? zqB%<@&Ph=B{{830S>*j0-X62YZceawE6dC49Oga^>HEqdm2>3hDmQaJb8>RN(QnYZ ze}4_t6OTx00ZD|B@-45dY^%AFlauG?=WqWUjwB0w%T;b$&=sn9SC+!Zf#f*e%*-ra z%-2U(cN|c(&*|Z0WroA%)Bf^oox8IPCN6vjtLUkd!3~5xDpDnFl)lM9K1b_!>sDNU zj@?Ly(u}DMJ1_4(y|lFSmh^@)9W!(2sd6%bn!5Vv$VmOsM#m{Mgy4lwF-(CELjx_g zPAN`mYI$wO=vg~+?u&|wO0qGGS6FKco%{GamxLnA1h99*3)7F!ZyXW07#{5wZK~H| zt~+%zVw{F`9AWqgW92-hY3h@sdoqxp!fhU@l$*?B8Jm)lvZpP3nL_v;a`SsvMyfBv z6(g&TSQaEcIeDQv!K8ZQ0sB(CDyCi!DXeUIG;RJrR>3|*VSz0 zH!_*{N6OPO`^@{p-)zxHxJ+bk-Fj49QeXe_wDXF7dyDVr3;;As`v_B0)6JaIfF=8_ zK)b;LO{mNLISRYm+XSqY=K9i#+S)=7-Xl&vkuU>G54$ zTy(jzifiZhSIynOCzv+Vl)ilnt5Fh3>Am%W|7Ey51MH>!)dF%po8-L%2Don(hC77G zm(+@Qd3j@lfI93s2<%LXz2j{Cc?B;JdT@wfjhtwnKAbbG2?)Pf@Wi7>^EmD4l%raD(qDT=J z=V#;WF!c2F6ol8C0i`ZXPg9*tzY6{JM=?Wky>d1fn}pkJx;Yr0i?H_rx9^f}+lTuu zkMELMHgQ;321M*d>Q_0?;N}ke$haE;40B5{FWrV?PLN80qqHX1mk_$aEhOA_*8R_s z@y>$dcPYK`uU?&AUS^JJKiFF2vY&2lI6YpKWTQBO4k!v}^n`@i)pZvjn9q6(;WVd* zroo*%0ZO?y({1bbTUCggo^WpZD!945Gr+MUi%U)xcKj}Tl7|l8vbJV-qSm=P;kk+{ zld1Z?5a!a>{$Sez_%%Kz25zu#nqOP0r_ag$d<*IRqy@(|d6O@^_j_A3*G#epsoyBA zd3=V(=yKj_UqhQ;GFIKJT}H2SL6+;(XJB(e#JKaZ(X}<#O>I4jg6=QR4d^}7E|WNQ zW_1s(9Mq0tT=HNhyR|gAjs}8)$p39!;XnR9KRIpJ=k3PixaXZjFVWn?aJ;A$AoZE_ zBazWy_=f{y&MgVsM+%N)Vtb%WLek$y7XCn)h#OL{eZ^P#M zIZ=1mEwt(s7ejzREMON)_ob|*=qM_3KuJD1KJ?w{y9>o-@N!<#2PDRym)pTrLkUIh z%NG?C_bYt;y4Zyut{i!fp_)NRsK(#l|J%23u(Q6;&1nje!QW)!kH^Z=9&V)lWqBZ9ohDZRF3?jqmOiT8!O`*8vk`x~5ULsifNdPMI^0`T zRh5Fswu+k@f17=TUg5K69i+Ck>kHdK<5iArO-&ipm}fvRvm!sK!{7itQ;CFLHnu(9kb)h%y+KyBbX4Eb9dly{qXkYfm5biwt9P@kRtJ0#Z z`}Fw8Or_j~c~jQrh=-hCe~#AxE*r4e2L3N+&E0@yv^?%QNzQNgN-6geCg#CbzXEno zpRp+|f^g~vx8Al0m*igcQ34IBCO zCo(b;nmj=5XTFSdba#hkj^cwFo0Ff&2WE z8(Rcx?0Djg@iLFQ?=du!k&%7w@88eq%*3DXNi_{!kJFi*oh2GK^NG755eQH3q5=Hh z;vEe&we0)!J1e8=s;VvaIsl60bMS_82P{DKSz21s*3yC>(-QXm`}ZF$R%N_RZvaj| zp0M9PJdBHt-N5+#`EzYuU5gwM%iphofBl263uh}Rf*I-QvCNu=8iB{c`v4UwiM@Kt z`ogkbc6D@+3OHo0EeGLJZ+!ykj}oK|ATMogrep8y+uPe6_Io^<1_yaXM7$gQFT$&v zsQ0ef%LN&*vYc0Mvfg|9@(p0A{ryo5)Fz*z8Q>xHS~jXcmGfiGQZC9WE-lrrb~0B} zi*=(;m5q*$4&o!}BJG^y%-gks6%Kb8AXZvhy8X$Ln*_)gmua_(ii#Ed?!NRpSy@@r z=zuO!`=QiSK~l06^vGrf;%uzKL6aX>Kqk%0&)<*E&&y+^rj{tWsEpcl)zRJc!pgZS z4rFaPxbpJy$mqnxygoCRpJNQx5-(o70994Y^{0-UTvy98Lg0hjm0>0_ilJv~ntPOjbypWzQLEiZ=^dc+ver@u0dm6Y36TU=aRZaD;Wb9NqHtC$#c z^uk}i`7!8c@FuLStvfz_3WANWv{E_wlFxSH)vYHcJug|TB}z(4*cy&DY<)IKVeey; z@>)&QYOZqCE2N6nxU7VPhB~>p=z$6exN|H=ffB?rKR*N?A0O4m+S)Ln#(VdIii(O- zQc%$K_U+rvJV98bg33!6gN4X6a5%+>ls8*MCj98MUh;xOoNw6_lLEP{k5 z4VPIt>MYNcP=XYGk+=6$yrNKLR`Bg^k_MkR4HZ}ku@4dA&sNtWpWU$$C;MXB?w}$a3>o5f;9Tu4W zEaoCRzpA1W?f<%Y{H@I}G(6X)jgrzJMcoi}WETGT!P32T=REk=hzoS0@bQ1{7W_9Z zLxBQq`hEJ=aB|P>AF7t;2W~)#UUw{q-c6ts!a4;v3~C4zX&)P#pUMg%1QZnA_Q~Z> zz+W*tbM%_;MY->o4sF!j?5r?w_oLL9m>3%y8-R^anTpl!k>C7Xk_S^9_HKCo`J6Pe z793DWBv*y;q$fK&8=3@EM_4GYU(*+=$snbqq|ngN01bm21LQp`HC6eFSZurTYQt%L zYHF%ETN^%hAqs)6B88j?Ad*y>wWp`& zhjRB1G;zX5znAPQYNFB||6ZAm-^Dh-^!WH#Mn-184Jhfv!~{sXm;r`Rrl7!+wG9jo z{%{iHVrbc&^z9+)Uv%<_aCC5BF489}R?F||>?|lMvNboCQcxhwqe=&LimP=G>z0Fq z!_m>v)vH(i$?@>;3QtB#JrKQj9{k2B{Of%*Yn1JwC9SQkuV23g;q!vR-26O^h^DXY3VQGq`% zFAugYH%VA&=_X)mMn*>9o$t*0(m#Jzs%QUIeKjTwlYY#rs;DsQRy*~)6d@)ihQ54N zEXy_Gby3l3R}x=Gl}F3uWvcz8$&VkX=E&Zw=BfPlM)2L->KA96_P zLJX<5mHV;bXoaj1&g{^Y7+a7|HI0R_Sd zH~!*vf=(K=pV>5xx-E4VTS?sh_%HHaP;vauJ_lR%fBWHdEE` zTc}X9!(PYTy^5xWh-L!ZQV-!w{FS)qX#6WzK&zRVpRWYzh04Ol2E4VMwYB@XDh37y z)0At%;HOkpR%#Val$ql-WaZ|XZ~uUYy*?ZHcdWuB0baO>8szP>)~N}KJCjf3fDY@a$h zdXfd;&hH|DWZ!mcG+LKz@(69Ey{uO&gd6bm>CnIc4ILexqLfr{pPGN$zg3(Nv1HJC z?WHmbiN-t3l8^Mr+Ai+<=T6uxJ-^sCT2G$#^n)xS_W|q0UffVntz^5rH2vmgkL;xC24jofYPEG*8cs(jBN=`*tv`n<{wwcmIV~2mY;W%A>gm|XK1uVg-LRklZ38eXsM_{9wl9xc#Iw);3pD~ zhZBnZ0W;B)_sr;k4ueKUck|}n-d-pvAFF_XCMeo9uC}0Mcs&B7>HqX8)*QG#GRW!v zYtVyUzI@4A$Suc%NsXtz!tMC&ty=}mKE^aDF~QCgY8j}((iN; z-u}UXhtJe4*nlD)Dxe{I?e&h19)8JH_Id;_9~K|h_9heFbQ=`Qfq{XeR;Xp2ot=-) zoTsIw#groxaPU8=k^W#$X0&{?ziC|T^Lt@_SSnOnXc_zwj8moKGxv$0HC{f4xS|Crf$kMGoQ$a0CQ)9e0u~TxNf5vJzUlY71vV)!n8M1E=ZJ+N&!u84|? z%E_6BhyC%v@%v(mjFMnY_yOA5q*ty0;oEZgT49}}RR{%T7~DO8o@3+VVQ-XzT=}Zw z`uJN^!5_Uu%FE2k+WiGL_{k7;r(In+W~cj~u!hrQdCSX|Ix3CQgJeDH2BZ%FfZn|6 z&px=O|F4QF-t&~}Is%ab%y|p*BO?MKND^xqRBSbXM_fmz2CapgB$Vfh-u88JD9M74 z7aH&kn}cvQH8lsrF$BrJ3ttgECoUK-gYI+|mlmnuuZqczQ{;i7w}>GnaoZ1*y9O)t zP%oJ?@q3wqR;e)%e&K%6=pLf8cz^s-yN`76OV2A|F0?;a0GLSvUukqB6&}3oyX}Ar zm56O5P;3^KF80*-8fS30&@vxa-F(l8u_Y_Hc@e&f|6^g$bE6$vBFjJTTO$kl1LETK zzkd`b@>mXrQi|#AZT9${l*-c9cpvhfni?3~@SP0l^9Bz*?1VefJ+uTwuJh-g?qFO( zJU9nIl>CbqFIM>+dq_x}Ih}|8KI^c**q^g6#-?9yWob!DMrP%tPe>TYH{tdq2ng)V z)Rck2vw(mA$aOF{`m1@ z*+P0~Kd5elZ2r}30$6|;tshEX5kb7~`Sk;Qjt|0!IHot|I*?B5(|4e@5iqHFfrZM# z!h&>y)(kO$O&UN;XVB5DtgL>cPh>hCCKTpXc3Cj&z;+v4wTRd;P0GcGRf>C>k| zf`YJN-)NQRm6W_F+5rg_!Xt#NI#*ULiO!&`Gw49T%%EEpYFA$E18sF@ql0a;2khfq zl|0~eGNZPD%s3ugI_~v!DlgG1w-~@;t9?)82_}X58=bFXW6RUi4sdy`t&(7OfHu^s z0nPMwT2OFsZeE_WoE%L$paFocCmR0eLreZs!(y8@p+DGD<5L7`R9i*7}}^I(=N)&eAKq<#WLXO`%lWgnF!L@b%p>o2dozpLJyw#5c z6=7>8LhLdT`}^+h?(y-IAaLo!2DAGY_cpIXlwfzv5t zVkhenP+)!qLcslTg$^;@Xkw^Q<5HNBF#}p#(Ch4M6Oe$Vvo^-69D76$m%*5>Hg1n} z(UHVNjN=0I(ddV|0kz5v6m4K0K0x}B_<#dJ;f2TySk&F^?ZH7-*4E$`(#giNdu%O0 z?F8ZsYB}U#U=ag91x-grUOu)%uD%txGJp8y?(Y2Q*6uDaD$!H7wQnCh0=k-ei}b~) zu5O$QxQ%=58i@EP7L_94XadrJ^^Yrvh5BM?v*4jWL(QQT*7(Y&k})}btI z2dE-~PV~3{7S`L*aEWQDObpp|{J}OlNx$<8275;&NpXN3| zYuoVkaC5U7tzfx%vw3J}sJq){q|AJpQWFpp=7kG(j*isnkpEa7DQDv3{QUK+J9IA; z^o8hHCwHCgq-cyZkJsMXt5>h!)h9MQY@*-fSeWYZ{_^EZ?cVgW*lj2yXZMb|sgA;R zY#*2WBmP43KV;Kaq$|6|4{p~F<}}1Qc4qlzDumR?HG|x8i3g=^y{l~bAy9Az5Lc2ZcO0H zx$1Q3rd8eT3%iZ6kOB{u2$zgZ772@MYjePD%03@s?>wm3kc+E>K*?W~OZ-zNeGh3F z86J|bcP3QQva**hTqrInS^uSf;x%wUwVPb{UG3~?LQBBf2gnOCi2B?&R*~CTLsWj(mTkTXV3plCP9& zXlUqvB4GDT96$;gIk~>aVix2=?6m_$vI+BObTJVrA!tSmPbZohOJHZ>N|Sh789ai3 zO)>=H-n?OjKU7rdVEuv=M^8@=!qC_lm`OEOUpW;NdQbq_`rk0~pDZ1!UX1h{paBaD z3ne8be9Su!AJQ}sw%Okn{Xit-ec%L?8|*S@Lq_c{I9nm)7XZDA5Fg+8;X{mb=USVa zgRpEz${3(@GBM?YzQN7y1Tiy{9jbJYWfa3Lr>{MvaV$VH?ju6|aVQpG_DSfBG>WzQ+?|0zIGYP z3O&G`p&?iBL7{ell425GR#BnG8i!Q_v97~|gAgnnGJbXefdt>=q$JOU-Wyz=xP5=o z9rj${k?+?*jpfqU*SBYf7Z#^Pw4x*d+g!48<}Y_d!IAaOc`0^3`gW1u8t$9>^v(HC z9IBG_Z);RoeFdFJAe?K2+h`dI56V*%aG0%i-`vA7YSoaI{sbT!R##g%dD8Re*Oz%7 zeu{=-1s#8pTprf(RMS&B@G`B2iyuEmSH7DV7k3v4>+dL4?075ccG?v}HG2HpSFf{| z$6YDxYxAm^uA6nJ;wNgN=wBjkLhmG^;!ITi_WN4DX<;Isv9|_+5}zrDF}rbE+x&+{ ztF833DZxFUqAp?(ZV86GUF>GSoauCBE`8d&H{_J9D2jT zz|h_Uim$Jam)8-*en5DKmsbkN+n_11ZsQZvQ7*Q97g?J$8VA6llOfp`n11X8Bopc${I!eE9Gov;<6E+M73t>cZ~uKmQLcVcHOjkTo6{3 zzW9u-{xyUfQc|d?sZoX04oq!uhal-dPDTde6O_rWeEWmCz}Wwg0x7M`P&+iWVnmUkXS+}ENCkbCAM6PZjAJPou4Mn=@C0kF0~hR7Sq zj7droa$4w>C&F4Evd>e=18?H_^D93_xX`KzfnxyDaUyW2(rNU198_&3YQVyO2E8{8 z8iOCf>wzBtm0f&lfTsvv{!LSo9u#MZA)LYbkyU$VEPx-yYJOkR#~)^hvAAVGb4j1L22P)nUGy z93rD9CBLoAKC~AVVOIkEO9-xAqW~YOxcGkJ6*O_Bck(e8hL(0{b?pk^hXA`djPN~@ z7`{qMdf3G`sZ;CLw;>JJ0n+8jz~wMH1FNfQ0~n_0PRhUl0XJwU%gA&cy-Lb984b{hY!V>dz$Mr z|Ip!?E-x3T08-PWJQ~^;oDvFvcaj#^KW(IN{R8%0OLvwlZ_;GqhMvH+J zphl1pLQ5d!r&FjFK`s=_u>*!KB-H^R0{ense|&sAXf7zfoRO9F8e^q!1^B48@BPrA z8v&&OF&7~5>j}4DSH2Meum1uN-LgHdAZxr=xIW7^77JB2k@d_(mH=QbvjTjF3Qnsv4H&9SXkyLbF#ABJw2aM@Bge>O-@b* z&0?@fpOTa`Uxg76hwJh%2PAA-S$^CYhAdrVbo5PbP!^48v)ECWI5sw>=J~RS z?)vptMkktYmrwd9{LTj5yZ3Rr<=IeyX8+ijmHT;gCk7}51yZ>x-7iHv;nhrs zK}7jYVWG3V{rcJ(ggRiYAMHT0{Ddo>S%$VVdNwLJGV-dyvuDp_oSk`2Z@?YKym)bg z6=ZMI&iM8H`P9j3XG_?kD9Q&&4J6pM9Q?m~ugoHDPliD(PfbW*I7&!Ku{P1?N}-N( z&2i<0hr6_N2+_uqwI&>hEi4TdmbxGjD_>Id+z=w4Q%|;XK%^|vsoMD7l>}D@BKOfG z3=#m;ObUWm4gM%O0fF=CL>*|mEkMwb$oO38)kNtG_{$)A9v;<&|LHa_Yh2;fp7Mz?*8l%yxEm_wxsU zITz*T_F=uv%lp*Y`W>nrwNXKR{lwtl&i0T#;Y)}N{#}6!U}uhy%jvfUaMRHtlXhP= zk$bT>O#+tkG|?7o5BD-z9lD8ASHgRuQ7Flv)j-0e>{eWgObU)`|JA8C(-UWn#$(9E ze7pcaWJrchpUQ$p4yZa6^TqwRl#3V`7^vwGU#2TgSh_B(&Z5bC2){Se@StU4ncF{p zguHhZJP~c%x^mDN!6Ndut4yu274r>U3H*)H>R9FdZKU+TKU~NhQ!fC+#5*w1! z?<&#b3#N3BC?d+v|EqsK8j3N!tsahj$)NTuY)sJ3u8K?l=Z{{&Rt>1-Po6v}KT{ID z$Jbm_^wJ(5Q3vv!-{8M`Nw3PI-(HFnvY%YtQQhpPqEp6wG>?nWQ41mUMMcF$`GBk~ zCN9qPKYRh!<;%1%uEKV(Z&ADUZUFu02@rgkn$UY^m-bf!<Pu7>CF;{X2c(FJ$H&^syBAw$<%}r6N2<7ncgV>kuplXR5xwzSN`(X62&gbGRHc%gf6F zG!Bah2z(tHQrB^V7XvN&Xa<^*#M8?OU!MilpPqQO5}jK2Pq%@);8g>r){$PS_f7&N zJAUyh8HP}oT;hM+5OO4X8YH3b%9wTNjd$MxHDkN>Y0kmtq5*Vws8@6R-DdrvCD4e% zp&-tFe1S>^pPul${eMRR35gFAoToS@-?*_=>9AgIEpFTLXe~x?sBy4*aAAh# zeK|g2xLmchxbKkuAuI~?B75rwvMbvl0Yn>K91Jj4>PUxVfqGAdB zE4&M1V`DNfaVKB*nE?|3V^10W3h>*VXV)$caRaI}gsB2RSb#~UJs^P%b~hjmK8V$G zxweAp_0gD9^v?D4+S*#!4Z&DjAPT>F<>w1OtL|aPHJKgG8R)u4PXKmIQC)m#5V5#2 zYJrAWFoSM7(u$HTm6VlvNV>XHgdklUcQ%pX`UNa3?HU(rh+g>kfKa|UGc(f`N*om% zi_#+>nwsK}@-D}y>rE+G2U$YCeuf{?5`}7@=(|u^SXq5pbV^H0qf>ZkWnuBQqy%yn zP@a$Uz@3FYGg)jP0XGb+q|F{2bC8a)FJCqZ)va~ofCScpHFM*m&X*!WjEp}ZWDKF8 z5TKGlL01U1-`N=eUzC^chIbA4sE6)s;m?PXkeh-_1OPMXHWL-C3O!gA{m`&d=4=9{t|yHgD3>3}Cnm zb_zU0ptgXKKmp}(&h+SlnpqEuBIwj#zY1`2DnWY_{xYzSbev7MzW>@x18qGz5i$&ds1ptN8Hx7pTk-c^`k(A zdy&`p{kut)5`(Js=TBW-Fz{q%dRb2W_$ zU3wRbjwnzlR0Fv38G6)v>JR^=PF8QoE_^C^bR#qlkq=qe13+MwD_0QJl&El%m?MBb z@IN(#F#Ud>hY;xd)79m#rI2bXbHPW9Uj-M(@ATVdu$pgCxx}KAU>zIb`2|)WbBHU> zVL&vYeL@p0AUz{~h_a0q828WOW@TriREEKD^j9KwOIWxzXg}oG2jAoMoXyzxSN$&K z?7Yq9v;Is$?3kOL{`IEz)141BA*gHX&38`O4hE0|HUtdq0Y`LFMls0UADH|8@;RW6 z41@FmKn4aH7>_s+^JqcnxCK%)kH4Bjr-1^`?kMcZqFVymW2 z@Pk0}CSc`N zQ_iX(KXQ2f?*-%kbyfp_$M0}QnGK*=&|OnpC(PUG0n`H6A8{ix0_FuFl+S9T_JZkn z)kc>@KsiGAsj;_S#lr(<)(*rz%eD>5e_3zbs^6fZfJ8;!=hQYZX72I+hLapT5`@-z z6ONd%iHQ$P!N5!uO5rPSx%9iF58Dyy3dCywI}>2Sz$j#L-8?)%_m|S?`O_zhfSjxf;{eR|27f$hh?dSO=A8WU zrOaa+BJ(TXzh5ID$QrO{QN=ia9`6O1bjMyI`t2+XV1QD7`E@S9m<8I&hu=|NHl245 z>IL)wm`G;e4q5$hi;9fg3;Uf)BT#Q7dKMmj`O+n3CZ-uC?#cbwX7l0XJ_+6t&+i!l z6$bB#4$^kPLhac|cyB)jiskO|*CwJ-py^;~vA($}EL;n+Gzh0bP~buJA;7#ND=Q1V z!@`0Q7ZSSjv$Jbm-jH;Ir~rsLzd9a3@fotVU{XvRoQTlS+0#%UIzd4wiMF#7^2#BA zYVXo~G5=8#@MpZYx>|6v%Nukrn3~z#+QO&2Y}C214wIn&h_Xrhu!Ya~dp+iG0f(#J z`w+Bil&7F_T1k?V@LhI0cuzB6j=NgB8U8K}ydZG# z`FMFZd=LI2XtxApNi%>9(#1X0+q<^jMtL3sLu7w8%5!Hqx3F*^ziVL~?3aIpR{mdv zY>(qfi)52Tt^vAf(=bRU&}RP1oVXJF0j$m%VGDPdHm>@fde*g!S5A1yyq*PI(l`TM zwRITCEA&S$huM$74HmQTLrXxNE`l=%z{D6FtN?+>Yz}}dil5ba?)tM}2HYNdt;0%q z_aURvH@5BKTEDe*^I@_E|6&j=;5$Rqm7B|nMfCn>CEMBI?@D$PH4onJ*E4a0=%)=n zE^!y*UtiFaEHIcw$Z$f%UGXgh(HJuFM|TU>E;0(UvH>xk1JBqX6smMn^yAaE16vpd zDeVzuDpS(dK5WKQNEY!_8!M}+@k9~ocOYhSaVZ}a7_`2B>U47CuFMdSfG(L-V?QGa zCWL*tydp{G=d?>UpWxSkLUjJ>CHjYfTk1X+qfV>vl9`qGpAnZN%+G(vM(S*d z3=guaK#qacff}%ah7I8rPxvW&%B0hYVH8F3Iat`(BJLZ;%F0oIT$FOlDl6xA9h{uV zAk7CtFz|2)4GM(I$jPD963CPpErZAb{_uC(RqoJ!GsjpmPTvdJ>EjS*b#^YFVErA2 z0o#TL&!EU;B{^G097qi`D@}epwKqD%BqWRzjrL>DZ%9nI&0w2Y!8morKQYSEaVj}6 z@#42{_m!2YFSia34$Av;sQp#tcCdFhS!*~PwQX1duYGaR{o8vqA5RE&!(khs;i-xj zo!jg}NknaJIK-T@fI&TYNGaINFe^teOi9w;W88y$&s}DE!Yv;eO z2@!8aj(@RiHwJAU9X1+Mw?7Ou0{+_t$ErknDdO?pK@GW_7hRromb8=aS`9a?x zY%NaLXHgFP1V-!nAgWwQF5~%e&f((bMXDc?`~DQkXdIXTPQ>Y|0Cqz-{k8<^Pa!#$ zFrzU+V6l#b|HFJx2e4s6#EdCJOaMe}ZW8S8S8>=FscNgXe&Yj!f8}qgMQZcc)^?=* zBNG1gT?I;Im_sNBx9q&{SG8q(pfyo-~V)G7B3rxcM!$+ z8yC5LeWAwLeSi0NVIdbPqkiEL16pxyh=4$tuE`4>#*tLvU>3hY;x0PzOK>M!lBiNy zF5zc$ZXcQdUpIjG{3mqy%ji;XHJ~C0;cTr=>Zje`J2*g1l7iIA0CUw)Pe(_jZEW83 z>6>t#s`NDdp>RLXtk4^9exQqjGR{Ty2Nn?Vf<_HfdoQT(cBhIpm~@eV2;%-bdDCak zga0o{dxISz7#&s)iCUX)kbr=)Ld;`*z6IrU3n#l(`FAwYl@nLvN9en zu?bED#X0e(jf@zGGKiEog9Hg`?@=lsXpjz&U&hA3>jmtcrj!fj2mrAF-Eaz#A1f<` zYWWcLZnibIu+XaWDAy`SSZ>%j0RKQ5Pr@+=43wQG=yUWgB0>R7Uets&q`g3#66NQQ4+5%nDW7NL zjX}AI1$b|u?ZXiPPR`D{GakA&8f*s7m?VrA6&QzshxbI#?Elv7C#s$E zug^^_e!1<003~ z)%tJoQW2+xE2r`Q3Yhj>B{KS-1E!F{2bmJ^3S0w!cs}3(h`X=j^#KCW#t!CC)6`sq zDR~Iz$R+VE2BfvA)C3MB=B54euu+4)zO=t=Y^_KbcOQW$=E1=MpBVWHf;d*Arwhc`Z)r`%c@jpKk3Cr&OdY}Xs< zfKo3;?DyCP+`gel1?>+rU>c$(S9d;r{MakQ0D}e(EyVEO-?#ytT$e-0383kf+;ZAvf^+ZXE5X}?bDbrek zME{(_J`n!x@W#gHL`ER2f*pIjUF2H_hv%FyD5tJxkMI->b}|OY(&9O!fIG@1L*hXv z3IRXx8HtPpQ^LilGT;V)l*8tSR_hIkHWRAf_Yh}_-V0O-!e{0u&#rlJfximto`Z^N z8ki^afJyJ&@zbN8QzR03r4MW-n0bPs2iQ2pppig?Hz^lp*sUPU1*uF32ZJ{g5fSm9 z^7)TYI{hC~{PI{;f20S@>YJG@K-e!SF%c9A;1n=5Nb}T0gP_fxt#0cxXvM(Tz(RDK zZoZht?o0kUKGy|1pGWmcR8&7)9ZaP`>vV+*Gd!$OZ`AdTY3d&m3U@zFc=)Nl=Pm{Q z!|hYFqs?WiIE-s{2L9qoDy$h75?U|4nkM{&MUwVvQ60N5y76X*NvCW-ZAxqHo!lt* z8!Wb(i3z;fW>3E9%5d0oAzkor^C_a1;8Syz`exGKJ<$9$Fw-($~$jRnUYxWhF8kM;wr7E z82l6&SQZ6peBOWs1liz>8af&p$k>+7yx4)G3}CLK8m4t*sN=e?+BMDxqMZz1#64M% zF*U@u?BBjt}pJVomNAr<>cH*|`g&x{zNB!U-{@A>K2g&6u#ioW8KzIP9Jf!`Kr zE{I}0_(7TXRY5MmqQP*|dkvXjWB*8WK^_$t19rG2g_c5|2OvQ6RVG4Q6)xe7j^rKx zj&?yjrV>#&BBG{Q!vlH9b31=hGz~esA2Xz7}vtGnj6UbB(G~Jc)7Ty#4hn|4$?GsxOTrGkn~UnYuHw0!M2o zTY^(u>i_PCSzqLB_O{VcPsrXwF4pXA)}u5{0B(RptgH&O3L&WjYBb1fAXPvom#l;F z2W^tbsWb=@-?{?n4oGd9RoDZR2s`&+L}2MAEZ6opE_!BWl(Gt^Za_FbR|WhD$d>{d^c`!`1dQwrxOl@iU->)E6GaL^k(p>F5&^`hC4G3eQ+GL&Q&{iM#o42mO zj(}|C>0PzE_XPT`RaEeKS3}Ckmj;f@yFyGXg=CD$d;R*Ov<$$N-FkQ&K-I6StquCv)3XW}Cns+n#T?N2^8QATm$&yZXc|Eu2L^Z; z7|daK7RHP*10DxK6WsQwa}pNjxVrDqRHg|a^1*}axX=}J8+^v4Ph%;j-5bjKjm-*e zU_eU-2_ACh)&qBUfx~2SE|bu$J+Kjfx&M+W(Xp{4qH!>wVCLc$=#C1UW__JrT$Dn7 zre;!q!|feAY<_!@|Lvt=j{@ruT!p7{^>g6%-a^8$9ejclFt-gf_DUZl36YB2hf+Ll zYY(U#?Cndq8(k6|Sag-*v-HLSOiNI`M{<^IAGV*Z{q>@0GcrZ7IRMctk5y9PtlK<+}d%I$o7vtiJ z3W8HDQ0M!3Urn41ihS(*eZDh60ttPx0YXJn-{6}Mx0miBLCts({{KSQJ*0Zn&^;DDJ9raXb z<&$5liHq9@sKaBBTX2k))=LCy zI6VWuY5lu*8fo`oglA}QkfdA~=Gk$vi8+yi6nEqB;mA8oTnJb9493~GNcHVRr4iJS z3pm`wJwDp(38XHn-N3}H+ZnM$MyICQI(b1%OH!n{wH5QR-ApUCf`S4VvM`p@Kh>_P z4ak-f{u%~)_J&fvDRwUOqXFH|EXB6_XD2)RAuMNO;c0IJH~Dvio3 zzmc=*+1lQwq3TbaDg-sdB$WUcw*-bwKmzBsWe1lAWIISE#8NObFhFs*q}?=M0>M&W z-%}X$f;BO&lmvG^^yLejnNkE=h$IeF3m7hhEEWiKq)#WW@|*hfXUloi`M~5KOwdZQ zfWZ3v#fz!=c~i^Y6+X`$D=NdBMwSdCx+f`+0lAF?)in?% zL6lb%b#%s{EV2}`@q8tPCJt#g$W}v=-@Fv+B5ogmJAQQrq@po#Y<#>~?qxvC*HPeD z^VD{vUFqZUMVk3e2;@Bv;wK#AH!`lHQFsa*5Nb%NM5Iy7ZL7`p-jMNY`1n^Ku*i5g z4+|lf9*zvm>4y_qz%FsAg+AZjo{M^}3a1Mh5et)(BQOUqg#;HayD7>t=JxVJniJXK z`7z^yeWT{DH|Et*X%z_bg3DH}Weul;!jL3P7H9R;K@fOnX&-VhVH7`z7=}L4w7^*a zK#iK!QZt{WBEJBXV8_x(0@n{hbl0{~<3)3E`V-}r>QK3QmJ+=`UTK6K3V!+`)i8*@ z)KpYR$JAS~8{$Pn5SYd51I%hrQ34*QWQMs#_wpQ61jp|K7S7`0h*N%+J7Z<20)WiF zg>&f=G$~=0IYx#NH_kG{N;sGf76w4D20Us*{B&?;~rq+(}J4;@v; zZGHTfTTjk`8VWmB5g&|4$fg3mmy0WU$jl(htET2N8J%g7iK1bsu6as?j2XPN*_$eX}|5@rcA)KOO61V<2cilfy$FYd+1&!eMJ zI$*|x)&En>)&4bEhS4ZfGzBUY4G?4vHVtf9%8Qf02jtyYiZF7(5D)^a%2#p03K$k>{9{MjJ}%OqAwd_TAn-y^DCnTNnE!UeS&-ME~AZT zG`CtDQeN0R5HjF%CKdPn@1gCV;yV*Jr!2af`%|%*8xN1%W%T%$)9&7d)`rI6g3QbX zz{%LMWq2}>5~!U>rt>p=2;wNuy>fEc^q>Khr;@iP!U6Vqc-34?G%bY}Ym9Wz>q9dFouwIv!6Fqt;jeFCE(q)pAY2Kjt zT7dTzQ*#AVx)%X~qwf4KTiSgt-yQM~j)>?^sD-_Xog7b;_V^|rj�HMD1<(>8^g zLCeIZ7PE^^DFI}4g^SIxQ_W@}Lc-{^xn{RP1$8zT7L9#KlHN68tleD)Fm2s1a59k? zfv7(qp|Vmciy6b04AEw8qC=cOCB>IaZR^OLfut}b6NnEo`0U$}KCFydk_hO=`W zDuTD=-oBXBlI-+q9^rdCc%#;tZ<6nD_Zj04-K~;jZWCuSfjx7qP1C+7EBig+tzO{I zs0lyGt`Y{12iea^dW*(b-ejA=!%KiHjHd{?f z2$nP1!NJ%Ak!vaY+L6-`#aBgLg%yVZ+ss*JZDLceQa%qBY@o)Qsn?dYx;#dkq{#58 z3&wZA-h+GbKwW*FvMIqEo?V!ek&+POtjwO=DK#lrIF%(7k{+Big9h+eNMkTgTF1G| zAvi-;U{P@~cFZf3)A#V!oH&j5$Ho$>>K{x@aKggkdDp}`Gllrq#?Wx#Ny@3?)KXQs z5O@n^7o;AP=P1HW%Ov5m`l_r^TX|+@?X5sTuWl&pLTF=5xLH^_0 zyNeOO0mBnaq8}vOV8sEi>CPyBtf;JnJLWHB5Bx?33rg0fDXT=PqSH)$)U;vWsAO-k zC~W@XrAv46{gLD8|NWb`pNjWYl*V-x#90_7$L?f}SLAZ1BjVgRi~fu+*t&q<9#dm< z;`abk>27kmd$J1~fd-!T1DKX9EG)F!1He^#6X=8Yj8?kW2K-lPt=U2So2*i|7#0M~c}=jBQD>;z(29TEn9QNfrKw01mN4 zTL=rN?D4fv;KI|(PLKKSKSAsj$%FA2?jriJk z^qQ=syK=}%oRV+<@)=|3^w6*XV(7qQQQ+p}Qo2LG?4ksfyKi27)bID9XDwWxR;g-x z&j)1y>;)VF_6K{S*e(gkR5rNnECGL2wD|aI>hG*qJW3u_?bzl8M;0 zkSRtm=;gfgkwSMKJB{(7mRW3V0BT|nie)Mcw@5$e;G6rGfu*ag`~n3HKneM(Kn>_X zkaz$wML-DzF$CL?6Yy*%E*&0w__d)%G@U?U#Ff^_!7M%;!MooPwU#%`S5ihJ<3M*QJyKVT-A3dC&*7uf^XdOI@ ze4PovK7J4zv*SCBFNg$+lhXujlbE<-zZ-Nh@l?I4%dU>kP8`40Rr{>7V2#kHEJRNN zH7Rq7=QVCOY!zG@npQ9G$q)#P?Ob{HPZUwR^RbnI2NlE(xZOD(NO8h86*Wkry7@Jp zI!h#q*}vn3EysXJVB4hVEsJ5|z#<_-kYnS%>j#ncphA(>4Wc_R4$U3Z$23GHiQ5k2 zkRe>C!8`@;g&$ORzhcz}oT6$7e$KJWmdv@*-|q&Xgwex0eEfoDE(WHD8bHgbZAJ(P z3e;1a4DxxSSvBqC-9h`#^P|4$JL_q5HGMxk6O3mNXP?s8F9~6FbfI-n zGL(BxGb5jernCuKHcD$7^Hc$so~PY;w1GM2mP!E0om7w;9?3yu8T|Myo=%?1y%Ih(RyV=wod|AmK>NA8JtC5LS@ lxu1VS5)o?Vf9EA;-2HnpXR1clQ}Ktd_<98q7d<17{0m{`pfLad diff --git a/doc/source/img/engine_states.svg b/doc/source/img/engine_states.svg new file mode 100644 index 00000000..497c31ef --- /dev/null +++ b/doc/source/img/engine_states.svg @@ -0,0 +1,8 @@ + + + + + +Engines statesRESUMINGSCHEDULINGWAITINGSUCCESSSUSPENDEDREVERTEDANALYZINGstart + diff --git a/doc/source/img/engine_states.txt b/doc/source/img/engine_states.txt deleted file mode 100644 index 3b33255e..00000000 --- a/doc/source/img/engine_states.txt +++ /dev/null @@ -1,13 +0,0 @@ -# Created using web sequence diagrams. -# -# https://www.websequencediagrams.com/ - -note over RESUMING -Running starts here -end note - -RESUMING->SCHEDULING: Resumes and \nschedules initial tasks. -SCHEDULING->WAITING: Waits for any \nfuture to complete. -WAITING->WAITING: Continue waiting for \nfuture to complete. -WAITING->ANALYZING: Analyze future results. -ANALYZING->SCHEDULING: Schedules next set of tasks. diff --git a/doc/source/img/flow_states.png b/doc/source/img/flow_states.png deleted file mode 100644 index 8ee0cb2a4200bfe10bdbaa7a2f4e77f6ccdf5d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25297 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 + + + + +Flow statesPENDINGRUNNINGRESUMINGFAILURESUCCESSREVERTEDSUSPENDINGSUSPENDEDstart + diff --git a/doc/source/img/retry_states.png b/doc/source/img/retry_states.png deleted file mode 100644 index ccab5c6b916fbe079886645cc81a12a60907c28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12571 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 + + + + +Retries statesPENDINGRUNNINGFAILURESUCCESSREVERTINGRETRYINGREVERTEDstart + diff --git a/doc/source/img/task_states.png b/doc/source/img/task_states.png deleted file mode 100644 index 6654ded37a93a251e614d21650075587766bb231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10359 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 K$W%(1g!~r{xXcj% diff --git a/doc/source/img/task_states.svg b/doc/source/img/task_states.svg new file mode 100644 index 00000000..f40501ac --- /dev/null +++ b/doc/source/img/task_states.svg @@ -0,0 +1,8 @@ + + + + + +Tasks statesPENDINGRUNNINGFAILURESUCCESSREVERTINGREVERTEDstart + diff --git a/doc/source/states.rst b/doc/source/states.rst index 34841f4d..02fcaf15 100644 --- a/doc/source/states.rst +++ b/doc/source/states.rst @@ -7,46 +7,40 @@ States Engine ====== -.. image:: img/engine_states.png - :height: 265px - :align: right +.. image:: img/engine_states.svg + :width: 660px + :align: left :alt: Action engine state transitions -Executing ---------- +**RESUMING** - Prepares flow & atoms to be resumed. -**RESUMING** - Prepare flow to be resumed. +**SCHEDULING** - Schedules and submits atoms to be worked on. -**SCHEDULING** - Schedule nodes to be worked on. +**WAITING** - Wait for atoms to finish executing. -**WAITING** - Wait for nodes to finish executing. +**ANALYZING** - Analyzes and processes result/s of atom completion. -**ANALYZING** - Analyze and process result/s of node completion. +**SUCCESS** - Completed successfully. -End ---- - -**SUCCESS** - Engine completed successfully. - -**REVERTED** - Engine reverting was induced and all nodes were not completed +**REVERTED** - Reverting was induced and all atoms were **not** completed successfully. -**SUSPENDED** - Engine was suspended while running.. +**SUSPENDED** - Suspended while running. Flow ==== -.. image:: img/flow_states.png - :height: 400px - :align: right +.. image:: img/flow_states.svg + :width: 660px + :align: left :alt: Flow state transitions **PENDING** - A flow starts its life in this state. **RUNNING** - In this state flow makes a progress, executes and/or reverts its -tasks. +atoms. -**SUCCESS** - Once all tasks have finished successfully the flow transitions to +**SUCCESS** - Once all atoms have finished successfully the flow transitions to the SUCCESS state. **REVERTED** - The flow transitions to this state when it has been reverted @@ -57,14 +51,14 @@ after the failure. **SUSPENDING** - In the RUNNING state the flow can be suspended. When this happens, flow transitions to the SUSPENDING state immediately. In that state -the engine running the flow waits for running tasks to finish (since the engine -can not preempt tasks that are active). +the engine running the flow waits for running atoms to finish (since the engine +can not preempt atoms that are active). -**SUSPENDED** - When no tasks are running and all results received so far are +**SUSPENDED** - When no atoms are running and all results received so far are saved, the flow transitions from the SUSPENDING state to SUSPENDED. Also it may -go to the SUCCESS state if all tasks were in fact ran, or to the REVERTED state -if the flow was reverting and all tasks were reverted while the engine was -waiting for running tasks to finish, or to the FAILURE state if tasks were run +go to the SUCCESS state if all atoms were in fact ran, or to the REVERTED state +if the flow was reverting and all atoms were reverted while the engine was +waiting for running atoms to finish, or to the FAILURE state if atoms were run or reverted and some of them failed. **RESUMING** - When the flow is interrupted 'in a hard way' (e.g. server @@ -79,24 +73,25 @@ From the SUCCESS, FAILURE or REVERTED states the flow can be ran again (and thus it goes back into the RUNNING state). One of the possible use cases for this transition is to allow for alteration of a flow or flow details associated with a previously ran flow after the flow has finished, and client code wants -to ensure that each task from this new (potentially updated) flow has its +to ensure that each atom from this new (potentially updated) flow has its chance to run. .. note:: The current code also contains strong checks during each flow state - transition using the model described above and raises the InvalidState - exception if an invalid transition is attempted. This exception being - triggered usually means there is some kind of bug in the engine code or some - type of misuse/state violation is occurring, and should be reported as such. + transition using the model described above and raises the + :py:class:`~taskflow.exceptions.InvalidState` exception if an invalid + transition is attempted. This exception being triggered usually means there + is some kind of bug in the engine code or some type of misuse/state violation + is occurring, and should be reported as such. Task ==== -.. image:: img/task_states.png - :height: 265px - :align: right +.. image:: img/task_states.svg + :width: 660px + :align: left :alt: Task state transitions **PENDING** - When a task is added to a flow, it starts in the PENDING state, @@ -105,7 +100,8 @@ on to complete. The task transitions to the PENDING state after it was reverted and its flow was restarted or retried. **RUNNING** - When flow starts to execute the task, it transitions to the -RUNNING state, and stays in this state until its execute() method returns. +RUNNING state, and stays in this state until its +:py:meth:`execute() ` method returns. **SUCCESS** - The task transitions to this state after it was finished successfully. @@ -115,20 +111,20 @@ error. When the flow containing this task is being reverted, all its tasks are walked in particular order. **REVERTING** - The task transitions to this state when the flow starts to -revert it and its revert() method is called. Only tasks in the SUCCESS or -FAILURE state can be reverted. If this method fails (raises exception), task -goes to the FAILURE state. +revert it and its :py:meth:`revert() ` method +is called. Only tasks in the SUCCESS or FAILURE state can be reverted. If this +method fails (raises exception), the task goes to the FAILURE state. -**REVERTED** - The task that has been reverted appears it this state. +**REVERTED** - A task that has been reverted appears in this state. Retry ===== -.. image:: img/retry_states.png - :height: 275px - :align: right - :alt: Task state transitions +.. image:: img/retry_states.svg + :width: 660px + :align: left + :alt: Retry state transitions Retry has the same states as a task and one additional state. @@ -138,7 +134,8 @@ on to complete. The retry transitions to the PENDING state after it was reverted and its flow was restarted or retried. **RUNNING** - When flow starts to execute the retry, it transitions to the -RUNNING state, and stays in this state until its execute() method returns. +RUNNING state, and stays in this state until its +:py:meth:`execute() ` method returns. **SUCCESS** - The retry transitions to this state after it was finished successfully. @@ -148,14 +145,12 @@ error. When the flow containing this retry is being reverted, all its tasks are walked in particular order. **REVERTING** - The retry transitions to this state when the flow starts to -revert it and its revert() method is called. Only retries in SUCCESS or FAILURE -state can be reverted. If this method fails (raises exception), task goes to -the FAILURE. +revert it and its :py:meth:`revert() ` method is +called. Only retries in SUCCESS or FAILURE state can be reverted. If this +method fails (raises exception), the retry goes to the FAILURE state. -**REVERTED** - The retry that has been reverted appears it this state. +**REVERTED** - A retry that has been reverted appears in this state. **RETRYING** - If flow that is managed by the current retry was failed and -reverted, the retry prepares it for the next run and transitions to the +reverted, the engine prepares it for the next run and transitions to the RETRYING state. - - diff --git a/tools/generate_states.sh b/tools/generate_states.sh new file mode 100755 index 00000000..2da75817 --- /dev/null +++ b/tools/generate_states.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -u +xsltproc=`which xsltproc` +if [ -z "$xsltproc" ]; then + echo "Please install xsltproc before continuing." + exit 1 +fi + +set -e +if [ ! -d "$PWD/.diagram-tools" ]; then + git clone "https://github.com/vidarh/diagram-tools.git" "$PWD/.diagram-tools" +fi + +script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +img_dir="$script_dir/../doc/source/img" + +echo "---- Updating task state diagram ----" +python $script_dir/state_graph.py -t -f /tmp/states.svg +$xsltproc $PWD/.diagram-tools/notugly.xsl /tmp/states.svg > $img_dir/task_states.svg + +echo "---- Updating flow state diagram ----" +python $script_dir/state_graph.py -f /tmp/states.svg +$xsltproc $PWD/.diagram-tools/notugly.xsl /tmp/states.svg > $img_dir/flow_states.svg + +echo "---- Updating engine state diagram ----" +python $script_dir/state_graph.py -e -f /tmp/states.svg +$xsltproc $PWD/.diagram-tools/notugly.xsl /tmp/states.svg > $img_dir/engine_states.svg + +echo "---- Updating retry state diagram ----" +python $script_dir/state_graph.py -r -f /tmp/states.svg +$xsltproc $PWD/.diagram-tools/notugly.xsl /tmp/states.svg > $img_dir/retry_states.svg diff --git a/tools/state_graph.py b/tools/state_graph.py old mode 100644 new mode 100755 index f6a2057d..77b85636 --- a/tools/state_graph.py +++ b/tools/state_graph.py @@ -1,5 +1,6 @@ #!/usr/bin/env python +import optparse import os import sys @@ -7,41 +8,13 @@ top_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir)) sys.path.insert(0, top_dir) -import optparse -import subprocess -import tempfile +import networkx as nx + +# To get this installed you may have to follow: +# https://code.google.com/p/pydot/issues/detail?id=93 (until fixed). +import pydot from taskflow import states -from taskflow.types import graph as gr - - -def mini_exec(cmd, ok_codes=(0,)): - stdout = subprocess.PIPE - stderr = subprocess.PIPE - proc = subprocess.Popen(cmd, stdout=stdout, stderr=stderr, stdin=None) - (stdout, stderr) = proc.communicate() - rc = proc.returncode - if rc not in ok_codes: - raise RuntimeError("Could not run %s [%s]\nStderr: %s" - % (cmd, rc, stderr)) - return (stdout, stderr) - - -def make_svg(graph, output_filename, output_format): - # NOTE(harlowja): requires pydot! - gdot = graph.export_to_dot() - if output_format == 'dot': - output = gdot - elif output_format in ('svg', 'svgz', 'png'): - with tempfile.NamedTemporaryFile(suffix=".dot") as fh: - fh.write(gdot) - fh.flush() - cmd = ['dot', '-T%s' % output_format, fh.name] - output, _stderr = mini_exec(cmd) - else: - raise ValueError('Unknown format: %s' % output_filename) - with open(output_filename, "wb") as fh: - fh.write(output) def main(): @@ -52,6 +25,14 @@ def main(): action='store_true', help="use task state transitions", default=False) + parser.add_option("-r", "--retries", dest="retries", + action='store_true', + help="use retry state transitions", + default=False) + parser.add_option("-e", "--engines", dest="engines", + action='store_true', + help="use engine state transitions", + default=False) parser.add_option("-T", "--format", dest="format", help="output in given format", default='svg') @@ -60,20 +41,90 @@ def main(): if options.filename is None: options.filename = 'states.%s' % options.format - g = gr.DiGraph(name="State transitions") - if not options.tasks: - source = states._ALLOWED_FLOW_TRANSITIONS + types = [options.engines, options.retries, options.tasks] + if sum([int(i) for i in types]) > 1: + parser.error("Only one of task/retry/engines may be specified.") + + disallowed = set() + start_node = states.PENDING + if options.tasks: + source = list(states._ALLOWED_TASK_TRANSITIONS) + source_type = "Tasks" + disallowed.add(states.RETRYING) + elif options.retries: + source = list(states._ALLOWED_TASK_TRANSITIONS) + source_type = "Retries" + elif options.engines: + # TODO(harlowja): place this in states.py + source = [ + (states.RESUMING, states.SCHEDULING), + (states.SCHEDULING, states.WAITING), + (states.WAITING, states.ANALYZING), + (states.ANALYZING, states.SCHEDULING), + (states.ANALYZING, states.WAITING), + ] + for u in (states.SCHEDULING, states.ANALYZING): + for v in (states.SUSPENDED, states.SUCCESS, states.REVERTED): + source.append((u, v)) + source_type = "Engines" + start_node = states.RESUMING else: - source = states._ALLOWED_TASK_TRANSITIONS + source = list(states._ALLOWED_FLOW_TRANSITIONS) + source_type = "Flow" + + transitions = nx.DiGraph() for (u, v) in source: - if not g.has_node(u): - g.add_node(u) - if not g.has_node(v): - g.add_node(v) - g.add_edge(u, v) - make_svg(g, options.filename, options.format) + if u not in disallowed: + transitions.add_node(u) + if v not in disallowed: + transitions.add_node(v) + for (u, v) in source: + if not transitions.has_node(u) or not transitions.has_node(v): + continue + transitions.add_edge(u, v) + + graph_name = "%s states" % source_type + g = pydot.Dot(graph_name=graph_name, rankdir='LR', + nodesep='0.25', overlap='false', + ranksep="0.5", size="11x8.5", + splines='true', ordering='in') + node_attrs = { + 'fontsize': '11', + } + nodes = {} + nodes_order = [] + edges_added = [] + for (u, v) in nx.bfs_edges(transitions, source=start_node): + if u not in nodes: + nodes[u] = pydot.Node(u, **node_attrs) + g.add_node(nodes[u]) + nodes_order.append(u) + if v not in nodes: + nodes[v] = pydot.Node(v, **node_attrs) + g.add_node(nodes[v]) + nodes_order.append(v) + for u in nodes_order: + for v in transitions.successors_iter(u): + if (u, v) not in edges_added: + g.add_edge(pydot.Edge(nodes[u], nodes[v])) + edges_added.append((u, v)) + start = pydot.Node("__start__", shape="point", width="0.1", + xlabel='start', fontcolor='green', **node_attrs) + g.add_node(start) + g.add_edge(pydot.Edge(start, nodes[start_node], style='dotted')) + + print("*" * len(graph_name)) + print(graph_name) + print("*" * len(graph_name)) + print(g.to_string().strip()) + + g.write(options.filename, format=options.format) print("Created %s at '%s'" % (options.format, options.filename)) + # To make the svg more pretty use the following: + # $ xsltproc ../diagram-tools/notugly.xsl ./states.svg > pretty-states.svg + # Get diagram-tools from https://github.com/vidarh/diagram-tools.git + if __name__ == '__main__': main()