From 4b172d57838bf1e2f5eccbcc6b3038a4e09d73f4 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 8 Jul 2024 12:44:39 -0400 Subject: [PATCH 01/10] add screenshots with scheduler service Signed-off-by: Hannah Hunter --- .../getting-started/install-dapr-selfhost.md | 32 +++++++----------- .../en/reference/cli/dapr-uninstall.md | 4 +-- .../dapr-init-output.png | Bin 0 -> 36770 bytes .../docker-containers.png | Bin 21405 -> 23295 bytes 4 files changed, 14 insertions(+), 22 deletions(-) create mode 100644 daprdocs/static/images/install-dapr-selfhost/dapr-init-output.png diff --git a/daprdocs/content/en/getting-started/install-dapr-selfhost.md b/daprdocs/content/en/getting-started/install-dapr-selfhost.md index fc82e73ca..b851a3c25 100644 --- a/daprdocs/content/en/getting-started/install-dapr-selfhost.md +++ b/daprdocs/content/en/getting-started/install-dapr-selfhost.md @@ -95,28 +95,11 @@ dapr init **Expected output:** -``` -⌛ Making the jump to hyperspace... -✅ Downloaded binaries and completed components set up. -ℹ️ daprd binary has been installed to $HOME/.dapr/bin. -ℹ️ dapr_placement container is running. -ℹ️ dapr_scheduler container is running. -ℹ️ dapr_redis container is running. -ℹ️ dapr_zipkin container is running. -ℹ️ Use `docker ps` to check running containers. -✅ Success! Dapr is up and running. To get started, go here: https://aka.ms/dapr-getting-started -``` + [See the troubleshooting guide if you encounter any error messages regarding Docker not being installed or running.]({{< ref "common_issues.md#dapr-cant-connect-to-docker-when-installing-the-dapr-cli" >}}) -#### Slim init - -To install the CLI without any default configuration files or Docker containers, use the `--slim` flag. [Learn more about the `init` command and its flags.]({{< ref dapr-init.md >}}) - -```bash -dapr init --slim -``` - ### Step 3: Verify Dapr version ```bash @@ -138,7 +121,7 @@ docker ps **Output:** - + ### Step 5: Verify components directory has been initialized @@ -189,5 +172,14 @@ explorer "%USERPROFILE%\.dapr"
+### Slim init + +To install the CLI without any default configuration files or Docker containers, use the `--slim` flag. [Learn more about the `init` command and its flags.]({{< ref dapr-init.md >}}) + +```bash +dapr init --slim +``` + + {{< button text="Next step: Use the Dapr API >>" page="getting-started/get-started-api.md" >}} diff --git a/daprdocs/content/en/reference/cli/dapr-uninstall.md b/daprdocs/content/en/reference/cli/dapr-uninstall.md index cf9091c04..877987820 100644 --- a/daprdocs/content/en/reference/cli/dapr-uninstall.md +++ b/daprdocs/content/en/reference/cli/dapr-uninstall.md @@ -24,10 +24,10 @@ dapr uninstall [flags] | Name | Environment Variable | Default | Description | | -------------------- | -------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| `--all` | | `false` | Remove Redis, Zipkin containers in addition to the scheduler service and the actor placement container. Remove default dapr dir located at `$HOME/.dapr or %USERPROFILE%\.dapr\`. | +| `--all` | | `false` | Remove Redis, Zipkin containers in addition to the Scheduler service and the actor Placement service containers. Remove default Dapr dir located at `$HOME/.dapr or %USERPROFILE%\.dapr\`. | | `--help`, `-h` | | | Print this help message | | `--kubernetes`, `-k` | | `false` | Uninstall Dapr from a Kubernetes cluster | -| `--namespace`, `-n` | | `dapr-system` | The Kubernetes namespace to uninstall Dapr from | +| `--namespace`, `-n` | | `dapr-system` | The Kubernetes namespace from which Dapr is uninstalled | | `--container-runtime` | | `docker` | Used to pass in a different container runtime other than Docker. Supported container runtimes are: `docker`, `podman` | ### Examples diff --git a/daprdocs/static/images/install-dapr-selfhost/dapr-init-output.png b/daprdocs/static/images/install-dapr-selfhost/dapr-init-output.png new file mode 100644 index 0000000000000000000000000000000000000000..e3fde1fddc9be9139af12bf35ae1a5f2ffedbe17 GIT binary patch literal 36770 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.e{9d%8i1<6^?MA&dakH(u zcER$n_P^nVXloHK&Y65&%Pi;!f%dW>UZC56lmzh8>|(#Yvo#aJDsH$XG`LhN&TTRu zRU4MyHUTO(9E;o|htvUH!=Pqh@P<2i!8Z{A9_ePRkAZ;_quB2P?~<8W{Z8<>|Mz<; zN;LG_6_>%)MC6U}8(kS-M9@exAPpy*iX9T5 z`)3C-p7NcX0)KsR3o#{el5_inhm$X#Vq(Iw%o|#sY^|=YR);SZ@Z^q9f>#M@$c+0d z1o-%&!66~Fi}2C&X&@~NyG4M7)bm5Cc z7SstspUl~7RB>cljBXXQmnF4X#X&kv_S}I|-4YkRv?pArKYml_K_$?fY5n~4nxnRw zsV!k}(8=3L*@?8(1;`b4&&m+(N?ADO1zw>Ihis}&bYp?qadp7Hf z`{CX}Jn|p^=nOtmuuG}(+4ST=V!+@ZHhH)zy6^06fP4#znCJT97#L))I>4|8p4pA? zsJF1dz4lAy7l+Q0mG%2Xb7JH1=Nea2v+mcf4SE^oN;OLbCO&xhkdBs?I2fh`tgNh1 zbFP5*U0P&ov4Mx>o~Zq>jJx}0u31Bj>vtOdIp8Je=38BZpjrz?@kcyA&>>_KTs6+8 z&dvto26vj0s?{{y>+kB3abfYpdxG-gHxQ_jM3T7e26PLn$Y#>3G z^lDD&@yor}*qfMPRLrB|*ICoY+x~l*%)-_5`Ewh-h)E(1YA9a_%g;9X_m^mp`B$bA zmpiE0cP_hM3flp+_R*S=)q<%XOM#nIIsztKk8?}CbK}#}tf1cp6>?@~1|k~g&!5Mg z&Od95OGwxTMqT8m0~jUc4r8<2YcOUzMSzPsiT-6DXJT9z+@?O)f&QqF^+-qUI$(wp zlcU?XA;nm|QPWiQ1D*_^nv>jM5Snms9ef(m4nOY2l(|koY5ssJ$xd~RCR5N&Dz>`hN)ls~p z^3=KciOkI*{ZcmyHLL{RKWrin$0derJwCH5?b#|^nyq#0W zq6XUI>~_Rmod&VXjyL*`Y@)cdnPr>AHo2rEix?S(2S6P_xP;#N6G|BcQob!N+fHWe zQWEJmn@MlwTQoCs=^?^B91CTDc;XO9wh&490^}(C6{Ao%BKc?o<_BHJk0WMhH$q5$ zVn`<(N5~1#avV4^Ad-8-ls`vEi2Muak*Rvc4_V_8QcCrwi{z;x9n$7tfac` zPvpFPy97smZpofsyCO($JtI9`x{D0J9kW|_Lf*as7l=JsiqCLzR&lbUelK3)}<}TPzzQl;?_E!R5Zx%s=LRoA=)_o~W3K#OXh;5tO2cuwT z7g9Lhy*mRTOElBQDLSje9png;r?T#Zw=eE4EghXbcCx}32(a_XL~~hx!iwNOw$MM7 zp?x%brYPP*PC+4H;CK*)6UzS1ZBxbmAovoyUdS*g)wwM&cXnL<(*U)ODCb=W7s3OQ zWg|fhQ(XifM_eObiRSE;qjw5Y5UhkKJTC)Oh%Z^X5+(KRO7|7Rmwb5Gn2v%}^yKPn z|D&#$rem0@B6iHpV_>%{Mjq#lHO;Av?`uPF1=A6L=2wq*tW~y^BubqO*5~6}2 zXX<#Kyq9EHCQ@?y%CDko&JL*VU{3S=ROg@US13XMnYAfPFK9QSHH$Y9xMu(FPA&l5tnEQM=^uJY5W&0NYFedX6qKH3SejzwBT>a>uPG%T3 zQl8PHhM3p-c&s6uXdntifS!XmtKqQ&rH|CLb2l4H>_>1qKp1%hCy(25>K*^@}3&!rx)RwiJsJkWu*=+8bY9yiSRNAvxeH;x!n(w)iyf1Ev&?*vp&+CnSw9 zmI-MHKUr8S1%T$x7f4i0xrXm%86`Wy5&kbT4EtvH&jYHde(TfgME5GwvKKFuq z=QxQF!+8g6CY0v_nKl=_XS-TQMphQ+@iGN4(z1WNBe?*)PDpP64i!KvESyxa*4EZz zi}@MTtCv#RH4)Cky=2305gw&G8$SYSMJ!9MTI;=Yo-_E^n=0vn*Hb;8Nj#*qmi$_L zykf!pMGX?@?qJHraBDy zxJ4xYQDfFey7vcSg0>X2gX1-)Z3O+UUkMok$xHP`Qf-)j*wKC&f_y^EVI;~gQp{*D z^n}J`xnq0&jX^027aLs<@!Dt5Pew!tnA8v!HT;`vb_Tpmd#SYnaNHx~{>GPdG&F&k z`(dyQLmi#x;o-|*S7MHnorGsN1Z3Ua+_I@`yeNq)P8aN3Vrk!+){~NF>f}##-;9+F zPqh#!_|(|wIa@TIoqP3>IZN;=iw|JvQ*S`~qxIl%oHNuHi!W__A%KvnS9DfDU?q?( z2CzT9L}EV=$OZ@k3pS1Ga!A1Yf7e^l3T~ewsP_jPBsx zr3?MHnkC?YLjIpMi+7lwStish0pRF_uKo_WBxP{5U!t{UK2A#dK(OHnK=#{8Olpro-WCq}k5*mB z1<^Jzw@*rie!5@&AOXpafS_Q)4fP}-AtNa>>{K`RY*kU@t!f3wmyR4BIBszF90;{SeK@$9xkr=%4%_=UD78}Yqx^=zYyUOLmvopzkDpR+WIg`; zV5>TgycaLoZr*2U^F3fMZeHG2s%xnfk5oGSG5K4!G9nrA7$>86h_ZCUiWl~NxlwP# zRl{B9wx-_3+ep{C-{#yQ&pSDn6MkD(@z09JBD%=aYY$u|!uw0TVXq5u5IrC+Bh>As zrgBV1O^w8hJQ#Dm>S|rdo4hcy=8De7RqJ*4TeV9t{r)v(2Gq4UFK=A!5&*7%<06qz zUS6J`-~RJqZ$Kneion!^$Q;_j+8SDGEf^-DMsk zV6*)oY(fpv&2=bhD6;#k3^(SY-`lyX-df`XH?+G90kXuRP1j;h_4ISBiGC;<)FMpP zm~iC5h5ALJTs80R56y9u^ZVB~DfBhTyXmAy!f+3Dfn!}9^Q{k2WTc(Pgq<1KJdL7clkYsKYW zB8ktj+nj{BxDvjg(WHK{X^?#I;oG-w&7nF4?P2uMlwGgJLP!7n*o5X1RZVb~CANApR=<{=C>? z9YHHl!~xjrBVE(S=bBVs|+atur?s{E2#`GKyaOOb9c{Sx}*kT zS;r?R5ljsgPH@S)tb=<~5j{Zo+DW+8oH`RoZy0>H6eM`A2Ngd85`j@UW~i5)uJ7o1 zYQV+fL)gQ!>d+e@M51pYbahl@H3zNa-hw`S_Uu`}%`_ixwO@*6s4~Hi7gP*ks}8Hf z{jD6*`e!-BduXWk&vGc@zbJ>IonJf(3i_yt`&8(5U%(1UDBG!1r9X!s1?Z?<@Yq;} zdk_+{)3Uv>`MVp2yPRoKx6a?4YP+^pcl_Ia;K(#thyQ?O9yUqVwR3v2{{BW39@>A? zQVS_Q!B&WXyDJ$He-uIzQ8^S->)##{srpzf?fWuUBY>q7FXw{+7bukSv;_(xyCMj3 z_Jp6E4eM&joX#w`$G}38&~r*DQeh<4V^v$G2aad(h$he=@eL*CuO}UEV34z!SeIWT zbyD}E{W{5vpByHhku{bb(LY(E({ao?YMY&&F>%PR4Vh` zZVcvn{Xz}KaBrQFFzE4ave-N8PpflHy&9go zS?}GM$94=?JK8%s(z3pu?y|sX*6Ky@tM1B576@De!|Z2V2Ayn$2CWwxwS#Wd>+X+2^r%7DSv(A(4u`DwP}%?d`4fx` z;N5~N!GWYDz*QczFYHW09g?<$a|Es<$W$=FDVaNtsnev*&Q||g?{)I>@OlNsr1SUU zUBwxM!20uV0;}kML14Y&DfbU|qP;LZm{)Xa#v`JlLdx=E9M28Mb$!^y4AX+{_iF)ztR`*kBOhs_%%yY~Ohg!!t)@8INvvHtW9= z{bV66DG8|bpBHyEH=n4_J@!kWiF+ytCud51`v0fKO5NP6u^N64rjzXl(^XHBsQstFqlPm73`+iq69>Kk>rsww`8d-A z!ge7^{8L0C=O_-sU-$_%)d=PyVpW$-2Lm*ui%LqhyYt&OBXxCBV^7Nv`tYGdK9Gc_ zX}^5XViFdCaB&dt=~_)x;xtTHWpgtL(a6NCM2r??&YlwdAb|#j7q_pjy<(3stKmQb z1u`;Xb%{;A?o`I-eTZ@CfT*UUr#J1;t-aeKY^?M#REwF4@a_>J1}?`m2!#<6>VX}f z(s&!ZicHPDy^oHnp*B_;UTMM{WdRAbxch(=R}rnJI{+tVTIJ$CHk8K~R5hdXtG-&w zgCq}56iBV3OJ^&G zV1Fx%il^9r$mY)2RjnO1V1#iim^ZP~Va~uilgrDU%jajpCyS}YEiPY?5Q#+`VkSw5 ziI00Mh!a3?4KJbg4Lk+Vt0?ApFJ9dT2tlkKU#9bkgv9V_VkJ26L12fX>B7CAyu<16 zz0LeU^OmWA&-0}2V3tJP$v`Nm6%Ra$2QVc%n0ka~Ih2TFy$3cEUe9>lu&pd-A5N$vu0Hw0;@8OU|rkRe8j;Bwl z72V(Ld8KZQ+8>&hYBr1aw}ZCM;$c$oS87-q(q5J~jMi{08r#`lpw+^$CnH@1ugDmB zal;~2`wCrepYr{j?@k~AlX180FrsKY^)deu(2De7?FbCORL`%1)EaCvOjYq=QQ4?uoKoE5u&D?pR1s$`uJIl|eh&gE z$vD%czXIb_31;q)a6G#=7CYo?1!J*hLYbeKkPCStRw@~{UY-RBa@YUm1V2M1s*o{iOPvX_oFbA>0Bnc1laG)0Tru*ET(4fGU%b88;pl40Yz#Z6b zqZ-10=-|PFNp)!rs!-X;B96|B!S5Z{fu2-@KXIZ!_S~rT5avmMLPAtGQqdoze7wN$ zG4YuEHCU{WnHg4^Sff^|*r$Lnvn!JilA2!wPJd~`g8g|sJPg{t*j>buLxiT3)PD#~ z7Srz_kFiT9AWgy=`&Phgb8UQv!+B@^q7(=BoOk%9SAZ@=Pt(idE-i;*%A`#a(f+;b zC4xz46pW+2e_-O%9xkd4KhwavaKe%C&E$Y+O`yfQ|8f9^NKSRqP$l7xprP6e3<-fj z3>Q#*($b!&V{YK?8eKYSud!z4m_e9-m2{UG=5^ZI|HErEaQ`R1T4bbs zOsfeVLw-pi@S}^T7jBr_^4mEADZ8M3ksoKzb|mJc;=_0Lc@dxD-U8K8g5Tw*XFh

