From 3e448e5c25ac571d966568922c06588f36521202 Mon Sep 17 00:00:00 2001 From: "Andrew J. Mauer" Date: Mon, 17 Aug 2020 17:03:37 -0400 Subject: [PATCH] add a java mp jpa scenario using crunchy psql operator --- assets/Crunchy.png | Bin 0 -> 12469 bytes assets/createPerson.png | Bin 0 -> 11799 bytes assets/createPersonDB.png | Bin 0 -> 12054 bytes assets/displayPeople.png | Bin 0 -> 12791 bytes examples/java_ol_postgresql_odo/README.md | 489 ++++++++++++++++++++++ 5 files changed, 489 insertions(+) create mode 100644 assets/Crunchy.png create mode 100644 assets/createPerson.png create mode 100644 assets/createPersonDB.png create mode 100644 assets/displayPeople.png create mode 100644 examples/java_ol_postgresql_odo/README.md diff --git a/assets/Crunchy.png b/assets/Crunchy.png new file mode 100644 index 0000000000000000000000000000000000000000..f5be45b9e796e36049696dd2e2b0a1f25f7868ed GIT binary patch literal 12469 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 literal 0 HcmV?d00001 diff --git a/assets/createPerson.png b/assets/createPerson.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d71f5a617b0c510798bd0ef1f09a6f19f5d6fd GIT binary patch literal 11799 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 a4cxx9;o1{tj#9e-r~Y&~UV8M(t^WZBzw?#= literal 0 HcmV?d00001 diff --git a/assets/createPersonDB.png b/assets/createPersonDB.png new file mode 100644 index 0000000000000000000000000000000000000000..47c7911818193e81b3bf31204cf2583276dad86c GIT binary patch literal 12054 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%0Di* z|Jzz2o}Fg@$^Y@+J={1Q5uKERtrR!Lt$zan&531Ef6gMF@^TdT|Fu2KyM(J_eYtDz zAo1>=B<@D?|w@Z4KDy*dDd4k+Ag1H!tcxT_e%v!v5>YTu!G9rjGw9CEWw%%~UgGuwc zIe~Q>b1A_=Uq>|`Rb(Y>xp=Su(C*Kr;nzc}0!O&LX%5hX=!y-mpMI-4xC6o{o&ADhhZB!Bd|=iSQ47MOo1%mG5=b4h*9`HVOZQ@x|ho&VMP zaMFL@jdUx%yu8YJQh%23(fNepk5nN}0DVC&q^cFp#p&gJl&Ufb7iu+i$9U z`!!iyv|&g4C_n80Rap&(BZYWSwJ4o#rS9q=nr?Re$mbAWpW<73aZgFSwkoOlUM2U= zv5Q9l^tdLQeuOx2tx4$3;>LPg=%3pm6vN{sxb|Q2ZPP%tiOpqeTWzemoC!s|Y2K88 ze@4_5cao{H1|&!u;z9lF7;q1SxTdJx98|`#ZvI_QheP1e=cW0U#P8rgO~)2KnY_GZ z+UuwCDyE$F<;jBYClfApp+1{9NN>QYc>I=2HD1waByY2fHoK`HFNX{`vPRb@Qh9c6 zE@hopXF5N>WH+Ryk2+Pj9;YQ0pddet7zb@@%ok@2nj5|6F(!4J}*xDVJ{{ao=&2c#j=Kvlg251m0 zPU2fJ6{z9%qqjk!$B>786$t`4HDGF@bax_RqGw<0`x^lK0_gs`uB#(#chcnfD~mYdMQl zUb*5vebV+~kx ztF*@O(0#X)@dsU@m0719 zV2+fK2c;lCNLw5Wi+aRaZCo#SpXbN^s9(&zlPDzCgPEt+Y)N9bCGSfAad*y+vAUm zUJa?2F4?R5pjB1Ihb`O56xPozC7n z6(vyUX7d_i`0}Sm&B!019GcSCt1(K{-LsT1^vaB@I#KbTSp^0Q$l?RJ+PTg^{IFR1 zI6Uh}Yp#0G;$qpgJ>>qsKoa_!@Iq?}(*w9_$!~oG?7HXDF#cAjRnUj!dzixobYvqdI8C6|MA)2P;@hdL1t8FGnR;u5|O=f4hQT-7*Bds`_H_F0?~%fHUj{N0>Mq zZYvQOdp>rzSk~sA^;+YXh$Hj}3-JUCMx&vG6HZP}et+DBWgVX2fTq~pUC*?*$bifI zTFrk3a_`9e;9y{=z+jC15x2TVgPwBlq%34`G|#6#;wq^kjiCU3D*sl)Vk3m^7s|mNJWNE zgDa|IxFN>jU*cRpt5o~lj_meA zOQ?#!w2q;}>cB>?kqkYV^t>)-ZLfl!VDIQgQ&;--oY#Mrb($;c9E87=lY^%Fgzkq> zwHFUGOh(Y-lKS)5AF0^X)Ly0d+4kF&QsbodmP*0*B>72_Pw?4vg|W6Y&xp>1*^MFj z2@dasSWm-_cLT%bt)(l)gN7?3Q>ZL0*Mhr8KvLH{L5)aHi~fgI z$#Lz;KcFEc{eP24{dGCSf{>d4N1`&vsg%7tadIzecGI?{*K-FH+* z)V80k@dp2089)%FbO1$UtZZWD%ZBn`HT=UP`FrFM6^^8@6W)m~p*y3i1vPpXloOZy z7bKyovila}HM$300s4DUUZAvRhuJ4+N=*Y{uWvm%<0sZs4%yG{UB`JJ*{y&j`3dUN zuYp_7DJL$qgz*GRDyD^BTIXNtjdo5kgwu({(GHfzV@UvDO0pQ6pcQg+E5@xxrdmh9 zfU8PoTI;naY3{t-h_!aS;t}v-JQ(-d<{4fs2YJ-}=OML-X5Dy@)aIHWar`kTFAKp& z3EO1&_7=U9?c$4nwB0cu3nINcP|G6^O%z3ct`TR%m=@5Rno5&S^T5WM;fcmx2 z`hIP(XLom)Whe2FT0eXfsc|oJMsph4+3}FsF1rR3Nt~N$l2uTVKVHh*iw|uKn4VvW z5SQ)L}ku zmm1yQRbY4#A1H>9IT6)NqQa_@;y6mjugWx-VEL=&NWbOO#bML&-Q+Bvm zLmxk#RLZHdMuy$cjiV;m`Er7nwZ#CQnZP?Zo`=A8oM5?$UcnrYhXm;flki(t6=rik z*lsULy>KoUMTwJ23)&gVoF0e+0ZO1~C zt~cW=6ULi0fDIMbj^F3$-l-OETVGyhp6$MxIC*u;1`q6UKvkOpHk(UcBM*x}P+JTJ zX79g`M57CB3zPS<1*w+;I@4O_F8-+qyK3Bgf1+kDM5o##5M<$p-&NNf$V26UYiA7U zt@}f#kA&Bl5U1t8RCi3X6ZD?~qBL zh0+?Tmr-qxZ#XH4q}A6TfQe)N1-{g_#EYNIt`HE@SkhtG$xSn}6`UmODs{w2&o~HQPujMbTKZ4#{q8gRze&DWS*`294}%VaC`dc{F7# zSqFou#9)ji#xi60W<2%0|L-~8_j|wN;F$Z`?(4j+>%7kMcmB@%>0KjzUY?UYY;0`2 zw{Gg0u(7ct*x2^4adR?jN@{S1%%43F6aA}fmEEUinFS74-8;H$Z10i|Y&q^@miPPK zw1Tj)@wKu3_h5aBAF#1qdVWh!*DTncGTsw^3O~NMyshNox%8tW8N$#^o(%hb=)s|f zA9|w1lf>iovt+Zf4{^x@HQs?%*)@yKzn|yvy@~mcS z%ccFlu6{GBR;an?D5wfp4>yLJQnibW%q`ag(nA}F3L8HbXd!cET^r$MgW53)+RLvt zSNn~npCP24Av(|Jh9|=T3ACRnJLzyE;L+=HAYRe%E!mM1N3SzWyMHS2XW~r$DK-o0 zzG4mC{hO=fM*P!aR&`yVpje`KeB5qjla!mK(6aH7xfN{dCz&Gzo6bGj%Pg!s5;p)I zu=hWIlv&6)&jEa9z4XJ+mRaZ&j+VME7rcknDR#FL^XWs=={S>tXrZ-S5M$1A`xvw4 zerAY(2;Y-weI43M_0ZMgkj<&|8r<#tg)y{~J&X~!vPSU9G6rm(YrHK+U1(g)G)$L& zEo2|un%b1+j&?4YlG{YTAWx!6Ik>dW6lZ^OqD=}7tF!IM-m9`Qz6e($YEY{xf7abj z3CR$NmSSVO7ofz8IQ+o~t}%6W2HLVBvQEToQ>#Xt*R3%Oicgn~PxI6^{gbdyMk935 zB|XdhvBPPs6t%)90;ffvubB#)<=TH-SXg+3S~4ZG8FD#ttG@Auzr@NA9$&+nJb0yx zm{kW0t2~(J{zc1*vqo2dsY3DIF1luW(>bcEU<|U0rzbA8DSc-;jp+Gh{HxB+X3v6m zF^5UW&P3SaYd9P}|EvGP{x|;F{^3@DL->6 z?EnVmiR168tDA$aSo^=|ZO~U3&WWq@q1#I(lCF+^4Fd;vm5;A@x&f*t+b_B7Otf75 z;p##ok=Gv6dNu;gF~%+^u~{Li65zeq`kU{(E6s~UU+ijk&rX-t3MPQj7*cf4Bl2cg z4J8!6)rs76Rr0L%+R5IeUNGL)-0{v?Cf&Cv6xEXm{sPz8)P2P!D5@|o8yCC&%ewHE z6oXFO5tY-V@aWde9V zI}N98bZ)WFZ|DwyJ#|xLbptf|s^=!kUP-d|&qcUI6@7GVs0fH`st9v7ikYz;#^9H? zFS_i=I|$r?VOH<&i79^6v&fkCsl(sj$bzg0-4Kp(vrOUa0Fv*VE?z*1%bYe9m40Qg zNTZ7A6#!^6XV;4>JF^DQwjKsd)%R(>X?T#shZs9lFs%}|{VN?)`uI+XxSH|MY$mH2QWcggBN|bFsUHYHdNe7*sP&3)NkoIXWf^ruo&@CFN{5w-k!l|jM5Dl zBJ^0-i_3g3;R$pXP?`3b#uIaw?LPP&(p!JvJM->*O$^?ToQ~NlIAHZ_Vh}19Cvk=Df%!#88I-y-n#Y6bk^?b5I2{ll&{6X`XdDYs*PEVu? z!mZ!f>vIq}t>3vhz$QPCA8|VPb6(euQ@Y{l!L#@E2OZ?q?k2mR_C@0zHK)Ew9^@Vb zc(Cg=V`y6fb7QbJMGd*l)&UjF&P7@435$WXm+aNHQl|a>Wb(z=T1F?i`p3l8QJ8zf zHwJs!TUPzjuo<4Yw{hjBO{i;sfBwcK+po`@ydi9NAL5!B26VjO~JRgx;FT-9NA?Z0r3 zz>R7~qvwyD`{cX#-uF~TDlb$`&#FEGH|MVxkkmMV`@3kpW1ZXM4TH7TGmw?Qj0;F$?f81T zW~gwB2rnU!;Y_gC{$+ciivDg$p@t99-*8qY_vJv+kHWyJXt&~};)Pla&@$2LBh*{; zy2@Y^XRkm;ACLda+lD^qrK!MU@+oeH|f*gSq8Ue9Z{NJ|vfn{3Ua<+j|G=F(ZX6ZzuIk>rqT!rt+C$1IQP zADluIa&kaYq#kzNV1Bo?@fZTsAv_ zdv_j78a1K%ojxJ%@+guU_ox*-#_za8jrjb_d!!b=W_zrvjhZ)v+cyVfWS;T~;N6@e zlWb5b>KJc$Eym+s;8_3X|{yvg<8Pk@MT~#kugAh865!eMK+n z!hL)K-6QDX4nNW~(9D#A5~nR=bL%_0Qs!j%k~A{fPs<4_=6}P>#SM{)_LzTe ziEl)75jr1z9ur}n>f7e4SA8H^vXjI^RG*4qf&16l5uM_aoe*{|?P_j+_A_7xN-9!Fv^L(Rx1dUMLRUpqk_22~5jT0N_dKr$LjY|07a<|t za^-!@<(EF!RIcPygYqG^I%{rhqI!fcR7;tf+l6v{LtA<3l-$+K=O~>8bg@|es&m_= zgqf=QE?(u|vzh#TTm z_!4!6U+}@Vqr4mstb|5aqfV=dn~_xyTCC<>(ER%H;jMdB$b>CG{uCncLCCSoN)+j0 z%JirmQd;M0DNPm+u)-QcV&n%!F>kDOW&pm)lm^Pio`PC6JG>7jb4=^Xh3@ux#>vm2 z6m~*DE|8EC_*M+pB3*Hz6$qeIp(xHgXP8})!#ydEWt;k# zcfqn7x6j(}2~K(+5JD|1G59UlgAx))&5=Hx)g>;p* z66w=fKHc+Kkj8K;VDZvW_iX zM->Ks?YnsS)zrtoMm0oc0u?Ehqpyjuz}v4kc^P?wG~J=6iKi)K51rX>@6M2GYjMee z@t*fTMkXXyL~5H6ED=sPyK5z#iVb!p*03@vg!J)F8IpMm+!kQ6lp41kv=g4>IH2A? zhr5BhjtV-l~hf!Ai{l;S!jQ9c+3GD{L`4 z^^fhPlCG3BR-dS2#P-A$($}FDgy>?BOY#McesK@=oXg`gCnT=8EoT4c7I2{p4o-B+$bjcMjZdi+PJZF{Cim zk4I_hc+j14+b|9CU94jJAFU$oA(!0GE$dFL$Pg9!;3;Xq71in>OlO@4SBl;vn&Oo)G1M$X>TbBiPNT)Cqn$MRAvciO|b%@^)qqL)QDRVCzP*^ z*KfjX3;L(TLO=B$6^+N^Y;x!zj+*jqcHu>Ah>3=rBwfxmm7dbzwk?jU z;{?iD>&xJW8mzc_?^nM(_-HFi(yZ=|&WruTr5OW$DZSpr!p-(8MH}HR_go$bSKO~Q zt;kQRafjcWytL1+v43-UyZ@n+BBo_I6CpO>Zx>yhmA0BLoDmx|8?qf*9nUD8=~9pen^)YuBphTZ|YH&l+HsW=t;uzb2Ff?Q5rHyT?s2|Xh3 z6&n&1%lFLNzR9;1K38Ak_BIZDx;y6Wr9}q7uA}Jvi8MQjhx1uDv8c%l6$Z6 z1n@7#j1du_-LLvL2TP~A9lW=d=kk*P{z;S5E!D+6$<@-1SFe_ws%h$u2su(WCV_uy zD~3ML@gTD^Ye>iTwt*-*wFfq*a4{LL2+qd(U1}NO?EL|%r+51H^Cy^|YU)9c!n3Th zT0ew@Z1;*k5pQUs?btPneX(mmHs;*(Qrdhjbse~3It+6;re|0Djy->L(n(3RS={8{ z=(s6+JfI=v?rH4E`uHnpP9St*>Ui3kcd>Y!e0~_UQE=EN6n)kJIM6K1BpDng1oWgm zS`RQEGt_n&3EGc%g{>q_X2nG@Cc{zpjmji6=weV-XTWY}Pbd_>Q_s$|FE8ql$ z{*c~jzRsM5$&ZNYvN#jAud*ysf{iWDk^{*4y;8-^=OYeFK6l|D@e#q~-3?xV`7p-mRXx~Q6?_ahRp0*W+}K1NwN#v zj{xRYmS=%=T;B=kJ*?b4%$LgxaXBrAbh0$V8OLgZwyrE&_0f|uOm)VT+j_QczvLKc zbr|#-tLxX9P$cbKAF{cm4;ohf4j^|EsxnNUEY{#EGT3*1JsX)Axs=sYMX-#~#S9CpJ^tjmI_P01#~qLnPwh zT5wXXsxYhrb#Bge{qfDBPMX35NxC1ob;5%O zv)8~ai=IVYgZ$7gxMj~#`ku6dEbSHV6VyxTi4(O~BRKyWQL)jvJa_d|hnnhGevxKX zu3v7#!9_z@X!|K%!ix_Oa)XuTsR_f)yv=l6yU=-Uatr}WaG4xAJGk}Dl;DEeex|;e z+n%$qMf!5)?TD&(#GGX6#LjZB2k5;0CE=Fw!EG%46zN{>Av<++`7T&qc+W`YHeMkzVO?4!Vc1iOM~`_Y2@#% z<``9pmP$JevfyCq{jKQY($s7EWtg)kwMW&Jg%=j!uUgs)kOkL_f2kQ}0bCmxF>?## zXO9qL_j{26SLz;8bK6#(rhkF99?0?~s@{cVzXp5~;wjLrwdd-b#Unlo)wEU~+?eAF zs2dkpfOZc0#DYg7yT`3~C1=vTN$s3tLZvH*6^?*3HRAYo$Pd&be1~IuV)YXrI`7h- zamr(dz%`BTM&v;Mf`z#P=tQYz@lyh+>rit-YX0IURRudBt56;XZg`{nH*qSWP5 z&0N2{f$tS|C-o$vzSy-DQ+nYahT)cj`5$?wM#ZQQri*(EYJjJMA=_^}7&FU+G;t3= zi}%pa-ZB5}2$#Ulo*#STAL&C_hkAsgSL(y5gvIw$dN>s9#!@1$88ELV@aG8Gx!Qv# z)%{x^bb-c=xKEGXIaN@V>SJq8DboYxt!}v-tv&li1gC^q=~t4RWiGWq!VB45qfT23 zfn4Cp_b;M1jd*jnsN6rS>BfA=SQv8m4^CJ?&4=nEA z6#VIdMozK`9^1Whin;=KMDee_9l^>8f3`P=(mowTbh}=IFeIoHKB<)a5ilZ0OI&WEZKBxf+q0!0)RZ z53$If*>Ir6~s(UvbcviQEFb6(JwtqI&W!|i9^K; zE^beisxx9_{wktdZ+>#Fp|p6p;}3!~oh)G0lyngcs3AvafA`e#jQ&%dIxMgY(ZGSXpx7@2Z-aV61fRuCJc?O#|_tt%huKb{n&`IQbzO8C3*ol2(o+^AO1JYB5LhC=%=}x<}Mr-KUZd+6l*ZXQg;&t-n4?w5{TjdbiSo4qbSq z{$tyvsDkB3NR^pPjt$%^#GYE`t(vTv;227{L_(RHuMU^;&XMJhekxdG8dmqVY=GZe z?zggBo$p-bvncZwA4OKSQ~Reg7D=hsu$`kx!YvPxPMGHq`&0XKNJg3L3q}hO)59y4 zUGN@cC+$tX3-z_q^e+X~uC*tcE^3c9ZAe`q!d_2M@>%^LrX#4#V8`M+r%*K&oPz%= zy!kgiagLcu*_L2I54IZpe_@qf&1Yhgves7Y{=ebT_CY@F?PEKKS^c9%gta#QGW|1J zEqDp{8%)9efT=&T{ZRUQxczbkdUvS(KP|niv=tM7ZM;A8_rssD%Wm?liag7hYsO2? zyYMZFIXz(QEo?ul;ln&HAHe9h$gWF7{vG2#a_w3LCW33v_1Q&ItIu?ZOgq7ZU&mlA zyP)pB@ZY3PW*D@soR8Dx>)kTT*vM9f1FjsZ5&LH3a<3}U=55QZq^ZARDUZb$l7c6i zYXXhxN-W50UW=eM*|O$U2$H`o(x*bdAMb-U|8&I8vdm?&G8bU_g_=2(ZHs|RkWN?l zb;kpUN8mm0E)0h-We8JTPCxc|&+QYH18fl3W1!AwDA-5%xMfT+5R1AQab#Z#wGC^bvp#{%L+h>tfA6G+Z^pJabOVB&oqj=%@3lP}SKvCvqz4a1+&-ad555Hd{M`3sn6iT-Ur27mt z;oxPp4&-@ki*fW!+W(SGm0A$t0+l zZ9qVex@r`m;v&F{=VaN``QFuNw>Ae1PYBXK=>@vgP3!oxp?Aj~bE!DIEaj97WphD= zT$fY(A#dU&V2(W(Q|RmJYnJianfMkfCYEKdmQ%D|=h5a|XG?de3+FIizkUyklsKte z2<|5gt#~z-I@mvYSs!t0XD(2mHwqVILGRuYzNkcBa3gWg7zpb|#P5@47}S$iWSuyT^?K&XAKar2!M zTFki9;cex~;hCwAQJ;)W3G#$~hoFc_E)z!wDF%@5YD8GuHyN+|>?$rt|J#G~(BWde z+1|hHO|z5{U_G zaulAbYp|J+c8#eKX_VC|pI{Iib1G1KX3fTYCl>N`$k@?7umu76P7)%ui~0-)1@I!l zI!=G9+rT%&e%gCP=913#gQ%0+*jzqU!$CILi6E6`)eqoNmr20=!4DNDwNm>P*;9e+ zDI?T`lNVHY0k~O5-;DWuFH2J$Y@dQe39X~jHRhgn@zFU-395MrJH=L~!S4vK&ixUg zf+?JDOmjx)dQ$-+ab(D%a!z_}l@d0WN$uPt&#QazMm+9jjQTdIO!-Zxy#qIx)Lq6~ zF25sH)`Y^^6;~h(l?A`YQ~fKY&l@KCTI8oj&wJ3zX=f+&>$*Ng=#^65;!?>^wmm6D zU-91~hP`LPb|z3d&=vwJ7f4QN@IAN!+r6}$APucDacf@RAHUci4ZSGlw3^xq`0$`0 zCNUtZf?jOKzU8rWn7{BqeiHg3p``?=FsK~YN0&+~q1C!s(f|s)h-Ea8ggDyMLj`46 z2oDT#zWjph@KDcnCYqBJ&EbpnS9Kn65p>ZJDmsvs8=^M-QC9tQ0~rn1FXEcbLHZ&- z38Ox1TSmwA%D|63l^~+H$XnB{G|%}-16qmqD%D~~-86uZRq0ok^tGEMl2i#&lDRZ` zi^pQo>bf3%v2bVwKH#6t#f;fX?4#WxE_yn1E~-o^Dsq={@=dMv?YYy?B~Py|eQ4(L zqKwm!xsb1h#8(8VG--kjU*?ZZ>O;#2@ibE=^+VkLQJ*z>WZJUdBf^$Xye(vA=+n)B zuAfug6{;RBaY+gkazIO}s14;F`KRHtz7S`zLh@`YN^Trvmw4U+P7KA+d&)!6U@SIA z^9glZrpM+QY?`$c9)g=~Qi2L{e%qQ)L0mQ-H}Pt(hC8`mOB(-cNiT9WE= z77MiancRd)SfnxvcSU?V7bA94HCFBfcR|dZoe6%)zC9M|4hE96L5FMQ8&?$kZ@ zEd9HXUx?nmIVyw{LIRPeMaBviA!b=7k#uTH`cxU147f=zP>te^X}2A|+mGxnU?7y& z;3o3VpCq^ay5xjkllm0;8B!K| zYTc8uWkv$bmu+fU5_sqka7SlSr2;+FE=_p7zJsE=K3GhaYmQ~NQUHj}_E-(u|ANSv zCWBQeXVd5>O#4^s2&2Y>i**~LgM=3p+S(JqtB|!i8`qK^mYE;e09m}{6fsxfm+IJg z-N?iK)MIJVfIss=&K8I2Y z8Z|ZQmb@0Wpdp?9ZciO0^eIhJV;hms+p>yEOT)L$yf81%(yaUmjj1Xm7te-zX3GCG zEI{Oz%#e^%t{MzC3iFtznP>r-Qdj=!yqOIMZhsbp8aA~ zRaBcu#Z%EUTP%nbb^YRUKH7#fM0p`f&*bwua8xg=s*4GnfL+4&Rua!8Z#>Bso-U`< z)TlKYEt-gB7#j0;F5|==Om`IuYQ_nY&TKguS{Z{B#U7;h41}e3F1PwYW}7>kPOy+? z)Rdx?K;0e}1`pAlV5wb2n1}8|7gvgJ3lq)k68rK2`@XI6- zuJfw%7SZ=}yf7Z|UTr-Vf{M=r8&u-~Br#JN(*x>iJ)_$?p7OVD`r+;0CmzsfUv2Go z?HV~3Hxb<1139)A_%10plmDt?DE3NiwyyG#4Qj~O)*3;*Kw=ST#8`pe;y7}M6|*>? z=jGxwu77j9n9HBhF47>t=6phg^BQqBaI#v8EEFLe?ZIu~j-lV3`&bO4l(`u;L^}H| z@+8))PARawu)B9%{xMb=e!hPpw z_v=Mmac;^=YIe*d^4+0Tpr18PB46mb*rKZ~ADtHBY_n^q9s9MJH*@vA zz{DrOPd_9oB=#dYbN)fi9Do%2xPw*dN+udE(~i^p`Lpmyas2 zu~R+=5rDU8xY)kaY9QPRy-A3Wc3*i%7oIWSZ5e^~HA0AM+#f-*u4}a|C%@>n*!I-V z;{#k>P(8bydd)O2%=(<2r7ZHu$KuBRbgfS|9KeM*j}g!Q9IkPN;@hY6@}t~v`wok6 z4~EXZ|Du}T7&J?NFkT5I^jUX^&(Y*JvC%V$#WLeP3xO+k(?FYP<=r8>BJH)BU~<5T3C+(*cP48Oy~QA3HP=6Rt>!Z zKJSP21-w{w1U@+lb1gsk6nK#eRm}H&&7@m~-{MLm8Yvd7MQ(%{@!D|Rf%TB1S}9ZE zpvHBePSMWB-EyG`ecgb+{+#b~F}-~K>)=CIQw8RR7~_T|t9)+tH6^4cY-GcI68jNl z9`@nq6-F!$U!`iuKZ3G3Vc|^KCNEB|MqbyflsmkXKR?O|$Msju zVHt*^-$j|d2A8VtRUVW*9d0l}nfS~h(%f7x=Xb@s)R`M$p1aYZEm}q&wFu`607()C z2r{Tc+k5hyN7DYB1>n--p16-T-x}lZ@z}-8d^T7x>$Z^#5*W|@TQhHe??L5V6=>hS z@sI7|w-gc(q@fZ22n3-?&=+&H@2~&Z=h;xA}UWIZiOoe9- zj!DwlbxjVo@aWv6SUh3SIY*zAQ;^}B*Nc=If~`w2EB z-2vjD9P-41bs_FCWp;g2Gutl4Z8ffD!E!dK2rM=_g!ibgF2^zd^lWEhvUdbn`unc!=`5 zqZaq+``wQZYIAG~d9oUQh^KP&c81o0(~oi0dT8DfsMu$q0_sW$LN}IeN32A)UAoEk zyo@L9mhjsEOmZu7)uWA^eI#AryVKRCe6u7l6k|4r)S9 z>K@$~!L%HaAzTg{LFPNddv%rh+Uh*!NOzr!kyW0!!+H+^yQIxpo~ZyYR6z;)t)n_+ zKf?WpD^Q(oqmPVeJ0d~x^w%J&cOmLxYZT8T_ zr~CHJKKl_L=6ACUYYy4s26Biv7*#Z!EC8!t2+2mI4*x&FDuEV}8pHDG1KLt3$gFmP~xddiakyTlN32 zc1t81RvTOMNv);N>Ho~~J12Q;H+}IRLuFgaxmn%+izWL5M}IHEenh(jU;~y5W2gQ!^YkBfiaK`Ut^Z#DRKMCdV8-II% ze=7d0?B7EFdsF_%{6}g2#~1MOY2E(Kdt#YNv-L-5{v7AOCHnsrz+>sdS_6I v`nSIECrvZ;pSim#8$SHn3%@tW^V1e=e7nfH{$oWStM%4(BfZM24$=Py#D{zW literal 0 HcmV?d00001 diff --git a/examples/java_ol_postgresql_odo/README.md b/examples/java_ol_postgresql_odo/README.md new file mode 100644 index 0000000000..ab49506d5d --- /dev/null +++ b/examples/java_ol_postgresql_odo/README.md @@ -0,0 +1,489 @@ +# Binding a Java Microservices JPA app to an In-cluster Operator Managed PostgreSQL Database + +## Introduction + +This scenario illustrates binding an odo managed Java MicroServices JPA application to an in-cluster operater managed PostgreSQL Database. + +## What is odo? + +odo is a CLI tool for creating applications on OpenShift and Kubernetes. odo allows developers to concentrate on creating applications without the need to administer a cluster itself. Creating deployment configurations, build configurations, service routes and other OpenShift or Kubernetes elements are all automated by odo. + +Before proceeding, please [install the latest v2.0.0-alpha-2 odo CLI](https://odo.dev/docs/installing-odo/) + +## Actions to Perform by Users in 2 Roles + +In this example there are 2 roles: + +* Cluster Admin - Installs the operators to the cluster +* Application Developer - Imports a Java MicroServices JPA application, creates a DB instance, creates a request to bind the application and DB (to connect the DB and the application). + +### Cluster Admin + +The cluster admin needs to install 2 operators into the cluster: + +* Service Binding Operator +* Backing Service Operator + +A Backing Service Operator that is "bind-able," in other +words a Backing Service Operator that exposes binding information in secrets, config maps, status, and/or spec +attributes. The Backing Service Operator may represent a database or other services required by +applications. We'll use [Crunchy Data PostgreSQL Operator](https://operatorhub.io/operator/postgresql) to +demonstrate a sample use case. + +#### Install the Service Binding + +**PLEASE NOTE:** This sample demonstrates the use of odo and Red Hat Service Binding Operator(Community Operator) version 0.1.1-364, available for installation via the OpenShift OperatorHub. + +Navigate to the `Operators`->`OperatorHub` in the OpenShift console and in the `Developer Tools` category select the `Service Binding Operator` operator + +![Service Binding Operator as shown in OperatorHub](../../assets/operator-hub-sbo-screenshot.png) + +Alternatively, you can perform the same task manually using the following command: + +``` shell +make install-service-binding-operator-community +``` + +This makes the `ServiceBindingRequest` custom resource available, that the application developer will use later. + +##### :bulb: Latest `master` version of the operator + +It is also possible to install the latest `master` version of the operator instead of the one from `community-operators`. To enable that an `OperatorSource` has to be installed with the latest `master` version: + +``` shell +cat < What is the pgo CLI? The pgo cli is a terminal command line interface for the Crunchy PostgreSQL Operator - it allows you to create namespaces and database instances that will be managed by the Crunchy PostgreSQL Operator. Then pgo CLI was installed as part of the Crunchy PostgreSQL installation process that you followed earlier. + +Use the pgo CLI to create a db cluster instance in the pgo namespace you created during the installation of the Operator. This instance will be a postgreSQL db managed by the Crunchy PostgreSQL Operator. + +```shell +pgo create cluster my-demo-db -n pgo +``` + +#### Import the demo Java MicroService JPA application + +In this example we will use odo to manage a sample [Java MicroServices JPA application](https://github.com/OpenLiberty/application-stack-samples.git). + +From the OpenShift terminal, create a project directory `my-sample-jpa-app` + +cd to that directory and choosed the namespace we created above for the application: + +```shell +> oc project service-binding-demo +``` +git clone the sample app repo to this directory. +```shell +> git clone https://github.com/OpenLiberty/application-stack-samples.git +``` +cd to the sample JPA app +```shell +> cd ./application-stack-samples/java-openliberty/samples/jpa +``` +initialize project using odo +```shell +> odo create java-openliberty mysboproj +``` +Create an OpenShift route to access the application +```shell +> odo url create --port 9080 +``` + +Perform an initial odo push of the app to the cluster +```shell +> odo push +``` + +The application is now deployed to the cluster - you can view the status of the cluster and the application test results by streaming the OpenShift logs to the terminal + +```shell +> odo log +``` +Notice the failing tests due to a missing database connection. + +```shell +[INFO] Exception Description: Predeployment of PersistenceUnit [jpa-unit] failed. +[INFO] Internal Exception: javax.persistence.PersistenceException: CWWJP0013E: The server cannot locate the jdbc/DefaultDataSource data source for the jpa-unit persistence unit because it has encountered the following exception: javax.naming.NameNotFoundException: Intermediate context does not exist: jdbc/DefaultDataSource. +[INFO] [err] java.lang.NullPointerException +[INFO] [err] at org.example.app.PersonResource.getAllPeople(PersonResource.java:74) +[INFO] [err] at org.example.app.PersonResource$Proxy$_$$_WeldClientProxy.getAllPeople(Unknown Source) +[INFO] [err] at jdk.internal.reflect.GeneratedMethodAccessor537.invoke(Unknown Source) +[INFO] [err] at java.base/java.lang.reflect.Method.invoke(Method.java:566) +[INFO] [err] at com.ibm.ws.jaxrs20.cdi.component.JaxRsFactoryImplicitBeanCDICustomizer.serviceInvoke(JaxRsFactoryImplicitBeanCDICustomizer.java:339) +[INFO] [err] at [internal classes] +[INFO] [err] at javax.servlet.http.HttpServlet.service(HttpServlet.java:686) +[INFO] [err] at com.ibm.websphere.jaxrs.server.IBMRestServlet.service(IBMRestServlet.java:96) +[INFO] [err] at [internal classes] +[INFO] [err] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) +[INFO] [err] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) +[INFO] [err] at java.base/java.lang.Thread.run(Thread.java:834) +6590 INFO org.microshed.testing.jaxrs.JsonBProvider - Response from server: [] + +``` + +You can also access the application via the OpenShift URL created ealier. To see the URL that was created, list it +```shell +> odo url list +``` +You will see a fully formed URL that can be used in a web browser +```shell +$ odo url list +Found the following URLs for component myjfstesingapp +NAME STATE URL PORT SECURE KIND +ep1 Pushed http://ep1-jpa-pgo.apps.slobbed.os.fyre.ibm.com 9080 false route +``` + +Use URL to navigate to the CreatePerson.xhtml data entry page and enter requested data, clicking on the "Save" button when complete + +![Create Person xhtml page](../../assets/createPerson.png) + +Note that the entry of any data does not result in the data being displayed when you click on the "View Persons Record List" link + +#### Express an intent to bind the DB and the application + +Now, the only thing that remains is to connect the DB and the application. We will use odo to create a link to the Service Binding Operator and will manually configure the resulting Service Binding Request to 'magically' do the connection for us. + +List the services available +```shell +> odo service list +NAME AGE +Pgcluster/example 1154h25m9s +Pgcluster/my-demo-db 2h30m33s +Pgtask/backrest-backup-my-demo-db 2h28m8s +Pgtask/my-demo-db-createcluster 2h30m33s +Pgtask/my-demo-db-stanza-create 2h28m47s +> +``` +Create a Service Binding Request between the application and the database using the Pgcluster service for the DB + +```shell +> odo link Pgcluster/my-demo-db +``` + +push this link to the cluster +```shell +> odo push +``` + +You have now created a Service Binding Request object in the namespace on behalf of your application. We must manually configure the YAML files associated with it and the Custom Resource Object associated with the database in order to link them both together. + +You can see this Service Binding Request via kubectl +```shell +> kubectl get servicebindingrequest +NAME AGE +jpa-pgcluster-my-demo-db 36m +> +``` +Or, alternatively, you can inspect the SBR via the OpenShift console in Administrator view by navigating to Operators > Installed Operators > Service Binding Operator and clicking on the Service Binding Request tab. Select the Service Binding Request Instance named `jpa-pgcluster-my-demo-db` + +#### Manually configure YAML files + +Access the OpenShift console and navigate to Administration > Custom Resource Definitions > Pgcluster and click on the 'Instances' tab + +Click on your db cluster instance name 'my-demo-db' +Edit the YAML and add the following annotations to the annotations block within the meta-data block + +```yaml +metadata: + annotations: + servicebindingoperator.redhat.io/spec.database: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.namespace: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.port: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.usersecretname-password: 'binding:env:object:secret' + servicebindingoperator.redhat.io/spec.usersecretname-username: 'binding:env:object:secret' +``` +The complete Pgcluster CR Instance YAML once edited: +```yaml +apiVersion: crunchydata.com/v1 +kind: Pgcluster +metadata: + annotations: + current-primary: my-demo-db + primary-deployment: my-demo-db + servicebindingoperator.redhat.io/spec.database: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.namespace: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.port: 'binding:env:attribute' + servicebindingoperator.redhat.io/spec.usersecretname-password: 'binding:env:object:secret' + servicebindingoperator.redhat.io/spec.usersecretname-username: 'binding:env:object:secret' + selfLink: /apis/crunchydata.com/v1/namespaces/readmeapp/pgclusters/my-demo-db + resourceVersion: '114097331' + name: my-demo-db + uid: 5e25b9ea-7d11-45c6-9a6b-0165a2dc8dc1 + creationTimestamp: '2020-09-03T20:15:42Z' + generation: 5 + namespace: readmeapp + labels: + pgouser: admin + pgo-version: 4.4.0 + pg-cluster: my-demo-db + crunchy-pgbadger: 'false' + name: my-demo-db + autofail: 'true' + pgo-backrest: 'true' + deployment-name: my-demo-db + pg-pod-anti-affinity: '' + crunchy_collect: 'false' + crunchy-pgha-scope: my-demo-db + workflowid: 89863c51-72b9-4e6b-85d3-25b8d51f11bb +spec: + BackrestStorage: + accessmode: ReadWriteOnce + matchLabels: '' + name: '' + size: 5Gi + storageclass: rook-ceph-cephfs-internal + storagetype: dynamic + supplementalgroups: '' + backrestS3URIStyle: '' + port: '5432' + exporterport: '9187' + ReplicaStorage: + accessmode: ReadWriteOnce + matchLabels: '' + name: '' + size: 5Gi + storageclass: rook-ceph-cephfs-internal + storagetype: dynamic + supplementalgroups: '' + collectSecretName: my-demo-db-collect-secret + resources: + memory: 128Mi + backrestS3Bucket: '' + clustername: my-demo-db + usersecretname: my-demo-db-testuser-secret + backrestS3VerifyTLS: 'true' + tlsOnly: false + pgbadgerport: '10000' + backrestResources: + memory: 48Mi + userlabels: + crunchy_collect: 'false' + pg-pod-anti-affinity: '' + pgo-version: 4.4.0 + workflowid: 89863c51-72b9-4e6b-85d3-25b8d51f11bb + name: my-demo-db + ccpimage: crunchy-postgres-ha + user: testuser + standby: false + ccpimagetag: ubi7-12.3-4.4.0 + podAntiAffinity: + default: preferred + pgBackRest: preferred + pgBouncer: preferred + backrestS3Region: '' + policies: '' + backrestS3Endpoint: '' + syncReplication: null + backrestRepoPath: '' + tablespaceMounts: {} + status: completed + pgBouncer: + limits: {} + replicas: 0 + resources: + memory: 24Mi + backrestLimits: {} + customconfig: '' + pgoimageprefix: registry.connect.redhat.com/crunchydata + shutdown: false + limits: {} + WALStorage: + accessmode: '' + matchLabels: '' + name: '' + size: '' + storageclass: '' + storagetype: '' + supplementalgroups: '' + PrimaryStorage: + accessmode: ReadWriteOnce + matchLabels: '' + name: my-demo-db + size: 5Gi + storageclass: rook-ceph-cephfs-internal + storagetype: dynamic + supplementalgroups: '' + ArchiveStorage: + accessmode: '' + matchLabels: '' + name: '' + size: '' + storageclass: '' + storagetype: '' + supplementalgroups: '' + tls: + caSecret: '' + replicationTLSSecret: '' + tlsSecret: '' + namespace: readmeapp + database: my-demo-db + replicas: '0' + pgDataSource: + restoreFrom: '' + restoreOpts: '' + primarysecretname: my-demo-db-primaryuser-secret + ccpimageprefix: registry.connect.redhat.com/crunchydata + rootsecretname: my-demo-db-postgres-secret +status: + message: Cluster has been initialized + state: pgcluster Initialized + ``` +Save this YAML file and reload it. + +Navigate to Operators > Installed Operators > Service Binding Operator and click on the 'Instances' tab + +Click on the Service Binding Request you created in the previous section and edit its YAML file + +We will edit the `backingServiceSelector` . This section is used to find the backing service - our operator-backed DB instance called `db-demo`. + +Replace the `backingServiceSelector` block with the following YAML snippet: +```yaml + backingServiceSelectors: + - group: crunchydata.com + kind: Pgcluster + namespace: service-binding-demo + resourceRef: my-demo-db + version: v1 +``` +Complete YAML file once updated: +```yaml +apiVersion: apps.openshift.io/v1alpha1 +kind: ServiceBindingRequest +metadata: + selfLink: >- + /apis/apps.openshift.io/v1alpha1/namespaces/readmeapp/servicebindingrequests/mysboproj-servicebindingrequest-example-servicebindingrequest + resourceVersion: '114116646' + name: mysboproj-servicebindingrequest-example-servicebindingrequest + uid: 20983d16-59f2-4b9b-ae56-e3371480821f + creationTimestamp: '2020-09-03T20:47:16Z' + generation: 2 + namespace: readmeapp + ownerReferences: + - apiVersion: apps/v1 + kind: Deployment + name: mysboproj + uid: e3ca87f2-0208-4b00-82bb-db4345f834dd + finalizers: + - finalizer.servicebindingrequest.openshift.io +spec: + applicationSelector: + group: apps + resource: deployments + resourceRef: mysboproj + version: v1 + backingServiceSelectors: + - group: crunchydata.com + kind: Pgcluster + namespace: service-binding-demo + resourceRef: my-demo-db + version: v1 + detectBindingResources: true +status: + conditions: + - lastHeartbeatTime: '2020-09-03T21:47:32Z' + lastTransitionTime: '2020-09-03T20:47:20Z' + status: 'True' + type: CollectionReady + - lastHeartbeatTime: '2020-09-03T21:47:32Z' + lastTransitionTime: '2020-09-03T20:47:20Z' + status: 'True' + type: InjectionReady + secret: mysboproj-servicebindingrequest-example-servicebindingrequest +``` + +Save and re-load this YAML file. + +You have now created an intermediate secret object called `jpa-pgcluster-my-demo-db` in the cluster that can be used by your application. You can see this secret via kubectl + +```shell +kubectl get secret jpa-pgcluster-my-demo-db +NAME TYPE DATA AGE +jpa-pgcluster-my-demo-db Opaque 5 13m +> +``` +Or, alternatively, you can inspect the new intermediate secret via the OpenShift console in Administrator view by navigating to Workloads > Secrets and clicking on the secret named `jpa-pgcluster-my-demo-db` Notice it contains 5 pieces of data all related to the connection information for your PostgreSQL database instance. + +Re-deploy the applications using odo +```shell +odo push -f +``` + +Once the new version is up (there will be a slight delay until application is available), navigate to the CreatePerson.xhtml using the URL created in a previous step. Enter requested data and click the "Save" button +![Create Person xhtml page](../../assets/createPersonDB.png) + +Notice you are re-directed to the PersonList.xhtml page, where your data is displayed having been input to the postgreSQL database and retrieved for display purposes. +![Create Person xhtml page](../../assets/displayPeople.png) + +You may inspect the database instance itself and query the table to see the data in place by using the postgreSQL command line tool, psql. + +Navigate to the pod containing your db from the OpenShift Console + +Click on the terminal tab. + +At the terminal prompt access psql for your database + +```shell +sh-4.2$ psql my-demo-db +psql (12.3) +Type "help" for help. + +my-demo-db=# +``` + +Issue the following SQL statement: + +```shell +my-demo-db=# SELECT * FROM testuser.person; +``` + +You can see the data that appeared in the results of the test run: +```shell + personid | age | name +----------+-----+--------- + 5 | 52 | person1 +(1 row) + +my-demo-db=# +```