From 9b5d45089872419fd2c057478a48f7309c3c87a2 Mon Sep 17 00:00:00 2001 From: Ahmad Musa <53178237+ahmadiesa-abu@users.noreply.github.com> Date: Tue, 15 Nov 2022 16:36:10 +0200 Subject: [PATCH 01/14] Deduplicate examples (#2398) * Write fundamentals doc * Refactor AWS basics example to use new format * Add verification section * Add deployment info image Co-authored-by: acritelli --- .../examples/fundamentals/_index.md | 2 +- .../fundamentals/deployment_info.png | Bin 0 -> 3226194 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 static/images/trial_getting_started/first_service/fundamentals/deployment_info.png diff --git a/content/trial_getting_started/examples/fundamentals/_index.md b/content/trial_getting_started/examples/fundamentals/_index.md index de4a14ea9..fffd73afb 100644 --- a/content/trial_getting_started/examples/fundamentals/_index.md +++ b/content/trial_getting_started/examples/fundamentals/_index.md @@ -103,7 +103,7 @@ The deployment you have created for a particular blueprint will be displayed in The example blueprint deploys a simple HTTP service with a static website. It runs locally on the {{< param cfy_manager_name >}}. Once the deployment process has finished running, you can view the outputs and capabilities for the deployment by navigating to the **Deployment Info** page: -TODO: screenshot +![Deployment Info]( /images/trial_getting_started/first_service/fundamentals/deployment_info.png ) To access the web server, simply navigate to the appropriate application endpoint: diff --git a/static/images/trial_getting_started/first_service/fundamentals/deployment_info.png b/static/images/trial_getting_started/first_service/fundamentals/deployment_info.png new file mode 100644 index 0000000000000000000000000000000000000000..62963a97411a651fe59311a36a0140e2a93a3a7c GIT binary patch literal 3226194 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∈14VUY^dl_A%5{I46cq73;F>;x3r21A67($G%f!jxb9UZL{^lrNJUvxwp^_@xh_?Kyh=$l*|M8}v2ffP z@&8rDA~mG6{I~47SG6y)Vn78Jm1819%1@DsG2f(y3|oPs(sk_uKkG_Zs^YZa>rC2* zF{PqkOG)aN*9a>^KD_XiWZ_&3-Tfr zB`j5O+K?PON?4?#2sq713~5>#Ks_r`D{253aLm6m!Jg^x@BJa%i=GfAx1_G#c=d&D zD!AXIZ!c%5LQ5=B5#jxMqw&9TE4anO>*GsX!g@2diHESBeEiWLfARhGSDc^PA?2Bu z|CPV5aQ&9uyYlwlI{leG-8yw_7l*zpE3bI(Ki@w8$ZgGNnoW@a36KB@kN^n;j6nVq zb2dn70RrY24Uqr|kN^n;8v$lLf~`k<`V$))ga3T)KDZrGQIXxVop*w?fo0f`0rM6v zd-d%PH*VS9Gdr_emrhsz{oK1AeBt4{ufsE9ladndedMLEQ0w2%Jt;OOx(&q35J-Ro zNPq-LfCNZ@1W14cNPq-f2?(Bj=&Htb5(s7jmtS;dNoiTvtn^FIKmFUE=jG+^L&esT z<*Snt;!ZnpQbAG4s9^&~4L>57L!fUYKmsH{0?kNZ=ClaBqP(+d%ESq$H)FE_Zz{(z zJ>WKJkOWA81W14c+5!O0TLhq5+DH*AOR8}0TLjAMgn|@M@s30V#nScKmk%YXPLxC{F?;KmsH{0wh2JBtQazBfzXj;8@cV36KB@kN^pg011!) z36KB@kN^pgKuZ%~rlX|^vwae1Bv4@Ab2MuK8fow^36KB@kN^pg011!)36KB@v^)W3 zJzAbIEsy{SkN^pg011!)36KB@kN^pg00{(&05ctdA}zJ^)uWGI*Jf$~avam8@l&1z zNPq-LfCNZ@1W14cNPq-LfCQR_08<~$f{~4o011!)36KB@kN^pg011!)36KB@G!KDc z_n&ocGt~kx>(M-2!d6It1W14cNPq-LfCNZ@1W14cNPq-_fdDfd!O#ozp;Z!aI2^6g zZy!#paN0~z2*f}v22_0DY+|$2kW{`2^S*b(PylQN#)|JKTjibr^o!yWFhd5qA((v& z@^GZ+ATL!hKpL7s z7z{RinlWy4FO`**wY9Y&A$kuzw2zTlR#qk&(l`Wg>_{g;gk!Z@b%){J^&%~V z4@LE<(-vZZ32@LUufz}zx<=GH24)ZCl_(sW%?2$|?|?JpMPmRE%FD|QOomd_2nXTg zQ-ANkE1(vI17Ze#4xkbm8mj+rLkM+sbr{m3aL_esu<0iNNvPmc|M*nH#{Z<`=>Wok zA|mqK$@ZZp4s=2~md{9-jzDfA7FsgacwKD6h_YZbTrMJuu`vclp`^&WK3F8BIYe z0FxoQ5{oDt1HA(iICi8{0Y(mHLd=K0z+@4yy@f#)t?TMW-0qCSNcH5K@B!|Qex zi|E*aA)pq`12CqZP|m=LL;9fSjDB5qKT&h6^DQskSO3`M=8dQ;jvYJ7^cw990#9pQB&h#`E@ z?4bsmXV>7!^=d-rM!lC?I-6^Dv9PePsHiAWvzVBmBI-h5#nA#=SixDb$Q*^+DgixX zPYpKD!_p5E9LeF~;iBI&coG>IDf-QTWAH(G>|i#Lsvw+*hzOByN*ECQP;%RaD|QeN zsh|b?Y(z&#yEWziE4V>L)S;MaATRPw{bY(zBNm_*sUT7qf{L-p&_5{Gz3PNUwgBs!B@NwPf zfBj%)5B=f52LxhZGL#N!aDy#TheBSBPf<8ZMRd3+VN9X^d&G6GnhZr93eIYM3u?iiR14a^=;K}5znRMb1@eRXEoBr8n-hnsYoLM&?JXpJ9W@z>979lm21VCnXZAHSHtDVfFcz9R^h7fW02-SZrB)2| zl!2K<8V-8Oz*!=$-qEw7Gcg##2sdz+h=Hentinn#PmHQVMd28j7!Azx7&cx98;)Wi zHM|7-6+VW({_8_U0i6dGQ5V9BW=N!Hm^&4NpMcfs97z8CRKrH}OVcpc1fv>9KH7&T zQ1tJN>t6gkYeU*~yZ?1{?D&^)+Y1$`AxwX0q)E1}hLj1B3e=&6#X#?fCIMx_fNvrd zSiwjTsb~bC>k8BVI!r)bY6w40A{E3UwSx8yj8A1nH9o;vKWdFL-19$-UH8Hz>0pDpw0BfEFoea`y8m^=E9aFdK+e zAaB?={k@|mLy==30N?N_(hBCuP|a-mp(z3edIu&%&|pZZh_o=OrN=d_7zhU{So9xm z2nX_rMTA{Q|0wi#F6JXZk z@a}&`PXZ)B0wh2JBtQZrKmsH{0wh2JZHoXi9c`;W84U@L011#lYa#ICagW@|T7cHl zTlA9zNPq-LfCNaOwGv>~qqX)N{U!ktAOR8}0TLhq5+DH*AOR8}0TS>ez)XiH6K){^ z5+H%#Bk<;Xn;fhK2)=%yMMpyS&!iEA9_auBtQZrKmsH{0wh2J zBtQZrKmsHnA;3(BgcfB|J$aZGP5JwQK6fCNZ@1W14cNPq-LfCPeu z08<}9(-m}t1W14cNPq-LfCNZ@1W14cNPq-L;GhXG({a!UTXzHHOGduj25SLYcc;*M z5+DH*AOR8}0TLhq5+DH*Ac5u~z^q5}aAYeaKmsH{0wh2JBtQZrKmsH{0wh2J!9YNi z>DUr7G?ldg!O(5=fdoi^1W14cNPq-LfCNZ@1W14cNT5jqAx%mgS^-DHBK1M4rR4Ex zHk%!I`6Cw+FqtqCFeLnt(1wj48P8p+P5&*sYH9NNRiF-GwYWB=XB}F4#9U>hhLj1B zA!S0O0uPmztE)|}8!)8268UD#iqdK_1XqE;7z$b|KoKzClr2~Ide-5d9x)}OV!^sp zD*!6Wgvc>XMZcCJpgy6lbJ4VP%4=f!9aAa>3@H=F3~7EgxnjUEw0SUEO}eBB7_eeM z#c()EQS-LR75HXMMWkhnfHI*xY%&lfU@RQvo=y{*A(55=$6!dAP`WzZI~YScO&lZv zX*ddk0pCO_5SAKJ^1&I7FW-vK_~0!awE$3WxVjYo+y{V$fu1s;;tQakL1jS2Pixw) zV9$CK6cp6e)oJePS*fY12@4Cu2-731WNK?`Efz~ih?7Q1X{mliO15DF`}P&&=H~hd z5XU42TVY|LXs|&ABh6~H`f1s97p#<)mfCDK3{ltZ{@3kxI}RN9=3mThZ&g)QNlA&@ zM*m->;h?qp`g(k-!_9x=+TQYpMWmv7r>Lk%+B?$OLrqYjp`n_$O|Gck2@el%Qc@ED zXGA3Jo$Bgpgd-X`2nWPOs1XkO6oxc!n_Mx_J1~LqiMhJT#$5#)h96(iv4h?zE-n_SzzRm1{_zRNKmZ*i zvV!no2vdO@89!eQ^bT6XK?=_L!-0x{*#mPSAV@nDzM*&ggzUM?SU3h|4?qx2hM3mi zt#mRBOgK2)uo##7=|F7h>FGLy zQDQjwV`5@NU07LJiBnHn>T zm2KO$Wn^TCuGTQcU{uG(#`^K!Z5Iq-eo0735QT$t?#ReU(T@`*S(uK9h;Vbj&)2-X zJUAv&QL}%1e7qQMND$q)yQ{@DZ2cI?=JQv%WNJHl6! zp(q@TPf>>=90QY~x>&^&s=s$I8NxA)PyH$e1{)d&0a(%BJ5Vt;8R8cK=WP1JQJ1** zMbNLJ!oeKX(vu+$H!PxX4D=4>C_qR_Nf8miL5@%(GDv@J#@NGib-B0mqbz0Y%@0nr#ofk~(HU1@20% z7>-bC$Ury-R1^UNzDYSK-$aH)!kRzIkoHy2iZW!toJd6^tlT!Bq9)tzV*kEkaO9;ls7>q-&hR^~b7jj9sORj_fyCiVAaF;*| z+>zr?@6GhyA;xrUz_=UtUUt{pi~isBV6kXd+UNJ|N~`kG%P(1aH1o{Nd*&HQzn$k% zr`IjsBOM(lV-E-*fB*srAbze1c-EWM31}(Abit;HF z0R#|00D(jiAnK7QJw-hcKmY**5I_I{1Q0*~0R#|0pnU-%9qk*D0s#aNKmdWn7Fc=f z^3|*bNbEkO_6Q(=00Iag;7@?4hd(!RA%Fk^2q1s}0tg_000IagfIvJ75b21=UZGA1 zAb>zu3XEF6>9eF>3s4#;=}KS9MgRc>5I_I{1Q3X^0HKclQ1apz&nNX-fMoAL+J^uF2q1s}0tg_0K(Y%E^+@&}rhNz? zfB*srAbg_IW>)IXX=CBr^i#vhh5kLR|1Q0*~0R#|00D)8z zAnK7yy-iyYKmY**5I_I{1Q0*~0R#|8c7eE!bo}a>8}e8SknF>c_91`(0tg_000Iag zfB*srAP_}?xQ%*5vCZrnfvy!uPfzdK3Q#%%2q1t!JP26d4y@_pp^el50R#|;AAv-i zMSphLvQf#u7N9gx5`$rq6@xN5Qbc28V?#rOX%8+-Mus7(qbw@I71Y$!WGart$tuv; z*c5r}1p)y#*i5sibx5le-Bc6Zd#Bbg_EC^>MQ(EI3Rp|g9+XA*rh;54nVFfbD-dpr zxLhtDyd%2>1Jw<>ZZYCny6KTwRe=oRj;*Yge@vX0;akt zi?tvXVQr3t-Er-Gu&D@ZDQbwas0h=s|q^jt~uW8rt~VvT1t$Ygv|@jE>njpy@rjocigZs z737AEdsp*Fr^I!2btW{mMJ+P*j?$|XRnPREr(CL@>FrsAP3fcE9NAh0)DU+dm;{u? z)SIf94m8!xIOLbJP|UWIEhbgb;iPs1(y| z;J&Mvjsi7DBgfPnH`q*vo5q;xCO6Yj;CnLkaqMVXGr75gx)UbD;^G4;J*@?BJ!LA< z^^}#}N7FRCRhDTcac>Q#EWVp#ok=91ET+0?cniVQJ1WJ;#Hd^<#WZF4m>4zfs5z!m z-1uxg%b8}d*7Jky3tQ{_(cY4mmsea|Y%Qg*u+W67F4rwLH&+Ga2hx@E%YL4E|luLCpwM8Sr+B?dk=9or~DyH-ra^CBv=ID)61$ob+ zis@!*jw+^)H6}FGM{Ut~b3@K!_4MAXf}-6VRmM6#b$FJSmstv{7&6Guh%|~;T%Q|~# z>d<($PKF97nBL;mq1KO5YKyX1-$pfi=w@w>^^;+^=IF>(wSC_Vr+fG=BgPrkg)uIX z;*wM#S_3I=hp3N=`N)!_qlIQ6kURn$*D>o$E44L!%o?JC;<;}A9DKCMUlt#^tSxGz zh>8Ornd@mSfVHe-P2YxL+%z?A>lU{ab6ppk>cyrMAA>P&E9RpuUa}-%)Wb`&NrM0a z2q1s}0tg_000IagfB*tXDL|wnDZ79!gU!HMj$l>9xZ!}-v~&}uBX)qAbI6rq2*9GVlN_K((0tg_000IagfB*srB(4BakHqae zYK{N`2q1s}0tg_000IagfB*ua0z^6_l78zk52eytfYLxo=s4gx0tg_000IagfB*sr zAbikv1Sd&po5d9}@_ZvQT0n+e+7=qjfB^z`&L z6SUswiZEr-PJ%6Jy~A)@f-MS{p!IguN;j9W^{Z`eQDSQr?Z?_2S4u`khL5_bdft0S ziCy*DY;2nwg94_yxmsDXD7`g{3UXz&S^3r*T@j{Iv=di~DVMUivRc<6+!mKU+RgD% zF;&>r&4+-G<|vDfg>Xu(w_EF`^ga+=mS{I8*cL0b>!a2<;kE<|3YVbuc9+E}p!B*~ zJ5*Ur0zR6fBGg7xDN5hm7|WFFig49yO&V^Cicl6)K|Tb0WO2=L)eBeo*4tfr71#Qu za9cVe;JqN1(&VfP$Feyp%lon8I@DD!9BjyTC*U%MycFT7OYibVNY?Ttm&HUK%wj4? zMW|d;7FSTTv$$HB1cD7Q)lEgXo9UCGLulD$ksrJCD#&{&t~u6%RD?B)zq&PfdF4f99Z>R|6GWCv}^&ViVm=jPbrao20++?Wi9&c)n#y~?ugU9qrrnYFXnVO@D zX&C50P+so^=_t_1(an1nwM8v5HAg%5F%?*|xP#g%poX{(@-E;CGC6DKyLRo;y{S)q zOokc;5-^qG4mWFa)H}*zDo6*Zv`vSbn+)B(#|{#jiqI(am|n@$5Y^3ldY4jJL}zM_ zn>}>zy(|@>=Ih>j7I)y7x<)(q(HzYldTZ0Y_qu5SxCz9279YK%BGeq~XJdcOQHyl5 zHphCnY4$K3Zo$dWd&QK}b&cuRQ9(N5OrNOjn>l^z8R7S+u_|-Zr$nV!RZTOAN>LG}EUu^8Zd%0VXudM#QmvHUR5v#< zntIAjjHVge378H&Wl=*^ifLkW&9TlTu0p9D$9DfsaAqA)lD;|3KD|%x@meY32b2LqP z&!Ut*dPi+nDW-QpRZP8^lau4UZh9wEpB5Gtde5S^sBWggri#f;9qPRlrOe)Q^PWrJ z!PKIHf&%YZTyv~-lYnXVQ1kWOKxit?d)?euN*$!$vvg$kFdc51qjXT4Cc}z~3OSpG zwA}Q8*g6?ndq=!JCPVkZ(Z^(H>QD_BiCM>|vgjx<&FyNA+)NX-kJ&@iYLRL7P!=^u zbChZ1Xd1LmhWbRVBhES*T6@R6hgtb-Y#P-`l% z3iz80H3qE5j=$N%-zP)wXmVEXs5#cjP#LY%D#g?s6`@hBd(-UU`;(!yIYPG19{wgn z<>HfJ>)z4vuCd|!7VnV`%@?})Xr49K?s9e)Oa5L0t}WO2^1DaG2Ss+GI7+0kuo+>^sL zb;hz3mDOg=+uZ09o3gn5_{-uwS1@JpL7Vjt+2|5SJBtcc5$+aJfyhs-S@skXqYhPZ zk?SAws*mQlFj>fc+I?!Rn09E*;@aXbSG)BOCUE;VmEt3dYrZnNyus4FJTPT(iA`C8 zb?~0ccPYx~@&*fy{J?^?`HHJCE&be=UIOHvoJzCo-(zRNKfq;#C9?KmY**5I_I{1Q0*~0R#|0pvwh_baZ(a zPyqxGKmY**5I_Kd-2$WUIsYI}YXOqUt29uOOwFM!2q1t!TnZ5Sh|6xFQV1Y`00Iag zfB*srAb2A|0_er^F-^ zc=zO6wx{M=fYLxolJzCcK>z^+5I_I{1Q0*~fn*dQ^pT9cN}CWs009ILKmY**5I_I{ z1Q1A70U{l->-o<+f0tg_0 z00IagfB*srAb8Dy%vC|N3?pA{U*IYAP`8VHoE4-XQNarYsIYTU03?c z7YX*X3vWAN>^7`mzS5DDp^@s+0@jOkzokp)YQ~uW@gsb z)~2VY)z;RTiX(Bd3RG9uL>_yZU#hCAbf2zq6 z#zy5b^^O~9rZM0Id{2fRyGF^>95r9}-m|FfYLTfq67%tPpe)(h+1?K~HKD$~UTv{9 zMux{b)$5EK}Xo9Ay+jo7HG@qsD-WFmzBf9QN`3Ele2c^nq$f(YBk@~9JNI)GBrnS(a2E^y?2mGQ5Ne| z;F_cPFdS^_?P`l|8V0Rj3b)1g>|yFtm7;#J3dl`uQH#P=zV&t$Bx>(nqdm9|)x9Z~ zO3~Y>_qQtT-wBw8wCf$^ZQasvTa;MGj;R#wO3jh8Y4&g*qQZWZ>i6V={Ufaf(7TC> z3!6Pm^VBqTleMRO%=0S3R5$41ngq zuU?*Z7KKDPIXMLd1*RQ~wXm?zG>Da014U)&f$1&5R521KmVlSBr?(J|Pt#!2tdyIZ zYkF@}P4e^eO>>zlCT;7nquIooMFm;w<{Bad@8dxs50zrdqMhq)LsNnGQk2q1hw9US z27sw=1TECd#DIa1sc-Q^X{gDS_SFw@t&n4vxoQQs6J{)US6JQW-BWzvkqyw zsVsjTYHE&~Jxqt2+U^j%_l}zkO&#jva8rGJ%g`B z)Zu2GrqmWuo8GEagpW6CA?SmL<`D0LP1M%rs4YHvM+KQax2qH{pU^^Ds3j%`|%m&GgAoO>=Jt)>4$w+8p(cHH*+Rw|oDft6KT^WT*;C*~5r392Ka{WVI_0b$<@j-2EjuUXXLh2mu zshnNKbRRBF>+NzgmE!i`yE)3(x(?yCxX-B?qTv#>-tNYLDN9Gjr>Qwg>|^8z!PFd; zVm(5|s9Y+=G;);1+wF9HZ4 zfB*srB!$3FM*rn8)&e9&SJDUs5I_KdR1_fUk&3-en-M?&0R#|0009ILKmY**5J*-5 zA|1)vv$P8V1Q0-=O9XnHH0c)B0(1#Ig(83e0tg_000ONAhG-xsvON30v^#&rT7YEf zP1=C~0tg_000IagfB*srAmC4csE0o{av^{K0tg_000IagfB*srAb>zT3N%ML4sCkm z!z5h`ke;3%kLuJZ@dTnZkm7cT#%;wCZ|qQG1QJ<*sUT*(XQj5Lk6A-hP(0TyW)40O zl*LCbYl~t~gtbZukv^W?;<;||+_|xFi%ls$oa44)KHB0XOO}^JU6`h>uCA)8%2a`x znwpG^3{ywCERBtg%2i+AU@DHp$tqA=SKIE`)5yup%(M=+rlzK>EU$-NAP}gpudlAI z)~NPQts-3Ayk}8LWofs`Av>(Ct<@GGglv!SR0p+QRShGg33*ASNI*wu$o9xj)tv0? z?8s?CUR4$!vxf$NsX1zhT4d@_rB@Nw-f_(_738usG#I8qCDsr%9R(WI*4~kTkGBI2 z8&|!Mj*jqDZBZ6$b5uQR?3HY!CmY~9!4wz$dD z)EqZ^n3|)~oq+d(REiL+W5D-h=%YCrIo_M&1Wc2mvN!=#DQ>Wt4r&$TW3VZUGMWm~ zfurh~CPQV>$T4Mc)RmQ$k=*XPbVFg-wE!wnd972H(wk+#Ne+@ zk>FdE1}hx-fg1p(<^)GhpMYgeNjvHyFx&;MPLyu!1*c|U@%Hm@(bj>mKPH;$@>Spa7e`v88pTWAB zhJovSQx<=NO-1PDy?25gY8s!e2;F-h(m^-xbyG^+{FP#AjuNXBYeCj5;XWCvjouks zr;PVVheA8Kxw)2e#&C%LQQ|_4_8oDmSJ2*s0J@3x-}#An)}?~G)*y@FZAb`cIzL~M~d3!<>iHJjQrFIcyEsOrWWbmR5v#dn6jt{{h2{o zOuge{_7Js-Fx5?6DFjoNoSYnM774iKSVxZ1t2kx%cys$VHAihx-Asc`&iW&zsT9>; zbGrtQZXVmBWa>@5eVFQ|=4h~)vZx^I_|#FRn^i!~u}%e|mYcOXnmtrE)8XbSrbc<} z9XUGz>-)P3vNp%sJ8FWD!%ZzxMpK_^FzfI%W$`yYeKbcSM_ps8Tg)ayz4K}eSVxYk zXKIeyzbT7)$2u8m%xD;xN>LUa)H-}jbGw>jeRtCsa36A1qW7CS+`RXW`_OJZsQpcb z;d`g*)Stf=b}hi3#=GOlG%@=Al;|B$wNp=7-x`$5$EQSVbDW%x3)2YqF)?c&#bdqXg_Wwv;JtX_}j>QOfY z;&zC}ZN(Tf2p|wk0j7eOX0{Oq3i2(WK8-=Q#-Iq_0%SxWmIARk7GhJ154X6j zn2)x2$&!ST4lm6n4FU)tfB*srAb#X3J~>3-M**g z2q1s}0tg_000IagfB*srB%c70j^yi8T7&=s2q1s}0tqT`)2;88u@)dfJCAB3fB*sr z#HRpJkNE5tYSonjd#(iBp$h_cWdkT10R#|0009ILKmY**5J+JGuh&IS9ijn!dg>xB z^A|21KDdACw3?Q-6!?7cN(DQ5bT4YTk;e!ifI$2S%sZy~0@ecT>6g+#$)1P&j{pJ) zAb^o-Yn7xLkMssN;0tg_0 z00IagfB*srAdpl7L^?vdGcPyi@(WL0w{de-RZZw?EuQN~h~00xx7gOsL#-XDuC6I4 z$ZscIinkfOd-mwjVq5zUYieq+L7qlcGWGX=pJ1Kysj_rn;b@V9!20 z{a;yCRgjIeRv=|NrjZ`MNpXiwg%0=;ytX z?eCow2z0f;kQ4sr8P)=HbuUmp0tg_000IagfI#d83}1|6U%9R-F(*4~uc3n?m#&aU zZEbB)k>TtIeXp*lsOZ+MTjV{re6^;grmU>2e}CIaHVTwvXJ_Z+7{2qXIl7rb7z!(> zIo-Q=Z&~4XAFDaV#l;yJUauabXw3TcxkHEAmRhK5lraX)X}7&3KmY**5I_I{1Q0*~ z0R#|;v4GbvoH4Ez#UX$|7Yh6+aPmW}1?a*KplAdTKmY**5I_I{1Q6&X0iqtA1j%j? zKmY**5I_I{1Q0*~0R#|0APxkGbi_d?BzP67U%d1^)&eAWCsKU`5I_I{1Q0*~0R#|0 zASnfidL(7H(kKKFKmY**5I_I{1Q0*~0R&Q1Al8wNTfRE&;ux+4h}lnUbfBQpKuOXJ zz78-%*T6@`l*LCbf6cHKWKHj{R?6k0ARk$LSC5PcAP^e?j_cSss}w7>HGRw);-f9G zted~Gd}#a2;v<)}MgEHLm&;nWcupVB0&!cnm{rVQLH=@CM`>(IvDQlI{Z-6gE+5tF z^eplIBQ5$(5AQ$d;dH92t9R|%W$Kc;x;mxT51V-R-ThOp4f>T5?^*OCE&9=ws;VmQ zS@gpxO0SIGvnZv0q9ilZ_S3YkIi{bc_0b&FP0i8Gd+)fPg4wunqe-Blq4}q2O+Qnk z=4j-oZl;2iML&t-y*b*s#(+keI>=)|s+fk^rcIkn2ZC~G7^rR@OL586d{xhs#o8S0 zT%%g|ro&D1fDTeq78TJv)GUKdSz9?PsDk{>9%_+kGE^xVX{O1r zyu4iLO{KWzh}!#L^U*uXqRCLh#&o#(n+)aVTFcAG3$LCSu*@{(j6A;no7^(2Lo`XdSCQCdN+u zl&D>q=Dm=_@gDWiZ@>2L-8-bxk)LWJ&~K8O-l}x~=!2B$V}#yy^cGTBSQxo7Enjt$ zlzy1C<;KX5-Mf@kKyQaS(jp#gp~dRxQj7BQ^Fv<<|6FedI#f)}(auyW^{MyX(fHN@ zW))BtWi&O%NAIXPng`V!)4Pt)^ik6Lw@Ot^6K=0wy}W-nP{q_c8V07HPF60}%KBTw zI^5)Js+&f&$})x6)SIf9DT|8GVAJ?C^^T9(L%pLSOm$Opl*=@G=*yl)g0*)vK2?hM z!%b-ZCPN)@reA_qTU0mG?{vG5Db}gL$7HCsXflj;b3|>OJv3}|?DXl=M|#Tc@#b%C z_cwc}LrsU9buv_w)jOIDO+#94YL4}-N=KZJ*~2;+Y93Id^78UL_NJ1lIjWfT-OYNq zsURP7yN}7x$44nm>~T98>TuH#HO=ilCPNjW_go*7q2A(6A9U3m-At2V%sv@vGPDZF zO^1)^*imzIAei2&bnIB?c4e_nh8i|H+^mzKzfXqxvy=6+htM>wdHC=}A^7ld4`n}TMWT;%G&+YL%8M;p_rr9IhWT+9Sj`Mws_eh6kb9JPtc`l3TlaQuz z9|frwO?6Wj>HsrkQ4u~Wrc$g0Ibl=XG{yLZW^>Ku6|w@6A!I+)?1YMQV#fGaaEy>;Y48LCmH-qHT8&G9!rT`8vK z=pdE0sW}q1ew0$htZ42KP{m9m$KNMIf0Lma<$bVqEFYx1@N~=av^{K0!bi1 z)FTNxktQI300IagfB*srAby$3QXws4@a{WpmoQW z21;6QWD5caAb>!E3lRE9@D8N<2q1s}0tg_000IagfB*srAkad9NJk3{9wLAM0tg_0 zKr4aC?~cBjwE(SH*nj{62q1s}0tq2N)FUCfiAo}X00IagfB*srAb>1_Tg5009ILKmY**5a<*Eq8^>X$W9PI z009ILKmY**5I_I{1Q0+VE(C~l#6>qy36BDgKlABtSql&bt29s&<`p(0fB*srAb2>eDAeY#h#TDee6s7c$#YZkzinTee zARo=~UXV-aJ$2e0_w=q&KI+zyf?7(p``B8yV8z^ncK7dFKp9=# zJQfj5X3gc&$7gf=)h#_eJ=)FjT(P$fd~t2KwE%7>!H)CzAa0uGvA$m?OV7?2Z_8m% z{pg$~vjHeU_5(b_xOkB=-uQ^mXssFbRzDjfx;EdF{& zgDoc~C!9~4+kG@ghnsd~>YbXJ8jUnl78T*6cYI{=(H!-Ta+ziiRZK04_Ti=?d`yNu zn&YE)R56WD>)U~k=EP=h_aPu>O@@Vqg?gau9&bJ-L+#(k+#Z|RLzAKP?Z97id`tz( zVtRK|4{Chs-ZZntax(PM9P39Z^^Op%lc921->Urej+_;#PML`H4 zfB*srAbftp!L)5E`940){03$yz1kSnUr7Kwr z&;dZQB7gt_2q1t!hyYQK5D=asfB*srAb)K%fHx7aV1x^5$0VhZW$>6w|C1qJ!lH8s`MRRJ|6QEqiJu9?YNfJEsn>WKgX2q1s} z0tg_000Iagkf;I*c4X(|Ab_3&Y00uCUB7gt_2`R9(qHb5ku0S9!!J-~o+|k(B zIH+eXA&-O{cT^ey1Q0*~0R#|0009ILKmdX02=pn=$q8g>sf2#n)k_JU5_#EC$I~d- z(ea(I2Lup6009ILK){Q@b(8O0%31&~Qlvou0R#|0AkG97J@6hth@+@SoH0@z1Q0*~ z0R#|0009ILKmY**5J)@$A{~j>XVe%01Q0+V_5!!Qal`+z7Qo)CA7D z=!6?t3lKG4c8mZ52q1s}0tg_000OBkkc3f>ty{OQU%x&PyLHp1O*J(&K5D*s^X7Hy z)&(;zUAnZfvGMcIKW}JgSiE>~aJwFqmzTGE%3}l&KmY**5I_I{1Q0*~0R)mvATc5x z`gz^{{rjJC$|)zFc;XE=+z|Qe`e&bg_SRc(byh!Z+_-VhoH@b0)z#JAamO8p@4h|# z^wUjEO~IGkgXf=rURgpmhCF@fp@$UI2-&EoB_+)lv{%gH^2;wj^2j59`qQ5(gz>Fp z?|gF3r|ql-_~esM-gx5;m#ezE`j%U6*|~G)amO8}7|Qk6UtdvCv2x`~MS>Ix`T5U( zzHHgDZ|$Ea2q1s}0tg_000IagfB*srB#}T?qO>I|E9-B6`&;+!-QRiVohz@r@~?mW z>-O#27cN{lc<|t1!-jqE!3X{N^;0O}zyl8qwn$4Gwrtrle*AcS;V&yI+h?DBHf-2X zSy{Pl+qND(dMF~GEGt&5m^^uMQBl#VRjbylS+n=vdw1*BO)DcZGBOlu*?<52Uw-*z zJ=IRejT@&u-*wkr+OCbdzwyQ!RV!u5%*-4*bm-iyYnOS@8l zMpe>+i(b8Y_3qvK-FM#|GiHp!D9UooF~_W3yH*JfIN*T%{QM8BSL7i(jBdiuo|U#zw$Qlq+!9zFW(v(HwmYinyi{`lj(ygW5fwbf&ROqehsNXG*N z5I_I{1Q0*~0R#|0009KzPhj@zlb&v8Ex@-cofvC9T%GkjKQ}k`u)_{}^UXK4NI?rC z^acK&d+u4jeEF|_^{X$w_(HJ{t-sJ$eck^4_rKqH=bbq@IY0Qp4;1P6#V>wQUth1p zidJYzg_dL7fB*fDJo1QMN=qvZlqia#T`I1kH6_uc_90tTbA~p(ux5?c2An0vZZ&Xg>;NXy-~cefsn-zx-0+h<*3nx1gY4`0(M1 zkSNrn`wK3(K(U(Hvu7)wqv9TT;DN8c`btp|1x(Z$RZ>+|(^Yc?cK-b5KdTzrr&>I1 z+BChYH6MkAg(~aryYE&M=<2JlR$^7)g%@7<%U}MY#EK&c$zgMk00IagfB*srAb&w5E^xteG{3VFE4?p|v$6iv{A3?H4~1G3D`|N;i!!Q)s*;+Z`_-#gAAkJu3SKB6GH~EP#a~n876WaKFV z2q1s}0tg_000Iagke~v;{KNlkFs%hh&~{So_5{B9Hr`&!E`D9#$#v$6zMMb)_~Tby zb=8OwBNSh_?6S)gBT%qFuPP3rr55_;?=G^TXoa5YtG-SL(fJ(bo_ns=W$5dD%K${M zNlL5}M}GFRpD7Tab4P;P^+0>p;s`|?v_3+4wX2(NzWI_%E>ZC1y6dhhEiF~JL<=-@ zp$sj!aOqVg7s$|3kp&ADD7>OQsOGA_R&6MaLKS+f0EDivp`{;hzx}ofReVG*>BJW` zN2@T@5XES;U3JzH3`Ilqs-9~3hAOFu$!)jYrakL~6)pGBOWLkdbU6{N1kuxwn@UuK z#mT5#wO1h_?M(|nw5&s?<0xQs#1Tj6rI3s~MF0T=5I_I{1Q0*~0R#|0Ah858Gt>J< zyT)gobL@x_!!t6P&oT+Qsc5%F4-`Al&3&bBT_vq$&^0%8@`V;D=o+R9bLdOH7AYv2 zpd}kRqeKa`T0t-A`@8}Qx*&#DOeoBu^G$S}4ZW(+fMOF`52Ap@#EBENq(Wcpb!`nj z)!Gmhtt)=&v0^A%f}zt%w4_206jRWu3e`tTKXk81gmNi{qHxCf=bx_&UufxsmWOCn zg)XbAr@EqumX;{ZGtWGu;D|1iq3x>Sym|8!E}1lG(ti8xr&C=N0nyr!S6_Wq<<6Wr zQ)iSY)}XpcW6G2%I_*VgtSEsC+~|BAtv6B8x)z6arS&X|Q>ffeKmAncRbfRg)OIyi zRZ?(A0=nvmmZc~ZqV!t9p=PSAAwz~pMhR4<*I$3#MNAZ+5u>jAp)A^4Yk9UHfB*sr zAbART*CX0Z+&g<*5mva<8{&aqNcEhbKmY**5I_I{1Q0*~0R)m#K<7;8ulQcR4&Qdi zU7h(oysI>IO;W8^(0zmoXqkrAgG5Nsxi9JB9qyM{I(N4^Wu|jOC!Je8_J#lg2q1s} z0tlptK;^}wb>*`WX)~u!JtIY$OfwNc0D%M*NQS6~Rz0+P;favTi$=S*w7Nzol5~10 zIvu9d_sI?sKmY**5I_I{1Q0*~0R#|8CV|9=bW~MUH#G1&smV0(XbS=eAb3ggy!i^3&4vj~fCAAbQ7lfb>l*B{MVfMn`X+JXQA2q1s} z0tg_`$pS<@IvJGRA%Fk^2q1s}0tg_000IagfIt@t5b5Ybe2PXOwgSB-zo85Ma$SJf zs#6*Q2q1s}0tg_000Ibfp#V{jF2tv31Q0*~0R#|0009ILKmY**5a?t9A|0I!nmoI^ z^gqt%###XX{aG3)@t>KT2q1s}0tg_000IagfB*uWCXm%>dtyfjAb*_R+Iq2_Z8!Y4^=v-UP~3TUWPb%ho{y2Xws7 zoZ8ZHL-v3G0tg_000IagfB*srAdtEOXZ-A=t(LU_mA+Paq?&JCU0tU%nW#snFtQT_ z5I_I{1Q0*~0R#|0009ILhzkKC9dXeOR00765I_I{1Q0*~0R&P+;JEdOX3d%{TeciP>x(dp^wt5>hCuCCsD&;Hxo zZ6|Id($R^S>2WMpK#^zuthfxzU+ldU^eykp*b^RBt3L=h7OAhvGZ+Oua*#WE@@D>E}Q zv$M0Ssw#_%yXk=7kXGVH@kDfh)u^3f;)5eX;`_z+9Tz1)yHgDOYn$LUp-4!dAA3b%N_V(x_51)C~ z*=o@X&p+S2dk@7&cI~QAAjR4!-|2~Z_@*Nx0tg_000IagfB*srAbrD=_Z_Os8v`+olU=eapKidOXM-D~59jceDg z?bom0maSVZyzrtsZohrxsF6z+FZtey-&?$R$%6UwwHTzRs8HdL&6_tX($Uz|xO&y9 zjLZyedFP$CtE#HBG-I#5Mjmm*5y4=GYM7OkrJ65Vym;coiK_ooPd|0lRaX}l7V4$r zkDvL;#~&Yf&_NUS+i&jQ|K6`}Uw#M&K~`qg?AhlI88Xy&D~pPY3yX@hu;R!gk5s^7 z-THNtC-0w@o_^F(N1b@mNt-rqTCiY2w{G30Pd|3rF~@xR>8Dz_am@5%PC4b2kt0VA z8Z>Ck?sH+Z24sYS93w~d?%n(S_uij1>w71hFzdZ}?`mO4%Zlaa=l}GlKg-X{`_rFp z+OlP{&d^aD#3jhe&aSDgQ8fzk^Us+*`@shvC@(8-nK#;xiF!m^nEfMw00IagfB*sr zAbXGMvNGtH6u!{7>dqY*}7$` z&N|W4`uch;(@0ATX!%BYMY&=Y+Mbt}ugipFXJzYzm$bBWZPe*7t|%=P(PJ$YNlQ=D znJLPv#LZ9B()4)a#tpf7d3vCoXf4UuF=Hw!cFj2MxHsQ?LnqFZm6g5q=9?2IP6{+N zY5#rt^gZ#Ulb?O=8SOJ>H_l{<88rnVfB*uCEKpx?>6fepNaP-*?g$`&00Iag5Z?kh zIXS1Ca;hQ)3P$Muwbx!f=bYKQV-SAoou{Q1H{GPGmL7ZTj1NEj@T{}X-mqcAtFOM2 zo0B{D-MKHn^709@zBg*rsEr#p{_p?XqRVQWcKYe>&6}rH7%HrPzkW|HTmI&oZ%&&w zO-~078uZ`;_iF{mdFOrq?z`^N87``)QYtcX^UZ(Ng+IUP-Dl=2TAT5(=zW9oJ;6Qb+n*vcfRY^B3s@E@&O;P(VZrK-z7guKnTCs33jI zRwP3A+W73V&+0^#apT5m&+a9CCD#Kzbq`#{l+tZiLO7+~Ofs#}wp#2CSfB*srAb>zB2ox6=>v|pf>wn9}_UzHa1qxbj^!_*) zod{-8BtgqEvyaWAJgy;({Ap_TbatgOKfd+A_PIw%oIOsx2;;9t0n|Em6HE z^bu8Fc8&l72q1s}0tg_000IagfIz5#zV`Qx)lZk`M3d0sll?iDD^2zuj`#LGIQ!}I zSPKyEy+r*GKmY**5I_I{1Q0*~fy5Lb>XDfJMy(M*009ILKmY**5I_I{1Q0-=ErG;} zbe!{}aTl`|psjvn8v+O*fB*srAb)z^+5I_I{1Q0*~0R#|0Af^I+`}XOSOLcznRmm->u@<0PadD^g5LYej6h?M}00Iag zfB*srAb7%00IagfB*uq7O1YO>Xgt&!kpT|>W)|sG0H;#0R#|0009ILKmY**5I`V? z0-g26KVc#rF|?&91Q19Rfq~aAeS@_CiPBrt69EJeKmY**5I_I{i$LdG&4Q?h#hkPV zAbQ03^@#sIqJ{_{fB*srAbaAhukf9SNP0G&B_L7S<2q1s}0tg_000K!Mkf@71zWQqAFMs)qy1F{` z!TkC2UwHocB*Uq+i$;J zRaNEo`T6IcuUogyJywag-S&SUfBbQ~#VO_e_uu!uStq>w^2?ts`0PhNx~!z+n)>?s zb~BOy0R#|0009Ji3Os&n)fI`q7QkoY$rkSdak$9C6Io+p(_@c5I(qczAN}Yb8X6jE z>uU8kzeQhu+0fXy-+udT*|MdwvU10c9eeM+_sW$k3JMDM+G{T*TexsxPImUV@#8&} zK_UbYKmdW=0-9i_PoF+@>eMsOJmZ?*-=Jl6Yu2nDGGyq64I8x3W9QDDy?giGym|A! z`|g{Qle28uvWoKZv3u{GpPz5_%gf7qckWz;Esi|$NJT)7nKpIlvgMhXnQmE!CU(u_ zdg>PRxmA8{;fb~=jVo@!{P`tUUww5+>8x3^wr}5l!G#x&9W#30efItS`R51ISSv<) z1Q0*~0R#|00D%M&NYwQmBAzwtdmGkoc>T549QS9RefG(xpFIEkbGj{EvgF1a|F~)6 z#*()(ChN7aP zyu951{;&U1a6t<$YHMo#^FM$0+;h*q_Ufw-Km73f@4u%obX9fr_19hJBdnl(o_gA8 z4?XyR;urJg%_}J_{q&PhF8kr7Kf3I)^73*yr~<#f@=ArR*Q{A{{`udptFOD^_rJgT z>Z@+L>Biv6HS-rN$jHpR`qx*UdB*8qE?hWZzyM`@=%ELL3F5(%Iv{`m0x2!<^S|{S z!CHWn9s)ETfmjM8aMYuqpx~GP@-H{uc%zneh-{yI_8C8Je4jpjRX{*0f;UolAo9N=_j9V+Pp~<{^CW8R;*a=5>!_=pA?gq zpMU-Z7alcb$`wEV`G^rCR3EJk@lhYLAb;-K|s#+&~1r)0rpCJZJXo9zA;SVK?E1DHTQlfw&UT zDvY1~?B|zWddZD9-Q+5!2=dxBYmPeVD6IiG;)o+oKmCmL>(^=G^-*o*I{Tb+Zn@>= z4I4I&8#n&WJMT;j1Qst@JbJW#E?l=jR#vvQ?2dJ$H#Rm58aQa|*s<6C=C_*OU2$VZ zk5LV^A64mzC+2AFi590EcKG4C*LIhNdjt?jB!N?|JVwXvh_sp0r=F2W^`@=}Ab%?><>sSw|mz zv_2W@&yU5$#lQLOb-Iq-|J-s*Sy@>;G=VxGfB*ssC!kAs+a-ojdoEA6%jY73CE=rRB>n7x`P?p&cG_$f1A!)1Q9wlb`4umbc%2t4Gfs3Rnc1 zni}dG^l!?PDfi!hzpkRHP|M`W`!8Cw=!rRVbYhEEaJb4Sz;W!1847R=8#Zjrn6XMW zV8Fo3FaHT459h-@0tg_000Iagkn{rS*%?v4Z0DnMZkRIVsLV|Lv90-s44ePk{b2WB z=f3_OS$!bZMd@_Y-v--6-@ap~R&%s`N!f!Rqupb-!(bY{8r<$ux&*;o!IV5e009IL z2ocbar09gfkd1Cq)kghJ%HqX~&OP@$&D$4Wbm5IR{YlH~e9W|pKGfFM<>xm?Pg>q| zQBp-W6zS0Ks;CG>RaCStz@aUQVk>x|`^JWb{DJ~4*;9-|33QRv;2v}?%meq|f5#oS z*VfhPdZoIib^reTgRk-+$pu#Z&spPG3lObNE)A4KYuD@-0R#|00D(3Hswyjc^yuEk z3u$Ru!=R6=`WV>et1UO)cE?=_d}>R}2!?yya*Jzc$oAF=T5|9h0R#|0AhJMk79Biz zuzm$gPZff={y+Ysd-v|amx2!>?<(@Ex&)I;pf|JN`&sb8*D;yhu?|&0w~)OlY;wt^ zmtOpXA1GR)TrBSh@!=@~2q1s}0tg_G+ybGW4wJjJv0R#|0009ILh&O>my@*G=IZ_`45I_I{1Q0*~ z0R#|0009ILhz9{89r4f$)Bynm;$PsMVL!N#wE*$oPt*_r1Q0*~0R#|00D+bQL_Jz+ z@E8FE5I_I{1Q0*~0R#|0009INTYyMMV)q}lk5_@CUw-BHtObbI-l1LyAb#93;fHhUAIJW zEkIVH05;Uu*VNP`N^Pkp0tg_G*aGQkb@lZb(Vuk#fk1tIeR_IgYf*ay5I_I{1Q0*~ zfld+7N6=2$Pr^hxa&vRL6&H0%o7o8h2q1t!y8_*cm~z`iA^`#jAbeZ`1`|Pudii%B} zHihHavSrKj&p)qMUwrY!_uhLiTr%tS7hZTFLZRB5UahRG4B73q*IujZ_JwTZDFO%} zfB*srAb>zD1Ri_g^2b;U5Pj*=KuPoqp#%gF=sJNNJ9bu8R~Hr*6c!eF`&Zc16euez zi(Zuzb&-cqUVZgd{cOwe#~-i78Ee+8S+{Q8uwlcdOqufNqmLFB7jNCVb;gVt4lX-8 zTk#|P4uG;K;Be%TN2aHzzx(dHTF)_c>ePGgxo6q3WlEoymp6L!XzlZ*mtNBT4>{zJ zz4zYx@y8!;Y;4qiX3d(_G6<#OUVr^{ZJ9Z9=AuQ5REPEJ*B^T5p~~|2zyJNKuf9^$ zMWwv?=9{`-wQAMD2Om6c+_;ZF{#c=y!Gi}Mee}_)q}G(on>TOQu3Z~8Y*4LKhnHV| zdF05Emt1m*az(G#*)swNAP~0#FMY6f#=%2^)l)E7)1e~5k>|t@7H>Ux?>_G?+x zVVBkg_t}XLYU>-{{%q6q0|vFb&#Kyn4O=Sv^)4vR&sO41JF2T|8ioxh)-}268k*K_ zuISkb7RxU9on;J&-?DX&&3Ni zZrrH&!Yi-5vV8gSQ%^lLKR;hlkLlB=fBEH?3l}at=%9lRJM6Ht&pumgK@^@)phV}C z9CzGtmtK0Qww!+Y>4zVFxZ)#Ri>|G2`tLc5YZ?Q8dtq5cb;E)c+h6)<{pu~1 zx4*bdjk)QGMO(}3?tW#(`fXLKH}87jjjuMB)!y{vqR@8oJiY{OIq=^%vKAn|`h?mb zfB*sr#Dze>6!LIY&d7*jXd+S9cZfz&3@z)>nhrhQci(+=L5#6u$0~xLRT5*yjM37G zx88cIsp*?f$x5uiM7P~H#U1Xt>n=qczVn^$X!VC~If^f3XUkfvHh%r>P_*T;%Pv!{z4qGcqmMq)!jK_DhOAtyp(<(7o5DySQ0D)8!sB3JRGk49# z?bR1fANl%%P46z53gQcCWK&3Z%XL*~V>^^`{*^^pUq$<>zHpR@L|Ik+*WwuBrR=>)*5B(RWr= z);6B`one(V4eu@5va_afWZ!~g4;=LBC+ioj-!*Y)x9?6IF!zhiE4Ngw*;q02;K2pC znR6F!%gM|*>!{&R%w3(8k>0<1?qT~jUxKNjv1!4|9l2Q4lGW!0YG~ZKmY**5I`Vl1oS0ZD+ctP zw|n>Q`nnyfPhapsw4KK=C5+JhdeKia&ch5{T~MWW?8 zTEwBKN6VI~R$3vlWXTd$M%z^ZRqVOvp1bhE3-{lD|3@BqM5RCR#1jgCw9MrmE3x7r zT1e7np{>)i1px#Qh^2r+w^{_Jkgm@7YhA9E-G$7Dt-19}(K z)HP*iWoY%pFYcV*zgND(9C~T_mZ~We`tQ}hFh4uvqGLxt^WOU0?98*Lj5u%VUax+- zK?_3)ax#B({OE;inq%3MNB928tg#=hDzC00H`y?YmC zeYAMX@(q=fM)f*)e7|SkTl@0I>l>Q_8+O#xH#F_4Zn*5Y(M5TgTD38HP`A^M8h+E$ zOFvz-+L!}SymG{-gir(Ft zThzTMXG?kAw(>f~O7wIlFKOwAq7^Dvp%9(AqN{IQb=6f`WAdBd{HAyB-pZwGe5e$? zq%=BpMFA0Aofi0WBPu^d~Jg#ZG{B%s**Z-4vS0}ePq z6X_rS_(!dS8!%u%%LZyn)XdhaSFe^ELmuC9%Ps%*Z~qpuG32Qt7dkhkFfX&dp;0jf zUByZXbl=z*$jD0TTipDY0R;uNm({qdU98(ywa?(9PnK>ya7=U2#rawPcJkQA-(6E( z+qnOzUKyIE)6=w1z1u0apnX=>)Iat9I;E_vY1B(fug68X88!8dx(LXQs)mg_Yc+K@ z1_Cd3t9!n-b3*_D1Q0*~0R$3GK!54ir7g3vvh)pFpT_j9yv;wG zMXz0n8tKr7XQbh9tdNTCwPwVHA(TK77A+ES$#fcvd*HU{v>NwR_xf(2R~0C6TT~5K z6Ft>e0^J9{D(IXVJ#|Y?Tw?AKKp<5G7GLqark4?EGpA2IBOVQOO=VrBNEcvMRvBG#e{+{KFsqP_g{|_S>&dpFR&f@W4?= z9i@{Eb*-h@vu8JlB0Su(vNAU8tWjJeCp%;Dy7JKji{`J{wRC;O%O7t%f7)JeF4#C} zWUu+lw;!|rp!?taN+*W6T@L7#fBCGj>$X<4E+IWF{j(L@Cy(f^3xmA3WP8g5WtH`7 zwpO2d#Lxw6nir&0)HDw0o;I*YPJT{iVQ%J{&AX~<8ul94Eto}D@zCS?-Iul2gZZn= z#}2D_ck%YiXN}PXN-sEOWNvnIg7V6`d5aX0>HX9P8~XJweB-mtCmb^P#6t$odHbuq z1{7(b$JB`f{`1j=eR~$nUAX1=g9g<%Ha+(CR|k*n{psq8mRD~LmdgVK5I_I{1Q0+V z{slhyaP?H|YUCQKKF$TON#exQ)>}B_tSUX<2&Y$G`g3 zuOcVlRRj<~ARz>F*`x1&|NE}0id-nhp(wBx$7zdBb(uVQvSvtKBT0+t^s`g9-+uez z#f$ZmSXz0fD=TSQ)`@->TyTL_z@2;Uxsls@!O_iEW$Ip(yU*|*{d(pfIj)bEdCWXy z$kH{lSs>7Okk$7M<0n zz=+QIYgv6Sq3LnMb>WM&U;ts#=-zG*2aW636bSSv$eK9n>n%FPL@!Mk-u!zhBL;jO z+;EA5_oD}Q*W+Hr%~#3LZS;`lr;|qa+5N2fP8ZzJ{fOPGH%1QndJTupq$#VafApQz zS(#}^9yLNg5xd{WuL~VLskUv~=FSV$*?wBv7;;@{ z?|@oeapuupCr|IYZJkn=5xHc>H>W?gP7tz%*hB~jPZ2->0R#|0009Z;dwTE>UBL&j zk!e1yI1z8f#l`xAp?(Ke-}!a5&_#Pm6>wsmtj1nf9IWd!lhIP>qCFY ztB*hac*qv_RDU>C)3iL?J$>n=m-Im2CG{ZY93upI#ex?DiP4qcI1)32@#tqU~kGDq5S(M1>OH&}EIpDx6#D;nvl zrV7X^RH`XjS3}Zei>6JRrj;OiRaa+L6Ry4XTAjtISG&A9Q~&`45I_I{1Q0+Vssj40 zk?(!)dncWAlKwn)`Q?{idg-MxyMl+>m8k1G^vfy=d}zJ2u6$QrU9GdlwOT=2X3m_c ztK(^5f0o7sy{jEG;@Vf z-h1yo-RqOOwrD3OpM0|Zn5o!GZf@?Wr=A)d2MQBB_0&_^=b?ulssM!kT&Z7%Iq<*( zwQA$xhac8wdKIeWC;E+A?Mk)M_4{-=KW)(>6rJb(<(FUTr(G07Q5-?_*HR1p{Zn5C z^s6!|LcboPK!bL!F`=KS)sTS`U5AP@NUBIsW+LwSO0jIqtaQTyR8x zQ(d)cl~$MNr+D>~xEf6QUZLONeel5t6}eCybRNA*QH!*4L=}GQvB$JS)k<~PuwjF) zyXwxtSG&}9{cw#grmNz#9}Q6bxQ+H885I}225XRo2M8dL+ya`if){{xE!7OBTd>ud z2K87!Jk|0l%v$jgOrSYXx8PGAAb&FBXBhaF2eXG~k`?ueITi4yw z&(|vAaL_>qEnmJ|E3Wk$vI?Bn_8pV!iE zg=rMj(5tGaf)OfFK?)c0P%iz5!TIN(uds`De#8++=zJFUb1}MCD>PhQc;N;8DuODY z7O6ycqKzIaN}}xg;YfYuc>VR)6~EA5Ulmc)V^v;Zi!;tRLp4!M#5F{*8!a1A9o%^< z3Lz=HqF-0I;)*M@Pi53H6V>y{C!bU_PK!Yli&3;ls%ne&Nz}tJa*qH4Ap%;&5weA+ z2q1s}0tg_000Jo`(C*dhqpcA(>JjaNJ9q!?VtD%7qrREz8@Pf=W5$ee8x>4aj6e&j zbyN62@e8d`aHZ?ZzixU}iS^xH3n=tWUN5=ry4T*cE<=B@R8T_!kzk$mlF}xb+b_6U5n1m@q*_D6t|A+URmAUZAobdg!5H!-lCEN~x758#iv$au0w)gw0u$xZ$v9f5q8N%+Shz5aD^&NYk1pq-f_B%gxq4ct zqSk4PR)VNprO`<=x?Z5xedw_+v#RAJI!i?xb;gS7tc_Zr;X)fKS1VJr{6zK9G8XMq z%RO}Zz0xRB^U5o)XgP_hp%}`&_ui|Gs*je3D48BBuO927r>ydj1~&u{KmY**5I_I{ z1Q0+VWd+jH{au|cbY(y%0;XqYjPJzVwYjTD=iD%5%2An_3J5eWb7=l=_XGExS@*hW zy?{=v(9M0*ZoQwfvhwcTzy6KD*009l76nH>_}~LwrLU{%rgKkpjS^ksLlqFOA{u9% zbyinZhH?==009ILKmY**5J+-?#=GzP8EXMz*~z7Wl2{f;S>6S7PKAD%rCV{a_bmD= zzy9E^Yf*$`(XQNS7$MvBRM)iB3WwnOht>&#TW-7KuEbvC5o}2uKG3>~E{uB!L_s7M z_t0Ynmxz1B;UJ+(2q1s}0tg_000IagfIy-PC^k`B8|ha-TQ@K_H?MV=qjfUhTZnY{ zrXwQ)2q1s}0tg_000KS)uB*QDe%1o`fFlb62qc6+Zf=hL#ZOiJoof?6^`|BXAbq45dsJxfB*srAdnIQImb=>K5GF|qN`~n z0tg_0z#akpa>nkTKHc-Y1OF$?SuMrIMb*1+9cV0B5kLR|1Q0*~0R#|0009ILKp-9k z^fRPIMTMPGvxJFssI^hOkV&U#vJ(UlKmY**x?148%lG*OYXQ2t7bqVA1Q0*~0R-Yj zAYsmGi5D>HfdB#sAbEN=0iwBbffLI42-5I_I{1Q0*~0R#|0plb!zu3cUN&KdxpiKva65-Ka-tpd=~5cNpq-ly#dAb2DaZ}yLy zSPS4+k9-IqfB*vVC_vOB9(#p4A%Fk^2q1s}0tg_000IagfPg;%A|3wR$b|p`2q1s} z0#mO3_fJ_1(1qimG*HrorBgHl2q1s}0*NC)=p%9Zikc#T00IagfB*srAbJsq8^=R z$(|5E009ILKmY**5I_I{1Q0-=s|AR3baf9_r`lS8Xj!t~t`i{Y(RKEei~s@%Ab!;3lRE<_a35t2q1s} z0tg_000IagfB*srAmCkqNQZYTQX+r=0tg_0Ko)3QgtbfK>z^+ z5I_I{1pEsS_3&>;P6QA@009ILKmY**5I_I{1Q3Wf0U{mo)+5vh0R&0R#|0009ILKmdW*2@v&&oi!yPfB*srAbc zuQTVBvlbwJy0kP<5mV%P>8rA}MfFcP32q1s}0tg_000IagfB*tf6CmmlHClFz00Iag zfB*srAb$YwM}l@7)kXjT1Q0*~0R#|0009ILKmdU@1c-FBfx;#P z5I_I{1iT20zUluSWi5agDbgT-00IagfB*trBtX=oi{L310R#|0009ILKmY**5I_I{ z1fn27q$3Kb>=FS45NJ!_pU0d~!CHW}WV(7=X`rO5t3de(Ab($is^WAbVF=0HZSO zL;wK<5I_I{1Q0*~0R#~6Yyq+!o<0AJ9svXpKmY**5I_I{1Q0*~0oN9oKB#|VN9zKR z^>FREC3*x9KmY**5I_I{1Q0*~0R#|eD?p~Btp?i&AbfHHL2q1s}0tg_000IagfB*vBBtWL4o8ajd0R#|0 z009ILKmY**oLeCDhNuW?0i1h|hz0%SeR5^(|o2q1s}0tg_000IagfB*srxQqaq z4wsoK0!07;1Q0*~0R#|mW`Vqj=VGY^aON2zHUtpxNCC1Q9y#p{8UX|lKmY**5I_I{ z1Q0*~0XG#O)8VEQ%dikY009ILK)|^Lt_%;zq!z%r=ZNSKKmY**+(3Y=hZ{^HLqGrl z1Q0*~0R#|0009ILKmdWO0%SV)Q9u9z1Q0;L1q7ZMH2g(s0i1iHlJ!Z>9U##mfB*sr zAmFhAq&_@$>KQl!2q1s}0tg_000IagfB*t+C_tve4JVZ$A%K8K3#ccaeTZ5BkNy#0 z@CYD)00IagfB*um0%Sc}DcC>&0R#|0009ILKmY**5I_I{mlq(@;qp_+01)Vuz^V9S zi>L+Y6d@NQfB*srAbEfSCz!hQrDFBxeYN7!W`J0R#|0009ILKmY**5a{xU06KVl$)#Ew@ObC$mFoDA%1Q0*~ z0R#|0009ILKmY**5O6U8G94~9VT6kS0tg_000IagfIwYAVidIi{2U;F00I^WkoB+t ziBk|j009ILKmY**5I_I{1Q0;LMFhxnxX45iCISc`fB*srAYiM&k9)8G8?^wo>N)zl zWPOsOyQDt^5J14~1xS6k{S-4m1Q0*~0R#|0009ILKmY**JV<~{hX+kILqz}q1Q0;L zj6nW{=?AF=FoVQl1Q0*~0R#|mApx=;E;Lz$iU0x#Ab!J0?S~_!)}x`ga86&1SVAW3Z@po3=)SCKmY**5I_I{1Q0;Ljsj#o?1)KI2q1s} z0tg_000IagfB*srAkfVMWIDQe0_eU&fry*#Sx7BFhdj=BAX%T}jA0QI0tg_000Iag zfB*src(?$m4-fwVVE70ifB*srAb~0R#|0009ILKmY**5I_I{1YA(S(oBa|rw5T@9!5I_I{ z1Q0*~0R#|Gs9&f$LM;G42p%KgZFZz8m14@Yxc^+UYVhDe{(gSdH8rWJ-!57BY*|@_ zp6rKNK2AUY0R#|0009ILKmY**5I_I{2MU;}?~q)^Pad21?(Qv#i3vS=gf(e3ef##l z<(6sRq#nHE&UgpLNmmFUfB*srAb;-`sdd@6&@ZcgM9IY-=%zdUaeB>dgs{g-3Me(R8+qW8=i6X z@e@A+2q1s}0tg_0fPDmXenl@(3t%5hT0sB-1Q4*7fT^s9R#8222wS3nX~)d{RcldJ*A( zeUghtPS^+_fB*srAb=ihZ(M*5`(7XLgqr>raT z9$Kx=IhlwG0R#|0009ILKmY**5I_I{1iD2)ZaZmC7s#VjEPI*HbQs#X@XeJK%hyZI zhs7;h)_MYMAbhVBQPMKzP?_g(Ma;f>L$1V0R#|0009IL zKmY**5I_I{1l&tNrBeC$`uO|#$%cg^vo6zNVWYO4Cdm%9TJ7!at*32~Sp9U*`K0tg_000IagfB*srAb-%5C|ZE00IagfB*srAb-CAk^+-_PK5CZlW&}9_-YE1Ozu;3UA z6CX}g-=WoN1HFg+F!s+11?3&~|IwgD1Q0*~0R#|0009ILKmY**Tv0%;f2_1DPaf`S z;ge3BWf2c4?$GLVKI#zC9Ip6dN6ZKyfB*srAb@~F1@1X8_6oHC4kf2E1Q0;LNd)A{ zv}*5Qoh*c5*~?k79?j8O9JFOa<17RaKmY**5I_I{1Q0*~0R#|m2LUOSusmttOqmXM zz-J5yAbbrl$JM|J$>1(?PY0N2$2#tP?i^2q1s} z0tg_000IagfB*vSDqud-F=lM^maVVE#tv&Gm^Ll(!3XcV_nx2S=T*1vWCH;N5b!(! z?a#e^s0Hx6d1u53Abn@SLHGTB~SzqKmY**5I_I{1Q0*~0R#~600A?Zj-+2dI(+yLad>|1hSb#b zy?g(Va^%F*tJlh&#K{ROA7AV+qQ=I?=BLlJdwu-z$42)T6&0O3cdp&(>_DI!1^!dB zbTYL7-8cbsjQ|1&Abswx4-oCpTGiK;?y7v3?^YafKI@EqYdk{bX0R#|0009ILKmY** z5J13<1x&BsQ4<~>W*B^Ma8PM!Swh0x^787>KmU_qXX{Z10QKwF&(MqHHNN`ltIW*I z;lqcI962&DFfb)0rMkL$`t<2OK0Zf|9I2?NNJvO9oGeu#hYufaXlRh5!NI`}h|_*u zO!iKWqZYt^p0tDj0tg_000IagfB*srAmDKVrs_Ksionvcf0b0^k53Am}#wE(8F9%_~UXP+Kz z4MeIcMvocVw!Y(&!$(?=I&4F!RMywmzxUpIa+8Zjqmh0G4jedY)F{b-96fsU^5x5? zPoG}6aG_SKl|xbtlAWEsZr!@d%1VbtXhTQI`Xn2!;t~W9KmY**5I_I{1Q0*~0R#{* zCSWSvA?L4Ow=pd(({N!%`o*9AbX9&{f#L13V<&$9>ULvocF8`e(l~qe?5R_yWI@tR zn>H<2ut08PG4zz4p8n~lpGv96?Af#H>gwX+;^bsm^h1tH3CN;Fi=@ayk{(?W7L6i+ z00IagfB*srAbpT_&JZt71(z{)5p2-hBIihYT4gH;dHO z)dvLlOPR%~Q)lm*_h^2eMUST4xqHKuDU-dtRPvH*o4>Ve$hLGXU*#n?tjOXU@(KwF zF&fWDAAMwaFpI3?aplStX+iQDv9Ym|2Qjo@Sj6MZnKLCNC9+?R=H%o^{fC?o6ciL6 zAMfSmWwd2>B7gt_2q1s}0tg_000IagfPga#$kLqw0Rd{Y+H8=oZ{A`)(;=;BbdA6L z?GrcMG%h40xVWg~@ZqEDU-*++WjrO(zE`_sI@&kO9t03T009ILKmY**5J13cfp53` za4NL`R@_wmfdd z^jJ8G00IagfB*srbhp5g#cv&?7NEOl!H)eW>yzx*8ciX900IbfkARs+({@i#^ojri z2q1s}0tg_000IagfB*sr*d#!v!zMN^LI42-5I~@_0!QYbD5Mskvx;1g00IagfB*sr zm=qxEVUmY~2q1s}0tg_000IagfB*srAmCC0WI9}Gx(F5l1Uy%u_Vn(zs0Hxc`Df$^ zAb%EQB{1#q|NPu3^7+mIL!0tg_000IagfB*sx5YRL=<>chl)YR(rdTYD$X?a(%Ad0(4%T77#!H0R#|0009IL zKmY**oKK)pqjA2VI*drFQQ9BVXpHP^f12~}X)-oC8^X3O>tRC&T!H`s2q1s}0tg_0 z00IagfPk9_%=l~68fpPtX)?`ZJ#;$#yt@+i9e8EywzcsS25NM=TW5`Vd)IH@-nn7Q zwCioSHOQ50h!p_@5I_I{1Q0*~0R#|0009JCO~B0h9lv_+fi-J>A?t<6xNf^`#;fzPdxF=mcM@JYC|So1Q0*~0R#|0009ILK)@ja^9zG-rxw5=)O3PC z2Lh(*J2bk&6)PSzq&(#Eu<+2w9$#)qdC1#<0RKlGS<*qX>_z|q1Q0*~0R#|0009IL zK)|&HDl02P|!&T`Ne<#{(U=kY?pjQ zYg1KKmHYSYGvoy1YszPzwatXIo@U#|7hfFTv3+|=%4f17MO|H;7ErlyY@H>RmcyKCpcfddDO z9v%1Olg}<+zGT9L8>PS0)HK_A+C@C)P(W8fy6Qrl7Hy0JOG+rzZWGyLa(l*(v4nm?md*j7u<7izkdCs@rxHPhDs$wNJv^*T4ZFT zJTO<1DRM(d-@cLZc-hR%OzA5oCPsFamzT>|aXWkF%joE+kt5@5Hnb{WQ<)C6Dj+_7 z>EeY``$k5rcy!T~D_3^z+&_2jtbKd`zIV?@=gxk6@Pm`;e>X(xdKmY**5I_I{ z1Z);q8P{tvwE#BraUlW-AYi$GBnx)$-Ytoa($X@O%IomQAN%^ruk?Kr6B8|Or0toK z;}|zCJ}@Zg{5RiBN=!U(;DE2MkGHp4>LyA{OaJovrrEP^zm#=pV#36>S9NAvuh2_k z;+=Qi&d<+}>>JsuSFiII&P$GE;>3wIq&y@NxmD)$>C-Zh8*Uim>+8E~*G?Hxb#+y6 zaPYQmZ`^w8%-y@+ec*wmhYo!tnUT8My3CA>xKX2C-?Z_Dv111h9xN#yU*G1XK^^ll zmGzJa)GAHZrL33#drhA{5yi!W?!WKRz5BM_amTIc=@;*qy;QBbdXI}^Vx<=Z5I_I{ z1Q0*~0R#|0009KLTA-<^>2mfZFK=%{F+y=ku@p6Ud&{k7HolG?JrX-2R;Sm0e(Y%c z`0?L-{m)gao~o^@yOfnB|AIWz(rno}}XeQGkXPh{mwtV@@&6{6~i0JXo&cDbir5PDn z^X_~o>tcy*KwO0Y0tg_000NE`2v_`iA+-RGHK#WO5I_I{Hxcmn_kU!?qcWHiC%!m) z_UxQFbEUXLe$}^aczL7%a<>QhK5yCR?5vFN|iDoAfTYIKr$31 z#diL6+mM^+-KURKkw|&Pz4!h|syu8PLd#WpDRq%dkgNbAuglrlBSyq#W@bozM_qlL zRK&=wE|VrD_UzfSu&_{u7BetLavUmE^PM`9Gt%pHvNJF+uoD4TajE&6QuKPohwqg5WyBA2;(b3KM4oURHkDu_# z;lmd6W1mx$YE`U-EzO-j;n`=O`q@u^dHUof3okL8wsZG}DN`nUc?qvdrn&iB%Z6;r z3G!85GWf=pm;3-()i@_3fB*sr*jr$4&l~Qg7Qo)Bw1)r!2q1s}0xlqMG3%1tg<&*M zS%5PuD=R*JTyU`QUs}~_xn0A@=(Sz6Q&tNN3k|)d@toYeii(QXo$~AUTW`H7dt|{5 z`A;Dw3rdBgJRVv8h?Howo@UsPgh)$r=bGI{-!}g`-_qQ_j>=s*DW841c*z4&Lh`S@ zwr)w5ASOD>=+!bDNjwR-(W7m5zP@>j6{R@)_k6Ky*DN0|;}hJrUA7TG009ILKmY** z5I_I{1Q2j_0V!B;+9P#=%ZG*Pjj?A!GdigcX>$B%5Ae|+a=9m zK>(JXVnwDyZe3BULb!p&Qd-VKz*7WXSo`LmsReM~*-q9cx$oc@83G6(fB*srAYiqC zq!FyX#tANv(i6v2pGbj-#Wf<1b1}b&hvQK zI_JmL)(8aNpPfN1fHh*AivR)$AbHM+C?Y0ke#9&=)sAnntNT|&90k#(0I{vT=qu0i1~0tg_0 z00IagfB*srAb>!Z3G|AHu-7l!T^8fjhUI}O@|@iEz4Yi2?pnE<_Cql22@ebF=#W+W ztysF$s&+XU0R#|0009ILKmY**5I_I{=NItz_ZvE7aD78V^J81Bd?{7(pWz{`R$ghz z>6ybGn%zMyfKut}<0FrqZQqP6P%6WzlP9#;FdU^)r83fH`(C#s}I4B{?2<>iya3^QwSh{00Iag zfB*srAb^0I3takc+tLnd0o;7#9yGjUeUb-_)}BKp^@l&8I5DhYU&l$%gR$!<1es!$W*y;%AP! zeMQ!Z_mBMkX_d;yE^(M`q`tmh)70eUWjqJO2q1s}0tj@Oz#r=RURw)LS6Aon z@84xT(l7!DAb4X z9_#l*ma(h-1BXpr5Y(&x`)d|ECh<{MS05M@)NSN+i~s@%Ab zJ)#a!k7uO!UhfY;CW!^2q1s}0tg_000IagfB*srAmBs-9cDVTy1K}?Nrp%(^3q}^ z%r8nmC2y4qWyGMd(c|tIlDO#dmj`|P17mKQ=|lq}6a)}(Q-Qa?-cU*{fSXP(!$JT7 z1Q0*~0R#|0po;`L%zEe)Ss{I5q*r+;O3ptI_ZdD>Q(Mv0Sl1j!OKnMD&wiEp8M4_U z=KAKHybwSD0R#|0009ILKmY**5I_Kd?iT1U(;ea9K;+bL7mh~DkwxPP>{0D#RGh$M~x1U$$r8U-644J%0k|342Syq`T zTaqSizgl%UCnJCW0tg_000IagfB*srAbA*bIcqZYvFriFkIKmY**5I_I{ z1Q0*~0R#}}lt9OKwJ4PrKH9Ep(ijRc44o*Is^)BmQq{cCe1D6gJSQ#l(}Si%X!BHA zd!{^8s;j}vM%y4w2g6YW5I_I{1Q2k%K=a3kmI6;h*RB7E%iD&AhEu0b>FxC7ImZu; z9uYtQ0R#|m2Z5)Dcn@^XT7ZtT9tuUy$FH^6=iH&uXbe}^)zz(EzmC+0#g?3i00IagfB*t!1WctnR4VTiufKHu?^|@* zruNOqlBS>i@u||Z@7frZ6+`D)0@4ox)(4j+D zu3Wj8nVHrSm83-EtyRr(G6D!7fB*srbcMi(*jSxbn~{+&jUPL9Y{jELmVc(@AMV`T zT*D^>$#)z{Ns&Kfe0AK|Vir?2}JEsjaQ;ig;)f0R#|0z*YhO9p9C^XDxuO zB3$R>0;aMahR~01TzBZ@N3y>>R9%!S52e*M)|X{}`_21*-SZ!Fb5H)mvf*95qor+y zN9+AAHfKY={`%|X4?n!@!DR!YqEb^+-+BA(QE_p|8;UuP>^L2 zauxyzAb!oAKdc5}9Ym)W& zEG0!!A#c6)W!(banwokcb;XR@OzGPB&-HoXE(2 zvu4kZj*f2q@X%$U(J%rCAb z-+!O`kdHN5tyVth7>%c{zTU^jr}dDW9MQAqph1HM3>e^}_K}Z4g9Z&%U`yh&jtbrAbM^g*n z?z7DJ5J14$1sWO}{rrsoV(!S$<+FsJpP$hl;f^UJg6q-rC!?XIra zes}N7)22-^WIGHg5BX~7s5R>$pM+#c61vp58jYc}tlYxIIHb)3`}h0#``vu=45Ll4 z69EJeKmY**x>`V18x05u=;~f*9{~gqKmY**>>^NEStYlecKhSfYHMo3!a|LXsG_1m zK3ZJ!Hx;92zP@>j`Sm-DUTM|Nma2~CDh@*_M{7Yx>xQ(}cH64P+n+3RbL-5RmSlR` zU&|f@5I_I{1Q2i?fgjDU|3;zc+naR(TxZTY7pZc1pVa)$HNn*gAbF? Date: Tue, 15 Nov 2022 13:43:55 -0500 Subject: [PATCH 02/14] Refactor azure basics --- .../examples/basic/azure_basics.md | 213 +++--------------- 1 file changed, 31 insertions(+), 182 deletions(-) diff --git a/content/trial_getting_started/examples/basic/azure_basics.md b/content/trial_getting_started/examples/basic/azure_basics.md index e0908ee37..c2aa9c0a1 100644 --- a/content/trial_getting_started/examples/basic/azure_basics.md +++ b/content/trial_getting_started/examples/basic/azure_basics.md @@ -21,231 +21,80 @@ In this example we will deploy only the infrastructure. Later, in the more advanced examples (multi cloud examples) we will leverage this setup as the basis for deploying a generic application server and an application. +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) + ## Prerequisites This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} - -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. - - +## Deployment Steps ### Create Secrets -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -{{< param cloud >}} credentials can be created by following the guide [here]({{< relref "working_with/official_plugins/Infrastructure/azure.md" >}}). +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: +Create the following secrets in the {{< param cfy_manager_name >}}: -* azure_subscription_id -* azure_tenant_id -* azure_client_id -* azure_client_secret - -**Notes** - -* `azure_subscription_id` - the account subscription ID. -* `azure_tenant_id` - the Service Principal `tenant`. -* `azure_client_id` - the Service Principal `appId`. -* `azure_client_secret` - the Service Principal `password`. +| Secret Name | Description | +| ----------------------- | -------------------------------- | +| `azure_subscription_id` | The account subscription ID | +| `azure_tenant_id` | The service principal tenant | +| `azure_client_id` | The service principal `appId` | +| `azure_client_secret` | The service principal `password` | ![Required secrets for this example]( /images/trial_getting_started/azure_basic/create_secrets.png ) ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities * {{< param cloud >}} - - - ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -The flow required to setup a service consists of: - -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -Let's run these one by one. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-VM-Setup blueprint. +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/virtual-machine.zip` +* **Blueprint name**: virtual-machine (or any name of your choosing) +* **Blueprint YAML file**: azure.yaml +### Deploy and Install +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. -### Deploy & Install - -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs (such as the {{< param cloud >}} region), and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) ![Create a Deployment]( /images/trial_getting_started/azure_basic/deploy.png) -You will be directed to the **Deployment** page and will be able to track the progress of the execution. - -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To login to your new {{< param cloud >}} instance, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your {{< param cloud >}} instance public IP, SSH username, and SSH private key. - -![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) - -### Teardown +This example deployed a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs along with a new network and other resources. You can validate this deployment by: -To remove the deployment and destroy the orchestrated infrastructure resources, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - -____ - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). -{{< param cloud >}} credentials can be created by following the guide [here]({{< relref "working_with/official_plugins/Infrastructure/azure.md" >}}). +You can log in to the newly deployed {{< param cloud >}} instance by obtaining the public IP, SSH username, and SSH private key ouputs and capabilities. -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create azure_client_id --secret-string -cfy secrets create azure_tenant_id --secret-string -cfy secrets create azure_subscription_id --secret-string -cfy secrets create azure_client_secret --secret-string -``` - -**Notes** - -* `azure_subscription_id` - the account subscription ID. -* `azure_tenant_id` - the Service Principal `tenant`. -* `azure_client_id` - the Service Principal `appId`. -* `azure_client_secret` - the Service Principal `password`. - - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param basic_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -```bash -Listing nodes for deployment {{< param deployment_name >}}... - -Nodes: -+------------------------+-----------------------+-----------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+------------------------+-----------------------+-----------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| subnet | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.Subnet | tenant | default_tenant | 1 | 1 | admin | -| availability_set | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.compute.AvailabilitySet | tenant | default_tenant | 1 | 1 | admin | -| network | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.VirtualNetwork | tenant | default_tenant | 1 | 1 | admin | -| resource_group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.ResourceGroup | tenant | default_tenant | 1 | 1 | admin | -| nic | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.NetworkInterfaceCard | tenant | default_tenant | 1 | 1 | admin | -| vm | {{< param deployment_name >}} | {{< param deployment_name >}} | vm | cloudify.azure.nodes.compute.VirtualMachine | tenant | default_tenant | 1 | 1 | admin | -| ip_config | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.IPConfiguration | tenant | default_tenant | 1 | 1 | admin | -| ip | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.PublicIPAddress | tenant | default_tenant | 1 | 1 | admin | -| storage_account | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.storage.StorageAccount | tenant | default_tenant | 1 | 1 | admin | -| network_security_group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.NetworkSecurityGroup | tenant | default_tenant | 1 | 1 | admin | -+------------------------+-----------------------+-----------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ - -Showing 10 of 10 nodes - -``` - -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![azure_simple_vm_topology.png]( /images/trial_getting_started/azure_infra_deployment_topology.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param blueprint_name >}}]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From a5d9d8a1a2826985a02a2d1e08d00db4977ffbcb Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 17 Nov 2022 12:15:08 -0500 Subject: [PATCH 03/14] Deduplicate GCP basic example --- .../examples/basic/gcp_basics.md | 184 +++--------------- 1 file changed, 29 insertions(+), 155 deletions(-) diff --git a/content/trial_getting_started/examples/basic/gcp_basics.md b/content/trial_getting_started/examples/basic/gcp_basics.md index 16982a07c..f9e12d78f 100644 --- a/content/trial_getting_started/examples/basic/gcp_basics.md +++ b/content/trial_getting_started/examples/basic/gcp_basics.md @@ -23,205 +23,79 @@ In this example we will deploy only the infrastructure. Later, in the more advanced examples (multi cloud examples) we will leverage this setup as the basis for deploying a generic application server and an application. +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) + ## Prerequisites This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} +## Deployment Steps -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. +### Create Secrets +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -### Create Secrets +Create the following secrets in the {{< param cfy_manager_name >}}: -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +| Secret Name | Description | +| ----------------- | -------------------------------------------- | +| `gcp_credentials` | JSON containing credential for accessing GCP | {{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: - -* gcp_credentials - ![Required secrets for this example]( /images/trial_getting_started/gcp_basic/create_secrets.png ) ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities * {{< param cloud >}} - - - ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -The flow required to setup a service consists of: +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -Let's run these one by one. +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/virtual-machine.zip` +* **Blueprint name**: virtual-machine (or any name of your choosing) +* **Blueprint YAML file**: gcp.yaml -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-VM-Setup blueprint. +### Deploy and Install -### Deploy & Install +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs (such as the {{< param cloud >}} region), and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) ![Create a Deployment]( /images/trial_getting_started/gcp_basic/deploy.png ) -You will be directed to the **Deployment** page and will be able to track the progress of the execution. - -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. +This example deployed a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs along with a new network and other resources. You can validate this deployment by: -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To login to your new {{< param cloud >}} instance, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your {{< param cloud >}} instance public IP, SSH username, and SSH private key. - -![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) - -### Teardown - -To remove the deployment and destroy the orchestrated infrastructure resources, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_cli_link>}}). +You can log in to the newly deployed {{< param cloud >}} instance by obtaining the public IP, SSH username, and SSH private key ouputs and capabilities. -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create gcp_credentials --secret-file ./path/to/service_account_json_file - -``` - -`gcp_credentials`: A GCP service account key in JSON format. **Hint: We create this secret from a file.** - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param basic_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -```bash -Listing nodes for deployment {{< param deployment_name >}}... - -Nodes: -+----------+---------------------+---------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+----------+---------------------+---------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| firewall | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.gcp.nodes.FirewallRule | tenant | default_tenant | 1 | 1 | admin | -| subnet | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.gcp.nodes.SubNetwork | tenant | default_tenant | 1 | 1 | admin | -| network | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.gcp.nodes.Network | tenant | default_tenant | 1 | 1 | admin | -| vm | {{< param deployment_name >}} | {{< param deployment_name >}} | vm | cloudify.gcp.nodes.Instance | tenant | default_tenant | 1 | 1 | admin | -+----------+---------------------+---------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ - -Showing 4 of 4 nodes - -``` -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![gcp_simple_vm_topology.png]( /images/trial_getting_started/gcp_simple_vm_topology.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param blueprint_name >}}]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From 7517de71d0f0be7f65a73943f435dc456d59c0d0 Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 17 Nov 2022 12:29:32 -0500 Subject: [PATCH 04/14] Deduplicate Openstack basic example --- .../examples/basic/openstack_basics.md | 247 +++--------------- 1 file changed, 38 insertions(+), 209 deletions(-) diff --git a/content/trial_getting_started/examples/basic/openstack_basics.md b/content/trial_getting_started/examples/basic/openstack_basics.md index dbf0f72f2..312d66c00 100644 --- a/content/trial_getting_started/examples/basic/openstack_basics.md +++ b/content/trial_getting_started/examples/basic/openstack_basics.md @@ -23,6 +23,8 @@ In this example we will deploy only the infrastructure. Later, in the more advanced examples (multi cloud examples) we will leverage this setup as the basis for deploying a generic application server and an application. +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) + ## Prerequisites This example expects the following prerequisites: @@ -30,252 +32,79 @@ This example expects the following prerequisites: * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. * An available **CentOS 7** cloud image in OpenStack (Glance) -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} +## Deployment Steps -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. +### Create Secrets +Credentials and access information are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -### Create Secrets +Create the following secrets in the {{< param cfy_manager_name >}}: -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). - -{{< param cloud >}} credentials can be downloaded by following the guide [here]({{< param cloud_auth_ui_link>}}). - -To store the access keys as secrets in the Cloudify manager, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: - -```bash -* openstack_username -* openstack_password -* openstack_tenant_name -* openstack_auth_url -* openstack_external_network -* openstack_region -* base_image_id -* base_flavor_id -* openstack_user_domain_name -* openstack_project_domain_name -``` - -**Notes** - -* `openstack_auth_url` - a Keystone v3 authentication url. -* `openstack_external_network` - the Floating IP network name in OpenStack. For example, in RackSpace it is "GATEWAY_NET". -* `base_image_id` - the image_id of a CentOS 7 image in your OpenStack account. -* `base_flavor_id` - the image flavor id (the "t-shirt" size of the VM). -* `openstack_user_domain_name` - usually "default". -* `openstack_project_domain_name` - usually "default". +| Secret Name | Description | +| ---------------------------------------------------------------- | ------------------------------------ | +| `openstack_username` | Username to access OpenStack API | +| `openstack_password` | Password to access OpenStack API | +| `openstack_tenant_name` | Openstack tenant | +| `openstack_auth_url` | Keystone v3 authentication url | +| `openstack_external_network` |Floating IP network name in OpenStack. For example, in RackSpace it is "GATEWAY_NET". | +| `openstack_region` | Openstack region | +| `base_image_id` | Image ID of a CentOS 7 image in your OpenStack account | +| `base_flavor_id` | Image flavor ID (size of the VM) | +| `openstack_user_domain_name` | Typically "default" | +| `openstack_project_domain_name` | Typically "default" | ![Required secrets for this example]( /images/trial_getting_started/openstack_basic/create_secrets.png ) ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities * {{< param cloud >}} v3 - - ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -The flow required to setup a service consists of: +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -Let's run these one by one. +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/virtual-machine.zip` +* **Blueprint name**: virtual-machine (or any name of your choosing) +* **Blueprint YAML file**: openstack.yaml -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-VM-Setup blueprint. +### Deploy and Install +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. -### Deploy & Install - -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs (such as the {{< param cloud >}} region), and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) ![Create a Deployment]( /images/trial_getting_started/openstack_basic/deploy.png) -You will be directed to the **Deployment** page and will be able to track the progress of the execution. - -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To login to your new {{< param cloud >}} instance, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your {{< param cloud >}} instance public IP, SSH username, and SSH private key. - -![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) - -### Teardown - -To remove the deployment and destroy the orchestrated infrastructure resources, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets - -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). - -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_cli_link>}}). - -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create openstack_username --secret-string -cfy secrets create openstack_password --secret-string -cfy secrets create openstack_tenant_name --secret-string -cfy secrets create openstack_auth_url --secret-string -cfy secrets create openstack_external_network --secret-string -cfy secrets create openstack_region --secret-string -cfy secrets create base_image_id --secret-string -cfy secrets create base_flavor_id --secret-string -cfy secrets create openstack_user_domain_name --secret-string -cfy secrets create openstack_project_domain_name --secret-string -``` - -**Notes** - -* `openstack_auth_url` - a Keystone v3 authentication url. -* `openstack_external_network` - the Floating IP network name in OpenStack. For example, in RackSpace it is "GATEWAY_NET". -* `base_image_id` - the image_id of a CentOS 7 image in your OpenStack account. -* `base_flavor_id` - the image flavor id (the "t-shirt" size of the VM). -* `openstack_user_domain_name` - usually "default". -* `openstack_project_domain_name` - usually "default". - -**Advanced users tip**: - -You can also source the OpenStack RC file, then use the environment variables, for example: -``` -cfy secrets create openstack_username -s ${OS_USERNAME} -``` -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param basic_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -```bash -cfy nodes list -d {{< param deployment_name >}} -``` +This example deployed a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs along with a new network and other resources. You can validate this deployment by: -which will return: +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -```bash -Nodes: -+------------------+---------------------------+---------------------------+---------+----------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+------------------+---------------------------+---------------------------+---------+----------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| subnet | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.Subnet | tenant | default_tenant | 1 | 1 | admin | -| network | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.Network | tenant | default_tenant | 1 | 1 | admin | -| security-group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.SecurityGroup | tenant | default_tenant | 1 | 1 | admin | -| ip | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.FloatingIP | tenant | default_tenant | 1 | 1 | admin | -| cloud_init | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.CloudInit.CloudConfig | tenant | default_tenant | 1 | 1 | admin | -| vm | {{< param deployment_name >}} | {{< param deployment_name >}} | vm | cloudify.nodes.openstack.Server | tenant | default_tenant | 1 | 1 | admin | -| external-network | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.Network | tenant | default_tenant | 1 | 1 | admin | -| router | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.Router | tenant | default_tenant | 1 | 1 | admin | -| port | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.openstack.Port | tenant | default_tenant | 1 | 1 | admin | -+------------------+---------------------------+---------------------------+---------+----------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ +You can log in to the newly deployed {{< param cloud >}} instance by obtaining the public IP, SSH username, and SSH private key ouputs and capabilities. -Showing 9 of 9 nodes - -``` - -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![openstack_simple_vm_topology.png]( /images/trial_getting_started/openstack_simple_vm_topology.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param blueprint_name >}}]({{< param basic_blueprint_master >}}/{{< param blueprint_name >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/aws_basic/Screenshot263.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From 80dc3785e094e23399c1847a97da2fdc801bf5bb Mon Sep 17 00:00:00 2001 From: acritelli Date: Fri, 9 Dec 2022 16:06:25 -0500 Subject: [PATCH 05/14] Use full word insection title --- content/trial_getting_started/examples/basic/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/trial_getting_started/examples/basic/_index.md b/content/trial_getting_started/examples/basic/_index.md index 6fcd45913..54e3fe808 100644 --- a/content/trial_getting_started/examples/basic/_index.md +++ b/content/trial_getting_started/examples/basic/_index.md @@ -1,5 +1,5 @@ +++ -title = "Level 2: Infra Provisioning Basics" +title = "Level 2: Infrastructure Provisioning Basics" description = "Learn how to setup basic infrastructure in AWS, Azure, GCP and OpenStack" weight = 20 alwaysopen = false From a1bb90b03c672287884ab742cb07684baed93651 Mon Sep 17 00:00:00 2001 From: acritelli Date: Fri, 9 Dec 2022 16:16:05 -0500 Subject: [PATCH 06/14] Update titles, descriptions, and section main page --- .../trial_getting_started/examples/first_service/_index.md | 6 +++++- .../examples/first_service/aws_hello_world_example.md | 4 ++-- .../examples/first_service/azure_hello_world_example.md | 4 ++-- .../examples/first_service/gcp_hello_world_example.md | 4 ++-- .../examples/first_service/openstack_hello_world_example.md | 4 ++-- .../examples/first_service/terraform_hello_world_example.md | 4 ++-- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/content/trial_getting_started/examples/first_service/_index.md b/content/trial_getting_started/examples/first_service/_index.md index b23ac4d39..617c2a1db 100644 --- a/content/trial_getting_started/examples/first_service/_index.md +++ b/content/trial_getting_started/examples/first_service/_index.md @@ -1,8 +1,12 @@ +++ -title = "Level 3: Setup Your First Service" +title = "Level 3: Service Provisioning" description = "Learn how to setup a simple service topology consisting of an Apache2 web-server running on a VM and hosting a sample HTML page. These examples also explain the setup of all essential peripherals (Security group, network interfaces, etc.) in AWS, Azure, GCP and OpenStack. Some of the examples demonstrate usage of Ansible Playbook with cloudify-ansible-plugin." weight = 30 alwaysopen = false +++ +The service provisioning examples build on the [Infrastructure Provisioning Basics]({{< relref "/trial_getting_started/examples/basic/" >}}) section to add a simple web application to the deployed infrastructure. Each example is designed to match a different IaaS (infrastructure as a service) with examples for AWS, Azure, GCP and OpenStack. + +Running these examples will help you build your knowledge of blueprints to see how Cloudify can model both the infrastructure and application environment. + {{%children style="h2" description="true"%}} diff --git a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md index 2445f3a77..845934d30 100644 --- a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md @@ -6,8 +6,8 @@ deployment_name = "hello-world-example.aws" cloud_auth_ui_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey" cloud_auth_cli_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI" -title = "AWS hello-world" -description = "AWS - Simple hello world" +title = "AWS - Service Provisioning" +description = "Deploy a simple web service on AWS" weight = 40 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/first_service/azure_hello_world_example.md b/content/trial_getting_started/examples/first_service/azure_hello_world_example.md index 1726382dd..a3a089a1b 100644 --- a/content/trial_getting_started/examples/first_service/azure_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/azure_hello_world_example.md @@ -4,8 +4,8 @@ cloud = "Azure" blueprint_name = "azure.yaml" deployment_name = "hello-world-example.azure" -title = "Azure hello-world" -description = "Azure - Simple hello world" +title = "Azure - Service Provisioning" +description = "Deploy a simple web service on Azure" weight = 40 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md b/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md index 058ffab3a..ab02cae96 100644 --- a/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md @@ -6,8 +6,8 @@ deployment_name = "hello-world-example.gcp" cloud_auth_ui_link = "https://cloud.google.com/iam/docs/service-accounts" cloud_auth_cli_link = "https://cloud.google.com/iam/docs/service-accounts" -title = "GCP hello-world" -description = "GCP - Simple hello world" +title = "GCP - Service Provisioning" +description = "Deploy a simple web service on GCP" weight = 40 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/first_service/openstack_hello_world_example.md b/content/trial_getting_started/examples/first_service/openstack_hello_world_example.md index 59b849d85..1d57dff65 100644 --- a/content/trial_getting_started/examples/first_service/openstack_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/openstack_hello_world_example.md @@ -6,8 +6,8 @@ deployment_name = "hello-world-example.openstack" cloud_auth_ui_link = "https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/8/html/command-line_interface_reference_guide/ch_cli#cli_openrc" cloud_auth_cli_link = "https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/8/html/command-line_interface_reference_guide/ch_cli#cli_openrc" -title = "OpenStack hello-world" -description = "OpenStack - Simple hello world" +title = "OpenStack Service Provisioning" +description = "Deploy a simple web service on OpenStack" weight = 40 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md b/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md index 168fd74b3..ee04c7384 100644 --- a/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md @@ -6,8 +6,8 @@ deployment_name = "hello-world-example.aws-terraform" cloud_auth_ui_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey" cloud_auth_cli_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI" -title = "Terraform hello-world" -description = "Terraform - Simple hello world" +title = "Terraform Service Provisioning" +description = "Deploy a simple web service on AWS using Terraform" weight = 40 alwaysopen = false +++ From b9b1bd20e8a361d6cf86a458fcaefe36f5b8d50e Mon Sep 17 00:00:00 2001 From: acritelli Date: Fri, 9 Dec 2022 16:18:12 -0500 Subject: [PATCH 07/14] Update descriptions for level 2 tutorials --- content/trial_getting_started/examples/basic/aws_basics.md | 2 +- content/trial_getting_started/examples/basic/azure_basics.md | 2 +- content/trial_getting_started/examples/basic/gcp_basics.md | 2 +- .../trial_getting_started/examples/basic/openstack_basics.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/trial_getting_started/examples/basic/aws_basics.md b/content/trial_getting_started/examples/basic/aws_basics.md index 6f8c311a4..396f624e8 100644 --- a/content/trial_getting_started/examples/basic/aws_basics.md +++ b/content/trial_getting_started/examples/basic/aws_basics.md @@ -7,7 +7,7 @@ cloud_auth_ui_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_creden cloud_auth_cli_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI" title = "AWS - Infrastructure provisioning basics" -description = "AWS - Infrastructure provisioning basics" +description = "Deploy an AWS EC2 instance and supporting infrastructure resources" weight = 22 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/basic/azure_basics.md b/content/trial_getting_started/examples/basic/azure_basics.md index c2aa9c0a1..950b77234 100644 --- a/content/trial_getting_started/examples/basic/azure_basics.md +++ b/content/trial_getting_started/examples/basic/azure_basics.md @@ -5,7 +5,7 @@ blueprint_name = "azure.yaml" deployment_name = "virtual-machine.azure" title = "Azure - Infrastructure provisioning basics" -description = "Azure - Infrastructure provisioning basics" +description = "Deploy an Azure VM and supporting infrastructure resources" weight = 25 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/basic/gcp_basics.md b/content/trial_getting_started/examples/basic/gcp_basics.md index f9e12d78f..42e598835 100644 --- a/content/trial_getting_started/examples/basic/gcp_basics.md +++ b/content/trial_getting_started/examples/basic/gcp_basics.md @@ -7,7 +7,7 @@ cloud_auth_ui_link = "https://cloud.google.com/iam/docs/service-accounts" cloud_auth_cli_link = "https://cloud.google.com/iam/docs/service-accounts" title = "GCP - Infrastructure provisioning basics" -description = "GCP - Infrastructure provisioning basics" +description = "Deploy a GCP VM and supporting infrastructure resources" weight = 27 alwaysopen = false +++ diff --git a/content/trial_getting_started/examples/basic/openstack_basics.md b/content/trial_getting_started/examples/basic/openstack_basics.md index 312d66c00..7b84c0da1 100644 --- a/content/trial_getting_started/examples/basic/openstack_basics.md +++ b/content/trial_getting_started/examples/basic/openstack_basics.md @@ -7,7 +7,7 @@ cloud_auth_ui_link = "https://access.redhat.com/documentation/en-us/red_hat_open cloud_auth_cli_link = "https://access.redhat.com/documentation/en-us/red_hat_openstack_platform/8/html/command-line_interface_reference_guide/ch_cli#cli_openrc" title = "OpenStack - Infrastructure provisioning basics" -description = "OpenStack - Infrastructure provisioning basics" +description = "Deploy an OpenStack VM and supporting infrastructure resources" weight = 28 alwaysopen = false +++ From 28d24aeb578b373f26234fcd7e6c0e7fe28d72b7 Mon Sep 17 00:00:00 2001 From: acritelli Date: Fri, 9 Dec 2022 16:29:03 -0500 Subject: [PATCH 08/14] Remove extra periods --- content/trial_getting_started/examples/basic/aws_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/trial_getting_started/examples/basic/aws_basics.md b/content/trial_getting_started/examples/basic/aws_basics.md index 396f624e8..1c9b3268a 100644 --- a/content/trial_getting_started/examples/basic/aws_basics.md +++ b/content/trial_getting_started/examples/basic/aws_basics.md @@ -17,7 +17,7 @@ This example demonstrates a simple infrastructure setup in **{{< param cloud_ful * Instance * Security Group * Network - * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc...). + * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc.) In this example we will deploy only the infrastructure. Later, in the more advanced examples (multi cloud examples) From d01b3ff2264ff8fe99e8893a8c19e4b1484fc7b6 Mon Sep 17 00:00:00 2001 From: acritelli Date: Fri, 9 Dec 2022 16:47:20 -0500 Subject: [PATCH 09/14] Initial work on deduplicating level 3 AWS --- .../examples/basic/aws_basics.md | 4 +- .../first_service/aws_hello_world_example.md | 89 ++++++++----------- 2 files changed, 39 insertions(+), 54 deletions(-) diff --git a/content/trial_getting_started/examples/basic/aws_basics.md b/content/trial_getting_started/examples/basic/aws_basics.md index 1c9b3268a..f61a640eb 100644 --- a/content/trial_getting_started/examples/basic/aws_basics.md +++ b/content/trial_getting_started/examples/basic/aws_basics.md @@ -66,10 +66,10 @@ The blueprint for this example handles describes all of the components in the en Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) * **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/virtual-machine.zip` -* **Blueprint name**: virtual-machine +* **Blueprint name**: virtual-machine (or any name of your choosing) * **Blueprint YAML file**: aws.yaml -### Deploy & Install +### Deploy and Install Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. diff --git a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md index 845934d30..3c24e736b 100644 --- a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md @@ -12,97 +12,82 @@ weight = 40 alwaysopen = false +++ -This example demonstrates a simple infrastructure setup in **{{< param cloud_full >}} ({{< param cloud >}})**, the deployment consists of: +This example deploys a simple website and all of the supporting infrastructure components, including: - * Instance - * Web server + simple website - * Security Group - * Network - * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc...). +* An EC2 instance +* Security group +* Network +* Essential peripherals in AWS (IP address, NIC, etc.) -In this example we will deploy virtual infrastructure and a "hello world" application using the {{< param cloud >}} and Ansible plugins. +The infrastructure components will be deployed using the Cloudify AWS plugin, while the web application will be deployed with the Ansible plugin. + +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) ## Prerequisites + This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} - -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. - +## Deployment Steps ### Create Secrets -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: +Create the following secrets in the {{< param cfy_manager_name >}}: -* aws_access_key_id -* aws_secret_access_key +| Secret Name | Description | +| ---------------------------------------------------------------- | ------------------------------------ | +| `aws_access_key_id` | The access key ID used to access AWS | +| `aws_secret_access_key` The secret access key used to access AWS | | -![Required plugins for this example]( /images/trial_getting_started/aws_basic/Screenshot249.png ) +{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin and the Ansible plugin to deploy the website. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities -* Ansible (`cloudify-ansible-plugin`) * {{< param cloud >}} +* Ansible +### Upload Blueprint +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -### Upload Blueprint +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/hello-world-example.zip` +* **Blueprint name**: hello-world-example (or any name of your choosing) +* **Blueprint YAML file**: aws.yaml -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). +### Deploy and Install -The flow required to setup a service consists of: +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) + +You will be directed to the **Deployment** page and will be able to track the progress of the execution: + +![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) + +### Validate -Let's run these one by one. -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-Simple-Service-Setup blueprint. -### Deploy & Install -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs, and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. -You will be directed to the **Deployment** page and will be able to track the progress of the execution. -The deployment you have created should be displayed in the deployments list in the **Deployments** page. -![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) ### Validate From 2f6282a235a296dc408abcafdc50a9058053ff32 Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 15 Dec 2022 12:14:28 -0500 Subject: [PATCH 10/14] Finish deduplication of Level 3 AWS example --- .../first_service/aws_hello_world_example.md | 153 +----------------- 1 file changed, 6 insertions(+), 147 deletions(-) diff --git a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md index 3c24e736b..bdce7cff7 100644 --- a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md @@ -81,158 +81,17 @@ You will be directed to the **Deployment** page and will be able to track the pr ### Validate +This example deployed a simple web application on a virtual machine with supporting resources, such as a new network. You can validate this deployment by: +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. +You can navigate to the IP address provided by the `application_endpoint` capability. - - - - - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To access your new service, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your new **application_endpoint** output containing a URL to the service. Simply put that URL into a web browser to view the deployed service. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) ![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) ### Teardown -To remove the deployment and destroy the orchestrated service, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets - -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). - -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_cli_link>}}). - -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create aws_access_key_id --secret-string -cfy secrets create aws_secret_access_key --secret-string -``` - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param first_service_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -``` -$ cfy nodes list -d {{< param deployment_name >}} - -Listing nodes for deployment {{< param deployment_name >}}... - -Nodes: -+--------------------------------------+-------------------------+-------------------------+---------+-------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+--------------------------------------+-------------------------+-------------------------+---------+-------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| ami | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.Image | tenant | default_tenant | 1 | 1 | admin | -| subnet | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.Subnet | tenant | default_tenant | 1 | 1 | admin | -| hello-world | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.ansible.Playbook | tenant | default_tenant | 1 | 1 | admin | -| routetable | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.RouteTable | tenant | default_tenant | 1 | 1 | admin | -| internet_gateway | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.InternetGateway | tenant | default_tenant | 1 | 1 | admin | -| ip | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.ElasticIP | tenant | default_tenant | 1 | 1 | admin | -| cloud_init | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.CloudInit.CloudConfig | tenant | default_tenant | 1 | 1 | admin | -| vm | {{< param deployment_name >}} | {{< param deployment_name >}} | vm | cloudify.nodes.aws.ec2.Instances | tenant | default_tenant | 1 | 1 | admin | -| security_group_rules | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.SecurityGroupRuleIngress | tenant | default_tenant | 1 | 1 | admin | -| vpc | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.Vpc | tenant | default_tenant | 1 | 1 | admin | -| nic | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.Interface | tenant | default_tenant | 1 | 1 | admin | -| security_group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.SecurityGroup | tenant | default_tenant | 1 | 1 | admin | -| route_public_subnet_internet_gateway | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.aws.ec2.Route | tenant | default_tenant | 1 | 1 | admin | -+--------------------------------------+-------------------------+-------------------------+---------+-------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ - -Showing 13 of 13 nodes -``` -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -To get the Outputs of our deployment run: -```bash -cfy deployment outputs {{< param deployment_name >}} -``` - -The returned output would look like: - -``` bash -Retrieving outputs for deployment {{< param deployment_name >}}... - - "application_endpoint": - Description: The external endpoint of the application. - Value: http://40.79.42.39:80 - -``` - -Copy and paste the URL **Value** into your browser, you should see a simple web page. - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![Successful Cloudify Deployment]( /images/trial_getting_started/first_service/Screenshot324.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param first_service_blueprint_name >}}]({{< param first_service_blueprint_master >}}) - - -### Teardown - -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From b7f0cc5dceed46cea1b85a5b5f68cedcca40a43c Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 15 Dec 2022 12:30:30 -0500 Subject: [PATCH 11/14] Improve validation description --- .../examples/first_service/aws_hello_world_example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md index bdce7cff7..89413648f 100644 --- a/content/trial_getting_started/examples/first_service/aws_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/aws_hello_world_example.md @@ -86,7 +86,7 @@ This example deployed a simple web application on a virtual machine with support * Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. * Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -You can navigate to the IP address provided by the `application_endpoint` capability. +To access the new service, you can locate the `application_endpoint` containing a URL to the service on the **Deployment Outputs/Capabilities** section on the Deployment Info page. Simply navigate to the URL in a web browser to view the deployed service. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) From e7bd47c95f0c6780f2860bb9f92cbcb50cbe4d1e Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 15 Dec 2022 12:30:39 -0500 Subject: [PATCH 12/14] Deduplicate Level 3 Azure example --- .../azure_hello_world_example.md | 244 +++--------------- 1 file changed, 37 insertions(+), 207 deletions(-) diff --git a/content/trial_getting_started/examples/first_service/azure_hello_world_example.md b/content/trial_getting_started/examples/first_service/azure_hello_world_example.md index a3a089a1b..7d18fc1fb 100644 --- a/content/trial_getting_started/examples/first_service/azure_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/azure_hello_world_example.md @@ -10,260 +10,90 @@ weight = 40 alwaysopen = false +++ -This example demonstrates a simple infrastructure setup in **{{< param cloud_full >}}**, the deployment consists of: +This example deploys a simple website and all of the supporting infrastructure components, including: * Instance * Web server + simple website * Security Group * Network - * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc...). + * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc.). -In this example we will deploy virtual infrastructure and a "hello world" application using the {{< param cloud >}} and Ansible plugins. +The infrastructure components will be deployed using the Cloudify Azure plugin, while the web application will be deployed with the Ansible plugin. + +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) ## Prerequisites + This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} - -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. - - +## Deployment Steps ### Create Secrets -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -{{< param cloud >}} credentials can be created by following the guide [here]({{< relref "working_with/official_plugins/Infrastructure/azure.md" >}}). +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: +Create the following secrets in the {{< param cfy_manager_name >}}: -* azure_subscription_id -* azure_tenant_id -* azure_client_id -* azure_client_secret - -**Notes** - -* `azure_subscription_id` - the account subscription ID. -* `azure_tenant_id` - the Service Principal `tenant`. -* `azure_client_id` - the Service Principal `appId`. -* `azure_client_secret` - the Service Principal `password`. +| Secret Name | Description | +| ----------------------- | -------------------------------- | +| `azure_subscription_id` | The account subscription ID | +| `azure_tenant_id` | The service principal tenant | +| `azure_client_id` | The service principal `appId` | +| `azure_client_secret` | The service principal `password` | ![Required plugins for this example](/images/trial_getting_started/azure_basic/create_secrets.png ) + ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin and the Ansible plugin to deploy the website. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities -* Ansible (`cloudify-ansible-plugin`) * {{< param cloud >}} - - - +* Ansible ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -The flow required to setup a service consists of: - -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -Let's run these one by one. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-Simple-Service-Setup blueprint. +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/hello-world-example.zip` +* **Blueprint name**: hello-world-example (or any name of your choosing) +* **Blueprint YAML file**: azure.yaml +### Deploy and Install -### Deploy & Install +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs, and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. - -You will be directed to the **Deployment** page and will be able to track the progress of the execution. - -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/aws_basic/Screenshot261.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To access your new service, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your new **application_endpoint** output containing a URL to the service. Simply put that URL into a web browser to view the deployed service. - -![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) - -### Teardown - -To remove the deployment and destroy the orchestrated service, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets - -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). - -{{< param cloud >}} credentials can be created by following the guide [here]({{< relref "working_with/official_plugins/Infrastructure/azure.md" >}}). - -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create azure_client_id --secret-string -cfy secrets create azure_tenant_id --secret-string -cfy secrets create azure_subscription_id --secret-string -cfy secrets create azure_client_secret --secret-string -``` - -**Notes** - -* `azure_subscription_id` - the account subscription ID. -* `azure_tenant_id` - the Service Principal `tenant`. -* `azure_client_id` - the Service Principal `appId`. -* `azure_client_secret` - the Service Principal `password`. - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param first_service_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -``` -$ cfy nodes list -d {{< param deployment_name >}} - -Listing nodes for deployment {{< param deployment_name >}}... +This example deployed a simple web application on a virtual machine with supporting resources, such as a new network. You can validate this deployment by: -Nodes: -+------------------------+---------------------------+---------------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+------------------------+---------------------------+---------------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| subnet | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.Subnet | tenant | default_tenant | 1 | 1 | admin | -| availability_set | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.compute.AvailabilitySet | tenant | default_tenant | 1 | 1 | admin | -| network | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.VirtualNetwork | tenant | default_tenant | 1 | 1 | admin | -| resource_group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.ResourceGroup | tenant | default_tenant | 1 | 1 | admin | -| nic | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.NetworkInterfaceCard | tenant | default_tenant | 1 | 1 | admin | -| vm | {{< param deployment_name >}} | {{< param deployment_name >}} | vm | cloudify.azure.nodes.compute.VirtualMachine | tenant | default_tenant | 1 | 1 | admin | -| network_security_group | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.NetworkSecurityGroup | tenant | default_tenant | 1 | 1 | admin | -| ip | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.PublicIPAddress | tenant | default_tenant | 1 | 1 | admin | -| storage_account | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.storage.StorageAccount | tenant | default_tenant | 1 | 1 | admin | -| hello-world | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.nodes.ansible.Playbook | tenant | default_tenant | 1 | 1 | admin | -| ip_config | {{< param deployment_name >}} | {{< param deployment_name >}} | | cloudify.azure.nodes.network.IPConfiguration | tenant | default_tenant | 1 | 1 | admin | -+------------------------+---------------------------+---------------------------+---------+---------------------------------------------------+------------+----------------+---------------------+-----------------------------+------------+ +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -Showing 11 of 11 nodes -``` -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` +To access the new service, you can locate the `application_endpoint` containing a URL to the service on the **Deployment Outputs/Capabilities** section on the Deployment Info page. Simply navigate to the URL in a web browser to view the deployed service. -To get the Outputs of our deployment run: -```bash -cfy deployment outputs {{< param deployment_name >}} -``` - -The returned output would look like: - -``` bash -Retrieving outputs for deployment {{< param deployment_name >}}... - - "application_endpoint": - Description: The external endpoint of the application. - Value: http://40.79.42.39:80 - -``` - -Copy and paste the URL **Value** into your browser, you should see a simple web page. - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![Successful Cloudify Deployment]( /images/trial_getting_started/azure_hello_world_deployment_topology.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param first_service_blueprint_name >}}]({{< param first_service_blueprint_master >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From 1d3537f909f37b775887628a5f961db456ee77ac Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 15 Dec 2022 13:21:25 -0500 Subject: [PATCH 13/14] Deduplicate Level 3 GCP example --- .../first_service/gcp_hello_world_example.md | 218 +++--------------- 1 file changed, 35 insertions(+), 183 deletions(-) diff --git a/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md b/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md index ab02cae96..73336e7b8 100644 --- a/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/gcp_hello_world_example.md @@ -12,236 +12,88 @@ weight = 40 alwaysopen = false +++ -This example demonstrates a simple infrastructure setup in **{{< param cloud_full >}} ({{< param cloud >}})**, the deployment consists of: +This example deploys a simple website and all of the supporting infrastructure components, including: * Instance * Web server + simple website * Security Group * Network - * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc...). + * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc.). -In this example we will deploy virtual infrastructure and a "hello world" application using the {{< param cloud >}} and Ansible plugins. +The infrastructure components will be deployed using the Cloudify GCP plugin, while the web application will be deployed with the Ansible plugin. + +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) ## Prerequisites + This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}} - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} +## Deployment Steps -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. +### Create Secrets +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -### Create Secrets +Create the following secrets in the {{< param cfy_manager_name >}}: -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +| Secret Name | Description | +| ----------------- | -------------------------------------------- | +| `gcp_credentials` | JSON containing credential for accessing GCP | {{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: - -* gcp_credentials - -`gcp_credentials`: A GCP service account key in JSON format. **Hint: We create this secret from the contents of a file.** +![Required secrets for this example]( /images/trial_getting_started/gcp_basic/create_secrets.png ) ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin and the Ansible plugin to deploy the website. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities -* Ansible (`cloudify-ansible-plugin`) * {{< param cloud >}} - - - +* Ansible ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -The flow required to setup a service consists of: +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/hello-world-example.zip` +* **Blueprint name**: hello-world-example (or any name of your choosing) +* **Blueprint YAML file**: gcp.yaml -Let's run these one by one. +### Deploy and Install -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-Simple-Service-Setup blueprint. +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -### Deploy & Install - -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs, and click **Deploy & Install** - -You will be directed to the **Deployment** page and will be able to track the progress of the execution. - -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/first_service/Screenshot325.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To access your new service, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your new **application_endpoint** output containing a URL to the service. Simply put that URL into a web browser to view the deployed service. - -![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) - -### Teardown - -To remove the deployment and destroy the orchestrated service, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets +This example deployed a simple web application on a virtual machine with supporting resources, such as a new network. You can validate this deployment by: -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_cli_link>}}). +To access the new service, you can locate the `application_endpoint` containing a URL to the service on the **Deployment Outputs/Capabilities** section on the Deployment Info page. Simply navigate to the URL in a web browser to view the deployed service. -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create gcp_credentials --secret-file ./path/to/service_account_json_file - -``` - -`gcp_credentials`: A GCP service account key in JSON format. **Hint: We create this secret from a file.** - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param first_service_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -``` -$ cfy nodes list -d {{< param deployment_name >}} - -Listing nodes for deployment {{< param deployment_name >}}... - -Nodes: -+-------------+-------------------------+-------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+-------------+-------------------------+-------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| firewall | hello-world-example.gcp | hello-world-example.gcp | | cloudify.gcp.nodes.FirewallRule | tenant | default_tenant | 1 | 1 | admin | -| subnet | hello-world-example.gcp | hello-world-example.gcp | | cloudify.gcp.nodes.SubNetwork | tenant | default_tenant | 1 | 1 | admin | -| hello-world | hello-world-example.gcp | hello-world-example.gcp | | cloudify.nodes.ansible.Playbook | tenant | default_tenant | 1 | 1 | admin | -| network | hello-world-example.gcp | hello-world-example.gcp | | cloudify.gcp.nodes.Network | tenant | default_tenant | 1 | 1 | admin | -| vm | hello-world-example.gcp | hello-world-example.gcp | vm | cloudify.gcp.nodes.Instance | tenant | default_tenant | 1 | 1 | admin | -+-------------+-------------------------+-------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ - -Showing 5 of 5 nodes -``` -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -To get the Outputs of our deployment run: -```bash -cfy deployment outputs {{< param deployment_name >}} -``` - -The returned output would look like: - -``` bash -Retrieving outputs for deployment {{< param deployment_name >}}... - - "application_endpoint": - Description: The external endpoint of the application. - Value: http://40.79.42.39:80 - -``` - -Copy and paste the URL **Value** into your browser, you should see a simple web page. - -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. - -![Successful Deployment]( /images/trial_getting_started/gcp_hello_world_deployment_topology.png ) - -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param first_service_blueprint_name >}}]({{< param first_service_blueprint_master >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}}) From 95aafcab2d9c4e29667acdb7802141ae22bb310a Mon Sep 17 00:00:00 2001 From: acritelli Date: Thu, 15 Dec 2022 14:21:24 -0500 Subject: [PATCH 14/14] Deduplicate Level 3 AWS-Terraform example --- .../terraform_hello_world_example.md | 227 +++--------------- 1 file changed, 40 insertions(+), 187 deletions(-) diff --git a/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md b/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md index ee04c7384..a2b33ad50 100644 --- a/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md +++ b/content/trial_getting_started/examples/first_service/terraform_hello_world_example.md @@ -6,240 +6,93 @@ deployment_name = "hello-world-example.aws-terraform" cloud_auth_ui_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey" cloud_auth_cli_link = "https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI" -title = "Terraform Service Provisioning" +title = "Terraform - Service Provisioning" description = "Deploy a simple web service on AWS using Terraform" weight = 40 alwaysopen = false +++ -This example demonstrates a simple infrastructure setup in **{{< param cloud_full >}} ({{< param cloud >}})** using Terraform, the deployment consists of: +This example deploys a simple website and all of the supporting infrastructure components, including: - * Instance - * Web server + simple website - * Security Group - * Network - * All of the essential peripherals in {{< param cloud >}} (IP address, NIC, etc...). +* An EC2 instance +* Security group +* Network +* Essential peripherals in AWS (IP address, NIC, etc.) -In this example we will deploy virtual infrastructure and a "hello world" application using the {{< param cloud >}} and Ansible plugins. +The infrastructure components will be deployed using the Cloudify Terraform plugin, while the web application will be deployed with the Ansible plugin. + +You should already be familiar with the concepts from the [Fundamentals Example.]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) ## Prerequisites + This example expects the following prerequisites: * A {{< param cfy_manager_name >}} setup ready. This can be either a [{{< param mgr_hosted_title >}}]({{< param mgr_hosted_link >}}), a [{{< param mgr_premium_title >}}]({{< param mgr_premium_link >}}), or a [{{< param mgr_community_title >}}]({{< param mgr_community_link >}}). * Access to {{< param cloud >}} infrastructure is required to demonstrate this example. -#### {{< param cfy_cli_name >}} or {{< param cfy_console_name >}}? - -{{< param product_name >}} allows for multiple user interfaces. Some users find the {{< param cfy_console_name >}} (web based UI) more intuitive while others prefer the {{< param cfy_cli_name >}} (Command Line Interface). This tutorial and all following ones will describe both methods. - -* [Using the {{< param cfy_console_name >}}](#cloudify-management-console) -* [Using the {{< param cfy_cli_name >}}](#cloudify-cli) - -{{% note %}} -Community version - Some of the options described in the guide are not available in the community version management console (web UI). An example would be setting up secrets. You can still perform all of the functionality using the {{< param cfy_cli_name >}}. -{{% /note %}} - -## {{< param cfy_console_name >}} - -This section explains how to run the above described steps using the {{< param cfy_console_name >}}. -The {{< param cfy_console_name >}} and {{< param cfy_cli_name >}} can be used interchangeably for all {{< param product_name >}} activities. - +## Deployment Steps ### Create Secrets -To connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -Secrets are kept encrypted in a secure way and used in run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). +Credentials are required to connect to {{< param cloud >}}. {{< param product_name >}} recommends storing such sensitive information in a {{< param product_name >}} secret. -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create secrets using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#create-secrets-1" >}}) -To store the access keys as secrets in the {{< param cfy_manager_name >}}, login to the {{< param cfy_console_name >}} and select the **System Resources** page. Scroll to the **Secret Store Management** widget and use the **Create** button to add the following new secrets: +Create the following secrets in the {{< param cfy_manager_name >}}: -* aws_access_key_id -* aws_secret_access_key +| Secret Name | Description | +| ---------------------------------------------------------------- | ------------------------------------ | +| `aws_access_key_id` | The access key ID used to access AWS | +| `aws_secret_access_key` The secret access key used to access AWS | | -![Required plugins for this example]( /images/trial_getting_started/aws_terraform/system-resources.png ) +{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_ui_link>}}). ### Upload Plugins -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers and automation tools. -I.e., connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. +Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. This example also requires the Utilities plugin and the Ansible plugin to deploy the website. -To upload the required plugins to your manager, select the **Cloudify Catalog** page, scroll to the **Plugins Catalog** widget and select the plugins you wish to upload. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload plugins using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-plugins-1" >}}) -For this example, upload the following plugins: +Upload the following plugins to the {{< param cfy_manager_name >}}: * Utilities -* Ansible (`cloudify-ansible-plugin`) -* Terraform (`cloudify-terraform-plugin`) * {{< param cloud >}} - - - +* Terraform +* Ansible ### Upload Blueprint -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. -Blueprints are represented as descriptive code (yaml based files) and typically stored and managed as part of the source repository. -The blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -The flow required to setup a service consists of: - -1. Upload the blueprint describing the service to the {{< param cfy_manager_name >}}. -1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. -1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -Let's run these one by one. +The blueprint for this example handles describes all of the components in the environment's topology. Upload a new blueprint to the {{< param cfy_manager_name >}} with the values below. -To upload a blueprint to the {{< param cfy_manager_name >}}, select the **Cloudify Catalog** page, and use the **Upload blueprint** button next to the {{< param cloud >}}-Basics-Simple-Service-Setup blueprint. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to upload a blueprint using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) +* **Blueprint package**: `https://github.com/cloudify-community/blueprint-examples/releases/download/latest/hello-world-example.zip` +* **Blueprint name**: hello-world-example (or any name of your choosing) +* **Blueprint YAML file**: aws-terraform.yaml -### Deploy & Install +### Deploy and Install -Once the blueprint is uploaded, it will be displayed in the Blueprints widget. to deploy the blueprint click the **Create deployment** button next to the blueprint you wish to deploy. Specify a deployment name, update any inputs, and click **Deploy & Install**. Changing inputs is completely optional and the defaults are safe to use. +Once the blueprint has been uploaded, it will be displayed on the Blueprints page. Create a new deployment, adjusting any inputs as needed. -You will be directed to the **Deployment** page and will be able to track the progress of the execution. +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of how to create a deployment using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#deploy-and-install" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#upload-blueprint-and-deploy" >}}) -The deployment you have created should be displayed in the deployments list in the **Deployments** page. +You will be directed to the **Deployment** page and will be able to track the progress of the execution: ![Track the progress of a Workflow]( /images/trial_getting_started/aws_terraform/execution-progress-hw.png ) ### Validate -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* Examine the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, and view the installation logs. - -To access your new service, you can look at the **Deployment Outputs/Capabilities** widget on the Deployment screen to find your new **application_endpoint** output containing a URL to the service. Simply put that URL into a web browser to view the deployed service. - -![Get Deployment outputs]( /images/trial_getting_started/aws_terraform/execution-progress-hw.png ) - -### Teardown - -To remove the deployment and destroy the orchestrated service, run the **Uninstall** workflow by clicking the **Execute workflow** menu next to the deployment, expanding **Default workflows**, and selecting **Uninstall**. - - -____ - - - - -## {{< param cfy_cli_name >}} - -Create a CLI profile instructing your CLI how to connect with the {{< param cfy_manager_name >}} by running the following CLI commands - -```bash -cfy init -cfy profiles use -u admin -p --ssl -cfy profiles set --manager-tenant default_tenant -``` - -### Create Secrets - -To enable {{< param product_name >}} to connect to {{< param cloud >}}, credentials are required. -{{< param product_name >}} recommends storing such sensitive information as a {{< param product_name >}} secret. -Secrets are encrypted in a secure way and used during run-time by the system. -Learn more about {{< param product_name >}} secrets [here]({{< relref "/working_with/manager/using-secrets.md" >}}). - -{{< param cloud >}} credentials can be created by following the guide [here]({{< param cloud_auth_cli_link>}}). - -To store the access keys as secrets via the {{< param cfy_cli_name >}}, run the following (replacing with the actual string retrieved from {{< param cloud >}}): - -```bash -cfy secrets create aws_access_key_id --secret-string -cfy secrets create aws_secret_access_key --secret-string -``` - -### Upload Plugins - -Plugins are {{< param product_name >}}'s extendable interfaces to services, cloud providers, and automation tools. -Connecting to {{< param cloud >}} requires the {{< param cloud >}} plugin. You may upload specific plugins or, for simplicity, upload the plugin bundle containing all of the basic, pre-packaged, plugins. - -To upload the default plugins bundle (this may take a few minutes depending on your internet speed): -```bash -cfy plugins bundle-upload -``` - -**Tip**: Read more about [plugins]({{< relref "/working_with/official_plugins/_index.md" >}}) and [writing your own plugins]({{< relref "/developer/writing_plugins/_index.md" >}}). - -### Upload Blueprint and Deploy - -A blueprint is a general purpose model for describing systems, services or any orchestrated object topology. Blueprints are represented as descriptive code (YAML-based files) and are typically stored and managed as part of the source code repository. - -The {{< param cloud >}} infrastructure blueprint is available [here]({{< param first_service_blueprint_master >}}/{{< param blueprint_name >}}). - -Uploading a blueprint to {{< param product_name >}} can be done by direct upload or by providing the link in the source code repository. -The flow to do that is: - - 1. Upload the blueprint. - 1. Create a deployment from the uploaded blueprint. This generates a model of the service topology in the {{< param product_name >}} database and provides the "context" needed for running workflows. - 1. Run the **install** workflow for the created deployment to apply the model to the infrastructure. - -In order to perform this flow as a single unit, we will use the **install** command. - -```bash -cfy install {{< param first_service_blueprint_zip >}} -n {{< param blueprint_name >}} -``` - -### Validate - -In this example we have setup a simple infrastructure. A virtual instance (VM) was created in the region specified in the Deployment inputs alongside a new network and various other resources. - -* Go to your {{< param cloud >}} console and see the new instance and other resources that were created. -* You can easily get a list of all deployed nodes by running: - -``` -$ cfy nodes list -d {{< param deployment_name >}} - -Listing nodes for deployment {{< param deployment_name >}}... - -Nodes: -+-------------+-----------------------------------+-----------------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| id | deployment_id | blueprint_id | host_id | type | visibility | tenant_name | number_of_instances | planned_number_of_instances | created_by | -+-------------+-----------------------------------+-----------------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ -| hello-world | hello-world-example.aws-terraform | hello-world-example.aws-terraform | | cloudify.nodes.ansible.Playbook | tenant | default_tenant | 1 | 1 | admin | -| agent_key | hello-world-example.aws-terraform | hello-world-example.aws-terraform | | cloudify.keys.nodes.RSAKey | tenant | default_tenant | 1 | 1 | admin | -| vm | hello-world-example.aws-terraform | hello-world-example.aws-terraform | | cloudify.nodes.terraform.Module | tenant | default_tenant | 1 | 1 | admin | -| terraform | hello-world-example.aws-terraform | hello-world-example.aws-terraform | | cloudify.nodes.terraform | tenant | default_tenant | 1 | 1 | admin | -+-------------+-----------------------------------+-----------------------------------+---------+---------------------------------+------------+----------------+---------------------+-----------------------------+------------+ - -Showing 4 of 4 nodes -``` -**Tip**: To check out some more commands to use with the {{< param cfy_console_name >}}, run `cfy --help` - -To get the Outputs of our deployment run: -```bash -cfy deployment outputs {{< param deployment_name >}} -``` - -The returned output would look like: - -``` bash -Retrieving outputs for deployment {{< param deployment_name >}}... - - "application_endpoint": - Description: The external endpoint of the application. - Value: http://40.79.42.39:80 - -``` - -Copy and paste the URL **Value** into your browser, you should see a simple web page. +This example deployed a simple web application on a virtual machine with supporting resources, such as a new network. You can validate this deployment by: -An even easier way to review your deployment is through the [{{< param cfy_console_name >}}](#validate). -Login to the console and browse to the **Deployments** page. -Select the deployment (`{{< param deployment_name >}}`) and explore the topology, inputs, outputs, nodes, and logs. +* Navigating to the {{< param cloud >}} console and verifying that the new instance and other resources were created. +* Examining the Deployment page in the {{< param cfy_console_name >}} for more information about your deployed nodes, topology, installation logs. -![Successful Cloudify Deployment]( /images/trial_getting_started/aws_terraform/aws_terraform.png ) +To access the new service, you can locate the `application_endpoint` containing a URL to the service on the **Deployment Outputs/Capabilities** section on the Deployment Info page. Simply navigate to the URL in a web browser to view the deployed service. -This is also a good time to examine the blueprint used in the example. -The blueprint can be examined in the {{< param cfy_console_name >}}, however in this case -we will go to the {{< param product_name >}} examples repository in Github and examine it there: [{{< param first_service_blueprint_name >}}]({{< param first_service_blueprint_master >}}) +Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of verification steps, including how to obtain outputs and capabilities using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#validate" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#validate-1" >}}) +![Get Deployment outputs]( /images/trial_getting_started/first_service/Screenshot327.png ) ### Teardown -To remove the deployment and delete all resources from {{< param cloud >}} simply run the uninstall command: -```bash -cfy uninstall {{< param deployment_name >}} -``` +Once you are done testing the environment, you can teardown the deployed resources. Please refer to the [Fundamentals Example]({{< relref "/trial_getting_started/examples/fundamentals/" >}}) for an explanation of teardown steps using the [UI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown" >}}) or [CLI]({{< relref "/trial_getting_started/examples/fundamentals/#teardown-1" >}})