9_Fj$Qx8LFtmz5DF@WMM-Ur;YL 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 literal 21405 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 -ha#n+O$~l$LBQ<%mMK zP6VEC+S?O6Gm*xWp`Q7?KZY^2RaG}XhqQ>pI~%fz6Im5RkS!b7GMw@xI4syUIPz8C zgowIr+u4m{u%)RD466i%8LHVZ!uIV2KGtglfTGN^)UbBKH7^ba#cAZz+Rl|$Os5NI zXjow*7T-%qAfHGom@F4yZ`cQri3FM6-CP1(kT;PD(28X6U829QWB?XzxfXa?+SsT; zm>&PpoX-h3y$lpSGEx2%_7DA(mnM@#A;?clD>msW+vjO)63S{e@=>ViQ_2dLELW}4 zD*q`iJbL1&4EhfY)ep>DaqGbp?-?{JtS3+8KR#zyDT;G2Qc&VNz?HaEcg)YI z5We>JMHGOlyTpXClAoj9U}sv`!7oKf_c~)_|4Dhoj1#-@EOt6>HT9u?S(pP!zaZ|Q zG-}tfC+rL{w-x?O7e4Rf*yss%4HBzcIa+pokRsK#tXcwicDIn04yj9v-Vgv*Ode7N z;JQ|_hOz4ijbZb!d>SzUg4z}EFw!^(HIZ%56DBaFQhIm42pYje>w|Ez?Z}FYBRMv! z_(pFUP~xtNgqEn`(aEk1e5coBA9LDhd^ILSU}GBtd4v-i!Dp5%#fJw^!>df_s-{Nx zQ(nbtxC+P&V;|ynhnAXOOKHtw>eAvvkl!FZHQauaWb>ph&b3^6WdpP*xQH>Y38g9pcY>WNFpp$(3PW9b z93?+R&Kxocgp3>IYK?#UMnmkhJIgV_+L8mo)?LaJ zPyvSxE%bF?he%RuG9u;78#W~}vp$FeHf+=sxt*73E2g$La`{ATs~F8qNp_N<(8-?R zGrtnZsind$EPO0_6j7T~?N%%~4OMg{G2Ck#zqFTIF9(*{qgO%e7%LaSr^&kN+4HS` zbA{$%n;O&@NIYttAzx}p`GEWBqkLW`0?ZK%Ev|Z12RoWz%3xycNq%^Id_2#0H-BOG zkS2#!;gU5ploVhSvIuvI;eNYAE3QF}<9}oYtU||q)`k+FHV2d*u$Ja4>Xr{#*FUka zFF^K<+hPh?y{YVJDvqXjW#^p{{JxSiR%b>0fy_s(cyc-A|mRRjwz{5G!lHp(Ha&%_p%xcFA2_QbE@B+x+ zHwD6mTobSb@*YQNe5Gh}H-E)uUUV*w)qg)~AuO+TTBM{irCr~im5+*1ep39xeGx>) z`EZ_q0#zIG?Ob+1G+k)-Zny1IBrlYDi)mjwOcnBw!7#N0?P7y8qezo@gX?PTmOfj4 zEpR~$k=Df|<)sv6PX|h2Hk9#k$dp>Sj{DDVjB~|bPBS5g7wgf^wXcXc^&ffrjmzjz zchMs)-KnUC{A@!aCuPRbi;?7K-i10TTTho(g!_&o?8J(j=2xojs(RLpK&(!I@2@z3Fjk)* z7QD$G5VB1+-LHb?HX`ud0|>q+T-YNTE*(fZggS%d?CaNdxs}Qdi%G_BqAKd+ zycB0fD??0BR9dQ2WhCa|aSfnv-nguHh@rojLC9Vs`)(cY2Y3E=r#sM!7GZmkwaeqL z8`+jA4*`Iq{bEvBSO|nbwQ9j>X7 z$om>(g^NY!G0l80gYPZwBlCbou-&X+rwM3BGDQFN^CuG%leCP?;AjfB%#bY&dF79A zL~K8Pu3Rf;mX&TJz!F5|-Y&`2KSnfEtp%h56#B^g5$#;_+X_`;%3UXvE(aF>0E6$m zMvvaH9yp>FMcMNsc1s^oZ#}mO$X&fs)zuSyp3ns_hoKBEm0q)ZKtUWwgA$dfDN|?G zEF7K$flyMy0R_YziE4o3gU8^PFJiV?jg23fCB%O?k=R4@uDut<-kbOAY}(HTL{SYT zCMQd&tKC_7G9$yAts-s>OY2hIY5V?SmgxOU!|1`Hg3S4pvqJ>yrRX<-_cv~npq+aT zdbPBZ-I_6S0nZBnxIUD2aOG+@EIJK?hV0_>>+8q(_@1DxJhszNR{r`RFqow)phGEn zQ-fVC2y;tIcSGqj8n-h%=wv?v;qw){=i4Qhq*5M#2%H`AX#e#=yM4v$le!&jip^y6 z455L{n+%kHYmGtQU7H-v2HE{KZ4#dRz_% z#kOqXvTWLnio(<$03GK83m<_LCbkB=<($#S>CtC+=G*wCy3J>RV5JLhN=nUX(g~M~ zXHXoPXnORRH3kzJki23K~9voIwIVzekw!mN;VZ$ z)$Gqn^v2Vrg&FUD7Npu4sqTMo)wY_DA~g6*=y#%8FscTrN}T{d4Op5tFeTH!&e)Je z%ZGN>iIj}OtEO7RQV^0%y#rnH;m=tp@CUFL?qthK&$b??+P4`BbF?u0{8iCDsw0!R zwYd_us%2xMhdVi5>DZI@hvuK2Qq;}XXSVssuTzIfbf_;J@niAbMf8C#lOf zNUEN{${Ny)3A9^CpPoiq^aSB-wG~%*h9`Bp^avOy_qyb5gY&=Cq||bQaY!suu+oW4 zVUopukVA7;$B>tZJ6S&Ldzj&ip^C*e(gpwIa9ID&>Edve+6Vi-41NFYMx!T|khS$M zU_CoIIZ1}>4j*{md!RG?cxpb1t*%Mmq^PZZJt@OBQTgdp$ati@Re1~RYtoTeRahlB z*D|OXhXUii{wNJB{?MaeNE`^LzxEK(x2)xWd!$@)cfKxMVUiC;V1Jlrap?=sazxA` z^Ld?NH@UzuVHN(-{8YiWhS zD0S%$6WB_%^f)M~tM}`|h{up{yxl?UWa_&Gm#saj#11NHyom6DT#}XXRd?+ zg!F8eriICKc>OR7jf8JQ$sHeSX!ta%{j7t{RBX!;0k(b<%?Q6sPe_0)KlFtJnchM4 zoB{n^Lw^gY4u?KeQn(N^l_zSJI@R9HjBcIzoHn%@8^AD-2ucmP>TTxya18VyuS@&E z*uj&kX95LEg1E$Ohh2~Io}}SaEWIcthYMtDyT}O%qkj^((yii`Wb|k_ktLU>V3tpT zqkrWi5qo2lEU6<~w`7CRXTw9D4r}zi%WCd`uQaf+%)tXm#X@dEaHDwY?WY9yWj9}( zu)FOWSC=W)nEVGGCUEeTJ%Ah#7ID?_wkqj)8@7=GM3SSCP}=}~nIPf=2dU^)j_(X} z@w2ex>W+iRSqgeA7$>n8Oy&_BJ3G>-h%?E8i0azZiSHxPjG{`6WT;SECRH6T4~Fg_ zZr=WQ06<l(tMFFSgsuDXtOK2bY(Z1L{`W9k_Abaw;paA3Fd)Y@?Sgj`viC{UI9^ zzEr)~o`44FC|4?3iNx(mIcMqJnR(!`6UL zG(H=7K}1gOi;tH;F+&(G0U*o)R}308z@Q&nNw))yLm8ivmKO2g>)jwG?H#b90_%Ei z`(r00@*1NWM!Xt~1dq@dp(CCG(fg^{u*X;5wOX?5F&O>B|F6Ubj7aB20NNkekCO{3 z?OqA^}hk|9w9k4$;oQ8wgaX{gxAX=mAXhD|-6v z(;r{ezWZhm!5ks21}8M7OqHmco0;JzV($Un14sln+iv0)^T1;YM5CkxJ z4^qd*r=lXNvyc2P#ox{{14I?xv{}!v4&rKZ^YGv)1Dh0YCSpQ-JW!dWhGu}z&Y3YO z6)?kbOu}_{*Y*?$TUt7%3-z`_-3(aGf?Z;T=z6&Ga*br~K5SbGVSUxXAxfKtr|o8N zNWn*gWuzu%=$o?xeRiy5`CpEh2D0xc|Lz^X#0)ZVkpAc2=T90D$iWeM%%%rqlZ2$N zG(muVMtW!&SskWL-+6e5vG2S>eax&e{`ISf1Ffd;lNSeIL|~Ez0WCj~(j4%vx#E%Y zz|xkjC@$U?&eq1D3IHv?-6HR3;WI$q0_I*#tW>kjlMlX&o%#$sbzqGKF1XE~4mTH$ zCK|2p>Qr$$RJ%a^lMZ3}5Eln#+IBu@Lm3z^{r`J<`zdu(p<# zL+R$ayAcE~6;Pgoh1cLDy2ij)C5#7QKYHacmhnP z@e8oxHng>xl?JePw|_iH-M&2S-uLgXt>?g0&>k1>6OO#i=~7wQWL`&ViE9D@lbC=G zK@etxB|4y#<%yEVqZ-o2e}|mS)tKWwlguWfo_w%PBn-4SbyA80Xl-gr+XXNaHm^J4 zGokTp*#Kw$zj|Z5HF6Sf{~gwcE|}x?JJQxWYij0WPfGkE7ARD^{r$_RU0@mmMyX>k z*u$n(D_Q)^Zc#%|k5y=b#J+_!1_`lqL)FV)xcvN0<=C6Q>-|Hij_C&xGcrU|XK$bD# ztmmP&S3%9|C}S24-8{g9fL}6U9lF9%z^#z3Lq$ zoQO5Y$K!7_aB^&d1(5DlWYqWz8VEM#KFDCl!zSF^!I)&#Oy$_xs6@frKp_LYCm0}9 zQmM)jLU)f>QBo3KeQ--9F#X-muvnZK-M8rpEnVMRJ&u0c%4fXb1APrJo4CUP!uYHQ z?=?W}F9D+f+@TZ&^6BruuTS*o{INEaG-inF_*!3&JRN&+y<79@a_}`6;sL`(Qtq#$ z9*Fw~n4A9gdu-_k;8y;U{1i-9Y)3ucU(q@TCvbnMnUR9eX~Q2&K+;F_qtK#Q!V*>B zHzi>Jfd3h4urGBr|I65NUX~E%1Js$9#{*A5xsf#myvOPqP#2qG#{{k;I^e5t;K|?Z zWCM_*ES5r7D4%{D7h^a!I@)%BcikUB)IB?ix;$Ynp)96<84%RmnqmslF?c$(05!Vz3H#Z>ZwJvcGKN0EQ8%DrHTHIaO&=$S zDKLM|BFd=%>IGo%!I?fj9a+r&JAUI7`Sd1;zH4~PJqtM2L&hUPLzQ|AopfPW6T3{bjqZ0(|y`$sNBeoWUO@jP;)TwTZ&e=hp-@Q+j3uHq-jCb{OMpLY=N48m4 zOje+yu4gew*Zyy!hX5zgGN1JV_nrMhJ%;~i6%ZkdQErrI0_AsG6||%bjg6o9CdK<_ zhb_h5G3GH@oUp50;=%7ojK-7isv(2`i&}YuO^0V06~OJ*=H~PbHsCg}D$#nn4a7c` zRDqe6ndK=mH&5mhU;OtS-{@eOU0-y6;(u#ZP#s-U1cnU+=X%V;rFquc2|~`B0bxBq zAI)aMCmBp?%ftPRf^Z}3E^VO_y(J)RBpH|%8jf++$+v+ej*ga=gG0vykP?W9h`_Q1 z9<`DSvF)%TG2F)Su zFO%Otr$82R8fIZ(S*-r52aI;p*gy}+DK8%#Vvwd_FI6*j2;DXnFtGXnA-tX!+Lk$j zE5rwc%$I2l(ibJ8seq5*Dy^vKe+0lsZ`o@(xdf*g^Y=hfktej6{ra^#IsV$&j<3IR z8cD1R%rex1IULY6s|grA=m~w7xsgB}9scqK=!o`Zo<2Zs4c6Q3eXPInjK&L0Rf`)w zc<+rqU9I?If!YvqCj9C-mkR1c7}Zzt62Z-OD)Brk5RDJ0MGf`94T|P{;OU=1b z*QRky3h=eBC7t2q7bNnCpc+_U24xK}9nf3vp+<#fYD&qm&db_iHv7OG>gs zr!m|6ox}DVd=P#T;Jk_N1{O~jNL@+3z2QVTGpaLv%mH`Ebi@_H|)D0r#LK; zrS+(mfa!ID$B)BPG{s<-y5D5kfZBknMQJwHQc@yQ9!S>V)6mfHL7ZhUr#$CF_GsDT zQXGCmvGLb20$5=I0U>F95UooK_FHevbfZ!ZE=gMA?UWc9pxl&{G<{` zGF|ul7O@NH46zbeZo21yEGt&H0COuNu_}C>pz~#oH)&1ucgG=OFJ+UIlWPUOiCAoF zLHpyQ1ZLJWz6Yc^NZd2~*#(*y+R5wG3$AS^8>&CrMK^>vkxvxb zlKj8#kz?DYe3P}=LnJBLWk`F&Z@REJNQWq`hG-LrFF_1iYG-^7$P%p$c^V0=Y@p9B zAQ&}E7W9lI2~4n7F`6vJVtpTX#R-jJY9T?)G)oCI^F3F0@@uRZI=`Av5GMo&!MlwVqYMBYqNMKIh=k%Be zDM&nrRY>ou%j5}KK>!IDs}mAOJ+kG|nJQ=x9XEQK zfju4O=gALEMS&DdE(^NrLRGrztY?NS4aOs3`(!+x&=iC13GH$&+uAZyv;k8eX=A8* zkJQeGgnSWcQQfVACFJ=_ugUGp6ck_VQT`UG2tl^8w%+@YK3Y~{zF&*Z?z|;itGH&% zf9_ocv&A!!AebtIY^3qfL5g#_G9l>GN9+BxWC$NbStM-MPR3r1=~*`zoe~)h zATqH((BeKVQVI;Fj652 z2sPwJ-=ZD{32IaFdB7<5pi&(`?rIGtmKKFn+}s44qGDC;Jyd6QID>u|TB66XwhT_y zO(F<{MQPPyk~>-j_Zu4~mlv9(%>YO_;iqxH6pY->erFFdyQ21F0H4fIGJgt<)wZcQ zbBey;SY)eoSEiiLZ9-CS0W+M4wlp|ffB%g@JPL3p(4wY(>L|lM$;R+i zv$sF^(~acPjGRl?6mP;qu5%x=+RJq8?E$TkUa%VOZQWn<{$Sf?j{*UUK#zd~tq{Qg z9#zz2%$I~1seII*P0$8*!YITuMYKSRB=~0tzevMW$$tGd^$DkrXd&fx`KfX(S4h>VP(=b10gIK- zF24%oQm4T}MYy_Et{@C2b-1Z+vxco86)03jK4tP%|H2$|hGu8G)}G+7(gAy9Uj@k? zWeIq<^(^|;9k0Z;@oTp2#8Dhhd`nd|wR+$JIduo0wjmKkN@WK=10hzWvqO?$oDXUZ zfI@X9lU>Q2GVj#X7bM@Kd> z_x6b7Yai*uJTb5nW`jv-FZCfJ;DzW9Lqa)2Hsfe#^LCSR+h631Iy)bpi`AoHCkEit z0w`6CbDA|~QcXFc;hI<+w|_QV}FQ|QTwuUj4 zmzD-2bCjcout>J<@QkbAlT+BefJ?GIAv)u4d-bLgK-C8y*2s|8`BL!zYUJGinc&+v zo|IU*V-67=P)p3A5!Ofyca&45xRp?;ZoTBtLvkwCoF0cla~#@o3ZVmK7*;ewNb;hg zdr2h|$%ge@liQu=_5ASo2kfo#2 zlznhV-~YI>%BmR)s)MM4#{JA2H|nwQrk>qwZu$r>{aZwQt7;FVYWrKzQg}>*FV5EJ zn>2#Xfeat#y%UN~PuG*$pOlmsTA>qbonF@QUfr`u*gW5c8;{xy_sUmDycw;zX}1#} zt!9LC?>YZ~@}e1e-M zlQPF0$<8(oBcJ#SfP0Eqo`gE;mS%&edH9flID7Jm0xZZ$HAA zKXa;|0Uyr_%?H1E`mZEg-@WIrpoElz?d>In)hj0f-U|hJK)~DYJcdl=$NJH8B71RY zR9`GULM2M1ug5|0Ju5cA!UAwGnseq6G!A zOqq_4hE--zDruk!il$yG|FJ&v&)Z5MCzqU|B<%Io+p+>C3R+`lqN>)KntZte72H%K z_TYyoNtM%bHF=$p*LDkL3O%t#DIx<=*nX6z4U83D-<+)ot9YJMBQp1bWKu3p@qwG} z*`(n7!VV=oKEjAr@MQ7FC!{gw=s%ittaD?=1UE?vTG?roz&@8e*1yrv&ke-k5BZZS zGTH`}A_gq0>)MG(tK*CgY^3TRM3#4BU6#Tb3G5z!TFOSf3&U@cj#}A^AYRdDgeWH= zfe!gLuGYOK^cuB)LU=W-DB6=UA9GyNHpI2|rIP89AQ|&$+0PabU~XYKiT?nJ;I=Ar zg`J~g6rKhRQ`~VWW5;l;Y3+jKmvpc0AP>4h5{N2J-22vlL@MX zfNDQ?&T(kEMTBYRb~PWfV@JN~J}WDPTgqHdxI;e3{HyAt1b5gxUOD8VhD%2!F}dFS z@0}o~+5g{y52l3cn~F1~#tOwhqhi(4%g?aTtlPKyMs+SK1H_HF4I^webSQN&!dcqa z&@d!Ff_5z1SJ!(adJQCvI2;bP2zam;L%HpWytnC?RR!>O_wIenVi1P>jl^n)d>pN& zR)IOzTN@H&Z5>C2(g_^aY%2vh9W z2LKH47cwm)gKHk!xGgmxoKt@)nDcAwOz6WpllZ0sE`Z7uXlJB zZlJD?t+WE=kNTcH==8AoCxBjox`^HALj41qFk_f5IVv-m@5Shn0%lM^2RR z294usktm(9YXhC8yL-1!-u#MH$46qhcc_(>q$HR`{+g3-@>4g3Jtuml%CAk;OgAvK zV!fovll4qoD(qzW-JRO=m zhYtafcT?jr@`Gj^LC;JQ`tol=;B#9(2SA;QXlNr%S%~fuJSAc~*Bv;g9)1@##k^PF z3Jx)n?J*?2P_&E1Ro#OfD0`B97yq%4F$=$df81f{n{8M^>y_p2x@!v*75@(Km>g!p zMe}JiT4CWRoGIu#%y6LV9L-wH17Ap?+QjBlY1P#@9i1-jm!zaAI!Q_thHP-Ck6MiC z3vl`gc*m13xVVtFxdMx`SY!=8ElvMfX33RtKaP&dQ3s^06@X4#hLbH0jG9aw8!n5a^JZd;Z1rtQGb8$A!!^47_P$aI*Bw z)(h&Z@UdRB35#%bq^cZ7j*u_r)((4_I&=x!M5?`qR-O-hUQ$$K)x93Lg~AL_2)k^J zWn>)Ya#{Es!TAI-Tz+KmDrl05ucfvm3ski_70&n|r14y6WuY+i&-7rL)c&5THs@jZ za*2T_yN6JvltLyj(dsDcbhG{VBOGwnqyhz^9|3W2SfjGvw9IOqj#qybloAv@I?;#hKS i{4Y9Lxt!kTA8V+d$CVCHh$vX8xx&)i#;nxTHT*wN Date: Wed, 17 Jul 2024 09:01:20 -0400 Subject: [PATCH 02/10] update image to show new link Signed-off-by: Hannah Hunter --- .../dapr-init-output.png | Bin 36770 -> 41887 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/daprdocs/static/images/install-dapr-selfhost/dapr-init-output.png b/daprdocs/static/images/install-dapr-selfhost/dapr-init-output.png index e3fde1fddc9be9139af12bf35ae1a5f2ffedbe17..61018d1502799b41fad5f658f7e5af22f72eedbf 100644 GIT binary patch literal 41887 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.e{9d%8i1<6^?MA&dakH(u zcER$n_P^nVXloHK&Y65&%Pi;!f%dW>UZC56lmzh8>|(#Yvo#aJDsH$XG`LhN&TTRu zRU4MyHUTO(9E;o|htvUH!=Pqh@P<2i!8Z{A9_ePRkAZ;_quB2P?~<8W{Z8<>|Mz<; zN;LG_6_>%)MC6U}8(kS-M9@exAPpy*iX9T5 z`)3C-p7NcX0)KsR3o#{el5_inhm$X#Vq(Iw%o|#sY^|=YR);SZ@Z^q9f>#M@$c+0d z1o-%&!66~Fi}2C&X&@~NyG4M7)bm5Cc z7SstspUl~7RB>cljBXXQmnF4X#X&kv_S}I|-4YkRv?pArKYml_K_$?fY5n~4nxnRw zsV!k}(8=3L*@?8(1;`b4&&m+(N?ADO1zw>Ihis}&bYp?qadp7Hf z`{CX}Jn|p^=nOtmuuG}(+4ST=V!+@ZHhH)zy6^06fP4#znCJT97#L))I>4|8p4pA? zsJF1dz4lAy7l+Q0mG%2Xb7JH1=Nea2v+mcf4SE^oN;OLbCO&xhkdBs?I2fh`tgNh1 zbFP5*U0P&ov4Mx>o~Zq>jJx}0u31Bj>vtOdIp8Je=38BZpjrz?@kcyA&>>_KTs6+8 z&dvto26vj0s?{{y>+kB3abfYpdxG-gHxQ_jM3T7e26PLn$Y#>3G z^lDD&@yor}*qfMPRLrB|*ICoY+x~l*%)-_5`Ewh-h)E(1YA9a_%g;9X_m^mp`B$bA zmpiE0cP_hM3flp+_R*S=)q<%XOM#nIIsztKk8?}CbK}#}tf1cp6>?@~1|k~g&!5Mg z&Od95OGwxTMqT8m0~jUc4r8<2YcOUzMSzPsiT-6DXJT9z+@?O)f&QqF^+-qUI$(wp zlcU?XA;nm|QPWiQ1D*_^nv>jM5Snms9ef(m4nOY2l(|koY5ssJ$xd~RCR5N&Dz>`hN)ls~p z^3=KciOkI*{ZcmyHLL{RKWrin$0derJwCH5?b#|^nyq#0W zq6XUI>~_Rmod&VXjyL*`Y@)cdnPr>AHo2rEix?S(2S6P_xP;#N6G|BcQob!N+fHWe zQWEJmn@MlwTQoCs=^?^B91CTDc;XO9wh&490^}(C6{Ao%BKc?o<_BHJk0WMhH$q5$ zVn`<(N5~1#avV4^Ad-8-ls`vEi2Muak*Rvc4_V_8QcCrwi{z;x9n$7tfac` zPvpFPy97smZpofsyCO($JtI9`x{D0J9kW|_Lf*as7l=JsiqCLzR&lbUelK3)}<}TPzzQl;?_E!R5Zx%s=LRoA=)_o~W3K#OXh;5tO2cuwT z7g9Lhy*mRTOElBQDLSje9png;r?T#Zw=eE4EghXbcCx}32(a_XL~~hx!iwNOw$MM7 zp?x%brYPP*PC+4H;CK*)6UzS1ZBxbmAovoyUdS*g)wwM&cXnL<(*U)ODCb=W7s3OQ zWg|fhQ(XifM_eObiRSE;qjw5Y5UhkKJTC)Oh%Z^X5+(KRO7|7Rmwb5Gn2v%}^yKPn z|D&#$rem0@B6iHpV_>%{Mjq#lHO;Av?`uPF1=A6L=2wq*tW~y^BubqO*5~6}2 zXX<#Kyq9EHCQ@?y%CDko&JL*VU{3S=ROg@US13XMnYAfPFK9QSHH$Y9xMu(FPA&l5tnEQM=^uJY5W&0NYFedX6qKH3SejzwBT>a>uPG%T3 zQl8PHhM3p-c&s6uXdntifS!XmtKqQ&rH|CLb2l4H>_>1qKp1%hCy(25>K*^@}3&!rx)RwiJsJkWu*=+8bY9yiSRNAvxeH;x!n(w)iyf1Ev&?*vp&+CnSw9 zmI-MHKUr8S1%T$x7f4i0xrXm%86`Wy5&kbT4EtvH&jYHde(TfgME5GwvKKFuq z=QxQF!+8g6CY0v_nKl=_XS-TQMphQ+@iGN4(z1WNBe?*)PDpP64i!KvESyxa*4EZz zi}@MTtCv#RH4)Cky=2305gw&G8$SYSMJ!9MTI;=Yo-_E^n=0vn*Hb;8Nj#*qmi$_L zykf!pMGX?@?qJHraBDy zxJ4xYQDfFey7vcSg0>X2gX1-)Z3O+UUkMok$xHP`Qf-)j*wKC&f_y^EVI;~gQp{*D z^n}J`xnq0&jX^027aLs<@!Dt5Pew!tnA8v!HT;`vb_Tpmd#SYnaNHx~{>GPdG&F&k z`(dyQLmi#x;o-|*S7MHnorGsN1Z3Ua+_I@`yeNq)P8aN3Vrk!+){~NF>f}##-;9+F zPqh#!_|(|wIa@TIoqP3>IZN;=iw|JvQ*S`~qxIl%oHNuHi!W__A%KvnS9DfDU?q?( z2CzT9L}EV=$OZ@k3pS1Ga!A1Yf7e^l3T~ewsP_jPBsx zr3?MHnkC?YLjIpMi+7lwStish0pRF_uKo_WBxP{5U!t{UK2A#dK(OHnK=#{8Olpro-WCq}k5*mB z1<^Jzw@*rie!5@&AOXpafS_Q)4fP}-AtNa>>{K`RY*kU@t!f3wmyR4BIBszF90;{SeK@$9xkr=%4%_=UD78}Yqx^=zYyUOLmvopzkDpR+WIg`; zV5>TgycaLoZr*2U^F3fMZeHG2s%xnfk5oGSG5K4!G9nrA7$>86h_ZCUiWl~NxlwP# zRl{B9wx-_3+ep{C-{#yQ&pSDn6MkD(@z09JBD%=aYY$u|!uw0TVXq5u5IrC+Bh>As zrgBV1O^w8hJQ#Dm>S|rdo4hcy=8De7RqJ*4TeV9t{r)v(2Gq4UFK=A!5&*7%<06qz zUS6J`-~RJqZ$Kneion!^$Q;_j+8SDGEf^-DMsk zV6*)oY(fpv&2=bhD6;#k3^(SY-`lyX-df`XH?+G90kXuRP1j;h_4ISBiGC;<)FMpP zm~iC5h5ALJTs80R56y9u^ZVB~DfBhTyXmAy!f+3Dfn!}9^Q{k2WTc(Pgq<1KJdL7clkYsKYW zB8ktj+nj{BxDvjg(WHK{X^?#I;oG-w&7nF4?P2uMlwGgJLP!7n*o5X1RZVb~CANApR=<{=C>? z9YHHl!~xjrBVE(S=bBVs|+atur?s{E2#`GKyaOOb9c{Sx}*kT zS;r?R5ljsgPH@S)tb=<~5j{Zo+DW+8oH`RoZy0>H6eM`A2Ngd85`j@UW~i5)uJ7o1 zYQV+fL)gQ!>d+e@M51pYbahl@H3zNa-hw`S_Uu`}%`_ixwO@*6s4~Hi7gP*ks}8Hf z{jD6*`e!-BduXWk&vGc@zbJ>IonJf(3i_yt`&8(5U%(1UDBG!1r9X!s1?Z?<@Yq;} zdk_+{)3Uv>`MVp2yPRoKx6a?4YP+^pcl_Ia;K(#thyQ?O9yUqVwR3v2{{BW39@>A? zQVS_Q!B&WXyDJ$He-uIzQ8^S->)##{srpzf?fWuUBY>q7FXw{+7bukSv;_(xyCMj3 z_Jp6E4eM&joX#w`$G}38&~r*DQeh<4V^v$G2aad(h$he=@eL*CuO}UEV34z!SeIWT zbyD}E{W{5vpByHhku{bb(LY(E({ao?YMY&&F>%PR4Vh` zZVcvn{Xz}KaBrQFFzE4ave-N8PpflHy&9go zS?}GM$94=?JK8%s(z3pu?y|sX*6Ky@tM1B576@De!|Z2V2Ayn$2CWwxwS#Wd>+X+2^r%7DSv(A(4u`DwP}%?d`4fx` z;N5~N!GWYDz*QczFYHW09g?<$a|Es<$W$=FDVaNtsnev*&Q||g?{)I>@OlNsr1SUU zUBwxM!20uV0;}kML14Y&DfbU|qP;LZm{)Xa#v`JlLdx=E9M28Mb$!^y4AX+{_iF)ztR`*kBOhs_%%yY~Ohg!!t)@8INvvHtW9= z{bV66DG8|bpBHyEH=n4_J@!kWiF+ytCud51`v0fKO5NP6u^N64rjzXl(^XHBsQstFqlPm73`+iq69>Kk>rsww`8d-A z!ge7^{8L0C=O_-sU-$_%)d=PyVpW$-2Lm*ui%LqhyYt&OBXxCBV^7Nv`tYGdK9Gc_ zX}^5XViFdCaB&dt=~_)x;xtTHWpgtL(a6NCM2r??&YlwdAb|#j7q_pjy<(3stKmQb z1u`;Xb%{;A?o`I-eTZ@CfT*UUr#J1;t-aeKY^?M#REwF4@a_>J1}?`m2!#<6>VX}f z(s&!ZicHPDy^oHnp*B_;UTMM{WdRAbxch(=R}rnJI{+tVTIJ$CHk8K~R5hdXtG-&w zgCq}56iBV3OJ^&G zV1Fx%il^9r$mY)2RjnO1V1#iim^ZP~Va~uilgrDU%jajpCyS}YEiPY?5Q#+`VkSw5 ziI00Mh!a3?4KJbg4Lk+Vt0?ApFJ9dT2tlkKU#9bkgv9V_VkJ26L12fX>B7CAyu<16 zz0LeU^OmWA&-0}2V3tJP$v`Nm6%Ra$2QVc%n0ka~Ih2TFy$3cEUe9>lu&pd-A5N$vu0Hw0;@8OU|rkRe8j;Bwl z72V(Ld8KZQ+8>&hYBr1aw}ZCM;$c$oS87-q(q5J~jMi{08r#`lpw+^$CnH@1ugDmB zal;~2`wCrepYr{j?@k~AlX180FrsKY^)deu(2De7?FbCORL`%1)EaCvOjYq=QQ4?uoKoE5u&D?pR1s$`uJIl|eh&gE z$vD%czXIb_31;q)a6G#=7CYo?1!J*hLYbeKkPCStRw@~{UY-RBa@YUm1V2M1s*o{iOPvX_oFbA>0Bnc1laG)0Tru*ET(4fGU%b88;pl40Yz#Z6b zqZ-10=-|PFNp)!rs!-X;B96|B!S5Z{fu2-@KXIZ!_S~rT5avmMLPAtGQqdoze7wN$ zG4YuEHCU{WnHg4^Sff^|*r$Lnvn!JilA2!wPJd~`g8g|sJPg{t*j>buLxiT3)PD#~ z7Srz_kFiT9AWgy=`&Phgb8UQv!+B@^q7(=BoOk%9SAZ@=Pt(idE-i;*%A`#a(f+;b zC4xz46pW+2e_-O%9xkd4KhwavaKe%C&E$Y+O`yfQ|8f9^NKSRqP$l7xprP6e3<-fj z3>Q#*($b!&V{YK?8eKYSud!z4m_e9-m2{UG=5^ZI|HErEaQ`R1T4bbs zOsfeVLw-pi@S}^T7jBr_^4mEADZ8M3ksoKzb|mJc;=_0Lc@dxD-U8K8g5Tw*XFh

