From 2eefd56bb97cb40d98c0568c88c13b675e470193 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Fri, 16 Feb 2018 14:46:04 -0800 Subject: [PATCH 01/30] added container analysis samples and tests --- ...ntaineranalysis-0.1.0-py2.py3-none-any.whl | Bin 0 -> 62707 bytes .../container_analysis/requirements.txt | 2 + .../container_analysis/samples.py | 343 ++++++++++++++++++ .../container_analysis/samples_test.py | 178 +++++++++ 4 files changed, 523 insertions(+) create mode 100644 container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl create mode 100644 container_registry/container_analysis/requirements.txt create mode 100644 container_registry/container_analysis/samples.py create mode 100644 container_registry/container_analysis/samples_test.py diff --git a/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl b/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..675e4434814d05329d0d16d95e09a0181060d0d7 GIT binary patch literal 62707 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 Z4Tc(1lTeZ0*Yf9;z-cvNEv7WW zjBAcp@J#Z}mASiX*fT9bttTWUkpQs<*g5e4Lccdhi6O+su~XiSDThg`yjV%BwX;`m zPRtHL*Y2I!=QJOGru}|_^k(dNKt%}yhkdJ$o8MV~&o>~gy+RuT zgVn;+aUqmAcCLxH3^xq?g&{{+9Oh~R)mSRHBT}6%IDR5QK%)J2Mq9CWj>d{DHkim8 z45J*4dG(n55DiMVbFABd_5+lls^mo?s5YlCMYif6f&7+oxunR5ds2?tdo%Xe+F%?&Lpb4Y7;dcQVeGc+qSsi}+{%iHR3wdq z;xY>cRA=OHuBoW>#DaacOTQUP=vZo|K5pfLmA+uoKKchyRsKlw*^e>{PlYm|dA)q0 z+ClCVS$02b*UZXUqTVVxIs*@7x`po__m5=C({7S*gVPXpbnWMJ*Z3x}2qh19j6VkN zfJpz4pw+8jqSY7>K4Qrkl%WIxT{#I!c=Sus1OgTDQyrBgo<18jfK4Lp(-9q~fUgD* z!(7)k;~KrkOa{WH<4Vz~hviZHTVpM-w~QcNBd^YRPAu65y)PMt@>g@g)gEsrtK=oM zmrOJ3vy7uJPVL3>W=hvW8pZ zZ}_}27E0iEI^)lWam#hGF8z>up8z>#oc}6HfDI3CQgn~uO#=-X}8 zFS^lgnbSuVPijGkl`=4oj9X;oR4g zny7Q(KQly=#F)zurOD|`2L|viH)S9T$-4`l1s}z#*%=Vev+B$j5QJ8f*PXC|^dR4` zo4b*K>Y+ZP->i{=^w8h1ldedBw(;Ju=a~zD6L`v_ZGgY2p|T9bbVCNsne9!T+Sex( zaSKOP*sVf4S`1$y@F4NHu=o@|t!4+284ePd{NaZN^(8*jREr9g$9sRc!*u>4J=-11^!i1f*k zU6SQef{*>8unNfpX!NPW1kx7zRw2`{^`dnDF#cCA@?XaXK(K>>JO8PSctivO()s@( zCGoFgB^K8IoE-7mNtd?`5kd;T`-XYI8*QBzErP@?10$m^g$_e8)25sn_Mhwy-#iRx zFtl#-7ea(6t~h_2?M+~f9}2#k5)POjVB_b78%CexA4bA{U1>Xf7mfr4XAMk236`M1 z&?6oeCW*H~Nt)#QjSQb)<-jmY+yleTg1$jUmG!0tHjj|b0b*37G^madz=^l!-g`3r zyweeO#ZzxO<7(Q{-0`y5Ldd_i{(Fo^zStiDksiU_2m(I!MODzyIHE@>f%oYK(DB+I!EnQ8=Y(gK>M>G>s(>wYu z929PF`H+CL@%?~Xs!~>8dZ|&fPO@ub9^A4r7=NBG$aAa{9XSB*>+9N`Wqr(~(l1^s zzg=J=q}ut?-|S4-megaWOR^Y8j`RL`o=Zr0$Sk`hF_0nj(Q+>?ycIg6ikN+Mh=$hv zL^b0s5%z5G#-NY{8P^Uoa40*?jU)baGtYGHb0 zAC$~}CKcwVs{-^HdT}r$8L6@u7~vy74!F#f0Bt~-PPHHCf8pg{DJ&sAYA^vPARuQP zARxhiA1~$(Zub8>gN<$Lvf26K;~z%xwU{SebaUI@)0cvXz%_&#f(_?2b1g>`3uJFM zMLVVR{grQON{U-Cbz(4w6zl5hy4%o8%Aa+MW>^RR_w!*%)0y;y#$xo<$MSA=7r8)E z&Z?a#ON&W-CL5Wu4B7X_gJBY1HCt9#z(XMU6$;S5$MbU{7-&q%nmmt>yqGA*Dm28d z?c5pi6{%$dg-MnyjpIT?BGJBG`)KPyMO02?)*3HS%2@FMZeT z=-F}LWvgf>U8%;!Ozgh$;rBr6CJa3MoRJ%qvn^g1#MT_V@|CoL0TXvcFdKK3EhTX+ z!@9r zha9q#xy_pz#g^yiBpV8S3Rd3B@g9Qm*GIK{l5*%%{t0GEMAsYfFNL{)B;lS;qF1sa zHf0A%ZzhtepgWW$05&v9TRMcEc=&$aU`x8SHIUyTB~oj-`t|Kt@O#m^>x> zr%FdOoMGw=RBmXH{BN7ibX6bOfI2L?Q^xTttL)YXm2>U&<_kS$jA)UpN_AQ=Q z=YiGiJ|Qeai#aBM17CwSyAY9?#ke%Jyd}*Qxn}V@n#^e za+{TbpD>2qlsK}>e2baFQ*w)E5ifjc7YqW#AzD40H~n8FI8b4Qk7%fNkbxbcV`Knm z=dd_vo*#M;lEk1(>G1wS=c?BmW4(OY=}&}h&gC}ja=Vl+S-bisTZvn`a0O$DWqB{y z=pKfHZ@1|s`Qw$SL1bcG2X+A^(W0d?GDn6Cg;|ney!Blj#qukKgX85+mwi*^Tsm6} z{Kh;Nt%whWYkIkgu=B+!GoEV`Rh7VEC1>{VL|*FKbS$*lrGl_6WU{j+bL1i1A7_vJ z2P_i1SA7s_tR*H@_}Y|>b1+vLRCvBV;~y|ShdkOfL10z6GdhQTXTove^ZYAs!CDvpb1NY;wr8SscMW^g83xQmBaB|ISK?5z?o~(a5!zUz=+K4`~fYtUF14zE*zrVg9HLhyY`hjrWzUM2An`VuyiyD>B7FgKVYglb?;p|qq z8Cns38PPRq3;KGzQWZig?(RI`I^2RLTtKjyTkuvM#EZ zWurgb&e~2#vYsGz(dg_rtmWU$K~47T@dMtDWTB%P7=``*)&&QzX;9@nU`93nCb(;{ z$7kLu%K-h|cPnkYj<{4F@zT6YVG7g6{F1c(EK042d{6^2#_*RixRrL+_U@oDU<97o z)%*@Ig!gRP!#k4nz&4b$9Lt(}6EKef|-^tOoc7JVEd#VV(04AIXAuStE zsn21FsGgAXk9_j5$qNucNFM@ICxmn@*;B<;sgdEe!OA5Smby3A6bNj*Lng;F0|_2i zLBNm6Greu}z=KfFsPjyF>I;^VTp18x7f=l?ikoeQLl=>xxF>*KQXfk0lA9l>|4R;; zI#bUkF^m{_omb}U^wB7Dm{>xbaaLfkSPDrzYkCPAAzi3lFUgYVJm47#*7^F$ zArJTU!r@fZ!lj;XFGoY1)VqQzDhbl0dKT%r`_lJjBcZOIkCg9Oe=^Vi4aWkBTa`#! zZujq71T-Gu=36iEVot&;!g{9wQW_#S*Gq_*f?Gc-W=TD}A}@U}Vji-uyuql(!z8ip zJQu{6Jy+Z6Yt`WRj>m-mz12i|h871*VCVN0az=8nFs7OD@U9o$+|6e86~ zP;CL+h33?|b^7Z|W}NXi=(rKpe#+F=I4~BLOHlcT>HF`H(xyAPhLEXydxhw^-#5gv z=qc^ z_JUP7hNy9fq-p=y{Ijb?R5bCn&JM!_rD4V|kFR zjr?bo@V`~R18{b9b^M>|cm5UOGmREg5Eck%{GaX>{~hx4ekG$9YRbB3+Fq zwy(h7&`{;7(KLj3WL7DxsoQYi@zp?3|1(ekCE|^XjMR)ynTve#ac7=g9~XPUQ_k0{ zn{}=^s)5+mKa8OPqS9lR@U!j-6lQypbBZ~;^LCVieaXE<*B*1MX`ledtHyIAH<>`>{ihDxGcHtX_tRwu({G=9O_%i?t%zdDXse?^*RunK#k#&>@Kl(n!aSmotrciomgtdB@bk>o!XJmw?AW#N+*7hR% zZc8>|yMfPPQMg^WNX3(@d|PhgEJi4rG8FW}1UT1Z)Uv!3=J@MII5p~~^_EhxYc7XK z>Z8EuQXCf&zvFNoq(1{N=u2`ZmqoPh4y(nS=P=i^LGx5t7z3yJF%LDj3yNd|qKnnc=#ds1Bf02jc@sUz~^!zUT zqG7_ok=eENt&*;{({BvD7@HC}T0Rtw?Rqw30r^mHE$J0>W$>u^16Z*7?(8ZTia%IG zlL0EVfyp&Ve>;uR!8nv^+`(m#h!_$7GCCim>^dzi2wVw$(`zchm|@%K<<@K6(m;Ao zM^-+mEMnrbNEs|&`V&d;7bDigxHRZo(hEza8*-{>>Hc>Wx=2%`F9}snFp3%$gU;`S z&C}hbMIPG<>st|qphf9mCCoO>Nc%Apcp8ja-gSvTeV6k?i=>-=GyPNkc}1)tW4S>{ zn;Lz?VyfV}Nsh3=3fYAVCSZle74QR)d^c@#6I4}P3E!-(FXby6!H2piB+#hX%=XvnA4&LuOCpT_)wLe9B zyb%{XwGFUK2;6}`J2#P05*ERS>GDdj`yIBB{;%+_-@to76n0RphyQMRU*#a-W} z9K;BW0AH9(i^g)ARkDGAcAUBWp9`0NmqiORuvVUIZEhe+07fflCnub=*8WKX9=9>kFNiZdu&l&eTq@~k}Qp1A$ug53TyQK?q-`(>HnQPV$|G6j& z@sEBTuMG{}cq1P*pWw4qms#{{BRNL>h{+(-F?XzNQ{LjB;0CIS5B@wkT%mwaWLl;H zLvaisBPW#xl6_+&!v3f<2HFYXTBI-NqUoj}88;ttqBIk)I4y&tlVi8drd|uWhOVw& z$ai8B8*Wto{Ia8s6B$Sd^F>6(_{+Q*uH(%qY zmygu_%LJ7or%1>UZq!TPJcSVDI7J&o`iPL%B)}?Qc3?xvNrlogT zTfuTA3tY6DqJTXJpGd*+>$XI+L5&@u)04U;aXjnblb2ePnBSakQFiTnqqp?iBB$<+ z_NZ2N*x0{I4Mfnk_0P^-<6)#%jM_U~pBNk<%P}!?p8uXt^=_dz@~&{`jj6iyW;9di zrp7A7=o9{ed7yY2+>u$kNNXCjSEAynYLAg#JKoCpJ2ZX1LNBu%E~M>IULUQlcQ`r| zIrtg+he1^dnOxC6&YP#{eWkE$%^s~Ve8))7CqeZfXf}>41aR_bR|QG;3^cTkbI^{O z+$nTlP#Fe7+Ov#`{{FQ!WOj4>==W13@M?Fv;ik}cv$YvKesMKcz)Gv45Am`y592qQc>({$RNFYzT>boTvm1`=w24$OwR5$bUZOb#h9|b9stX+B zXzSZ8zBP3}p0Br4N}0(*P@c|}mJ4F7A$d^5%{L?oahwDMO44)*cztBg$e1}n{%tZ* z)+1z#0hR@gt}RKX45v(qBuyGl(cZIQtT4Aq5efl4ceLA@I+J3ig^#kFA#)(2TfA2- zPUbp;uex{W>efJQL!OAW4Ev4WNmjTxmD(P9I%Prquk>N;Y%%zqE0Q^F2w5)jWI^s6 z3%oxe%od;x4wY|T@ZWAL*Ru_yZgFWHMC>5ts{p+lO?9j(VXllgR0OY-sZ9!FVY|aU z-YKQA1Ml7btK=+Lc)@O5VA3HuYt_*G{1Y|C&pH>C3S~}0@Fi946ic(x?_mG5xbR6a z3{AI#5W_AP7|BbWI!Q96m=INr^gGPh({_2XiNBi4x(wB5!PEpnS%Mpc|J24gBb4|@ zOZjNF^wL`Nl1O!uws1?yp!gJNRAwVKBAR&S$Tj*$8!*FX)iW~#&gWHQDkP= znFhjfE9HFX2(;8kLR}2jTNmTfK7G)LQzo?br%svUF2iGz^V|o)o%A*m`QwP6w#?$T zbC59giQ+*8h|g=7OZAyn>Kh3XY4|nd`+TRj1JYF#5#Oo-IlT+&0cRfT*;nLHg?*2C z?C%1g!U0~Bx9qR29vdP(G27+aN4pqb)d5aH+y9hebq?N+II}z}SZi#fh)~fW12E&H z-#ah@$`4ObH(A;3hhgDDxrXZOfQt*)-}<8#3;`=J9F;lO8o%3t@l$W#F_=uW`3g>)@)P1I6c+Bsu=C*yT zo`tj$8ED~~m1{-P8N8m&F$rOK`C0!8Kwo9yA(jHwqc9(JqwCny7{QMfd6Voldv(Gm z3n4d(pV`;M(9^VKwmH^i!6L-3#a7@;G#yK6fkh9?AfGG!${`71+r1bV^t3q09S6J0 z%RWBt4X`6zTVfQKH6+ezyKx5(blIO6$YfQLfM*~9Kh`Hq6PpDE|Dc?5r_Ay@W7KtR z6x4=!F0YYa4DL#MSd@()B2Iwm_Rz@`iXY+|KOsb5Psk9>D6@*(P!1XOEOJ(zt^)NI z&0mdkCU%bk=);RYXgHEL{YM${*|uO-GHq(mjX$T&2ysd~5wSo5sV&y(!6oJ)kVy=L zt1+CKcp%~S<^i!<`@ zMe>A(e|!Rmgr$G^yP?g)TyGu5(MWym7eTX0bT;nkOd@d*d!3%q!aiYKk*2tNHPGP> zOfcGW0??|SkfHR@ufQHkm~@)~AdGhtWk*T;D}Vbd2yI1cv(efCI{yLz*l`OEMP8H= z)b&(oY;7H{3ZV{Qbu=MVx=)`1B2vx+M;`jImbKx7m7up*x0};B{}zYv!Ojcfhb1t3 zF@=cJvy~oDB%{YeEI)gz+m+>F1??6D$CyGJln~wgF4T2rfyJgU?f1wKIX$42bX@$F zvA}#OCm?+eB40SWSRp1V`W5#J7AIFAgA zntZX27X}s;e`k4!cii9}$kk88fnoefx)yt81P4>R+57`u%Wlxbz5Z|DkhsK(0C8>v z8ESl6Ld544UXnbXL4~pnP|H#Fk%qTGZX-C;laFE3V6(t@&Qyu+QI>r=C0LEq3<_7; zOX%6R(I40vUS=|(sJRZbc4=9?zdk7-ez;8U1I!OE$$R>$U0#WwnZ?1mgt^40ee1lhsfjC58^8+F+ z&w^q!+5{z*Bz?kqk2J%k2Fqgn$~ee95zs!`(#THJZ$PoquJMe^PNI8<*_i5_^NfDH zaNJF>Rl{^lL`rkrpr9cMkAhgy*|3dGy#~T#v-Q5C6M}t#{DdZL+Q>M+&=(kdbNdFv z$5O{(@y+`-m7Q7#Bs$HaO+n&0jedr^6mt?DPd0P?B?S2mBLk_B%bB3QSF*$|i-NOB zwK~PzTL;eRnsiEqncD*S23#cafc<$0>uW}JKOgo0SeZ&6&}SnDOuj_tkyc3Neyz{^ zk99Lo5f|TfFEuZ{D|`_a1NuU)hkJG>mm()c)jyyA`lCG;-4}Y#*8zocFW@9oelN3K zyel(ZFL~Q$`RtYpUa`=5-Wot>dgVJN@CYSwR+A82=eorK*OtX1FhgKCc^(c74*qA| zU6=C)37k})5Bfis$0yhLgE#P_jASHC#EtJD<1I|?KniG5t#;N?00-245*9C0V-!cM zMO#8qA%&Au-^loL%VuRd{l5{O3ZOv5pkk!#ap+1k-Eb~drlN*dpMMz}nVb^V^?WS{Cpo@Q|oIZfj5-s`x@G=6$vOlfI02YnY|Ds@2`p(#}ALwOI>1^@6gGZ%o zm4044I*jHa@TY~hurC8Y5Wvea2p?Y?an3H;8($OU@W+~;bdnnsGTY+o*A_1V*>r?? z@55N^uaHEbp8gNv3prE!?a4+y*;7PQP}g7skquj+9L~#lQ#&ZHhN?A!(vID}*dC)cw*y(b6T@rJy z4h|PA;hTO6Z*afa8lBKbaulakVi(4K4DzMM5?tqCPhxKyP>^p)CK02LK1I)h;oFxa;Wu2|E9@EApjB=p4YGhjSe>NkiQ@Jw?~> zcTi$Ka8(kAOYM4(xj^Xo40+>z5O2mCLwH29p=JQh1QWh6`8O-8o-|C~yq355S{{Wq#I) zxs)bhB|^2cr6|C8{()88*gopN4mc=*1#JB=NA$LT9Mlycx(9qBW*s>KTE@3IO}A1Y z-Vh2KBM3mD^k7iTK4V=d<|!w?1-j%tt;HMmt|}FvQ^7is1UL@laSE>EiM7jNg}yqh zzA}CIQYmf+yby6=yPekefVgIAL_ArRD7T zQI@+&2%JWQb{S0B3+Cl4dANH!gYkcr(Z|Q(w#MlcuA2+d8}6hkQP-?a;p67Wp_FOU zd>iODe`L+5Fj~s|$uyDTT(|gy%f!868Ml>~)96J~e3Z#ZDpV&0fn$aIibXRRIJx9OSVChrf%nYG5_ohY&JelVNGoVu^|g@N<)ps{{EmWB1K zvfz~Oo-dnoNRyHun{`A+%H`7igZCEo+jUprW50&w?>0>GOYhb!>!=?=7R$oF+=ph_ zo5vNnjM8kO`=4pzYxX5J{X=18Jy5bu{3<)iw_$}zMk-A2rYGr}L}y%zvW)v-x%9UF zylmRqK}_?e$E5nfNIw4!^B2q7%l=A6g2&TlrmPTiL4sDOaDl-D=ImPnF}Bq7 zw$9?hpsD(DA0C`@9!9;#sAosVUv(qMK|h2-AOfq~V*(w_8*wJH`&gGN;X$e5BNE#u zB<(i1TBFkk2W@X1kgW^3cfY)Wxs5=zl-R}ykXEkcqhkXLpz9NL>mdXid9P3JiMUG};$-qxa z+)7Y#Qx4oQ`lZs*6Un~Q=-pfVoMSCi6R-o~mwVTBK7JVHrs$}U`nf2+co4}! z9tWr4SAOUU2dYUO;9-4p#_2=7QhSVCh9->uq;QT+#qbs^d49tg!XV~;?6XFRXu@-i zfxmktD9l_WQV7mNYUASULJ2CxSYAc~xVJaW1ue(0f>^Vo8j$)%kdeMcC=?#59oBb0 z4F?|}|8TepUx}Hkjj9lz{R`n#qZNYsr2=!Wd|96%Oa^}W>`qoh2xKCytRMR9jf@s^ z3r(;+v5-Gt)RrOpP9puj93=R0P}H)cBg9M-1EwnU!uj{If|dcmq!XFmfK=O4L_?%( z5r!dBm8>{K916@F5hVM`VY5#HBcn!AMd*)3_>dD?Q@EV{9tki8j-!qw2$rz?A(#F5 zV!L8GVHr_jvt%+2iK(FVo1BSIAF3N~$V`xFE+6fe!$}F( zooEf#kX$F0H&>NJ(2%H4?@{JpFsNPT?KqMS>1^|~RVDRscvM|%U6?}Qjx)22ID;eS zcXM&&=YS>nn;Ij+XBuF~bLuDgdjSYeC-{D@eRqG!3z7m+R>CiUh+hAkiPTA4 zm0O0g(Gj<0P2Irwxs4)BR%gtD z>3&zsa4Pki+Z8p%NR?h#40J6-DJ4*8GU~VSRMSyD2o`KcO3)|F>_GCs$y}_k?uWNa ziEy*DA$msW&y6$j zu2I?^z6Md3+~s3@nyzv&2xk6d<->9;$T;SJncv}Z1w09HWfeACO5gVKIH(Z~T!dim z(EjRqVX7Y*hUX>9nqLzQvN3ubip-RZhS29(N84J|#o;s6D7qK5?c7*umWp%@o zKe?||NxIK6dd|CWQ-L)`y{;Wm#ro$tr}&Fgr#isLWorh7IjRB9i^3{xIUUOB?oAk& zd?^Y&OGzbMZxp%tPp5~MtUj1#y-3fTTjYSjhl#qvSPz%-(!LEre#>jx(8RT0d!)?q zW^U%b&C~<|6)I8Pau%~W^@YgMdG!2U)Vw~Y6^qZ_W!(l9xwJ(`gJD3v+2 zjgodp0J%MxG9K$iWIz+V-kY~%K?)z+jv=KBczb$E+xS&Lg9jk_`Ir3+tUVoKhpTj& zjtntiXyV~I@NK}D!5g4*rUu#c|9 zSP;KLR|-o}uQK^D2C86bo$C<0h9hZA#y z937*aWC?#iojv)_e zpJvwZB6YSpIb8zo(q=vzY18uTkY zxVyd89H$tkU?wFiz)AX#b7IsifVOFRDhFwuP;}QJ4|myNi}%E$l~N=~M8|XHp-x0J zCee~o6GCNQG~I`!n(ozZq{TuCZ>_Hm`&dVX`9%D`B0BD-C>L}-{nFBnAVtaA76wZ> zeq<>Ac^<9SIe@vSd30yr2F&|?jJgBhPbDw91k!@))&Rhac~258on(%_>^_hCD?OQR zPGy1Urg}5NW_m)9DGfEUM#lpWQVja$X9A+?(+z_BYZq{8PQbOH{nHQ`N@1OCP*kQ? zZHz1})nykw>s>8%FKX#N&!*2H$X|~3t*&Xmo8$K?pB=87O%LXZF5G93N}2_ZS*}&e z!b4+2I^9}%xO6rmn)u5NbUQ+IgKL4YN2rHwZz)OmR1ekmNbRzJPW#moIE=e zb^>$i;AFDHOZ~jGf*8IxVNnz}b25bXU!iug1Q?2QkG97QmUKK2U(z}?f-E7Ltx+JB zAQ>{J{I>x0I^VTp6d=qn{GMMTH}AZSCl&zbNLCh>&*)6Y;{Tp8;(w8|rAE<>sp>_u1Lk@qr-e<*YrAssh?1nrgfA%Gi zOdh&Vo5P=a9(D)?IBr(jSA4=yPU*$lDmY^HDJTfnNIG{X*H5sS)z@BfYLNzmB3_%L;R3_CoQ1ed>izY?`9I$?^c%M=WG!wLvmw&W{gkMR- zIA?dF%!XAPQ55}&B(=B~O0>jj#-8VBC`F&e+z3mJZLl(YH1ujJ&>aB?Ym;~h8=*gB zlcUUQkD)?WcdW1?YZa2skd%DtFR+SkrMF=PWB976AU#@*qlr%G_`c?VU}%At4P)3#S7)i0nj*T+|VN=M(l{=)Dj6lMs7SW=w-s z4G5Ru-%P>3IAWAz&Fsa*2|brn>|R|smY*+Q=<9f15IwfUPkj~*Io_Vh_J}+d1Y9eb zYW(Yp!cdUUKVqCo0z`bK+5&FLJ)1_csyBFAlvnUwnWO!f3{uBJX?ISk!H|p%wo-tY zzzrv1anB(sw=pMcDjAXRJ&ITZb}saP8@Rm_poxtTn9 z6l=Ef;z$+L?x5#z6VLe87fmT(HE8yw8A2#xH3rA34TRljJBt1)pS6p+`sE^|2`B92G@MQIf-K7V8U3 zXiIzz%pn?_>JJAEP2dvY3=i~2Li>j`;nz3?X-Ni_^;abynv!60?}uQpHT0_ zS_anC$$|aruserieGU%~k0b!E69`zR^W{!Tltu6d@_;`CnZxCF)-x$)8%EevAio38 zXaB8V6D1h^!Qb(y?Z>ldQy<>=;`n;3&?)}8gn7OC<{`W;-sbt4fw;QK{>|bs*XeaFFIoeX)M-a_y!h*y z9-G_K87G_C_unXml%IQB`24+2AkxqtrW`ri1sm%dC7%Zx=2Hq@5qOKax9>@xuC5PO z*PQfbnUkg%$geRU_GiR|?Rb31z3|8cI%PY{)pa1F^DGkJ#67EU@j5J^F>*8cEtsx5G@H4VfENwmUP1Lzy+eR(?Dhtyomt2xi9a)qT+q6h5Q5&B31)iGl!p zkAh4(kpGypYbK@oH5*uflMG;xEP+Cr<`I@`-&s-{>gJj=*AC*?M0zCkoj;1RIWU zjs1z z^5h1rptZxz&dfMVADDnsxTd&-E(_(70J_)1>F5-y6ijU-Afyo}BY6ZZs9Z~y7DsAV z24jOR@4bgU=&unSyuJ+ma(jAMI`x+n-`lS#K!LQt z$t&Fw3~|(w`U8VG#C& z)Mk~lmlVl{S!CpM2c`yj4J^!x3Q8h+pa09IHxxOuK-tg~9StE53IjuOXZ7LFvcx#L zNHWSxoQefmN;4KrBA4ou=FugA z@;qz`59O4~?s5C2`SvD}nS2i4c}ZuMJ~m%NZ`g^g9D}f)Fk6WN&A-Mcm;n_H`9PG* z%70+T;rcGsIE>_Sc8q4{-6Xao@{xu(o_BpV8*fPuc5ntAuPllb9HN;5iiDDBT5*G< zum^?<;cgr!w_{u;0>?>3A`P)hwqa?m82N2-Ar0r`QOOg{Nct@t3%Ecuk+CF<0T;Bbavs0Wxr*fO zR`FtNO$DfFW?z3eUOS?Et$TKW3mt09FBJUk*ii&-Q7w_da)fRm__gBj7XD}0H>{0! zbd-Y{^S>Zt?~%1H%!|lOrXq{1uSxOw^uhmxhC^9{MANQ8M3G|~geS75+ayU(k;nt< z4&FF%BL!rl7MAk)2?SxBSX^K#)xUuRn{SU*kOR$MZAv_AbWt(o~dD>P}b9Fld^bRFJfsDDk1OR3xlbuE%7FS2^ttI%)Znu;Dp6F*E=l0gwa zYY6b9AU77uI!1VIzL`ePhxU+=cNj^8W@vq5SZ~aF+MF8|Hd92%P4*l2s-sZMJGn+j zjm8K}j55WJo`J#hXCtn??P@#1ILV4>`T>6d;q20o5?f{}Fxla4o@zfr#Vna*R$t@y zM@^@2URk4pO*>Kr6Smllc6z+M@knk=%pCIeI6&vhGcC^k!C`Sg2ofH@*Uv;A zMk?BOC8jL)(iUn9S&LSxm5*q zeD~893lA2E$Xu2QgEV4VuPxe}mu=k`7+;HJu7dQdh5E%P3Y||rcSngU8?^|`{Q^E} z5x9G%#$s#;1Wk~)P&t+Lrj)YhI^y@=+>-?(&zF>vr7~p<+K7SFWz30~xA!LT9|jk) z7=Wu#3b;hVts!K>um;DaxFQ8I-s0PFf@UWWfRF~K+ezn;z!@ZzfM3)*{};oZayE@r z$KML=z+ex&jUeO2-Bl(4H|O6RM}RvYtg^kLfVO(I z$gwrEJiCc8mWhU3)Us;y7+o4A3L1}NH|DB*^+A8qPMcFd+d%|l`Tdn))_t<$XJ!6b zz2*bCSFuUC#R;b!(K(9s?gHpQ{-WG$8MIbb#_pcZet!9$a?=EcVP_0#5CP~Ke^E4< zPG%PT8`0*G2+HM}s00mNySm)Vf{YJ_Nt=C%70eQ```O)gqm_L0435m>6#odO)yan@cA>t3^FzZ)gr?&Sa}@b zz8{2~)tYCPFRVlx9n{L8>WE7$hgO*Pplgx!Ska8faN;+MzRqJ!b1-$KJzlXruLHmH)Va3ztZy5$v$$vWIeCCO=a^knIWIJ3%!$@77m z1HcPV80fZ)$plGCiectP;TYH{=GS0vI)y7SVy5_CaBwjQpQO=YovOS1Q)W-4t-ldF z6AlllasK%mp|T2nv3zs-OLgW=_kD@TiM)&;a+4aXC4qutq-|6d8i*1L<>uZH#32F} zjoeWWId%tW+*gQGQf zRGvXG_24kARJkzeZZ2Kw!eP3E`Elw2l9Wa`c!Mr{07=?TbrOhi{MNcSE|#mBJoUT{7*N??Wf z%n7}Ef517ZCOM~aQ-j2dQeojhI&J&w{A+W+aW6@+N^sctEO~Li&tUF6OL< zI;db(T%gHxuLE3uib`3uR$cv?ZJf?K?=(*q$sn7pGY@nL2xn&xsBvMg#%|qURY_KbWa=MhpPFNwyyhO@BznB4QeNUNQSWecI2WDHMN^qp0l!ArN&XbOorgd z%&Ct~#|1ou7iqEST^F)L4v@r=hYlKrg?mTXItMZM2n^>M3@%erlX*R$QM`W2e<9t` z^o*Hn#`Jb;B2P zu|%k2f{jm-b}=Dcj}q+)H_12(yxTl1j95AOZpmw$dbZZ9$3zJo_D7LR%8>sU4mIo1 zt+T($rK*Up-GpWoD2nP#YqaSroJEKjQr4C_5rXPuLRDTr|Eo!7GAx;GpS$X)0x;H) z42a8QZm&OY!K%y{SF_9YHIv;nycSDOo2X_OgOC`Qo8KGy3@0bed>znA(GaT=s3s1_ zk9MRHxECA8I;lRwr3%iiFLCJ5yjPw-8mjV;B!R34E1CxK37z>!mrZ{X=}pJY`qJo!vZ4&9iUgGs!U!_hL_n{Y%9R2dBGDoLb=AK|<6#vvZW!c?km zr!~#&nXeKN-{4S=u{nubDM>w_#_f=zKl|b)=2V2a_Lw3;9byig$nYfZEnq;87MZng z(vom1t3KukIEQ;6b&>V%rl<`dPQYa3V@8WopsAQIXPD*+;pjia(LK*&K3gT7gNb8BBlqp1CRvCC{j|tq;#)YE8G<>Te=Ilvjn=#!hf0Kx|V##>tzW+@9d$QycIty}`$YI_PiBeZ6p< zVs${aK_-CBGO=Ms(~KL`KC%17b-!@%-OrB$_T9oT&7EVZ9 z_qc{FkE^b}|K=38_cUPxAyH|}zvVANR#R7|qN7?!{?qKk>$l^Qv+eEy)x|i0RL^i7 z6I&nWHAM^F0+lKZAyRmFjQk8lYp3cJXrSC{j$7`>m;dC2!-`G+vVk4bgV=*V6#oa3r|@hBq-mc6u{BUrrpv#-b_j8rUr^-DsGnFA0Ht zUACt_#~ysMiH-5r=U-p7Zfx?^sUssVEiipKIuP}mx56ZprH*-wZ!|b*1~(H!Az%(K zR?ZpXd2q~c__yXLIG5Xn<_=T{_pnoABHnG&O}UTGHGTI499?c&E+S7*0>p!Ig{C&xS?cWB$D#@II~lym^Azi*}^3aW4) zoksjn+LYJN=(KHUw=52QSOVt^*>_B7%To($1E1}u3!fw7f3{KF&!)C`=NcM>SJT8d z&tJJwz%x>lYw6333i+^f)e$RpPPZ=9j9LS=Dp_ZH;9FV+oP>1q%6Bx ziz*zx(1~OwpDJltVGKem^Cb6x7b?(PRLY^U_P2>*Ts%j4G`en?V7CS^$*s$EJpZ!( z8QMIpFgPE0duml7=QYGJGo}YxRLGLNzcx-|_4<)R5Tgr?j6s6jAs!V^7egi?fyQ8U z`W@Pym}N^jiv*WucSAJ>zjVV5Td2&a+LmW7#EeQ>Pitu~ zCLAOwK1JLzTtv4qo2kVn<%VG|i^X$*fqLMl1E@n~aSe~7=<2X-`O6FZJFU)$bR%V#}`|Lt7#ub*Q@Z)s|$KurIVegNJn+%B4)`OiG z!#J}}jz-zf)cS3fS~MB9=r+s(&85neAme=4En;EZ4T-6W z7Jpr&NA)TZopqIBWXCL)ZfVlFAK0#bV(S1$RpEuFsKDOHAQ!ia{F_YpDp?@9ezIr1 z?Xuq%Qgiqhp%JcpiSc$j@re)k8QHr%i(PnU+pt6*!E!l_2NZSm4 zE9t^e604|A&>4LebryBIu-KA;K4Q~mxW^{3RgTZ_ku3GHRy{n>>eR6{WXqSFe^*`~ z>l}Y4qJhM3VjGE6I#vEwTCp$Q0tUBo?I6 zR7yq^kkcjQ(3>#so#`CjEtOwm0n}ViN5$>Fy#hTe8s2VM_)X6ezjz&wnDi>R!K?xx z7S;dcYlw}U9m1Q6I=yW zqaVqr6I?Kj?sSpvsJ ztbVQ_Te{^Q3SFm`bZ(qdl{sNJMqRydzspp!B^m}DRqCt))W;mIJ5d+8za&0&3AGj? ziPnU5-bAGJ&yCil_{=FSc`$Ql5(^h*1kS&?nA&nd$8ky@Q;`FuuatSp4%rv)EhXu7zi%zYo(tLDY$^sqYkZ zv!>>x3*jwwg$K%>Gax@^HzQIaJH*C3Cq2%_AcBvq2;rSNsl!k~z0h3M+^orF+Eo!} zTb280mLivguOIHIxl^|J!RbB2f*Z)_Nj(q=Lrjd(}B+R}hX$nqA5Dd@if+(!C zaA%I4zO)OkM}L3$)baJ?ouo2^6D|C0owq}s|rLjg!>JH`VBk1k1I3CAQ_e> z8PCAk4qjG+32ccaQ{Zcsf{<}OSJJ5o;8HCcC*ivRFW_KLBI zT}d_8am2U)XngK)-?``Pnb#s86)&?_&-kd~mMbiE**b4#Y&QBtRtVx<@? z4}(-?+gvFOa+%kGSw)ZWn zrwy!~23IL^#+@QPFx1to|YA^U9{Ew;9J(hlvcfChxbVOWJ?l3tH)6{5KOQuRSSZEX9KUn&DPJz8#JROso`<9pNQMtXJY85vZ3E*77JA9Vs~e)bNr%)++E~>(d~vD_8P}AFw~AE| zgK;I8T|zr9erWwy%pkdK2(9@ct4@hOZPNy6j2c`k7V%Sx3cKVvhD#b%a@|rSvM|lY z=-aqkHc=u-{fwWaPOGc}b&Ba4>S9LMpU`!mji+p?PA8Z@8j)GH!-s#VPBppM!_LsI z^@+@lNXQ}8jaRIhs2glsG+I5;^cgE1^f=LrlQ;XcH&HH&eILolX>1yyi#eh{K^K2!L{!;(<>T0$fU8={4fH%zwTx`R` zA9^%T*E-^_+GQo26^^r^TFNUe-Xa3PNc}ea~<(aG2PT54Hti{ ztqt9@jF!MZ_z#MzVO>JSLuz23J%@+14Z=cLR7TyH=w}oU-IAsi%z)hI>}OXwFRNYS zmgBX*D=ty+iea%ibz+~@I>cDQtTm>Tw0V}Tf;PZ;X>UnW3j;s+nF(gB_*kfwcv;1cVx9q(Q15+?EE{ z(WE@9kpQC`EsK?UlU0xzW5B_Cm=Y1L(ot%H-p7mut20co>^%&+om^w$|MZY}pv{i1 z=y{Xr{!8B-f$!0xv{(Uo4L6Y0>2PRlJlI)GgG_u!w-h5pJJax8^uJqD@0FoK1Uf7A zeB;3|!8z}FISEnS>6tZ$?aJD#$Kq%{--{m)^RDu2Lv^9#QWKayxlwpoPSCeCv4$6k ze`>PURIUh~F(^29AN=HIwdh^WnZ{cgX>a^XAi%;~e;4w+pl~Q&XitRFF$+31)AUta z$&y`+KaI=H!rJrmf4NGzY_Id;{!N}s*Z40PWB;G7(*J3Uz0#3!IN(I-{m^jqMsNa3 z2;MdU^|R!>{u>jI3K-MJfDKEx(%DEpC8H|mi+lTTyuDMbs8O_Lxoz9FZQHhO+qP}n zJlpo!wr$()b8~Y$Rq0ee+^(+VfBK)+dRfUFbI$SIYLkfaQjDkN4yS?n-bUz;YNXPVDbJ!q_*M^u4j;J22=O#K#?} zHtP3!fe-N%n$1<-r^>oWF0A&ala-CEK8+IGme@0ryg8g(_ert8$pY(bt4$E$OS#RC zKUZgN&offCdJb8VGP@rn+}Bc3WCC77=aoo2f9?iwjtdh5)JFo95#_mDT=$P8r{jM{ z__*620!Ex7#~w^oWf(jZa1cSaKn7QGW#+#dL34x`PsFD^Mh1;(Ld8mi5PMwH4zv(p zQ006O?k3q1j2B={1;!MdOaEjHV#gWicNGvS2o8mBg?JJ~Ab7sT4nqfd{C!IQ2tHht z=A1nrP?l_^C`80%4r(uek-_~Fib&qT*HXki8;wbv2<`+JNss6?WFu4*z}7^)m+~8t_5Q;EF_n zu4pt6(0RZJ9;L1ZJ|>*D!!Ks)PClSICU!=_-+jvFnU0d1UBqNkAb(nhJdRXiL^(oe zk*S^(+LOb;MRsFX#wsCNy&r{u^MEzYu(c1Z-W+z(&wZX8G25V)-kN%0*Vq+}u^I0{-wS z(4Rdr9deo15`N}mEhLKBfvFFy0Z%Lft)RVqz!preiHCBDc~pGn;B=`a({slmJS3RB zfxo6PGjS$lQqoGZ$QAs?E^g1}MSs?lvp@uMjdB5cV&>Q9Cq>S=yvWq@Ug|~;JluGw zO{|z3QV-ZRF9;q#)Nw@oPs-#D89)Md`JZbHecYZdMXj3=uaY`5X=NfY4)63*|L$OZ z^Hh&|+*ZP%9r;6-Tv&(4nJx5p$d%4zzbc%`ZlZiZAW1|*K>N=48obO{(K7omAE!z7 z1xH~!Ze!wJOm2qQ`ouTrlivL2XB64xfSbA0k!-=JK#+(}MC}ngIZVR@S1bky;|UnO zd>s-n6e$CCQc@4Kugvh40l(k%$bz}Ml^Q4D0}sFno;g!W4S zVU)X^xa+7*UD7M46}dLP2vPWJ<)#f37z+1kIMOXO9W@dKar0(hQ$$gqm~>dFTW^Rj z(0tEx)R`rn18W2PyU>i9;$i8osE0~v!;HI{y-TW9-QFu` z!*3kk!L+5({J6TVwogTNqZ%Ni@SADfs{x@Q6Ty^p`DR13ltoE&+Ahs5IakX?i_4-j z7&K7N>UngzJJG#JfSQ4vYbdz?Tq2{8$QF zw81`=8P${XSXeANZxY=iaqF%GOlh73k+s&yMelor^YTdz>K)qIzeLG`qw)+`Mo#RK zfmtElSOk|axEAdr8lmZ}#s_i1^_<>wHrf2^$PENQ^VAMi-v^`0KH$kWV&*dcRvfFF@sK&u#?;&78>Xq{wC#tlnyr`wL(MPg4+8eV zl-Suj@IhU}-f@QI=&um&rxA1zRI-D-W{E2(eyv0(FL zD_}3zZ6EQ0w$HvL*c9E1T5i2{wn{dNt~%v<)m|qJ3+m@--1rRHD%gl+*L_!vMknbl zY*V--HEf3J>jrC7iwpXj={+xA3EH5t#{d&r+j{9klvuU^rHdGARGQTfdQ z1+bI}UHem+dA-Vw7zu0@?Hdd0RB#qpnGU+3xhbm4xNdx=sxDTz^-WBTZ7Mpxr>oi(w+U(W+g{(*av?u->w%YQc#=}tJBpiD3(6U`+0>?4`myRW|ghm_O*@S=Ph%!{YP002A) z0{}?=_q`~Vwua`W`bLJ%mjAcC5XV}1Q{th^e*{NceGOZU02}6LM%B83pe|q(s{9-e?*L&`&-+DJOyO)+JOB$2h14Xj{6sb^Q-PxN?2k3 z6}Mr679Js<#t+Lq(xYVC*V+8SD`m8=y-{qVr8dCAnMCP=$HA95UW zJ&X)J2B=#&yq|RewY{P$ds&-Rp;`NUYl@iVT~-{9!szO*-c+x^UhQgCF-MMlAttc~ zreVzv4o4$;slbR-0_I=W^BPDwB!oP}~Dh6bH%R?`g&TplK-ep;Y4K-$y~ zAmY>zgG)pq$b(4|QwcKcGO_|DztkEkO;V-CTY2!E>_a~R4l|&ubp6j<535$7h5cE3 zD>r36cJA;JVrh?RIY%?!kCXP;e}6`s$@QleKBD^~Zl$!Tgma%3G6 z$Z||`n`OqO#K4cxgVgf8rG{7I|2}jAANs6)TV&vSwXu(Sz7|=#0Em_0G1w&VwZqqK zZto!U#sY?4;CRWX&SUtTISTYZ0FcF63pNQFQm*QKPPHEd2tz?o6hJD+`SqReV&QnO z2;Wz{CJtpWGvv}l`zps6$2kfyLX^z+y$=VHUtq=VINY6=!9$nMsidA8|6UBSB2!Qx zeK}CO8aYSE5{~sfgWq!N0=k%y;_4`A=;W;2=K7xLL8cn24sII$p0s+eTSNE6a<~lR zyyVXJV)b(So9FbILwp2Q-EX>&qUKjF2E3_$crHSZa>N-)1b`-u$#+U7$&8mzO1Lh* z2x~tNj`EO%DhU^w_!>S0;soq25u&u0<0%Co8>{I})4ZHYK6Gh_H@CyFl2LRklE3&{ zlIWpCB%93b5sGccwCg-lgmF0ck)`y~7G4aBMq0DO_mH#zfv2ko;@;>F7y2Y=TkscV zl@fwl`zkL`m0&xxlQq+^ovuA9tUX@+ybl{%eRKcO777^gv4?oTcgL~E`A}n68T9Dp z9|f$&g#n@D*Hm(N0qyah3b@Iy<(jkskDYvMl|=%gcV?wrY5tjXfwE+-6V8%h0`hkVEJVwoq#?nsg`d2LfaU+MeU(l+V8pcp1W^m zc_ZNqOZ!k98+iO)!HH)JOFXz0JLx#l#PbhtT2FkEzVd^$U95grGWNa31NTneqChe! zW}ZYCxwcBh*$&C3^7xC3wT-56#+ZMe`_nZk-h%T9O=?baPsvdBdX9CT=hJm*-pd}- zX~rp@ulIPk`!44y&+pl$w1B5^KJ!d-LT?XC$rXmvj3?hhTYAEo8OdqpDT!}v$&&z| zM>vpg17)E}H;*o7TtF*_oc42a@&d<`Lv1lv%#52!shE`}v|9FNQ7Trmr!1yz5!-q~ z?N%7=!v5c(UhaC{E`k8jR@X;12jkjODdj&NL6v9i8SV)Qu0;{FAX4%6>ua;0jpEdS zp>v1a$!__z(3A3acvNsw7hf{U^U#C+ir>D8FMre1Gu}8y069BQbB+QsISe87pEo!i zTU2fzcr1dw)Ged%+A3bTRzE9?UKZ1M7G21ssbG&sHy<#< z>pFX(iyfE-$f`kY%5-9CEX-jOzF%g>=7-yq@S&`pcj}yU-h@XmzSIcL<+j_wO1gn& z(leH|ZeaNSVd=}|s6am~&|C019E%LLuVD38BIUHgnW`o!4{uIAs`1_I(Jc(iNd))9 zuEK+=RjOp8 z{`jeSZREQJ`F(O|^{Q8Dapqr_Io>fD(VJ&$HjnYPm`Buu6lyamW!!nVD(p*`ekS%6 z&1MF*kclqiEgkJv&XeP@aFQJ6Ps^E|Db{Y%iX2=>cj;wHFQn)3){SOny^Midy15io zMwZt^3BBbRyo?y^vBVyvA*w~$JWe^a(3$(1KzdZ5V^9cDP#zTa^b!q3()i))CaWjj zy0eB@jrl?N`!5?5N_C{`6-#`hTJZip=Z{vPL1DbpO3@5HK3%c2mBhX7^ZL<{RWB#x z_S9Gzqy$m=0(yVCiOM?=hc~;nvK|2W?d-MEL{Kj_SIXPW44n3bF@zleC~M1K>Q9Qu zhQnAM@KVAi1Xn1OxIOVQ5s^si6pf#Gxy7~SW)yOJ&k+%clQ^FUA6R@wAc40K<142k zlG)QY3TXhKE5m=eJmzvy3*z*Y3WZLVP7-{c+N07$h#N-}6Fes|WEA1&*5k+EV{J(x z&rtS#$Bl-uOjV7m#QVaWhq{xn(DFWdH!)Vr-oEKJ!i`dqeFJ|YDzJlF@M=*^17B}p zK9!F;420}iK;v4B8`#k6j<+p&HYL6cw?tn&&G3vKLBv2!UIfD2w zhl}a!tpt{&HH?FBs0G+wZKwg)2QHPwR>QANBVlS-B$Ky#-i6aN6NlDH>trnu8uKqA z2%K^yJxl6PNF6(ytIo_VQvh4~^Q}@K1rfOtsnKKpvew7w0DC{w5an`n%PcxP1njf| zeCO2(#B4vGIXqY_$7iWRhR(BFfdBMRDiAqn;d$9Vg=1X=o2X!@GMLc_fqqauVTw~O z`UlQQwNjk_rYZ#@^&E!?#7nPAfquRH97_hUw%6nT*i_m)8ZOR_MeG>qg$R$K=TC`3XhE+V1UCZv=~Xe*|f&sMUYB0XGa$bIBp=c-T2U#flSb}CB{ zCPv^=6?;qocSqVFw#G(<2y6?B6SucN@iMelZHim4o|z~F2*q_0?lId_NT&>k;qTI@ zmqaliqld?C1o!#wM}(#ei*xu_cR!U*TUV7=ZM!mt{fog6=?%dwQOMqTb!8S8NhoDe zPFX{z_cbAGj+(8%v{gfslA5m82CD#cgEAiGq`l&b&Bp#;nS$= zxB6nRaa&g+I@PXxu<91cF(B#QP55p->wirEzm~@^^`T{sPI5%hw4+E8HkX`{2bw&B`dlQw!CAvrYaQ`3@k}6KQG&osvXjF}| zqHI)K#9{XiL>QXT{a|&5kM9(E(M-aJaM0EaoL6HGLYlUT7H``)N=dbwQ^f^WkVCdQ zax$PaP0mQWbgkARwW^u!Rhd$DYzgQ9N?J3i4brk0RLks-o~5c-P+!u%#NvcGJqv^XWP-tCKeNe3j$FuqLGWc$QlljZufhX}ZA%rEr ztCWt_%WMa0qJz0AX73U0cd4ga$P8R`Zf20v7A_`UY{A~oU%1UJ3u*lBPT@y3$v)Mg^l z3WsVIYqZwo19>=W5I0T&0|Gi0rJE$%0u>gT_(_y5m6$c5~a^pAfzP1Lsk zskJn>w>P&jr8l;*cQv6mF?DmXx3_Vo|9^scH%3Dn2Ma?+`v26=I~W>U|3~rW=4xYS z>SXxOMsMlj`CkfpT~KMxwZQV&E5GCZpdy#x+f@a<8-JyBWiJLAcb ze&5Ni_^rR)tTgt1#+b4}MVxI{^eZTtZIR*LvAVOdx2_9n)g8^A2%}mq_{&rGcwYuZgFMsA7okmS98?WrAP~{pqjqiz36XFvx_$O6=3)qHfF&`EQWBOf2H}n8g{UXTJ4n|zh zNDEs|=*BGG{SdS<96}V0qAbZ5A&ro^7IriBLYlO$9XuQz__(@wc*io72cKUHLc$Mh zd&(?(S%tl`t5wQ1j zqNe`B34OT$1aDwh zuSWZ!|GWZ3pfh&s#DAMjw~0y*dS zjHv|YxyjGT!@tExd_b>7%f8BZIQMX2;`;HJ!iv>7{ISm*Wjk(K9#AezX#8rASf7hT z@H3B_B5`rPiaYk3YSJhV+^UqH!`RNe%ti|l#Re+#q$Y_Le*$&x5PDV{+{FQ0DT)cm zZ9y`43J6HRuFq7Qwv%JcgmNe@#>-B|H0Smwa&llgu9APkm2F#9?`FKg|_s%;^0a`}ACj6|t>HJz6^{+5JX7Lw*eKGQ2<-ynevGe2U z;K0U<*@+JemnKStQ2u8}PZ*tP(6Tuyf%S zSUeLj0M5M;3J;VOeRi+t<#3+xbPD7C{Y1WGhvk{fzYyfGl}nUg6x#sd)cZrSYUAX= zkCH{Ort}yx?#r=;e@NL3(*}r1H{*o+Z#D*)H9fkhM;`5_^PV z>iE;rT*q~3sybereCY8zUrd}}adLMyj4a~S$i-{W|Cfo2b1D@H#U#tb*3L2jj`l@M z8!HB*7~#k08we?$I1ul5&q5TBr4=te>DUgaoX`R5a!68HD6pBpGSF2v=MdGyGM@x^P_>)|S^LvG+PoralLHsiN$*!gYVgv-ANWX%Gg z!{wJCl6*6GdQ_bPvX`eF%+f^Qk$_aXL^{QL^VfSq>6}3l#(~#~`V& zBZ1rntoC6;2=xp;JpHq{7|Jn^POXk*%3QG5Bc<(}Xc?+DN={rJkRJZY9*>S1t`(=< z%dsS2nX-RR76;0)!mUP)J{yVVVya;FFfnmDL0cYGHBDJR*#L#x(;6WLE1FAj%@Y}> zL3cw^vq$7%@BJa1Ch8`eSvex?RXe)!Z~r?`B2AjRy^&&sDbclmogNeDn+nJGzkHi) zH~n>C7;EW44i~D3Tpy#Y54Wi!Ow}`L)wG@g?qwjCYE}wr+EVgAGu;(U1vMN*%^S$(eW6^&0-0s0$kts*+TsqSou9 z&uz3xuC*PKNQ(8{{~`)j^bJLVi3q?>Ts zJ3XGX63uZhg`!9cd`c|)XaQ@jBcBGA=VsXZurBVlqf!}pL*Giy?$Y(usrm0aO1WUA z+B#BXtF9SL$F7Xlh7vq%n@UyrnkM)^3D@qR9P8?Jh)nR!H6J4XDYc-TWiIdKpDdot zb*He$hNQ|}(h0{c^N`F&;FHyYM!-|@=V+(2J>71a^H{4>3zc%gwBf6^9@I%msH`=D z9>$wg*X#rR5Qp%VBJsh@_w7r3`w96NR} zyHsv7jD~eDtE}XzAGMEMR$QwAGt;fdp0PwUUmWwt3=ylrqzw+ggnB(|d9;hhBRHXR zhK0)@b3G5F=$N&WdZQ+%&aRC*ADEbZScl051{gU5W#?>cY#hKC<`U6H42{MlBXD5# zVK8QByxMj+B#fML37hF?Gxpj*h=i-HZ|`;e`vd>V75z!Z2Bf$~h}E66_roFg%ehK& zWOwA*wPhn*1}q>!52KvP`jsV^9oAHD-o1F~6k8+|Zo|y7$WCm471<@q*LevapdIpy z%fY6$>lK$n(3%FuKovnkG^WqE@Yhh>)Ar+O_7RfoGIhzW%{`HIX!FgVYNg#>hdXVy z^$9ITC6bd^B1u?C|K@<(c0?i$1O82zZ7;LGpB;l}#{uvEVgOlQG@~mC&_^KTn6%Pz z2tc(;^bIzXKv!t+9cQ37+=3y26oND+D?#~3ou>F5H9+=8HGY*Togu9cho5m`brd7; zgVna6&L|CXJSGI-4b24n55(9vFh<-V-V^qN&U}t6$BL6r?tkoYb(17Ko|ju0-GOwKgSSP;sZ?fvGYI*Ypr5CYRESTb#p&V})Ex$&gKuXzOr zVNsZ3yFJ&s-=aIPvR)=L-%zlR)wU<;6U2`7+>l=y=X#YybSF6{nBU8(g&*0a{J2Duf_>Q$+5ysDvY6$U**vCMCx8&O} zlxqqMM3_dVnHE1rOS*x*nTQPLhuM+Wfh+m~$t>dsF#)biV`~tV@F)zkw@R;sp2=f&^f^d=ZPEI(+hd51VMSg*4C+ zINZW-1V@5|aO1YeyM`FC0$)mH93>xbC_4FEey(LT8iqdeS>hD@us2l^?hJ5b#2vn= zU0fE;csv1VXdY|XP(tH5>cK*F1?kUz8XYme>;b0=YT)hm<YKzKX| zsdhmc&SKIbL|*%?^VomO)08Hx(#J-US+m4p5gRJ90lIb)-8v=9x@T_CXraX(!ay#k zgHx7zpgQn2={g4ZL|(+-)+G~A{0Z)C>&+JNPD~G)E2muOmdXdLxloWtUq4@6b6JNF zbV(eA1O~loGxY|tj>cHN%nxI6pwzN^#5FgSH!An6p`lYn7f>4>nN_XF;YKcaF$KyZ zw@Cf;Io;hAfTpfKmMJIYhIx2pi^*=(v5Q8ZH?Fo9fUMumD#0!mT8GC*GLk*74zcOf zCwXe5DJvdEx{&+Jv{`lWie*vMwf<68`8)+iuEc^>9O0|bzFVy%$bNGP4(ZR>Fe6F2 zGITXN%{p-5rE7!w?t^GagtkHn??$Iu4k=Ii^9f6ox^&^lEgPv5$JGmS$gVTzGX^(~ z9pi^wDJG;(@#x)C%_#$b%3{(z`sB5YCW&P@r5>QD7sth&avd?D#g@d8Cta@Fza z!H>xIWp#v~r2JfbcEfVD0jhdokQ1$DSxw^AQ_R#cbCkB#le=~zy%Z7bf*j?$ZOYF? z&nunuO7`xX0U*C)=#_``r9jNDIL&=lS*Q@jMi7$%?Ij8II2u{)a zg>s#_fIkt#%tlPg_n>;ahv(Ug4tAH1-cAn4^tnM1G)RSO?9BUa9^!p%kgvGGLU&^5 z;D?wQboJvz-M@yJ9jC{K-x&6>`^yfDDm+PIvO*F@w?TK%I~`ep&ISlJ)Gj&(Xs$X{ zKa>KveGh?>G0Rh>8IHk}c}sJHVvicwiFrc|FhW!JobBPJyP+dMNR9-t8~<PFR4#xa*6gz zJ1!Oij1>OhOC{!O2aMCZTc&z!8|3zW;1o^^B23&LS4*Kb~fv z2{5`wBMb-|qJFvS)LC)hy_;>*Yd9H*#c5ovduty91&|*f@8)IN31%WfCA;uGW6_f} z!YY)h2?D!#7-N`9EzC?TODqFNb_A|9alF6y{V| ztVLN2MOuxBjr(LxMP+MaCr6YsgmRAO&YYYvCKLy?1mp!`(^=dh$=x+1FcqxUP2jFE94IZ`|F!R_x?)*7~Hxqm6@{ zJew{yZ*CCzSYSVtyQ5Du_J9HY0w(9=wOL-(Y{h`)T(tf?VH#NXVV`Ras$u-Wo8@RM zwk=lC(QR%Ma|sjVj4^OPw5U5kX0`AutPN}ZkZxz0#uOE_9PLpIEP^z>Q=?izhf00J`r-c3UPP^wf_Y{@ zPF*ds;gV#!GzsV5)f6e4a7{;zmAephXP={*j$B%Auf6`F7h_ltW)2nnm%YZV$hj)g z)&`?30igTi5bqSM^M{||>BRemH4jXaoxJ)CGVnYfFE|G?E$^jf6E|2DMhl;?_GRQ) z6#cNp!AP&v#f~qB<(2yj2IP-&%oFBnad5%4C5l{=+9-wyvwy&{te@pjMEsf!8|2|s z=(&bgRst_(kQti7ITQ5fC<~s^xo-c2AChub0q~`sEj30|^4~GbU1WUcuS0JCfIR8 zhp!a40?h)pbUzF$3=Owxu;5QWF5T*^ z1>XT7cad!e&t5_}{tVLdz^NAxAey5R5^P9Gu_KZ@`}lMsW7yBh%^p14x|%r!$-Rf8 zf?bJRfM)RF@LJ1CD{@K`E3m+}rN1xfkMZW}tLc4i^m24^U00vSs<&Sc2W8&#T|e#< zJ`XbF%-)(qVJ9;&Xsy*mnDDp<8=fyOaPlaXcvb>)pUkn9qjRBz(1U}m8KAhTu+$JA z2hG-S5!A5oQoI<@x?fky@mzl9orslK9|Qj$s%B-ty7iAo61-lnty&0#UYVM|lLY;t zA3YLPZ@`L(M0ocM$CdzQ8{}*Tj;%_p4vH^#Zuao(QV2>h<80t{ z36?(xbvTq50~GtnqbKmFc+7?`cLekkc&ynNCd`7)^9Yo%cFuqg^ibh(J&e1>3Y&9n z?N`T7_QqUu1paRcZ6S0ty@HL5vJ?R_@Y5-HFCBPTu%d{uyoHe~Nm&Mf_uR=J0=v!Y z8F$U?GT^l-a9rBBS6WWY*3P5#hD_^i%1!(kw4bKLiBxg75+6>`4#tD41esT_|Nd`H z;F<8GXqRCl_r{Hv>`F@hT2T8Ux_>z|Glm~9R^pdf&)Fhom4lfg`x{ryF=leXEnZmI zE+?kLFRV)2(9s?dFfZejsxIz;Q6#i<7n%IWiQk`SnALZ7xx@xk2s@n2i;+Q5Q!hz) z&FyT+p>%*BCQ7F-1cr{aBxW`ewnIn9h#~92{v)7(02-{6o!m8mHdZ*uEMv%tp03X z=k%|x+2c3HQlPz|LAXriti;*-EAlMXH|nmIGg&kjZ|u%xrXln=sXli)trq&VL$rp> zO@BpCuBr+!+We?3y7A4Xc_&lftf~gUrS`QgZOCD|zqce`MrjY)v?ZB=U~kIp+BLcr zjECx2%AbF>yo#0|yeF^rS^U&)PLt+k^c;1&F_K+MQMo$O+SgenJ>1JlaVWFkv%Wf8 zpL`SdY7vn3EI|!mjW}Z+jXorVjSMD*J3 z>D1w1{o8f0`WMzi=r`Uvb@9AN&JUO}Z3UZj_aZ7j}PSvb&{-(!8fEblz6CEn+M3wV`zl za}+9c>$PjBaY>b`c-cKFG=lRl6zc{&q4DOwjsrWPQCK7GfZowLn$Xz<&lh-ITUtVg zhsMrEl6t^HJ;(VMZ}CK%&L&z)qZh8-4DU^b7(z*ZThbs$u3!uI?|0>rTx4^v)6asNcKT>ruj?}NP5VLaY_C{N+^=) z5YQKeJkG=(&0EEe-|d(3Ynl7QxfLJpF(Eg-pqy{bR5T3zV?#uZ(;C~Y(Z9juHFL)k zESq`X0Zgf@gJv4g^?C%VG4kQJwO>xOf^F|)V*F>JN+FDAvnrafEjfA+iq3xvjA2XO z+EFQaX!?X1?asz&(|ohZot)z3>F7N-zt2&n>CWLp>_artV3zeDKWh|LW&yKOV^#)= z#I-bbGg0CSd?o)3avKDPS=uPhwcfK*G}6j+ZlO5h{d8AZmon@&K)gv_f-LfNw=%qI zy!3Aj9_K%qfFzr|oL0XQn zf)l9mvS|NR;xa@29slq36+?<=!f4>QZuKXs}CNze*d`8W zix1`@m!V|#aH#3h`^%W+HT3hce$WCmpB!e&`tqHA9_`kSI{06%Aw_QaT#y#`Nq1i~ zlb7kq&UK-94tvVdti=$sU3zzph_9$q97MYbOv`v02AE@W1veQShPT((6=C2G5-jJq z`pj~e&i*p!uJ*H^hZ%c0(#upv%GwaW#DZsZ!JU8lza!NfBA*=!eHVLd(;b!7Zh#dau*i%A3+lyo0y6sKf8S3#sFa|G<4-j`3=FXO#|i4VoZj(LxD zsvo^rh;>T`5t!GE031bXAXm|(f=7vUNwb&=bt2(h%0Jz|7e+1nvVvtZ6bQi+(m_N( za^UuV8vN`0Evie7y~>f)+z!SMDBVnJ02ZAlR-E-=V~T*YXU^|CxQL-1-ve~#wxq$2A9(WvjRgV zB+SK)68m|<5lLo&Ww^yG-1HN+rsD27<)fdhGtc*D=s(Y{7LhapG)M7 z^o;>Vi}C#s3nV-w$TN~hD7+vVj|!A}BqK;O?lfAT4p5qO)sRt)EeOw76b>^TUHPUi zsI&sOq^1)XrHXqF-a6A4qM7rBjxQu>Lt+qOJtD zrxhi7L})*@N(}-B^05b%`azyDQzNxGqSuUZ05Q94Q(Gr%045DbtXhJrU zxg--8`-lyw(=eHJM1mo+K)nO0{8}DT3P5Yp|v2 zi5Nua+n-vul2?fY7^NYh)?Y_`1WYF^mY`P7k}BBIU$Z1eY3fAs^R&08&J>&E!omiO z!Bx109f-Lr9s|p~z!9orT<&3byMXMi|AY{yhhwhvL=1+zT=AvJN$bY~L}6aG1;K=1 zI{Fc{EW!c^nVCT;?$0GCz`{3`z@%32Y&SBUi70w@?K zOrgoU*fN{>Ld@}c%@b})EOjLcD5Who17uIQ{TDx3rG}y?UUXNWS=avnaxuchA);zf zhXxt0xk~te8sMxa5g3jQR24Wd5}TW0J@C-D!m>~cT2LDpO_o^iusy+|5)TE3Mih6} ziJXmiSlm`bgBuptvhM(-HaxGT!2r-%j+YQ?nlE2gnAFo`H{<1^1>@j`Hz8px{ zCR5ql1QAizjUl!}jF&60#IbOK2K~vGxF+^BE=7Uj5a%h{OcpFk$pk6)`MhBgmGEu< zim$p-vUY}%y~QwcwAnN!oEOv-vsp0toed_8JW&&B#8uq3E*u$UD-%Fg2?A?@krs?( z_&{9lh|;68p5(J;LcDfLk=t5n0WBas+wCmAP-7J259tXyZCuMdoeHsWBfziF<&Nhb zXv|^i!zziH=7Li-mXo{ionjmWBVS)>Icfs5%Gu>b=wBu{(pMe5h3phTx+^J4&}bW<+$Eo8AB%w&OSF`4@pwmM zD&+Pfx0h8*`~w6p<5u&ER$j?Cp$(Xm|Msw4d`s;4llB{ ztY{4r*#@$CbnRO;~A8 zEhq3}CcV*Da{X2hL*wKhQ0CPPkfyDENo#|!53@)_4nW7i7aIF4QyL%ba;f=sBff+O z-sh4)kSY#b=deo6E{lB;qafSn@#jqVN-`Ft`4R|==3{z&n-#8%_M3G2L9@u$0?g{y zy^!8;PAI7Axq(YrVq&5*UjjmhiAeEgc-;tuwk48F&f@OeYIP1K9?rtbcv(Dy(Tm8~ z93YO(`4?Ni$D#T)6u4kTBNdA9;n2Tt0e~<=-UJs*4O64NVV+7zsZ5Y>GVkOP$ zDb!wuL%D7oycs15NSRE8Ypkg#21q*P(L6NB z&10TP=Fm(foWe8(I7T8$j3^oO+O3Y_sF}h1Gymw zg!_C7Uom~&2Rr*1anz`}cS2~T63F+&0S%$e_--;k;;(4HLZ3+KADldFzQl*on#HZI z8@Ko{c1ci2OJcr z2=9go|Cq2?dqYKB$4H=*(~$6skb(L8sf}!_EoS!?4ltUMD5lz{KaS`wz8!xQ2Qg#WtEbyN$6 zBE^8tFNr0#QT{|Ne-tn^+Ki@B7YJ&D5i(kVT*tkkDd5@kw=z;&?tm0RIj*xj4YBMm zsnoyyi{DH42R|N&P;Zcmon+yE^o9@y2Z@)qo)8r?UNM49!`ST1x$gfI^nldt>(3)X z`JNpyOn4OK<4`7&M}r_#SWMbsG)=Gv1Sn=9DtgF@3rm$g{r;~f9cBM_q3{1g*xp$l zgH#0$06@tM06^xye|BekSEql-{yzpHO+8%x3*F;d{##Rf>GBt)SJqxrj%%QGHVx1E zNA7Jh`mxO2-2Tz>+SYlIG#)O99sR!BXTml)Z3E#lpj3>K8^71(TD4E`hq%rqc44c; z{hW}tlqnzjC$T)?uz3#|U#5pL=FP%hvA^e_?;eZ{yGaUitW{%PXTi?+-#IFcd>4A!;HY;+ZphC;agpq)tbqh=iw(A z;4Q`MBYrL1RN$}WS+Cu!eQtHWOOlsaCw3akg{Mj0=V>8dX4RPTkuvoE*7-$GPr3jYh zE;M3t8sd79&Sf!c8?orFLd$~S5J;6|xHHkvvlI~j);<}fEL)ZLR44zeAMX{#XP}2z z+Yfxm9Zq`1BCO^t6koGuZMz{C%uLOr&lQ2xNG523m5>QGIS$}t-Nv_KlH~3d_1bd1 z{8oTY;bIPbytI58#y;uowsG^<$&tCR@Bd0D07$JVq7Vq!>F(kS)u;Jg>wT)joI{R9 zuK9&`(GlayxQBt@2<);A#B=$;)ZaeOJo~m4*UF{21>JoB&;{P`23Ql$_yf*-uIz+- z^x{Ir!8oxs4ma~kf_+B@kY;!M0{)@uex9$dzTBlgzh#A=VTz&QK zWWZ=3T{O8~V+zu<9b*F?$!qWK(zjWiSVI!!#8E{YYy{H%>^F47Fbe}c6wQjgtj+g4 zEb{J(cHgLlH^-NcmB+8A^Cma9pY5!7{M!KX^!f$iV=kdtZyYBJ3 z>w8&y&0@hjzvr2mciuhE%>2h?N5mzUiHPV1qMK8nS;`=@gg#?8vP*o@?kPUGKK}|A zwBS%IUfYRsGwF0|Ak5AO)xbejqx=BSWaA1yXSr$@iTb8OTA3r)$Ei{k*ryh0)z?sr zEliPVWIRGuQ3%tTT{yi6v{uD?D5A5>Uy-XSR!ZWEq;{?r2GSSW?WCR3U2Y7F1+|_* z?o)`*2uRG8l76}-9f2CEZCjR?@^rH077htA%Yqn#SEj{EQkd{*oyu+*TF0bjw@@fy zv%)Jk@ik#Cdl~*EFWq7YSE@6?#{Gq(yMyh4&ETbnj!wPIm^%+g!rGWSPNA9~TPS{~ z{C0D|>V0Gc6T?(qSNdp

h>JEGa)C-1A6-$Ja;?BUhHfh&ZEVsuQ75M=mpzBbz6Q zPd+g)wI(t_bowsJJxQ_Y!Ry=VTF?u9#Z;{y{5eDyBah+3RFI7$yMN^BC{6}}{!Ve| z0Suq->f~;FpvJ)q*ILDS*tE?6F}KUPQ4j0v3=fYcwcdB4J=GPBUi5mJTJBpZ$19(Y zmN^=Z3g$ZnzVcDYbswQ;&Aa(lU?|7XaLK&k?qqi;# zc*4E0#1mw@IB~SCk?4CdQko@?ZIZ#_TP`JWg|D|SDAW?V$RV~rwn}i-HT$<-kyb3Y zMubI3#lx%^JW-Lc>8V!}=ThRTbUMn`e($EG%tfa1P&xO}D9DG6j-7iVDu~XeP`^x= zUtN*b9&?@7*@V@?gQi$ZVDP+-Kmb9UAu=^U&WGPBo-G<@g+kw~<)e{Rld}z6`bhUh zN6yHLy~Fe^e9Er}o1`SlxXqMdT1(w6;BDn8xE2tnhD%BmSLg8qUocaBZg!V7p|i*c z$ci=SOcxjC+D)|zEC)0TrOu|KW{N8;7xt=cnU_CVY8ZTQYIyPWxjY*kSZdZ;SeDlJ zbmhK+rLJ?Sk)7%gMk>Pqe?C28PY8+mm^jR_)GPPtcjR(ZE+SG2mhMAcUtY&>C#|T^ zVqz0$Q^z#D=uliM-KJGRwu{A`vG7nCr$KqFJg%DO{?Jfzg$rfEKs^M1Qp)hK9oIVg z`0Noj*@EpNowMNZ_z@QI%;%RvXz#5d4rv>ZSQzvUkSf9gm8iWa!({V3x=|d_`h8=d z&&u;vBk%|q_BY5OJ+{$u1vk%}-Aaq9c*QLVtB+bU=cga&9+rC^49s`yteV6-_b#Fd zu)y|Lbo7gv(6#u-0L~RxK<@0PxyJnxBDwp|^tL(hH4s{3lHa>j7wtLNIu7I~hE+z9 zF{P6~&G}%)ZHv>!$r3xTH9z`LW(;4j$FsZvF>{hK9y<2ui4IkvJ3nSxV1tDkzn`s) z&Y0mWdXav2h#93x*;l3{Z z_(_i(3iBphw+>4_K7i7YD=TaaSB}P3rf@yeM{HW2pj|RT(=W5~1V|7`(`1&(hgP8W z+9j}myoDZx2N$@Rm00Law&u$8mX(^Fl_mpJ#!ihIM;U^iKQ3$wlr=gg8pb*r^_`5i z>^8>bnCh|T3~Wcq66=;x@OTed>#jNm5me>(kX(y_FiJDF zw)>q7odA9{LuljhQd=i|N1FbUOgjWoUe3ZNQU{m87i@cbpGr|0(bajwcM@@-!IwzmC}hY?h+?pF`^VkD#pzWSD!Te2*Yi@Aj0 zv%sB8pPf9N|7gMJi{t_n4niz-d8ui)k5w96T2oyeDlz<#dlt7qe|5t5Z{!IU#H+_LNAe+b3F0%w63y=AB+BOM%;Q^Xv%C0^yzHzEL8lRT zf3X@8+D=&Kp6f&BsIH}MZCqaeUSk~|3htJy&#hxz**vYS;KL<^h&GPVaZ{2({OuV; zXcF`=O3?nVVX>wgq4AE|IK9F8b^KevL=zck#LD_Gf21H^xpfft>|`B;@S=3>Gw3zb zH&jS6+}FqfJ`Kc!NL&Q2YNT!^zJa1Az=h~{@mEL&F2Az9}MC1H)h6Xd+ zx_GjLe=2(|OnVyVRBqymxl>RZ22%d&=x+2Cg%gJhW=?lJDYw&56>Awbr_Zcg@~N-f zHOn)Di#M-XB=4isl0a3YbteezM#&1btm{R!UhOn3ytETMaJ?^lY2I2C?k7| zRYL_Q5#hb!t8q?qfvvV6mp4H?!g^W?38gWK8ib28D}l*daPFd5F1NLP@`fX6T6dXY z>6p{9x_#MBY;@Re+pO{CiI}G&!vJHGps4iNGMk|hGqyvWdI+|Nf0q;RbwqT7*HNBl zW4rC;@c`VKe#{4d+nJ7lk($J+cdsa7t2i2i6}x*@Lc^)6J7SHJ=hNGzpN6XPN}F8^ zLns+xY%aEUtw3K#$m0Y^2YP0klauH_2hoanrxP0P58>}BcCDh5atcL}+sEoamB4PaJ-ZX5TDt?3DnwTX z2mc#$sFjmd1KiE@o6?aBXnkc#H5nxPaJsVe{TBgBW5`QY2%4K|;{|Uvym(BtwRA@YK#zRQXdoPFfat##?7(c^q_7(QmBX5QO=IHhR zVf5Wms4h*9T5kdl{Fg_d_iA~94yX|uX%#68SLsbaIw!%XDY*xndU zAd1!%qak(Ji_RJAv-^^-x>+65@x}aLc_bFKgWIy~*-|2K#LRNh2N8aElFlz-bGndiIRl|EqS&HC^L&kJe+}! zcpBt3!+GfV5P6tM0((?Bro~v0HWx?fP|)J7Jr7TXq0^pDStuSyzp@tY{DUCc42Pca zh%Hq0rjJKS@D4TIk~1q4Yqnae`cPvCYFt|2LD}wh?oc8$1nz3K%A)S86tjX`|hk8OGpoIWO^C5x;_@F8G zf^jM>?=4$dgS%)GvERc@5Uv!g(?i8Le~@4N7Lx>o36ehRt5+KAn2CzIT*xy#Tw$mm zh6<#!@Ov`c%%<3SC~;xd_qv9J7#MVxq~wbHWb@NIHshO7p5PkW?R1Vh^5B)AiOmJY zxA=jDY_dw0y=&h*VI~kj77aFKoEoH7!j=Q^Sr}O?^r)J#yL`++sY6}LqCLXyv3FVu zTb8uWDsuLA(Q4G9H{E$m42J-Ek8 zegh>IlrBydCIwQZsh8L(OgVQh4a)fG+b6Wr z(;?0l0hzLZL{sXP1Z9MJIeWQ{orjsvfHRE zP7MhFR6zj%-2c2Eu`smPHPE%!r8l#)vJ6pDuo_`Ry`hOoVK=pjbi4?lP!+#K%g5gV@llBp!zAN1&_0f_eb&B|;o-82*8hpjrxjqDon;u-Q%X zs1i^Pg1u~K3n$phXIEcMP>BxbRI`ca;6B4hjHHXY;%iOHCe__Jd9wJNEO;&ydOifY zF`Y};NJo**j3!E2aka1}h-b{}Ue>~d_BaaPcqnQzlRoMSg-3SPx-PCNeGmQ0D;KkC zinmn2IBWbmMVI^aSQO3OSAvh$gs}DV^6{%yqW4a_#k$R^tQCqR30ILEhbvFiLDRK; z5}FbdCxVSa3!by|jr1G~F(~HQAz5_FpDeF@M=3&fqhBa%wY5%9f254moJ^nM;*4xE zV+gIZnCXY?yFPjwgHL8+ses4)nML>cArKI?LTykH?l-ZEX4vEow|QpUBN&@ISR1U7 zjBk_S_SwU%G-I1EGs~>JIgv(Fth+Z7?FM^8lmhPshamW9e&Va(t)e#OCfo!uvEBC4m82XH0z31>S^4 z`!Lm&H?qt)=8Sv~owI3O+bl~q`{m|XK^-UECF1pJ^x{;fc=uLPS<5yy^%w)%8@Qls zLa$o2zUoZhKzx4}-?qW)$;N$jaNENGe?WyJ_iz7+~`h1{nug*auk#SKxaF7=})0$B`b>N%nP1mn%M|qLx{OmyoVee4NWV z+}ArGH74`10KDmwRJitz!I@v)N=re5b?3k$1|0v~U>OmhfUp2iph{)Va)uqFaa{>t z2ix3RJU`O$VQ_Wa8w`s<*1m+|233y47?Z>TVKXwr368dB`Xx1#Q%)w`j_8y{0U(a* zt|QOJqYM@5ElI59&2pNJmqy$N zf|SQ8Tw1VCqDu36d{;h~!we0qGYn`q@nK_UAzEiozr~LocHuYSucl?IQ;>ZeSh zGP*Yslu$4{9yo$IeOl{-{0@!}I3O~RgD1eopx9Dnj4o_5BM zO+f2M(s4Q%X;6T=GI7@Cp8ATWR|!^Jglm2{4AP>eXYK~cIHF$;+EG$UioUz2{?VS7 zlrS8}lYbZ^GZ;U%=fSL_6}+^K~HGuX+DEv&f9Tq@YDSqL$$Mg;=N6u018NYP^cK%Xp_B=(P}S&qYx zthY?l(d3xnEwEXY5YUYiH)-{(^m>QsaX{jLLbUYQ;SEJ%bO;{^I`Vt`LQHQ)4I|`- znqHDYBO|x$)9OWict@*-g{>+)hcz|izjOMj*B2!NA}udS?C}z`iCz0JvYoc&92T(f zAg0ZYXPnLy@4V`;aM}2+}|^;KX7h4 zt>qNKj7Q9n7|@j@t8=U=T4PCpd`qe{>4&X7^s;X|ptrW*5~U`tsnOWIKyK^x+!K`) zXL2zstQnDL)CPs}K>qWOh)w!)x}+}K5ULG=0{jW2oSoQGJHo1zM%9aYL9U0n6b;#K zX9Qz?^-BqKgT7;fxZ|1!hjr6HRp4AXIUBT?*NV-t^@F+GqBX^y-pp2qND zO4H4$Zy2pm!DrnpU+DIWaiS08Si;YIm!eEOPHSVlv8)la$%>0&J?f{La2G6(Cni(d zn|^$8jb4WH+ynQ|k>Ix%+duE06-9*P6oortB?AcD)__?|0)&NizSDy5Q~c2eMNe+dzK`iA7n~!`xxEqmvMU7G7nFNFv|!8$R)YdP))}4>hizN(2}Yk zF;!1Jh3ns+onW9uWko4YjG?lhlW@2m3esC&s(xzMo41)(Tt$uixFOl^GdpX!k8-q` zhcy{9(@Y0)%Z-`c%aC1ld^O@(3u1cBq{b(<%3Sy-q>`;3nGhlV+zFtAo7CQQB!27Q z%#9N5C94WP_r&W@7>=l3SETzd=Fj};KIt9Xg@jD#;ODbe0`ozJLKAldEGyo9M)24g&k!sB6%-#wsk#*b11b? zFb6I0IaFtvC)*At$hoNXk~4^Yfe`{l%@bda*_AlDXj{o0_kv!5ocVsQc%AZgosI(B zK@V;N39cIm@5(daT=P7y*&`qBkd^jR!@*{Fd9!kX^7_NkH&|TU6>b%fHS8<=wgmTq zoYN(t7w~B|$p*a1YX|vartYv+gQp)-_02hT3SO%Y>OZC{X0Oqmbgx0MfrOcgD0PCx z#zcc(?s8)BGt`(hh7_MlEAV<18=|#oYmPfiZhVPT4C-|RY07OwQ*3`uMnm;CT(DyW zArYMiOS@yAj&M5(tY8r!ZjbgptT_zgdPM~Tus2mR1jfvls9NBi)VDdj3qmn|R=qA= zx2$zM%>v<5fg|TZ8}x7jWF0WFZ#$t@Za;L@kt)MM8Yv(|p+~(~oCxF+tR}(0LeZBJ zn2&zBN6Ub4v)L15WEWM@e$7oIY8qSS&`bR}(4vx4+}B{;09Gsfz+1txSRS!&neg@D zY|JKl{`=+N<_7W3ZI7Xk8c8}nk)|ki<8Q5$y+?{jmDa_eiQ!%m&4)x{J;Q(3cs3j< zD@VQ*v8y0uHJHhxwnZNUS<(MW_=AgeCNfR3L{2MxwxtBICn?nc4lfmHG`2w)zE&ci z^4wBl>o$uV@+mwehG&{3q8fR>Q4P+3Na{(|P9<$0vMlMk2>%F;3O`&-&iv8Y6-vT@ zZ4QibvZfYU0m2->8(mz82{B>?OPIH{TB|gJsw%yjnXtb2=eWmd!Lwjzr6nKiz!T$K zaTI@)3JyD1K3R3Qm3$bOZ3soMmd?qd{H|(vRAR1~Fu$b~*tw}VYhUh=EVUxKOmp!u z94P+4F&;x&Byqb@xH9(x)3isc9~2fbpS;brz^!4&eoM9Re6 z@VZvQc>k_#gR&*5=k+0_yc7f^#=YAy2OQvb6oSjIdZP#d0HnkG`9&T4hd-`N@7v@* z`Pxor?ZQmYL1$@aZEj3&ZEx~-f_R1e?IIZfc&Poyh5EngZIbDo3FaDD>Dw`AYnxh{ z+G}gmTf6-I?kTV)bf(`&&v)QH-}LdHgO+a@WO|Q&yBoZS#^}zSFxFVyuV6V`&%#>Ja#oTw6wqD z@NE-?#Pxxw1-FbN@X%5H8y%cxdOu+PZHIqpz-^e@$Q1mf{qU&V76d;x6%;QV0APy; z0Py`_hY)xO{__U^7v?WF|7uBp7QCUQgT>uizSU~K&Hv}MJP!`2{bSgl@_)Z*ytllo zXc}xj1OVUzxJk+V;2b~CZ}Y(Vg3qKTleoC%k-@TGQFXF z|GV&CxqtU$fbSMSh5oh$|9Vcq-BSO1y~}=Mg40ZI$i)8^_E#?7Rn+{3&-8BkefBR! zFMd+%e|P>?XXD$I=}leu+s^;efL|5EU73vURvi2vthg(h@$V}Bc7^h{E7NKb zSARDD^POcm`HxvY%m&>h-Hq~pCml}zW75xK{&$ggWBlKd#xwsI`9sA2F6nNR|2t{m zpOgNG`QIhn4a Date: Tue, 11 Jun 2019 14:33:01 -0700 Subject: [PATCH 02/30] added v1 libraries --- ...ntaineranalysis-0.1.0-py2.py3-none-any.whl | Bin 62707 -> 24103 bytes .../grafeas-0.1.0-py2.py3-none-any.whl | Bin 0 -> 66260 bytes .../container_analysis/requirements.txt | 5 +- .../container_analysis/samples.py | 8 +-- .../container_analysis/samples_test.py | 64 ++++++------------ 5 files changed, 28 insertions(+), 49 deletions(-) create mode 100644 container_registry/container_analysis/grafeas-0.1.0-py2.py3-none-any.whl diff --git a/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl b/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl index 675e4434814d05329d0d16d95e09a0181060d0d7..2819d3cc925ca8e4576239a021c1a976d45ce595 100644 GIT binary patch literal 24103 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 IgZ+2^1^Ng{?EnA( literal 62707 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 Z4Tc(1lTeZ0*Yf9;z-cvNEv7WW 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%0A1;k0Y5`ylPPjgjq(P3hensar=Hw63l>HMtE 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 literal 0 HcmV?d00001 diff --git a/container_registry/container_analysis/requirements.txt b/container_registry/container_analysis/requirements.txt index 51008c6420d..13580946e77 100644 --- a/container_registry/container_analysis/requirements.txt +++ b/container_registry/container_analysis/requirements.txt @@ -1,2 +1,5 @@ google-cloud-pubsub == 0.30.0 -./google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl \ No newline at end of file +./google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl +grafeas-0.1.0-py2.py3-none-any.whl +pytest +mock diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index eac7cb0236a..134ac2a51bd 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -16,12 +16,10 @@ from time import sleep from google.api_core.exceptions import AlreadyExists -from google.cloud.devtools.containeranalysis_v1alpha1 \ +from google.cloud.devtools.containeranalysis_v1 \ import container_analysis_client -from google.cloud.devtools.containeranalysis_v1alpha1.proto \ +from google.cloud.devtools.containeranalysis_v1.proto \ import containeranalysis_pb2 -from google.cloud.devtools.containeranalysis_v1alpha1.proto \ - import package_vulnerability_pb2 from google.cloud.pubsub import SubscriberClient @@ -215,7 +213,7 @@ def get_discovery_info(image_url, project_id): project_name = client.project_path(project_id) response = client.list_occurrences(project_name, filter_=filterStr) for occ in response: - print occ + print(occ) # [END discovery_info] diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index 78c81ddd385..bc75e2aecd2 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -18,10 +18,6 @@ from google.api_core.exceptions import InvalidArgument from google.api_core.exceptions import NotFound -from google.cloud.devtools.containeranalysis_v1alpha1.proto.\ - containeranalysis_pb2 import Occurrence -from google.cloud.devtools.containeranalysis_v1alpha1.proto.\ - package_vulnerability_pb2 import VulnerabilityType from google.cloud.pubsub import SubscriberClient import samples @@ -91,56 +87,38 @@ def test_delete_occurrence(self): # didn't raise exception we expected assert False - def test_update_occurrence(self): - new_type = "newType" - created = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID) - - vul_details = VulnerabilityType.VulnerabilityDetails() - vul_details.type = new_type - update_prototype = Occurrence(note_name=created.note_name, - resource_url=self.image_url, - vulnerability_details=vul_details) - - samples.update_occurrence(update_prototype, created.name) - retrieved = samples.get_occurrence(created.name) - assert retrieved.vulnerability_details.type == new_type - # clean up - samples.delete_occurrence(created.name) - def test_occurrences_for_image(self): - origCount = samples.get_occurrences_for_image(self.image_url, - PROJECT_ID) + orig_count = samples.get_occurrences_for_image(self.image_url, + PROJECT_ID) occ = samples.create_occurrence(self.image_url, self.note_id, PROJECT_ID) - newCount = 0 + new_count = 0 tries = 0 - while newCount != 1 and tries < TRY_LIMIT: + while new_count != 1 and tries < TRY_LIMIT: tries += 1 - newCount = samples.get_occurrences_for_image(self.image_url, - PROJECT_ID) + new_count = samples.get_occurrences_for_image(self.image_url, + PROJECT_ID) sleep(SLEEP_TIME) - assert newCount == 1 - assert origCount == 0 + assert new_count == 1 + assert orig_count == 0 # clean up samples.delete_occurrence(occ.name) def test_occurrences_for_note(self): - origCount = samples.get_occurrences_for_note(self.note_id, - PROJECT_ID) + orig_count = samples.get_occurrences_for_note(self.note_id, + PROJECT_ID) occ = samples.create_occurrence(self.image_url, self.note_id, PROJECT_ID) - newCount = 0 + new_count = 0 tries = 0 - while newCount != 1 and tries < TRY_LIMIT: + while new_count != 1 and tries < TRY_LIMIT: tries += 1 - newCount = samples.get_occurrences_for_note(self.note_id, - PROJECT_ID) + new_count = samples.get_occurrences_for_note(self.note_id, + PROJECT_ID) sleep(SLEEP_TIME) - assert newCount == 1 - assert origCount == 0 + assert new_count == 1 + assert orig_count == 0 # clean up samples.delete_occurrence(occ.name) @@ -158,19 +136,19 @@ def test_pubsub(self): # and be counted before we start the test sleep(SLEEP_TIME*TRY_LIMIT) # set the initial state of our counter - startVal = receiver.msg_count + 1 + start_val = receiver.msg_count + 1 # test adding 3 more occurrences - for i in range(startVal, startVal+3): + for i in range(start_val, start_val+3): occ = samples.create_occurrence(self.image_url, self.note_id, PROJECT_ID) print("CREATED: " + occ.name) tries = 0 - newCount = receiver.msg_count - while newCount != i and tries < TRY_LIMIT: + new_count = receiver.msg_count + while new_count != i and tries < TRY_LIMIT: tries += 1 sleep(SLEEP_TIME) - newCount = receiver.msg_count + new_count = receiver.msg_count print(str(receiver.msg_count) + " : " + str(i)) assert i == receiver.msg_count samples.delete_occurrence(occ.name) From 210451c5819b74a744965ae6b95892100c7e4960 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 14:36:35 -0700 Subject: [PATCH 03/30] updated region tags --- .../container_analysis/samples.py | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 134ac2a51bd..6a44d3743e5 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -23,7 +23,7 @@ from google.cloud.pubsub import SubscriberClient -# [START create_note] +# [START containeranalysis_create_note] def create_note(note_id, project_id): """Creates and returns a new note @@ -44,10 +44,10 @@ def create_note(note_id, project_id): note = containeranalysis_pb2.Note(vulnerability_type=type) response = client.create_note(parent, note_id, note) return response -# [END create_note] +# [END containeranalysis_create_note] -# [START create_occurrence] +# [START ccontaineranalysis_create_occurrence] def create_occurrence(image_url, parent_note_id, project_id): """Creates and returns a new occurrence @@ -72,10 +72,9 @@ def create_occurrence(image_url, parent_note_id, project_id): resource_url=image_url, vulnerability_details=vul) return client.create_occurrence(project_name, occurrence) -# [END create_occurrence] +# [END containeranalysis_create_occurrence] - -# [START update_note] +# [START containeranalysis_update_note] def update_note(updated, note_id, project_id): """Makes an update to an existing note @@ -93,10 +92,10 @@ def update_note(updated, note_id, project_id): note_name = client.note_path(project_id, note_id) client.update_note(note_name, updated) -# [END update_note] +# [END containeranalysis_update_note] -# [START update_occurrence] +# [START containeranalysis_update_occurrence] def update_occurrence(updated, occurrence_name): """Makes an update to an existing occurrence @@ -112,10 +111,10 @@ def update_occurrence(updated, occurrence_name): """ client = container_analysis_client.ContainerAnalysisClient() client.update_occurrence(occurrence_name, updated) -# [END update_occurrence] +# [END containeranalysis_update_occurrence] -# [START delete_note] +# [START containeranalysis_delete_note] def delete_note(note_id, project_id): """Deletes an existing note @@ -132,10 +131,10 @@ def delete_note(note_id, project_id): note_name = client.note_path(project_id, note_id) client.delete_note(note_name) -# [END delete_note] +# [END containeranalysis_delete_note] -# [START delete_occurrence] +# [START containeranalysis_delete_occurrence] def delete_occurrence(occurrence_name): """Deletes an existing occurrence @@ -150,10 +149,10 @@ def delete_occurrence(occurrence_name): """ client = container_analysis_client.ContainerAnalysisClient() client.delete_occurrence(occurrence_name) -# [END delete_occurrence] +# [END containeranalysis_delete_occurrence] -# [START get_note] +# [START containeranalysis_get_note] def get_note(note_id, project_id): """Retrieves a note based on it's noteId and projectId @@ -171,10 +170,10 @@ def get_note(note_id, project_id): note_name = client.note_path(project_id, note_id) response = client.get_note(note_name) return response -# [END get_note] +# [END containeranalysis_get_note] -# [START get_occurrence] +# [START containeranalysis_get_occurrence] def get_occurrence(occurrence_name): """Retrieves an occurrence based on it's name @@ -190,10 +189,10 @@ def get_occurrence(occurrence_name): """ client = container_analysis_client.ContainerAnalysisClient() return client.get_occurrence(occurrence_name) -# [END get_occurrence] +# [END containeranalysis_get_occurrence] -# [START discovery_info] +# [START containeranalysis_discovery_info] def get_discovery_info(image_url, project_id): """prints the Discovery occurrence created for a specified image This occurrence contains information about the initial scan on the image @@ -214,10 +213,10 @@ def get_discovery_info(image_url, project_id): response = client.list_occurrences(project_name, filter_=filterStr) for occ in response: print(occ) -# [END discovery_info] +# [END containeranalysis_discovery_info] -# [START occurrences_for_note] +# [START containeranalysis_occurrences_for_note] def get_occurrences_for_note(note_id, project_id): """Retrieves all the occurrences associated with a specified note @@ -241,10 +240,10 @@ def get_occurrences_for_note(note_id, project_id): # in this sample, we will simply count each one count += 1 return count -# [END occurrences_for_note] +# [END containeranalysis_occurrences_for_note] -# [START occurrences_for_image] +# [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(image_url, project_id): """Retrieves all the occurrences associated with a specified image @@ -269,10 +268,10 @@ def get_occurrences_for_image(image_url, project_id): # in this sample, we will simply count each one count += 1 return count -# [END occurrences_for_image] +# [END containeranalysis_occurrences_for_image] -# [START pubsub] +# [START containeranalysis_pubsub] def pubsub(subscription_id, timeout, project_id): """Handle incoming occurrences using a pubsub subscription @@ -338,4 +337,4 @@ def create_occurrence_subscription(subscription_id, project_id): else: success = False return success -# [END pubsub] +# [END containeranalysis_pubsub] From 121796a5aa691be33b644fefbcc6b271037141a4 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 14:39:35 -0700 Subject: [PATCH 04/30] removed doc comments --- .../container_analysis/samples.py | 154 ------------------ 1 file changed, 154 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 6a44d3743e5..638427eebfb 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -25,18 +25,6 @@ # [START containeranalysis_create_note] def create_note(note_id, project_id): - """Creates and returns a new note - - :param note_id: A user-specified identifier for the note. - :param project_id: the GCP project the note will be created under - :return: the newly created note - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() parent = client.project_path(project_id) @@ -49,20 +37,6 @@ def create_note(note_id, project_id): # [START ccontaineranalysis_create_occurrence] def create_occurrence(image_url, parent_note_id, project_id): - """Creates and returns a new occurrence - - :param image_url: the Container Registry URL associated with the image - example: "https://gcr.io/project/image@sha256:foo" - :param parent_note_id: the identifier of the associated note - :param project_id: the GCP project the occurrence will be created under - :return: the newly created occurrence - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() parent_name = client.note_path(project_id, parent_note_id) project_name = client.project_path(project_id) @@ -76,18 +50,6 @@ def create_occurrence(image_url, parent_note_id, project_id): # [START containeranalysis_update_note] def update_note(updated, note_id, project_id): - """Makes an update to an existing note - - :param updated: a Note object representing the desired updates to push - :param note_id: the identifier of the existing note - :param project_id: the GCP project the occurrence will be created under. - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() note_name = client.note_path(project_id, note_id) @@ -97,18 +59,6 @@ def update_note(updated, note_id, project_id): # [START containeranalysis_update_occurrence] def update_occurrence(updated, occurrence_name): - """Makes an update to an existing occurrence - - :param updated: an Occurrence object representing the desired updates - :param occurrence_name: the name of the occurrence to delete. - in format "projects/{projectId}/occurrences/{occurrence_id}" - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() client.update_occurrence(occurrence_name, updated) # [END containeranalysis_update_occurrence] @@ -116,17 +66,6 @@ def update_occurrence(updated, occurrence_name): # [START containeranalysis_delete_note] def delete_note(note_id, project_id): - """Deletes an existing note - - :param note_id: the identifier of the note to delete - :param project_id: the GCP project the occurrence will be created under - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() note_name = client.note_path(project_id, note_id) @@ -136,17 +75,6 @@ def delete_note(note_id, project_id): # [START containeranalysis_delete_occurrence] def delete_occurrence(occurrence_name): - """Deletes an existing occurrence - - :param occurrence_name: the name of the occurrence to delete. - in format "projects/{projectId}/occurrences/{occurrence_id}" - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() client.delete_occurrence(occurrence_name) # [END containeranalysis_delete_occurrence] @@ -154,18 +82,6 @@ def delete_occurrence(occurrence_name): # [START containeranalysis_get_note] def get_note(note_id, project_id): - """Retrieves a note based on it's noteId and projectId - - :param note_id: the note's unique identifier - :param project_id: the project's unique identifier - :return: the specified Note object - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() note_name = client.note_path(project_id, note_id) response = client.get_note(note_name) @@ -175,18 +91,6 @@ def get_note(note_id, project_id): # [START containeranalysis_get_occurrence] def get_occurrence(occurrence_name): - """Retrieves an occurrence based on it's name - - :param occurrence_name: the name of the occurrence to delete. - in format "projects/{projectId}/occurrences/{occurrence_id}" - :return: the specified Occurrence object - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() return client.get_occurrence(occurrence_name) # [END containeranalysis_get_occurrence] @@ -194,19 +98,6 @@ def get_occurrence(occurrence_name): # [START containeranalysis_discovery_info] def get_discovery_info(image_url, project_id): - """prints the Discovery occurrence created for a specified image - This occurrence contains information about the initial scan on the image - - :param image_url: the Container Registry URL associated with the image - example: "https://gcr.io/project/image@sha256:foo" - :param project_id: the GCP project the occurrence will be created under - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + image_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) @@ -218,18 +109,6 @@ def get_discovery_info(image_url, project_id): # [START containeranalysis_occurrences_for_note] def get_occurrences_for_note(note_id, project_id): - """Retrieves all the occurrences associated with a specified note - - :param note_id: the note's unique identifier - :param project_id: the project's unique identifier - :return: number of occurrences found - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ client = container_analysis_client.ContainerAnalysisClient() note_name = client.note_path(project_id, note_id) @@ -245,18 +124,6 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(image_url, project_id): - """Retrieves all the occurrences associated with a specified image - - :param note_id: the note's unique identifier - :param project_id: the project's unique identifier - :return: number of occurrences found - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ filterStr = "resourceUrl=\"" + image_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) @@ -273,13 +140,6 @@ def get_occurrences_for_image(image_url, project_id): # [START containeranalysis_pubsub] def pubsub(subscription_id, timeout, project_id): - """Handle incoming occurrences using a pubsub subscription - - :param subscription_id: the user-specified identifier for the subscription - :param timeout: the number of seconds to listen for pubsub messages - :param project_id: the project's unique identifier - :return: number of occurrence pubsub messages received - """ client = SubscriberClient() subscription_name = client.subscription_path(project_id, subscription_id) receiver = MessageReceiver() @@ -310,20 +170,6 @@ def pubsub_callback(self, message): def create_occurrence_subscription(subscription_id, project_id): - """Creates and returns a pubsub subscription listening to the - occurrence topic. This topic provides updates when occurrences are modified - - :param subscription_id: the user-specified identifier for the subscription - :param project_id: the project's unique identifier - :return: a bool indicating whether the subscription is ready to use - if the subscription was already created, it will return True - :raises - google.api_core.exceptions.GoogleAPICallError: If the request - failed for any reason. - google.api_core.exceptions.RetryError: If the request failed due - to a retryable error and retry attempts failed. - ValueError: If the parameters are invalid. - """ topic_id = "resource-notes-occurrences-v1alpha1" client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) From 84caf87772378b7b87b96aa0866190e7e48e822f Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 14:41:29 -0700 Subject: [PATCH 05/30] removed update samples --- .../container_analysis/samples.py | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 638427eebfb..1def17c3690 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -35,6 +35,15 @@ def create_note(note_id, project_id): # [END containeranalysis_create_note] +# [START containeranalysis_delete_note] +def delete_note(note_id, project_id): + client = container_analysis_client.ContainerAnalysisClient() + note_name = client.note_path(project_id, note_id) + + client.delete_note(note_name) +# [END containeranalysis_delete_note] + + # [START ccontaineranalysis_create_occurrence] def create_occurrence(image_url, parent_note_id, project_id): client = container_analysis_client.ContainerAnalysisClient() @@ -48,30 +57,6 @@ def create_occurrence(image_url, parent_note_id, project_id): return client.create_occurrence(project_name, occurrence) # [END containeranalysis_create_occurrence] -# [START containeranalysis_update_note] -def update_note(updated, note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() - note_name = client.note_path(project_id, note_id) - - client.update_note(note_name, updated) -# [END containeranalysis_update_note] - - -# [START containeranalysis_update_occurrence] -def update_occurrence(updated, occurrence_name): - client = container_analysis_client.ContainerAnalysisClient() - client.update_occurrence(occurrence_name, updated) -# [END containeranalysis_update_occurrence] - - -# [START containeranalysis_delete_note] -def delete_note(note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() - note_name = client.note_path(project_id, note_id) - - client.delete_note(note_name) -# [END containeranalysis_delete_note] - # [START containeranalysis_delete_occurrence] def delete_occurrence(occurrence_name): From 17269c22b43aacc91ab41410dadbbe11fb95a2b5 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 14:55:26 -0700 Subject: [PATCH 06/30] updated parameters to be consistent with other languages --- .../container_analysis/samples.py | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 1def17c3690..a2f7b0ba871 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -45,23 +45,24 @@ def delete_note(note_id, project_id): # [START ccontaineranalysis_create_occurrence] -def create_occurrence(image_url, parent_note_id, project_id): +def create_occurrence(resource_url, note_id, occurrence_project, note_project): client = container_analysis_client.ContainerAnalysisClient() - parent_name = client.note_path(project_id, parent_note_id) - project_name = client.project_path(project_id) + formatted_note = client.note_path(note_project, note_id) + formatted_project = client.project_path(occurrence_project) vul = package_vulnerability_pb2.VulnerabilityType.VulnerabilityDetails() - occurrence = containeranalysis_pb2.Occurrence(note_name=parent_name, - resource_url=image_url, + occurrence = containeranalysis_pb2.Occurrence(note_name=formatted_note, + resource_url=resource_url, vulnerability_details=vul) - return client.create_occurrence(project_name, occurrence) + return client.create_occurrence(formatted_project, occurrence) # [END containeranalysis_create_occurrence] # [START containeranalysis_delete_occurrence] -def delete_occurrence(occurrence_name): +def delete_occurrence(occurrence_id, project_id): client = container_analysis_client.ContainerAnalysisClient() - client.delete_occurrence(occurrence_name) + formatted_parent = client.occurrence_path(project_id, occurrence_id) + client.delete_occurrence(formatted_parent) # [END containeranalysis_delete_occurrence] @@ -75,15 +76,16 @@ def get_note(note_id, project_id): # [START containeranalysis_get_occurrence] -def get_occurrence(occurrence_name): +def get_occurrence(occurrence_id, project_id): client = container_analysis_client.ContainerAnalysisClient() - return client.get_occurrence(occurrence_name) + formatted_parent = client.occurrence_path(project_id, occurrence_id) + return client.get_occurrence(formatted_parent) # [END containeranalysis_get_occurrence] # [START containeranalysis_discovery_info] -def get_discovery_info(image_url, project_id): - filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + image_url + "\"" +def get_discovery_info(resource_url, project_id): + filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resource_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) response = client.list_occurrences(project_name, filter_=filterStr) @@ -108,8 +110,8 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] -def get_occurrences_for_image(image_url, project_id): - filterStr = "resourceUrl=\"" + image_url + "\"" +def get_occurrences_for_image(resource_url, project_id): + filterStr = "resourceUrl=\"" + resource_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) @@ -124,7 +126,7 @@ def get_occurrences_for_image(image_url, project_id): # [START containeranalysis_pubsub] -def pubsub(subscription_id, timeout, project_id): +def pubsub(subscription_id, timeout_seconds, project_id): client = SubscriberClient() subscription_name = client.subscription_path(project_id, subscription_id) receiver = MessageReceiver() From f688b3837977d688393eb993c250d73927b2f6bd Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 15:11:03 -0700 Subject: [PATCH 07/30] resolved compiler errors --- .../container_analysis/samples.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index a2f7b0ba871..18658b7ecc7 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -18,18 +18,17 @@ from google.api_core.exceptions import AlreadyExists from google.cloud.devtools.containeranalysis_v1 \ import container_analysis_client -from google.cloud.devtools.containeranalysis_v1.proto \ - import containeranalysis_pb2 from google.cloud.pubsub import SubscriberClient +from grafeas.grafeas_v1.types import Note, Occurrence + # [START containeranalysis_create_note] def create_note(note_id, project_id): client = container_analysis_client.ContainerAnalysisClient() parent = client.project_path(project_id) - type = package_vulnerability_pb2.VulnerabilityType() - note = containeranalysis_pb2.Note(vulnerability_type=type) + note = Note(vulnerability_type=type) response = client.create_note(parent, note_id, note) return response # [END containeranalysis_create_note] @@ -49,11 +48,9 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): client = container_analysis_client.ContainerAnalysisClient() formatted_note = client.note_path(note_project, note_id) formatted_project = client.project_path(occurrence_project) - vul = package_vulnerability_pb2.VulnerabilityType.VulnerabilityDetails() - occurrence = containeranalysis_pb2.Occurrence(note_name=formatted_note, - resource_url=resource_url, - vulnerability_details=vul) + occurrence = Occurrence(note_name=formatted_note, + resource_url=resource_url) return client.create_occurrence(formatted_project, occurrence) # [END containeranalysis_create_occurrence] @@ -85,10 +82,10 @@ def get_occurrence(occurrence_id, project_id): # [START containeranalysis_discovery_info] def get_discovery_info(resource_url, project_id): - filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resource_url + "\"" + filter_str = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resource_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) - response = client.list_occurrences(project_name, filter_=filterStr) + response = client.list_occurrences(project_name, filter_=filter_str) for occ in response: print(occ) # [END containeranalysis_discovery_info] @@ -111,11 +108,11 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(resource_url, project_id): - filterStr = "resourceUrl=\"" + resource_url + "\"" + filter_str = "resourceUrl=\"" + resource_url + "\"" client = container_analysis_client.ContainerAnalysisClient() project_name = client.project_path(project_id) - response = client.list_occurrences(project_name, filter_=filterStr) + response = client.list_occurrences(project_name, filter_=filter_str) count = 0 for o in response: # do something with the retrieved occurrence @@ -134,7 +131,7 @@ def pubsub(subscription_id, timeout_seconds, project_id): # listen for 'timeout' seconds print("listening") - for _ in range(timeout): + for _ in range(timeout_seconds): sleep(1) # print and return the number of pubsub messages received print(receiver.msg_count) From 466943331e33f70543406970d3285ceed325fa27 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 18:35:45 -0700 Subject: [PATCH 08/30] got client working for development --- .../container_analysis/samples.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 18658b7ecc7..173b2f76113 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -20,12 +20,21 @@ import container_analysis_client from google.cloud.pubsub import SubscriberClient +from grafeas.grafeas_v1 import GrafeasClient +from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport from grafeas.grafeas_v1.types import Note, Occurrence +def tmp_create_client(): + address = "containeranalysis.googleapis.com:443" + scopes = ("https://www.googleapis.com/auth/cloud-platform") + transport = grafeas_grpc_transport.GrafeasGrpcTransport(address, scopes) + return GrafeasClient(transport) + + # [START containeranalysis_create_note] def create_note(note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() parent = client.project_path(project_id) note = Note(vulnerability_type=type) @@ -36,7 +45,7 @@ def create_note(note_id, project_id): # [START containeranalysis_delete_note] def delete_note(note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() note_name = client.note_path(project_id, note_id) client.delete_note(note_name) @@ -45,7 +54,7 @@ def delete_note(note_id, project_id): # [START ccontaineranalysis_create_occurrence] def create_occurrence(resource_url, note_id, occurrence_project, note_project): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() formatted_note = client.note_path(note_project, note_id) formatted_project = client.project_path(occurrence_project) @@ -57,7 +66,7 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): # [START containeranalysis_delete_occurrence] def delete_occurrence(occurrence_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() formatted_parent = client.occurrence_path(project_id, occurrence_id) client.delete_occurrence(formatted_parent) # [END containeranalysis_delete_occurrence] @@ -65,7 +74,7 @@ def delete_occurrence(occurrence_id, project_id): # [START containeranalysis_get_note] def get_note(note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() note_name = client.note_path(project_id, note_id) response = client.get_note(note_name) return response @@ -74,7 +83,7 @@ def get_note(note_id, project_id): # [START containeranalysis_get_occurrence] def get_occurrence(occurrence_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() formatted_parent = client.occurrence_path(project_id, occurrence_id) return client.get_occurrence(formatted_parent) # [END containeranalysis_get_occurrence] @@ -83,7 +92,7 @@ def get_occurrence(occurrence_id, project_id): # [START containeranalysis_discovery_info] def get_discovery_info(resource_url, project_id): filter_str = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resource_url + "\"" - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() project_name = client.project_path(project_id) response = client.list_occurrences(project_name, filter_=filter_str) for occ in response: @@ -93,7 +102,7 @@ def get_discovery_info(resource_url, project_id): # [START containeranalysis_occurrences_for_note] def get_occurrences_for_note(note_id, project_id): - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() note_name = client.note_path(project_id, note_id) response = client.list_note_occurrences(note_name) @@ -109,7 +118,7 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(resource_url, project_id): filter_str = "resourceUrl=\"" + resource_url + "\"" - client = container_analysis_client.ContainerAnalysisClient() + client = tmp_create_client() project_name = client.project_path(project_id) response = client.list_occurrences(project_name, filter_=filter_str) From 0894f7661d009db5511cf3feb7364f7d74065f7b Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 11 Jun 2019 19:03:31 -0700 Subject: [PATCH 09/30] added sample note --- .../container_analysis/samples.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 173b2f76113..ed22ea4d97a 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -16,13 +16,12 @@ from time import sleep from google.api_core.exceptions import AlreadyExists -from google.cloud.devtools.containeranalysis_v1 \ - import container_analysis_client from google.cloud.pubsub import SubscriberClient from grafeas.grafeas_v1 import GrafeasClient +from grafeas.grafeas_v1.gapic.enums import Version from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport -from grafeas.grafeas_v1.types import Note, Occurrence +from grafeas.grafeas_v1.types import Occurrence def tmp_create_client(): @@ -35,10 +34,24 @@ def tmp_create_client(): # [START containeranalysis_create_note] def create_note(note_id, project_id): client = tmp_create_client() - parent = client.project_path(project_id) - - note = Note(vulnerability_type=type) - response = client.create_note(parent, note_id, note) + project_name = client.project_path(project_id) + note = { + "vulnerability": { + "details": [ + { + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "min_affected_version": { + "kind": Version.VersionKind.MINIMUM + }, + "fixed_version": { + "kind": Version.VersionKind.MAXIMUM + }, + } + ] + } + } + response = client.create_note(project_name, note_id, note) return response # [END containeranalysis_create_note] From c5cb60a5c02a894ba6234ae692cc84042d07f488 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 12 Jun 2019 11:33:56 -0700 Subject: [PATCH 10/30] updated create_occurrence --- .../container_analysis/samples.py | 24 +++++++++++--- .../container_analysis/samples_test.py | 31 +++++++++---------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index ed22ea4d97a..912b1ac1b32 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -21,7 +21,6 @@ from grafeas.grafeas_v1 import GrafeasClient from grafeas.grafeas_v1.gapic.enums import Version from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport -from grafeas.grafeas_v1.types import Occurrence def tmp_create_client(): @@ -46,7 +45,7 @@ def create_note(note_id, project_id): }, "fixed_version": { "kind": Version.VersionKind.MAXIMUM - }, + } } ] } @@ -71,8 +70,25 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): formatted_note = client.note_path(note_project, note_id) formatted_project = client.project_path(occurrence_project) - occurrence = Occurrence(note_name=formatted_note, - resource_url=resource_url) + occurrence = { + "note_name": formatted_note, + "resource_uri": resource_url, + "vulnerability": { + "package_issue": [ + { + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "min_affected_version": { + "kind": Version.VersionKind.MINIMUM + }, + "fixed_version": { + "kind": Version.VersionKind.MAXIMUM + } + } + ] + } + } + return client.create_occurrence(formatted_project, occurrence) # [END containeranalysis_create_occurrence] diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index bc75e2aecd2..cbe70392a68 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -14,6 +14,7 @@ # limitations under the License. from os import environ +from os.path import basename from time import sleep, time from google.api_core.exceptions import InvalidArgument @@ -57,30 +58,24 @@ def test_delete_note(self): # didn't raise exception we expected assert (False) - def test_update_note(self): - description = "updated" - self.note_obj.short_description = description - samples.update_note(self.note_obj, self.note_id, PROJECT_ID) - - updated = samples.get_note(self.note_id, PROJECT_ID) - assert updated.short_description == description - def test_create_occurrence(self): created = samples.create_occurrence(self.image_url, self.note_id, + PROJECT_ID, PROJECT_ID) - retrieved = samples.get_occurrence(created.name) + retrieved = samples.get_occurrence(basename(created.name), PROJECT_ID) assert created.name == retrieved.name # clean up - samples.delete_occurrence(created.name) + samples.delete_occurrence(basename(created.name), PROJECT_ID) def test_delete_occurrence(self): created = samples.create_occurrence(self.image_url, self.note_id, + PROJECT_ID, PROJECT_ID) - samples.delete_occurrence(created.name) + samples.delete_occurrence(basename(created.name), PROJECT_ID) try: - samples.get_occurrence(created.name) + samples.get_occurrence(basename(created.name), PROJECT_ID) except NotFound: pass else: @@ -90,7 +85,9 @@ def test_delete_occurrence(self): def test_occurrences_for_image(self): orig_count = samples.get_occurrences_for_image(self.image_url, PROJECT_ID) - occ = samples.create_occurrence(self.image_url, self.note_id, + occ = samples.create_occurrence(self.image_url, + self.note_id, + PROJECT_ID, PROJECT_ID) new_count = 0 tries = 0 @@ -102,13 +99,14 @@ def test_occurrences_for_image(self): assert new_count == 1 assert orig_count == 0 # clean up - samples.delete_occurrence(occ.name) + samples.delete_occurrence(basename(occ.name), PROJECT_ID) def test_occurrences_for_note(self): orig_count = samples.get_occurrences_for_note(self.note_id, PROJECT_ID) occ = samples.create_occurrence(self.image_url, self.note_id, + PROJECT_ID, PROJECT_ID) new_count = 0 tries = 0 @@ -120,7 +118,7 @@ def test_occurrences_for_note(self): assert new_count == 1 assert orig_count == 0 # clean up - samples.delete_occurrence(occ.name) + samples.delete_occurrence(basename(occ.name), PROJECT_ID) def test_pubsub(self): client = SubscriberClient() @@ -141,6 +139,7 @@ def test_pubsub(self): for i in range(start_val, start_val+3): occ = samples.create_occurrence(self.image_url, self.note_id, + PROJECT_ID, PROJECT_ID) print("CREATED: " + occ.name) tries = 0 @@ -151,6 +150,6 @@ def test_pubsub(self): new_count = receiver.msg_count print(str(receiver.msg_count) + " : " + str(i)) assert i == receiver.msg_count - samples.delete_occurrence(occ.name) + samples.delete_occurrence(basename(occ.name), PROJECT_ID) # clean up client.delete_subscription(subscription_name) From 132fc5c34721231825eb58973303a8775ae6eb7a Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 12 Jun 2019 15:21:25 -0700 Subject: [PATCH 11/30] got pubsub working --- .../container_analysis/samples.py | 7 +-- .../container_analysis/samples_test.py | 44 +++++++++---------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 912b1ac1b32..77713a558ab 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -177,7 +177,8 @@ def pubsub(subscription_id, timeout_seconds, project_id): class MessageReceiver: - """Custom class to handle incoming pubsub messages + """ + Custom class to handle incoming pubsub messages In this case, we will simply print and count each message as it comes in """ def __init__(self): @@ -187,12 +188,12 @@ def __init__(self): def pubsub_callback(self, message): # every time a pubsub message comes in, print it and count it self.msg_count += 1 - print("Message " + str(self.msg_count) + ": " + message.data) + print("Message {}: {}".format(self.msg_count, message.data)) message.ack() def create_occurrence_subscription(subscription_id, project_id): - topic_id = "resource-notes-occurrences-v1alpha1" + topic_id = "container-analysis-occurrences-v1beta1" client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) subscription_name = client.subscription_path(project_id, subscription_id) diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index cbe70392a68..b7145d2d80d 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -125,31 +125,27 @@ def test_pubsub(self): subscription_id = "drydockOccurrences" subscription_name = client.subscription_path(PROJECT_ID, subscription_id) - samples.create_occurrence_subscription(subscription_id, PROJECT_ID) - receiver = samples.MessageReceiver() - client.subscribe(subscription_name, receiver.pubsub_callback) - - # sleep so any messages in the queue can go through - # and be counted before we start the test - sleep(SLEEP_TIME*TRY_LIMIT) - # set the initial state of our counter - start_val = receiver.msg_count + 1 - # test adding 3 more occurrences - for i in range(start_val, start_val+3): - occ = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) - print("CREATED: " + occ.name) - tries = 0 - new_count = receiver.msg_count - while new_count != i and tries < TRY_LIMIT: - tries += 1 + tries = 0 + success = False + while not success and tries < TRY_LIMIT: + print(tries) + tries += 1 + receiver = samples.MessageReceiver() + client.subscribe(subscription_name, receiver.pubsub_callback) + + # test adding 3 more occurrences + total_created = 3 + for _ in range(total_created): + occ = samples.create_occurrence(self.image_url, + self.note_id, + PROJECT_ID, + PROJECT_ID) + sleep(SLEEP_TIME) + samples.delete_occurrence(basename(occ.name), PROJECT_ID) sleep(SLEEP_TIME) - new_count = receiver.msg_count - print(str(receiver.msg_count) + " : " + str(i)) - assert i == receiver.msg_count - samples.delete_occurrence(basename(occ.name), PROJECT_ID) + print('done. msg_count = ' + str(receiver.msg_count)) + success = receiver.msg_count == total_created + assert receiver.msg_count == total_created # clean up client.delete_subscription(subscription_name) From d5498f108de2d41b33eb243d091859bd4535b7d8 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 12 Jun 2019 17:15:33 -0700 Subject: [PATCH 12/30] implemented poll_discovery_occurrence --- .../container_analysis/samples.py | 46 ++++++++++++++++++- .../container_analysis/samples_test.py | 42 +++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 77713a558ab..57eae744717 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -13,12 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from time import sleep +import time from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient from grafeas.grafeas_v1 import GrafeasClient +from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence from grafeas.grafeas_v1.gapic.enums import Version from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport @@ -170,7 +171,7 @@ def pubsub(subscription_id, timeout_seconds, project_id): # listen for 'timeout' seconds print("listening") for _ in range(timeout_seconds): - sleep(1) + time.sleep(1) # print and return the number of pubsub messages received print(receiver.msg_count) return receiver.msg_count @@ -207,3 +208,44 @@ def create_occurrence_subscription(subscription_id, project_id): success = False return success # [END containeranalysis_pubsub] + + +# [START containeranalysis_poll_discovery_occurrence_finished] +def poll_discovery_finished(resource_url, timeout_seconds, project_id): + deadline = time.time() + timeout_seconds + + client = tmp_create_client() + project_name = client.project_path(project_id) + + discovery_occurrence = None + while discovery_occurrence is None: + time.sleep(1) + filter_str = 'resourceUrl="{}" \ + AND noteProjectId="goog-analysis" \ + AND noteId="PACKAGE_VULNERABILITY"'.format(resource_url) + # [END containeranalysis_poll_discovery_occurrence_finished] + # The above filter isn't testable, since it looks for occurrences in a + # locked down project fall back to a more permissive filter for testing + filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'\ + .format(resource_url) + # [START containeranalysis_poll_discovery_occurrence_finished] + print(filter_str) + result = client.list_occurrences(project_name, filter_str) + # only one occurrence should ever be returned by ListOccurrences + # and the given filter + for item in result: + discovery_occurrence = item + if time.time() > deadline: + raise TimeoutError('timeout while retrieving discovery occurrence') + + status = DiscoveryOccurrence.AnalysisStatus.PENDING + while status != DiscoveryOccurrence.AnalysisStatus.FINISHED_UNSUPPORTED \ + and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_FAILED \ + and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS: + time.sleep(1) + updated = client.get_occurrence(discovery_occurrence.name) + status = updated.discovery.analysis_status + if time.time() > deadline: + raise TimeoutError('timeout while waiting for terminal state') + return discovery_occurrence +# [END containeranalysis_poll_discovery_occurrence_finished] diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index b7145d2d80d..3bdcfac026a 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -21,6 +21,8 @@ from google.api_core.exceptions import NotFound from google.cloud.pubsub import SubscriberClient +from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence, NoteKind + import samples PROJECT_ID = environ['GCLOUD_PROJECT'] @@ -149,3 +151,43 @@ def test_pubsub(self): assert receiver.msg_count == total_created # clean up client.delete_subscription(subscription_name) + + def test_poll_discovery_occurrence(self): + # try with no discovery occurrence + try: + samples.poll_discovery_finished(self.image_url, 5, PROJECT_ID) + except TimeoutError: + pass + else: + # we expect timeout error + assert False + + # create discovery occurrence + note_id = "discovery-note-" + str(int(time())) + client = samples.tmp_create_client() + note = { + "discovery": { + "analysis_kind": NoteKind.DISCOVERY + } + } + client.create_note(client.project_path(PROJECT_ID), note_id, note) + occurrence = { + "note_name": client.note_path(PROJECT_ID, note_id), + "resource_uri": self.image_url, + "discovery": { + "analysis_status": DiscoveryOccurrence.AnalysisStatus + .FINISHED_SUCCESS + } + } + created = client.create_occurrence(client.project_path(PROJECT_ID), + occurrence) + + # poll again + disc = samples.poll_discovery_finished(self.image_url, 10, PROJECT_ID) + status = disc.discovery.analysis_status + assert disc is not None + assert status == DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS + + # clean up + samples.delete_occurrence(basename(created.name), PROJECT_ID) + samples.delete_note(note_id, PROJECT_ID) From 2e70dd281e939b60079ab879d2e0d52870523424 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 12 Jun 2019 17:24:18 -0700 Subject: [PATCH 13/30] use runtimeerror --- container_registry/container_analysis/samples.py | 4 ++-- container_registry/container_analysis/samples_test.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 57eae744717..d2c3920d688 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -236,7 +236,7 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): for item in result: discovery_occurrence = item if time.time() > deadline: - raise TimeoutError('timeout while retrieving discovery occurrence') + raise RuntimeError('timeout while retrieving discovery occurrence') status = DiscoveryOccurrence.AnalysisStatus.PENDING while status != DiscoveryOccurrence.AnalysisStatus.FINISHED_UNSUPPORTED \ @@ -246,6 +246,6 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): updated = client.get_occurrence(discovery_occurrence.name) status = updated.discovery.analysis_status if time.time() > deadline: - raise TimeoutError('timeout while waiting for terminal state') + raise RuntimeError('timeout while waiting for terminal state') return discovery_occurrence # [END containeranalysis_poll_discovery_occurrence_finished] diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index 3bdcfac026a..17774538d6c 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -156,7 +156,7 @@ def test_poll_discovery_occurrence(self): # try with no discovery occurrence try: samples.poll_discovery_finished(self.image_url, 5, PROJECT_ID) - except TimeoutError: + except RuntimeError: pass else: # we expect timeout error From ca2089403e2bc805703935530c533d7fc3311243 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 12 Jun 2019 17:52:29 -0700 Subject: [PATCH 14/30] implemented find_vulnerabilities and find_high_severity --- .../container_analysis/samples.py | 28 +++++++ .../container_analysis/samples_test.py | 83 +++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index d2c3920d688..06a0bea74e7 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -20,6 +20,7 @@ from grafeas.grafeas_v1 import GrafeasClient from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence +from grafeas.grafeas_v1.gapic.enums import Severity from grafeas.grafeas_v1.gapic.enums import Version from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport @@ -249,3 +250,30 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): raise RuntimeError('timeout while waiting for terminal state') return discovery_occurrence # [END containeranalysis_poll_discovery_occurrence_finished] + + +# [START containeranalysis_vulnerability_occurrences_for_image] +def find_vulnerabilities_for_image(resource_url, project_id): + client = tmp_create_client() + project_name = client.project_path(project_id) + + filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ + .format(resource_url) + return list(client.list_occurrences(project_name, filter_str)) +# [END containeranalysis_vulnerability_occurrences_for_image] + + +# [START containeranalysis_filter_vulnerability_occurrences] +def find_high_severity_vulnerabilities_for_image(resource_url, project_id): + client = tmp_create_client() + project_name = client.project_path(project_id) + + filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ + .format(resource_url) + all_vulnerabilities = client.list_occurrences(project_name, filter_str) + filtered_list = [] + for v in all_vulnerabilities: + if v.severity == Severity.HIGH or v.severity == Severity.CRITICAL: + filtered_list.append(v) + return filtered_list +# [END containeranalysis_filter_vulnerability_occurrences] diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index 17774538d6c..d8c64ebe84b 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -22,6 +22,8 @@ from google.cloud.pubsub import SubscriberClient from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence, NoteKind +from grafeas.grafeas_v1.gapic.enums import Severity +from grafeas.grafeas_v1.gapic.enums import Version import samples @@ -191,3 +193,84 @@ def test_poll_discovery_occurrence(self): # clean up samples.delete_occurrence(basename(created.name), PROJECT_ID) samples.delete_note(note_id, PROJECT_ID) + + def test_find_vulnerabilities_for_image(self): + occ_list = samples.find_vulnerabilities_for_image(self.image_url, + PROJECT_ID) + assert len(occ_list) == 0 + + created = samples.create_occurrence(self.image_url, + self.note_id, + PROJECT_ID, + PROJECT_ID) + tries = 0 + count = 0 + while count != 1 and tries < TRY_LIMIT: + tries += 1 + occ_list = samples.find_vulnerabilities_for_image(self.image_url, + PROJECT_ID) + count = len(occ_list) + sleep(SLEEP_TIME) + assert len(occ_list) == 1 + samples.delete_occurrence(basename(created.name), PROJECT_ID) + + def test_find_high_severity_vulnerabilities(self): + occ_list = samples.find_high_severity_vulnerabilities_for_image( + self.image_url, + PROJECT_ID) + assert len(occ_list) == 0 + + # create new high severity vulnerability + note_id = "discovery-note-" + str(int(time())) + client = samples.tmp_create_client() + note = { + "vulnerability": { + "severity": Severity.CRITICAL, + "details": [ + { + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "min_affected_version": { + "kind": Version.VersionKind.MINIMUM + }, + "fixed_version": { + "kind": Version.VersionKind.MAXIMUM + } + } + ] + } + } + client.create_note(client.project_path(PROJECT_ID), note_id, note) + occurrence = { + "note_name": client.note_path(PROJECT_ID, note_id), + "resource_uri": self.image_url, + "vulnerability": { + "package_issue": [ + { + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "min_affected_version": { + "kind": Version.VersionKind.MINIMUM + }, + "fixed_version": { + "kind": Version.VersionKind.MAXIMUM + } + } + ] + } + } + created = client.create_occurrence(client.project_path(PROJECT_ID), + occurrence) + # query again + tries = 0 + count = 0 + while count != 1 and tries < TRY_LIMIT: + tries += 1 + occ_list = samples.find_vulnerabilities_for_image(self.image_url, + PROJECT_ID) + count = len(occ_list) + sleep(SLEEP_TIME) + assert len(occ_list) == 1 + # clean up + samples.delete_occurrence(basename(created.name), PROJECT_ID) + samples.delete_note(note_id, PROJECT_ID) From 104c27a71015c6972c601402775bb8a63529fa8f Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 13 Jun 2019 14:56:59 -0700 Subject: [PATCH 15/30] moved imports into functions --- .../container_analysis/samples.py | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 06a0bea74e7..27f3306be44 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -13,19 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import time - -from google.api_core.exceptions import AlreadyExists -from google.cloud.pubsub import SubscriberClient - -from grafeas.grafeas_v1 import GrafeasClient -from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence -from grafeas.grafeas_v1.gapic.enums import Severity -from grafeas.grafeas_v1.gapic.enums import Version -from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport - def tmp_create_client(): + from grafeas.grafeas_v1 import GrafeasClient + from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport + address = "containeranalysis.googleapis.com:443" scopes = ("https://www.googleapis.com/auth/cloud-platform") transport = grafeas_grpc_transport.GrafeasGrpcTransport(address, scopes) @@ -34,6 +26,8 @@ def tmp_create_client(): # [START containeranalysis_create_note] def create_note(note_id, project_id): + from grafeas.grafeas_v1.gapic.enums import Version + client = tmp_create_client() project_name = client.project_path(project_id) note = { @@ -68,6 +62,8 @@ def delete_note(note_id, project_id): # [START ccontaineranalysis_create_occurrence] def create_occurrence(resource_url, note_id, occurrence_project, note_project): + from grafeas.grafeas_v1.gapic.enums import Version + client = tmp_create_client() formatted_note = client.note_path(note_project, note_id) formatted_project = client.project_path(occurrence_project) @@ -164,6 +160,10 @@ def get_occurrences_for_image(resource_url, project_id): # [START containeranalysis_pubsub] def pubsub(subscription_id, timeout_seconds, project_id): + import time + + from google.cloud.pubsub import SubscriberClient + client = SubscriberClient() subscription_name = client.subscription_path(project_id, subscription_id) receiver = MessageReceiver() @@ -195,6 +195,9 @@ def pubsub_callback(self, message): def create_occurrence_subscription(subscription_id, project_id): + from google.api_core.exceptions import AlreadyExists + from google.cloud.pubsub import SubscriberClient + topic_id = "container-analysis-occurrences-v1beta1" client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) @@ -213,6 +216,10 @@ def create_occurrence_subscription(subscription_id, project_id): # [START containeranalysis_poll_discovery_occurrence_finished] def poll_discovery_finished(resource_url, timeout_seconds, project_id): + import time + + from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence + deadline = time.time() + timeout_seconds client = tmp_create_client() @@ -265,6 +272,8 @@ def find_vulnerabilities_for_image(resource_url, project_id): # [START containeranalysis_filter_vulnerability_occurrences] def find_high_severity_vulnerabilities_for_image(resource_url, project_id): + from grafeas.grafeas_v1.gapic.enums import Severity + client = tmp_create_client() project_name = client.project_path(project_id) From e2a7d35001213ec97ce2feb0d5031dd80d526550 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 13 Jun 2019 15:28:53 -0700 Subject: [PATCH 16/30] replaces " with ' --- .../container_analysis/samples.py | 49 +++++++------- .../container_analysis/samples_test.py | 66 +++++++++---------- 2 files changed, 57 insertions(+), 58 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 27f3306be44..887b6760fc2 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -18,8 +18,8 @@ def tmp_create_client(): from grafeas.grafeas_v1 import GrafeasClient from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport - address = "containeranalysis.googleapis.com:443" - scopes = ("https://www.googleapis.com/auth/cloud-platform") + address = 'containeranalysis.googleapis.com:443' + scopes = ('https://www.googleapis.com/auth/cloud-platform') transport = grafeas_grpc_transport.GrafeasGrpcTransport(address, scopes) return GrafeasClient(transport) @@ -31,16 +31,16 @@ def create_note(note_id, project_id): client = tmp_create_client() project_name = client.project_path(project_id) note = { - "vulnerability": { - "details": [ + 'vulnerability': { + 'details': [ { - "affected_cpe_uri": "your-uri-here", - "affected_package": "your-package-here", - "min_affected_version": { - "kind": Version.VersionKind.MINIMUM + 'affected_cpe_uri': 'your-uri-here', + 'affected_package': 'your-package-here', + 'min_affected_version': { + 'kind': Version.VersionKind.MINIMUM }, - "fixed_version": { - "kind": Version.VersionKind.MAXIMUM + 'fixed_version': { + 'kind': Version.VersionKind.MAXIMUM } } ] @@ -69,18 +69,18 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): formatted_project = client.project_path(occurrence_project) occurrence = { - "note_name": formatted_note, - "resource_uri": resource_url, - "vulnerability": { - "package_issue": [ + 'note_name': formatted_note, + 'resource_uri': resource_url, + 'vulnerability': { + 'package_issue': [ { - "affected_cpe_uri": "your-uri-here", - "affected_package": "your-package-here", - "min_affected_version": { - "kind": Version.VersionKind.MINIMUM + 'affected_cpe_uri': 'your-uri-here', + 'affected_package': 'your-package-here', + 'min_affected_version': { + 'kind': Version.VersionKind.MINIMUM }, - "fixed_version": { - "kind": Version.VersionKind.MAXIMUM + 'fixed_version': { + 'kind': Version.VersionKind.MAXIMUM } } ] @@ -118,7 +118,7 @@ def get_occurrence(occurrence_id, project_id): # [START containeranalysis_discovery_info] def get_discovery_info(resource_url, project_id): - filter_str = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resource_url + "\"" + filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'.format(resource_url) client = tmp_create_client() project_name = client.project_path(project_id) response = client.list_occurrences(project_name, filter_=filter_str) @@ -144,7 +144,7 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(resource_url, project_id): - filter_str = "resourceUrl=\"" + resource_url + "\"" + filter_str = 'resourceUrl="{}"'.format(resource_url) client = tmp_create_client() project_name = client.project_path(project_id) @@ -170,7 +170,6 @@ def pubsub(subscription_id, timeout_seconds, project_id): client.subscribe(subscription_name, receiver.pubsub_callback) # listen for 'timeout' seconds - print("listening") for _ in range(timeout_seconds): time.sleep(1) # print and return the number of pubsub messages received @@ -190,7 +189,7 @@ def __init__(self): def pubsub_callback(self, message): # every time a pubsub message comes in, print it and count it self.msg_count += 1 - print("Message {}: {}".format(self.msg_count, message.data)) + print('Message {}: {}'.format(self.msg_count, message.data)) message.ack() @@ -198,7 +197,7 @@ def create_occurrence_subscription(subscription_id, project_id): from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient - topic_id = "container-analysis-occurrences-v1beta1" + topic_id = 'container-analysis-occurrences-v1beta1' client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) subscription_name = client.subscription_path(project_id, subscription_id) diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index d8c64ebe84b..af4232f67cc 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -35,14 +35,14 @@ class TestContainerAnalysisSamples: def setup_method(self, test_method): - print("SETUP " + test_method.__name__) + print('SETUP {}'.format(test_method.__name__)) timestamp = str(int(time())) - self.note_id = "note-" + timestamp + test_method.__name__ - self.image_url = "www." + timestamp + test_method.__name__ + ".com" + self.note_id = 'note-{}-{}'.format(timestamp, test_method.__name__) + self.image_url = '{}.{}'.format(timestamp, test_method.__name__) self.note_obj = samples.create_note(self.note_id, PROJECT_ID) def teardown_method(self, test_method): - print("TEAR DOWN " + test_method.__name__) + print('TEAR DOWN {}'.format(test_method.__name__)) try: samples.delete_note(self.note_id, PROJECT_ID) except NotFound: @@ -126,7 +126,7 @@ def test_occurrences_for_note(self): def test_pubsub(self): client = SubscriberClient() - subscription_id = "drydockOccurrences" + subscription_id = 'drydockOccurrences' subscription_name = client.subscription_path(PROJECT_ID, subscription_id) samples.create_occurrence_subscription(subscription_id, PROJECT_ID) @@ -148,7 +148,7 @@ def test_pubsub(self): sleep(SLEEP_TIME) samples.delete_occurrence(basename(occ.name), PROJECT_ID) sleep(SLEEP_TIME) - print('done. msg_count = ' + str(receiver.msg_count)) + print('done. msg_count = {}'.format(receiver.msg_count)) success = receiver.msg_count == total_created assert receiver.msg_count == total_created # clean up @@ -165,19 +165,19 @@ def test_poll_discovery_occurrence(self): assert False # create discovery occurrence - note_id = "discovery-note-" + str(int(time())) + note_id = 'discovery-note-{}'.format(int(time())) client = samples.tmp_create_client() note = { - "discovery": { - "analysis_kind": NoteKind.DISCOVERY + 'discovery': { + 'analysis_kind': NoteKind.DISCOVERY } } client.create_note(client.project_path(PROJECT_ID), note_id, note) occurrence = { - "note_name": client.note_path(PROJECT_ID, note_id), - "resource_uri": self.image_url, - "discovery": { - "analysis_status": DiscoveryOccurrence.AnalysisStatus + 'note_name': client.note_path(PROJECT_ID, note_id), + 'resource_uri': self.image_url, + 'discovery': { + 'analysis_status': DiscoveryOccurrence.AnalysisStatus .FINISHED_SUCCESS } } @@ -221,20 +221,20 @@ def test_find_high_severity_vulnerabilities(self): assert len(occ_list) == 0 # create new high severity vulnerability - note_id = "discovery-note-" + str(int(time())) + note_id = 'discovery-note-{}'.format(int(time())) client = samples.tmp_create_client() note = { - "vulnerability": { - "severity": Severity.CRITICAL, - "details": [ + 'vulnerability': { + 'severity': Severity.CRITICAL, + 'details': [ { - "affected_cpe_uri": "your-uri-here", - "affected_package": "your-package-here", - "min_affected_version": { - "kind": Version.VersionKind.MINIMUM + 'affected_cpe_uri': 'your-uri-here', + 'affected_package': 'your-package-here', + 'min_affected_version': { + 'kind': Version.VersionKind.MINIMUM }, - "fixed_version": { - "kind": Version.VersionKind.MAXIMUM + 'fixed_version': { + 'kind': Version.VersionKind.MAXIMUM } } ] @@ -242,18 +242,18 @@ def test_find_high_severity_vulnerabilities(self): } client.create_note(client.project_path(PROJECT_ID), note_id, note) occurrence = { - "note_name": client.note_path(PROJECT_ID, note_id), - "resource_uri": self.image_url, - "vulnerability": { - "package_issue": [ + 'note_name': client.note_path(PROJECT_ID, note_id), + 'resource_uri': self.image_url, + 'vulnerability': { + 'package_issue': [ { - "affected_cpe_uri": "your-uri-here", - "affected_package": "your-package-here", - "min_affected_version": { - "kind": Version.VersionKind.MINIMUM + 'affected_cpe_uri': 'your-uri-here', + 'affected_package': 'your-package-here', + 'min_affected_version': { + 'kind': Version.VersionKind.MINIMUM }, - "fixed_version": { - "kind": Version.VersionKind.MAXIMUM + 'fixed_version': { + 'kind': Version.VersionKind.MAXIMUM } } ] From 37a62472a81cb7240ee5c1bc3d46c0e8ca4de709 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 13 Jun 2019 16:55:10 -0700 Subject: [PATCH 17/30] added comments to samples --- .../container_analysis/samples.py | 78 +++++++++++++++++-- .../container_analysis/samples_test.py | 2 +- 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 887b6760fc2..5d5f013be47 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -1,5 +1,5 @@ #!/bin/python -# Copyright 2018 Google Inc. +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -26,6 +26,10 @@ def tmp_create_client(): # [START containeranalysis_create_note] def create_note(note_id, project_id): + """Creates and returns a new vulnerability note.""" + # note_id = 'my-note' + # project_id = 'my-gcp-project' + from grafeas.grafeas_v1.gapic.enums import Version client = tmp_create_client() @@ -53,6 +57,10 @@ def create_note(note_id, project_id): # [START containeranalysis_delete_note] def delete_note(note_id, project_id): + """Removes an existing note from the server.""" + # note_id = 'my-note' + # project_id = 'my-gcp-project' + client = tmp_create_client() note_name = client.note_path(project_id, note_id) @@ -62,6 +70,13 @@ def delete_note(note_id, project_id): # [START ccontaineranalysis_create_occurrence] def create_occurrence(resource_url, note_id, occurrence_project, note_project): + """ Creates and returns a new occurrence of a previously + created vulnerability note.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # note_id = 'my-note' + # occurrence_project = 'my-gcp-project' + # note_project = 'my-gcp-project' + from grafeas.grafeas_v1.gapic.enums import Version client = tmp_create_client() @@ -93,6 +108,10 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): # [START containeranalysis_delete_occurrence] def delete_occurrence(occurrence_id, project_id): + """Removes an existing occurrence from the server.""" + # occurrence_id = basename(occurrence.name) + # project_id = 'my-gcp-project' + client = tmp_create_client() formatted_parent = client.occurrence_path(project_id, occurrence_id) client.delete_occurrence(formatted_parent) @@ -101,6 +120,10 @@ def delete_occurrence(occurrence_id, project_id): # [START containeranalysis_get_note] def get_note(note_id, project_id): + """Retrieves and prints a specified note from the server.""" + # note_id = 'my-note' + # project_id = 'my-gcp-project' + client = tmp_create_client() note_name = client.note_path(project_id, note_id) response = client.get_note(note_name) @@ -110,6 +133,10 @@ def get_note(note_id, project_id): # [START containeranalysis_get_occurrence] def get_occurrence(occurrence_id, project_id): + """retrieves and prints a specified occurrence from the server.""" + # occurrence_id = basename(occurrence.name) + # project_id = 'my-gcp-project' + client = tmp_create_client() formatted_parent = client.occurrence_path(project_id, occurrence_id) return client.get_occurrence(formatted_parent) @@ -118,6 +145,12 @@ def get_occurrence(occurrence_id, project_id): # [START containeranalysis_discovery_info] def get_discovery_info(resource_url, project_id): + """Retrieves and prints the discovery occurrence created for a specified + image. The discovery occurrence contains information about the initial + scan on the image.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # project_id = 'my-gcp-project' + filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'.format(resource_url) client = tmp_create_client() project_name = client.project_path(project_id) @@ -129,6 +162,11 @@ def get_discovery_info(resource_url, project_id): # [START containeranalysis_occurrences_for_note] def get_occurrences_for_note(note_id, project_id): + """Retrieves all the occurrences associated with a specified Note. + Here, all occurrences are printed and counted.""" + # note_id = 'my-note' + # project_id = 'my-gcp-project' + client = tmp_create_client() note_name = client.note_path(project_id, note_id) @@ -144,6 +182,11 @@ def get_occurrences_for_note(note_id, project_id): # [START containeranalysis_occurrences_for_image] def get_occurrences_for_image(resource_url, project_id): + """Retrieves all the occurrences associated with a specified image. + Here, all occurrences are simply printed and counted.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # project_id = 'my-gcp-project' + filter_str = 'resourceUrl="{}"'.format(resource_url) client = tmp_create_client() project_name = client.project_path(project_id) @@ -160,8 +203,12 @@ def get_occurrences_for_image(resource_url, project_id): # [START containeranalysis_pubsub] def pubsub(subscription_id, timeout_seconds, project_id): - import time + """Respond to incoming occurrences using a Cloud Pub/Sub subscription.""" + # subscription_id := 'my-occurrences-subscription' + # timeout_seconds = 20 + # project_id = 'my-gcp-project' + import time from google.cloud.pubsub import SubscriberClient client = SubscriberClient() @@ -178,10 +225,7 @@ def pubsub(subscription_id, timeout_seconds, project_id): class MessageReceiver: - """ - Custom class to handle incoming pubsub messages - In this case, we will simply print and count each message as it comes in - """ + """Custom class to handle incoming Pub/Sub messages.""" def __init__(self): # initialize counter to 0 on initialization self.msg_count = 0 @@ -194,6 +238,11 @@ def pubsub_callback(self, message): def create_occurrence_subscription(subscription_id, project_id): + """Creates a new Pub/Sub subscription object listening to the + Container Analysis Occurrences topic.""" + # subscription_id := 'my-occurrences-subscription' + # project_id = 'my-gcp-project' + from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient @@ -215,8 +264,13 @@ def create_occurrence_subscription(subscription_id, project_id): # [START containeranalysis_poll_discovery_occurrence_finished] def poll_discovery_finished(resource_url, timeout_seconds, project_id): - import time + """Returns the discovery occurrence for a resource once it reaches a + terminal state.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # timeout_seconds = 20 + # project_id = 'my-gcp-project' + import time from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence deadline = time.time() + timeout_seconds @@ -236,7 +290,6 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'\ .format(resource_url) # [START containeranalysis_poll_discovery_occurrence_finished] - print(filter_str) result = client.list_occurrences(project_name, filter_str) # only one occurrence should ever be returned by ListOccurrences # and the given filter @@ -260,6 +313,10 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): # [START containeranalysis_vulnerability_occurrences_for_image] def find_vulnerabilities_for_image(resource_url, project_id): + """"Retrieves all vulnerability occurrences associated with a resource.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # project_id = 'my-gcp-project' + client = tmp_create_client() project_name = client.project_path(project_id) @@ -271,6 +328,11 @@ def find_vulnerabilities_for_image(resource_url, project_id): # [START containeranalysis_filter_vulnerability_occurrences] def find_high_severity_vulnerabilities_for_image(resource_url, project_id): + """Retrieves a list of only high vulnerability occurrences associated + with a resource.""" + # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' + # project_id = 'my-gcp-project' + from grafeas.grafeas_v1.gapic.enums import Severity client = tmp_create_client() diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index af4232f67cc..ef38aafd054 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -1,5 +1,5 @@ #!/bin/python -# Copyright 2018 Google Inc. +# Copyright 2019 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 8144f75f5a7de59a3d17eb9f2a1dc01415e73c27 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 20 Jun 2019 12:53:54 -0700 Subject: [PATCH 18/30] use released libraries --- .../container_analysis/.gitignore | 1 + ...containeranalysis-0.1.0-py2.py3-none-any.whl | Bin 24103 -> 0 bytes .../grafeas-0.1.0-py2.py3-none-any.whl | Bin 66260 -> 0 bytes .../container_analysis/requirements.txt | 4 ++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 container_registry/container_analysis/.gitignore delete mode 100644 container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl delete mode 100644 container_registry/container_analysis/grafeas-0.1.0-py2.py3-none-any.whl diff --git a/container_registry/container_analysis/.gitignore b/container_registry/container_analysis/.gitignore new file mode 100644 index 00000000000..9e3d04c4950 --- /dev/null +++ b/container_registry/container_analysis/.gitignore @@ -0,0 +1 @@ +venv* diff --git a/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl b/container_registry/container_analysis/google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl deleted file mode 100644 index 2819d3cc925ca8e4576239a021c1a976d45ce595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24103 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 IgZ+2^1^Ng{?EnA( diff --git a/container_registry/container_analysis/grafeas-0.1.0-py2.py3-none-any.whl b/container_registry/container_analysis/grafeas-0.1.0-py2.py3-none-any.whl deleted file mode 100644 index b37d4d75113b6b328ddbfc7c54903b4a6e4aca8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66260 zcmb5UW0Yn=v?chZZQHhORNA&}8yZQHi3sW;QzGq0!nt(nWU?vIGL`)J2m zTR|EG6cqpfKmxccCggrB1f$V`002T@008gbS92#rGgCunI!1aXdPX`2PZoN1Iy+|v zYjb)B7mJt#d1(+P#GxC%$j!u2WW>9s(>d+_pjM^Owu~l{ECCaxf}L%X4J(@8xyb4I z+uoicL}f}~1RjV_@eOzpBRQs!xkJVT=?JtkRKQ|+f0Gnmf;?u8?H2x$Z*;KSL=>J= z+BCcyfmHI?@=jVdvec0&i~SO_19z-CY|)5IJ<5NQi29MSm%X~QDnbE_Km{b~N3W@8 zmf-(@2j#e-HsE68`ANKF6SaRu+hA6S*uOY;hm+O9$uqtt0y_*#e(f9UX(7y@;-MdG zID#^;uAJ0rAv9nlKZ#!$cMvMQ{i-$BI8@iw$!{0EL)=3iIpU@pMt>|O-R!-a+pdyKd^;M#Jwrg z`kw`Q1-#MgKU;#8)Rov;XO+7@`OUgQS_3q)ic+QmcaP8CA$Tpenjo`ec~v#14$$j%dH| zVUlN~9P1~N+|##1+KmA4RNn;OiN<@wQi}EdYo((V>H)5BffCQ6F|L)$n`Y%TN67k) zRlLEwu z#FRvxrF!oQkTcM#z^{`gU3&CEMpD{Y@^RLv=jx^?*%qynAuqYVdy`2vb6SkART!a- z_;P)$K#p#Nlc{j|u=T@)PucfCTkoR8O5S{S_0UwVQMM#%e3 z0oCDq)>6Ok^?(-7VNKYa6k+7rO&0!u7bwvpM z`@ZDOOXn;okP3-*nX;CTID4X1E?6r%Ep=&%e}_>|NI62kfPIt6iEDBqQ=au@ut$z3 zHrv*x4;P@%5W-h{O{B>CpnQSEO=JtnWuT)N{f_v-M?l zC&7-Y&ZDU-D`#)X$d62SsX}LiyB#%+bGDlR9AuT-Y!j&-5Zk~N^s~teLJ#whGR@Lm zmm~L0;)dh_Pn!E>0$FQ@xJ-Ny3q75FlZL<}GvGRmtRr%=ScHkN-jy5t-NF5DzXmUj zZ94;B1dfZPtfN7v?!r?#S~Y^byrXkjXo)|C*0)s+LIM$}hOru<1-6KBpekO7hp^~{ z$Y4(;=cy}@&3>X)<#>!1IC}%u+==SQQK&Jun=cs@vZj)WDry{k8cXlX#KuB_E%+YS zO~rC+h!jj$+!)g5+vbnFztPr>%&MQc?P*%XB$+pJ%f)A~&trpgldoyu)hlB&KHvSB zRxy8!Rmc=ltM{%a5DN6-IcIPlKrLk(Advc6?SkvOgs&T4r||XRyTatU5Q+`YPcV*Z z2GeYT0tOp{xRucf94z zS>x3O3g>JP9YlsY9R9GSO!SM7jgMT;WUx%s{YI#zgDn<3O0$gH)wVO6?X-|M5$wEH z<#k)lt`ijF!03jVGp376g(d6KCv%0A1;k0Y5`ylPPjgjq(P3hensar=Hw63l>HMtE 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 diff --git a/container_registry/container_analysis/requirements.txt b/container_registry/container_analysis/requirements.txt index 13580946e77..2996a2e0d3e 100644 --- a/container_registry/container_analysis/requirements.txt +++ b/container_registry/container_analysis/requirements.txt @@ -1,5 +1,5 @@ google-cloud-pubsub == 0.30.0 -./google_cloud_containeranalysis-0.1.0-py2.py3-none-any.whl -grafeas-0.1.0-py2.py3-none-any.whl +google-cloud-containeranalysis == 0.1.0 +grafeas == 0.1.0 pytest mock From 0c2e311070fad169ea59c0a71d4cbed93725d185 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 20 Jun 2019 13:09:45 -0700 Subject: [PATCH 19/30] updated client creation in samples --- .../container_analysis/samples.py | 118 +++++++++++------- 1 file changed, 70 insertions(+), 48 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 5d5f013be47..bed527813ff 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -14,16 +14,6 @@ # limitations under the License. -def tmp_create_client(): - from grafeas.grafeas_v1 import GrafeasClient - from grafeas.grafeas_v1.gapic.transports import grafeas_grpc_transport - - address = 'containeranalysis.googleapis.com:443' - scopes = ('https://www.googleapis.com/auth/cloud-platform') - transport = grafeas_grpc_transport.GrafeasGrpcTransport(address, scopes) - return GrafeasClient(transport) - - # [START containeranalysis_create_note] def create_note(note_id, project_id): """Creates and returns a new vulnerability note.""" @@ -31,9 +21,11 @@ def create_note(note_id, project_id): # project_id = 'my-gcp-project' from grafeas.grafeas_v1.gapic.enums import Version + from google.cloud.devtools import containeranalysis_v1 - client = tmp_create_client() - project_name = client.project_path(project_id) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) note = { 'vulnerability': { 'details': [ @@ -50,7 +42,7 @@ def create_note(note_id, project_id): ] } } - response = client.create_note(project_name, note_id, note) + response = grafeas_client.create_note(project_name, note_id, note) return response # [END containeranalysis_create_note] @@ -61,10 +53,13 @@ def delete_note(note_id, project_id): # note_id = 'my-note' # project_id = 'my-gcp-project' - client = tmp_create_client() - note_name = client.note_path(project_id, note_id) + from google.cloud.devtools import containeranalysis_v1 - client.delete_note(note_name) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + note_name = grafeas_client.note_path(project_id, note_id) + + grafeas_client.delete_note(note_name) # [END containeranalysis_delete_note] @@ -78,10 +73,12 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): # note_project = 'my-gcp-project' from grafeas.grafeas_v1.gapic.enums import Version + from google.cloud.devtools import containeranalysis_v1 - client = tmp_create_client() - formatted_note = client.note_path(note_project, note_id) - formatted_project = client.project_path(occurrence_project) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + formatted_note = grafeas_client.note_path(note_project, note_id) + formatted_project = grafeas_client.project_path(occurrence_project) occurrence = { 'note_name': formatted_note, @@ -102,7 +99,7 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): } } - return client.create_occurrence(formatted_project, occurrence) + return grafeas_client.create_occurrence(formatted_project, occurrence) # [END containeranalysis_create_occurrence] @@ -112,9 +109,12 @@ def delete_occurrence(occurrence_id, project_id): # occurrence_id = basename(occurrence.name) # project_id = 'my-gcp-project' - client = tmp_create_client() - formatted_parent = client.occurrence_path(project_id, occurrence_id) - client.delete_occurrence(formatted_parent) + from google.cloud.devtools import containeranalysis_v1 + + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + formatted_parent = grafeas_client.occurrence_path(project_id, occurrence_id) + grafeas_client.delete_occurrence(formatted_parent) # [END containeranalysis_delete_occurrence] @@ -124,9 +124,12 @@ def get_note(note_id, project_id): # note_id = 'my-note' # project_id = 'my-gcp-project' - client = tmp_create_client() - note_name = client.note_path(project_id, note_id) - response = client.get_note(note_name) + from google.cloud.devtools import containeranalysis_v1 + + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + note_name = grafeas_client.note_path(project_id, note_id) + response = grafeas_client.get_note(note_name) return response # [END containeranalysis_get_note] @@ -137,9 +140,12 @@ def get_occurrence(occurrence_id, project_id): # occurrence_id = basename(occurrence.name) # project_id = 'my-gcp-project' - client = tmp_create_client() - formatted_parent = client.occurrence_path(project_id, occurrence_id) - return client.get_occurrence(formatted_parent) + from google.cloud.devtools import containeranalysis_v1 + + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + formatted_parent = grafeas_client.occurrence_path(project_id, occurrence_id) + return grafeas_client.get_occurrence(formatted_parent) # [END containeranalysis_get_occurrence] @@ -151,10 +157,13 @@ def get_discovery_info(resource_url, project_id): # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # project_id = 'my-gcp-project' + from google.cloud.devtools import containeranalysis_v1 + filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'.format(resource_url) - client = tmp_create_client() - project_name = client.project_path(project_id) - response = client.list_occurrences(project_name, filter_=filter_str) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) + response = grafeas_client.list_occurrences(project_name, filter_=filter_str) for occ in response: print(occ) # [END containeranalysis_discovery_info] @@ -167,10 +176,13 @@ def get_occurrences_for_note(note_id, project_id): # note_id = 'my-note' # project_id = 'my-gcp-project' - client = tmp_create_client() - note_name = client.note_path(project_id, note_id) + from google.cloud.devtools import containeranalysis_v1 + + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + note_name = grafeas_client.note_path(project_id, note_id) - response = client.list_note_occurrences(note_name) + response = grafeas_client.list_note_occurrences(note_name) count = 0 for o in response: # do something with the retrieved occurrence @@ -187,11 +199,14 @@ def get_occurrences_for_image(resource_url, project_id): # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # project_id = 'my-gcp-project' + from google.cloud.devtools import containeranalysis_v1 + filter_str = 'resourceUrl="{}"'.format(resource_url) - client = tmp_create_client() - project_name = client.project_path(project_id) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) - response = client.list_occurrences(project_name, filter_=filter_str) + response = grafeas_client.list_occurrences(project_name, filter_=filter_str) count = 0 for o in response: # do something with the retrieved occurrence @@ -272,11 +287,13 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): import time from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence + from google.cloud.devtools import containeranalysis_v1 deadline = time.time() + timeout_seconds - client = tmp_create_client() - project_name = client.project_path(project_id) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) discovery_occurrence = None while discovery_occurrence is None: @@ -290,7 +307,7 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'\ .format(resource_url) # [START containeranalysis_poll_discovery_occurrence_finished] - result = client.list_occurrences(project_name, filter_str) + result = grafeas_client.list_occurrences(project_name, filter_str) # only one occurrence should ever be returned by ListOccurrences # and the given filter for item in result: @@ -303,7 +320,7 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_FAILED \ and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS: time.sleep(1) - updated = client.get_occurrence(discovery_occurrence.name) + updated = grafeas_client.get_occurrence(discovery_occurrence.name) status = updated.discovery.analysis_status if time.time() > deadline: raise RuntimeError('timeout while waiting for terminal state') @@ -317,12 +334,15 @@ def find_vulnerabilities_for_image(resource_url, project_id): # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # project_id = 'my-gcp-project' - client = tmp_create_client() - project_name = client.project_path(project_id) + from google.cloud.devtools import containeranalysis_v1 + + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ .format(resource_url) - return list(client.list_occurrences(project_name, filter_str)) + return list(grafeas_client.list_occurrences(project_name, filter_str)) # [END containeranalysis_vulnerability_occurrences_for_image] @@ -334,13 +354,15 @@ def find_high_severity_vulnerabilities_for_image(resource_url, project_id): # project_id = 'my-gcp-project' from grafeas.grafeas_v1.gapic.enums import Severity + from google.cloud.devtools import containeranalysis_v1 - client = tmp_create_client() - project_name = client.project_path(project_id) + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() + project_name = grafeas_client.project_path(project_id) filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ .format(resource_url) - all_vulnerabilities = client.list_occurrences(project_name, filter_str) + all_vulnerabilities = grafeas_client.list_occurrences(project_name, filter_str) filtered_list = [] for v in all_vulnerabilities: if v.severity == Severity.HIGH or v.severity == Severity.CRITICAL: From de15238921b6096c7ac7d8e8beaa719666a921d2 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 20 Jun 2019 13:22:10 -0700 Subject: [PATCH 20/30] fixed broken tests --- .../container_analysis/samples_test.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index ef38aafd054..f43a571ec32 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -19,6 +19,7 @@ from google.api_core.exceptions import InvalidArgument from google.api_core.exceptions import NotFound +from google.cloud.devtools import containeranalysis_v1 from google.cloud.pubsub import SubscriberClient from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence, NoteKind @@ -166,22 +167,23 @@ def test_poll_discovery_occurrence(self): # create discovery occurrence note_id = 'discovery-note-{}'.format(int(time())) - client = samples.tmp_create_client() + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() note = { 'discovery': { 'analysis_kind': NoteKind.DISCOVERY } } - client.create_note(client.project_path(PROJECT_ID), note_id, note) + grafeas_client.create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) occurrence = { - 'note_name': client.note_path(PROJECT_ID, note_id), + 'note_name': grafeas_client.note_path(PROJECT_ID, note_id), 'resource_uri': self.image_url, 'discovery': { 'analysis_status': DiscoveryOccurrence.AnalysisStatus .FINISHED_SUCCESS } } - created = client.create_occurrence(client.project_path(PROJECT_ID), + created = grafeas_client.create_occurrence(grafeas_client.project_path(PROJECT_ID), occurrence) # poll again @@ -222,7 +224,8 @@ def test_find_high_severity_vulnerabilities(self): # create new high severity vulnerability note_id = 'discovery-note-{}'.format(int(time())) - client = samples.tmp_create_client() + client = containeranalysis_v1.ContainerAnalysisClient() + grafeas_client = client.get_grafeas_client() note = { 'vulnerability': { 'severity': Severity.CRITICAL, @@ -240,7 +243,7 @@ def test_find_high_severity_vulnerabilities(self): ] } } - client.create_note(client.project_path(PROJECT_ID), note_id, note) + grafeas_client.create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) occurrence = { 'note_name': client.note_path(PROJECT_ID, note_id), 'resource_uri': self.image_url, @@ -259,7 +262,7 @@ def test_find_high_severity_vulnerabilities(self): ] } } - created = client.create_occurrence(client.project_path(PROJECT_ID), + created = grafeas_client.create_occurrence(grafeas_client.project_path(PROJECT_ID), occurrence) # query again tries = 0 From bed1dcb2079d7e0e8424f9f62d2130519a6b5b53 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Thu, 20 Jun 2019 13:26:45 -0700 Subject: [PATCH 21/30] fixed linter issues --- container_registry/container_analysis/samples.py | 12 ++++++------ .../container_analysis/samples_test.py | 16 ++++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index bed527813ff..4cf9ae2e527 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -113,8 +113,8 @@ def delete_occurrence(occurrence_id, project_id): client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() - formatted_parent = grafeas_client.occurrence_path(project_id, occurrence_id) - grafeas_client.delete_occurrence(formatted_parent) + parent = grafeas_client.occurrence_path(project_id, occurrence_id) + grafeas_client.delete_occurrence(parent) # [END containeranalysis_delete_occurrence] @@ -144,8 +144,8 @@ def get_occurrence(occurrence_id, project_id): client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() - formatted_parent = grafeas_client.occurrence_path(project_id, occurrence_id) - return grafeas_client.get_occurrence(formatted_parent) + parent = grafeas_client.occurrence_path(project_id, occurrence_id) + return grafeas_client.get_occurrence(parent) # [END containeranalysis_get_occurrence] @@ -362,9 +362,9 @@ def find_high_severity_vulnerabilities_for_image(resource_url, project_id): filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ .format(resource_url) - all_vulnerabilities = grafeas_client.list_occurrences(project_name, filter_str) + vulnerabilities = grafeas_client.list_occurrences(project_name, filter_str) filtered_list = [] - for v in all_vulnerabilities: + for v in vulnerabilities: if v.severity == Severity.HIGH or v.severity == Severity.CRITICAL: filtered_list.append(v) return filtered_list diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index f43a571ec32..b8a56568ac2 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -174,7 +174,8 @@ def test_poll_discovery_occurrence(self): 'analysis_kind': NoteKind.DISCOVERY } } - grafeas_client.create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) + grafeas_client.\ + create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) occurrence = { 'note_name': grafeas_client.note_path(PROJECT_ID, note_id), 'resource_uri': self.image_url, @@ -183,8 +184,9 @@ def test_poll_discovery_occurrence(self): .FINISHED_SUCCESS } } - created = grafeas_client.create_occurrence(grafeas_client.project_path(PROJECT_ID), - occurrence) + created = grafeas_client.\ + create_occurrence(grafeas_client.project_path(PROJECT_ID), + occurrence) # poll again disc = samples.poll_discovery_finished(self.image_url, 10, PROJECT_ID) @@ -243,7 +245,8 @@ def test_find_high_severity_vulnerabilities(self): ] } } - grafeas_client.create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) + grafeas_client.\ + create_note(grafeas_client.project_path(PROJECT_ID), note_id, note) occurrence = { 'note_name': client.note_path(PROJECT_ID, note_id), 'resource_uri': self.image_url, @@ -262,8 +265,9 @@ def test_find_high_severity_vulnerabilities(self): ] } } - created = grafeas_client.create_occurrence(grafeas_client.project_path(PROJECT_ID), - occurrence) + created = grafeas_client.\ + create_occurrence(grafeas_client.project_path(PROJECT_ID), + occurrence) # query again tries = 0 count = 0 From 2940ddae02a6cd2c01989b6896eab67f99b98df8 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 11:03:55 -0700 Subject: [PATCH 22/30] updated topic --- container_registry/container_analysis/samples.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index ebe7cc1c5b8..892b47ddb44 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -263,7 +263,7 @@ def create_occurrence_subscription(subscription_id, project_id): from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient - topic_id = 'container-analysis-occurrences-v1beta1' + topic_id = 'container-analysis-occurrences-v1' client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) subscription_name = client.subscription_path(project_id, subscription_id) From fdd94cc2ecf5ab6ec2e8dd5e001579ac7747562c Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 13:39:54 -0700 Subject: [PATCH 23/30] added README --- .../container_analysis/README.md | 59 +++++++++++++++++++ .../container_analysis/requirements.txt | 1 + 2 files changed, 60 insertions(+) create mode 100644 container_registry/container_analysis/README.md diff --git a/container_registry/container_analysis/README.md b/container_registry/container_analysis/README.md new file mode 100644 index 00000000000..ca9855a668f --- /dev/null +++ b/container_registry/container_analysis/README.md @@ -0,0 +1,59 @@ +Google
+Cloud Platform logo + +# Google Cloud Container Analysis Samples + + +Container Analysis scans container images stored in Container Registry for vulnerabilities. +Continuous automated analysis of containers keep you informed about known vulnerabilities so +that you can review and address issues before deployment. + +Additionally, third-party metadata providers can use Container Analysis to store and +retrieve additional metadata for their customers' images, such as packages installed in an image. + + +## Description + +These samples show how to use the [Google Cloud Container Analysis Client Library](https://cloud.google.com/container-registry/docs/reference/libraries). + +## Build and Run +1. **Enable APIs** - [Enable the KMS API](https://console.cloud.google.com/flows/enableapi?apiid=containeranalysis.googleapis.com) + and create a new project or select an existing project. +1. **Install and Initialize Cloud SDK** + Follow instructions from the available [quickstarts](https://cloud.google.com/sdk/docs/quickstarts) +1. **Clone the repo** and cd into this directory + +``` + $ git clone https://github.com/GoogleCloudPlatform/python-docs-samples + $ cd python-docs-samples/container-registry/container-analysis +``` + +1. **Install Dependencies** + +``` + $ python3 -m venv ./venv + $ source ./venv/bin/activate + $ pip install -r requirements.txt +``` + +1. **Set Environment Variables** + +``` + $ export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" +``` + +1. **Run Tiests** + +``` + $ python -m pytest ./samples_test.py +``` + +## Contributing changes + +* See [CONTRIBUTING.md](../../CONTRIBUTING.md) + +## Licensing + +* See [LICENSE](../../LICENSE) + diff --git a/container_registry/container_analysis/requirements.txt b/container_registry/container_analysis/requirements.txt index 2996a2e0d3e..c36a89fb69d 100644 --- a/container_registry/container_analysis/requirements.txt +++ b/container_registry/container_analysis/requirements.txt @@ -2,4 +2,5 @@ google-cloud-pubsub == 0.30.0 google-cloud-containeranalysis == 0.1.0 grafeas == 0.1.0 pytest +flaky mock From 6c252b31e9605af21d30f721442be9718cd23a53 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 15:18:13 -0700 Subject: [PATCH 24/30] fixed typo --- container_registry/container_analysis/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container_registry/container_analysis/README.md b/container_registry/container_analysis/README.md index ca9855a668f..dece45d7c85 100644 --- a/container_registry/container_analysis/README.md +++ b/container_registry/container_analysis/README.md @@ -18,7 +18,7 @@ retrieve additional metadata for their customers' images, such as packages insta These samples show how to use the [Google Cloud Container Analysis Client Library](https://cloud.google.com/container-registry/docs/reference/libraries). ## Build and Run -1. **Enable APIs** - [Enable the KMS API](https://console.cloud.google.com/flows/enableapi?apiid=containeranalysis.googleapis.com) +1. **Enable APIs** - [Enable the Container Analysis API](https://console.cloud.google.com/flows/enableapi?apiid=containeranalysis.googleapis.com) and create a new project or select an existing project. 1. **Install and Initialize Cloud SDK** Follow instructions from the available [quickstarts](https://cloud.google.com/sdk/docs/quickstarts) From e8f79f89334916da0b39cdf00cb2d8ad02fea201 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 18:09:40 -0700 Subject: [PATCH 25/30] readme fixes --- .../container_analysis/README.md | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/container_registry/container_analysis/README.md b/container_registry/container_analysis/README.md index dece45d7c85..11ed3a75d17 100644 --- a/container_registry/container_analysis/README.md +++ b/container_registry/container_analysis/README.md @@ -18,36 +18,37 @@ retrieve additional metadata for their customers' images, such as packages insta These samples show how to use the [Google Cloud Container Analysis Client Library](https://cloud.google.com/container-registry/docs/reference/libraries). ## Build and Run -1. **Enable APIs** - [Enable the Container Analysis API](https://console.cloud.google.com/flows/enableapi?apiid=containeranalysis.googleapis.com) +1. **Enable APIs** + - [Enable the Container Analysis API](https://console.cloud.google.com/flows/enableapi?apiid=containeranalysis.googleapis.com) and create a new project or select an existing project. 1. **Install and Initialize Cloud SDK** - Follow instructions from the available [quickstarts](https://cloud.google.com/sdk/docs/quickstarts) + - Follow instructions from the available [quickstarts](https://cloud.google.com/sdk/docs/quickstarts) 1. **Clone the repo** and cd into this directory -``` - $ git clone https://github.com/GoogleCloudPlatform/python-docs-samples - $ cd python-docs-samples/container-registry/container-analysis -``` + ``` + git clone https://github.com/GoogleCloudPlatform/python-docs-samples + cd python-docs-samples/container_registry/container_analysis + ``` 1. **Install Dependencies** -``` - $ python3 -m venv ./venv - $ source ./venv/bin/activate - $ pip install -r requirements.txt -``` + ``` + python3 -m venv ./venv + source ./venv/bin/activate + pip install -r requirements.txt + ``` 1. **Set Environment Variables** -``` - $ export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID" -``` + ``` + export GCLOUD_PROJECT="YOUR_PROJECT_ID" + ``` -1. **Run Tiests** +1. **Run Tests** -``` - $ python -m pytest ./samples_test.py -``` + ``` + python -m pytest ./samples_test.py + ``` ## Contributing changes From 67f2b0f2ec9584fd9a56788f85a500fb675e82ec Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 18:30:12 -0700 Subject: [PATCH 26/30] updated pubsub version --- container_registry/container_analysis/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container_registry/container_analysis/requirements.txt b/container_registry/container_analysis/requirements.txt index c36a89fb69d..ac6aa320681 100644 --- a/container_registry/container_analysis/requirements.txt +++ b/container_registry/container_analysis/requirements.txt @@ -1,4 +1,4 @@ -google-cloud-pubsub == 0.30.0 +google-cloud-pubsub == 0.42.1 google-cloud-containeranalysis == 0.1.0 grafeas == 0.1.0 pytest From 601dbb5c2f37eca1d56a1559d3b4009b67db6f99 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Wed, 3 Jul 2019 18:46:50 -0700 Subject: [PATCH 27/30] reverted pubsub topic --- container_registry/container_analysis/samples.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index 892b47ddb44..ebe7cc1c5b8 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -263,7 +263,7 @@ def create_occurrence_subscription(subscription_id, project_id): from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient - topic_id = 'container-analysis-occurrences-v1' + topic_id = 'container-analysis-occurrences-v1beta1' client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) subscription_name = client.subscription_path(project_id, subscription_id) From 0c318db7008749ce2ccb769ca116bd53bcb5a8d2 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Mon, 8 Jul 2019 14:39:35 -0700 Subject: [PATCH 28/30] create topic if needed --- container_registry/container_analysis/samples.py | 2 +- .../container_analysis/samples_test.py | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/container_registry/container_analysis/samples.py b/container_registry/container_analysis/samples.py index ebe7cc1c5b8..892b47ddb44 100644 --- a/container_registry/container_analysis/samples.py +++ b/container_registry/container_analysis/samples.py @@ -263,7 +263,7 @@ def create_occurrence_subscription(subscription_id, project_id): from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient - topic_id = 'container-analysis-occurrences-v1beta1' + topic_id = 'container-analysis-occurrences-v1' client = SubscriberClient() topic_name = client.topic_path(project_id, topic_id) subscription_name = client.subscription_path(project_id, subscription_id) diff --git a/container_registry/container_analysis/samples_test.py b/container_registry/container_analysis/samples_test.py index b8a56568ac2..e48a6ab8403 100644 --- a/container_registry/container_analysis/samples_test.py +++ b/container_registry/container_analysis/samples_test.py @@ -17,12 +17,14 @@ from os.path import basename from time import sleep, time +from google.api_core.exceptions import AlreadyExists from google.api_core.exceptions import InvalidArgument from google.api_core.exceptions import NotFound from google.cloud.devtools import containeranalysis_v1 -from google.cloud.pubsub import SubscriberClient +from google.cloud.pubsub import PublisherClient, SubscriberClient -from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence, NoteKind +from grafeas.grafeas_v1.gapic.enums import DiscoveryOccurrence +from grafeas.grafeas_v1.gapic.enums import NoteKind from grafeas.grafeas_v1.gapic.enums import Severity from grafeas.grafeas_v1.gapic.enums import Version @@ -126,7 +128,16 @@ def test_occurrences_for_note(self): samples.delete_occurrence(basename(occ.name), PROJECT_ID) def test_pubsub(self): + # create topic if needed client = SubscriberClient() + try: + topic_id = 'container-analysis-occurrences-v1' + topic_name = client.topic_path(PROJECT_ID, topic_id) + publisher = PublisherClient() + publisher.create_topic(topic_name) + except AlreadyExists: + pass + subscription_id = 'drydockOccurrences' subscription_name = client.subscription_path(PROJECT_ID, subscription_id) From b3203e77bc7b0321d02e6c708e53c1391136cf76 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Mon, 8 Jul 2019 14:46:20 -0700 Subject: [PATCH 29/30] add instructions for authentication to README --- container_registry/container_analysis/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/container_registry/container_analysis/README.md b/container_registry/container_analysis/README.md index 11ed3a75d17..70d763ccc30 100644 --- a/container_registry/container_analysis/README.md +++ b/container_registry/container_analysis/README.md @@ -23,6 +23,8 @@ These samples show how to use the [Google Cloud Container Analysis Client Librar and create a new project or select an existing project. 1. **Install and Initialize Cloud SDK** - Follow instructions from the available [quickstarts](https://cloud.google.com/sdk/docs/quickstarts) +1. **Authenticate with GCP** + - Typically, you should authenticate using a [service account key](https://cloud.google.com/docs/authentication/getting-started) 1. **Clone the repo** and cd into this directory ``` From 8e603f353b6feea273bced4f32cc9a0a4bf84044 Mon Sep 17 00:00:00 2001 From: Dan Sanche Date: Tue, 9 Jul 2019 11:17:45 -0700 Subject: [PATCH 30/30] replaced pytest with nox in README --- container_registry/container_analysis/README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/container_registry/container_analysis/README.md b/container_registry/container_analysis/README.md index 70d763ccc30..73c45c35478 100644 --- a/container_registry/container_analysis/README.md +++ b/container_registry/container_analysis/README.md @@ -29,15 +29,7 @@ These samples show how to use the [Google Cloud Container Analysis Client Librar ``` git clone https://github.com/GoogleCloudPlatform/python-docs-samples - cd python-docs-samples/container_registry/container_analysis - ``` - -1. **Install Dependencies** - - ``` - python3 -m venv ./venv - source ./venv/bin/activate - pip install -r requirements.txt + cd python-docs-samples ``` 1. **Set Environment Variables** @@ -49,7 +41,7 @@ These samples show how to use the [Google Cloud Container Analysis Client Librar 1. **Run Tests** ``` - python -m pytest ./samples_test.py + nox -s "py36(sample='./container_registry/container_analysis')" ``` ## Contributing changes