9_Fj$Qx8LFtmz5DF@WMM-Ur;YL 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 Date: Thu, 18 Jul 2024 14:47:51 -0400 Subject: [PATCH 03/10] add to how-to Signed-off-by: Hannah Hunter --- .../jobs/howto-schedule-jobs.md | 94 ++++++++++++++++++- 1 file changed, 90 insertions(+), 4 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md index 166530635..b3dda8553 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md @@ -12,18 +12,104 @@ Now that you've learned what the [jobs building block]({{< ref jobs-overview.md Include a diagram or image, if possible. --> +## Start the Scheduler service + +When you [run `dapr init` in either self-hosted mode or on Kubernetes]({{< ref install-dapr-selfhost.md >}}), the Dapr scheduler service is started. + +## Set up the Jobs API + +In your code, set up and schedule jobs within your application. + +{{< tabs ".NET" "Go" >}} + +{{% codetab %}} + + -## Set up the Scheduler service +{{% /codetab %}} -When you run `dapr init` in either self-hosted mode or on Kubernetes, the Dapr scheduler service is started. +{{% codetab %}} + + + +The Go SDK triggers the job called `daprc.Job` to schedule jobs. Job data is housed in a backup database (`"my-prod-db"`) and are called with `ScheduleJobAlpha1`. For example: + +```go +package main + +import ( + //... + + daprc "github.com/dapr/go-sdk/client" + "github.com/dapr/go-sdk/examples/dist-scheduler/api" + "github.com/dapr/go-sdk/service/common" + daprs "github.com/dapr/go-sdk/service/grpc" +) + +func main() { + + // Initialize the server + server, err := daprs.NewService(":50070") + + // ... + + ctx := context.Background() + + // Set up backup location + jobData, err := json.Marshal(&api.DBBackup{ + Task: "db-backup", + Metadata: api.Metadata{ + DBName: "my-prod-db", + BackupLocation: "/backup-dir", + }, + }, + ) + + // ... + + // Set up the job data + job := daprc.Job{ + Name: "prod-db-backup", + Schedule: "@every 1s", + Repeats: 10, + Data: &anypb.Any{ + Value: jobData, + }, + } + + // Create the client + client, err := daprc.NewClient() + //... + + // Schedule job + err = client.ScheduleJobAlpha1(ctx, &job) + + // ... + + // Get job + resp, err := client.GetJobAlpha1(ctx, "prod-db-backup") + // ... + + // Delete job + err = client.DeleteJobAlpha1(ctx, "prod-db-backup") + // .. +} + +var jobCount = 0 +``` + +{{% /codetab %}} + + +{{< /tabs >}} ## Run the Dapr sidecar -Run the Dapr sidecar alongside your application. +Once you've set up the Jobs API in your application, run the Dapr sidecar. ```bash -dapr run --app-id=jobs --app-port 50070 --app-protocol grpc --log-level debug -- go run main.go +dapr run --app-id=distributed-scheduler --metrics-port=9091 --scheduler-host-address=localhost:50006 --dapr-grpc-port 50001 --app-port 50070 --app-protocol grpc --log-level debug go run ./main.go ``` ## Next steps From 19c7ca940ba88bc20b09dc3c412c498b7d6fab0e Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Thu, 25 Jul 2024 13:30:11 -0500 Subject: [PATCH 04/10] tweak howto-schedule-jobs && add howto-handle-triggered-jobs Signed-off-by: Cassandra Coyle --- .../jobs/howto-handle-triggered-jobs.md | 210 ++++++++++++++++++ .../jobs/howto-schedule-jobs.md | 86 +++++-- 2 files changed, 282 insertions(+), 14 deletions(-) create mode 100644 daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md new file mode 100644 index 000000000..9b88b237e --- /dev/null +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md @@ -0,0 +1,210 @@ +--- +type: docs +title: "How-To: Handle triggered jobs" +linkTitle: "How-To: Handle triggered jobs" +weight: 2000 +description: "Learn how to use the jobs API to schedule jobs and handle triggered jobs" +--- + +Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code examples below describe an application that schedules jobs for droid maintenance and another application to handle the triggered jobs that are sent back to the app at their dueTime. + + + +## Start the Scheduler service + +When you [run `dapr init` in either self-hosted mode or on Kubernetes]({{< ref install-dapr-selfhost.md >}}), the Dapr Scheduler service is started. + +## Set up the Jobs API + +In your code, set up and schedule jobs within your application. + +{{< tabs ".NET" "Go" >}} + +{{% codetab %}} + + + + +{{% /codetab %}} + +{{% codetab %}} + + + +The Go SDK schedules the job named `R2-D2`. For example, the following is application code to schedule jobs. + +```go +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "os" + "strings" + "time" +) + +var r2d2JobBody = `{ + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "R2-D2:Oil Change" + }, + "dueTime": "2s" + }` + +func main() { + //Sleep for 5 seconds to wait for job-service to start + time.Sleep(5 * time.Second) + + daprHost := os.Getenv("DAPR_HOST") + if daprHost == "" { + daprHost = "http://localhost" + } + + schedulerDaprHttpPort := "6280" + + client := http.Client{ + Timeout: 30 * time.Second, + } + + // Schedule a job using the Dapr Jobs API with short dueTime + jobName := "R2-D2" + reqURL := daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName + + req, err := http.NewRequest("POST", reqURL, strings.NewReader(r2d2JobBody)) + if err != nil { + log.Fatal(err.Error()) + } + + req.Header.Set("Content-Type", "application/json") + + // Schedule a job using the Dapr Jobs API + res, err := client.Do(req) + if err != nil { + log.Fatal(err) + } + + if res.StatusCode != http.StatusNoContent { + log.Fatalf("failed to register job event handler. status code: %v", res.StatusCode) + } + + defer res.Body.Close() + + fmt.Println("Job Scheduled:", jobName) + + // ... +} +``` + +The following is application code to handle the triggered jobs that are sent back to the application at their dueTime. + +```go +package main + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strings" +) + + +type Job struct { + TypeURL string `json:"type_url"` + Value string `json:"value"` +} + +type DroidJob struct { + Droid string `json:"droid"` + Task string `json:"task"` +} + +func main() { + appPort := os.Getenv("APP_PORT") + if appPort == "" { + appPort = "6200" + } + + // Setup job handler + http.HandleFunc("/job/", handleJob) + + fmt.Printf("Server started on port %v\n", appPort) + err := http.ListenAndServe(":"+appPort, nil) + if err != nil { + log.Fatal(err) + } + +} + +func handleJob(w http.ResponseWriter, r *http.Request) { + fmt.Println("Received job request...") + rawBody, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) + return + } + + var jobData Job + if err := json.Unmarshal(rawBody, &jobData); err != nil { + http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) + return + } + + // Decoding job data + decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) + if err != nil { + fmt.Printf("Error decoding base64: %v", err) + http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) + return + } + + // Creating Droid Job from decoded value + droidJob := setDroidJob(string(decodedValue)) + + fmt.Println("Starting droid:", droidJob.Droid) + fmt.Println("Executing maintenance job:", droidJob.Task) + + w.WriteHeader(http.StatusOK) +} + +func setDroidJob(decodedValue string) DroidJob { + // Removing new lines from decoded value - Workaround for base64 encoding issue + droidStr := strings.ReplaceAll(decodedValue, "\n", "") + droidArray := strings.Split(droidStr, ":") + + droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} + return droidJob +} +``` + +{{% /codetab %}} + + +{{< /tabs >}} + +## Run the Dapr sidecar + +Once you've set up the Jobs API in your application, run the Dapr sidecar. + +```bash +// service to handle the triggered jobs +// run locally to the directory where the job handler service lives +dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 -- go run . + +// service to schedule a job to be sent back at some point in the future +// run locally to the directory where the job scheduler service lives +dapr run --app-id job-scheduler --app-port 6300 --dapr-http-port 6380 -- go run . +``` + +## Next steps + +- [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) +- [Jobs API reference]({{< ref jobs_api.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md index b3dda8553..5490b1a3c 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md @@ -6,7 +6,7 @@ weight: 2000 description: "Learn how to use the jobs API to schedule jobs" --- -Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code example below describes an application that schedules jobs for a **TBD** application. +Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code example below describes an application that schedules jobs for a database backup application. -The Go SDK triggers the job called `daprc.Job` to schedule jobs. Job data is housed in a backup database (`"my-prod-db"`) and are called with `ScheduleJobAlpha1`. For example: +The Go SDK schedules the job named `prod-db-backup`. Job data is housed in a backup database (`"my-prod-db"`) and are called with `ScheduleJobAlpha1`. For example: ```go package main @@ -52,8 +52,24 @@ func main() { // Initialize the server server, err := daprs.NewService(":50070") - // ... + if err != nil { + log.Fatalf("failed to start the server: %v", err) + } + if err = server.AddJobEventHandler("prod-db-backup", prodDBBackupHandler); err != nil { + log.Fatalf("failed to register job event handler: %v", err) + } + + log.Println("starting server") + go func() { + if err = server.Start(); err != nil { + log.Fatalf("failed to start server: %v", err) + } + }() + + // Brief intermission to allow for the server to initialize. + time.Sleep(10 * time.Second) + ctx := context.Background() // Set up backup location @@ -65,10 +81,12 @@ func main() { }, }, ) - - // ... - // Set up the job data + if err != nil { + panic(err) + } + + // Set up the job job := daprc.Job{ Name: "prod-db-backup", Schedule: "@every 1s", @@ -80,23 +98,63 @@ func main() { // Create the client client, err := daprc.NewClient() - //... + if err != nil { + panic(err) + } + defer client.Close() // Schedule job err = client.ScheduleJobAlpha1(ctx, &job) + if err != nil { + panic(err) + } - // ... - // Get job + fmt.Println("schedulejob - success") + + time.Sleep(3 * time.Second) + + // Get job resp, err := client.GetJobAlpha1(ctx, "prod-db-backup") - // ... - + if err != nil { + panic(err) + } + fmt.Printf("getjob - resp: %v\n", resp) // parse + // Delete job err = client.DeleteJobAlpha1(ctx, "prod-db-backup") - // .. + if err != nil { + fmt.Printf("job deletion error: %v\n", err) + } else { + fmt.Println("deletejob - success") + } + + if err = server.Stop(); err != nil { + log.Fatalf("failed to stop server: %v\n", err) + } } var jobCount = 0 + + +func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { + var jobData common.Job + if err := json.Unmarshal(job.Data, &jobData); err != nil { + return fmt.Errorf("failed to unmarshal job: %v", err) + } + decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) + if err != nil { + return fmt.Errorf("failed to decode job payload: %v", err) + } + var jobPayload api.DBBackup + if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { + return fmt.Errorf("failed to unmarshal payload: %v", err) + } + fmt.Printf("job %d received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobCount, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) + jobCount++ + return nil +} + ``` {{% /codetab %}} @@ -109,7 +167,7 @@ var jobCount = 0 Once you've set up the Jobs API in your application, run the Dapr sidecar. ```bash -dapr run --app-id=distributed-scheduler --metrics-port=9091 --scheduler-host-address=localhost:50006 --dapr-grpc-port 50001 --app-port 50070 --app-protocol grpc --log-level debug go run ./main.go +dapr run --app-id=distributed-scheduler --metrics-port=9091 --dapr-grpc-port 50001 --app-port 50070 --app-protocol grpc --log-level debug go run ./main.go ``` ## Next steps From 38cdb1a45157d879207cb840c63fa1f08b7b3de7 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 25 Jul 2024 15:51:06 -0400 Subject: [PATCH 05/10] review cassies additions Signed-off-by: Hannah Hunter --- .../jobs/howto-handle-triggered-jobs.md | 37 +++++++++++++------ .../jobs/howto-schedule-jobs.md | 9 +---- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md index 9b88b237e..fb978ac20 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md @@ -6,7 +6,9 @@ weight: 2000 description: "Learn how to use the jobs API to schedule jobs and handle triggered jobs" --- -Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code examples below describe an application that schedules jobs for droid maintenance and another application to handle the triggered jobs that are sent back to the app at their dueTime. +Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. This guide follows an example that uses two applications to set up the jobs API: +- `job-scheduler` application: schedules jobs for droid maintenance. +- `job-service` application: handles the triggered jobs that are sent back to the app at their `dueTime`. - - -{{% /codetab %}} +{{< tabs "Go" >}} {{% codetab %}} -The Go SDK schedules the job named `R2-D2`. For example, the following is application code to schedule jobs. +For example, the following `job-scheduler` application code uses Go HTTP client to schedule a job named `R2-D2` with a `"value"` of `"R2-D2:Oil Change"` and a `dueTime` of `"2s"`. ```go package main @@ -100,7 +97,11 @@ func main() { } ``` -The following is application code to handle the triggered jobs that are sent back to the application at their dueTime. +### Create a job handler + +Next, in a second application, you need to create a job handler that handles the triggered jobs that are sent back to the application. + +For example, the following `job-service` application code has a job handler called `handleJob` to deal with the triggered R2D2 job from earlier, at its `"dueTime": "2s"`. ```go package main @@ -192,18 +193,30 @@ func setDroidJob(decodedValue string) DroidJob { ## Run the Dapr sidecar -Once you've set up the Jobs API in your application, run the Dapr sidecar. +Once you've set up the Jobs API in your application, run the Dapr sidecar. In a terminal window, run the following Dapr command for the `job-service` application. ```bash // service to handle the triggered jobs // run locally to the directory where the job handler service lives dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 -- go run . +``` +In a second terminal window, run the following Dapr command to start the `job-scheduler` application. + +```bash // service to schedule a job to be sent back at some point in the future // run locally to the directory where the job scheduler service lives dapr run --app-id job-scheduler --app-port 6300 --dapr-http-port 6380 -- go run . ``` +**Expected output** + +```text + +``` + + + ## Next steps - [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md index 5490b1a3c..be297dcd9 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md @@ -20,14 +20,7 @@ When you [run `dapr init` in either self-hosted mode or on Kubernetes]({{< ref i In your code, set up and schedule jobs within your application. -{{< tabs ".NET" "Go" >}} - -{{% codetab %}} - - - - -{{% /codetab %}} +{{< tabs "Go" >}} {{% codetab %}} From c8fd729dc3d0b7090c411d01de0c919e75e36014 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Fri, 26 Jul 2024 10:04:09 -0500 Subject: [PATCH 06/10] rm separate howto and add the handling of triggered jobs to the initial example Signed-off-by: Cassandra Coyle --- .../jobs/howto-handle-triggered-jobs.md | 100 +----------------- ...wto-schedule-and-handle-triggered-jobs.md} | 83 ++++++--------- 2 files changed, 37 insertions(+), 146 deletions(-) rename daprdocs/content/en/developing-applications/building-blocks/jobs/{howto-schedule-jobs.md => howto-schedule-and-handle-triggered-jobs.md} (58%) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md index fb978ac20..5bb4393f0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md @@ -1,83 +1,3 @@ ---- -type: docs -title: "How-To: Handle triggered jobs" -linkTitle: "How-To: Handle triggered jobs" -weight: 2000 -description: "Learn how to use the jobs API to schedule jobs and handle triggered jobs" ---- - -Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. This guide follows an example that uses two applications to set up the jobs API: -- `job-scheduler` application: schedules jobs for droid maintenance. -- `job-service` application: handles the triggered jobs that are sent back to the app at their `dueTime`. - - - -## Start the Scheduler service - -When you [run `dapr init` in either self-hosted mode or on Kubernetes]({{< ref install-dapr-selfhost.md >}}), the Dapr Scheduler service is started. - -## Set up the Jobs API - -### Schedule jobs - -In your code, start by setting up and scheduling jobs your project. In the first application, create a new job, including its `name`, `data`, and `dueTime` values. - -{{< tabs "Go" >}} - -{{% codetab %}} - - - -For example, the following `job-scheduler` application code uses Go HTTP client to schedule a job named `R2-D2` with a `"value"` of `"R2-D2:Oil Change"` and a `dueTime` of `"2s"`. - -```go -package main - -import ( - "fmt" - "io" - "log" - "net/http" - "os" - "strings" - "time" -) - -var r2d2JobBody = `{ - "data": { - "@type": "type.googleapis.com/google.protobuf.StringValue", - "value": "R2-D2:Oil Change" - }, - "dueTime": "2s" - }` - -func main() { - //Sleep for 5 seconds to wait for job-service to start - time.Sleep(5 * time.Second) - - daprHost := os.Getenv("DAPR_HOST") - if daprHost == "" { - daprHost = "http://localhost" - } - - schedulerDaprHttpPort := "6280" - - client := http.Client{ - Timeout: 30 * time.Second, - } - - // Schedule a job using the Dapr Jobs API with short dueTime - jobName := "R2-D2" - reqURL := daprHost + ":" + schedulerDaprHttpPort + "/v1.0-alpha1/jobs/" + jobName - - req, err := http.NewRequest("POST", reqURL, strings.NewReader(r2d2JobBody)) - if err != nil { - log.Fatal(err.Error()) - } - - req.Header.Set("Content-Type", "application/json") // Schedule a job using the Dapr Jobs API res, err := client.Do(req) @@ -97,11 +17,7 @@ func main() { } ``` -### Create a job handler - -Next, in a second application, you need to create a job handler that handles the triggered jobs that are sent back to the application. - -For example, the following `job-service` application code has a job handler called `handleJob` to deal with the triggered R2D2 job from earlier, at its `"dueTime": "2s"`. +The following is application code to handle the triggered jobs that are sent back to the application at their dueTime. ```go package main @@ -193,30 +109,18 @@ func setDroidJob(decodedValue string) DroidJob { ## Run the Dapr sidecar -Once you've set up the Jobs API in your application, run the Dapr sidecar. In a terminal window, run the following Dapr command for the `job-service` application. +Once you've set up the Jobs API in your application, run the Dapr sidecar. ```bash // service to handle the triggered jobs // run locally to the directory where the job handler service lives dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 -- go run . -``` -In a second terminal window, run the following Dapr command to start the `job-scheduler` application. - -```bash // service to schedule a job to be sent back at some point in the future // run locally to the directory where the job scheduler service lives dapr run --app-id job-scheduler --app-port 6300 --dapr-http-port 6380 -- go run . ``` -**Expected output** - -```text - -``` - - - ## Next steps - [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md similarity index 58% rename from daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md rename to daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md index be297dcd9..9d5740d27 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md @@ -1,12 +1,12 @@ --- type: docs -title: "How-To: Schedule jobs" -linkTitle: "How-To: Schedule jobs" +title: "How-To: Schedule and handle triggered jobs" +linkTitle: "How-To: Schedule and handle triggered jobs" weight: 2000 -description: "Learn how to use the jobs API to schedule jobs" +description: "Learn how to use the jobs API to schedule and handle triggered jobs" --- -Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code example below describes an application that schedules jobs for a database backup application. +Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code example below describes an application that schedules jobs for a database backup application and handles them at trigger time, also known as the time the job was sent back to the application because it reached it's dueTime. -The Go SDK schedules the job named `prod-db-backup`. Job data is housed in a backup database (`"my-prod-db"`) and are called with `ScheduleJobAlpha1`. For example: +The following Go SDK code sample schedules the job named `prod-db-backup`. Job data is housed in a backup database (`"my-prod-db"`) and is scheduled with `ScheduleJobAlpha1`, +providing the job `data` which is the backup `task` name and `metadata` including the location and database name. The job is scheduled with a `schedule` set and the amount of `repeats` +desired, meaning there is a max amount of times the job should be triggered and sent back to the app. At trigger time, so `@every 1s` according to the `schedule`, this job will be +triggered and sent back to the application up to the max repeats set which is `10`. At the trigger time, the `prodDBBackupHandler` function is called executing the +desired business logic for this job at trigger time. For example: ```go package main @@ -41,13 +45,9 @@ import ( ) func main() { - // Initialize the server server, err := daprs.NewService(":50070") - - if err != nil { - log.Fatalf("failed to start the server: %v", err) - } + // ... if err = server.AddJobEventHandler("prod-db-backup", prodDBBackupHandler); err != nil { log.Fatalf("failed to register job event handler: %v", err) @@ -59,11 +59,7 @@ func main() { log.Fatalf("failed to start server: %v", err) } }() - - // Brief intermission to allow for the server to initialize. - time.Sleep(10 * time.Second) - - ctx := context.Background() + // ... // Set up backup location jobData, err := json.Marshal(&api.DBBackup{ @@ -74,10 +70,7 @@ func main() { }, }, ) - - if err != nil { - panic(err) - } + // ... // Set up the job job := daprc.Job{ @@ -91,36 +84,25 @@ func main() { // Create the client client, err := daprc.NewClient() - if err != nil { - panic(err) - } + // ... + defer client.Close() // Schedule job err = client.ScheduleJobAlpha1(ctx, &job) - if err != nil { - panic(err) - } - - - fmt.Println("schedulejob - success") - - time.Sleep(3 * time.Second) + // ... + fmt.Println("schedule job - success") // Get job resp, err := client.GetJobAlpha1(ctx, "prod-db-backup") - if err != nil { - panic(err) - } - fmt.Printf("getjob - resp: %v\n", resp) // parse - + // ... + fmt.Printf("get job - resp: %v\n", resp) // parse + + // Let test run and then cleanup the job + time.Sleep(20 * time.Second) // Delete job err = client.DeleteJobAlpha1(ctx, "prod-db-backup") - if err != nil { - fmt.Printf("job deletion error: %v\n", err) - } else { - fmt.Println("deletejob - success") - } + // ... if err = server.Stop(); err != nil { log.Fatalf("failed to stop server: %v\n", err) @@ -129,19 +111,18 @@ func main() { var jobCount = 0 - +// at job trigger time this function is called func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { var jobData common.Job if err := json.Unmarshal(job.Data, &jobData); err != nil { - return fmt.Errorf("failed to unmarshal job: %v", err) + // ... } decodedPayload, err := base64.StdEncoding.DecodeString(jobData.Value) - if err != nil { - return fmt.Errorf("failed to decode job payload: %v", err) - } + // ... + var jobPayload api.DBBackup if err := json.Unmarshal(decodedPayload, &jobPayload); err != nil { - return fmt.Errorf("failed to unmarshal payload: %v", err) + // ... } fmt.Printf("job %d received:\n type: %v \n typeurl: %v\n value: %v\n extracted payload: %v\n", jobCount, job.JobType, jobData.TypeURL, jobData.Value, jobPayload) jobCount++ @@ -157,10 +138,16 @@ func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { ## Run the Dapr sidecar -Once you've set up the Jobs API in your application, run the Dapr sidecar. +Once you've set up the Jobs API in your application, in a terminal window run the Dapr sidecar with the following command. ```bash -dapr run --app-id=distributed-scheduler --metrics-port=9091 --dapr-grpc-port 50001 --app-port 50070 --app-protocol grpc --log-level debug go run ./main.go +dapr run --app-id=distributed-scheduler \ + --metrics-port=9091 \ + --dapr-grpc-port 50001 \ + --app-port 50070 \ + --app-protocol grpc \ + --log-level debug \ + go run ./main.go ``` ## Next steps From 6b8dcaf0823e9425a214056fe7c3a65c61223763 Mon Sep 17 00:00:00 2001 From: Cassandra Coyle Date: Fri, 26 Jul 2024 14:38:04 -0500 Subject: [PATCH 07/10] rm unneccessary howto Signed-off-by: Cassandra Coyle --- .../jobs/howto-handle-triggered-jobs.md | 127 ------------------ 1 file changed, 127 deletions(-) delete mode 100644 daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md deleted file mode 100644 index 5bb4393f0..000000000 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-handle-triggered-jobs.md +++ /dev/null @@ -1,127 +0,0 @@ - - // Schedule a job using the Dapr Jobs API - res, err := client.Do(req) - if err != nil { - log.Fatal(err) - } - - if res.StatusCode != http.StatusNoContent { - log.Fatalf("failed to register job event handler. status code: %v", res.StatusCode) - } - - defer res.Body.Close() - - fmt.Println("Job Scheduled:", jobName) - - // ... -} -``` - -The following is application code to handle the triggered jobs that are sent back to the application at their dueTime. - -```go -package main - -import ( - "encoding/base64" - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "os" - "strings" -) - - -type Job struct { - TypeURL string `json:"type_url"` - Value string `json:"value"` -} - -type DroidJob struct { - Droid string `json:"droid"` - Task string `json:"task"` -} - -func main() { - appPort := os.Getenv("APP_PORT") - if appPort == "" { - appPort = "6200" - } - - // Setup job handler - http.HandleFunc("/job/", handleJob) - - fmt.Printf("Server started on port %v\n", appPort) - err := http.ListenAndServe(":"+appPort, nil) - if err != nil { - log.Fatal(err) - } - -} - -func handleJob(w http.ResponseWriter, r *http.Request) { - fmt.Println("Received job request...") - rawBody, err := io.ReadAll(r.Body) - if err != nil { - http.Error(w, fmt.Sprintf("error reading request body: %v", err), http.StatusBadRequest) - return - } - - var jobData Job - if err := json.Unmarshal(rawBody, &jobData); err != nil { - http.Error(w, fmt.Sprintf("error decoding JSON: %v", err), http.StatusBadRequest) - return - } - - // Decoding job data - decodedValue, err := base64.RawStdEncoding.DecodeString(jobData.Value) - if err != nil { - fmt.Printf("Error decoding base64: %v", err) - http.Error(w, fmt.Sprintf("error decoding base64: %v", err), http.StatusBadRequest) - return - } - - // Creating Droid Job from decoded value - droidJob := setDroidJob(string(decodedValue)) - - fmt.Println("Starting droid:", droidJob.Droid) - fmt.Println("Executing maintenance job:", droidJob.Task) - - w.WriteHeader(http.StatusOK) -} - -func setDroidJob(decodedValue string) DroidJob { - // Removing new lines from decoded value - Workaround for base64 encoding issue - droidStr := strings.ReplaceAll(decodedValue, "\n", "") - droidArray := strings.Split(droidStr, ":") - - droidJob := DroidJob{Droid: droidArray[0], Task: droidArray[1]} - return droidJob -} -``` - -{{% /codetab %}} - - -{{< /tabs >}} - -## Run the Dapr sidecar - -Once you've set up the Jobs API in your application, run the Dapr sidecar. - -```bash -// service to handle the triggered jobs -// run locally to the directory where the job handler service lives -dapr run --app-id job-service --app-port 6200 --dapr-http-port 6280 -- go run . - -// service to schedule a job to be sent back at some point in the future -// run locally to the directory where the job scheduler service lives -dapr run --app-id job-scheduler --app-port 6300 --dapr-http-port 6380 -- go run . -``` - -## Next steps - -- [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) -- [Jobs API reference]({{< ref jobs_api.md >}}) \ No newline at end of file From 2deca48e63e9dcef73ce8e10fdd21095ec2de31b Mon Sep 17 00:00:00 2001 From: Josh van Leeuwen Date: Fri, 26 Jul 2024 22:14:20 +0100 Subject: [PATCH 08/10] Updates API ref for jobs. Adds doc on Kubernetes Scheduler persistent (#4256) * Updates API ref for jobs. Adds doc on Kubernetes Scheduler persistent volume Signed-off-by: joshvanl * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Josh van Leeuwen * Adds scheduler persistent volume docs for selfhosted Signed-off-by: joshvanl * Updates scheduler volume docs based on https://github.com/dapr/cli/pull/1423 Signed-off-by: joshvanl * Apply suggestions from code review Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Signed-off-by: Josh van Leeuwen * Adds reference for file system location of scheduler local volume Signed-off-by: joshvanl * Update daprdocs/content/en/reference/api/jobs_api.md Co-authored-by: Cassie Coyle Signed-off-by: Josh van Leeuwen * Update daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md Signed-off-by: Mark Fussell * Apply suggestions from code review Co-authored-by: Mark Fussell Signed-off-by: Josh van Leeuwen * Adds default volume name for scheduler dapr init Signed-off-by: joshvanl * Adds directions for getting scheduler volume from Docker Desktop Signed-off-by: joshvanl * Update daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md Signed-off-by: Mark Fussell --------- Signed-off-by: joshvanl Signed-off-by: Josh van Leeuwen Signed-off-by: Mark Fussell Co-authored-by: Hannah Hunter <94493363+hhunter-ms@users.noreply.github.com> Co-authored-by: Cassie Coyle Co-authored-by: Mark Fussell --- .../jobs/howto-schedule-jobs.md | 19 ++-- .../building-blocks/jobs/jobs-overview.md | 19 ++-- .../kubernetes-persisting-scheduler.md | 55 ++++++++++++ .../self-hosted-persisting-scheduler.md | 27 ++++++ daprdocs/content/en/reference/api/jobs_api.md | 86 ++++++++++++++----- .../content/en/reference/cli/dapr-init.md | 5 +- 6 files changed, 172 insertions(+), 39 deletions(-) create mode 100644 daprdocs/content/en/operations/hosting/kubernetes/kubernetes-persisting-scheduler.md create mode 100644 daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md index 166530635..fb4263ef1 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-jobs.md @@ -8,19 +8,22 @@ description: "Learn how to use the jobs API to schedule jobs" Now that you've learned what the [jobs building block]({{< ref jobs-overview.md >}}) provides, let's look at an example of how to use the API. The code example below describes an application that schedules jobs for a **TBD** application. - - - ## Set up the Scheduler service -When you run `dapr init` in either self-hosted mode or on Kubernetes, the Dapr scheduler service is started. +{{% alert title="Warning" color="warning" %}} +By default, job data is not resilient to [Scheduler]({{< ref scheduler.md >}}) service restarts. +A persistent volume must be provided to Scheduler to ensure job data is not lost in either [Kubernetes]({{< ref kubernetes-persisting-scheduler.md >}}) or [Self-Hosted]({{< ref self-hosted-persisting-scheduler.md >}}) mode. +{{% /alert %}} -## Run the Dapr sidecar +When you run `dapr init` in either self-hosted mode or on Kubernetes, the Dapr scheduler service is started. -Run the Dapr sidecar alongside your application. +## Run the Dapr sidecar + +Run the Dapr sidecar alongside your application. ```bash dapr run --app-id=jobs --app-port 50070 --app-protocol grpc --log-level debug -- go run main.go @@ -29,4 +32,4 @@ dapr run --app-id=jobs --app-port 50070 --app-protocol grpc --log-level debug -- ## Next steps - [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) -- [Jobs API reference]({{< ref jobs_api.md >}}) \ No newline at end of file +- [Jobs API reference]({{< ref jobs_api.md >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md index ffea762f2..a7838088d 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md @@ -8,14 +8,19 @@ description: "Overview of the jobs API building block" Many applications require job scheduling, or the need to take an action in the future. The jobs API is an orchestrator for scheduling these future jobs, either at a specific time or for a specific interval. -Not only does the jobs API help you with scheduling jobs, but internally, Dapr uses the scheduler service to schedule actor reminders. +Not only does the jobs API help you with scheduling jobs, but internally, Dapr uses the scheduler service to schedule actor reminders. Jobs in Dapr consist of: -- The jobs API building block +- [The jobs API building block]({{< ref jobs_api.md >}}) - [The Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) [See example scenarios.]({{< ref "#scenarios" >}}) +{{% alert title="Warning" color="warning" %}} +By default, job data is not resilient to [Scheduler]({{< ref scheduler.md >}}) service restarts. +A persistent volume must be provided to Scheduler to ensure job data is not lost in either [Kubernetes]({{< ref kubernetes-persisting-scheduler.md >}}) or [Self-hosted]({{< ref self-hosted-persisting-scheduler.md >}}) mode. +{{% /alert %}} + Diagram showing the Scheduler control plane service and the jobs API ## How it works @@ -34,19 +39,19 @@ You can use jobs to: Job scheduling can prove helpful in the following scenarios: -- **Automated Database Backups**: +- **Automated Database Backups**: Ensure a database is backed up daily to prevent data loss. Schedule a backup script to run every night at 2 AM, which will create a backup of the database and store it in a secure location. -- **Regular Data Processing and ETL (Extract, Transform, Load)**: +- **Regular Data Processing and ETL (Extract, Transform, Load)**: Process and transform raw data from various sources and load it into a data warehouse. Schedule ETL jobs to run at specific times (for example: hourly, daily) to fetch new data, process it, and update the data warehouse with the latest information. -- **Email Notifications and Reports**: +- **Email Notifications and Reports**: Receive daily sales reports and weekly performance summaries via email. Schedule a job that generates the required reports and sends them via email at 6 a.m. every day for daily reports and 8 a.m. every Monday for weekly summaries. -- **Maintenance Tasks and System Updates**: +- **Maintenance Tasks and System Updates**: Perform regular maintenance tasks such as clearing temporary files, updating software, and checking system health. Schedule various maintenance scripts to run at off-peak hours, such as weekends or late nights, to minimize disruption to users. -- **Batch Processing for Financial Transactions**: +- **Batch Processing for Financial Transactions**: Processes a large number of transactions that need to be batched and settled at the end of each business day. Schedule batch processing jobs to run at 5 PM every business day, aggregating the day’s transactions and performing necessary settlements and reconciliations. Dapr's jobs API ensures the tasks represented in these scenarios are performed consistently and reliably without manual intervention, improving efficiency and reducing the risk of errors. diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-persisting-scheduler.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-persisting-scheduler.md new file mode 100644 index 000000000..130122192 --- /dev/null +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-persisting-scheduler.md @@ -0,0 +1,55 @@ +--- +type: docs +title: "How-to: Persist Scheduler Jobs" +linkTitle: "How-to: Persist Scheduler Jobs" +weight: 50000 +description: "Configure Scheduler to persist its database to make it resilient to restarts" +--- + +The [Scheduler]({{< ref scheduler.md >}}) service is responsible for writing jobs to its embedded database and scheduling them for execution. +By default, the Scheduler service database writes this data to an in-memory ephemeral tempfs volume, meaning that **this data is not persisted across restarts**. Job data will be lost during these events. + +To make the Scheduler data resilient to restarts, a persistent volume must be mounted to the Scheduler `StatefulSet`. +This persistent volume is backed by a real disk that is provided by the hosted Cloud Provider or Kubernetes infrastructure platform. +Disk size is determined by how many jobs are expected to be persisted at once; however, 64Gb should be more than sufficient for most use cases. +Some Kubernetes providers recommend using a [CSI driver](https://kubernetes.io/docs/concepts/storage/volumes/#csi) to provision the underlying disks. +Below are a list of useful links to the relevant documentation for creating a persistent disk for the major cloud providers: +- [Google Cloud Persistent Disk](https://cloud.google.com/compute/docs/disks) +- [Amazon EBS Volumes](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/) +- [Azure AKS Storage Options](https://learn.microsoft.com/azure/aks/concepts-storage) +- [Digital Ocean Block Storage](https://www.digitalocean.com/docs/kubernetes/how-to/add-volumes/) +- [VMWare vSphere Storage](https://docs.vmware.com/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-A19F6480-40DC-4343-A5A9-A5D3BFC0742E.html) +- [OpenShift Persistent Storage](https://docs.openshift.com/container-platform/4.6/storage/persistent_storage/persistent-storage-aws-efs.html) +- [Alibaba Cloud Disk Storage](https://www.alibabacloud.com/help/ack/ack-managed-and-ack-dedicated/user-guide/create-a-pvc) + + +Once the persistent volume class is available, you can install Dapr using the following command, with Scheduler configured to use the persistent volume class (replace `my-storage-class` with the name of the storage class): + +{{% alert title="Note" color="primary" %}} +If Dapr is already installed, the control plane needs to be completely [uninstalled]({{< ref dapr-uninstall.md >}}) in order for the Scheduler `StatefulSet` to be recreated with the new persistent volume. +{{% /alert %}} + +{{< tabs "Dapr CLI" "Helm" >}} + +{{% codetab %}} + +```bash +dapr init -k --set dapr_scheduler.cluster.storageClassName=my-storage-class +``` + +{{% /codetab %}} + + +{{% codetab %}} + +```bash +helm upgrade --install dapr dapr/dapr \ +--version={{% dapr-latest-version short="true" %}} \ +--namespace dapr-system \ +--create-namespace \ +--set dapr_scheduler.cluster.storageClassName=my-storage-class \ +--wait +``` + +{{% /codetab %}} +{{< /tabs >}} diff --git a/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md new file mode 100644 index 000000000..5bcc8745f --- /dev/null +++ b/daprdocs/content/en/operations/hosting/self-hosted/self-hosted-persisting-scheduler.md @@ -0,0 +1,27 @@ +--- +type: docs +title: "How-to: Persist Scheduler Jobs" +linkTitle: "How-to: Persist Scheduler Jobs" +weight: 50000 +description: "Configure Scheduler to persist its database to make it resilient to restarts" +--- + +The [Scheduler]({{< ref scheduler.md >}}) service is responsible for writing jobs to its embedded database and scheduling them for execution. +By default, the Scheduler service database writes this data to the local volume `dapr_scheduler`, meaning that **this data is persisted across restarts**. + +The host file location for this local volume is typically located at either `/var/lib/docker/volumes/dapr_scheduler/_data` or `~/.local/share/containers/storage/volumes/dapr_scheduler/_data`, depending on your container runtime. +Note that if you are using Docker Desktop, this volume is located in the Docker Desktop VM's filesystem, which can be accessed using: + +```bash +docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh +``` + +The Scheduler persistent volume can be modified with a custom volume that is pre-existing, or is created by Dapr. + +{{% alert title="Note" color="primary" %}} +By default `dapr init` creates a local persistent volume on your drive called `dapr_scheduler`. If Dapr is already installed, the control plane needs to be completely [uninstalled]({{< ref dapr-uninstall.md >}}) in order for the Scheduler container to be recreated with the new persistent volume. +{{% /alert %}} + +```bash +dapr init --scheduler-volume my-scheduler-volume +``` diff --git a/daprdocs/content/en/reference/api/jobs_api.md b/daprdocs/content/en/reference/api/jobs_api.md index de9c33b0d..37332b848 100644 --- a/daprdocs/content/en/reference/api/jobs_api.md +++ b/daprdocs/content/en/reference/api/jobs_api.md @@ -10,8 +10,16 @@ weight: 1300 The jobs API is currently in alpha. {{% /alert %}} +{{% alert title="Warning" color="warning" %}} +By default, job data is not resilient to [Scheduler]({{< ref scheduler.md >}}) service restarts. +A persistent volume must be provided to Scheduler to ensure job data is not lost in either [Kubernetes]({{< ref kubernetes-persisting-scheduler.md >}}) or [Self-Hosted]({{< ref self-hosted-persisting-scheduler.md >}}) mode. +{{% /alert %}} + With the jobs API, you can schedule jobs and tasks in the future. +> The HTTP APIs are intended for development and testing only. For production scenarios, the use of the SDKs is strongly +> recommended as they implement the gRPC APIs providing higher performance and capability than the HTTP APIs. + ## Schedule a job Schedule a job with a name. @@ -22,22 +30,50 @@ POST http://localhost:3500/v1.0-alpha1/jobs/ ### URL parameters +{{% alert title="Note" color="primary" %}} +At least one of `schedule` or `dueTime` must be provided, but they can also be provided together. +{{% /alert %}} + Parameter | Description --------- | ----------- `name` | Name of the job you're scheduling -`data` | A string value and can be any related content. Content is returned when the reminder expires. For example, this may be useful for returning a URL or anything related to the content. -`dueTime` | Specifies the time after which this job is invoked. Its format should be [time.ParseDuration](https://pkg.go.dev/time#ParseDuration) +`data` | A protobuf message `@type`/`value` pair. `@type` must be of a [well-known type](https://protobuf.dev/reference/protobuf/google.protobuf). `value` is the serialized data. +`schedule` | An optional schedule at which the job is to be run. Details of the format are below. +`dueTime` | An optional time at which the job should be active, or the "one shot" time, if other scheduling type fields are not provided. Accepts a "point in time" string in the format of RFC3339, Go duration string (calculated from creation time), or non-repeating ISO8601. +`repeats` | An optional number of times in which the job should be triggered. If not set, the job runs indefinitely or until expiration. +`ttl` | An optional time to live or expiration of the job. Accepts a "point in time" string in the format of RFC3339, Go duration string (calculated from job creation time), or non-repeating ISO8601. + +#### schedule +`schedule` accepts both systemd timer-style cron expressions, as well as human readable '@' prefixed period strings, as defined below. + +Systemd timer style cron accepts 6 fields: +seconds | minutes | hours | day of month | month | day of week +0-59 | 0-59 | 0-23 | 1-31 | 1-12/jan-dec | 0-7/sun-sat + +"0 30 * * * *" - every hour on the half hour +"0 15 3 * * *" - every day at 03:15 + +Period string expressions: +Entry | Description | Equivalent To +----- | ----------- | ------------- +@every | Run every (e.g. '@every 1h30m') | N/A +@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 * +@monthly | Run once a month, midnight, first of month | 0 0 0 1 * * +@weekly | Run once a week, midnight on Sunday | 0 0 0 * * 0 +@daily (or @midnight) | Run once a day, midnight | 0 0 0 * * * +@hourly | Run once an hour, beginning of hour | 0 0 * * * * + ### Request body ```json { "job": { - "data": { - "@type": "type.googleapis.com/google.type.Expr", - "expression": "" - }, - "dueTime": "30s" + "data": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "\"someData\"" + }, + "dueTime": "30s" } } ``` @@ -46,24 +82,26 @@ Parameter | Description Code | Description ---- | ----------- -`202` | Accepted +`204` | Accepted `400` | Request was malformed `500` | Request formatted correctly, error in dapr code or Scheduler control plane service ### Response content -The following example curl command creates a job, naming the job `jobforjabba` and specifying the `dueTime` and the `data`. +The following example curl command creates a job, naming the job `jobforjabba` and specifying the `schedule`, `repeats` and the `data`. ```bash $ curl -X POST \ http://localhost:3500/v1.0-alpha1/jobs/jobforjabba \ - -H "Content-Type: application/json" + -H "Content-Type: application/json" -d '{ "job": { "data": { - "HanSolo": "Running spice" + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "Running spice" }, - "dueTime": "30s" + "schedule": "@every 1m", + "repeats": 5 } }' ``` @@ -87,33 +125,35 @@ Parameter | Description Code | Description ---- | ----------- -`202` | Accepted +`200` | Accepted `400` | Request was malformed -`500` | Request formatted correctly, error in dapr code or Scheduler control plane service +`500` | Request formatted correctly, Job doesn't exist or error in dapr code or Scheduler control plane service ### Response content After running the following example curl command, the returned response is JSON containing the `name` of the job, the `dueTime`, and the `data`. ```bash -$ curl -X GET http://localhost:3500/v1.0-alpha1/jobs/jobforjabba -H "Content-Type: application/json" +$ curl -X GET http://localhost:3500/v1.0-alpha1/jobs/jobforjabba -H "Content-Type: application/json" ``` ```json { - "name":"test1", - "dueTime":"30s", + "name": "jobforjabba", + "schedule": "@every 1m", + "repeats": 5, "data": { - "HanSolo": "Running spice" - } -} + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "Running spice" + } +} ``` ## Delete a job Delete a named job. ``` -DELETE http://localhost:3500/v1.0-alpha1/jobs/ +DELETE http://localhost:3500/v1.0-alpha1/jobs/ ``` ### URL parameters @@ -126,7 +166,7 @@ Parameter | Description Code | Description ---- | ----------- -`202` | Accepted +`204` | Accepted `400` | Request was malformed `500` | Request formatted correctly, error in dapr code or Scheduler control plane service @@ -135,7 +175,7 @@ Code | Description In the following example curl command, the job named `test1` with app-id `sub` will be deleted ```bash -$ curl -X DELETE http://localhost:3500/v1.0-alpha1/jobs/jobforjabba -H "Content-Type: application/json" +$ curl -X DELETE http://localhost:3500/v1.0-alpha1/jobs/jobforjabba -H "Content-Type: application/json" ``` diff --git a/daprdocs/content/en/reference/cli/dapr-init.md b/daprdocs/content/en/reference/cli/dapr-init.md index b9295a01d..3df59f323 100644 --- a/daprdocs/content/en/reference/cli/dapr-init.md +++ b/daprdocs/content/en/reference/cli/dapr-init.md @@ -45,6 +45,7 @@ dapr init [flags] | N/A | DAPR_HELM_REPO_PASSWORD | A password for a private Helm chart |The password required to access the private Dapr Helm chart. If it can be accessed publicly, this env variable does not need to be set| | | `--container-runtime` | | `docker` | Used to pass in a different container runtime other than Docker. Supported container runtimes are: `docker`, `podman` | | `--dev` | | | Creates Redis and Zipkin deployments when run in Kubernetes. | +| `--scheduler-volume` | | | Self-hosted only. Optionally, you can specify a volume for the scheduler service data directory. By default, without this flag, scheduler data is not persisted and not resilient to restarts. | ### Examples @@ -55,7 +56,9 @@ dapr init [flags] **Install** -Install Dapr by pulling container images for Placement, Scheduler, Redis, and Zipkin. By default, these images are pulled from Docker Hub. +Install Dapr by pulling container images for Placement, Scheduler, Redis, and Zipkin. By default, these images are pulled from Docker Hub. + +> By default, a `dapr_scheduler` local volume is created for Scheduler service to be used as the database directory. The host file location for this volume is likely located at `/var/lib/docker/volumes/dapr_scheduler/_data` or `~/.local/share/containers/storage/volumes/dapr_scheduler/_data`, depending on your container runtime. ```bash dapr init From c7f303fa4725a153fff7c7c43c42f65b0400cdca Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 29 Jul 2024 12:21:25 -0400 Subject: [PATCH 09/10] pull in cassie change and edit Signed-off-by: Hannah Hunter --- ...owto-schedule-and-handle-triggered-jobs.md | 56 +++++++------------ .../building-blocks/jobs/jobs-overview.md | 4 +- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md index 9d5740d27..400068090 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md @@ -26,11 +26,12 @@ In your code, set up and schedule jobs within your application. -The following Go SDK code sample schedules the job named `prod-db-backup`. Job data is housed in a backup database (`"my-prod-db"`) and is scheduled with `ScheduleJobAlpha1`, -providing the job `data` which is the backup `task` name and `metadata` including the location and database name. The job is scheduled with a `schedule` set and the amount of `repeats` -desired, meaning there is a max amount of times the job should be triggered and sent back to the app. At trigger time, so `@every 1s` according to the `schedule`, this job will be -triggered and sent back to the application up to the max repeats set which is `10`. At the trigger time, the `prodDBBackupHandler` function is called executing the -desired business logic for this job at trigger time. For example: +The following Go SDK code sample schedules the job named `prod-db-backup`. Job data is housed in a backup database (`"my-prod-db"`) and is scheduled with `ScheduleJobAlpha1`. This provides the `jobData`, which includes: +- The backup `Task` name +- The backup task's `Metadata`, including: + - The database name (`DBName`) + - The database location (`BackupLocation`) + ```go package main @@ -71,7 +72,15 @@ func main() { }, ) // ... - +} +``` + +The job is scheduled with a `Schedule` set and the amount of `Repeats` desired. These settings determine a max amount of times the job should be triggered and sent back to the app. + +In this example, at trigger time, which is `@every 1s` according to the `Schedule`, this job is triggered and sent back to the application up to the max `Repeats` (`10`). + +```go + // ... // Set up the job job := daprc.Job{ Name: "prod-db-backup", @@ -81,37 +90,14 @@ func main() { Value: jobData, }, } +``` - // Create the client - client, err := daprc.NewClient() - // ... +At the trigger time, the `prodDBBackupHandler` function is called, executing the desired business logic for this job at trigger time. For example: - defer client.Close() +```go +// ... - // Schedule job - err = client.ScheduleJobAlpha1(ctx, &job) - // ... - fmt.Println("schedule job - success") - - // Get job - resp, err := client.GetJobAlpha1(ctx, "prod-db-backup") - // ... - fmt.Printf("get job - resp: %v\n", resp) // parse - - // Let test run and then cleanup the job - time.Sleep(20 * time.Second) - // Delete job - err = client.DeleteJobAlpha1(ctx, "prod-db-backup") - // ... - - if err = server.Stop(); err != nil { - log.Fatalf("failed to stop server: %v\n", err) - } -} - -var jobCount = 0 - -// at job trigger time this function is called +// At job trigger time this function is called func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { var jobData common.Job if err := json.Unmarshal(job.Data, &jobData); err != nil { @@ -128,12 +114,10 @@ func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { jobCount++ return nil } - ``` {{% /codetab %}} - {{< /tabs >}} ## Run the Dapr sidecar diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md index ffea762f2..1371a657a 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/jobs-overview.md @@ -65,10 +65,10 @@ Actors have actor reminders, but present some limitations involving scalability ## Try out the jobs API -You can try out the jobs API in your application. After [Dapr is installed]({{< ref install-dapr-cli.md >}}), you can begin using the jobs API, starting with [the How-to: Schedule jobs guide]({{< ref howto-schedule-jobs.md >}}). +You can try out the jobs API in your application. After [Dapr is installed]({{< ref install-dapr-cli.md >}}), you can begin using the jobs API, starting with [the How-to: Schedule jobs guide]({{< ref howto-schedule-and-handle-triggered-jobs.md >}}). ## Next steps -- [Learn how to use the jobs API]({{< ref howto-schedule-jobs.md >}}) +- [Learn how to use the jobs API]({{< ref howto-schedule-and-handle-triggered-jobs.md >}}) - [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}}) - [Jobs API reference]({{< ref jobs_api.md >}}) From 33f80b61d59a6927d49d9e5d4ca999551ee36389 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 29 Jul 2024 12:26:35 -0400 Subject: [PATCH 10/10] add code tabs for dapr run Signed-off-by: Hannah Hunter --- .../jobs/howto-schedule-and-handle-triggered-jobs.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md index 400068090..27dc31fc2 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md +++ b/daprdocs/content/en/developing-applications/building-blocks/jobs/howto-schedule-and-handle-triggered-jobs.md @@ -124,6 +124,10 @@ func prodDBBackupHandler(ctx context.Context, job *common.JobEvent) error { Once you've set up the Jobs API in your application, in a terminal window run the Dapr sidecar with the following command. +{{< tabs "Go" >}} + +{{% codetab %}} + ```bash dapr run --app-id=distributed-scheduler \ --metrics-port=9091 \ @@ -134,6 +138,11 @@ dapr run --app-id=distributed-scheduler \ go run ./main.go ``` +{{% /codetab %}} + +{{< /tabs >}} + + ## Next steps - [Learn more about the Scheduler control plane service]({{< ref "concepts/dapr-services/scheduler.md" >}})