From 5e52dcd1fdad2f8fd637df36a128d7b82d63c6a4 Mon Sep 17 00:00:00 2001 From: Yao Cui Date: Thu, 31 Oct 2024 10:53:46 -0400 Subject: [PATCH 1/5] feat(parallelstore): generate library (#14805) * feat(parallelstore): generate library * Run generators and format their outputs * Add API baseline * Manually update READMEs, quickstart, and top-level stuff * use zone-id for quickstart input --- README.md | 3 + ...oud_cpp_parallelstore.expected.abi.dump.gz | Bin 0 -> 651826 bytes ci/etc/expected_install_directories | 6 + cmake/GoogleCloudCppFeatures.cmake | 1 + .../googleapis/protodeps/parallelstore.deps | 9 + .../googleapis/protolists/parallelstore.list | 1 + external/googleapis/update_libraries.sh | 1 + generator/generator_config.textproto | 7 + google/cloud/parallelstore/BUILD.bazel | 31 + google/cloud/parallelstore/CMakeLists.txt | 35 + google/cloud/parallelstore/README.md | 59 + .../doc/environment-variables.dox | 50 + google/cloud/parallelstore/doc/main.dox | 45 + google/cloud/parallelstore/doc/options.dox | 10 + .../doc/override-authentication.dox | 35 + .../parallelstore/doc/override-endpoint.dox | 25 + .../doc/override-retry-policies.dox | 108 ++ .../cloud/parallelstore/quickstart/.bazelrc | 30 + .../parallelstore/quickstart/BUILD.bazel | 25 + .../parallelstore/quickstart/CMakeLists.txt | 32 + .../cloud/parallelstore/quickstart/Makefile | 35 + .../cloud/parallelstore/quickstart/README.md | 152 +++ .../parallelstore/quickstart/WORKSPACE.bazel | 53 + .../parallelstore/quickstart/quickstart.cc | 42 + .../parallelstore/v1/.repo-metadata.json | 14 + .../internal/parallelstore_auth_decorator.cc | 281 +++++ .../internal/parallelstore_auth_decorator.h | 158 +++ .../internal/parallelstore_connection_impl.cc | 711 +++++++++++ .../internal/parallelstore_connection_impl.h | 151 +++ .../parallelstore_logging_decorator.cc | 325 +++++ .../parallelstore_logging_decorator.h | 158 +++ .../parallelstore_metadata_decorator.cc | 256 ++++ .../parallelstore_metadata_decorator.h | 163 +++ .../internal/parallelstore_option_defaults.cc | 81 ++ .../internal/parallelstore_option_defaults.h | 37 + .../v1/internal/parallelstore_retry_traits.h | 43 + .../v1/internal/parallelstore_sources.cc | 32 + .../v1/internal/parallelstore_stub.cc | 319 +++++ .../v1/internal/parallelstore_stub.h | 284 +++++ .../v1/internal/parallelstore_stub_factory.cc | 80 ++ .../v1/internal/parallelstore_stub_factory.h | 42 + .../parallelstore_tracing_connection.cc | 272 ++++ .../parallelstore_tracing_connection.h | 149 +++ .../v1/internal/parallelstore_tracing_stub.cc | 301 +++++ .../v1/internal/parallelstore_tracing_stub.h | 169 +++ .../v1/mocks/mock_parallelstore_connection.h | 287 +++++ .../parallelstore/v1/parallelstore_client.cc | 317 +++++ .../parallelstore/v1/parallelstore_client.h | 1094 +++++++++++++++++ .../v1/parallelstore_connection.cc | 223 ++++ .../v1/parallelstore_connection.h | 298 +++++ ...llelstore_connection_idempotency_policy.cc | 110 ++ ...allelstore_connection_idempotency_policy.h | 90 ++ .../parallelstore/v1/parallelstore_options.h | 86 ++ .../samples/parallelstore_client_samples.cc | 204 +++ libraries.bzl | 1 + 55 files changed, 7531 insertions(+) create mode 100644 ci/abi-dumps/google_cloud_cpp_parallelstore.expected.abi.dump.gz create mode 100644 external/googleapis/protodeps/parallelstore.deps create mode 100644 external/googleapis/protolists/parallelstore.list create mode 100644 google/cloud/parallelstore/BUILD.bazel create mode 100644 google/cloud/parallelstore/CMakeLists.txt create mode 100644 google/cloud/parallelstore/README.md create mode 100644 google/cloud/parallelstore/doc/environment-variables.dox create mode 100644 google/cloud/parallelstore/doc/main.dox create mode 100644 google/cloud/parallelstore/doc/options.dox create mode 100644 google/cloud/parallelstore/doc/override-authentication.dox create mode 100644 google/cloud/parallelstore/doc/override-endpoint.dox create mode 100644 google/cloud/parallelstore/doc/override-retry-policies.dox create mode 100644 google/cloud/parallelstore/quickstart/.bazelrc create mode 100644 google/cloud/parallelstore/quickstart/BUILD.bazel create mode 100644 google/cloud/parallelstore/quickstart/CMakeLists.txt create mode 100644 google/cloud/parallelstore/quickstart/Makefile create mode 100644 google/cloud/parallelstore/quickstart/README.md create mode 100644 google/cloud/parallelstore/quickstart/WORKSPACE.bazel create mode 100644 google/cloud/parallelstore/quickstart/quickstart.cc create mode 100644 google/cloud/parallelstore/v1/.repo-metadata.json create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_sources.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_stub.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_stub.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.cc create mode 100644 google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h create mode 100644 google/cloud/parallelstore/v1/mocks/mock_parallelstore_connection.h create mode 100644 google/cloud/parallelstore/v1/parallelstore_client.cc create mode 100644 google/cloud/parallelstore/v1/parallelstore_client.h create mode 100644 google/cloud/parallelstore/v1/parallelstore_connection.cc create mode 100644 google/cloud/parallelstore/v1/parallelstore_connection.h create mode 100644 google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.cc create mode 100644 google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h create mode 100644 google/cloud/parallelstore/v1/parallelstore_options.h create mode 100644 google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc diff --git a/README.md b/README.md index 85dfc666ee836..8338be7c683b8 100644 --- a/README.md +++ b/README.md @@ -338,6 +338,9 @@ See each library's `README.md` file for more information about: - [Cloud OS Login API](google/cloud/oslogin/README.md) [\[quickstart\]](google/cloud/oslogin/quickstart/README.md) [\[reference\]](https://cloud.google.com/cpp/docs/reference/oslogin/latest) +- [Parallelstore API](google/cloud/parallelstore/README.md) + [\[quickstart\]](google/cloud/parallelstore/quickstart/README.md) + [\[reference\]](https://cloud.google.com/cpp/docs/reference/parallelstore/latest) - [Policy Simulator API](google/cloud/policysimulator/README.md) [\[quickstart\]](google/cloud/policysimulator/quickstart/README.md) [\[reference\]](https://cloud.google.com/cpp/docs/reference/policysimulator/latest) diff --git a/ci/abi-dumps/google_cloud_cpp_parallelstore.expected.abi.dump.gz b/ci/abi-dumps/google_cloud_cpp_parallelstore.expected.abi.dump.gz new file mode 100644 index 0000000000000000000000000000000000000000..632e5780635a2936f5325afcb3fda2cbb4aeef69 GIT binary patch literal 651826 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

PYt^7}-i*hDA30M0+SB1QvGNV*Ie$diyB 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

-VJPBLD{b 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 z�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%0A&xv_Kge)^y6ieDay~B1{{J!cj?s~|QMYz%c5K^r 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

v}C3I|3>V+;=hg}e!P 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

  • ^wz{2oTE0kwFe4NHXX zwj{>;CGtJ#yQltpX`2GbhOE_H$W&Lg;12-4t{E0EZepbB+k7vV$mWpv-Y2dNdTg5v zbH)+07>9u2CL_*iNMoiAC|w6qRmbT!5QujMi)9SU@$==cu}t+%$%4|8o_%Fs$v?ZQ z$bS1U5cQc>@_OMmZ;0?!0i}>}@oqvH42)P1WmAxr;&&F&6=kDF64;U)rRqOx2uW0= znr)-XtgD>(9cD*%G|J&@yk)(V>rQw`{d^`=if9)SDPEfQ8$13WM>5~`bDa#H`&!1~!nWsfy;R0jG{}z|~rO3D{PWkVU0BRZbZ|a=o zKx}!uB)Q>Bf!WYRx;r}kemRc$e>ww$96#JF+^mKcdOUi(sJHRW@l7Ao0uCF~plDf@ zvUry7PPJMMte0sp{8ifNJyO3ny$zD@5x1Uv#pBk*Qk+tpG>peLcg!yZ9+V5q3ICFF z)r(Id6{E5@boX?5z=x>&sr#){KAyqm`0q19*d9fokd|IWYPmsX{!I61f?;_OdCD@{ zO)hXmT<+n!83tc=x}185xU9tx0$cfvIg5M--S}bn z+|ky~Ow1l4cUdywS34RMTSS_rI~WlYIPxsl*TJpD)N0!gTBt^2FrmS&4~A8$(^X5Q z!VGI~ec#o})k1ji5AmkhOz~!abDhB5{&YINROsVU9B>=>D84;U$?iuvc+>$toKI>R{X?;a!&MI};I+fv@j#{kj6% z)i;ThUkC`(Ccf#kBH9|zZD0_U;EDE`^F3wr{(p{aG$`6c;pxzTS1?D)FkxRXKLF=T zpmA&H+U=dv!?fOj;ElMU0RZIeb=Mnn&6Sx%x=q$&w@=Y+3ycwj7|BJQ*>~ABw{H595cmQ;;C zAltt^+$>Ndi2~BbS~8ZSX6^VWoqrMOzi+(+)dH$BXV7LcDg+B1R-r%Ca%w0phRI+$ zVf9xqtNs%_b)%0mCa{R*ZT@ypjqvG?Z()0f4<6%k+5n1!?%8EGAJUwdZ8=o82-r?m zN#M127>+Z{*rN>XH%q^yz$XXyVOjl^y@O@NxiB|l(PpX3xscRBqQ6wy5+F6m)>Na1 z9b(F_dL7_mlxx(Rnm~s<(w90_9r{vo`7zA{X?eDi!*dGt2xES&dzF^7Vp%D?l2#?} zF@F7fq@NVk-Dk2c3V2SmE@~r8-!{hVblOw!P=RqO^g7Ru=~AFD5SNtOzma&{Lr`SI z5(=+ZB=;N2lrn0&l^#Ckuk>=s7`qp!1Ir&hI?hB(m^r5*s&c?M9&1=&91j7x5`(7` z0l>d?A?>Vxcy4B)fQ`PXpI0(GjQdMq9cPV+H+j7iN2br!hv6RQN{N!xn)`>>)v0+f zc$qd?xN-)y?=L}mV{z=i1Ze`SQ(*5~OTx6rOR}gpx)+kuBcn4E?m>gyzE`z3zj$qH z43wsgjDfbTZ6)k~+-do2$Q~^bLk#nMRj}Y?XS3${AUj;P^rxh5`NGi6o)x-#Q9u9{ zR-*Xjc$F5oR~#PddH2bm8aBcrnLCW~&GBcMgcq0WeavDWBz<&MvD`lNrGf9Fa{l{`C8Wquy81a!Uu4f~|o4Y3iRj zj_{qO|IBe+ zNYzr%#E=2r^1bZ4(`9jy5PiLLeGFQ-ny=C63w^s4>`&b<_)0jrL2|z>U5uwdr5A%D zpo^U%cEuVn{G!9Ra<*6E^98L=g6r8u%+&Euz=(jw$da$W^YW%2J9FKHAA~3$$S4`m z7!*IYw}X>t2F|kN?R1t(5`C$PHT#4Y_k@e6Z#Q z#waegB&j5+M#D!}l;v+SZ8&XsY5~QS)q~9H*v&~7a7Gd*S?TtL1}>k6bsbT(B=}RP zDEpojAAUYD4FM*-0s1{JDUNRp^k&Z&!V`tAvx$~B+2nHSp@a=VOo_I{A0pRZj&?7A zfkb1IN?#V*%cllDEY>eg8S@1ZzeoRvGcMFN6d|r@X(Vy|-tb`YI~sp%h5A*~Wshcs zPB|@KnY*|B%vEE^9{ERUCYK_~6a~c<8>Dr-Vf)ML^ABce2n%zwfHKifi|ftws1nTa zPrF%Gv$Oy0mA^Lr6%jy~xQTs{7StJX!F%X5WJHp|LWpMy9&+zDUP9VUz_`^v-ft!vBggqI zr31zpT;Dw>%*Wa@VjWi86$O3J5}1TcE0-zsljTN2-7#BQ5cNa`DIf!St2&6rL9HU0a3hRHNuDurOp>^G zvYl&o|E;_L%=%qWG5ODQPP*$pAJ-_i-4Csi*k4*~;0|Z%1{|Gy*EpXVVzW>C8n76- z`|7pfktTJP1Z%`BH=F{x*R|ngPDw2o!nniGXDt|N>q=4u*(3nU?%I)WssOBQMTVcXU;+x*g}VJPTbdZ|FZ8N!UYdEAJpUy6A)cWj9F+Xi*q zS9uLHMT>!FLr5@SZ`4;8#bz-z#Oh1wR>zZ4=Q;tOzZfh|EGr5xgrI+f0l*s%BgD=U zUKx>S!BC4b&m-j*1tL=Y_IQhuLk{NEz=O#V0vXPzHH{=yjXyyd%_J<|Na?gEZxS1k zPJcgr0k4?jf2LbqMl7Xe;to_z&Px^C7x1iLb$pdx;=>ZGk!;)foE#l$s9llZ8ij?6 z<%_WJEKe3CX}W{QnRN8>y(m&*fmLeiyX)ggqrMoFJHpXiW}#dq&`%E@xA@ZyYpx5w zoWhcrt^_~6Te}Hqp@oIDYZuQq0F#?&T}5cGah%g+S;T?JNG&^;PZ2oyAkq z+&>14H>XD}&tqo>D&He876E{VGbL}2bm>gtBGP|cUWFg zdx&dWle$3y8dD8=m1W66nfGH+jCRFzlNGZp(w`b|os)dyltkxY;EcP)-!qxMkLC&* z67h!Py|QM?U#q_~=Hh<^(WRSHsX9_}9ftPV-u~m8oN9*%Ulg!+>12l8;RCy#cJpk0 zx#kbCqlsK&MOk~oU4qxsi3v+-bVxZJ7D4^%$5K*~xczQWAZpmK-XY4N01G(mh)~@6 zk%?4S%54UFX~e?F6*SBUq~f7iyRuT&5NCOY0$!R$qWyBLdWdiaV-Y2VxGu3^HMpuh z89zZ(1Eh?D$mowJq&18oMIs6BC>r)PLM#oa9wKOvi zJ{?41hR?&Z&1QngU}9t#dr7}LfiV|=ecB{tH1RZ88buhKL!cODvk4A^Q6m05v4HK3 zlzOm}OWyT_sA|OBN#p$$cLkbV*Rh#BD2W>hr@@UXd&p?l55dFvHbVGv^6)OgprvIp z@_Bz6s&+uU(FMugO$TmLBL$ddkA4 zdnpK4Mr8j`zStS4e-c6O0$0R}=sJOl#4IpF?USqnDB;dNl1g!(0FaQz+(jkKb zQi#J}r|JkEb$$>eUab-eEGS`zcUTapsP$dK6t#kO&!;TbYgGf* zH}`Iz(&I}YMvPfktbKk$C`_RV99&whxwxQF^rp##WrD>n zl72zluEipd@R72#_Ls^fFSTRBEeCD^T&nFCW-;T8l$g)sqvRq1*Aw)*PR5a==4<+W`t#QYGpk4KDq&*?!t*Z2;Mm z+5pV52w6~s3Zbzvvka>!%i^Kn)Td#z(wgS2Sdu=k@n`zTg!;G8-dTHNx7 zM#LIB3ZX0vqLM{*>q`S4Fg}>CgGC%@ox@;Nnjs)CDFblQlXiID+8JduA3|$rVo2pi z(IKwZa8zjcnhzO{r`^_R=cm}qi~+h3rq)TGu~L=u5;+xYg9C=D4NC~tNo7v5MTuJE zeXtZy+~6ta;H{r=5(?<;hV?lt&Ebw!P~lL;P!1}Jq-itb)KFiaF`jNl7IH#ox?OUd z>vK%nI42yR(^CkQ|0bfQS}}>L_=mZC@#fg6c!J#`KdUU z*y5wxkv!38%qWd&@?}5|Y~SUKBs`TORgT5AVQUY@tfOu@Sv=y^d-g0SZZ8lCnQf`-Xs77BTm2*A~EeH_qx2R*513 zIch>BJqCvnfkU$$&yF9>assGn#84;J*mM5%)xt6t!Y+SlrZMrd4jiJAv?W|QXI2qR z2i4v@)iqCo8)=Gn#cG{?KJz#J=;nUU=;M!nvS2aO^+bDUd@7Nt*#@@K90Ni=N#u zP^-Oi=w<_rL^{JqLHMo=MLE^ns9WtpCu&HMw0_G74zO6L9iP&yU7+3c%PaXIE!Z4= z^Dr~o95096LeewN0J4+8!zEw7Vt-S2Oft07*Yk}rk7XU?F&A$eHD{u1(13SgXUR7q z)+PcWZWMFCiXVS6s^bn5Y#gYUx2qPGPILxv3uCRd2oF*_5@P&h5r9I0u5EHE0yRg= zK1f8kHnkTTJ~OSeq-@kURz%O_bBa4m^yo@OIJtUB6XnB-oPC@%ov3tIRR=H+;D))y zL=!CbfT4E$juyNPvqChi`?-MUP|~OYQZ)2@4i~U$SY~@VChKW-2pUXyhjX&<60{X% zENbBpxSb(7)4!=O-zg+KmGGM!+KrgFe~#yy4wvRBZ@j~J)-Q$Wfs^rYC?~C_biJ>j zTJSZR(-OH~lNgwG%A8;`d&^`+pg1grNsCR$2XVH&=(i1NPj)4&&<0Ui>IoYVArZp` zK<#_MEO3kk~W3z=e#^1}k39+67bg`o8%~;2ySi#3e*E&|`r8wrHX@ zBo6FEhmHf`nQXtH0Am>QdOldgwf8iN%rKhlY}t=#K=81{tMU|`=DAI-`E_vf?Q?`C zp7cQ6?^$Q36vrQ->aWgE?R>;W4cnwjmE^m+4;$BFzPZ&0W;e}NZ(VO(GR0R( zrDGk>He(Gh4l9OV39Zq)z4VTpg8btNK>iD^d(*5_48eNPrLGGSaZblV&l zUQ@5AtPIoecD20GG%HN_Jai)-wyIhrPn0oWunXF5cm2p>Zx+MrnRk91Z^F6zbd?Cv zE+a#4Xmkj5B}@?@i5^QZOR7?Q5ynHU=vdC~dM%tdC>66DSNb`#aqcSHl-ec44TFfs zTr7Kowjn4(+z2N;|1s2@#voMmJJyLhl8huFPn}$j2lI9RE`l0<^{)j^I+pm={4j{> zY(8gsi%TcF+QbB^1nMA)*wOjaSv3xFcg{Q%P)`qs=ujq6VcweDVK5TP@5UxLp%~mn zQ{K|~ZQIEg;oI=z?c?nk!F_W(TE7^viz#^c%{yWJAW?$n7QqDE!z30y8get`dCwGv zdd9^`6#4TN5*FLMml)K~-!Jv=jW~YPPmO77BvH995su7u?OXo(Xvjw)jX22g)Zy(b z0%US?MLq=-MQZVbZs0a)7Nhr3R_lr2p(cW0RF+CpfqIZZIdmS9o$NZbQe#y}DAn$* zNU08;>^l`D4$LOLYVQ5v3ekSRo+tmtGI;#35&o2kztz#PFZIsNRVxWln_7biT>m4Y zlgp5`gbj-IP5mN_`pZ)BPszyVB(KFS#dG-bA6CD6Ti>n!ST|1@Yr0s$XCDJ8rMC z_)aVPEY=nuVmhWZM{N6D4}_3%--cK-hlSp+_1wvQe7wE6CUXSk8-CQgw*JJNSiGL| zy?BBjJ9-(wzHZsTo{ez&Wi^@AY{-*bugrSDb`YD;r9Z*tOda|Jy5S;;R{}pB=)UVj z+`yxdqgOh7MLgLUbT2R@hNYcBfb5FCi!!3zFH*(t17b$go<`GbOJ-9xyrgW1zC1zI zm-XEYJ)Kf@Ku5gK;&*+&PXEWXA5M8@@*EI3&<1@`XJlan8&{URLnk-%CuAPKeJV7F zVV5SVOxp1rP4>IK_%Kp_$6CI=ahOc}P7D!oU`r!JpZjAsbY#OfY4Ml-{^!ee%t}@| z%BQ1pXMO$puLr3J2|L3lM{I{L_=Dq0Py?T=01ROHz|B`@SWPj;-Mr9RAxwcuSzzZD zt8l_&0PC?Y7=2UouLdqXlAO5$7zs_ZM8ibae5k?d^rQxp+J#v>fr60$?3|rL}CdQvR(O)*y-4^TWBPDCC+zL+6fEnWc5E= zU~tdiSNjOL5a`*g+-U#}Ml1Oopq6$`CGLhCy@%H02Hq*SCPWu7-E)2i?E-@;DX8+k z9qp6fG;h*uyVhHQE#?^xH6B0p!KF>t$il?~r8MiqOQ*E~Z3AjOF~7A(;SifFwk$tU zWv{lre#}%E97-Z*w%!zy~j3mPs=yVzfY*<*Ja*N(5GtaL*Zb_*qoeSAbXOEX6oIBxjJCGt zUF4_CzVV+>Ea%BXU|`m~FKpJ8bq!@D5FbOh70_v^U7?;^r*uN1>c`i+#cpbd(8wR_ zgj1R?706$tnlAF7%Ip};ZxBnYV6@O?l>l*~bSx6r&BO1@o3XThp`&k-O*tEF&^MWY zpGWt=VccR+lcTj2W(*SFQUXA>R}f(h40xPfP+h5* zK5ximn^yd(9TyspI9l71^3AYFokSloxzRRAa=^Zx%#}r3;2~3h{?!Al=bZ~bn<5i0 zk{_4nM;)m&Gb8conEqYQL)IKvuA&!l%OCP{KM#M)ls24|I!a_LGu^-Hb3#%*g;ay@7^f7y4|&MQJ6JQ{eIri}HQv1z9kSqa>7JPgJURn%42998+3R zl(ne_K!lToA9%x>s<|TLh}J_)e;)iUQ=@)SLVMSoUD6yN69$R?I1c)3h+i@^>o%x~ z?>kCT02xLdTb&mYKMaaYS^yy0U`}BD=GQG3n+)E0(K1TiJapSeF>@Exle`KnjA&4b zVv#$$-01p_q(JS1&p6zb2`r_oP(tScR$xf_@F0M_JQWt^CZ@7DX#ANUvKUYt z+QL1VowR(FB2kX7(eo~i9END2!y~wMQ)beyFpgq%Rr}tf9^rdMja+&O5VB48Y29MG z5F!xSSFYRqV_13xx~`D)Hs9%G1t6$jpZGhmsMGe1Gmee0mi@lw{uoq(@@y?C)CJ$# z@@}Oi9Po2RszqRuO3W%?$3!p*|7d2W1t0KV=uzv{0VKq82_1_F&6Q7=;cFe?@K@YO z#Ea2uP-Ma-oi%CPECdfmk$t z?7lj-qdP|@%E)CNyFiNc6My#}%M?tMGsv=SXLs~OdJf@d!!;UgfL&^i&?O^%pC(|Y z@`|OpnQ&nkS7pE#C3q=ZF1a=o{GyHhTaz7euV6{CJN>!oHWBJ+>us;UYx`EE-3!V? zU3Ifrd@0%!j+R6~740J{9Jz>kx2%>*9?Gwu{2uvOou?+KDahJ}x2=4u3eCsJtsR9oZs?|r$`G#;{61LQoM-EIpTBQz$ zl$!bysge%cR}EV%w`%I}WREWR2n_fTwuKUiB0BjhwD3A1>b4mDV6&}E+n zL`bohFop@in(#pzc8=CyCTyg%BstK85ZOGZjc;l-=V**#% z7O+6;enwku6q~}=t_{5~B5qH||NhC|gl21lXB%K^&FM*Eb_i4TJG@dNAGb%S-X~Ra zAdBUqeGaQb%4{@b*qQV3C-J&_Ir@%n?S=EIaDkMr>Y@1IRx<}q9mP%8SY}Fb-T-dL zg|pr(|GrP^j)rW8R!grK8O%jHd*&6xvipePwU_pH!)@api1nY7FO06nukjb{1YBW< z_1&Z{K9>|9cYodXNmZvIweJAEXy^Af{Qkly#>Ha6nLF{q*re{jI|p{zHMWS}+L0&N zBthgN{bjR&3iwEf0mziu=>@;=3lhK)Aa5-0kp=kvgM)JPRK=ZJXhJF#O+yewWK?Ki zypIR{o+*fbq`1g{?|L2jEeH7Ozl+JKxrkjh_U0c)NSIPx{#fCF6(+S)TI00(ZORCV zDUfj0S`;90{4TOLt`tNwC(0qPE4Y)#YU03RXVU^Ph^l9BH<%-H0hrn$)!Q*&&(|lY zCQ(`%M)?{rM6y16HrdAF%C2dSg%}0wT&r9l7Y_IsFnIq#ICEE|FiL{CWmTHz+n%pK zun*K63-|&h1yVz7v_D_(g_GH#)6CP@GGCvw^C*}ZvdD@Ut;fJuIkGL1 z#fp{@INiPBN3(IbWP^?r_6e9beypRqGOocAU|NA~=s*|-nPOBxn!-Ot4E zc9Nw6tgw$i)L7cbABw@mJe~^O^OX5n@~{3fneTu1mlyD+a3R=K)h~r{R2IC7J4;uutjORO^lOd!l@= zo=)3kkDlX^=tI>>E_L?g6akmp;tjYP2?OB>ls{7Mpea$YSnQ>>jXt-yR6JKt6SFGRE*8Zc2s2j&*V>Xg*d5)d4Zcdh{Yo z#hxo|9u7o2()p~p0yRrFKd`SM30|qz(VWeY%G0B-oO|@V+TN;%!Dp3x(-`xyfz6-&A4j#7a z7u<0V8OR?URC9gb8mk~orL7Y=w4=p&NCn(m=a@6mMUy1EVE5Y2>Q(N!<*C|4gA6It z{2Iz1jbS<YIHCcRR zd~Y^*o7rCdYbe{&vUf`3V18!%F8DUq*{Sbiko=@dJDL8vwtg_SQF;OucTSsS{jTx8 zuQ@q>@d-ul1~q*bvc(-!^DwV3*rJnZ8de@ep(W*GuP+O!7CLi z)rFcG{1&k2X@ndXEYX3eNhe6ONU4`{1#fU*%I`$Bd*8#UGH%S7g7`BWJP~Vuzx-*}FL{a#s6F3Uz z%MjhK>FWt+%?M<7W^evsp^&JLI56wBmGHB%-zv{Mdc;yO8Nv?&EIh6xb@#9x8mmV^ z6waX=z7^VSOW?Uz6DpjawD`-*&6kMT=e8_&(eNKOcZuJ+K!*SdFqQ9r>!%Q#eYP*0ucqkgD(L%OYhAV&2!z5$@@0zZ24tWh6C_8a!0_Z<5tMgf8N#T}m6Fp&YhpJF zc!SWmgOqomhXO-n3r+7-VnMp^n&jC#pLn^SPeU&^ewedb57AyFQ7L8)2K|n4FX5Zu z+)sJrTaiBPS>TT#Bgs;xH)1-zmwvssu-jOwlUtt$mZa{_by`tD4jhuX6OV>nwly=n1v3(Xv0 z#1zxD+M%);mKxO1$Kq6YIu0aADb3g2_^*WiFS*L!Qxw~_h4)Okes(7$vZIxJ$G|xVd=f8=hTp+kH(3$6 z?@kbQM+=o3_ezI)=%Tv=7Bz(sxdBlwSjMO=o`f{9T<+L3;1|x_eHB^n_fJW_Y8id3 zb^MKkpJQW)Ygm`lSWE6A#S~afbs-oe4+)sWU1>HT{Tzm0()3yQLqlzp&SY$HwnEys z%w-~fZ)RfrT-r=i` zXz+tO_42Py;}pipM$bA-Vrv4Aa{Km==$B|GiKbNzfu5;`vz^Q1t*hB0p4(EdQ(7s% z*^}pDj5@Y>s+9kQq<8)QK+=o7CKk=~-@YMA{^ zs9IV z`H4^=g%O&76X|D3lfr}X(x_SYL-P7{EJE*YC@29M2bRlKHY~up_t)x%9T7z$4@N@1 zRt4#(b0vs%UPLl)LY&=%5)C*AgeXQ>s2<9+@HK3u$WniwmI#A5i`yg*bj4ZF5^(Ev zl$1yF>+O`yKEGS)F=4S5#28<`T}{IknAsmL42@tzlbAGxi>YMNENMIIkY{zNHo+Mt zW{=<|T9WGR@G96=_k#yTB9o6yEA%}N+2isH5Dr3| ziOE&R!JpPw=a%ClbG&$Uu^d?e)4SMqF}d@@WHAXi{W67!2M7}|)3j^sPRXq& zEN0ARmhHkJh997t$90%i-@yRkv%DJ1jzJx_`N6>yGSe}2CXF$UEfk=EDBp7Gr zP(W)d1{uW5ra;%kdAw9W0w%h8YxAx|pxhr1Evn>uOdLYGQ!ZZDH$_6%H_boTBmC?h zT0{&gM7|__kF8v{Wg9d*zo*kFi6oo@nlxjviS))*eX}r=ynVN{ef1e8hQk0rj4V!J z_Q-;rb-k&pu)=DXr1N^GgO({y$U}C4Uez9gj(1(bL|7dD;XvObUX-R&!!{S`Lciq9 zHbbU~)<1#CwJzN+>}1y_?q?Xpjpu!xF*YA)<>UOC;V#RXoI^|u->qPIEvRb0AFZP` ze?G18krwTCyL@Aq@ZG#Lf6FCtFS>qPZf|?Us?%fnOtz3g`7=MGDFNj>s#fcQ4L=t6{{UI_te-l?j6j(K~el zFb(vJE4Wsh9!){kA*0Ewr{tv7nRcKkly&i%evm@1`>#`~Q{(cU9LZDF1oZK85f6-& zt%IoNS!jK@0@CR>*CwH#$&%qEjgYzs&CPH0MjFd39?;9f z2_%1HpwTs z=o9eVu_qqmVn`L$+(<65XyA~NB4p2%Y3XU^ji#1lnpwGm+?S=bMYjYr4>=`*0OJIq z2^+zyJh9TT9ou+EvK^`oI|IL)uW6E3nBQ-qtQ#=^+YdRb3-D5O*)Od^m)mFSWE;kY zb7`wxXoYphawiT)?Ys$)>)Jv{$#B}PkRFCU(LZ=&PPWs8n5t9gv5)737_w_Zv=FLOu3T>o zf-_uLqn!K^CXBH>7a%T}HjAb$bO#V~j?o9zfr4Sjuq}J*lGxQvI?2$dJTD~#j;V6- zG^15Y;Zmpyj_dT{cv78AQ|nN3+7jjIOD4(^;mx2cG1wLPp(9nxl_ujY{wk1Ax_4vD zWm|Ru6XXoX5Cze~Rv{+)Vl~|!fQv-qfJZe-fz)pUgzfn9!>k8ZWwwCm9G;eCfJ@ho z!}LRUrF{A*>z(@u{|KwF;qf8Syv?jzaI~9fXN0J}aar_@-;u%^ch9w9abHvdLz%S+ z5TvjTgjd z6GaP&KU8Xe`H@*!O2!aQm9H_f5+D=%LM`@gFFTty3aToBqRyWXT z_O4-?&}sGH$J=~f&=7ng-CIqX4wnJMRVr}sazgRAh=A_d!WpWcY~2jXs9b?zH9%#S%^*{F%z`>FIpMtUm+D|0DN^=HwzDLYT!zHi7lA{|vKi5oZ&P#$R3#7Yh{)1>yWQO-NCOV7VsB>2>hMzI@3dHUeQx zK@Kd_v+MY8VhBn?fzg5v&-pW zqOIs8SBc)pP1L0}0JxTKX&)|&Qec0(Py<7Q&n>l~ZzT;tRS(+FVz_!hP^f{e>GKr& za}M}J$|eR^esTIH{u?*~NlUF&{kIwk@)lxO1I`-=0zq@Y7Wl-1w!unXlP7aWMrUlw zCIwSy+Un#95=X83ZkfC+*H05ryAl*EzYw#ruI`os8e=wgE5Q5NT1#Gn0ztZ0T0_xO#cW!vA$-HP(PwqoAIvpb zIjl|vX?5hr1c{jaTP-YS)<^87<^n8R286;xz}@RY#B^Ak_iRl#Oil&qt|Yu3pdkp| zi7*@n6@7nmL|3{-w;I{zS(j4tCj zXOX=JYPiiM{U*OQE}QTbRG3wr7r;J09MzelkAI!i`t8V>uyuD=pVzp4cjlr>vE%jG8OH*I>e6!7}EO9pvEt&oNo#J1o0xAgCr zKWOxcPHd)~jt#;@`>-aQ&BBb(4HeV@Gvk^nAY(ERikcmAE=lyD_Bs)onEz zW(dHH$#5Jd^6bPc0tNzx4~W<+Bhlpbru?)8SgaBUvuXky0e~3p#o3tuFRkBzxOd0= zE%261>QIArK}Te{nLDnVsHZH61tMMFx}<@fGU%W{)Vg2E1*u;H2_hav?oD8*D6mSp z&~`1q*D*s?PNG5}WybhBN2kB09Qmn85hVPN zB1N!hRU-C`N%4yDO}i6*Nc2Y-2^!nD+hO|5+|q^y3AqB95{wjKN)=;Sg*DcrH`yp8 zcBpF+%h8JmQskur33Dy-g)%>WWQ7CK^vUz5T*8>oZ}Itkz0I$2>?LlrtK3y=Yo|8K zFLnKXeD1G#5}=^h_X!w%ob~PRVMUnSQsFN0^ULGotFd;%an|E~soj>5YNtN3(r32NdXMlZt=U#5V=Z37+pF{P+x?Qoto(eVH1r@ zt770XZ*#~fh@u(jctN~!q#MV9EECI$9F!CSDi z`$2W)WWLIT@ETr7L}abu)guxhxBHZ_yVAk0S%>}M9=dKKjXaL57OS}$rXW~RVC;H+f#>j=$(|pai#P(W;C3xq zLwrZgpzS@Pg>}ST7}HG>awKdFmfx{eGupiH|)TT5r!3f1&cL> z-jORYyWc<>?>N|JJ#~R@ptRtj>p=1hv_`Dqn@IoVbU_}`4_*K>hyG$1JlNDUT^k`%xrc6Uux*-QVs_Nmxp~42U`?7 z$TFbWG&d)?VI|N$!c) z?K7~U`_MKu@xv!#HRu#uygd5X)N8R;MhGj9Eyg_$uh)<6VX86x5)X<11zRS8E)j9E-W zsg2kgZ>V=OPT^~#G52iT_)RWdi=S_5?2C8qtj3Wswco2!58xdr_opp3#7^=C==6B% zV^qC$)*N#`dar|M>H__FipW{{xVfRjrA!%K^KXUGb&3*nS*N`~ufZ_9HoIQ7hlU!y ziv%guRqY2rEoSIQSJB6T!*j*&pU$cWpT*K*5vWd>h_Aeaue zko<3KmEz%!PUV?mFElL^i1M{R&hGiUDi|z3d;#t0Z>edMv%tKG6PjnQg=9H_NN1<- zUK@4WZe2d?qCnfirWwQ40Jg~^*rwZSV9wU))zvny*9+5htf}@6!(rI*a@pTJm!6qk zuK0F6eucx=&>1uRqbZdNYEzLX1hXG-TSHJ|t!92-J1023s?v%fNW#f+YI2Kl8W;f6vARQKW?>W7Cz=Rhs-9L z>iE@X_z$ki=1%*K(P0qfkRmCqrSyuz^CGnDWfX)Ycdd3NaL^lMIY^6oeO1%%5uL9u zb9urYY6#mRuMH<-Z?aWD)sJs(j=FJe{;4tYeZQ$$Odq>O>rFzHPl9kas?TsjLgl zuKtz3_Hx9_*wm#T;Ge@?2vNz4Ml#3Dv7dQtpy4DG^Hd*kqDz*5PHAEt@Z4jpvLEqt z#u1{BaQ4aUB{w}FI7>95Ch5S^i7JJ^>*qTzP^Ki})|<^0ccsDpx_s$4t-z>X-eMFy zgwBsPvc7@8vQaG_Imnwih-f6M;X>QfJlLQ9%{DngRYqb!Et17WClGxW`bz9vhSWn0H}hOigzVTwS334$hSO1 z=}PNb#dgc`>*)0k=sV^9@3)+3WqH8DWpC{KLHPKIhp5~vOG_;8jQCkJ4 zXvx6IbvHC{Ay228rv#%FHa8nSK=ly7;-!ARBg2qc*7$SddovfULZq&JGENS5p^RwY zzLOex`6NIz3#FDNk1)@KQo7*=(Vx_7s%@*oS_VaFa*07J8to#0N?|c-Ij0q^V~iT@ z+#uB4X@CI_0A2>308^eHN3iI#lOTAFq4B{omk9vQQ@yghYiR)^20-Y|Xh(Y*>A}ph z}h*3z1h7w$UjLb*Q^q(5;pzwEfn>nr-=agBqKR9oU$P<@)7EWY36J+9(RPYp+2&M z?oy^@mlyLR;gD8BtWa6y0nk?Y(;8D4K!YiVaywkij zkP13khma#w%QWV#VMl5A&ipzlDD)djh0MhY7_BKGWUZ~;NhR?t5!uu-9dTwhLAAHt zOasBD%Yl<*?E`i!0*v=@$)+O=zbGhJ-?RmnUcJABVeB+%%HDgfhe(}$#EO82=RT!D zOZL%@w-RIy-FHL$JgtFFgIdfOJpP*Hr=9M{ct26;rXr_edTf5Y64-7Bu-m_2JS%X3 z>#xQ$gfNC!01G(mU-zCS7BN3ZWd|cXzxm)CmBLTAI4W(}=AXf-lRRH>mM`8q7LHKH9fA zqNBpDgKcaktUJrPGPHrba;c`P+@kp6U+`owp_f1PzaOuD!6@w?ylB+6oA==T*cHa- za9*EV-kDoA$_0kH36}*hWDOVXs!)j%qTc_ot^%tM>0eII5VDg{taNaIBeX$Zp%}D5 zAK0#)nwy#%WNj)rYhL@EK%2IKu^o?#*%Ac|!32*F1rg2AGs!j2T?r_wk*ggZfIQ*o zuxRL7 zBWiQAY~7n*=je{3tg7*_#~|(Ehnqs_+}BnQYGofY0xz@T;=CPx${W}FJDJ?K405_i-djup;`)QAoj)nff6QCQg(S$TpA6o>{6Qr2~d$|=! zt9iIm3MuL#&;72G;q#J27$4o;WdU5sNFU9sUcwa15xLd^LV1i^$HE-eR>EDD-nz}@ zrW{4GU>K7v+gKZQs_S43Tct~i<3MpHI0+fQ*d!r~xIqFYKoUp%fYXiAQXi2)jXnS@rG|SnDkuoIwEf|5uPdh@Pb)9IY zl%Pkg%Hx!9N7;sNGkdtG%HTu+YP>hdpxwM1l1)h`P^H8Toem(<0NxtdN-5grDHOy2 z%S92`L^~)r@-_2xyuuk5<;iLZ2W?`&{F**Iw~S5P*bcU^SFE3l!MaN@QQ|({tM`#c zmh!rqE3+P-s7O0w+M$LKpFqip8NUKSg>w2|+h8ODp;gfabO{1vWGx%fKMje5>ntQR zdP9BAFzE<4r7GcdicGDrEz^q!+7*|JEgOuOX(aycowTgfrb0sN@3w zl3Hug<+Q~9-_ShEJ9l&lEEHy)ly%*Rm3{xTT_fF*g?|^ZtJ^-Y)Vv*tH$IBR4VcDS zScEKPpoHTc?WY0n-clbgEhYov>8p$}#3%{ZCxkPN8dfL@$V>ZYI69x8b{Inw_jf|P zbZe;6_20>P`dgxQ?{7os#6Lzsvw|$9ggj<%4Eg(iJ(?W!v;~sGi{}`D1HYh1={Q@A z2eBY277}P)R@~E*wj6aVb&YBnSW#B`L0t95I?W&&%r~B?ZNzgxhb_w0Vm>nw%rrD) zQxAUivTT^$WI=YB)3_T-Qi0AaBz2Y`E&|!(Ky15W1cH3$VrXo~S=x};5!UMwFGxBc z$0ZbxmmiL#6U!csncA|D@>r_&vgm~tRmig#k9MVbQ528+V2jN zk9-Qk;PEuR6r0|IN19(a&8tfr^6ef*S$pmQkZP$?T|@=;JFt}>kS^ef!r!-~}+ z)kShZHq)O`?CoTL3tt6c@OCR6V1dR3hg2=IJw3Ce-IzAC=vMOuY^`mC1Nu5}8*P2r z=;-3g-^P;JIig(YH`d0Bn=PTiZERyiTsgh`c@*~7qmtuEKnZU33NajraMx`vHWr{wWOe%8W zx^TKicnQe5s-|>WU@I2kAsaKqZX&*CBXc}3!WYH+9!dwaVg0scmlJ``SO}S2F5;AB zLMn@y>gnY22OR|In=5{(uY4ML`H6X2KV(dXwZT=I^A*3)W(L(r9<2skCWZxBMO@U5 zEUy`>a)YXA8j(ErhCIH3n9mThly_X*+;2Qe{id|it3Cl3jV>MxiRd1L-~$pJV@hS| zJ#}o;!W0b(f7C7fPXa;C&QtD&lP|2hRXpt`@ZU8{uF&mHw_agV6&Dr6n)z}J3J^IC^-~}atV{jD zn7o#4RzR_h{7PM#8re@1{8u?I4@83zJPp5-^r^LLk6t7*Bg2nd*o}#Bp>hd#G_Tpb z^FlN0T9l+QCaaX;S(Nq!u;ra7cqr{eSR2h9KUu8*-eu?c_??cujPq-A)8+Rpix+eS9A0N_U@YDL znK%Gwr$NrwyQUUzN(gn|Qak;Y5T-9_V!J2C1-noH_X#aEe>LU6vXlkXk`9kx+9+|< zHhDpKHj3fJ<%f&@8-#561oL1HpSAfT*s-6!S5L)BZ|1o1uF-mF2Ot=6L3#xHi8A4L zg1$Lb16-Ao8;x^P8pVVrRCXPM_olu)pa$ke5NO1r*yh{|pSln;hb7JpAa|2RTq2^v zAZuA(k2VzTYi)(XEg8k3y*?lF^-znW07hgGz`w*TUtg0yfX zgnC#QogkSV{1ZWnf0?PA6jKfH?Y515iEeUGvsA$uhEGTQ$8?ILgKOnQ;49?!s=5mW zId77reC{~=cbC6cvd-P9=PEUjwp&vTuC}_ES5H;5!-uV1y1u@>n!FlT(Mif#z8Gi6 z`;Scqoj37+6c3Z&2r{$B@@7@2ix_`=EPF_<_3X92^E@l# z&8>H?!~$$}{O^CO?_EBI1KtMiJV*@Zg63R8&_M8C&-d!?$(ocGMHNxs1 zYyJPPnclC4Hf32lYrUNtIMh3-nUdKkY1M1hGosoCc?&KqCk+I((q6Xv*Sf^?L8{P5c_~^yJ}#n z26X-INyrGQ?Km!Jq>-NibI-^UhZQ2{cit^<`%5vXydLKwE)WM;eqUYW#h`O1SP^Zw zsqfz`%7+_Uk`GK;JgcXRRt)_`n_B|4`SW)_PBjax^vzkVno9n9bl1EMlK4!W%s$`A zH?1hR%*I^lRy}GlPYX!lN#-VltDYsy0FJRhMyaY)*<+;h6(b(3TFD>t2-Ao?h z**cu-D=Em8i<{c_7!vTP2tzsM?Aw528ywn76)p`Gb+UU8-q}zDjRtsfL}AMJfP{dm zVG_q(LDH%R9J}=lGLtv>Cy;R-(E7KQ${UUijkz%EU|5)ZWgEs4?Z-^K zg&D)R9=OiK>>u;y5m3c_1a4F(9)RKHz69#8Q?P7}x6eL_W6He#!j#XN3Jp4&n+vMH zoq*oihEzGqh{B1p^6 zVOgub+)g~&d>R@M)&HN+h=#D}wfg37<;~PmcSy(c_%m+IddoF`R*;}gj_Z{uwCM@N z#!}D*WO&!kEBICA1JA|{i8r9j9ssLs=tmhtmf5&sgSz_xqbgS^4jKvHQ(alqMU$~b zf)x2MaRy(Bskcf<{#pbjR%XJFPModq#Xpfo2lci?Uw_iet~ztAY{|#m#6K>@^bQiJ z7=1~FxD~0fNON!(Q0=2k0#&L~QESqjLeTe#sZoh!^TWudBneaFWr(dZc26dCeTjn5 zf|Tp>$&!_0JM-DegQ&WeSlt8F2L zmd=>H3nkIk&n5Rk?aznJDHUC4@iGjRq#WuNUhT{N5HBVjl@`6zHIcXiJ_6<7c9*&Y5erEjI!oED;*Ifes_emSa~@hPfL`v=Q&rIeoZD$Bu+$+a$1t# z?#Zdv3CYUI+KM%0SLKOVD=-|^;|ZohJOMKVQw#|<9@O}p*{%LLBsV_}KD??_gK}ZX zswLz$qt#R^3ZnseC`%F-fkKGJKkPR+liubwa%+WVZt;; zNU^6-32U^2nxl8>9xFt}d2m0EmG_m`$H4(n^R)G!Z+W(NPx~JqRhgnmqeq3BTRZ&I z$M@?rX|3P%a>$?FJ9HW2DhQvy9C-p{s#^4C7%db$RE%5SUmqAX_{(OiSp1}qz9sc; zN<7^?oq1-c758Q_Mut5)035D|{&DbH|Ec_VY7Qt+Q6VkMGQ}7~9E>S(G;weg07IhM zVr+Z>DF76mZG2vM)VybYKbKAD`K&&S68MkrPrSAGT3&qO?&1(>ms&Qe(~t9toyU@X zoR&+npQ_u=ckNO8PwG)u{-6<5NK0udbAmmqEFiLa3N)`gRmxnf7?9L>e$(G1$s~G2 zH!{YA@?x>o)^yNT6%voUC4ol=K8qmt9vDGcL$2J;cY1bZRhv>ZMha-grzPPn+>ag& zo((PWVbp69X;~81r7x)^AAim<*$aHbOLo|o_@E8T4UVfzl7`t71SIV@0aMx$zQDMt zZ2|W9^&TU=DKaAJIxC29$%-uY3}O+`Ver{{MQ^sUTwX zKW*y;0#N{(Fw@_$*=ytqyf_~DfcsB-J7tb((&)%m`4ywIFtDu@KmBtwodz@=N4V4` z>w;>YL^5o8#L3l+p`+u(=`uQ2ba5y{SN%m{(@XpLQYZ8#Wp~F|0vhHg@G$RAH(`Z#k(NANpOsq=QRX zLgv?4^wxxmG$t3UADa-pr&5YEy=m4GGWU9x>ofp6o|fl5xdAWwpcILTYgip-aZTnC z#=no*f>t^N6d+`xI04wRxm>e9LFUA*Z2;962c<49~lL;$hjaMUk3;>Y4hwb&pcL?nxaBKc211=JQ<;M5B@Pzd?B(9D^Q zMbn-Q+%kudjnbtFv@qHBR<76O&kK95)#oC(SiM>|_fN^l+I!OGWYi?apo zz@s0AZsR7Rp-{|;pqU5p$&8i6H%;B#n=uH)3q=T3C@4nao2J-+OM`Dp5#8qrNueg6 zmrG2npn)%5nDK!nY17|uFu_{f1DAhlXLdV2$+&v*CR!JgYQ z4)Ve|u7n+Fz!aLe;{TWWMOZ-Kb{bFY*$am*Yx*z3+M=02WI7o=9bE%yVsm}*RHpq4 zPyfkyAGUHUf!Lo|5FTc2*^YC>f*8%#4Vna8!I*8Z1LTV)j^+ad)=xC(W2<8;diRY5 z#pE0Jxe_fNZuZ~a$Sl*n$Tbtk+@$fpVIGv{bi1=Ew*xb>GIZdNThzP3UN04qYy_fy z5FPY-D9tpTh<&S=U{T&lWlgpF_8I^1X1zC{&2D;WHyz7ZE3h5iQ;EP@7DCV3GSyT+ z^$#LE&--t&lM(lH;tEEdNtm~Lu*cERDhQ;Rct{W3edQ>NHg1q|xCdle!GqfO^#Ie8 z=n~HUf=UMv0i%<$fhi-c?Zep2cW2bP)g6RJi}6p~E}d#A{}jDWV9^uMx3m_~&&%qe zbNF4Q2GU`=0In83zZu&`4OK0tnT1d%2V;T8D#9v)JUiE7?z4^aji!1!9-%@Bd<(-9 ziU=zI7ic(3d;cfU4z947wRtP-XkS!?b+Hjg!Cdh#q?@?@{{`t%%>T#3qtN*5-7;}x zC$C{K?$gV#I%!fV;Va$_wE0xlq}@-htL!8bI(#~OQfANYE2r|5J!TGX9_PE?d^+^a zG0$#}qgD$mUO3(Mr(+!T_1V4E{=RPX%~ez+EXuJ&{tEpyqTJTN*>)qgCoB``84oAD zU^Z-VrW+VxjUueAn@<%^C`O#~=GQTC^0bla0P#JsEg|69ucbh%LaT16@)k?XFe)Sh z_*nTzXw_S1_t1$N&})S-HYbH6u zZ!?q>SL1SSShdhNK$2}?Q#6i=|EKZT8R{wGo{m+JgHV}|Nw9qghGNqb;>ptir*b7D zK^%b?oHrJ~b(sZYq|Nx*CKN#q%4e00bO}+Y-!o@wPR?)q>um8fxzrx?z;LF2rJLv? z*}Bu;7`$)43?WEZz_=kk7sn6Ckx05tHjoOK->2?8a+5VIEPaWd|BN~iNwWY(Ceh2W z%b+*;%OlG;P101`hF^j@SU;vn%k!=xt}%4Q>QOm-5KPH%>CW3TKw{YHFd-r8@XA#_ z3nKRL2yxAJu2t>^Uiv*Y;VpIWI4$C|}uH_pDKQ7T-bT5t7 z8Gjp+y1gh)!BU``G5Nc^M1-ryeUU|&UNrMzZ-QWO=DiJokiz6^RSrb4LblAW%o_?5 zMuZ5FQ9Jxwdh~wKp>Jdr2 zEC(W~ls^O_v8d3aJeUjM*tlRl0&@%M!^ZSzV(O8rm%rsZO0H?OHnzFNrR)>Jn9kue zLgrAo!%T2%5nY&GG>uB&>y+?5pxIiN&oI{K+qsY5if0f#KxZ5YH_#$;j2zw0#mRSM z`*yDFA#necLoYQ?Z&4OjyD#`gO}x<#B7|djC95kR4&la|c&&s78b;@1%8qHrZa{i+ zUbFka0Y4(woO#jO({t@*=0aI|+@j-$LL%G*t=o?>$rORGn|{qFaT@3$x|J+S+^;Q_ zp3ylai)GxL8M~6%h>FI8Hv5D&7c1=f(6=O~H4R`KUjyd79bv1ZFR9~1G%$hPJQc*1 z8&y`<9KYxcn3<}hE5G)Ozk^C55ReOVIbgLHe8G@gGy#*iY20CnG?MO~eke!hVz!@) z-Z!Pl>{omLkM+NB6FF~1&JZdhEUTJ*$~BIk(=Jx3^(_7*Y`T7xYJT@blxI^0nr5v( z^t$RUNazYvvFSMSwa!I?X`n~NE5gz$n9SMR^gtWW>^{1H2w)tuOs5eZ?` zAnKNcB$ zPyLyruKC2z-C7JQ+r6bxWIYpwxtvdctE;EsCeORwrYGtW8lBlmXKjZNlNFy?GLasn`znm0tTePYQ#_4p-J1lwXJA6f5B_EO2|)c7JB zTeuD$mOnWd%lA|wLCOmx!UVfEj&A4)U7-(+zZfJIH^21jkHtT%xW3HODbjvW@(5}i zCKH4D0gX%ebsr9wp-GZJNt6_Dp~6?0Xx@lJ$^aBB%7iV5Z=D_N$8<6zT6IRw;r=?n zeo|wpTdOq}{(4}jHX&|n3{(Mv|9h^P&EY)hB&6-bY(tBi?)LBh4pOxzCGG!LkV;VL zFiE;4OEmiJ#8~Tt$n34^zOCNl-r?DA^|{iPLe%Fs@c;0S=wzFxxI3g3{@KU_Q1RCy zr|zB+$&@a27X7*BS$5zDr1_`lgvR0?@l$j%c{#}Y_o$uQyV(u$Q0CHahg>7ChpMLb z+XMc&#fy#JK#ltSG}7uBYdL-`3F&(7WZ+bww`4rx9k|p}Tqu8+gUKx7gXMAa&q(v} zYY{O#etwlms|tgjf)%NxRs&U!UDujJ zYY}GB>Z#(t7|#V{t^Ie@Rkqy@8UwbSPKsJpX_8sQ5!G=qfyen6{H-=Mgn;m=NPG9t ze}pFS1(866N7ND_^2^+@3|O-_>_{{$IORiu3nS%>$)?)0D?5+s{bCe!r5z0MZ{0k4 zITLz0saQ8Ag=0rX)J4^4Plqc9CUqn{t-|G*?-1-GuAGRT5zw1y^I?@zOyqHNf}8ot zJs+9oUGz!VAqpntB60Z0ySyr5{aO=JYbZ*;z!A9sDhEY##)7|aF`otSoK=_AiOuJo zGVQm)Jz(>nyQayHKkdf;n}OXW#Ep`{do)=DMO$&`dyb$#lA|1}$Z?Kl3h;m3;Zksv zNPn46%o=lvPfD_(x)a1g=EE@R*wx}@2q-l3&11Yb7OqDK8=p3G-dlrU}}?HApCL%j!=x^tjm`sGF+D#)iDP z8sAB0K3u(t2#LOo%Xt>D9^o{)vAZzB@V@;_18r|h(*E)ml~dw=QzIqG*G?Gl3{1*? zZ%vBJwLL~CFQ`|WKt8PsP$wp*`p4sm^6Xojt6-5bwS`wHvO$(F-*LXzRQoz((> zFZzD_h(66=rD1ufVW<{FfM@2cy7dcF3Xb%M=C5SCdHV=`4cZ;en}~xnw6cmNfrRLB zUb`y^N(gl~E=OvZx}*49mlIVxU-L0w7DmJLM_Sb|2tp#Lb(%V2@ak05buh>t{@hac7B;|tkFq17nnHY3|+)K>_r`4H?OjG)Y+R<_^1sBn--$D0^! zM32Pdvi8YgnD-g=G4p)s=bhrU4Ov*Cz($qW(-qaYQWM^#Kw4JKh0!|-0L{`oVDZ!T zo?0B25C;_xm{lf!*EgTM^ZPlz3zU%6Sue;ErbQWl_j+Z^nzg9X-Pw0`Nu7GS_|eT< zs(omYe6h?}qwV>vH=FNBPHOY-wjW-Ap~<&Ax|k`{?kZF$w_J>~eWDlwBLZV;UsQMh6BiUVhw_qz>RbW?Ex*hO8n0>) z%t9fU81nwl9*-+&zhL~YwNLa|I@UQu9+)_q( zCM6jPqp9+-7}8tb-~XgCGmap?wDlljb)1_6N)W&}KK3xmX038Su8-sk-;R28pa4N^AuXiUbaJz#AG`%0W&~B|91xH;Nkzu08P9I z>-;AJ)VLA-q@kk1+&XaN=G4gAJ|iRrHGyx>Zn|e-IN~If8EIslscVfX+3hdVF(p1Q z8zmhAZiOBv!m_Xt*3#L`po8(YKB%#KC@4nk415e-_Hn?}_l7M7<%*a&12^+T^TpaE zoD@_)u@g_V4!qWN0)<2sDaP&rgD$LWhPwK;=4i8Wj=)&?TQPi}i=mi2%cm%AP9MIc z1xjTfr9HkLcMYo#t?Mu!;}`e51hjOpiIBJio(!e@Py~_YD#5@drKiy7WgHGMt47Jr zzb)z@g17{Mjo7wWY)74#9zyk^P-!J%;SL?K(e%vz&bJmcH`@qv(ra)V*H~J747ZgV zx?7!5ar^zYv0G+yFB&-v)Z~DlLL1|cKVsv#TPE6o_a!yoW`50BUr-*9akdw5r+rWt+{0yeD+{Wkgt>;i3jiX@I0Z!q#gZ7ad zaAbs7l6!W74+ZS9XU*HTell&56ZX>90;FXEFj4~rKLbufI`iu@2?y~#^YBuYrjE|+ zct!Q7PD!A{Dz=fP5sE+ly;7k2GX~3CoH8PAphsk%*2vypb(^?oj!H#lzH*@J6&3sC zEza9AlHLZ~cAuQK#WNR47@20Kt;@psyyV#esD2q|t~$x$LR7Sh%tTs!RHQ7O*tTrF ztDwKy@76Pz|4o7N?l#ybGHtRUwRfPU`ZH_HKwti-Yz1L{;X!?4nfp~N8;DWH-~Jbj zlJMwhvl{^Z-(bp%(vTS)UrUE3-_0i9-A}6o12JMcl;R{96$R*wQ*oRE4Xh>sYd0(+ z9EtvS@YYA^lzNd3W10=zw)+5i&L1C#X+{tV0bltpT^`AR185=blNknV`8UTmrVgo0 zxRvE2h_!(a>97@@5^bx%K0oMpK1t5E5DF!w3{e-&J9#(s@&+M)jJ2?v<5%!lB`6j# z%7{J*k{=1&gbN0kQTcquHNWR0f?VQNPbAQ%SFhtw>^MAZZO=Ex^T|~ApBXH7rW4Q& zpruFyRK}?xLCOkcJk`UXL4QaJXZ7JNd>}hI#nH9sQad@Qqc7|%>7@HNKIwr_eRlO1 zc0)S=qd{DxEMEX(@xr6$MAV&p^@#&_ufSyb-`X$tKwHE1eFwvbmicV=?QsKpjb^L^ zR)MSAkTq#^-G2GmHZbAw)rYwz_k$C~BzHY*-6G2;dde{)Z%^8yc)bQCr{tQO%w(fc zl((AWVE{<<%8`mAEm*<-!#2;Fa^P8`K;zkPU$Ck)(c{_tvmT%>wi*c?{#Rp`(KTt}n=^qx7~Td)k7W%B9;3$t#~_o^<@;b74T>KMMmM|D~MOV2^U! zF7RT_K2_(bzgZiirW>Mbob+M38OUA~(X{^AQohe zG|vCdvZ_^oY5cxFw2yJct|>DO+BuN3?Pz`$$ja3S;dy2flVFkhMkWPef8RMjqIpS_ zR^9}aW0pa_!mJH3^vtYjb1*{a4hB<;SFy2t_=kAuC;xXsJ!FNy;Bcp17iTB$J`_oEVz-vPZ}^0XMv~;Ia{Uj+-ZHF?ZQB;b zg1fuBySo!0xVyW%I|SF@9zt+;cXyWr4esvnCQ0^L>+Jiz`(El_ky*3ms2Zb>)_U)) zO&go|K3@|b>19ELj%WCdzO_!Mnambk_b)a!x&cJ`d!5hXZqeUM$9Lwxzy2*9Z&m+Y zI?e($hL*mQGxF6UYn;RT?z*nRt8E3mu$_ib&+zSvzWMQ5%)(_nZ%F}ks^5c?2@H_xOh4Zr{xcmea2Cy>9O-KikD`ST`W?(ULrVGya{ z75dLjf>0#4djj4lo@a(OTW3My&X8ib*Ekio9~*uLkvPx56pAK%GB)RO8!ydXq1t7- zg#+>Eu2YXOb*UX;6jDj1=LUw0!ol$fKc(CN>T-sQI2Pp)X4DAu0Ww#0ruTO;AfyN9 z=JJO3=MGs&4cXg}nRE{02h(-X95m?tjnP^+C+tmfx?e2*?!LW*IoJT~^%pmTuV0)a zM(}!=UX|mmKfyc)Y9>N--Hx3R&|EF{!{23m)1QP<9$P?BV7v?P2W~?^1Ir* zwc%6dU_)v83AAPNRIlsL8Wx&TBCjr-N}uvHDP9hwAvzXo3wTqDkB)6Y9?W4RcQQ(B zNA2~U-Re?CjbZ*{5`HVoPPqe1r=ey55(c1XB+mv_I2HTB94BdJQExWN$K*2q+yZQV zQ3a3HH^Le1gBcZtfrzLu7`FW(8Ckxfy4=4uTfO=FyY$rbSa-R+GS`J{tw-C$qJVO}#4$FWA<-17CsvkrNb2^$U74^)j|k z(g5@##FABtfsm8dLzviO>SWHD3cKU7#D{?380s3V8;Oe%J}c-k7RwI_a0}_ z4ocA&`JSUVqc}l}Cp}5Ay|TvocA2Yhr6V7eGMPA4rB$Z0>XFOJ7=^w-ds;8<`><$> zS5p=@`rx@Jmt&M-?tIdHlwjZSilG82xJ6h0X?#PjiSQYY#FL% zv=KLwjKG)-3gyk!N;r$XQRLR z-ap8j>4T^R2I&Aez$L)DK}gvqF52n0yGk=OB{)obRryDL&}bUx6Gk9&L(f%F7TO*%n!dTP6k%07o0I8y3l$eVb^07mTv=IN)cb zTNaX=KgZw~?j~!fV<9brt}PtX=w!NQBQoKHE;7OH{Ok;RfC?L(f+G(Ibb%2kPT#i% z!PZ$$IhFP=-0;n@0lLSRFeCfjcZ>evkKOr@r14oNd@xx7jNeXl0AiDMvHjLvhN1PId{Bd}$(n~3Jy&5E$@ z6-tu^kRv}ojvkbl=GrWq#a1f*5G^1AUs0taAVr4+P8qTMAr_BroL#%@cqb>@FZLAb z!t`{;Z5JU3Z`s(;uzlMwqxq&WMy9bM{rz`)?q$sGgTjvc#$^lf<~RUl=-{(Z^&e$r zbqzjp%o}mtHcnIv&=npq)8Jp$wdmh!(ocJgBAj3pud|o0H@+3ZHLosv-Yt87>1?)m zQxRb&E%hugt9an;Vj6kWQZdLS(G&$P|HQckP%TiGT!mifv)$j;mu1rwK^;Ft+^a14 znwZQRp185KefTR+ArkNM`Ce+|s({oqkI@-4^Lx=JVr-rw>3rz$a4yPl2bV=agY7LS z?t7m7BMV}$TpX+z-hNR&K(heQVEaw^uMmy!6dwv8b1uI>Y1lqOlvYMU;W~_hAda8T zY0shY;Y5<((J+iR{&RdqmZC4vMm?o!ukJ>Qky@ljI0O#vszeb__nccgF4A$-JmJcm zB{LgqrSOT>R1i(qa>GkaFQV!YBQcgRDvEHaz#|ofvN?V3kP`ZX096aCKp$#rA)xdq zRrhklxoW1cj zH-3!E^&-5HW7toH%OEk{Ex~&IW7Y6ud%wu2ya-~*#6P+S;XjbC%);b1 z@Bc}lUhAa2ncGzBYZkE1-GF=#gvE~zW!(kt^B44~B@BNaXo!sg;64u^+TA6sgA<@fb@XevDB|Jz6atMIDAb6X>q;#4okaWjEdnY8B?88_Co_IfLtx7KhRtvU=Y= zm*);Boq8pJn}M6;!mSH*X>vz+2n}kB5ICxwBT}&Is>~zM%$_E*gua}tf1G?8GT~sqPJ389Fydv!a9mU4ah%%t#cB$SaJ<1oF@nx>XqKX;}Z`6JQmqQ;Pg~}L;`117bMDP|HvIl6lIU^->+Q9CX>)No33=>o93Y@DgFey~lh~%{xroxZ!>UW4EdFAn%gt3#Q zKDqAf>zB;*ro*yJ5bL2(-dl{V^cMzYWcYHvmOdWYhWc5O{x=MYJ0&(HFwL>KWnxA* z@TDZqiXR{ncILe(tR+KfZISq%Ro-WWC$jDUqFpxs%RiQaw_p|>JOCxAM0v=XeTw~D z$1FOUE$b$YY9%?EjgBCW>UdWC6Qv<}lo_{xqY`Gqh0G{~G4#{YkJn$}h(7{wjM)mrw*%Kf;38)ODF$`Fj+r!DpG zst+u1F$C*kAp1~4(LFOde^auyV~`rDqGa#hwHhs1-JA9*hq- zh#5LW++vq~+x6GkoUrArb?(N>)BtI}t{xa-kq+3F=vh-VoV;7yb@9VigEyy?j zX+h?nY19IWA8ADOxav2Ro4oRqC0_>zX^76y0oqX;WPb6vl{Z%551SLb@ezQQ8<|4<5;@6XT@Vz((nZW>kz15HETtnI$t`5&u>#+dp4z)998YORz= ztxazowwG(q$tNzZ)_s6g!>?$Qv4^n-@Ttbp2W@t*ZY*tf7|#Ra(*y+L3tWT~cz^!N(f(=^MZ~D_nCdrCCKV2FI_O zjA1&m2aos9BPL#GeousNnR^!1sk`Hq)QKcnXtU2KVF!SwcWRl%gM?cn2)$-w`zDG| z@n5cLKc3m0O^HF*hGnlYQX))iE`>Yx5FrEH@xQE+e`H55vJ&cN9sddReU* z&Duga1vWhSnh8`b|iOU*xEnye5q}k^40wHKlaQEz0JeRz$4V`@Of) z?f&MY(>o_1w(N(SS@uiQKS$amP}=)=L4ZGXfPxq3ly-o#iHCvi>o*w@r5SyWTy5WwGLqArmg&|T+LE7&lQKtKSQ~%2gHNc1xvHJTLJXoki zpv9RbH=gaa{G$lzjQY_*r9Sa)mA6_;=42+ zA>e4S-v~&F-N3=3QQTllpRt8Lp8vc?LBQv;hq)f^{}{p5E}5bW3j%@XSPJ(6e7_Vk zl$%vbxz<$09o)#8D(x%9#8KW&E?26(UOW^`B;tZ+?i$FtP_)3|a%{Z-uj`V2>*+O? z^;2!qc+Gzmmw3*E z_7L}HUQaazjma%lvco|R)}2h>nxJ4);^tVjq_| z3IYKiP*uXZQV7mxnS2#~^@t#A2nxYrgdp2e?HIjcu;|8{I|#miz_J7s(tgb(I2;sb z?F&*qiMKr)ZO8$347Du$HfVjLZc4C=#yDY?I2jicQyvoqb zbkAu2=-3$A-P%0e9eUtCY3(iLpwBv|p&@u^>QpUb&HeX&H?RFa`(3gJ-pbO%Z|9(U zdIT058xZAJLEyZ)Cbc5thw`TjoRJ;6pEIf8CxPSB)<9~@P8327b) zHKP-R(=j-&=abMpk=%_>Dl!+5hV zpVyYX;dI1%2buz6A4dk7fPPgz)((K`-%(oXsmPtfq}p_!TP4d-mxCBxvz<$=VnR!K zJD>Sx(d}h!P{I(E$l|Io1j|!)aysBQ;$?L-p=dkHi*O#wv6mRO)70bSv2`N9ZQL*rJDxf`o&sq{s2_{UKXb_L4G8JA9B?AI z=%Q4GgTO~Es>46!uBYiek;B7~MC(OSX$?J!kiDL?%hN!j6XLJJO7I`s)8K6a|u z@D(6~+0fLWq_w&bnh&qcwi0fA3-9n+qL@?ntN7{$H2!;7mNcC9h+dg_3WG-n47RSz z@lbb|qc@a}rSGp)xbea4BP`0Qf%4m#4ohu~d&ORa@1kwXkfL-P^qK3)wm>3nO_ z4TuPc{ae6m-V)dftLz2axd0FP$7srCPXJ&vW#(~07oR|Z%)|^;j9S{B2}t4CVSqVJ zDK#Eyvzk#zWM;9psS{r&0!NS?j$>)l=Bd&K=vnRdxR&6-+;&tjq?wwSCb6zIbp(%6 z0!UGUoyQ=KNCHkXksJc|TFy=PP)abzb6Yv}V`ZM|P+4Je)>$mhr=jJ+BVz(PyPTRm zvj>N|a`dsTv96VGlY=t?$YNc`)4J;4XX?wotB;K%UD5GODo*;|&P~SX&nkpT%6=3bi3(+nV{TtQGbZ*pLH~Qt*!+JeN9Z z+Ak3lpIq*nI#gfk`*l*UDw+?@67H)MAP46~v%Zhbi(2lP+qycjO%JD3D}6Ks=1_D^ zEZ`@;l+rKnOYQMm5Eb{X9vCkX_~-~fGrMJG+lNuRHbu&G_U5i+V7VW>Kh!C^BwE{9WeX7%Wg~;k!&5(S3b#tFFo*4-FnuD z5aO{ruGNxLBxsiIX3lkjk`2?-*I7OrhBKg<2+P^y9V}i1B3=YI>&yGeiJZ_=mZkJh z`t>FOE6m=+@>@oGkdP19+#|5fzza!bRAGxr7LOy(xaOwd?9l<60jB0jX~g_^`&GQ0 zP*oP%9GKqn2*1G9yP5gnqU9K%*|TU1%kg510V%=!@exI*H4253yBt;0wn(JpWlN#<-c+hbxSY@ zNW)szLszb8(rk~P(vdZohC8`knt0`pb8Ahl#bNr|o2xs4W;%xfsLr2!orWk78(o(YRAA9Or zPN$rTa~x`a9=E1brR=;JCw5}o-RapdEzMf<=af5oWX#TMIIb_&p#Fcf}qRQYi*u##qyW%3h9!|Y@Xc@)_S{>;wGOg|D!ZeP*Yr4YF0 zq*ro8k{g87WHpQ|nQQ@fZ9QBDQ(&%UX~N6?bBIu+kd=3CzbUvht#lbzTPKQPwKIDi z1ManVec@>sjnERJp}L8>iOA>o&l0ZfeMC%lNp{gP&Z=km`w2BD!&^aaJ$D13XbyR{ zvU_1Jnd*b1GCRUAs?&){Z9Hc0qGCRNt}~-KGz}WR;ev8>rbn-=^(>=sw&2j2G?c{T zj+&^Tdng9fSX6CJ7dbFXn<}h80m67ofLK4Fg2B%&SUa@dGk5y|m8)KKTXW^{PAvR{ z3CTODFhq&VB?skMVb&stW1DIZOo;d#Oyx{q>>@{@I#Q5N0zb+pAjNR|{Mo95r_nKL z?_zpstu?Alx(iuZcv*PEG}M&=2M1#>ORq=|?YO_rF|p~bsQNwNSbaZPOVN`LI9dX* zvavcUgU^6Kmr&K*vgGu{y71Va%KMRwO9%JatBdUX18qbOOgW4u-M#PdwaP~E zYsjZuGS~eQl1HCU0s`^$P7yAe@&)6nl!2aKPog!xfMbQS)3e#k+?0rOmaCZ%xgle> zP>;fZ&B<@7XtXY#m(b#O=i*j9TzNplELrR6+js5$!f2+{cRB~N-QPumrLCr|CP`Aq zkL#gWIh@!0W=xmQOXsfl3!yb6QyFtv4N>3wD~NdJL<)!Vc>t0Y*ov^Fkl~ZSa&sDyfXHYx~))sAY zkCttfn_ITdL%>u5zjVENbiIa2*VViWbU2#QUWPlig}XBsow1qHV%u44+F7#424N>* z*J*mM=2X$q(9ss)#?Hsi+X|HuKMCv3dhDXZs?TB#!aF8pbX#%z48pj}QiN$N)##4~ z%37GZA7N$p($Z4XQkUVRZl-N|$Wp)%z~qqk46cM?tx<=X$pwprh=sU-zP~t?2fWVK zzk(dqc*1EoI_`O#9VHUJ;4D1tZbhPfUdUUjjMVg`&tKATX?QR9)&vGxf9hUYikS($!{eyn_U7-dkr{E~Phr|9UTN`H*gd$Z~oNti=45IK# zN7n}8%rJwa0_4F46z^Ingkm+|$;HSUdT5irKN!4!9?V{UUKIudJYacy-qa!p*?H~bp;ll1+%LGC$6ed-Gu3pVjC3lr~e;_mtD z(gJjt0oXCa?!2$5%#~sA96FIlItE~ry(?iS6Y(|vXNF!`3dnl;xYw_zX-)an>k&T_ zG8Z{Vy4LGab_!J9ZZpDYp#$bN)i|sjU$0Xt;9338)4Daj zGwkhUQXualvqbN>$#|qdq%B%u_pWih)*S|eI9UEx%3y03V{i9vhyn0{(CzQyzO?>{ zk*?(s3>V&AfvwqH0UQQ2oETUPz3f0_&g!9fgSJC7(i{xB8Y}Gy64N&X*eP$?w4=~p z=piHR)~xL%pZ8OmC~-U7*kVUEHrZ+OX!A(oRgU^bQRV4L86^Q%V=DwN227El26c8OF`v7A!^SLzzI$r!0DynCq}4a{Bt~K&vnQ zv?l|{;fDQ+-b0DQ{eJbwOKvs8D(hP7Sd|8ir<&lJ;KR`)Bdx;}_bGNA-9xhhTn2z< z0b=}~D^n0lP$Dzuq`mR9{Oy>7{1&p^+>N-$O?Rwf@5IvhIOfUl{& z={XIB_Fye41JI6w8?uBgs`euucXLMgujkOSj^=yI4<#;=w@3Nt8Ih8%$-4ZuALM@l zoasU~HlYn#Z$*KQrl)BL2~BiBWFee`5U@PV-CrigQ6ZQ)OSW}*1pw^I?(l+ zk41$Qd|X}iY2Spu@k@b_{dnPNrx;{*Ri}OI8;~MRgU|in8I2XYnRkSz_BW$JUaXLF z>71tKXVdKZCW})w(|?B!h`bnqP=%P=927B z3b8o-faFGmr?OS{=a1RkeGfDll|({^0BhjkM9y#yL=SDtOK-hRY9^0BbIQvpYt6&B zy+JwTQ*yHE;E+6=KG66f3JQg9;{bo#@Wg;2&@5K~=z#N}1|(c3gqTrXa-U`aLSXM& z%m#n8m{9{4g8u0oMEyeWS4|WMug2)N8naf$XY@bFL)+BzIQ7%Kn@tVC;ue{y=2WZr z_z57!jP8>IM;$DPW6fcY0rP&}lFQq!}s27_&}&Y18*2x5 ztfVT(@l-Alhi8?kD%Hyo)u zoxtGD$W#5{u_nER+JG?WmtxVu{0k-FL#^yvUBggXyU%g@%w6iu33jYqkbupEPKPTn zgge9-j5L+a%2?bP-C=?8Yil&W)~Gw;M|&*NuC-tKqx-w8>amw$8^Vo+D!{>9d>HBw zXcGwLsIBR&Z0(#}eMs$2>z2aG1e`FhGH1MH30fW8C>k%rmQe&cR++L&=rL83;1)SM zSkjyWb^rrN0x@OGMjhaGyw%mB?xZD8N&N~LYBy7}DFe0<ZcOf%N6CLb?0rG#AfG13E2ALVsUk=^Kx1{PzfFpx3NNZr@ zSgPt@cN2UB)VqgfWx^my;L+ua{LC!!P>ggB=)*EwX6{|=@sfO!2|l7p3Dt=>v1{{phh~9#%V<^|cj6JkfK0&dE7UM^}7KYuhJ5lq`prUAQ zZnBX-AE786^31N2o4i!+v*X@yREAV8si>lV40R8)1FS9|n{eK~@8pUCtS&9q`2g*< z@+)kVl(HGwH*+(!m@fo?Ml;Y9l5FnSXnwY@lgHX!atuVDY>ei@_dGhNm@K(b$|GjF zWcGT6a;!2U%ex_x#|=bw>Q)4WSt`^e+{5=k!FTRJZJ-KQVn0FxYL!4S5)R1_7HM@4 z%71ZOPOTCjoiBB1hfvZ5dFJz>rF56(Qppq&zfp)SB8H8qShxUr0t%I=k(zby0nRoO zqMG*A^B3SaSYC?Ft2Q=<01@-Q~ITrhZAc}n5fcT)V zf4w+Q=ZOTg0GuK1f&x5w5g&jR-=*nw&oLV}>HFo}E=I{(~IrgZKhAA(UeFd*j%Si2*Be z$Z(Zqj~~P4Js`s>MJ3yjUY@^WAO@qWB6UV%bm+>u*}1wJ3s65?IZV$=Z-@HA&_#Cd zjN+QHS4=BID4-D=lfSk)#1gSPrE8W9C4tFXTXqLQ`62N7BJVquZO9RyfMk>f(<*7I zZmZEsG|;0J7T%>a2`0JVI*pyzNC^m#HD%RDFE~ps|L3E2Zg9M+;HnATuu7v+Ih^33 z{9g+U_=@Qu+6)o!#}WrKhZoVuH|D)S+6Ur1x0;W0_X$O;I^|YsUw4O{o>C8`$zw;w zs+-#BN~?qGU6)>c9#g!$S|8h}uf8j1vplq#l)q<0#vcn?ElZW28UdZChOfUXZ#;Oa zrg?)FyuFf}&{(B#IT$Ulk*b++KuX2pdOvqW^$?O8LXQZELd%_B4t_^xI5w)NKLbJB zprr4NaeeV%8rL&}x8m2mbJ?(dVHj##RzgVt9@O@+ro-+CpK1kN^HX6b$L?(0y(Rk; zh-*{C-4ttHWe~<|K}V@kjr9wzx+?~EJu7ynHMik`greiqg-A~Y^QHwjxh)cZ25$m$ zp=+ILGj{G4DqIrGF^VylmDL7SCz1GrfSV29LaB+_es+9Nb?cd<7csqtEMQookv+y^Td0mm2OmiC3{~; z7DcV9@}EzbQ)C`18hFSbK3I)3GBCQUJOD7ubjxKBMQU5k^KPrJz$T2TyQzB?=4<33 zl&_u)jrkimvZ?;hu6)Ck-y8VGh|SiPfJ7gROre}(X|sZ1{+0ffCSu)o_CrK7m0r%z z-r8wp(;D;Y?oCA|m|&mE@ay|TwFI?hUAMpBni`A-(!sEQO9Q|?uCafRK0dN(9u~-8kpSO+4H4Okq>!ctEh5?BAAa zs(NemmD1ng<{l%=zdva5{|;ab*F^@!0~j`HEt`Jdjfl-A(1z_3NYLgf0Qf_m!e{F< z|5(mlfB%)scSZ^ZzX=tsb#?0vF|&X+DBq#`tbY{>oX%=3>fGaLfXZ3%8s6TsvFf8qkZTXb{L_w zkOBLH;xSl$Pw+iPs7UZga3cYhCLh>|{svlWTI({|_g%_zA^?f}#v*3mdxpzKm9+;X z1pG%KktVWJ>jJ(YU8}p};JvHU3=T+bCptFFZOgfxY29?D_P0O(1xDzTL)x3v(QmO` zs;z&8WViR%bRhVM0#I2YvlcQ*J?WCNDL4UJkW*@~Sddsybq>}Ke!#bBptGa1FOZLI zjQwkG!V=_EeO$fxaIF9|ihn{Ho6q?9d9-s_^>Cj_i*JE8lYjBYd8GuvJApOfEY$zV zH9@j??%ISs5#-BjTk7sXSy_{DbzAA%W9Ilu4mF3;)+p=S+>i{-z>y)jSRT@L5byHG zy%QTU4nT3%PD+?MHUxcT^Ue6U54+yZNoPlChlIjU{xKZ>ec0F_Vj$wW8CX;k7sP#i ze;6b@6o$~!Pv#j)iLDA0k zcX8pzrX;;>Cu%I~OSjP=2EUvN91{n%gSbEPGSB1Dsf)aWCfs`yxeT*J75GS>D1R(% z9mZoeV>FZHTHZk7^8g{Xe18c8hD*<_fAyCD(I8wnoRopj1p7+zr|JX!6g}k$URR{> zjM|9KCINfGb7JIZ3~O%0itfO#(k{BVA5;RAL3KJ1^7UTPavbO}Z&2O>EVw($kJ%{}F2SJ|u?+e4W-Gw&1F(GO)m!t?9xK%IdD$g@FSmv} z_FWY%J@oGC#P39N=!x^%h4u8?yjvEDSBVXnvyp6*mmKxr6?$q7mXBc*JR@uvkoaZN!OV9f{H5?E+E;Z+zzZnA-wx|#aZrw zT=+mnB+-bA(1il_?n3eFhruFTo5acy{<4yq32Uy=h? z^*<87H2LHyz?eC?EY@+Y3wf(i0CLe4GaRpGJguGuKx}banf>9F_Uc#~QFZM@O%gk& zb+E9};t}s`#XC?S$iKu+xt4=f!+Z((IlL}B!@%To$q|OV%xXAm9$bjT!}5oe;t#{t z_%E93OW|HE$Had3K9lgZzR%Zk^FTiAD_`-z zI7sp%THf}CYi#<7n!P7pQrQ!LI+k9r0Z_*^?-7Jj0}#+YEjV~)y$^OU@@T&u?Gf#f z>kweD-$^|u_nhy#LVB570qp~sTNmwu_X~yY!V;7xmV3o&$759%eTDJ2|F@y#muoll znFNe%_ha@uSqvU-Vwd@z(}4dcr*Sn`y1PUP84{H4*&i*(uAwe4=Sl-q3D`7XR?7Lt zN1i`!Kt(ND8~mj?xn8^9pUc14?dA)p$E^X1C9An;xxCNESvDBZNDkX5e;<9)|MmVj z_^Uh2uJ!-(*n|3N{yg^ob@^g0c4*;6hvtiLy0X!8%~z*tTEC$YzBB%%M#CWWYMGCQu!iu>j*Bg?q0fYQw|VztCV($+hD9D(V;yB5z2!8? zsAqU51UuR$qD9850Vy^3x|txHu(JAG-)FF{z3~jVfjt0CLhQZPntqW+M+u-rrjR5l z2N~4gzk=#tUx6Fg(c}Pmi|w>6Px!o4-{>%e0?YyLP!uOi#2zAU09{?%^M?^}DvJ9r z_F`{S^8JPf3G+As%Q1_ioW%nmw*)7J6D(F+5{DxNP%f_JY_NxO}0Jh zqtMjOyx?Ux-{d6~B5T8lEk3{usoaQEM%DhMQUd76`lJ0bqG|v8(bpFcdC$SAZK;;FLJ^`1#63V`Kc%nNetUO&BX-Vp_YT-g)0vb-9 zrUEj}g*S)eIfWuxDK!dy3-bk_B;b!*_FT*YKn4;u%W(ckgN6*&-sbcRGBto%43<=s zu!ElLy=&PMEAKM9+w=Z<1;6oLPN>1%`bek8C*3#H9KCUjb!`LIH-92U>^*$6pxPKl zG{x}KMMevxM741{phqI9Ne`IFyaa+Zh#8sjBhW<@KM9Kg>>BLX+KSS*D79n}84R6-$lU;&(c0$sy)o9$APRfclp}g|Lk&X-%4+Qo!~Zo;J$SLM zO;+8RodX^Fwuikb;0?Wk))a7w1`|I3ib{8b4>+@AG0j%yjmOv6m0QEWkjr}j@Oi#tjp=*#K#!aZv1R6=$+ zbFd3n#^lGTq{4DVFod~CZ{tt1096gme#QU4i}$;@M!4>~xW<-yO#jctY6x4MpI8nD z4?Sx1q9RuQkP4CP;``r+VWQ%h(@X1Lt?MAUfo)~R54fv$h3tfx0Q;l6md%*YFcTXw zknai`NgX6TFo{6zQ)~JnsQi;wZVR3^W10&{dF}X^jlQ#auo7O1(HS3DITRl+X^6W; zDmhzyEhg(^rx>7{Ln>}@E-1@$!CKyt!yLjJIr;7&~ ze^`i<8qFH|N&qZ=ayG7!ye6GCzB{kI2~Y;K%K9=EATlH7&}>`it^tH)r7cE>5lr*C!45xjgjhpYQ?Vi|ea=Gr!+~ds zgwU?it{Q!@S?Ks1WjOGw`OWI|>-2pl0P8w8IFyN9`un<``420-H;@O2%%6pAaSdS( z6}?|CP=Inc?AS4LVtvCS&ppm82h19B)d4HM1YsU-r~b0(GX8h#+S_*~9*~V{c7Ozg zWuhgkv1pNibECzzfxI}JFiz#6Lc|PV5~h$P4TC@bkxO~#{b#BElk;-gMm%y7hY^Qa z*n7WQqd587!rw9Re+4YdnCL*tO9K@!9xm;=uRvK9gcUdWmfZbCJpsaCPKV7Y;w8mr5L(dQa)oh2V2M{%|>Ue z;F)d7A#PnuvZ=j1_(mYInH0Ehm&e}2O68~7mCD+y^vLNSFaX>a0v{SOAc_V=l|Lul3Q^M2Jy49Yip(t`7c0=)b{%D34QrwEwl z3DllI7*N-uxr*bj$8(&J0|iruZ_kuI>-|*Z=6;4DF1N5JXvt@yzNqSDRXv#Bt29B< zE2?q><;vq8!SIpy?S-6A6*fhSx<2EOeFBlkYVQ*xmee<$bBK>!)?R~mO5kL-Q>hkRvd?kVdmR(dLEbbJi3;@3L5usXKLKZhOS<)=C;%SJag9FP>;ZL*L+4;(*M-!sIygAGp)e*xYPgh%Ks7l6Mt@}Btcjqg5 zqI`D?I0;d-3Vr}}*W*k(zJ1r5uT{qpXWYcSuI3dH+xb`cgvA+(;nABtbdKFYUl2AM zxBeArUcKhaun}$?t;q&b3(ErNd`=V!kJ!?!}J2@Dx@|I z%lFDVJ*z{pZERil%Cl6-f(mnoreDd=_B}4w7&H-u;s_A=XSnN+hHeYDcfqZ4z;e#{ z2jS0>Agf0*`=DYc1(?)v#j?{37qC9a7t(LbM6-l%gEVH~N+uFZw6FDd4*4!MW)(A2O}3j`lgMk`>QG1XLo@<)cOZS({~shcwniD?;+PxcT3 z&3={SL4tQq?!xzn0Q{38x?g zA$9z1PY}+?r;ky1o)7{aq$7(b0`Sybq4LFtHRP$RCEPU>f?cbTBKS;}W<4tW708ep z1{SL=3W8zB*TC^UBG>5+QcZ(ZrU+Imm#_>!amTKXhwtkkv#PE}PWJIrX7c}nd3 zMcN^2KY%~9+#af60fo^gZ<^`H_!Uao7e|cgJHTk|g!PvLae#)HhzBhp3xGT2N@q+d zf@PN0K1;G_?=8{i*!x?S6;05 z0=k5%HEbQ41t#l-HwJ6M)lz&VPTv%hiptikwG{~hx80Q~B3ysQ)alT>fAiHgMX>`p z8B^PzvI0nM;msi?JY*H{4@?kbOty*1+#b25neV#9awe^ar2~Xm5!_ShjepuGO>qAD zl!lnI;OwbyfhQ)w0rr@hscLliHCl#3G0z94bE&@rUsWGHW+s!T2`S_XM{B&-n1z1u1Jcx?de z6z3?|G@8!{A^qB0nX4c$7uvp=z%X9WUx*$8L1>57%3%yJy zwJwNIgl0hSOgQgDRE0P6xe7;FFdO692f!0r1({l+SpB$QunziVpF4#YU@5==rT{vyrkSl#*&Thd6hiI^CZe_8<5*8j)qPx0r}BhMXfuna0q ztv+jXVw>{53j-F;M$^%x$nRJMn`IfCF7mIsSJU&e?6g%M6iM4H#5TnjSCU$;HZJ87 z+dkP~UHtHjSol2BDO3{nh=j}w(NuB*GbU{A7Jw{qtMnm3&@tEy!kRT&9uV|~xUwb= zuCr$j5Od=8tO%9Rc=fjDn2fS2yGigrt%1k7b9!O$Zf*XuIsY7{)Cf2^@$&=Vq{sWo zz}5{Ugh2*u@4leDR(YDBMv~%AcOFGrVdFG>I|*(teY@3oQeDvsrvAyp)%X?Tqh{xo zP1==JF@UTfb?&Wgx&R-;NLy;%L$e({^hlmSC83GPB6vZI< zqF?c(`f){OKGCbe##Bpi4L3uIo?4pcM<19RSu*;*s{5A+jjh=m7kk4tj}Iv(=;0-3 z^BrciA?jidDiG{oNcb3TlGO6z-f(&8$13DVZa8j;OZey}O&jv(pdldkyY7FC8OLp! z$X=2`1RoO39InQ)hda{Mu#;?IjHi)mPPoSYQgG-+Cp4ewb6jtoB*5&C)E97h96SxC zd{af@4C8eugr*ggh{On=tDqzWi*4(cww9!Bf_%;Ho4TmgYeaT-386dX*?HDOe}iB>phJ#e$N^h>{qmV)BWYO{5z zSD}=NmXyDBJ+9F5g6Y=pGH0@Cw7P|OmZqemE|-NQ$L9DmqM&f{6i1b%z$-Rw4`}nG z=hRYR)?g}G8Zp*_q;K;i9Vmu0y+0^#L1Q?~N0%Q52w6#!%N?Nf?x&7n2Fd31a8o`b z4{kU0-KK%}lX)9VfzJnoLb@b-%CjrD#q8|&2OJ%T>w+2hXZ$j8yv`RVEZ9Tt>#j;u z#LLGh3`(FZ^&n9((q7A+xHC z9|G?<95LPPBOqECTY+TZo&Wy;BthH04PIugDrWuc!1fh(J7}RNgbylowWQ1h!ik5E z>#M{h3PT~xsZpqH$cjrV9!+OY&-1~tMy(95e*`qnyn!XS*u1&$rP={cHGHW{pC4%H z(^@a)n165Qnbb36HbM+8?Vwinpo;cm#b%7>m*II8S~(hiVgg|m93=98RT$ps+ftG-U)K>yluSGbSB9R^mzGLS4lJm=rNAT!Tju*j)yH@1~z1JLu#3wo!()lLH^*UmOwnKdKvOd_b*bo-L}=XRt*Dd+B3QtqUn` zY){dtS0AWd_pGUEVX#`8Bro0NZpi_=CDr>QL5pvDX^#y22#TzGf?HeG_Si(G`$2v* z#6(?$$t@DloJEdJUwm4*S3+iVaN4P0V`zx@#x$pC1YJOSJ5AV_iat(L4`FBu;4#~8 z0*0Z_dp_@_<1kNW60kP@gK_@P33sArccE+OL#C*mn*4W_VQhG8CW7Yez1?nz?0rz) zC`j=tFV zs&9jhul-}#_&WAt<4XhMD+H=KwFFcjn@qd}(Eo!>MUfZ;+li>j8oRuYGy}C22d)-p zp^Oy;X#mK=S^NLz#Wa64{F{W7?#8}(X0}q=N+aWZlS%ojT2O#arRZWG6IuHk^1RI^ zkB##vUFs<*p%Tw`BXshdF2QH27LVKnT{=`1ql~Zw!0`6fAo7&<=-_%K6go6coJZQy zpoSG{)mA6Y>%ad4Ti|^&_Wlo-y4Fz>#Nwi*(`Rte66~c<(Gq#5hxH{(5pE-GrWoMKlQSm(L74z*rg)~FprrC6w&OcUVis>@H z&zE^I$ZyEn(DPnDC)S@BZ4qFo;0z95v1;&%!kTV5oM<>HRG= zw6~tSPL} zXk<;loUMvDgeTdz!k^`=n)0n4`=sbU`ni0p3n_IeykPx%`V4yg`!lWnnpidVQ$C}!rGU~TWZ3J%_RjhH`0gDgWH2o*f{;nzvjj*lyDgv*@d1BQ?glZ}5J_>mM zUSE~Vi4ShXqvFifY?96vtGmf#wlu@=*VBT3E9v(Kscq?oCe5~vI+F716D;^pJ-G!DD zZ@YO}@5|$HFE~Q~@wmeCM2MZ#s(3$kkHn?hiO>l~Y6JndsuGMK0Eb z^_^I`w(fbcs(5{+nsEl@1$Li^R4{q=w5m|r1UFH)@KfXh8{l{NCQQ5#km)je@*trJ zG}yGjVazxZ`wQYb_ch@!7BPClU!9*Crno0Y4L(b^(i)UVB18}B=pYhQA#}Y%#|u5- zTIs385peCoj*jrc*oy%3Sjiy*;0v6vsCvPM>JwJd7?Fx-@!|iMPatvRGuG44Sa$U& zRbNI@0(C0PP;rMW<3(c{H*V;Qfz0~rf+IB7U#=$t?Cvi!wO0Ziz`GkuawA7TGEJIm zuZzY08mg%e3>u5xNj#|8Wrp5SGDqGnibAsBY*DfTDRKR( z*b8yo!1YM~sp>H51X(jzq_0$#slIv$T6d+PF{EcTl9A?6Bs^RaztJN`O0Rk)F-(H` zC?$@B53FKi?XCPWOM3@Sh^p~3KznP}nqaCSARw-!6^4KtB~D^x`zuh2JZzg=ZP(bYP1Frj7^3%Ln0nwIH!~6` z-xt$A9`nLfRd2YaC(h41j${*5&z-S)-a}UH`=N+Hy`Y-sKVIbe8fgm!3>itbA@Y+1 zm|)*)7l}j&Y1beveit!jwo+|eq^n%=elanv*+`4!?NJax<6UN$6&KisYT3?C9cgo# zxnT;nUAh6jI1<=p5QdsAK@1#DzoS6{;l<&2OXK^+jseO#v;o7h7-69U94~IW68)cS z^7rEYp4BM$Wq=y>B0JS+=t3iOyJ|E{glglyO=|QodKj%p(SSG_Rq8`+QOi}SWSP0- zdRC?2mjS9Y^et7T;DHRgsx*lmR;8-wVYDhm1L9~@X*|x1ac`V+qLGCaE8t~-Voijl ziWNKtVn?yMZWut6o2`oV5-c%V%@Tv;eBdyFnQrsL8<>fer>Mk(q#?LGJdQWSaQG%5)-)zy`j z3~ppvV}A7pHYPWtz^z0Lj4b6nU$qZXeR9*~WW44uTygx#ieu-P4s9$|9FU!Y=ddkN za=N>EBT`O$TmUr)y)n4jfKM?+cQSXQTO=*8l`A%@;+xt04!=2#vHyZ&HlA=ra8ode z)R;{~jNY?V?@0mnNNoYr&Z-gkR%GeZVOFzy9`|whb&i3g4XPd5e{ofy z|BZ~85FcwxitawFXY=yg*~M+;9Ra#D)PPCm;H|5UVfFBww)p{s|45g|*_t7lC|i6A zjyc{Z?Y~zOUFrtvbADB* z3!MP5f5L{k%lsi-Wgl}|%DSk)6cuTK7hd=%_Cp0_V-DP;>BlUc&sI`>W)Iu{b*X|- zGiy{#8YS2DjPi9O57!gdcxeNTha}L-yR}Fwj;eH;W2eYxVljHh3d)mr>nPAUp?oO znN-D3(&NsTE5#}TA2OluNDAr4=7wH|nbuMC>d%WMz%aZqPEYiMQ1X8WJE5v6xnCD` z8-r@iyob*!ewY>6^7HGR+|7#e%}xCeHXTkML2f#HzkDFAFLC416qiWSkd~JWM;dfA zsySvun&0Z_=4^E0KcRwjFM#syUi!@UV?ZYpar#WaQg?fi19S6dirF68^qCtgc`fRg z@MRcCJA_6RRmagaPHEpcmCfgiNhVESRqM-z^y%$L+Utkk?e;Hj)*DoHc;B!EcKitP z8m}|Y!W5NASCSfgPU54&FbyPLK~BsqPOXRx)fzuj-49Jr^36(X5;y zz?Zq5C}*fUz}}qL9b2&uhYpS(L7v_I{hwJmfvoB~a^hZ|5`E&wZ2m&xk)+H2fYkCF zJFYW~Aq)~L^TA%=CRh#{N zZWI<0L^_$Z^rv(~ROrOv!-w}Yxe?Rlb92q9f=#_fms4+VxBe5|QLlR1a5gq!=F@jP z+%TR7x_WxHi13jjW$7T@ua=!&1JZXWS{GN%iu;BBW`92%?fSUTNAu+H^anFJi2#AfV<*14zbL!M z(E29d6PQg!MB*$UeQG-R3LV4#_q50*2|i@YqCofw~8&w#nWtpf!i3OcJxBq zr~GNL{G2Y9k{szWpJ$(P^co*B+g#~Bs8<_pQK*VYt)I{dj}C=U$z(+eQ8X7Hqfj>a z?|QbRq!2F8qDCR~xVoE@QkGZEoOBfO2A~iyG=KPz<2+PRiI765Rl154qS#V+j6$pY zzv%?O)viOKzyzzdij_1rZI>D*8LfkdH~a)MjRtQkC6IbPy==6b1ARoNSr3aih*p`dXqhI@j*;Y;|)4VQ)I-sek$Y~YPcmAd*BUf98Oj_#M*Fj?D>X= zlV?R~lu-w&#naHJBabG#v7JU;C3zT?Sk=f!b_~QXDboJ=*^05BM2yO336|dWmUMaJj7g$DFp(^sqV67`tv$3Ci!l2ne*mG z03Hku$Po{S0+gvxxod4~krNq4Q*E%O>agy9FKkFq{ku?1%Dvh8E~tG8H;Rf5LIG7( zcL9z-8!a(7^5({UbK||a@flE{=P;n0dyNWEl)np6?x*uzkgHh{--Tiw$j#PwLHX7< znD0U~fwS{nQ1xavhAS;##sROiSYtuYVU2a}#Tx5|HP*p%2sM_$DDOd)=FwfH`8=PL zVpTR9N}sdY@~$Z_Y9msUPoIRiz5S4_W|Op;S$H>j%$9GOH&j2i6Qk;1f7kwgv+A_| z?aj;Y=?=UB?N4RRQ=e08hc%6Q+!l*FboK&B+$+cRB65A36&bV$^eAV)o90D1D?i`S;|{Yo?3`jZ zcSiLr?3EJ%Z7AN&ym~I6_q8izY5MPX?|=LTa44@3U_jd;pa4{k9wgux_%ML((AXto z6hLZ3J7lb6xuu}lBn%UzaS{WDh#YXA%BK42CQUzP>3p^-(=vP5{x7o$ES*dofnCV> zxLqDKop#`K;-0>)=&w#bgvFysLrRNBI8s+5DJXrvKv7x0i1?HFx~8He*yh>U&?RY+ zmQRrS;jI;2kjrqbB1Ey6P9&y$N>@3cAMnV5l+7KK4Wf#9Nt(>}HkqGh1u2;!;Cc8o z4aiK?(y>M8|8G%XTc37F9YJDbN6ss^Ok31xs?;Vaf!LdDgr2RYAkY8skzGoIVvUE7 z8=lh8fXv}jwkZAZR7x_Dk~*YxTcqbAXN-p+PtI$NN zuo15+)2 z)N7l86Mhtn7}q&{btfxLABuHVUS3t1OXjNj0HoSZ^Z%~1`KqG$-KI|H|N8$grj~#A zv###m!5~DVet^v&w!bJuV3%#3IL5^W4DJjNA`nW|O&DyHp9wZaj-N(1NxgUcAy9^O zPfOeEqN)mgTs6=Zkah3p?nu`S0cKtuEJ5C;o?!WX^&m*W(hmY_N23T4L5ElFO|J|* zQ1+2r@B_s-6jb7GZ);l>IMVX8#Y7A=1Av6$yvhq0Q=kLpHFIB`H!u#dBJF7%;>blt zrKBk&03&UCfCRZBruG*%mF?Yvi!z^-Ib?w0;ZwJYU?%IOH0@~HIw;Fv+Ibb2^R8C~vxO?f zV)>M9IJZWQZ_bY4H8sCGf?}9=?UN!ka0vKUhfM+-D!pA4WhQZzmQ2!;i9>@d!MF2F z0yC9fO|Vn=d_PEBP{NU3!IH#rl|i$IAlg*`d`z*6B*gahNH!KATek-`R&3CsVq@ae z88h+r>l_oiRn0Y)iQ`1M27!o)De}DtCZ5jjTQDZgw=pwszs@qVmte>HHctP5%w%|v zkL$xH#dFL={lzg8{Gc<90w!(0JBLkf>12!5Pc+&`J`4mtk}fLVo?mlb__uo!_81uO0!CPAKE|bS2qgjvs>3 zj8bU>8K}^M+MST^4UnXHT9-K_AaMA|4rOqA>vb7EFDWCj=4poCUC|+pYe>8*FV;_6 z_08`WlfTpF#e6n_%ple${-iia?MF!mDj4@1fo&CPQ~~)DHGM*z=csv<7#$`2#0BpK zI&mK1G#Va9bLcwt_KobrYJPh=Sx(a0+b%NsUvHO_w~OWU_iCf!?d`A2{C@UH{?63! z{0JI0=%?055f}LI{1pSwv~3%n>mqmXNdgA2q`Gl~Yhc)L?fEwSAr}qmD2_WP4s>`f zdQE#HEV{B9YFv&EBkAQ6LYmGJiaarFmwn#@bD;cj#n~mA20?OrA?dfMezqy3ZBkb_An$JOs$+*!JP(B}Ef(3K?%_ZC(gX?0A9drQ)=epM% zav3xB7=ks#(=~+W2Z0w`9I8o>lU%D%4Xg^@yb&8$K&LAX?9dErM>PJ!^WbgDtg??@ z_6_T7*4Zz|mD^67i>nneT4#IM&2+4@Y2ay8N*ji@qte=;()4mv5l9?H;HASS&f_AG z3s1Rz5y+V;vm;owkSZ>JV zCUn5f>&E8rdQup5==nPH$ZQad5k$_YQ-FpI_9Bj&h1hB6Rn#mQw7;tV1mLjPcE!}7 zIUqi!q+#fxMys%yu*G5TXVPLW7Snuag{_egYA#te*coo<#ZF?ep%GwX2yAHRj*g?U zRJ73}qcU~iBt<@rA>JiFxB?;_%0O(!=R{zwd#wjjBA>Ny8T%dz6-^jNbvXLmG31 z!yq$@bkB?zxnTFOU)-+iFV0POXY@W#Yew(-oDD?v!&!{sx`>Fy7_Kz26~RAWx{jCl zP|b1TJZ^!!@RaMfKt3!M5A*!?w%Rtj_^`gez5TQJyIA~F{Ck$qr)DXpQN`NNB`R=FhZFJmk!_ z%Jd2bo&VB%>)-_}am7YJ{QyRjW{bqfX6U50^qgUNx$m~V3wZge%|^`4hmNhdIY93{ zk=!hlH@X_pa(4kY570ozJbmccil-y+gcf6qzb*pWI<F2bQ{vK0AUnfnpHRU*R z19b83;JM*$Y9J7?Nn0^VQ>?z@f(>bcG~ue;h`6!_bYR1xf6AXeU^2rb!t`Y}ndGZB zC0xOj1TINSq;=O_^ZrvhSudr73W+5jK6G(^zsk#(>^1hZ9SjL^+fA;wIv$~&nwb8G zb(CsYKqJ+*akAdE50%!{BH(o$^yP+3Zx=_} zd0g>-;VA=D{4bv;x3|CN%a8f8l`m5RE+fcl_fY09yg0IVZL%L>CyPidbYX?|=9T#$ z#DJ^U_M?$#Og37SAU*t+_lM>jOcB2p=2r}#GQV3Y>P1d6=yrzw3!jhh!F4M`89-i+ zt@svRwzAK+V%R-A{g*f&;oBkVnwfiFj;*-Y1v|aw7Be3O&x7+)`}5cgVbKxzdDPRd zrN9LCPQUhJAGw^ia`Hk@uGYZfWeS+NX5sR+VR1}F%W;ztIJlMw2(o;Z(##uuJ) z{h;w>vd3ZM%g!((jO@Ec6{FEw7(vw=hP5z~c-S!Vb(TP%M}+}4JJUkdh#c*}QS1A| z848gQ(7`At&SOL2!czt^6rQu$i#6X&eXIg&jqJU-+5J7+4HutbhTRY*VPvn};KKbd zW8;{L!hUuO!!Y=v0kknJ^%O0Q5`6!W!I%^yGlPev;ebf@7U4eOKT33 zy}4ta+EiMUJLbloN7NK~!|s^&?%2AR{db+G&*h6q=AWMPu-2O!8;> z{bzqY z)FEJ8f5KJe>#AkrEMe_sJxZ95+!Rzxm^bKb+}=AWt}0;zv}drKwU_lMXCZiUi`lu- z>nWs7bp9Hj$?|A@7?L_=>qgZW6nkTkYUTXfG00(;6<#T2J624+b{2T7bkrQodo!*= z2fT`qhnlOuc&K^f_C_JDEmf1D=2wEJozZrh+PK=J>v_U@_fT5Fvtq)!n*>G`r;|=t z55fdl*bs^^hK-mqWWxIB;rM9TSmjc3n~p5=QVgg<%; z+6o#;h%5rCKqFM{pVxRQ|L9r%YAXUpPf1I`BNP$RQEB6!EWBWrGragT6ft;i3x~bc zUmW&sqi->Xy)OrvLu*|$RjVBPR=a$2&NX7+Na^F)_k}NGW8a}0A^lO`54}-t7qtWP z#}fcINO_LQC-q$Xnn`bz8(8h&`>}+=89q*2)*pNX*opNOe2j8StsQ(nwxBq}$cfAP zgOMmex-o5tl*QQ2@OTs`P2Rx7nO!gOcufS48*63i?R+MG>PXhVvr33R*T1=!I_`4u zJbRSM@!k>i1okkR%u8HX7!<^$Z3_$&>|_E-z#tiP@0Av#$p!!+9mkkyj>Tg#+!Oe$ zgFVB&l78!D$Mo@Nk`usTWj#u6jGQ)GOK!sB+y;?cO-H}6{O(-VoBT$O15TZedQ99v3iRT!Jy*X!#)ON$ zI)|m3M@~Je&Wl4Yv^FLkIRZQG-Ah7eP`^lzQFV;#JNKvA2t0m12)#R^(Rz{NgD3DS z76K5~-dveG6iRfie2496+GBuG^$R*#eC2ik$McQv5i2@=CCe6t`(%#QPTCF^IRQAP z!fo>EFK&}>LD;vZP5#Pgrdk)RdCW?ia!hW&?;c7k)jF6~y|>?cZsNPv+8Y8pL(=t~ zFj7vz8s2`-y5x$L9sGcdPEcu*v=-Q+lM3*{q34YZH71rjY{CF7d&c4pVoiC8> z4Heu4Lr+H;YPX9%GT?T;q zYxhO)Goe+#W9o&7L-4*O^gziVhJWgb^ElFQ;VIXTG*mIXG+REf`+ngWCb;iXej|Zy z#xT|xj1_9{cXFjc;tV`UsP7?;9l^i$;6z2tA;Aj|RPfWAR*#(!o!5$K@>&W^f|(Gg z`T$7NHx4BtzVaNMKtw)pd^4AU=F?a>;MqCGX7Y9bv5wEZ{%-92HiAF^aY{(|B8d`v zcR9oYp2gn_0|-aCL&S`n&`Hp^VjhGHyharJkA)BJaq4#t(#sRsDKa%Pima0s=)$(^ zI0C&#eDHqnPB=ProFq0#50Q3e#{#}lkSD>YzjzW%>s-5|m<02pT5b+CH<+n+c;?CB zLuvU}2OZe^%oDpcs|z0!y1(*U-NDm%=E|(^kod0O>j92U#Sb9S^31Vl9eMDX;QQf|8T5icxQDS zc}m55n7D%*da+C78dc|Uz4L{q4AfbjzMrkiPO}0xLXRVX+CwFE=(!$NiVaSoCSX|H zO`%F?^#-l-xy~x(z9HrMi;;B#$uU`&)sW(=+c&WXwyI8?$M(&IrwnA@oEi7@d%pab zFGf@9 zrc|(2awBxNsFYk6WP2IcEvhNc4$`@*DJ`s(-`JimT1{DRd*YsM_s5uU(O2iNbo0om zhu?-#U{o1AbxbTy{N= zg+QIQ1Hw@_hOrPDqM7RUP0eFg+LUARu#E1Zv{J2uY1RL*4BrXSbG3}MH#}@-s~aY9 zq&!ku<6#*Zg0w-pD0b z+n~o|E8GPMvb~{#JJ=8$Lx%8Z$fyR%)73^3Y54sOdQ7&$UhJR;Hr1hch8=xw^Tzx! zR!J`Xw1VUJGM317j9(2VFZP?JgV1S^!4L+~=jzBCg6#3WoQrA?4>E+@0tSoQF>%Apl2GLmN<+Wd)r3_D zKCHRa%wZBnap<+DOc+EQJ0nd}(BVA?drjb(!XP49EAat1eQx%M3xjxay9f7@8$W+1*Bx775V1MTe(5>=&9g{CC$Krj z9%4(?lQ4`2o%464c@_rYN^c;3?HLtJbM2Kxe^z1wo*c|gyXr4)+HE2UK{Se8?zAX$ zsE&;g;tVZX;V#+kp|oOTMVD+6g|Tap??Krm>pCJqmiL4r5`%Y9^wuS74tQUyE!7-~ zXs(KSv)Nq_8BM4}+E=dF)4dPW90tBl-nkMo8nkjnG*ySY|iRRg4gDnDwITIn0VWZ6`jIaF}%uPmcBsbF7tPt=&UuWr<_0 z7rxAmwMHS*kMkVi#zO~Y^pCY(2f>XCxaz0a#^lSz0y&PV5^nXKMAk%IuO-|@g$ODN$RI3>c%LHf`bg8f4dStgjUXH=!CGky1}3iQ3D1k6 zwYDeD<5^}Go^t(JW*--`={Kf^07uZgL_Z@;3a{&91iF=8JD#O^7vH~r_AM-aCwZbO_5yg4q7$Ud;TBDj}8l z#n?&$Ffi9iJit}V)guU)P!}#ZuHyw3hf87yJXmW#T;dK|OxJ($LhsOY#WD!3V0KIe z6|n~{1L6^N>MtHqS64EJzK2VoYBHkka)8+>FBpHCi-*c}52fXP9qJ+a9xCU>Q51Lv znYgr7772DsyO#(Nj&Xsc#q5DMTg$p52x5@8AqYQC>|K!H zD(v^(4`Bp@c4uF`4FQWk!!;dT6FEoJV&F#bNu%6ip#I_(gJxK|kDMo@XN$o;uAI*B zk0*)54F%mpX?b0TB7?pg3VbK>rM+g3u}WLI5GBY;G+#JztUP7KoQ47tguQz8pD+Rvxppj zofQ#jTcL|ZsvwCOENXa3zbBRbmBLX}59yLhe$)MYogDTZ-#Rqkw`MQ+=0*6gU%)S1 z;X;=cpE!>T_%A$VxB~w9qIg)Yi(*zh+}{53T;aTNfIOxEo*DU7}^x=OX8xVq^^K9vm0Bqf8x;& zP_aL>z-t$>L2tjUN}B^`&P5xD(azxemUJ!xnIk*~M{l(Szbrv=7oKaQd9|n~pDf)4xgSZaAdnhfJ>rgAu zdmX;;yx1hul(qsP#I8H_rD2~a2ObTm!>7U4D^}oNUm1)k&=bK&?CuN1;EgGLR&P=X z#FeVTX$T0aKAT_*>8$5$Rf&pLaxH!otZ1kaf8tS=(pfsS!IaUR#zUwF#(>+0+O ze9mUey9$yU%x)oj^_VU5Y5H95bwqu1Q%_XwP!Io;P5#b{sRZsDv%q^)DegXM@FO=s zZ&Ecj$?bbSxQNl%5*bnmc+C;l*QdXIkRO`o(sZ2W`eBW>;K;z%OYM#?V%K#oMzs*x z!Xec{=nh($-GAwhnQ(Z;Iw3O&q&fWd7Txm_@H}p``{)M=xD@KddDgj)vxh=5_lI>A zL{|k$`Phvs=-Mj1supKv50Ko!;Y0f>y{fnzIidS{l~;#-f-awR(6)i%>TN4$7J zo5-iJoD~mu6N$Uub%FTA+l-9}grII6D=cT>c_OrT9K9c6D=At{Y?SaK5@tXV>M3Iu z!khQB(ceC(?1lCBg{O5BWkDjma0CkcNk07beFp;`md_LEBh}(u^<2KVPP@N1RY7|o zAhkk4yCRGndsp82F}Aj=RTo+bCqe-OMWiPM9Q)vaBP(F_mvIU>P9j`5UQ-3k9yBZH z`Z)HW>r)dqs2W?a3c6A!MhUO!9(3S@O3T`D*@Msvp~l>a^Ei8O@j0A5*gLep>_O;7 zru1#Y1CZ4hO=rb4|Fo61T^FrMKaeksObfNl&kS9SW4Wi|awFzEw=C(bw$ElOTO>iyw zdPFbVI9*2G^85!$VG{;dA5##9k;6@KY}kNLG0U)#T<+q=%8kgd`6(~6X;x-t8aKk> zsZ7mrTh@&qhW3`#gmHwPCs1o&%>@=yJOdP)o=luL0+(@Xqo%nbr#+Ns8J`pT?liWO z!_|yb!92LQJ+8yLfoE~{Bytk;Vu4yU3@3=D4=I+9Kq-O6S&_~)96UI8y@gf@XGOa2 zc)xgfkg#c{;lhcL_PDLkffFIw+i26pbCrVbUDKu3y?TqQ>A4a4n85ifZB#S|4%$O` zk_W_J=}ho3Qrq$rkLI}U*x%RSBcv8% z>u6!@MA7xzLL%2qI03@O4)hemj2+h#<4u4dW*q%4|F&NJ(#~gYFR0hS)YBl}&S!a1 zN|Y<}Po>ctoMNuIY>w+p{O}Vmwzr`qN)mKKNv*O+Ddm_#O`xpxV@<`5bNybF$V)tE zfbhh5Y)xH!4qH=uhxTVpd5J%U8rS}C_T|s>Me(p)7saf2sAe_g%dGNN%{8N3E}U(T z>zYxq5P`L3RP4Iw&XrnMk4wA}_7hadda|Ef_v#BS!zhRZPl;vw33`fQ_EQkKqn{G1 z0 zrE-c{))#LsItj7n+D_aW)g0HcodV$o_Le`zA$-&Pp6ygAVuNJY`0Ye-7%P?7bKI$O z4O>3vuD8+h;kc8!=gC2(%U=cAcbedEM=Y?NMn z4jZL=hxTTaN-mFaAqu06(qHAnm`ZJ)XHUP?+oI&k{a!V@+O|*ji%pdVyo_fX6ri=F_fi@_t;*vvM{EAT`?R{p;l; zX$;>4T5!K__9lQ>tD;wNGXS9}-HXHlcC8={(U$XR%uqrjQ~`=E$00QXbld){xe&lE z8>2H002bB}F=#%1oBx4_c2v1M5^%Ay4p$X4wEiYi-?ZAhJIDYzszXh21LQ?fZJz}@ z;h|?6*1kKN`Q%w@AQ!dD~H-KKgdU!!bO3p*^k}jtQ~zUQG_iBwnD@UDh@1YE{qZKxDmXF|;A^ zLZxO>w%$6|u=RHCdbZwFUL&#I4mS>M(01$Z71F-GXCIkQzL$+Q*vkl`Ewp&lLlVSF zO=(+3TczO{6vkky1<)!&ysZ{FULbhcJKJi|Q;f3JDlYfNyX<`rmcL(pE+&5#+4A#m z&y#;2tSLQ^!gwoTyv$#c7^hLV+aGSGH5P$F9ky6wiDz$jV-gGWE}B}0+adNCdkZLh zJ=t3^*z#d}Yxf$qx6WP9_Lj=a0(g#ye-eP-8=@hoNF1W@l;Qb+==WK5szR(tXD?z60jkdSk5WAnJ(cyN8z4`W* z8(n>258GR8Zz-L^_SOa0m<7D=o}L%W@`tR<*w*S^Xo;;AdjcmSM%!9`f?eX%=v2i%L|B&e)>b!_T)>5yt#D*gh{8Z54^Vnj#_#C#F_73eY_7p}wE^A?w#Z>#Hzvbof^ZUi(`Q6j={4OgN#kbAT z-)@ypq!Krad{Vik=}f-!Uz5qVLIjs=_&75s=g@^|bzOVEzjpsn-|er9`D|irgv<4L z3wCo{$3}~sII(smpeI7LrM_D>T4fe6k|-hx!YYKyb5B-bD6T&vLL`37aWu9Hp{E#T z6()hhakNYP?em-D%nhx1umqAFW?SGnj=eSXA_BIr?HFydSC1f!b|{+nWVFZL z^&4Pa;l)tSI&mHw?H8ZJM*H5Oy&3J2%aKbBjWXKN0hq+UBmi?}1gCwWT+qyVJA8sj zL`ZkpWS_uwe0;jSG7A_RR}!AD66pIavzsww8|=U zBkvL{KQk!QI;+s*NO5yq*D7@V$l4|Io(mnevcInZlHK1&k)x4SptXb!l0qz{^HlZG zWfQfr#rQmctqnxUo@{OCWSpxB=Euc6D`#^^HU%r2f4zJpm3RgNl%#N>GW#(Krx@kO z*jA|AODgfT&Gx6f%%)kHnOmE}CB-ktb!$`nz~Y@HE_76kn)*0Um6CptIvk=pI-0}t z088nRnuCOezsx3+eAU_r&y6f2*?3zO&9J9Y>Y%Q8d2Wc3E(OuLT&|AT*;4UrSoE$M zy#T2!+AmhRa#<1p2J2Ro>}dX~Uva4$NK zd3-spo9_#f#A2T!ag@hHEe60yWT=uivz+ipV{}s zB|h_sy_*~mK6#-X##`h&uD$agJ)x$~w~V*SBw!S=G4dwa=jvl*IP%8UpwcNuS%VyT zBXGjIsLhc#=*s}(Er|Tc-YJlt=R+USp7B;|a2tf)_{f`l+R*kweB>=~U6(iivaJO@ z#VA{=;&N|Hn}3(jliS<3^I2Y$5`xP76J(C9MmCQh^OU>hxDB%k-xKnG_8L7wh~CLt ztI}&qAHw*6%0N%XM*t4F;EfN*3q-`m2OA&2Q_M0xB$s=*>Jhz+4|<=kF0h_FE*Hh( z_O_fo<>~W69=QGc^e^}JcJ+Bx=1-|SXY%)(o2|c3*G+$3U7Owht^UoOn7_FZ&dY0F zdy6*)2Z|!tc6A$!ro<1i;}?y#nW6+;Ute1Q3>xP_0~2Thif%u)o-abE)zx|06{T*b zi}eS{0I@A1DAM3vQ7&i2YBnLGgDaqOiFfHx{X>lkip}3W5CJ+savwTsLMlPWD-mxH zQly$|lZ>yqJhJl|-TDgrarh8iChi@74S==1&2CDSzxm4vFIA4Z-OsYonO;7vli zE6~CSXV28e!0Y<4nx2`oFDmN3xsh+l8%yAutBUHci`r-+Br}pxMHKf)=KE~E8V8*d zEITJIt_bf4owroan;U069|yU?Y<)l*Poz6yxFYf#^em^Em`a?tMM&c{k|)4E_J$Po z90K9SH!n0X-FNZ?IA73#r18j?i*Th^kBg;hd9XGF0MEoeAQi?7gAdm38zNLvAi~sm zMhFn_Skb_9RcWADDc=VTkXs`}665A3wzF!AMUk)8lSi|yI1gJ1;0j04hdxZs#)kRg zszm+m;we0r5ERLuuJ8e4l=nt7Rbrl&%WPJz?y8@^d-;|80E4L-q1iN4X45lNHJ)Q5 zG{^Q#Tf-qXWPM|lWKGa!+qUg#+wN&&+MKp++n%;<+qP}nw!639Z+Cy}*EW0 zPTZ`_jEE2Vv^WkzDTxun)J6x>EZ27^sB5;L#pD7C65#!d_gl${~{%T>#I z>n<>B{x8YLuy-y3h;xEaS^!_zh@XA^6!wYA)v)a3r*O@yJJsmOU~M;hFA6-Co8X_^ z(Vnz;xP?deHm15Nyq7V)LsWUlg)!l#lneMBM_Oiked*pm7#+PPTYj2$UUYEyV{yc> zSewGtq=qp<92q`B*cktJxhxCR%hE~`!kp!50w{d0=$6pkvkd%aI8+%TGoxe$Kh>?o zej7$&5k@T+&qErTNudp@_AYy1C?cne=#1lpH6?c2b&^KwSm{hMdoOLz%=IlVN#>V) zk=uLwy1&LlPD#}cPM!-GeZ&E7udIAfa*Z$cBKI`;-hh?w%;}l&m)dD|Jze<#j8Y7q zx{W)0=|bX|9LsKz$TNW?g1veyUMc8U-V~Ae^xD5quB^)W6J!3d5-zqmKGxg|Aty8B zjt3&5{46I;6ibZbWTkjuFpI{ZHHMVlvLLx$5!n z6{dv8!+)f*O-`Q(_CCN|Bt~yW{c#ks2Q_bIzx3PG1!e?wHbY}CQ8vUf=siS%dmkWT zG8?9jy>X(yIi0BIa##5JU&0u2nS8_%7X9xJ_xv!{JnM}yKTL)ppm z-Vx>~FOHaXynWt*aNr$Y59z1wiVFy&lE|PI^4!G$QSe^ZfyaFk_u^zssR&a!7-H+X z^9YUdr?>W+3Rz?j4I)q9%&v11Q7-X}lL$+mckzOrCWwS3;C+$-j9U^125i4f2_M$o zh>JKYN1kupHUDLjea=U-9wTbVlVP^|xAhN|LJvKR<-bCeO%r2xWl+gw=4L&gkI?(H zYpbXS`v93>#tjpAu$k~dK;9a+H<>2^RVzy`2>P#Vh5ur*nuVBJv}iK@`^8FLNg1`| zLaTqQKgZ`d#H4NB-u#&dxl1hj5pW$q7IU5V%jK4}Aj!`#*sNK>@_x3iL5>7#IG)d5 z*Z!{<>9MN7J=Vr5_{NaP%P6{ao#tqsV}lvHtNHz4ouP_Wb>AOCmUYEYx}Er_Rq9?w zHZe-h2*(rL%0>+b6g#Hx>O&|>C&8~wCwZMZwsMTsS;F1CUml%@i1?Xd+wP}(jM=g0 z>^;9Ht9N-?a`Pp zj~0xaJ|B;5T!K*E4)J`%60qaNUe6UY@(O&A{nm7~Gfll-`z1$p5!SV|jpssQf(wRq zIQOfhe);nfmB9{5wNrV{PYB>#mAZJE)4JROM`%^M=q-SJNFe65)3=)<~Jzv`C8C z!r@i^3Q&k$=bI_U=&%WIW6xATT$4GD9NT%0XtS%eZwJn4KW8sur8AXp8$!hArIg0B zQqxIV7;l?;rLRT(3{7-evY$3@fA35;dT?(qcZtxVy(gH@d@x*MkG)PW2cX)I{iIdh zo1A$*K@O;?g7=FnvfC+Rsyb6^d6$J6v)e*tpdW2r3_nCX>}eihSZ$?GlG103$a`9Vy+3h zRjJFK$(cA>vDi78F?h<9H+gCBl6vVvDI6dc{ig@^D$<-TJFn7Y^FjQ@Iq`$thY+93 z{LfDL2_;q57h44$QyB9C|7Ea}LJ4i6RFRN+*(59f^y+HFs(X5*UYg6UPidzH3aU6^ z84ZISi(+?*cuOykY{BbUh;1DR_Sbo{#YxXaa5t_?c`xxXqt5aL?E|GEj#A95(1QA& z!QyA;*<}HjKiB#lmp^WPq_JhKa@079zamqc%_3+?%wYR15XK%VD6+rG#@YgV?MAV< zdIwv{Q!{gn-{gv_-Ge@mycrWQ{q1e=9-A3L{yxc&J6;H%g9Z6XA8bE#4)(9M?ZnIz zwK#HBhbi+eYAz6FU7ay(2=_%zdSQ;vBFHAkjxPglM3h{|HAro!=a z5_1NjmzL$=8fwqF>=t9)nNrOmFngq`oDlo60Mt9)iJtJ}S?v!FGgM@tN(*sgTp z5{&Es3@Vi1M=EYC7x@8rFQ*>o0bZ>23|lLTU3Bh^%^jy)$%&40Ck2;gL9Ak}{<6>1 z>ih6v>XP+H0+De^#r9kZHtY4WYZP{xt4ETK;X|UZ2RZ-Hza**!R6{JirKl{;jo1QgT7$|W%>wGN%YSRyuznrMV zjmXK{n*b!_Xv|!wbZf_#q@dYrBf7{ z{23Ur4&^QsH#I9Qc*a+RvO!W23^X|D0_QS-yo`J~l%~uzF!}nd^;LcIZF(A5kDB4s zu7ixL9=9rUy>%tBSl}^21i;0VG*w8zt4m%EVh^k3zKj#hs}vDCEkB7MXKXViaMr6& zdl0!ZhLmG?Kwc3#5CPLk@d8qlf{I_JX_9@Y>bdCZpr!Q9{f#(F^y{gLMPA`N774y^bh~#N8zeRquQR=o2rfU%P~6hF zEY3_{LXVqsPmRl1iu3$t&ow_VOTZl-Oq4@mLZRfzknSpGD3eWB-(u~t3U!6VvdhET zF1qq80|PTQZp}NtY#On8^Ys>=6ICiAD2vA61~Yu1@fOI0&10XQ*Rawu)x=%P?$;3Sg1_)y??{Imal06aVhCpW1GLgr!j2`w~qa%~G z3zt$ENE#I<`eCP06Nwtwxp(NI)szT16Kyp6^3;*>p&RqSFEaB#p|y&{m{_{QoLFi) zw9pbfEhPO-l`VxuGX)wSL=P{RK=CM&jO9al(NG4jmg<(7O-CQSl?Ln=!&XjBHX>m_$^Sii^Jj& z(Co(KP&*V!=Ry<0HQQQNTBo=`z+)dp>Y!~z4Q9|K%~yE1bF=+Z`o8GBgzb9cBU#h_ zUORFExiiv*=o618zjl99G4*zVIK=yiF_WH8rE)JNTR^urdKWjk>(9M{h*~cUxiA)H zB&q!@Mn$2E=B+WmDSa4p%BS2EAVLE@fXxV&a)FOFG-i-4&;M7~P_Y8)GqEeZP~FIK z%$(C!3{b9=i0NEopf`e(ukF`w2J5o$h@)z?0Gw&v)qV8LdnXmxCjBR7?=tzl+|aZY zd*G+};5Fg4V{!YS(xYo$p(d#*cBpmSo?kR5t9Vj{?RKkPt|P%W)`cd54bZ2QU?{X` zbYazC8M4Dr*}^;FmJlGUYx)xi8Qa??j%U0kM+RyC`)Jeb>#2r~wX@~b^7Q*{PggtX zya%~F8!Fpvr@*a{>J=-3W7CFl3ze*dQdl(RzBx72AWM$lyS=MwU4Tqy2DxY3%#^!= zQhh)(UYiPWOpUVbtdqb{dQD7WsX)K;B7M|c%$L~4R=}uYjV#GG9UT$A?})IchH$*V zsSjQrcn}Q1=xMZC!gk;#Tf9!tp_S0D*cV?VAKtmAm05LBK`a7mHP~kKQMxqU_s?UH zIjKZl=wpx=((j1kA@G17)$b26a2#ueK>`;i_1z(&n6}L6kP1e^oa=Cvllm<3s=M`Z z@%yR^2&UgUSwz=R0a*5ey`4VtlN+-uZU_joqqt<_YrBp()i^r(?G~_g6r!i)E_KxmcS2BB;F3F1Ge-00mXH}YFe7HB)dKtJ6ZK5-#(aCh)Ey%B(P|q~@sYPbJKHPlZP9q--4JYS93;se%BoiHfvQTrtB)|ieblv$f9$x)byKUpl};ASoVsV@h%~GBS=md;?EWVOt~cKh(}^|615J6l4<6@kin zVUGWbg5jJ@(ZyCpM0lYMQ5-i`Huhh6r0v5^q0)s_nWBe>lp?YC>U@$h#Wq}X4@JnC z4E71gb3@WR%n=isEL)>Qx&1YnW>Uj<=Bd1!G&zA1WSju&VuyU$O1T5F^r`OO2{-W^ ztbV&lQ;+8u^BmSX>mLLi5H&aI6SjZkV*jiuzd3uZ9?gKZGY!Oh@WaMV|6}7Zd|Y^W z)yH>5PP*3-2p|qKKx+$8^E2v7_GF4I&5wup>z03oClkwz6l5^=TR`x7^sI4sNG!Y~ zsq$RPKU290zAQNTW~2Y0O8QVbP^1jWZ^0YR8pq&Co-Ty4&xv#u3QmRDdMKvAxB75EuD$xuJq>3DU zhXH0(J;uZ%OG7z>0B263h?(N49wI8IL^jyiI#1I2iK|NzocI06@zEJ$Vs$X*uR}*-!6|ghrt?CA5As+FQdv=^GZ)n*g5r?pY1Q>N*5*=%t_`gO7}Vt{KYJ_*JxX} zyHI4*ezLBq-z^$GtQnDNj$L?Pe4iU96^J%ZQA+&#iSn-*kYO4nK2LkYaN&2NhP(tn zfj54Qe3;@{a2qI@%8f3{iOe+VE7#!cUTByUJ^J^!6g^jY5o5OE82)3nnTL#TS5PWd z@jD=)SgD`QB2Q#vwu%eIVP}vo0=VwmfQDlc<6Bkuxn#l)EeZN9@62J#c}C66+K>|~ zQD;IggnKsV{uxj6o@J=pxG-JnLy(58!&0!tna$_8m7u##v(Rpu@{EGgbu+!rRk1>^ zHt=SmH7w^B66z*npS87@_5^PZSj(PA(P?77Qago|Yyc@YzL~XZB4=@WN#op>pFCRo zBnC8_xI*---b$pcJ&hAj?T`mY3#^`RaYbi-B;G$M)!e+OD}|43R~h^UYNiZD&HV`l zd`>WQ@zb8FaK$F;h-Ms}3LmzZvh8qlD~_ObVH4QlGIC#1BY5~z_I5=YiSSjJqfAgc}DHZ(b_31~E@22f!(KOpe;GtdH%xwV%oVj&g~h6aMXYD^AWCXWhz3Y&vj_LV-2sH z2-?3^^SaZF7Mp~YwwJ5{&UX8$>BJ>-7hTUGxi`AP)dSuchd)yY6B)daQ~a@!W`J^D zH5*TVVJV)o9!aC_=NNj^49^f^RV81xN}y*X4c+qC3#x2_gwi z?&Mu+{)upubCEfEAkEmXU?$x~k%fp-QG4iPJ;=rKuN7;QKt&-o_(HwxdOv&DA~>Lm<@ z@CgHT(r5NCl1JtgT^c~j%p;ReAXEj6uXUU*=MFHgr0|=Ja6`;CkeaIJ)XuD*A868K zc{)cj0a>OVN=`0G2v&CA;HJP}WRdpWsYA2~cPlEL5uplRvs=$ke?@bB;oxx}?7fwl zA68QlU;Bo=MoRS!yS!f;sZw>) zDiz8wIj>)ryKNWZd#intP+K4@neC5o#dGQkmLXaF^(OYI@GVcd5rQM3C_&4zg; z6-#=IaGMRIOE6KX&o>G#)tmZDuVWx9nQ9)yck6+3QtyYXZHJ7B}+*l0WMIClK;kk<|b?!kLp6adHZ7XxB{^B6nNLis^q8Dfhct zCgxsT{e{t^_f`U~H=s-p2m`b>TA2yR(+C;M?}#iEc$HMS38ojK`B!pBIPmJTQ%6NW zGyZ@pm??=KP&5AAwNwrh(1z$!W7B1_^3U-k0JIn6_1#}g=%((?z`@?0OM1Ui-BlA` z(>)CF;@blODG^oO0FyO~nCe(pAMg1PM{Lc`3X{ejfNe2Cl+0*?+gp#j^iLfb3e(Jq zyU%WIdaT!uiPJN=Pb0Locy~*jO}@=}?a1AI6srI~FR+tBsw%`V5E9~g^<(`0)FGY? zacLetP<}Dd>NvdM%WtHi=|M!QKYxQ$J~=g5g+BtrClt#>Kbj_RZ$KPGpy77%wA44G zspX0vuj;ZhL(+4y=)IU$T-G0_+ zShC2a;!+u2KXI}d3P`d@V{r%DI%1;Xs!WY4!X9{c>=9CjG7m#2W04E`phFl%IVD}_ zKOXys$_ZkKV19p1l1$Lg!;VUk`L=%fNlTP~oZ8VnN%>L@0BSrqG#OM--4e=-l1O_H zpoYZy4FoP5ya)t)1n}YmT&|*_Ge7Vmut)Z(TmC^Cg=UBsc!lN4bK%ZInP+RfjmQp{ ztUAiA1iH0Dhv~a4x7wnP#JRjRv%s|QQHjE#Sp#isEqlE_jtv0Pa9yn zJe6Q3Y7}7pJl_vhsMY-K#=DE8RSHU4ta&w0ZRUiZu=+IC=X^sBhIM&smA^LtM~Tf+ zTb-Irc!TM=gJ<|=G@v1tv~8HP21H7oTppd??CtRDdfQc$WZn~(cn$CH3RhN%5C7~c zaayxY{pr9!GV}Uw^X;=Te9^Qb+ZDMzhcBZS)e~;uc2&22ivbUuxS$`cA3ZQ5IR4`? z5)F6*Fs?Y>i?uhL+t%-5!MCo#8W$|I=(gfNmgEF>}efX1Yi82^iEG0&unJ zp>v@A-08?h6u`J!#u+1hJb5R}ga#p*AtH6AeG%}{_RLzxMWCH3*EuOkHFPFeM{3^r zts+R&bI-!zlSf}FL1SWywU`q#JH??T0ZZ{-P6KI#5F75}sT$~$V|)fCsRI^U@?`=V z_3+>%^$z8x^1*tz8p0#@>m>E;#R4&{2TA5O;w@Kp8Gsom9X%c^lrlB+HqSG+^g=eB z_IvnK%q{5bL{q$NI@y*1j8M*~+hg^YI=qQ~7DZqpt(J)TS;EiAu|6*H*{?FI&NrBdliWF}dfDB%z>o_9xs9s2i8(V2_74`HP?dTY|hK zFu^fpaof^sSRIlmJ5z1N;*YD3i8GWe3tu60n^z=fJc0Q>Lkie$$D|AdnC? zjQb_Xn%8WGE61Bx^2unJiQ(0!#_}0>F%Rn`67$o+WUX-J`LA$dWlkE|P}$y>=#%6f zQ1Ebc&gu3Qp!GrUer5GE0pUmi(a0H=Q&`z=|C8CnmXA}*d+WK=-F2Wd=j^7IH-t`V zl;TRmaqi;Eo4g3>3&3`e`U0>WH2wl?2NjpCM{Z6&vpmPS9o>wID|rZz9p9OZyU6FN zbXbepnN#bx1)mD3FJj0YixG<}2|EV(ypEOz574#>zz{;*bRE z@+&!+g*AJdTY-fVy=!Wso_{p5ynz7ohvNWx=w(EN`|jhdHC$vwv_eFm1Rdb5)hX9J z@^1_Ibj~Jf#4498nT(vYqKpCkqF8(wtj9-r6rZz0hmPWRoZVsbAIKj_LdEJxU@ci}H z(l5m0+(2fJ&M0zsJzRF&!Be$b^U8HKg?8ORJDMde_?T`laEj5RZkwBl$1B714nFJG z*mDY2Hp4YeV&1A5R+)6UIi75jZXjj>rC4wh0=)~`EscO3=)iPHscBqBm}q39bMvd* z#rA6SNu*?p85+@vA7%3TcD7vBY+2g$ljsvVShHhllfLv(=C#&zi-I?8o~v^y^UWze zV^ep9+jJH*{)Vx2>78b8og$wK;?g=`5#un4vI;v;$^?;SXNz#=ABk&m2DI&yV47j> zD@b+Ut#zW7#k@XT0HsE)rW9HZyq}6}edh(u@@laT=wC6OS@<@-s9MX1v_v#Z#Vw68X_i2iBfiKG69VNztuHt6pZY#f}6h>(F)NDV!MJ*MHg30 zsrABGd!yOAk13;xmxs$J${}bo5A_b*bTW(hpB*AXiT-JBqMLs*ySRn|8%$s-hJNT{ zBm@|u*MEjc_@5y{4tV{KAqIjMZ_T_7crli}=_TK^uV%QX&>ROgX@edI>hr6I&RJ8y zt*tE4b#+Z+4h_`SQpvp0gfDe@7-)*h#F@kWPNGLI_R10rr^;C(FMbJ0Y()nHTNQib z64nX`I+rebZqpC~vIP%n)4)os3aB^P^$hqIU_sA7X2)WthB;78`sl}B(O;1~iT~(e{M!OQ8qE#2It$sLt z6|kK<#-uT-{ZBc@k#SmR7c4pT z^hG}dIM(M4&pT^~nf-UkTYs;^OC2 zM!1IW!%`?N%6kT;&KBCBo5#!&WJXuGx|S_YN{;VsR&6unMJeO~WImD25xBWw9hjF~ zYWV5s(IY5hVI)0ed!~5K*%y%Qce?YyjGB3Rp(`dPA*TIb{^;)GTyI&e5kZ>wbik5a z!J<$3Fd!=-5$$y=p#we>k98YoG{Y->d|7In%IZpeCg;C#uK&iCtZVr8L{P5o<86ej z?lUEcFi{h$uvGTBPCj^U3OUpDx&CNOqd3xpKPP9DiR-?6v_f&}Fe`&NQ3F7%w0>iY zizozCeq*EkWqOn4B4PK-KdOiiwRedbpJ_+rV6bEU1|^`l_P17X@t>;r4or0JTo2on zS5d4Fx<6xi60HjP6)0GBh=g4MYz*oTiu3h423iK@-{bE4^Y{BRgP`J&c=)$$bG>ZP zyx~`AzP+^Z*Ob~XAXp1Qv3h-0qLaUQ-(`9v2|?>S!@Q!K;cITvlhtb>l;HQkn3ifQ zlts3AgQ%rr%Iqgi3;O!5!b94&rMbH!jX-mOn{cTG-n<*x%T z$QpO=F>vPseejq&6Dx6*O-zS@%#LodT$6Szc)VNUGmW{9SAgshb4n>h2TBk>!*5Xu zb?2bbd{PXQf^YhEL}!3?p5kH(!+b=eJ0)49@dP!+=AnoWtYY3Xc6rxfPBp8z{EGBN zb7!Sy9@CN##7s5uaL!qO;_I`(2sWs$fBBbAIfhBnX3stG!dsHVse=iuwzk2capayU z)$E@PEySF0w&Xhda_N(3h8d^2#-nbuV>lM)FcI$#;>~mWF_)t=s9yBJi2NjY^y`mw zISM@O#$%NKu2c?HLkWi%f%wD4eRh*4sE(*RYsOFm`IF3P&h|n{&1vwz;QpW1jM1&z zt(UR-RWDz6oh>HLY%TgzI#vP{5AaM^ey`UEtYZD}l;C?c^HGx-&2@4X$xjs8ellvz zGHVJIajj;mv_WL)%OxBbXYf1)k0};VB(!yKi4~Pp6^0D)pH5L1?n(ODNMg#CC5%aB z*W`{})V^sQ%TIj7Bn3S1(>7-`i97t;$0=+5+Ec#a{pGv4d*ZC1$_|lMn;RsPjBA9> z_w8$mot~14&T5ReRsVdMbsSrwmA%bhiE}E|t=0GXIqEAEc9SY z0DOwb6Na_C#ljmP32;@M+L{~dEOY1TvJE0|veJ@?=@=Vm5O&fJtc3^Fo=?$NNOrSO zLV(=sSpI^(r+22=2TN_yh0-tx<8EYpf-6nijeGp7N{;>kC`4&h2mHOkLC-N!A#VKmage>12e&tZ{t z$qHSuNHRWhaMm)CtakVVffzA-uH$K0IEQU3_$n@8;ib%w=%Punyaj#epBCMt_xp5w zC%ujf19-x9$}Fo$@D0n%)9q{ z4e6h|4ko*X<;78lE0P|(_pdsbmxj3CHbJKF!S)#=&_K}>y8jNee0_xsn8+BJ9{A^3 zU84IBtIrrL#n`fKy7%bBRtZEKVK7uJDLcMeRo2yx%P+PGhp2V4wduWsmgbFM<2u0D zZM_Y4J_b+74qFbq?+6BvwBPrAd#=qbAIb!;+(X*h2{JsJe=dc6@2aD zjbC8&2dwMSr1mijX4VsEPQi1kVdV;}g&Zu=DB?7KEMJ>9W_b4;vwr__PG^)W@Rn=% zFmF^$I(3&V$TCj2?;bLFRsMOjf>6Ku_1~*#eKT6yrAxRyszJC2`9nKPXYk>_y2lk7 z*U-4jfZlY(n$&{Y3OQBoSV3P#9<7$O_oR&SBqyxe>JVSy_ zuI)oVB0|;-?9|8&W77)eAwIl2oIc(L$x+I15b>9WsntHwAf+$5`x!A1SNPGQ58ePG zpvr`?)jsNPD4?Oyt-cQj!J+x@lCf3Ds-ol;4T7WfOyBMRNfyqg(c^e9WfM?b_^5(a zcD_S1VYcMg#qv(W#rc72wyrIr52hi`K&&~^NPY@OlsPXY^-F*!1QR@sR5fw(cAle5 zpk$c3Okip7!o@p;QVZArtQv0yC~^lRQYO-W3l7w=p0KTTT2qYMk~TM*WjfPl zE761+2xIF^RyS4p|o=z1Gz7dp3_7dG$eE~Nxq4B z+;%0Rd)H$u;ft!aaF5YHlYhSrJQ>_q*A=(snZ3qy4~Th*@eNRA4TgHJi3_+$tQMB| za`@YzM93~QKqfhFA-_@pkMME5LbxfP+4%9GsVK%_V*V`LwqqL4bPnJ@1caPCH;%JN z9_$Yj+6W6}bx z`B%Ih_=QW)#okVU2nC*?u=>8%S)i^5%7|KHcfaXn!Cp41LHfLbJ)o`$3&VGPHcZhRba#du0OOVsvyofn zLBwmTm;yeo_@S;vptI37Pn6;SFqOEN9I5*=d3AqD?Q&9{@clmkLO@G}}_d_bC$wC+4(2XC%a{LfkR4>EDB?_nPc$g}Lg1JbH(et0iGAo{BoQ7x8I zC^`JaNp5_0*$u3e;- zVAOi5&x7;fDDa6f<^_Hk@^|l&tubt+sYKl}2f_>7*hMTqKm-OhunWY6 z|6hdT!|ID<%y(&RUhe#`Swi<)FC>rs)MCow1*AON7oi{msanvWzv`4yBVjEnpp~F{#cC%MF zDN8p#c>)C2Sp55Y@`Qr}0Eyf<8Q2B~5EmBV5nJ#x2>1pEE?9Yn2V_%z*t_#umW4)FVY~Z+JKdz(nTCos_#0hxY1lqRT4Ryt zD3I~*C1jNu=y!!-CCvU?wtooZMM7?*ekU94O94DT+3HKR+-`#qBZl>zTFUj`_p;C} zzLUB)3y=lG{)q2}h&kk#W2g%x@8l_COz7GAIQtaYX}H1iHDP>ey_pMq`S;W|)Bm}` zt*6gm8d*-{LpVDBJNH4P0M31oBH=&^a}4oLD(&lL_WE(ItgY4pPa+mSc{0pQQ`(spVU4h6!_Q+9KgX5pqoku)V>owOn zHeT~*6$1J-nz3jnZo}-2-YJrQF@E-bsgTn{Vs(9oa>4*HW#r5$ZqC+MySD1}fWV=L z?%;DuCle#*-b!kxo%i$UWo=6*ep|=nK`eQ`B*rW2Pf5@ZPd1*$aE8hq-9*Cv-t7v# z+5}048p8AY(t5`)nm7EX2wj8sceN4gFQVo9&Kg28^1JIbL}oFTlsDghiL8yL0;AV8 z#w1P<*ZkZY0;6X)a6$)2AE#D7xxI_0?{-R>iteiT+vAeWDnI19GV~8_Qr5O8QwUlU z_Z^FhCwC5#J^0t0ebf1j5n7BwrEr zP@{(Po9-MudOJw#w7wzVT-{GOC!lPNvPV1s1_8bN;vXp{vN91=^2HGIE1U!J$y0a?GQ{mB>?YlO&cDD;Ky&v zcAwzHo-QTco9YNoLUqpQ%Ih+zDRREZPH2-VxvQG2l;JAFcqecgLC!MKrG|ButB_a< zgjutU0S&pUJq3;=h~ZyQ>p!zT(5vuXEA`ZLiK%53CTF2-VQ!kotiXO|{(g;Qy4Egd`41oW`w=t7V*2q-l(DZ5cV?roXs?%2Txk9BdbX%G&A{J4F}P>>;Hwo-=htSLRx)1=L5-HdjSCcI_1&t|`Sk z)!vQ_sI%d=&|H!XsuF_S3)xBbJlHiJbJ&@*b%-kX5ht(;jIdahzt+ucQ^Z4!H zEbFpgD_eK?8>i;t&R7R2yy(=UT^^hclyBG}SCQz%i0<*anapPV+QV<&nJIeGDAL)n zFgR+nGIHf(hg)*g5Dgc7Q9p?tuGNcO4;qCPDP0K$#5~&_8!F?PFp>mvw5TKYyg5jH zqr4{&Qs%95T;-Z_J#oAlsiV9BgN(8>*W$iXXN>cA7}NFPcq>l0XoyDH!ZT;4KZTD< zb1sZ^;N^nm#gwj$OegFRI93O=`4&zZA=%_N`Q*->jsM+{^Z+?CFO8?!8hd|z&}wN< zVK%J%NiXs(rz!nz)EVG+uT-f)p{7g_K;Flr_bRzDx^lZu9UoVba^=VxoPij=a{J~87tm72^T*>J7KIu4xTpj z)C%%276xqlGB4&61Kqwy6`!+!#Hh?(&@DbGBZng^!YM&7LDJ+U#Eas@T~cf8-g(@u zpEL}^M8Jso#}mT-wN($YB^J8^zp0UE@IZ>9y2J~01@tN4l#B%w6=NBQJa{(iaa*>e!vd#H?sT0)Ge!MZd)vP|SF40aBTZnG{T6v=7 z<$=@d9B`8o?+d?NylwX7GSz9&I!2|pB;`3oyf`AGDdjTDBk^;2?dh_ivbrb2dB_Qj z+C7hnULbGN`<~SN$E7EpYLnmR(lk-R+_#x^6+IZ2jzxxgs^wPJqdUY3pAZ?w@oNmM zO{9w-feY0xZv)P6!8(z?oH`L9QrSxdAdNu{S1Kg=kwFA-x-gfuyk2xUmA?O;vvWoK zshueSV+r!NT&Ng{S9dEK@L>+wvw9K0Wmy6AK2-EV1D@LO zemAoLIFW?n!ywE9$W~$abjuq)S!2vvybg@RVDq54k=+JIBGifaw~q+j zA%L%+MF=g{q=rB{;{*DBJ5_UPUY-fEQm0 z9pvvjoBQu+IyksVd#I;`IGdBO*3nmek<`+|U(BC7HC9TaBK8~VXu{^}EEkR8`$RdL zdjhmb4-W=;Nn9!+x$w4Jggp9WhbSb*em8kBf0!I@ptH`OPgyCQz?*@0F^^+rprZ*; zqK;-$j(Un}L4dQl_a**v(Otqodt)FgTZJ?!U|lkq(g*NJ*UIIj0-2LRyqJGp;FZ)# zUtAZil(x)uk7#FYdx)*0zoHiDd#q%~hOs@+*mP}=0tk;mWq+A@KF=#o8{r1wY`*^u zpzY7UzFd?RgV=>(sIwjdvs~1q2?pTk1)-L*++bVkqm%x7nq|4jeG&0Uiek8(l`kf6 z-P!#8EJA;=$Q_s!B+S_yXRL`G(3SP$;{`5uK2N)V@_)3~=4>vQ+LY1GI^on>{1i?^ zB)7ZapU9{n1`xWIUN(pVz)csx4e)!iVv+#@oiVDXEC-l{I-589JDc-3IaNtJ*3nys z#sHK}zg%=RJJ&=%h3aBgOJ4;)hq_$!rk>I)2L2zhsx$yGds>i-`PNZ=opqsf03i!x z^%M$0Tg&W_J$JxB*@g>%YLwDz>8(?asR44rUd&r4|8Evm1#sXKOdCd23jG>?JEJ3@ zEa%x{m*dF=5ni~K3f*IJ*LVWcS?zZaEawFYtt|m_w+Hbp=a-dhDXNx8YAK>mSX$E? z3BH7%F6LP6)9Wy%8t`DxclGGfDa3`YxLLcL28k?YX-9(ljno5+!(}X$e2Z7wZbmp1 z3ZEz0;r@94QK8z?Pf~M*2vY1Q<7t3L#c9W==5d5yaX2~zOMa}qhP#*+H8a@K_z=_E z!d}i=I{TlGE7AyOQ)^X!XVXAxjsA8P&h>h+Uv@7 z`AVLOKYi^D{Lcs%)30NIF+%C>OIgVKk;FjiuFD}5%UNtnfbV|-olU3yn|8z^WkR`% zVV;o1_zmFD5es0?GM0W~o|;VO5-AYc&Z55qAO%p!#k7^d9xdxM;&N7#7T9vuf9B)5 zT%cR(vz106$FiK|-fX-J*XU0G-gGhjIFB4y%F{rHYnlVET-;Q~vv9Hba)4W^=z9Ft z&oVO(L(W?%Qo-{8f7{6d-K6yB(V=MtqQALJx|=YPj5&eZJUn3$Uc&@&>$Ee+529c_ zmUhq-Uz5Y{WkXUzU~a2!qc#*lFmu#G6Ib>@xpv7-||8#$RCEQX8 zmEtDiBjJUC4fx$IWW#|EWGNLy=(>-xzf61*+sNMoy{)Tu}?2Ok1SeoYlCvv2M z)r8_#RqK9<{`x-a@>GJWuLhQ!kLX?icHajXgKBPI`@{c@8WBz{Y*{;HpNRbp$*K^~ zAnuF!^Za%ms6{tJt#*$xP1mk%u$;nU z;(KYU>dw|doq11KvpqAK`n_`iG7<}LU*SJAmwc3}nc!;kVP432o~>n7pkvrg=$q7# z)@(wwT&-{UZWR3-P36b!E)Cqrt;6ofLSHAXm1UXaWfHUiKP{cnlMdKx)AtG<%3-)w z>yMgOD9o6=dHs;~cf71gu-o;%@{ia7E^Le-Niiufnl#smj` zN`^WHw>kuYoEXT;Eu!E;_3U%YK>uCxhR-17wM)dUmp&Ey*SnQTcww!hJR-{cMr+aS zGdb$!hZup4xIv3)1Igf-K;{~&VWOphXQJ`fUtgIWv9YM_JYBqg@!#Y!ccB=#f;cI( z(?7fRc?TDOV$M@ls_Yo6XdN2<)OH}%$p?fx`AhNLAyVFBpYcz=XX3BWWpom!c&k&R z_CF`P7H`zkCx38Cz)uAmw=$}y!S8Zvw6~${6WK-+f8$ixv1dAv3y1crETag}=&1f# ztoR~dUe*kHrK9v%;`-Pa%x*VyyNN3zLdt$nB^mTEfG1J0r$HOC?>+3_<&CWA6Ne$ar({p||<=_)`UfT8&uCx(U&&pqu^S&SyRppiw5+T!vk_eCq zUv-RDWw@!c#I|y_zm$r4@8)PPMzry4_q3&DV9;#uN-sfeHvxL$2c9(DvP^Z5&R?5Z z($=xNR3GaQ76*5)#)UcoAgip8Nv^k~k=`PoN+k2)@;2IrdMBT}GCuR!GPaDGu&~F; z7Y=1E#WB-nsLttRbj{3nT&Sea2m2hJ0#zR7c_~(6P<3=QIBCqVgI`$E%{+1!74(ako-!D5%57yW9igUXosNB zb7LB}TYjNkt&=yIuRPmntC<;?wqT~?i;OK4ip*N6)+n#Z(YQsn#uWV}1u{FT~cO5#;f^@X|{@tEF)h{NO zm1c|=Ae=|nk5OXFG2mL4$eq#WYGqa_EL?*+tdePs1X-?*IJ=-dv^7NSd_%FR zIejKLfv@I2uLWIzVkKKbO5WuZy@8gb%-O;Rv;nsh~4cDrIVY;l^m_-aR66 zy530}DLHK(vxu7f@pa(3ckOLFs2q~9V0$x!qg0+bkruS3$+jKFb-&pe2Nt^A`fzNS zES<{JJcTC&nU=v94>b24u8B@)TT}2T*Xn%29ty?~u!$GH(33lzx1+cWOq4xR=EQ`; z8n7u74;s0Y<^(Q3ye-l=O;|zsJ!<}^i%xXTJ8^Pc%BhSN#Zq8mhU9+*fER!0XmQRS zIyDxtx#;gRP;LJnqILfC6S~^e_e&O`Rq>70Y)vBRnnJDCWpk-G%tswDCsQ)v~D;){xON;sa$uupEmDO zlysd%AF|?Iwo0Y4ModHVvPO!2-nwVZawTvOGI=D1NAvOs3UxJ8squ)lR*9#d z@_3S^(*#&p+DyI1q(GBl4sp7g?@3>&n$28hQ`s|^dc z5>TbF8fa~|Lt&_mUCN&6BXbU~ZwG!qnpTUEKG{4 zvKQPlT4p@k0Oh8hgNwwXRq8rO#I^%hmuuFc8N+4E~wQ^+7Ca96?*WYkaE$wD#3b@(O8P-Ud#b<&yMoAjNwJY9>1?(;P}C z0+%ygzwQ*4o{w}DB;pY&(1ez87VK`1@O zuDW}J4y=ZwBUb^cIi9Oz$iymXCL5}}r=OU~$0-`otfQTX}4R)Pc!S)!3Yhn*6b;x;du6;mHb>r$4rW_$;>{j$yf; zEm+5f^HsqFN%O$O6Y7GCi~nKdUhJJsx^Y%*_O)_yAaQqJR(;bl4!>(Wert~J1;$I7 z&9ff|%Pm8QTcDY_9dWBn!;7ZVoH`*dj!i$6$va}!UoFJPJ-6FF`FH~1lgU8H5Z{g% zNC~9zNhQ!JUn#^mX^4a@KDNL#WU#JxEW~n!v5@kjulhwm089b8&>f*EmWOCc?Sp8_ zzUL85;iQIW%C-{S8bgeD3gRg>Vmo+>VE#DbDR6?P##5TKflQ3RJodKn_$|>2Q&E9q zdf_U~9P0{MX~92@v6WW5Jc$r$jIT5^Q98oXf{FTLEKR(WgR-<>U+*}JYl-753<6O9 zil9Bx;@XI`)INx`?0X)O7EWr2v}~(Usy}B*dWT30A}!B|Z6htdsoy*&L|VkPL3g-8 z!`rk&T2$beUPwzb$4-N^H1bblq@@)vPa=dGBQ4EL>=w;R~k1whMc=c9@Ln+|&!NX~WHq&>J{!HO6u{_}qi=YK-%= zVX$n}2hL#qF`(momVyYuS=%>0C-xB9$iY(zWbMflHEyo!0XrX3*8JR0dUO~f*+Ky#S+@=T4p2Zz;eN38=sj(rjokbXYI`)*9lcjq-zMjHDy4Nuc!$RGwsqRG;2>mFp0;>U3 z=cxh%!|26eU%IBZYV#=pT?)J9CA4sw$_V!nMPK*wyi@=57)_sK1Ds`qlG@ppcIP3`K z)XlRr6wE`0ne6&R_Ix!d_DKCWot92pmHw!^o(H}0Nmy=54#|_2K+tFR?ZD^Gc9$e< zQq{q>lwDkuKUH?pJHIGPkv$7^JiE$a4+u3-{p%_RB)%U6S6htkEo`(t~0nQ*7X9#@ zD!yfTQaqr%NR$^BT)QY=UVv@fT7v-$zPyR^`#5KlIFlHCC7F`riN^9Q+w^+&l}wlO zY6ld#&OibQBHpJ=O81unp$s!gLd9Dkcu<{Pu9ihMuU3nSOrj#Q4KbO?sRXA*63zH; zY@G1qVFx=+Zj*R=`LsL~8i_(9h)aqKjb(HJFTIUt@g3bG6c(AnV)ia9uvGk(!g4do z7APrFCB^DpQp_$Sv*}y(q*iDIZdE{L9Ohe2&PG#v#qG5`WQMy=y|d%^8{2nqyp)+!1K{feywR)Smq3+ zg02<1Ry#Cxa;<#V7VFibk!!Wl*xGwjCae|udAL)Co23Txq>D;J?mv|2LNrq6|~{(c>%Oce3i4DR_PeK!6_f~?TaLy0uTIlWUk~f zLB@AJ1$BVI89&Jzj29Apl>}u5B-}H z`8SfBA9R1fANAdz@}hL6?oa9ZA^n3y!r6VpCjPK+_C5AmcU$cvv_9Gv zUgB89JzK28wt>j{Ghm(dP3`3p4e95w4unNGVV&(u{ z!e?T}1hw1khW3wB3IuaZOLVAk<+%4?Q$_mrsSp)&On92V_;fFWx?PAGX@?qZ_qASr zi}H9HE(&@`^2Oxh;&PV6X+g!ah<_A_4)J`{M~A4(B-XcCV~5j$R?_t!t#M^XYYMuy z2aMJn`y3S|=+NjLkB1mWKp=dRC{vIID~G+=nlN>CdEpb-p8Ca*nRO_-M;|X$+d6yFEAklAW38$jOWCjtp z&Xwy5#oRg0RQm(9&xbqBKr1QEpvs<~u-TAgHJ*${cnR~C_YvGmswIMUgEL4jDN0`F z&fAsnWUcK40+uo>#v7ie0SbW6pti85LXBcE*#?ts;2%u3IZCj@qSnCi1h=o_3p{ML z=h17h?pI*o%pMi5z;bhLEW@yf5Ww;viC1BOt?&23^Ynd5IJk26w4s3O zu1|#LN|sJ=fA&cre}#9Po7DUj7hZoPBfjB)qbdjJop*eL$PI8T@@$?gv923q7bP*Q z>mIH3Bs6xhYp9s(r=16-bzZDz8lvNHD*LFQdKK_HfSRovzr!;Lc&sB=G_cE%zU+9v zu2xee>$eqbXURKfYOv@511moa4q$Kqg9F<%H3|;+^uGhE#9jY2^=PANWFKo!{C@p! z!|5UJVU%FBEzAaSNN~29a=sA=H@z$!00qvbz)b~sEV{X=(7gcny+lU}9Vv9AwrT3* zNSUT*4c(Di|C9E<6EU%^$!OPkvVGB%NR6E*_q1(IdWGtB#^-%qlVN-x!n{55kw$5@ zjOqSOmxE8y?tczza6-7sE#|+DX+K`Z5 z4s;zaq!zpo!!^XFMk-Vd^eN7hOti3Y=kWTDDcFKn&x)YHfKRpGb$&~{tDmc=NKymv z7T66|Ncj)$#D-WQVugqmZqw8WE3`~OTdW*bxRrFqf;x|hXBcrEE@(&`%QeJMZ;e4i zX1YZ^r_%cOeK2(ow^A;0jn5YGV*=MAIA(B|4Y#ySs>M>29b$E#Iq-tv&e+-ey{(u3 z^jkWOZ|SL<-aO2|X0v7MJ^N{ve60jKEaf_!EEeI`?Alk$?3MY-BCm`;oLjaZ+Z6n&(ZWt^*3+IOYjNTx>f$0+2ULDVKpD$nBmD*GFy(XZ?b+Qg_Y6}YpaxokT=umuW=DgshpI2DZDT& zxkSvb(K4BY)iSRpH}uPsZ&4l=d6X2(tI7B#qW^C^zVT1PzJ}!opYw-HHZXj4B4KJ+ z!{wvC(@;j=8(_(q5*SnSdC8TzxBgWHp&ifGmep9TzQURt? zYCKhsUG1#=ifN=<>aUJVS-0pZWY2wElw?kF3LAe*@Jsx3JH3woxr&!eu0Am}waBv~ z`?|Vy-sEu_X|YDS4df&`q4h%hlvI=Kf)C}AhJ&R4uvMza&|c4oS($Ogl^}4L{qFLfwf4KsZ{t~9#L91T^D_HoT{DEOk{Q{v zL{;p_p5-Yge9g=3Q}}|%Pm5ASz@8SQm`EL6m?CUDv4}e*o=dDPFxR{%#QIeK z6W-gU)8FlK?=SPlKNeYDyp4)z-!;TKr62$nx^>7^U1a|UUwp9&vsV=b;a$x&IY!SG zs^T$vwn&waQQO5T%wA=V(WB+xgdkKsM$Zt=s7j707 zPUG8XHDj6g>pxIo)BVlz)I9Bv%Tw=sKQ2w(6aBcvUQUBkmKd7muhI9oDqv*$cfFX5 z^E}I06uykmyVc*Fo?q4a)~~0V_~C|x#904pHjT$T^%jgsQ2xNH^fv4NM}0g|{mj8d z&?BqBD*8GB>lO5P2G=WyZu%4l?|pW6lce7*`oGmNq5p6lPqKX4*D={F=}}MiwnP47 zd7x2prSxIO>zci-Vze7Or2p-Gne^8Eb#-@BE^NDUZ(|0%b&+HF$5gZ0pYv!!zujBL z)w7>aa=N;Sl>)i3M2&2BLVbQm)l1;2{+q^J*6ikIb$|7GB{z#GT^nyt)y3^(CjMn> zv1+ZhM=MoZ&`n%C)x9i%_tYktuF1h zbD7N-vzT%5ud8?!AF)Nd?t{N++;vrUMQAJx7_$%6zPGD%!v6j0-ObzZnyMn|r(QKH z@9~XSIu>uj#)4o*Zya8|`*7ojJ6;S^#aH3uCVA-Ah`+pw|;JE{SGJ! z6>ObXyD_YnN>^#ES6Q{0)$9`FKbp8FJO0ef^}ouS=svz&*T#cD>K zwO^>VX!I-lU*cM?Urpa-IhEeK8tl+J15M*9y^m(ebklofa2}*-F!yJ-!;ET{#579f zySo_*9DI{(ju>^v=2_Z!$T%B3{T#CY_HX)3t1>0@?#>#)&5EZh;M$bDTRVu?@$J>S z`}Zn-1N}znRD!$RxCDoLLn}RL+?qSbW zM>X~2GbQ?SH2Hp)XRCBdl@(?3@?A73viw20)dr6q)%v#d<6E>^78`s-Ip@l<$3Lh% zOzO8uriL~^VtGyhciQX5U`C@Z`^uQ%h1Q$&f$1qeMXoCUHWvlt-(miF>||%Rx6e<; zb*Y|6d7jp1>AH0Eto0-7KdioXHI3(stcX+kC%xlx!EgC&oKCW7yfFn$_rjB}(%($n zsY+IAle(KT7kdbLA6ep7K9hROQzfT~Z<$K6w3o=*)0#-*NPD$TO7j}kIV#QTQ}3)a zud`nP^f&8KO5`3_rHqh0u1GntdR$q*f)qRoHgE4IyT9H~kGpA_A@z3q%?aNTE&t7| z&?43;kQ1XYZ1DHeIqwRQ=lOWuPn!vKe5G&Ae)L69F5%Z``MtkBoDGZVLCybVe`37N0FKk_Ptz)DKs;-2lrn%j znr&f2?Ca@?m-r04YfSp?XGyhOQR+rLHYhVT>guXFi~9s?{ru$vF-l7neN9*|E&9)F zWLCJ23f*Sof4}^%|9bQDRY+c0JuD~)!$nrIPn9K^^q)7$V=Ap_ne@MPO+9(*(^YJC zk#QoH`*$MgZndJ*uBBzK;NExzS)U>+YiP8m%F3Sig6m^ttxb0yi)#Q&dKUhDD?063 zcEE5X+7{vJo)89Mdvzr4Ttnc9)idS$;N&WY9#Jf_ps-{1YqLux?dya;cj zWLCX7G+&voPVlp-Esw%zjcGk47oF6EmuvVM-z8~CS26i^`j^M)w69m+CR8yd|1a)g z+wWFUJ`JO<)KHxMcduVQ`R6Lh$Fn$E_VD@z%OSr{@?sUuPXG2iE?5re>0jK# zYvVjmvv6ZrPkhSm=Jc|*EF!AfPk<$bcRzlF^op^}m`W)g!h7Siyq+arC-g#?QYV6K zHOr2iK62bLJ6}Pi%1*h(^LRd)FHZf+WqjISnMP^0oW=2Jf9RqTp>UEh>r7AZ_ur%B z>4#h0`(>LI%vVMHgXxg(y)dA9{VMHk0n2!Hd(sy#i~Q8bioS9dH`s@c-uSPhbpKWV ju|NH1mQQb}n^-RDC;z9%zx&t!{$Kwe2WdJ=vr`-avpWd1 literal 0 HcmV?d00001 diff --git a/ci/etc/expected_install_directories b/ci/etc/expected_install_directories index 3635d03d84edc..126ccb820a260 100644 --- a/ci/etc/expected_install_directories +++ b/ci/etc/expected_install_directories @@ -920,6 +920,10 @@ ./include/google/cloud/oslogin/v1 ./include/google/cloud/oslogin/v1/internal ./include/google/cloud/oslogin/v1/mocks +./include/google/cloud/parallelstore +./include/google/cloud/parallelstore/v1 +./include/google/cloud/parallelstore/v1/internal +./include/google/cloud/parallelstore/v1/mocks ./include/google/cloud/policysimulator ./include/google/cloud/policysimulator/v1 ./include/google/cloud/policysimulator/v1/internal @@ -1433,6 +1437,8 @@ ./lib64/cmake/google_cloud_cpp_osconfig_mocks ./lib64/cmake/google_cloud_cpp_oslogin ./lib64/cmake/google_cloud_cpp_oslogin_mocks +./lib64/cmake/google_cloud_cpp_parallelstore +./lib64/cmake/google_cloud_cpp_parallelstore_mocks ./lib64/cmake/google_cloud_cpp_policysimulator ./lib64/cmake/google_cloud_cpp_policysimulator_mocks ./lib64/cmake/google_cloud_cpp_policytroubleshooter diff --git a/cmake/GoogleCloudCppFeatures.cmake b/cmake/GoogleCloudCppFeatures.cmake index 34a1b9770ac66..18d1077937063 100644 --- a/cmake/GoogleCloudCppFeatures.cmake +++ b/cmake/GoogleCloudCppFeatures.cmake @@ -127,6 +127,7 @@ set(GOOGLE_CLOUD_CPP_GA_LIBRARIES "orgpolicy" "osconfig" "oslogin" + "parallelstore" "policysimulator" "policytroubleshooter" "privateca" diff --git a/external/googleapis/protodeps/parallelstore.deps b/external/googleapis/protodeps/parallelstore.deps new file mode 100644 index 0000000000000..3797f67d24463 --- /dev/null +++ b/external/googleapis/protodeps/parallelstore.deps @@ -0,0 +1,9 @@ +@com_google_googleapis//google/api:annotations_proto +@com_google_googleapis//google/api:client_proto +@com_google_googleapis//google/api:field_behavior_proto +@com_google_googleapis//google/api:field_info_proto +@com_google_googleapis//google/api:http_proto +@com_google_googleapis//google/api:launch_stage_proto +@com_google_googleapis//google/api:resource_proto +@com_google_googleapis//google/longrunning:operations_proto +@com_google_googleapis//google/rpc:status_proto diff --git a/external/googleapis/protolists/parallelstore.list b/external/googleapis/protolists/parallelstore.list new file mode 100644 index 0000000000000..f2bba8e97dc84 --- /dev/null +++ b/external/googleapis/protolists/parallelstore.list @@ -0,0 +1 @@ +@com_google_googleapis//google/cloud/parallelstore/v1:parallelstore.proto diff --git a/external/googleapis/update_libraries.sh b/external/googleapis/update_libraries.sh index 3e879b4b6b10d..4d7836c0bbb69 100755 --- a/external/googleapis/update_libraries.sh +++ b/external/googleapis/update_libraries.sh @@ -216,6 +216,7 @@ declare -A -r LIBRARIES=( "@com_google_googleapis//google/cloud/oslogin/v1:oslogin_cc_grpc" \ "@com_google_googleapis//google/cloud/oslogin/common:common_cc_grpc" )" + ["parallelstore"]="@com_google_googleapis//google/cloud/parallelstore/v1:parallelstore_cc_grpc" ["policysimulator"]="@com_google_googleapis//google/cloud/policysimulator/v1:policysimulator_cc_grpc" ["policytroubleshooter"]="$( printf ",%s" \ diff --git a/generator/generator_config.textproto b/generator/generator_config.textproto index 87389e686d327..5bbbb81cc1864 100644 --- a/generator/generator_config.textproto +++ b/generator/generator_config.textproto @@ -2986,6 +2986,13 @@ service { retryable_status_codes: ["kUnavailable"] } +service { + service_proto_path: "google/cloud/parallelstore/v1/parallelstore.proto" + product_path: "google/cloud/parallelstore/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + # Cloud Profiler service { service_proto_path: "google/devtools/cloudprofiler/v2/profiler.proto" diff --git a/google/cloud/parallelstore/BUILD.bazel b/google/cloud/parallelstore/BUILD.bazel new file mode 100644 index 0000000000000..37007330e0294 --- /dev/null +++ b/google/cloud/parallelstore/BUILD.bazel @@ -0,0 +1,31 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("//bazel:gapic.bzl", "cc_gapic_library") + +package(default_visibility = ["//visibility:private"]) + +licenses(["notice"]) # Apache 2.0 + +service_dirs = ["v1/"] + +googleapis_deps = [ + "@com_google_googleapis//google/cloud/parallelstore/v1:parallelstore_cc_grpc", +] + +cc_gapic_library( + name = "parallelstore", + googleapis_deps = googleapis_deps, + service_dirs = service_dirs, +) diff --git a/google/cloud/parallelstore/CMakeLists.txt b/google/cloud/parallelstore/CMakeLists.txt new file mode 100644 index 0000000000000..2c8d1d70d6056 --- /dev/null +++ b/google/cloud/parallelstore/CMakeLists.txt @@ -0,0 +1,35 @@ +# ~~~ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ~~~ + +include(GoogleCloudCppLibrary) + +google_cloud_cpp_add_gapic_library(parallelstore "Parallelstore API" + SERVICE_DIRS "v1/") + +if (BUILD_TESTING AND GOOGLE_CLOUD_CPP_ENABLE_CXX_EXCEPTIONS) + add_executable(parallelstore_quickstart "quickstart/quickstart.cc") + target_link_libraries(parallelstore_quickstart + PRIVATE google-cloud-cpp::parallelstore) + google_cloud_cpp_add_common_options(parallelstore_quickstart) + add_test( + NAME parallelstore_quickstart + COMMAND + cmake -P "${PROJECT_SOURCE_DIR}/cmake/quickstart-runner.cmake" + $ GOOGLE_CLOUD_PROJECT + GOOGLE_CLOUD_CPP_TEST_ZONE) + set_tests_properties(parallelstore_quickstart + PROPERTIES LABELS "integration-test;quickstart") +endif () diff --git a/google/cloud/parallelstore/README.md b/google/cloud/parallelstore/README.md new file mode 100644 index 0000000000000..1e0d4f265d520 --- /dev/null +++ b/google/cloud/parallelstore/README.md @@ -0,0 +1,59 @@ +# Parallelstore API C++ Client Library + +This directory contains an idiomatic C++ client library for the +[Parallelstore API][cloud-service-docs]. + +While this library is **GA**, please note that the Google Cloud C++ client +libraries do **not** follow [Semantic Versioning](https://semver.org/). + +## Quickstart + +The [quickstart/](quickstart/README.md) directory contains a minimal environment +to get started using this client library in a larger project. The following +"Hello World" program is used in this quickstart, and should give you a taste of +this library. + + + +```cc +#include "google/cloud/parallelstore/v1/parallelstore_client.h" +#include "google/cloud/location.h" +#include + +int main(int argc, char* argv[]) try { + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " project-id zone-id\n"; + return 1; + } + + auto const location = google::cloud::Location(argv[1], argv[2]); + + namespace parallelstore = ::google::cloud::parallelstore_v1; + auto client = parallelstore::ParallelstoreClient( + parallelstore::MakeParallelstoreConnection()); + + for (auto r : client.ListInstances(location.FullName())) { + if (!r) throw std::move(r).status(); + std::cout << r->DebugString() << "\n"; + } + + return 0; +} catch (google::cloud::Status const& status) { + std::cerr << "google::cloud::Status thrown: " << status << "\n"; + return 1; +} +``` + + + +## More Information + +- Official documentation about the [Parallelstore API][cloud-service-docs] + service +- [Reference doxygen documentation][doxygen-link] for each release of this + client library +- Detailed header comments in our [public `.h`][source-link] files + +[cloud-service-docs]: https://cloud.google.com/parallelstore?hl=en +[doxygen-link]: https://cloud.google.com/cpp/docs/reference/parallelstore/latest/ +[source-link]: https://github.com/googleapis/google-cloud-cpp/tree/main/google/cloud/parallelstore diff --git a/google/cloud/parallelstore/doc/environment-variables.dox b/google/cloud/parallelstore/doc/environment-variables.dox new file mode 100644 index 0000000000000..02709c2ebbb7c --- /dev/null +++ b/google/cloud/parallelstore/doc/environment-variables.dox @@ -0,0 +1,50 @@ +/*! + +@page parallelstore-env Environment Variables + +A number of environment variables can be used to configure the behavior of +the library. There are also functions to configure this behavior in code. The +environment variables are convenient when troubleshooting problems. + +@section parallelstore-env-endpoint Endpoint Overrides + + + +- `GOOGLE_CLOUD_CPP_PARALLELSTORE_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "parallelstore.googleapis.com") + used by `MakeParallelstoreConnection()`. + + + +@see google::cloud::EndpointOption + +@section parallelstore-env-logging Logging + +`GOOGLE_CLOUD_CPP_ENABLE_TRACING=rpc`: turns on tracing for most gRPC +calls. The library injects an additional Stub decorator that prints each gRPC +request and response. Unless you have configured your own logging backend, +you should also set `GOOGLE_CLOUD_CPP_ENABLE_CLOG` to produce any output on +the program's console. + +@see google::cloud::LoggingComponentsOption + +`GOOGLE_CLOUD_CPP_TRACING_OPTIONS=...`: modifies the behavior of gRPC tracing, +including whether messages will be output on multiple lines, or whether +string/bytes fields will be truncated. + +@see google::cloud::GrpcTracingOptionsOption + +`GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes`: turns on logging in the library, basically +the library always "logs" but the logging infrastructure has no backend to +actually print anything until the application sets a backend or they set this +environment variable. + +@see google::cloud::LogBackend +@see google::cloud::LogSink + +@section parallelstore-env-project Setting the Default Project + +`GOOGLE_CLOUD_PROJECT=...`: is used in examples and integration tests to +configure the GCP project. This has no effect in the library. + +*/ diff --git a/google/cloud/parallelstore/doc/main.dox b/google/cloud/parallelstore/doc/main.dox new file mode 100644 index 0000000000000..95c56d16d473b --- /dev/null +++ b/google/cloud/parallelstore/doc/main.dox @@ -0,0 +1,45 @@ +/*! + +@mainpage Parallelstore API C++ Client Library + +An idiomatic C++ client library for the [Parallelstore API][cloud-service-docs]. + +While this library is **GA**, please note that the Google Cloud C++ client libraries do **not** follow +[Semantic Versioning](https://semver.org/). + +@tableofcontents{HTML:2} + +## Quickstart + +The following shows the code that you'll run in the +`google/cloud/parallelstore/quickstart/` directory, +which should give you a taste of the Parallelstore API C++ client library API. + +@snippet quickstart.cc all + +## Main classes + + +The main class in this library is +[`parallelstore_v1::ParallelstoreClient`](@ref google::cloud::parallelstore_v1::ParallelstoreClient). All RPCs are exposed +as member functions of this class. Other classes provide helpers, configuration +parameters, and infrastructure to mock +[`parallelstore_v1::ParallelstoreClient`](@ref google::cloud::parallelstore_v1::ParallelstoreClient) when testing your +application. + + +## More Information + +- @ref common-error-handling - describes how the library reports errors. +- @ref parallelstore-override-endpoint - describes how to override the default + endpoint. +- @ref parallelstore-override-authentication - describes how to change the + authentication credentials used by the library. +- @ref parallelstore-override-retry - describes how to change the default retry + policies. +- @ref parallelstore-env - describes environment variables that can configure the + behavior of the library. + +[cloud-service-docs]: https://cloud.google.com/parallelstore?hl=en + +*/ diff --git a/google/cloud/parallelstore/doc/options.dox b/google/cloud/parallelstore/doc/options.dox new file mode 100644 index 0000000000000..c16038d500e3e --- /dev/null +++ b/google/cloud/parallelstore/doc/options.dox @@ -0,0 +1,10 @@ +/*! +@defgroup google-cloud-parallelstore-options Parallelstore API Configuration Options + +This library uses the same mechanism (`google::cloud::Options`) and the common +[options](@ref options) as all other C++ client libraries for its configuration. +Some `*Option` classes, which are only used in this library, are documented in +this page. + +@see @ref options - for an overview of client library configuration. +*/ diff --git a/google/cloud/parallelstore/doc/override-authentication.dox b/google/cloud/parallelstore/doc/override-authentication.dox new file mode 100644 index 0000000000000..f7022f607917f --- /dev/null +++ b/google/cloud/parallelstore/doc/override-authentication.dox @@ -0,0 +1,35 @@ +/*! +@page parallelstore-override-authentication How to Override the Authentication Credentials + +Unless otherwise configured, the client libraries use +[Application Default Credentials] to authenticate with Google Cloud Services. +While this works for most applications, in some cases you may need to override +this default. You can do so by providing the +[UnifiedCredentialsOption](@ref google::cloud::UnifiedCredentialsOption) +The following example shows how to explicitly load a service account key file: + + +@snippet parallelstore_client_samples.cc with-service-account + + + +Keep in mind that we chose this as an example because it is relatively easy to +understand. Consult the [Best practices for managing service account keys] +guide for more details. + +@see @ref guac - for more information on the factory functions to create +`google::cloud::Credentials` objects. + +[Best practices for managing service account keys]: https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys +[Application Default Credentials]: https://cloud.google.com/docs/authentication#adc + +*/ + +// + +/*! @page parallelstore_v1::ParallelstoreClient-service-account-snippet Override parallelstore_v1::ParallelstoreClient Authentication Defaults + +@snippet google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc with-service-account + +*/ +// diff --git a/google/cloud/parallelstore/doc/override-endpoint.dox b/google/cloud/parallelstore/doc/override-endpoint.dox new file mode 100644 index 0000000000000..8a2685c02ff1d --- /dev/null +++ b/google/cloud/parallelstore/doc/override-endpoint.dox @@ -0,0 +1,25 @@ +/*! +@page parallelstore-override-endpoint How to Override the Default Endpoint + +In some cases, you may need to override the default endpoint used by the client +library. Use the +[EndpointOption](@ref google::cloud::EndpointOption) when initializing the +client library to change this default. + + +For example, this will override the default endpoint for `parallelstore_v1::ParallelstoreClient`: + +@snippet parallelstore_client_samples.cc set-client-endpoint + + + +*/ + +// + +/*! @page parallelstore_v1::ParallelstoreClient-endpoint-snippet Override parallelstore_v1::ParallelstoreClient Endpoint Configuration + +@snippet google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc set-client-endpoint + +*/ +// diff --git a/google/cloud/parallelstore/doc/override-retry-policies.dox b/google/cloud/parallelstore/doc/override-retry-policies.dox new file mode 100644 index 0000000000000..a54ca7ee62cf6 --- /dev/null +++ b/google/cloud/parallelstore/doc/override-retry-policies.dox @@ -0,0 +1,108 @@ +/*! +@page parallelstore-override-retry Override Retry, Backoff, and Idempotency Policies + +When it is safe to do so, the library automatically retries requests that fail +due to a transient error. The library then uses [exponential backoff] to backoff +before trying again. Which operations are considered safe to retry, which +errors are treated as transient failures, the details of the exponential backoff +algorithm, and for how long the library retries are all configurable via +policies. + +This document provides examples showing how to override the default policies. + +The policies can be set when the `*Connection` object is created. The library +provides default policies for any policy that is not set. The application can +also override some (or all) policies when the `*Client` object is created. This +can be useful if multiple `*Client` objects share the same `*Connection` object, +but you want different retry behavior in some of the clients. Finally, the +application can override some retry policies when calling a specific member +function. + +The library uses three different options to control the retry loop. The options +have per-client names. + +@section parallelstore-override-retry-retry-policy Configuring the transient errors and retry duration + +The `*RetryPolicyOption` controls: + +- Which errors are to be treated as transient errors. +- How long the library will keep retrying transient errors. + +You can provide your own class for this option. The library also provides two +built-in policies: + +- `*LimitedErrorCountRetryPolicy`: stops retrying after a specified number + of transient errors. +- `*LimitedTimeRetryPolicy`: stops retrying after a specified time. + +Note that a library may have more than one version of these classes. Their name +match the `*Client` and `*Connection` object they are intended to be used +with. Some `*Client` objects treat different error codes as transient errors. +In most cases, only [kUnavailable](@ref google::cloud::StatusCode) is treated +as a transient error. + +@section parallelstore-override-retry-backoff-policy Controlling the backoff algorithm + +The `*BackoffPolicyOption` controls how long the client library will wait +before retrying a request that failed with a transient error. You can provide +your own class for this option. + +The only built-in backoff policy is +[`ExponentialBackoffPolicy`](@ref google::cloud::ExponentialBackoffPolicy). +This class implements a truncated exponential backoff algorithm, with jitter. +In summary, it doubles the current backoff time after each failure. The actual +backoff time for an RPC is chosen at random, but never exceeds the current +backoff. The current backoff is doubled after each failure, but never exceeds +(or is "truncated") if it reaches a prescribed maximum. + +@section parallelstore-override-retry-idempotency-policy Controlling which operations are retryable + +The `*IdempotencyPolicyOption` controls which requests are retryable, as some +requests are never safe to retry. + +Only one built-in idempotency policy is provided by the library. The name +matches the name of the client it is intended for. For example, `FooBarClient` +will use `FooBarIdempotencyPolicy`. This policy is very conservative. + +@section parallelstore-override-retry-example Example + + +For example, this will override the retry policies for `parallelstore_v1::ParallelstoreClient`: + +@snippet parallelstore_client_samples.cc set-retry-policy + +This assumes you have created a custom idempotency policy. Such as: + +@snippet parallelstore_client_samples.cc custom-idempotency-policy + +This will override the polling policies for `parallelstore_v1::ParallelstoreClient` + +@snippet parallelstore_client_samples.cc set-polling-policy + + + + +@section parallelstore-override-retry-more-information More Information + +@see google::cloud::Options +@see google::cloud::BackoffPolicy +@see google::cloud::ExponentialBackoffPolicy + +[exponential backoff]: https://en.wikipedia.org/wiki/Exponential_backoff + +*/ + +// + +/*! @page parallelstore_v1::ParallelstoreClient-retry-snippet Override parallelstore_v1::ParallelstoreClient Retry Policies + +This shows how to override the retry policies for parallelstore_v1::ParallelstoreClient: + +@snippet google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc custom-idempotency-policy + +*/ +// diff --git a/google/cloud/parallelstore/quickstart/.bazelrc b/google/cloud/parallelstore/quickstart/.bazelrc new file mode 100644 index 0000000000000..e676fbffccb52 --- /dev/null +++ b/google/cloud/parallelstore/quickstart/.bazelrc @@ -0,0 +1,30 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Use host-OS-specific config lines from bazelrc files. +build --enable_platform_specific_config=true + +# The project requires C++ >= 14. By default Bazel adds `-std=c++0x` which +# disables C++14 features, even if the compilers defaults to C++ >= 14 +build:linux --cxxopt=-std=c++14 +build:macos --cxxopt=-std=c++14 +# Protobuf and gRPC require (or soon will require) C++14 to compile the "host" +# targets, such as protoc and the grpc plugin. +build:linux --host_cxxopt=-std=c++14 +build:macos --host_cxxopt=-std=c++14 + +# Do not create the convenience links. They are inconvenient when the build +# runs inside a docker image or if one builds a quickstart and then builds +# the project separately. +build --experimental_convenience_symlinks=ignore diff --git a/google/cloud/parallelstore/quickstart/BUILD.bazel b/google/cloud/parallelstore/quickstart/BUILD.bazel new file mode 100644 index 0000000000000..6e6eb66137bad --- /dev/null +++ b/google/cloud/parallelstore/quickstart/BUILD.bazel @@ -0,0 +1,25 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # Apache 2.0 + +cc_binary( + name = "quickstart", + srcs = [ + "quickstart.cc", + ], + deps = [ + "@google_cloud_cpp//:parallelstore", + ], +) diff --git a/google/cloud/parallelstore/quickstart/CMakeLists.txt b/google/cloud/parallelstore/quickstart/CMakeLists.txt new file mode 100644 index 0000000000000..5ee2f7c319a69 --- /dev/null +++ b/google/cloud/parallelstore/quickstart/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# This file shows how to use the Parallelstore API C++ client library from a +# larger CMake project. + +cmake_minimum_required(VERSION 3.10...3.24) +project(google-cloud-cpp-parallelstore-quickstart CXX) + +find_package(google_cloud_cpp_parallelstore REQUIRED) + +# MSVC requires some additional code to select the correct runtime library +if (VCPKG_TARGET_TRIPLET MATCHES "-static$") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +else () + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") +endif () + +# Define your targets. +add_executable(quickstart quickstart.cc) +target_link_libraries(quickstart google-cloud-cpp::parallelstore) diff --git a/google/cloud/parallelstore/quickstart/Makefile b/google/cloud/parallelstore/quickstart/Makefile new file mode 100644 index 0000000000000..db2b39039ed99 --- /dev/null +++ b/google/cloud/parallelstore/quickstart/Makefile @@ -0,0 +1,35 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This is a minimal Makefile to show how to use the Parallelstore API C++ client +# for developers who use make(1) as their build system. + +# The CXX, CXXFLAGS and CXXLD variables are hard-coded. These values work for +# our tests, but applications would typically make them configurable parameters. +CXX=g++ +CXXFLAGS= +CXXLD=$(CXX) +BIN=. + +all: $(BIN)/quickstart + +# Configuration variables to compile and link against the Parallelstore API C++ +# client library. +CLIENT_MODULE := google_cloud_cpp_parallelstore +CLIENT_CXXFLAGS := $(shell pkg-config $(CLIENT_MODULE) --cflags) +CLIENT_CXXLDFLAGS := $(shell pkg-config $(CLIENT_MODULE) --libs-only-L) +CLIENT_LIBS := $(shell pkg-config $(CLIENT_MODULE) --libs-only-l) + +$(BIN)/quickstart: quickstart.cc + $(CXXLD) $(CXXFLAGS) $(CLIENT_CXXFLAGS) $(CLIENT_CXXLDFLAGS) -o $@ $^ $(CLIENT_LIBS) diff --git a/google/cloud/parallelstore/quickstart/README.md b/google/cloud/parallelstore/quickstart/README.md new file mode 100644 index 0000000000000..0f4ace51e9a41 --- /dev/null +++ b/google/cloud/parallelstore/quickstart/README.md @@ -0,0 +1,152 @@ +# HOWTO: using the Parallelstore API C++ client in your project + +This directory contains small examples showing how to use the Parallelstore API +C++ client library in your own project. These instructions assume that you have +some experience as a C++ developer and that you have a working C++ toolchain +(compiler, linker, etc.) installed on your platform. + +- Packaging maintainers or developers who prefer to install the library in a + fixed directory (such as `/usr/local` or `/opt`) should consult the + [packaging guide](/doc/packaging.md). +- Developers who prefer using a package manager such as + [vcpkg](https://vcpkg.io), or [Conda](https://conda.io), should follow the + instructions for their package manager. +- Developers wanting to use the libraries as part of a larger CMake or Bazel + project should consult the current document. Note that there are similar + documents for each library in their corresponding directories. +- Developers wanting to compile the library just to run some examples or tests + should consult the + [building and installing](/README.md#building-and-installing) section of the + top-level README file. +- Contributors and developers to `google-cloud-cpp` should consult the guide to + [set up a development workstation][howto-setup-dev-workstation]. + +## Before you begin + +To run the quickstart examples you will need a working Google Cloud Platform +(GCP) project. + +## Configuring authentication for the C++ Client Library + +Like most Google Cloud Platform (GCP) services, Parallelstore API requires that +your application authenticates with the service before accessing any data. If +you are not familiar with GCP authentication please take this opportunity to +review the [Authentication Overview][authentication-quickstart]. This library +uses the `GOOGLE_APPLICATION_CREDENTIALS` environment variable to find the +credentials file. For example: + +| Shell | Command | +| :----------------- | ------------------------------------------------------------------------------------ | +| Bash/zsh/ksh/etc. | `export GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | +| sh | `GOOGLE_APPLICATION_CREDENTIALS=[PATH];`
    `export GOOGLE_APPLICATION_CREDENTIALS` | +| csh/tsch | `setenv GOOGLE_APPLICATION_CREDENTIALS [PATH]` | +| Windows Powershell | `$env:GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | +| Windows cmd.exe | `set GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | + +Setting this environment variable is the recommended way to configure the +authentication preferences, though if the environment variable is not set, the +library searches for a credentials file in the same location as the +[Cloud SDK](https://cloud.google.com/sdk/). For more information about +*Application Default Credentials*, see +https://cloud.google.com/docs/authentication/production + +## Using with Bazel + +> :warning: If you are using Windows or macOS there are additional instructions +> at the end of this document. + +1. Install Bazel using [the instructions][bazel-install] from the `bazel.build` + website. + +1. Compile this example using Bazel: + + ```bash + cd $HOME/google-cloud-cpp/google/cloud/parallelstore/quickstart + bazel build ... + ``` + + Note that Bazel automatically downloads and compiles all dependencies of the + project. As it is often the case with C++ libraries, compiling these + dependencies may take several minutes. + +1. Run the example, changing the placeholder(s) to appropriate values: + + ```bash + bazel run :quickstart -- [...] + ``` + +## Using with CMake + +> :warning: If you are using Windows or macOS there are additional instructions +> at the end of this document. + +1. Install CMake. The package managers for most Linux distributions include a + package for CMake. Likewise, you can install CMake on Windows using a package + manager such as [chocolatey][choco-cmake-link], and on macOS using + [homebrew][homebrew-cmake-link]. You can also obtain the software directly + from the [cmake.org](https://cmake.org/download/). + +1. Install the dependencies with your favorite tools. As an example, if you use + [vcpkg](https://github.com/Microsoft/vcpkg.git): + + ```bash + cd $HOME/vcpkg + ./vcpkg install google-cloud-cpp[core,parallelstore] + ``` + + Note that, as it is often the case with C++ libraries, compiling these + dependencies may take several minutes. + +1. Configure CMake, if necessary, configure the directory where you installed + the dependencies: + + ```bash + cd $HOME/google-cloud-cpp/google/cloud/parallelstore/quickstart + cmake -S . -B .build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake + cmake --build .build + ``` + +1. Run the example, changing the placeholder(s) to appropriate values: + + ```bash + .build/quickstart [...] + ``` + +## Platform Specific Notes + +### macOS + +gRPC [requires][grpc-roots-pem-bug] an environment variable to configure the +trust store for SSL certificates, you can download and configure this using: + +```bash +curl -Lo roots.pem https://pki.google.com/roots.pem +export GRPC_DEFAULT_SSL_ROOTS_FILE_PATH="$PWD/roots.pem" +``` + +### Windows + +Bazel tends to create very long file names and paths. You may need to use a +short directory to store the build output, such as `c:\b`, and instruct Bazel to +use it via: + +```shell +bazel --output_user_root=c:\b build ... +``` + +gRPC [requires][grpc-roots-pem-bug] an environment variable to configure the +trust store for SSL certificates, you can download and configure this using: + +```console +@powershell -NoProfile -ExecutionPolicy unrestricted -Command ^ + (new-object System.Net.WebClient).Downloadfile( ^ + 'https://pki.google.com/roots.pem', 'roots.pem') +set GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=%cd%\roots.pem +``` + +[authentication-quickstart]: https://cloud.google.com/docs/authentication/getting-started "Authentication Getting Started" +[bazel-install]: https://docs.bazel.build/versions/main/install.html +[choco-cmake-link]: https://chocolatey.org/packages/cmake +[grpc-roots-pem-bug]: https://github.com/grpc/grpc/issues/16571 +[homebrew-cmake-link]: https://formulae.brew.sh/formula/cmake +[howto-setup-dev-workstation]: /doc/contributor/howto-guide-setup-development-workstation.md diff --git a/google/cloud/parallelstore/quickstart/WORKSPACE.bazel b/google/cloud/parallelstore/quickstart/WORKSPACE.bazel new file mode 100644 index 0000000000000..7d58527cff4ec --- /dev/null +++ b/google/cloud/parallelstore/quickstart/WORKSPACE.bazel @@ -0,0 +1,53 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# A minimal WORKSPACE file showing how to use the Parallelstore API +# C++ client library in Bazel-based projects. +workspace(name = "qs") + +# Add the necessary Starlark functions to fetch google-cloud-cpp. +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# Fetch the Google Cloud C++ libraries. +# NOTE: Update this version and SHA256 as needed. +http_archive( + name = "google_cloud_cpp", + sha256 = "170650b11ece54977b42dd85be648b6bd2d614ff68ea6863a0013865e576b49c", + strip_prefix = "google-cloud-cpp-2.30.0", + url = "https://github.com/googleapis/google-cloud-cpp/archive/v2.30.0.tar.gz", +) + +load("@google_cloud_cpp//bazel:workspace0.bzl", "gl_cpp_workspace0") + +gl_cpp_workspace0() + +load("@google_cloud_cpp//bazel:workspace1.bzl", "gl_cpp_workspace1") + +gl_cpp_workspace1() + +load("@google_cloud_cpp//bazel:workspace2.bzl", "gl_cpp_workspace2") + +gl_cpp_workspace2() + +load("@google_cloud_cpp//bazel:workspace3.bzl", "gl_cpp_workspace3") + +gl_cpp_workspace3() + +load("@google_cloud_cpp//bazel:workspace4.bzl", "gl_cpp_workspace4") + +gl_cpp_workspace4() + +load("@google_cloud_cpp//bazel:workspace5.bzl", "gl_cpp_workspace5") + +gl_cpp_workspace5() diff --git a/google/cloud/parallelstore/quickstart/quickstart.cc b/google/cloud/parallelstore/quickstart/quickstart.cc new file mode 100644 index 0000000000000..17053d0aae1cb --- /dev/null +++ b/google/cloud/parallelstore/quickstart/quickstart.cc @@ -0,0 +1,42 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! [all] +#include "google/cloud/parallelstore/v1/parallelstore_client.h" +#include "google/cloud/location.h" +#include + +int main(int argc, char* argv[]) try { + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " project-id zone-id\n"; + return 1; + } + + auto const location = google::cloud::Location(argv[1], argv[2]); + + namespace parallelstore = ::google::cloud::parallelstore_v1; + auto client = parallelstore::ParallelstoreClient( + parallelstore::MakeParallelstoreConnection()); + + for (auto r : client.ListInstances(location.FullName())) { + if (!r) throw std::move(r).status(); + std::cout << r->DebugString() << "\n"; + } + + return 0; +} catch (google::cloud::Status const& status) { + std::cerr << "google::cloud::Status thrown: " << status << "\n"; + return 1; +} +//! [all] diff --git a/google/cloud/parallelstore/v1/.repo-metadata.json b/google/cloud/parallelstore/v1/.repo-metadata.json new file mode 100644 index 0000000000000..0db9852e24ed8 --- /dev/null +++ b/google/cloud/parallelstore/v1/.repo-metadata.json @@ -0,0 +1,14 @@ +{ + "api_id": "parallelstore.googleapis.com", + "api_shortname": "parallelstore", + "client_documentation": "https://cloud.google.com/cpp/docs/reference/parallelstore/latest", + "distribution_name": "google-cloud-cpp", + "issue_tracker": "https://issuetracker.google.com/issues?q=componentid:1181190%20status=open", + "language": "cpp", + "library_type": "GAPIC_AUTO", + "name_pretty": "Parallelstore API", + "product_documentation": "https://cloud.google.com/parallelstore?hl=en", + "release_level": "stable", + "repo": "googleapis/google-cloud-cpp", + "requires_billing": true +} diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.cc b/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.cc new file mode 100644 index 0000000000000..10323642e0723 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.cc @@ -0,0 +1,281 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreAuth::ParallelstoreAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr +ParallelstoreAuth::ListInstances( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListInstances(context, options, request); +} + +StatusOr +ParallelstoreAuth::GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetInstance(context, options, request); +} + +future> +ParallelstoreAuth::AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncCreateInstance(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ParallelstoreAuth::CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateInstance(context, options, request); +} + +future> +ParallelstoreAuth::AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncUpdateInstance(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ParallelstoreAuth::UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateInstance(context, options, request); +} + +future> +ParallelstoreAuth::AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncDeleteInstance(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ParallelstoreAuth::DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteInstance(context, options, request); +} + +future> +ParallelstoreAuth::AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncImportData(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ParallelstoreAuth::ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ImportData(context, options, request); +} + +future> +ParallelstoreAuth::AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncExportData(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ParallelstoreAuth::ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ExportData(context, options, request); +} + +StatusOr +ParallelstoreAuth::ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListLocations(context, options, request); +} + +StatusOr ParallelstoreAuth::GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetLocation(context, options, request); +} + +StatusOr +ParallelstoreAuth::ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListOperations(context, options, request); +} + +StatusOr ParallelstoreAuth::GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetOperation(context, options, request); +} + +Status ParallelstoreAuth::DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteOperation(context, options, request); +} + +Status ParallelstoreAuth::CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CancelOperation(context, options, request); +} + +future> +ParallelstoreAuth::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncGetOperation(cq, *std::move(context), + std::move(options), request); + }); +} + +future ParallelstoreAuth::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) return make_ready_future(std::move(context).status()); + return child->AsyncCancelOperation(cq, *std::move(context), + std::move(options), request); + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h b/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h new file mode 100644 index 0000000000000..5362f8241c4b4 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h @@ -0,0 +1,158 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_AUTH_DECORATOR_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreAuth : public ParallelstoreStub { + public: + ~ParallelstoreAuth() override = default; + ParallelstoreAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) override; + + StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) override; + + StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) override; + + StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) override; + + StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_AUTH_DECORATOR_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.cc b/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.cc new file mode 100644 index 0000000000000..967111df25131 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.cc @@ -0,0 +1,711 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/async_long_running_operation.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get() + ->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get() + ->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr polling_policy(Options const& options) { + return options.get() + ->clone(); +} + +} // namespace + +ParallelstoreConnectionImpl::ParallelstoreConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions(std::move(options), + ParallelstoreConnection::options())) {} + +StreamRange +ParallelstoreConnectionImpl::ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListInstances(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) { + return stub->ListInstances(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::parallelstore::v1::ListInstancesResponse r) { + std::vector result( + r.instances().size()); + auto& messages = *r.mutable_instances(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ParallelstoreConnectionImpl::GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetInstance(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + return stub_->GetInstance(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->CreateInstance(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::parallelstore::v1::Instance>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) { + return stub->AsyncCreateInstance(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::Instance>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ParallelstoreConnectionImpl::CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateInstance(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) { + return stub_->CreateInstance(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::CreateInstance( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to CreateInstance", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::parallelstore::v1::Instance>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::Instance>, + polling_policy(*current), __func__); +} + +future> +ParallelstoreConnectionImpl::UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->UpdateInstance(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::parallelstore::v1::Instance>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) { + return stub->AsyncUpdateInstance(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::Instance>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ParallelstoreConnectionImpl::UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateInstance(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) { + return stub_->UpdateInstance(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::UpdateInstance( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to UpdateInstance", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::parallelstore::v1::Instance>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::Instance>, + polling_policy(*current), __func__); +} + +future> +ParallelstoreConnectionImpl::DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->DeleteInstance(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::parallelstore::v1::OperationMetadata>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) { + return stub->AsyncDeleteInstance(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultMetadata< + google::cloud::parallelstore::v1::OperationMetadata>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ParallelstoreConnectionImpl::DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteInstance(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) { + return stub_->DeleteInstance(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::DeleteInstance( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to DeleteInstance", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::parallelstore::v1::OperationMetadata>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultMetadata< + google::cloud::parallelstore::v1::OperationMetadata>, + polling_policy(*current), __func__); +} + +future> +ParallelstoreConnectionImpl::ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->ImportData(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::parallelstore::v1::ImportDataResponse>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return stub->AsyncImportData(cq, std::move(context), std::move(options), + request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::ImportDataResponse>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ParallelstoreConnectionImpl::ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->ImportData(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return stub_->ImportData(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::ImportData( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to ImportData", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::parallelstore::v1::ImportDataResponse>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::ImportDataResponse>, + polling_policy(*current), __func__); +} + +future> +ParallelstoreConnectionImpl::ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->ExportData(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::parallelstore::v1::ExportDataResponse>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return stub->AsyncExportData(cq, std::move(context), std::move(options), + request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::ExportDataResponse>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ParallelstoreConnectionImpl::ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->ExportData(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return stub_->ExportData(context, options, request); + }, + *current, request, __func__); +} + +future> +ParallelstoreConnectionImpl::ExportData( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to ExportData", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::parallelstore::v1::ExportDataResponse>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::parallelstore::v1::ExportDataResponse>, + polling_policy(*current), __func__); +} + +StreamRange +ParallelstoreConnectionImpl::ListLocations( + google::cloud::location::ListLocationsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListLocations(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::location::ListLocationsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub]( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + return stub->ListLocations(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::location::ListLocationsResponse r) { + std::vector result( + r.locations().size()); + auto& messages = *r.mutable_locations(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ParallelstoreConnectionImpl::GetLocation( + google::cloud::location::GetLocationRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetLocation(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + return stub_->GetLocation(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ParallelstoreConnectionImpl::ListOperations( + google::longrunning::ListOperationsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListOperations(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::longrunning::ListOperationsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + return stub->ListOperations(context, options, request); + }, + options, r, function_name); + }, + [](google::longrunning::ListOperationsResponse r) { + std::vector result( + r.operations().size()); + auto& messages = *r.mutable_operations(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ParallelstoreConnectionImpl::GetOperation( + google::longrunning::GetOperationRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetOperation(request), + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + return stub_->GetOperation(context, options, request); + }, + *current, request, __func__); +} + +Status ParallelstoreConnectionImpl::DeleteOperation( + google::longrunning::DeleteOperationRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteOperation(request), + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + return stub_->DeleteOperation(context, options, request); + }, + *current, request, __func__); +} + +Status ParallelstoreConnectionImpl::CancelOperation( + google::longrunning::CancelOperationRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CancelOperation(request), + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + return stub_->CancelOperation(context, options, request); + }, + *current, request, __func__); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h b/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h new file mode 100644 index 0000000000000..67df74ce9b456 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h @@ -0,0 +1,151 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_CONNECTION_IMPL_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h" +#include "google/cloud/parallelstore/v1/parallelstore_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreConnectionImpl + : public parallelstore_v1::ParallelstoreConnection { + public: + ~ParallelstoreConnectionImpl() override = default; + + ParallelstoreConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options); + + Options options() override { return options_; } + + StreamRange ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request) override; + + StatusOr GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> CreateInstance( + google::longrunning::Operation const& operation) override; + + future> UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> UpdateInstance( + google::longrunning::Operation const& operation) override; + + future> + DeleteInstance(google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) override; + + StatusOr DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> + DeleteInstance(google::longrunning::Operation const& operation) override; + + future> + ImportData(google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> + ImportData(google::longrunning::Operation const& operation) override; + + future> + ExportData(google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + future> + ExportData(google::longrunning::Operation const& operation) override; + + StreamRange ListLocations( + google::cloud::location::ListLocationsRequest request) override; + + StatusOr GetLocation( + google::cloud::location::GetLocationRequest const& request) override; + + StreamRange ListOperations( + google::longrunning::ListOperationsRequest request) override; + + StatusOr GetOperation( + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_CONNECTION_IMPL_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.cc b/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.cc new file mode 100644 index 0000000000000..396c455d71842 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.cc @@ -0,0 +1,325 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreLogging::ParallelstoreLogging( + std::shared_ptr child, TracingOptions tracing_options, + std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr +ParallelstoreLogging::ListInstances( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) { + return child_->ListInstances(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ParallelstoreLogging::GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + return child_->GetInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) { + return child_->AsyncCreateInstance(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr ParallelstoreLogging::CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) { + return child_->CreateInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) { + return child_->AsyncUpdateInstance(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr ParallelstoreLogging::UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) { + return child_->UpdateInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) { + return child_->AsyncDeleteInstance(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr ParallelstoreLogging::DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) { + return child_->DeleteInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return child_->AsyncImportData(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr ParallelstoreLogging::ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return child_->ImportData(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return child_->AsyncExportData(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr ParallelstoreLogging::ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return child_->ExportData(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ParallelstoreLogging::ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + return child_->ListLocations(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ParallelstoreLogging::GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + return child_->GetLocation(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ParallelstoreLogging::ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + return child_->ListOperations(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ParallelstoreLogging::GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + return child_->GetOperation(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ParallelstoreLogging::DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + return child_->DeleteOperation(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ParallelstoreLogging::CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + return child_->CancelOperation(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ParallelstoreLogging::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return child_->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +future ParallelstoreLogging::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return child_->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h b/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h new file mode 100644 index 0000000000000..c4c0be22ea79f --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h @@ -0,0 +1,158 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_LOGGING_DECORATOR_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreLogging : public ParallelstoreStub { + public: + ~ParallelstoreLogging() override = default; + ParallelstoreLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) override; + + StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) override; + + StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) override; + + StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) override; + + StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // ParallelstoreLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_LOGGING_DECORATOR_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.cc b/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.cc new file mode 100644 index 0000000000000..c24cd8f183469 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.cc @@ -0,0 +1,256 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreMetadata::ParallelstoreMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr +ParallelstoreMetadata::ListInstances( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListInstances(context, options, request); +} + +StatusOr +ParallelstoreMetadata::GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetInstance(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->AsyncCreateInstance(cq, std::move(context), std::move(options), + request); +} + +StatusOr ParallelstoreMetadata::CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateInstance(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("instance.name=", + internal::UrlEncode(request.instance().name()))); + return child_->AsyncUpdateInstance(cq, std::move(context), std::move(options), + request); +} + +StatusOr ParallelstoreMetadata::UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("instance.name=", + internal::UrlEncode(request.instance().name()))); + return child_->UpdateInstance(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncDeleteInstance(cq, std::move(context), std::move(options), + request); +} + +StatusOr ParallelstoreMetadata::DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteInstance(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncImportData(cq, std::move(context), std::move(options), + request); +} + +StatusOr ParallelstoreMetadata::ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->ImportData(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncExportData(cq, std::move(context), std::move(options), + request); +} + +StatusOr ParallelstoreMetadata::ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->ExportData(context, options, request); +} + +StatusOr +ParallelstoreMetadata::ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->ListLocations(context, options, request); +} + +StatusOr ParallelstoreMetadata::GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetLocation(context, options, request); +} + +StatusOr +ParallelstoreMetadata::ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->ListOperations(context, options, request); +} + +StatusOr ParallelstoreMetadata::GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetOperation(context, options, request); +} + +Status ParallelstoreMetadata::DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteOperation(context, options, request); +} + +Status ParallelstoreMetadata::CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->CancelOperation(context, options, request); +} + +future> +ParallelstoreMetadata::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncGetOperation(cq, std::move(context), std::move(options), + request); +} + +future ParallelstoreMetadata::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); +} + +void ParallelstoreMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void ParallelstoreMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h b/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h new file mode 100644 index 0000000000000..054af407012ac --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h @@ -0,0 +1,163 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_METADATA_DECORATOR_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreMetadata : public ParallelstoreStub { + public: + ~ParallelstoreMetadata() override = default; + ParallelstoreMetadata(std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) override; + + StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) override; + + StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) override; + + StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) override; + + StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_METADATA_DECORATOR_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.cc b/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.cc new file mode 100644 index 0000000000000..da7e6e1d05bb7 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.cc @@ -0,0 +1,81 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/parallelstore/v1/parallelstore_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options ParallelstoreDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_PARALLELSTORE_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_PARALLELSTORE_AUTHORITY", + "parallelstore.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + parallelstore_v1::ParallelstoreLimitedTimeRetryPolicy( + std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has()) { + options.set( + GenericPollingPolicy< + parallelstore_v1::ParallelstoreRetryPolicyOption::Type, + parallelstore_v1::ParallelstoreBackoffPolicyOption::Type>( + options.get() + ->clone(), + ExponentialBackoffPolicy(std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling) + .clone()) + .clone()); + } + if (!options.has< + parallelstore_v1::ParallelstoreConnectionIdempotencyPolicyOption>()) { + options + .set( + parallelstore_v1:: + MakeDefaultParallelstoreConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h b/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h new file mode 100644 index 0000000000000..7a4b2ff9d9277 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options ParallelstoreDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_OPTION_DEFAULTS_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h b/google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h new file mode 100644 index 0000000000000..60c65f71c2fd9 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct ParallelstoreRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_RETRY_TRAITS_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_sources.cc b/google/cloud/parallelstore/v1/internal/parallelstore_sources.cc new file mode 100644 index 0000000000000..91350ee68be09 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.cc" +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.cc" +#include "google/cloud/parallelstore/v1/parallelstore_client.cc" +#include "google/cloud/parallelstore/v1/parallelstore_connection.cc" +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_stub.cc b/google/cloud/parallelstore/v1/internal/parallelstore_stub.cc new file mode 100644 index 0000000000000..717ef8272406a --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_stub.cc @@ -0,0 +1,319 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreStub::~ParallelstoreStub() = default; + +StatusOr +DefaultParallelstoreStub::ListInstances( + grpc::ClientContext& context, Options const&, + google::cloud::parallelstore::v1::ListInstancesRequest const& request) { + google::cloud::parallelstore::v1::ListInstancesResponse response; + auto status = grpc_stub_->ListInstances(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultParallelstoreStub::GetInstance( + grpc::ClientContext& context, Options const&, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + google::cloud::parallelstore::v1::Instance response; + auto status = grpc_stub_->GetInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultParallelstoreStub::AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::parallelstore::v1::CreateInstanceRequest, + google::longrunning::Operation>( + cq, + [this](grpc::ClientContext* context, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncCreateInstance(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr +DefaultParallelstoreStub::CreateInstance( + grpc::ClientContext& context, Options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->CreateInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultParallelstoreStub::AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::parallelstore::v1::UpdateInstanceRequest, + google::longrunning::Operation>( + cq, + [this](grpc::ClientContext* context, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncUpdateInstance(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr +DefaultParallelstoreStub::UpdateInstance( + grpc::ClientContext& context, Options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->UpdateInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultParallelstoreStub::AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::parallelstore::v1::DeleteInstanceRequest, + google::longrunning::Operation>( + cq, + [this](grpc::ClientContext* context, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncDeleteInstance(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr +DefaultParallelstoreStub::DeleteInstance( + grpc::ClientContext& context, Options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->DeleteInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultParallelstoreStub::AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::parallelstore::v1::ImportDataRequest, + google::longrunning::Operation>( + cq, + [this](grpc::ClientContext* context, + google::cloud::parallelstore::v1::ImportDataRequest const& request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncImportData(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr DefaultParallelstoreStub::ImportData( + grpc::ClientContext& context, Options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->ImportData(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultParallelstoreStub::AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::parallelstore::v1::ExportDataRequest, + google::longrunning::Operation>( + cq, + [this](grpc::ClientContext* context, + google::cloud::parallelstore::v1::ExportDataRequest const& request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncExportData(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr DefaultParallelstoreStub::ExportData( + grpc::ClientContext& context, Options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->ExportData(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultParallelstoreStub::ListLocations( + grpc::ClientContext& context, Options const&, + google::cloud::location::ListLocationsRequest const& request) { + google::cloud::location::ListLocationsResponse response; + auto status = locations_stub_->ListLocations(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultParallelstoreStub::GetLocation( + grpc::ClientContext& context, Options const&, + google::cloud::location::GetLocationRequest const& request) { + google::cloud::location::Location response; + auto status = locations_stub_->GetLocation(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultParallelstoreStub::ListOperations( + grpc::ClientContext& context, Options const&, + google::longrunning::ListOperationsRequest const& request) { + google::longrunning::ListOperationsResponse response; + auto status = operations_stub_->ListOperations(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultParallelstoreStub::GetOperation( + grpc::ClientContext& context, Options const&, + google::longrunning::GetOperationRequest const& request) { + google::longrunning::Operation response; + auto status = operations_stub_->GetOperation(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultParallelstoreStub::DeleteOperation( + grpc::ClientContext& context, Options const&, + google::longrunning::DeleteOperationRequest const& request) { + google::protobuf::Empty response; + auto status = operations_stub_->DeleteOperation(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +Status DefaultParallelstoreStub::CancelOperation( + grpc::ClientContext& context, Options const&, + google::longrunning::CancelOperationRequest const& request) { + google::protobuf::Empty response; + auto status = operations_stub_->CancelOperation(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +future> +DefaultParallelstoreStub::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + // NOLINTNEXTLINE(performance-unnecessary-value-param) + google::cloud::internal::ImmutableOptions, + google::longrunning::GetOperationRequest const& request) { + return internal::MakeUnaryRpcImpl( + cq, + [this](grpc::ClientContext* context, + google::longrunning::GetOperationRequest const& request, + grpc::CompletionQueue* cq) { + return operations_->AsyncGetOperation(context, request, cq); + }, + request, std::move(context)); +} + +future DefaultParallelstoreStub::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + // NOLINTNEXTLINE(performance-unnecessary-value-param) + google::cloud::internal::ImmutableOptions, + google::longrunning::CancelOperationRequest const& request) { + return internal::MakeUnaryRpcImpl( + cq, + [this](grpc::ClientContext* context, + google::longrunning::CancelOperationRequest const& request, + grpc::CompletionQueue* cq) { + return operations_->AsyncCancelOperation(context, request, cq); + }, + request, std::move(context)) + .then([](future> f) { + return f.get().status(); + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_stub.h b/google/cloud/parallelstore/v1/internal/parallelstore_stub.h new file mode 100644 index 0000000000000..7fac500a8c8c3 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_stub.h @@ -0,0 +1,284 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_H + +#include "google/cloud/completion_queue.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreStub { + public: + virtual ~ParallelstoreStub() = 0; + + virtual StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) = 0; + + virtual StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) = 0; + + virtual future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) = 0; + + virtual StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& + request) = 0; + + virtual future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) = 0; + + virtual StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& + request) = 0; + + virtual future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) = 0; + + virtual StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) = 0; + + virtual future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) = 0; + + virtual StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) = 0; + + virtual future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) = 0; + + virtual StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) = 0; + + virtual StatusOr + ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) = 0; + + virtual StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) = 0; + + virtual StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) = 0; + + virtual StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) = 0; + + virtual Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) = 0; + + virtual Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) = 0; + + virtual future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) = 0; + + virtual future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) = 0; +}; + +class DefaultParallelstoreStub : public ParallelstoreStub { + public: + DefaultParallelstoreStub( + std::unique_ptr< + google::cloud::parallelstore::v1::Parallelstore::StubInterface> + grpc_stub, + std::unique_ptr + operations_stub, + std::unique_ptr + locations_stub, + std::unique_ptr + operations) + : grpc_stub_(std::move(grpc_stub)), + operations_stub_(std::move(operations_stub)), + locations_stub_(std::move(locations_stub)), + operations_(std::move(operations)) {} + + StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) override; + + StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) override; + + StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) override; + + StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) override; + + StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::unique_ptr< + google::cloud::parallelstore::v1::Parallelstore::StubInterface> + grpc_stub_; + std::unique_ptr + operations_stub_; + std::unique_ptr + locations_stub_; + std::unique_ptr operations_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.cc b/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.cc new file mode 100644 index 0000000000000..a3323056e221a --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.cc @@ -0,0 +1,80 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_auth_decorator.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_logging_decorator.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_metadata_decorator.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultParallelstoreStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::parallelstore::v1::Parallelstore::NewStub(channel); + auto service_operations_stub = + google::longrunning::Operations::NewStub(channel); + auto service_locations_stub = + google::cloud::location::Locations::NewStub(channel); + std::shared_ptr stub = + std::make_shared( + std::move(service_grpc_stub), std::move(service_operations_stub), + std::move(service_locations_stub), + google::longrunning::Operations::NewStub(channel)); + + if (auth->RequiresConfigureContext()) { + stub = + std::make_shared(std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeParallelstoreTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h b/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h new file mode 100644 index 0000000000000..1592ac83c20f5 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_FACTORY_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultParallelstoreStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_STUB_FACTORY_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.cc b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.cc new file mode 100644 index 0000000000000..cdbbb7ab50c45 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.cc @@ -0,0 +1,272 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/internal/traced_stream_range.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ParallelstoreTracingConnection::ParallelstoreTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +StreamRange +ParallelstoreTracingConnection::ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ListInstances"); + internal::OTelScope scope(span); + auto sr = child_->ListInstances(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::parallelstore::v1::Instance>(std::move(span), + std::move(sr)); +} + +StatusOr +ParallelstoreTracingConnection::GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::GetInstance"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetInstance(request)); +} + +future> +ParallelstoreTracingConnection::CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::CreateInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->CreateInstance(request)); +} + +StatusOr +ParallelstoreTracingConnection::CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::CreateInstance"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, + child_->CreateInstance(NoAwaitTag{}, request)); +} + +future> +ParallelstoreTracingConnection::CreateInstance( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::CreateInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->CreateInstance(operation)); +} + +future> +ParallelstoreTracingConnection::UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::UpdateInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->UpdateInstance(request)); +} + +StatusOr +ParallelstoreTracingConnection::UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::UpdateInstance"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, + child_->UpdateInstance(NoAwaitTag{}, request)); +} + +future> +ParallelstoreTracingConnection::UpdateInstance( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::UpdateInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->UpdateInstance(operation)); +} + +future> +ParallelstoreTracingConnection::DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::DeleteInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->DeleteInstance(request)); +} + +StatusOr +ParallelstoreTracingConnection::DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::DeleteInstance"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, + child_->DeleteInstance(NoAwaitTag{}, request)); +} + +future> +ParallelstoreTracingConnection::DeleteInstance( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::DeleteInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->DeleteInstance(operation)); +} + +future> +ParallelstoreTracingConnection::ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ImportData"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->ImportData(request)); +} + +StatusOr +ParallelstoreTracingConnection::ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ImportData"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, child_->ImportData(NoAwaitTag{}, request)); +} + +future> +ParallelstoreTracingConnection::ImportData( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ImportData"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->ImportData(operation)); +} + +future> +ParallelstoreTracingConnection::ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ExportData"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->ExportData(request)); +} + +StatusOr +ParallelstoreTracingConnection::ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ExportData"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, child_->ExportData(NoAwaitTag{}, request)); +} + +future> +ParallelstoreTracingConnection::ExportData( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ExportData"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), child_->ExportData(operation)); +} + +StreamRange +ParallelstoreTracingConnection::ListLocations( + google::cloud::location::ListLocationsRequest request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ListLocations"); + internal::OTelScope scope(span); + auto sr = child_->ListLocations(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr +ParallelstoreTracingConnection::GetLocation( + google::cloud::location::GetLocationRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::GetLocation"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetLocation(request)); +} + +StreamRange +ParallelstoreTracingConnection::ListOperations( + google::longrunning::ListOperationsRequest request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::ListOperations"); + internal::OTelScope scope(span); + auto sr = child_->ListOperations(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr +ParallelstoreTracingConnection::GetOperation( + google::longrunning::GetOperationRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::GetOperation"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetOperation(request)); +} + +Status ParallelstoreTracingConnection::DeleteOperation( + google::longrunning::DeleteOperationRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::DeleteOperation"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteOperation(request)); +} + +Status ParallelstoreTracingConnection::CancelOperation( + google::longrunning::CancelOperationRequest const& request) { + auto span = internal::MakeSpan( + "parallelstore_v1::ParallelstoreConnection::CancelOperation"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CancelOperation(request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeParallelstoreTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h new file mode 100644 index 0000000000000..8411ae6926808 --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h @@ -0,0 +1,149 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_CONNECTION_H + +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ParallelstoreTracingConnection + : public parallelstore_v1::ParallelstoreConnection { + public: + ~ParallelstoreTracingConnection() override = default; + + explicit ParallelstoreTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + StreamRange ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request) override; + + StatusOr GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> CreateInstance( + google::longrunning::Operation const& operation) override; + + future> UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> UpdateInstance( + google::longrunning::Operation const& operation) override; + + future> + DeleteInstance(google::cloud::parallelstore::v1::DeleteInstanceRequest const& + request) override; + + StatusOr DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> + DeleteInstance(google::longrunning::Operation const& operation) override; + + future> + ImportData(google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> + ImportData(google::longrunning::Operation const& operation) override; + + future> + ExportData(google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + future> + ExportData(google::longrunning::Operation const& operation) override; + + StreamRange ListLocations( + google::cloud::location::ListLocationsRequest request) override; + + StatusOr GetLocation( + google::cloud::location::GetLocationRequest const& request) override; + + StreamRange ListOperations( + google::longrunning::ListOperationsRequest request) override; + + StatusOr GetOperation( + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeParallelstoreTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_CONNECTION_H diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.cc b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.cc new file mode 100644 index 0000000000000..e8d5fb98533eb --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.cc @@ -0,0 +1,301 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ParallelstoreTracingStub::ParallelstoreTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr +ParallelstoreTracingStub::ListInstances( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ListInstances"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListInstances(context, options, request)); +} + +StatusOr +ParallelstoreTracingStub::GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "GetInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetInstance(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "CreateInstance"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = + child_->AsyncCreateInstance(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr +ParallelstoreTracingStub::CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "CreateInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateInstance(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "UpdateInstance"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = + child_->AsyncUpdateInstance(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr +ParallelstoreTracingStub::UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "UpdateInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateInstance(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "DeleteInstance"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = + child_->AsyncDeleteInstance(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr +ParallelstoreTracingStub::DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "DeleteInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteInstance(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ImportData"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = child_->AsyncImportData(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr ParallelstoreTracingStub::ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ImportData"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ImportData(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ExportData"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = child_->AsyncExportData(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr ParallelstoreTracingStub::ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ExportData"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ExportData(context, options, request)); +} + +StatusOr +ParallelstoreTracingStub::ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ListLocations"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListLocations(context, options, request)); +} + +StatusOr +ParallelstoreTracingStub::GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "GetLocation"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetLocation(context, options, request)); +} + +StatusOr +ParallelstoreTracingStub::ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "ListOperations"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListOperations(context, options, request)); +} + +StatusOr ParallelstoreTracingStub::GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "GetOperation"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetOperation(context, options, request)); +} + +Status ParallelstoreTracingStub::DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "DeleteOperation"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteOperation(context, options, request)); +} + +Status ParallelstoreTracingStub::CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.parallelstore.v1.Parallelstore", "CancelOperation"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CancelOperation(context, options, request)); +} + +future> +ParallelstoreTracingStub::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.longrunning.Operations", "GetOperation"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = child_->AsyncGetOperation(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +future ParallelstoreTracingStub::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + auto span = internal::MakeSpanGrpc("google.longrunning.Operations", + "CancelOperation"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = + child_->AsyncCancelOperation(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeParallelstoreTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h new file mode 100644 index 0000000000000..f47cc865e2ceb --- /dev/null +++ b/google/cloud/parallelstore/v1/internal/parallelstore_tracing_stub.h @@ -0,0 +1,169 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_STUB_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ParallelstoreTracingStub : public ParallelstoreStub { + public: + ~ParallelstoreTracingStub() override = default; + + explicit ParallelstoreTracingStub(std::shared_ptr child); + + StatusOr + ListInstances(grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::ListInstancesRequest const& + request) override; + + StatusOr GetInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::parallelstore::v1::GetInstanceRequest const& request) + override; + + future> AsyncCreateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + StatusOr CreateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request) + override; + + future> AsyncUpdateInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + StatusOr UpdateInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request) + override; + + future> AsyncDeleteInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + StatusOr DeleteInstance( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request) + override; + + future> AsyncImportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + StatusOr ImportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ImportDataRequest const& request) + override; + + future> AsyncExportData( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ExportData( + grpc::ClientContext& context, Options options, + google::cloud::parallelstore::v1::ExportDataRequest const& request) + override; + + StatusOr ListLocations( + grpc::ClientContext& context, Options const& options, + google::cloud::location::ListLocationsRequest const& request) override; + + StatusOr GetLocation( + grpc::ClientContext& context, Options const& options, + google::cloud::location::GetLocationRequest const& request) override; + + StatusOr ListOperations( + grpc::ClientContext& context, Options const& options, + google::longrunning::ListOperationsRequest const& request) override; + + StatusOr GetOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::GetOperationRequest const& request) override; + + Status DeleteOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::DeleteOperationRequest const& request) override; + + Status CancelOperation( + grpc::ClientContext& context, Options const& options, + google::longrunning::CancelOperationRequest const& request) override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeParallelstoreTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_INTERNAL_PARALLELSTORE_TRACING_STUB_H diff --git a/google/cloud/parallelstore/v1/mocks/mock_parallelstore_connection.h b/google/cloud/parallelstore/v1/mocks/mock_parallelstore_connection.h new file mode 100644 index 0000000000000..3cb66bf101176 --- /dev/null +++ b/google/cloud/parallelstore/v1/mocks/mock_parallelstore_connection.h @@ -0,0 +1,287 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_MOCKS_MOCK_PARALLELSTORE_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_MOCKS_MOCK_PARALLELSTORE_CONNECTION_H + +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `ParallelstoreConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `ParallelstoreClient`. To do so, + * construct an object of type `ParallelstoreClient` with an instance of this + * class. Then use the Google Test framework functions to program the behavior + * of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockParallelstoreConnection + : public parallelstore_v1::ParallelstoreConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD((StreamRange), + ListInstances, + (google::cloud::parallelstore::v1::ListInstancesRequest request), + (override)); + + MOCK_METHOD( + StatusOr, GetInstance, + (google::cloud::parallelstore::v1::GetInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// CreateInstance(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + CreateInstance, + (google::cloud::parallelstore::v1::CreateInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, CreateInstance(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, CreateInstance, + (NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, CreateInstance(Matcher(_))) + /// @endcode + MOCK_METHOD(future>, + CreateInstance, (google::longrunning::Operation const& operation), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// UpdateInstance(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + UpdateInstance, + (google::cloud::parallelstore::v1::UpdateInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, UpdateInstance(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, UpdateInstance, + (NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, UpdateInstance(Matcher(_))) + /// @endcode + MOCK_METHOD(future>, + UpdateInstance, (google::longrunning::Operation const& operation), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// DeleteInstance(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + DeleteInstance, + (google::cloud::parallelstore::v1::DeleteInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, DeleteInstance(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, DeleteInstance, + (NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, DeleteInstance(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + DeleteInstance, (google::longrunning::Operation const& operation), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// ImportData(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + ImportData, + (google::cloud::parallelstore::v1::ImportDataRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, ImportData(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, ImportData, + (NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, ImportData(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + ImportData, (google::longrunning::Operation const& operation), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// ExportData(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + ExportData, + (google::cloud::parallelstore::v1::ExportDataRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, ExportData(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, ExportData, + (NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, ExportData(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + ExportData, (google::longrunning::Operation const& operation), + (override)); + + MOCK_METHOD((StreamRange), ListLocations, + (google::cloud::location::ListLocationsRequest request), + (override)); + + MOCK_METHOD(StatusOr, GetLocation, + (google::cloud::location::GetLocationRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), ListOperations, + (google::longrunning::ListOperationsRequest request), (override)); + + MOCK_METHOD(StatusOr, GetOperation, + (google::longrunning::GetOperationRequest const& request), + (override)); + + MOCK_METHOD(Status, DeleteOperation, + (google::longrunning::DeleteOperationRequest const& request), + (override)); + + MOCK_METHOD(Status, CancelOperation, + (google::longrunning::CancelOperationRequest const& request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_MOCKS_MOCK_PARALLELSTORE_CONNECTION_H diff --git a/google/cloud/parallelstore/v1/parallelstore_client.cc b/google/cloud/parallelstore/v1/parallelstore_client.cc new file mode 100644 index 0000000000000..231b3901d09c6 --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_client.cc @@ -0,0 +1,317 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/parallelstore_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreClient::ParallelstoreClient( + std::shared_ptr connection, Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +ParallelstoreClient::~ParallelstoreClient() = default; + +StreamRange +ParallelstoreClient::ListInstances(std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::ListInstancesRequest request; + request.set_parent(parent); + return connection_->ListInstances(request); +} + +StreamRange +ParallelstoreClient::ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListInstances(std::move(request)); +} + +StatusOr +ParallelstoreClient::GetInstance(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::GetInstanceRequest request; + request.set_name(name); + return connection_->GetInstance(request); +} + +StatusOr +ParallelstoreClient::GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetInstance(request); +} + +future> +ParallelstoreClient::CreateInstance( + std::string const& parent, + google::cloud::parallelstore::v1::Instance const& instance, + std::string const& instance_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::CreateInstanceRequest request; + request.set_parent(parent); + *request.mutable_instance() = instance; + request.set_instance_id(instance_id); + return connection_->CreateInstance(request); +} + +StatusOr ParallelstoreClient::CreateInstance( + NoAwaitTag, std::string const& parent, + google::cloud::parallelstore::v1::Instance const& instance, + std::string const& instance_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::CreateInstanceRequest request; + request.set_parent(parent); + *request.mutable_instance() = instance; + request.set_instance_id(instance_id); + return connection_->CreateInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateInstance(request); +} + +StatusOr ParallelstoreClient::CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::CreateInstance( + google::longrunning::Operation const& operation, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateInstance(operation); +} + +future> +ParallelstoreClient::UpdateInstance( + google::cloud::parallelstore::v1::Instance const& instance, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::UpdateInstanceRequest request; + *request.mutable_instance() = instance; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateInstance(request); +} + +StatusOr ParallelstoreClient::UpdateInstance( + NoAwaitTag, google::cloud::parallelstore::v1::Instance const& instance, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::UpdateInstanceRequest request; + *request.mutable_instance() = instance; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateInstance(request); +} + +StatusOr ParallelstoreClient::UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::UpdateInstance( + google::longrunning::Operation const& operation, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateInstance(operation); +} + +future> +ParallelstoreClient::DeleteInstance(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::DeleteInstanceRequest request; + request.set_name(name); + return connection_->DeleteInstance(request); +} + +StatusOr ParallelstoreClient::DeleteInstance( + NoAwaitTag, std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::parallelstore::v1::DeleteInstanceRequest request; + request.set_name(name); + return connection_->DeleteInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteInstance(request); +} + +StatusOr ParallelstoreClient::DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteInstance(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::DeleteInstance( + google::longrunning::Operation const& operation, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteInstance(operation); +} + +future> +ParallelstoreClient::ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ImportData(request); +} + +StatusOr ParallelstoreClient::ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ImportData(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::ImportData(google::longrunning::Operation const& operation, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ImportData(operation); +} + +future> +ParallelstoreClient::ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ExportData(request); +} + +StatusOr ParallelstoreClient::ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ExportData(NoAwaitTag{}, request); +} + +future> +ParallelstoreClient::ExportData(google::longrunning::Operation const& operation, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ExportData(operation); +} + +StreamRange +ParallelstoreClient::ListLocations( + google::cloud::location::ListLocationsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListLocations(std::move(request)); +} + +StatusOr ParallelstoreClient::GetLocation( + google::cloud::location::GetLocationRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetLocation(request); +} + +StreamRange ParallelstoreClient::ListOperations( + std::string const& name, std::string const& filter, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::longrunning::ListOperationsRequest request; + request.set_name(name); + request.set_filter(filter); + return connection_->ListOperations(request); +} + +StreamRange ParallelstoreClient::ListOperations( + google::longrunning::ListOperationsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListOperations(std::move(request)); +} + +StatusOr ParallelstoreClient::GetOperation( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::longrunning::GetOperationRequest request; + request.set_name(name); + return connection_->GetOperation(request); +} + +StatusOr ParallelstoreClient::GetOperation( + google::longrunning::GetOperationRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetOperation(request); +} + +Status ParallelstoreClient::DeleteOperation(std::string const& name, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::longrunning::DeleteOperationRequest request; + request.set_name(name); + return connection_->DeleteOperation(request); +} + +Status ParallelstoreClient::DeleteOperation( + google::longrunning::DeleteOperationRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteOperation(request); +} + +Status ParallelstoreClient::CancelOperation(std::string const& name, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::longrunning::CancelOperationRequest request; + request.set_name(name); + return connection_->CancelOperation(request); +} + +Status ParallelstoreClient::CancelOperation( + google::longrunning::CancelOperationRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CancelOperation(request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/parallelstore_client.h b/google/cloud/parallelstore/v1/parallelstore_client.h new file mode 100644 index 0000000000000..32ad68bc96b68 --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_client.h @@ -0,0 +1,1094 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CLIENT_H + +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/no_await_tag.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// Service describing handlers for resources +/// Configures and manages parallelstore resources. +/// +/// Parallelstore service. +/// +/// The `parallelstore.googleapis.com` service implements the parallelstore API +/// and defines the following resource model for managing instances: +/// * The service works with a collection of cloud projects, named: +/// `/projects/*` +/// * Each project has a collection of available locations, named: +/// `/locations/*` +/// * Each location has a collection of instances named `/instances/*`. +/// * Parallelstore instances are resources of the form: +/// `/projects/{project_id}/locations/{location_id}/instances/{instance_id}` +/// +/// Note that location_id must be a Google Cloud `zone`; for example: +/// * `projects/12345/locations/us-central1-c/instances/my-parallelstore-share` +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class ParallelstoreClient { + public: + explicit ParallelstoreClient( + std::shared_ptr connection, Options opts = {}); + ~ParallelstoreClient(); + + ///@{ + /// @name Copy and move support + ParallelstoreClient(ParallelstoreClient const&) = default; + ParallelstoreClient& operator=(ParallelstoreClient const&) = default; + ParallelstoreClient(ParallelstoreClient&&) = default; + ParallelstoreClient& operator=(ParallelstoreClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(ParallelstoreClient const& a, + ParallelstoreClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(ParallelstoreClient const& a, + ParallelstoreClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Lists all instances in a given project and location. + /// + /// @param parent Required. The project and location for which to retrieve instance + /// information, in the format `projects/{project_id}/locations/{location}`. + /// @n + /// To retrieve instance information for all locations, use "-" as the value of + /// `{location}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.parallelstore.v1.Instance], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// [google.cloud.parallelstore.v1.ListInstancesRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L313} + /// + // clang-format on + StreamRange ListInstances( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// Lists all instances in a given project and location. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.ListInstancesRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.parallelstore.v1.Instance], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// [google.cloud.parallelstore.v1.ListInstancesRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L313} + /// + // clang-format on + StreamRange ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request, + Options opts = {}); + + // clang-format off + /// + /// Gets details of a single instance. + /// + /// @param name Required. The instance resource name, in the format + /// `projects/{project_id}/locations/{location}/instances/{instance_id}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.parallelstore.v1.Instance]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.GetInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L354} + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// + // clang-format on + StatusOr GetInstance( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Gets details of a single instance. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.GetInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.parallelstore.v1.Instance]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.GetInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L354} + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// + // clang-format on + StatusOr GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Creates a Parallelstore instance in a given project and location. + /// + /// @param parent Required. The instance's project and location, in the format + /// `projects/{project}/locations/{location}`. + /// Locations map to Google Cloud zones; for example, `us-west1-b`. + /// @param instance Required. The instance to create. + /// @param instance_id Required. The name of the Parallelstore instance. + /// @n + /// * Must contain only lowercase letters, numbers, and hyphens. + /// * Must start with a letter. + /// * Must be between 1-63 characters. + /// * Must end with a number or a letter. + /// * Must be unique within the customer project / location + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.Instance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.CreateInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L366} + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// + // clang-format on + future> CreateInstance( + std::string const& parent, + google::cloud::parallelstore::v1::Instance const& instance, + std::string const& instance_id, Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr CreateInstance( + NoAwaitTag, std::string const& parent, + google::cloud::parallelstore::v1::Instance const& instance, + std::string const& instance_id, Options opts = {}); + + // clang-format off + /// + /// Creates a Parallelstore instance in a given project and location. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.CreateInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.Instance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.CreateInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L366} + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// + // clang-format on + future> CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateInstance + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> CreateInstance( + google::longrunning::Operation const& operation, Options opts = {}); + + // clang-format off + /// + /// Updates the parameters of a single instance. + /// + /// @param instance Required. The instance to update. + /// @param update_mask Required. Mask of fields to update. Field mask is used to specify the + /// fields to be overwritten in the Instance resource by the update. At least + /// one path must be supplied in this field. The fields specified in the + /// update_mask are relative to the resource, not the full request. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.Instance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// [google.cloud.parallelstore.v1.UpdateInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L406} + /// + // clang-format on + future> UpdateInstance( + google::cloud::parallelstore::v1::Instance const& instance, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// @copybrief UpdateInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr UpdateInstance( + NoAwaitTag, google::cloud::parallelstore::v1::Instance const& instance, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Updates the parameters of a single instance. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.UpdateInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.Instance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.Instance]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L194} + /// [google.cloud.parallelstore.v1.UpdateInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L406} + /// + // clang-format on + future> UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief UpdateInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief UpdateInstance + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> UpdateInstance( + google::longrunning::Operation const& operation, Options opts = {}); + + // clang-format off + /// + /// Deletes a single instance. + /// + /// @param name Required. Name of the resource + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.OperationMetadata] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.DeleteInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L434} + /// [google.cloud.parallelstore.v1.OperationMetadata]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L460} + /// + // clang-format on + future> + DeleteInstance(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// @copybrief DeleteInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr DeleteInstance( + NoAwaitTag, std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Deletes a single instance. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.DeleteInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.OperationMetadata] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.DeleteInstanceRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L434} + /// [google.cloud.parallelstore.v1.OperationMetadata]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L460} + /// + // clang-format on + future> + DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief DeleteInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief DeleteInstance + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> + DeleteInstance(google::longrunning::Operation const& operation, + Options opts = {}); + + // clang-format off + /// + /// Copies data from Cloud Storage to Parallelstore. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.ImportDataRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.ImportDataResponse] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.ImportDataRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L520} + /// [google.cloud.parallelstore.v1.ImportDataResponse]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L637} + /// + // clang-format on + future> + ImportData(google::cloud::parallelstore::v1::ImportDataRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief ImportData + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief ImportData + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> + ImportData(google::longrunning::Operation const& operation, + Options opts = {}); + + // clang-format off + /// + /// Copies data from Parallelstore to Cloud Storage. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.parallelstore.v1.ExportDataRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.parallelstore.v1.ExportDataResponse] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.parallelstore.v1.ExportDataRequest]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L579} + /// [google.cloud.parallelstore.v1.ExportDataResponse]: @googleapis_reference_link{google/cloud/parallelstore/v1/parallelstore.proto#L673} + /// + // clang-format on + future> + ExportData(google::cloud::parallelstore::v1::ExportDataRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief ExportData + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief ExportData + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> + ExportData(google::longrunning::Operation const& operation, + Options opts = {}); + + // clang-format off + /// + /// Lists information about the supported locations for this service. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.location.ListLocationsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.location.Location], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.location.ListLocationsRequest]: @googleapis_reference_link{google/cloud/location/locations.proto#L58} + /// [google.cloud.location.Location]: @googleapis_reference_link{google/cloud/location/locations.proto#L88} + /// + // clang-format on + StreamRange ListLocations( + google::cloud::location::ListLocationsRequest request, Options opts = {}); + + // clang-format off + /// + /// Gets information about a location. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.location.GetLocationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.location.Location]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.location.GetLocationRequest]: @googleapis_reference_link{google/cloud/location/locations.proto#L82} + /// [google.cloud.location.Location]: @googleapis_reference_link{google/cloud/location/locations.proto#L88} + /// + // clang-format on + StatusOr GetLocation( + google::cloud::location::GetLocationRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Lists operations that match the specified filter in the request. If the + /// server doesn't support this method, it returns `UNIMPLEMENTED`. + /// + /// NOTE: the `name` binding allows API services to override the binding + /// to use different resource name schemes, such as `users/*/operations`. To + /// override the binding, API services can add a binding such as + /// `"/v1/{name=users/*}/operations"` to their service configuration. + /// For backwards compatibility, the default name includes the operations + /// collection id, however overriding users must ensure the name binding + /// is the parent resource, without the operations collection id. + /// + /// @param name The name of the operation's parent resource. + /// @param filter The standard list filter. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.longrunning.Operation], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.ListOperationsRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L171} + /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L128} + /// + // clang-format on + StreamRange ListOperations( + std::string const& name, std::string const& filter, Options opts = {}); + + // clang-format off + /// + /// Lists operations that match the specified filter in the request. If the + /// server doesn't support this method, it returns `UNIMPLEMENTED`. + /// + /// NOTE: the `name` binding allows API services to override the binding + /// to use different resource name schemes, such as `users/*/operations`. To + /// override the binding, API services can add a binding such as + /// `"/v1/{name=users/*}/operations"` to their service configuration. + /// For backwards compatibility, the default name includes the operations + /// collection id, however overriding users must ensure the name binding + /// is the parent resource, without the operations collection id. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.longrunning.ListOperationsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.longrunning.Operation], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.ListOperationsRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L171} + /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L128} + /// + // clang-format on + StreamRange ListOperations( + google::longrunning::ListOperationsRequest request, Options opts = {}); + + // clang-format off + /// + /// Gets the latest state of a long-running operation. Clients can use this + /// method to poll the operation result at intervals as recommended by the API + /// service. + /// + /// @param name The name of the operation resource. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.longrunning.Operation]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.GetOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L165} + /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L128} + /// + // clang-format on + StatusOr GetOperation(std::string const& name, + Options opts = {}); + + // clang-format off + /// + /// Gets the latest state of a long-running operation. Clients can use this + /// method to poll the operation result at intervals as recommended by the API + /// service. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.longrunning.GetOperationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.longrunning.Operation]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.GetOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L165} + /// [google.longrunning.Operation]: @googleapis_reference_link{google/longrunning/operations.proto#L128} + /// + // clang-format on + StatusOr GetOperation( + google::longrunning::GetOperationRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Deletes a long-running operation. This method indicates that the client is + /// no longer interested in the operation result. It does not cancel the + /// operation. If the server doesn't support this method, it returns + /// `google.rpc.Code.UNIMPLEMENTED`. + /// + /// @param name The name of the operation resource to be deleted. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.DeleteOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L201} + /// + // clang-format on + Status DeleteOperation(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Deletes a long-running operation. This method indicates that the client is + /// no longer interested in the operation result. It does not cancel the + /// operation. If the server doesn't support this method, it returns + /// `google.rpc.Code.UNIMPLEMENTED`. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.longrunning.DeleteOperationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.DeleteOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L201} + /// + // clang-format on + Status DeleteOperation( + google::longrunning::DeleteOperationRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Starts asynchronous cancellation on a long-running operation. The server + /// makes a best effort to cancel the operation, but success is not + /// guaranteed. If the server doesn't support this method, it returns + /// `google.rpc.Code.UNIMPLEMENTED`. Clients can use + /// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or + /// other methods to check whether the cancellation succeeded or whether the + /// operation completed despite cancellation. On successful cancellation, + /// the operation is not deleted; instead, it becomes an operation with + /// an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1, + /// corresponding to `Code.CANCELLED`. + /// + /// @param name The name of the operation resource to be cancelled. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.CancelOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L195} + /// [google.longrunning.Operation.error]: @googleapis_reference_link{google/longrunning/operations.proto#L150} + /// [google.longrunning.Operations.GetOperation]: @googleapis_reference_link{google/longrunning/operations.proto#L77} + /// [google.rpc.Status.code]: @googleapis_reference_link{google/rpc/status.proto#L38} + /// + // clang-format on + Status CancelOperation(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Starts asynchronous cancellation on a long-running operation. The server + /// makes a best effort to cancel the operation, but success is not + /// guaranteed. If the server doesn't support this method, it returns + /// `google.rpc.Code.UNIMPLEMENTED`. Clients can use + /// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or + /// other methods to check whether the cancellation succeeded or whether the + /// operation completed despite cancellation. On successful cancellation, + /// the operation is not deleted; instead, it becomes an operation with + /// an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1, + /// corresponding to `Code.CANCELLED`. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.longrunning.CancelOperationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.longrunning.CancelOperationRequest]: @googleapis_reference_link{google/longrunning/operations.proto#L195} + /// [google.longrunning.Operation.error]: @googleapis_reference_link{google/longrunning/operations.proto#L150} + /// [google.longrunning.Operations.GetOperation]: @googleapis_reference_link{google/longrunning/operations.proto#L77} + /// [google.rpc.Status.code]: @googleapis_reference_link{google/rpc/status.proto#L38} + /// + // clang-format on + Status CancelOperation( + google::longrunning::CancelOperationRequest const& request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CLIENT_H diff --git a/google/cloud/parallelstore/v1/parallelstore_connection.cc b/google/cloud/parallelstore/v1/parallelstore_connection.cc new file mode 100644 index 0000000000000..4cba0fb7dba8c --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_connection.cc @@ -0,0 +1,223 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_connection_impl.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_option_defaults.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_stub_factory.h" +#include "google/cloud/parallelstore/v1/internal/parallelstore_tracing_connection.h" +#include "google/cloud/parallelstore/v1/parallelstore_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ParallelstoreConnection::~ParallelstoreConnection() = default; + +StreamRange +ParallelstoreConnection::ListInstances( + google::cloud::parallelstore::v1:: + ListInstancesRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr +ParallelstoreConnection::GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +future> +ParallelstoreConnection::CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr +ParallelstoreConnection::CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::CreateInstance(google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr +ParallelstoreConnection::UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::UpdateInstance(google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr +ParallelstoreConnection::DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::DeleteInstance(google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr ParallelstoreConnection::ImportData( + NoAwaitTag, google::cloud::parallelstore::v1::ImportDataRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::ImportData(google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr ParallelstoreConnection::ExportData( + NoAwaitTag, google::cloud::parallelstore::v1::ExportDataRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ParallelstoreConnection::ExportData(google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StreamRange +ParallelstoreConnection::ListLocations( + google::cloud::location:: + ListLocationsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr +ParallelstoreConnection::GetLocation( + google::cloud::location::GetLocationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ParallelstoreConnection::ListOperations( + google::longrunning:: + ListOperationsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr ParallelstoreConnection::GetOperation( + google::longrunning::GetOperationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ParallelstoreConnection::DeleteOperation( + google::longrunning::DeleteOperationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ParallelstoreConnection::CancelOperation( + google::longrunning::CancelOperationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +std::shared_ptr MakeParallelstoreConnection( + Options options) { + internal::CheckExpectedOptions(options, + __func__); + options = parallelstore_v1_internal::ParallelstoreDefaultOptions( + std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = parallelstore_v1_internal::CreateDefaultParallelstoreStub( + std::move(auth), options); + return parallelstore_v1_internal::MakeParallelstoreTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/parallelstore_connection.h b/google/cloud/parallelstore/v1/parallelstore_connection.h new file mode 100644 index 0000000000000..d6b0e08010e8e --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_connection.h @@ -0,0 +1,298 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_H + +#include "google/cloud/parallelstore/v1/internal/parallelstore_retry_traits.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/future.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/no_await_tag.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `ParallelstoreConnection`. +class ParallelstoreRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `ParallelstoreConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ParallelstoreLimitedErrorCountRetryPolicy + : public ParallelstoreRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit ParallelstoreLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + ParallelstoreLimitedErrorCountRetryPolicy( + ParallelstoreLimitedErrorCountRetryPolicy&& rhs) noexcept + : ParallelstoreLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + ParallelstoreLimitedErrorCountRetryPolicy( + ParallelstoreLimitedErrorCountRetryPolicy const& rhs) noexcept + : ParallelstoreLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = ParallelstoreRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + parallelstore_v1_internal::ParallelstoreRetryTraits> + impl_; +}; + +/** + * A retry policy for `ParallelstoreConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ParallelstoreLimitedTimeRetryPolicy : public ParallelstoreRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit ParallelstoreLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + ParallelstoreLimitedTimeRetryPolicy( + ParallelstoreLimitedTimeRetryPolicy&& rhs) noexcept + : ParallelstoreLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + ParallelstoreLimitedTimeRetryPolicy( + ParallelstoreLimitedTimeRetryPolicy const& rhs) noexcept + : ParallelstoreLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = ParallelstoreRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + parallelstore_v1_internal::ParallelstoreRetryTraits> + impl_; +}; + +/** + * The `ParallelstoreConnection` object for `ParallelstoreClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `ParallelstoreClient`. This allows users to inject custom behavior + * (e.g., with a Google Mock object) when writing tests that use objects of type + * `ParallelstoreClient`. + * + * To create a concrete instance, see `MakeParallelstoreConnection()`. + * + * For mocking, see `parallelstore_v1_mocks::MockParallelstoreConnection`. + */ +class ParallelstoreConnection { + public: + virtual ~ParallelstoreConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StreamRange ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request); + + virtual StatusOr GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request); + + virtual future> + CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request); + + virtual StatusOr CreateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::CreateInstanceRequest const& request); + + virtual future> + CreateInstance(google::longrunning::Operation const& operation); + + virtual future> + UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request); + + virtual StatusOr UpdateInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request); + + virtual future> + UpdateInstance(google::longrunning::Operation const& operation); + + virtual future> + DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request); + + virtual StatusOr DeleteInstance( + NoAwaitTag, + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request); + + virtual future> + DeleteInstance(google::longrunning::Operation const& operation); + + virtual future> + ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const& request); + + virtual StatusOr ImportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ImportDataRequest const& request); + + virtual future> + ImportData(google::longrunning::Operation const& operation); + + virtual future> + ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const& request); + + virtual StatusOr ExportData( + NoAwaitTag, + google::cloud::parallelstore::v1::ExportDataRequest const& request); + + virtual future> + ExportData(google::longrunning::Operation const& operation); + + virtual StreamRange ListLocations( + google::cloud::location::ListLocationsRequest request); + + virtual StatusOr GetLocation( + google::cloud::location::GetLocationRequest const& request); + + virtual StreamRange ListOperations( + google::longrunning::ListOperationsRequest request); + + virtual StatusOr GetOperation( + google::longrunning::GetOperationRequest const& request); + + virtual Status DeleteOperation( + google::longrunning::DeleteOperationRequest const& request); + + virtual Status CancelOperation( + google::longrunning::CancelOperationRequest const& request); +}; + +/** + * A factory function to construct an object of type `ParallelstoreConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of ParallelstoreClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `ParallelstoreConnection`. Expected options are any of the types in + * the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::parallelstore_v1::ParallelstorePolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `ParallelstoreConnection` created by + * this function. + */ +std::shared_ptr MakeParallelstoreConnection( + Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_H diff --git a/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.cc b/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..573e3019ea9bd --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.cc @@ -0,0 +1,110 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +ParallelstoreConnectionIdempotencyPolicy:: + ~ParallelstoreConnectionIdempotencyPolicy() = default; + +std::unique_ptr +ParallelstoreConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::ListLocations( + google::cloud::location::ListLocationsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::GetLocation( + google::cloud::location::GetLocationRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::ListOperations( + google::longrunning::ListOperationsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::GetOperation( + google::longrunning::GetOperationRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::DeleteOperation( + google::longrunning::DeleteOperationRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ParallelstoreConnectionIdempotencyPolicy::CancelOperation( + google::longrunning::CancelOperationRequest const&) { + return Idempotency::kNonIdempotent; +} + +std::unique_ptr +MakeDefaultParallelstoreConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h b/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h new file mode 100644 index 0000000000000..a65d6359719e9 --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h @@ -0,0 +1,90 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ParallelstoreConnectionIdempotencyPolicy { + public: + virtual ~ParallelstoreConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() + const; + + virtual google::cloud::Idempotency ListInstances( + google::cloud::parallelstore::v1::ListInstancesRequest request); + + virtual google::cloud::Idempotency GetInstance( + google::cloud::parallelstore::v1::GetInstanceRequest const& request); + + virtual google::cloud::Idempotency CreateInstance( + google::cloud::parallelstore::v1::CreateInstanceRequest const& request); + + virtual google::cloud::Idempotency UpdateInstance( + google::cloud::parallelstore::v1::UpdateInstanceRequest const& request); + + virtual google::cloud::Idempotency DeleteInstance( + google::cloud::parallelstore::v1::DeleteInstanceRequest const& request); + + virtual google::cloud::Idempotency ImportData( + google::cloud::parallelstore::v1::ImportDataRequest const& request); + + virtual google::cloud::Idempotency ExportData( + google::cloud::parallelstore::v1::ExportDataRequest const& request); + + virtual google::cloud::Idempotency ListLocations( + google::cloud::location::ListLocationsRequest request); + + virtual google::cloud::Idempotency GetLocation( + google::cloud::location::GetLocationRequest const& request); + + virtual google::cloud::Idempotency ListOperations( + google::longrunning::ListOperationsRequest request); + + virtual google::cloud::Idempotency GetOperation( + google::longrunning::GetOperationRequest const& request); + + virtual google::cloud::Idempotency DeleteOperation( + google::longrunning::DeleteOperationRequest const& request); + + virtual google::cloud::Idempotency CancelOperation( + google::longrunning::CancelOperationRequest const& request); +}; + +std::unique_ptr +MakeDefaultParallelstoreConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/parallelstore/v1/parallelstore_options.h b/google/cloud/parallelstore/v1/parallelstore_options.h new file mode 100644 index 0000000000000..dbcb41d00cf3e --- /dev/null +++ b/google/cloud/parallelstore/v1/parallelstore_options.h @@ -0,0 +1,86 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_OPTIONS_H + +#include "google/cloud/parallelstore/v1/parallelstore_connection.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace parallelstore_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-parallelstore-options + */ +struct ParallelstoreRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-parallelstore-options + */ +struct ParallelstoreBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-parallelstore-options + */ +struct ParallelstoreConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the long-running operations + * polling policy. + * + * @ingroup google-cloud-parallelstore-options + */ +struct ParallelstorePollingPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to Parallelstore. + * + * @ingroup google-cloud-parallelstore-options + */ +using ParallelstorePolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace parallelstore_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_PARALLELSTORE_V1_PARALLELSTORE_OPTIONS_H diff --git a/google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc b/google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc new file mode 100644 index 0000000000000..d7677b198cd80 --- /dev/null +++ b/google/cloud/parallelstore/v1/samples/parallelstore_client_samples.cc @@ -0,0 +1,204 @@ +// Copyright 2024 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/parallelstore/v1/parallelstore.proto + +#include "google/cloud/parallelstore/v1/parallelstore_client.h" +#include "google/cloud/parallelstore/v1/parallelstore_connection_idempotency_policy.h" +#include "google/cloud/parallelstore/v1/parallelstore_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: parallelstore_v1::ParallelstoreClient +// lro-marker: true +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::parallelstore_v1::ParallelstoreClient( + google::cloud::parallelstore_v1::MakeParallelstoreConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy : public google::cloud::parallelstore_v1:: + ParallelstoreConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::parallelstore_v1::ParallelstoreConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::parallelstore_v1:: + ParallelstoreLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::parallelstore_v1::MakeParallelstoreConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::parallelstore_v1::ParallelstoreClient(connection); + auto c2 = google::cloud::parallelstore_v1::ParallelstoreClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::parallelstore_v1::ParallelstoreClient( + connection, + google::cloud::Options{} + .set( + google::cloud::parallelstore_v1:: + ParallelstoreLimitedTimeRetryPolicy(std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::parallelstore_v1::ParallelstoreLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void SetPollingPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-policy-policy"}; + } + //! [set-polling-policy] + + // The polling policy controls how the client waits for long-running + // operations. `GenericPollingPolicy<>` combines existing policies. + // In this case, keep polling until the operation completes (with success + // or error) or 45 minutes, whichever happens first. Initially pause for + // 10 seconds between polling requests, increasing the pause by a factor + // of 4 until it becomes 2 minutes. + auto options = + google::cloud::Options{} + .set( + google::cloud::GenericPollingPolicy< + google::cloud::parallelstore_v1:: + ParallelstoreRetryPolicyOption::Type, + google::cloud::parallelstore_v1:: + ParallelstoreBackoffPolicyOption::Type>( + google::cloud::parallelstore_v1:: + ParallelstoreLimitedTimeRetryPolicy( + /*maximum_duration=*/std::chrono::minutes(45)) + .clone(), + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::seconds(10), + /*maximum_delay=*/std::chrono::minutes(2), + /*scaling=*/4.0) + .clone()) + .clone()); + + auto connection = + google::cloud::parallelstore_v1::MakeParallelstoreConnection(options); + + // c1 and c2 share the same polling policies. + auto c1 = google::cloud::parallelstore_v1::ParallelstoreClient(connection); + auto c2 = google::cloud::parallelstore_v1::ParallelstoreClient(connection); + //! [set-polling-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::parallelstore_v1::ParallelstoreClient( + google::cloud::parallelstore_v1::MakeParallelstoreConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning SetPollingPolicy() example" << std::endl; + SetPollingPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"set-polling-policy", SetPollingPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/libraries.bzl b/libraries.bzl index 333eeb09ec74e..b7a967d421c46 100644 --- a/libraries.bzl +++ b/libraries.bzl @@ -187,6 +187,7 @@ GOOGLE_CLOUD_CPP_GA_LIBRARIES = [ "orgpolicy", "osconfig", "oslogin", + "parallelstore", "policysimulator", "policytroubleshooter", "privateca", From da6d5f17af12314fd8ac8ed06c7d7c19e4f0e027 Mon Sep 17 00:00:00 2001 From: Darren Bolduc Date: Thu, 31 Oct 2024 11:12:46 -0400 Subject: [PATCH 2/5] refactor: prepare to parse ADC json from string (#14810) --- .../internal/oauth2_google_credentials.cc | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/google/cloud/internal/oauth2_google_credentials.cc b/google/cloud/internal/oauth2_google_credentials.cc index 2968b095b7445..3bd5b45189ec8 100644 --- a/google/cloud/internal/oauth2_google_credentials.cc +++ b/google/cloud/internal/oauth2_google_credentials.cc @@ -36,6 +36,43 @@ namespace oauth2_internal { GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN namespace { +StatusOr> LoadCredsFromString( + std::string const& contents, std::string const& path, + Options const& options, HttpClientFactory client_factory) { + auto const cred_json = nlohmann::json::parse(contents, nullptr, false); + auto const cred_type = cred_json.value("type", "no type given"); + // If non_service_account_ok==false and the cred_type is authorized_user, + // we'll return "Unsupported credential type (authorized_user)". + if (cred_type == "authorized_user") { + auto info = ParseAuthorizedUserCredentials(contents, path); + if (!info) return std::move(info).status(); + return std::unique_ptr( + std::make_unique(*info, options, + std::move(client_factory))); + } + if (cred_type == "external_account") { + auto info = + ParseExternalAccountConfiguration(contents, internal::ErrorContext{}); + if (!info) return std::move(info).status(); + return std::unique_ptr( + std::make_unique( + *std::move(info), std::move(client_factory), options)); + } + if (cred_type == "service_account") { + auto info = ParseServiceAccountCredentials(contents, path); + if (!info) return std::move(info).status(); + return std::unique_ptr( + std::make_unique(*info, options, + std::move(client_factory))); + } + return internal::InvalidArgumentError( + "Unsupported credential type (" + cred_type + + ") when reading Application Default Credentials file " + "from " + + path + ".", + GCP_ERROR_INFO()); +} + // Parses the JSON at `path` and creates the appropriate // Credentials type. // @@ -72,37 +109,8 @@ StatusOr> LoadCredsFromPath( std::make_unique(*info, options, std::move(client_factory))); } - auto const cred_type = cred_json.value("type", "no type given"); - // If non_service_account_ok==false and the cred_type is authorized_user, - // we'll return "Unsupported credential type (authorized_user)". - if (cred_type == "authorized_user") { - auto info = ParseAuthorizedUserCredentials(contents, path); - if (!info) return std::move(info).status(); - return std::unique_ptr( - std::make_unique(*info, options, - std::move(client_factory))); - } - if (cred_type == "external_account") { - auto info = - ParseExternalAccountConfiguration(contents, internal::ErrorContext{}); - if (!info) return std::move(info).status(); - return std::unique_ptr( - std::make_unique( - *std::move(info), std::move(client_factory), options)); - } - if (cred_type == "service_account") { - auto info = ParseServiceAccountCredentials(contents, path); - if (!info) return std::move(info).status(); - return std::unique_ptr( - std::make_unique(*info, options, - std::move(client_factory))); - } - return internal::InvalidArgumentError( - "Unsupported credential type (" + cred_type + - ") when reading Application Default Credentials file " - "from " + - path + ".", - GCP_ERROR_INFO()); + return LoadCredsFromString(contents, path, options, + std::move(client_factory)); } // Tries to load the file at the path specified by the value of the Application From fd826f14730898074b487b30f46f250e6639c3a6 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 31 Oct 2024 16:36:21 +0100 Subject: [PATCH 3/5] chore(deps): update dependency build_bazel_rules_apple to v3.11.2 (#14802) --- bazel/workspace0.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bazel/workspace0.bzl b/bazel/workspace0.bzl index f3f6e65e6b733..1e11afc5b4852 100644 --- a/bazel/workspace0.bzl +++ b/bazel/workspace0.bzl @@ -82,9 +82,9 @@ def gl_cpp_workspace0(name = None): http_archive, name = "build_bazel_rules_apple", urls = [ - "https://github.com/bazelbuild/rules_apple/releases/download/3.9.2/rules_apple.3.9.2.tar.gz", + "https://github.com/bazelbuild/rules_apple/releases/download/3.11.2/rules_apple.3.11.2.tar.gz", ], - sha256 = "86025f64d723a66438787d089bea4a7bc387877229f927dcb72ee26a8db96917", + sha256 = "b770067261140c0a3c5f84f900e3d6059d7036d7954da243016acfdb17216799", ) # Load Abseil From d58ddd2a8dbdc17b3031c7d97ed6f42f7ac306fb Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Thu, 31 Oct 2024 12:04:26 -0400 Subject: [PATCH 4/5] impl(compute): remove FutureReservationsClient as the service is not GA (#14812) --- CHANGELOG.md | 2 + ci/etc/expected_install_directories | 4 - generator/generator_config.textproto | 9 - .../compute/doc/environment-variables.dox | 4 - google/cloud/compute/doc/main.dox | 1 - .../compute/doc/override-authentication.dox | 7 - .../cloud/compute/doc/override-endpoint.dox | 7 - .../compute/doc/override-retry-policies.dox | 13 - .../v1/future_reservations_client.cc | 324 ------- .../v1/future_reservations_client.h | 828 ------------------ .../v1/future_reservations_connection.cc | 167 ---- .../v1/future_reservations_connection.h | 264 ------ ...ervations_connection_idempotency_policy.cc | 92 -- ...servations_connection_idempotency_policy.h | 77 -- .../v1/future_reservations_options.h | 87 -- .../v1/future_reservations_rest_connection.cc | 61 -- .../v1/future_reservations_rest_connection.h | 66 -- .../future_reservations_option_defaults.cc | 90 -- .../future_reservations_option_defaults.h | 37 - ...uture_reservations_rest_connection_impl.cc | 676 -------------- ...future_reservations_rest_connection_impl.h | 166 ---- ...ure_reservations_rest_logging_decorator.cc | 259 ------ ...ture_reservations_rest_logging_decorator.h | 147 ---- ...re_reservations_rest_metadata_decorator.cc | 188 ---- ...ure_reservations_rest_metadata_decorator.h | 149 ---- .../internal/future_reservations_rest_stub.cc | 416 --------- .../internal/future_reservations_rest_stub.h | 248 ------ .../future_reservations_rest_stub_factory.cc | 56 -- .../future_reservations_rest_stub_factory.h | 40 - .../future_reservations_retry_traits.h | 43 - .../internal/future_reservations_sources.cc | 31 - .../future_reservations_tracing_connection.cc | 233 ----- .../future_reservations_tracing_connection.h | 135 --- .../mock_future_reservations_connection.h | 241 ----- .../future_reservations_client_samples.cc | 220 ----- google/cloud/compute/service_dirs.bzl | 1 - google/cloud/compute/service_dirs.cmake | 1 - 37 files changed, 2 insertions(+), 5388 deletions(-) delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_client.cc delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_client.h delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_connection.cc delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_connection.h delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.cc delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_options.h delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.cc delete mode 100644 google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_sources.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.cc delete mode 100644 google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h delete mode 100644 google/cloud/compute/future_reservations/v1/mocks/mock_future_reservations_connection.h delete mode 100644 google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c3dbfaff47ae..02cf5bb71c3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ breaking changes in the upcoming 3.x release. This release is scheduled for - [AI Platform API](/google/cloud/aiplatform/README.md) - new `EvaluationServiceClient` +- [Compute Engine](/google/cloud/compute/README.md) + - `FutureReservationsClient` has been removed as the service is not GA. - [Dialogflow ES API](/google/cloud/dialogflow_es/README.md) - new `EncryptionSpecServiceClient` and `GeneratorsClient` diff --git a/ci/etc/expected_install_directories b/ci/etc/expected_install_directories index 126ccb820a260..0aabc17ad1ad1 100644 --- a/ci/etc/expected_install_directories +++ b/ci/etc/expected_install_directories @@ -256,10 +256,6 @@ ./include/google/cloud/compute/forwarding_rules/v1 ./include/google/cloud/compute/forwarding_rules/v1/internal ./include/google/cloud/compute/forwarding_rules/v1/mocks -./include/google/cloud/compute/future_reservations -./include/google/cloud/compute/future_reservations/v1 -./include/google/cloud/compute/future_reservations/v1/internal -./include/google/cloud/compute/future_reservations/v1/mocks ./include/google/cloud/compute/global_addresses ./include/google/cloud/compute/global_addresses/v1 ./include/google/cloud/compute/global_addresses/v1/internal diff --git a/generator/generator_config.textproto b/generator/generator_config.textproto index 5bbbb81cc1864..3dbc83dedd438 100644 --- a/generator/generator_config.textproto +++ b/generator/generator_config.textproto @@ -1655,15 +1655,6 @@ discovery_products { generate_grpc_transport: false } - rest_services { - service_proto_path: "google/cloud/compute/future_reservations/v1/future_reservations.proto" - product_path: "google/cloud/compute/future_reservations/v1" - initial_copyright_year: "2024" - retryable_status_codes: ["kUnavailable"] - generate_rest_transport: true - generate_grpc_transport: false - } - # update_discovery_doc.sh additions } diff --git a/google/cloud/compute/doc/environment-variables.dox b/google/cloud/compute/doc/environment-variables.dox index 80a283bf1b1cf..2bbc211603a0a 100644 --- a/google/cloud/compute/doc/environment-variables.dox +++ b/google/cloud/compute/doc/environment-variables.dox @@ -54,10 +54,6 @@ environment variables are convenient when troubleshooting problems. `EndpointOption` (which defaults to "compute.googleapis.com") used by `MakeForwardingRulesConnection()`. -- `GOOGLE_CLOUD_CPP_FUTURE_RESERVATIONS_ENDPOINT=...` overrides the - `EndpointOption` (which defaults to "compute.googleapis.com") - used by `MakeFutureReservationsConnection()`. - - `GOOGLE_CLOUD_CPP_GLOBAL_ADDRESSES_ENDPOINT=...` overrides the `EndpointOption` (which defaults to "compute.googleapis.com") used by `MakeGlobalAddressesConnection()`. diff --git a/google/cloud/compute/doc/main.dox b/google/cloud/compute/doc/main.dox index 162dc868e1c5a..a3ceceb95d2a5 100644 --- a/google/cloud/compute/doc/main.dox +++ b/google/cloud/compute/doc/main.dox @@ -42,7 +42,6 @@ application. - [\c compute_firewall_policies_v1::FirewallPoliciesClient](@ref google::cloud::compute_firewall_policies_v1::FirewallPoliciesClient) - [\c compute_firewalls_v1::FirewallsClient](@ref google::cloud::compute_firewalls_v1::FirewallsClient) - [\c compute_forwarding_rules_v1::ForwardingRulesClient](@ref google::cloud::compute_forwarding_rules_v1::ForwardingRulesClient) -- [\c compute_future_reservations_v1::FutureReservationsClient](@ref google::cloud::compute_future_reservations_v1::FutureReservationsClient) - [\c compute_global_addresses_v1::GlobalAddressesClient](@ref google::cloud::compute_global_addresses_v1::GlobalAddressesClient) - [\c compute_global_forwarding_rules_v1::GlobalForwardingRulesClient](@ref google::cloud::compute_global_forwarding_rules_v1::GlobalForwardingRulesClient) - [\c compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient](@ref google::cloud::compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient) diff --git a/google/cloud/compute/doc/override-authentication.dox b/google/cloud/compute/doc/override-authentication.dox index f6c260a0d6bf0..91b736a41b9db 100644 --- a/google/cloud/compute/doc/override-authentication.dox +++ b/google/cloud/compute/doc/override-authentication.dox @@ -24,7 +24,6 @@ Follow these links to find examples for other \c *Client classes: - [\c compute_firewall_policies_v1::FirewallPoliciesClient](@ref compute_firewall_policies_v1::FirewallPoliciesClient-service-account-snippet) - [\c compute_firewalls_v1::FirewallsClient](@ref compute_firewalls_v1::FirewallsClient-service-account-snippet) - [\c compute_forwarding_rules_v1::ForwardingRulesClient](@ref compute_forwarding_rules_v1::ForwardingRulesClient-service-account-snippet) -- [\c compute_future_reservations_v1::FutureReservationsClient](@ref compute_future_reservations_v1::FutureReservationsClient-service-account-snippet) - [\c compute_global_addresses_v1::GlobalAddressesClient](@ref compute_global_addresses_v1::GlobalAddressesClient-service-account-snippet) - [\c compute_global_forwarding_rules_v1::GlobalForwardingRulesClient](@ref compute_global_forwarding_rules_v1::GlobalForwardingRulesClient-service-account-snippet) - [\c compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient](@ref compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient-service-account-snippet) @@ -197,12 +196,6 @@ guide for more details. */ -/*! @page compute_future_reservations_v1::FutureReservationsClient-service-account-snippet Override compute_future_reservations_v1::FutureReservationsClient Authentication Defaults - -@snippet google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc with-service-account - -*/ - /*! @page compute_global_addresses_v1::GlobalAddressesClient-service-account-snippet Override compute_global_addresses_v1::GlobalAddressesClient Authentication Defaults @snippet google/cloud/compute/global_addresses/v1/samples/global_addresses_client_samples.cc with-service-account diff --git a/google/cloud/compute/doc/override-endpoint.dox b/google/cloud/compute/doc/override-endpoint.dox index b9d045d83ecbd..dc55257213df0 100644 --- a/google/cloud/compute/doc/override-endpoint.dox +++ b/google/cloud/compute/doc/override-endpoint.dox @@ -24,7 +24,6 @@ Follow these links to find examples for other \c *Client classes: - [\c compute_firewall_policies_v1::FirewallPoliciesClient](@ref compute_firewall_policies_v1::FirewallPoliciesClient-endpoint-snippet) - [\c compute_firewalls_v1::FirewallsClient](@ref compute_firewalls_v1::FirewallsClient-endpoint-snippet) - [\c compute_forwarding_rules_v1::ForwardingRulesClient](@ref compute_forwarding_rules_v1::ForwardingRulesClient-endpoint-snippet) -- [\c compute_future_reservations_v1::FutureReservationsClient](@ref compute_future_reservations_v1::FutureReservationsClient-endpoint-snippet) - [\c compute_global_addresses_v1::GlobalAddressesClient](@ref compute_global_addresses_v1::GlobalAddressesClient-endpoint-snippet) - [\c compute_global_forwarding_rules_v1::GlobalForwardingRulesClient](@ref compute_global_forwarding_rules_v1::GlobalForwardingRulesClient-endpoint-snippet) - [\c compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient](@ref compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient-endpoint-snippet) @@ -187,12 +186,6 @@ Follow these links to find examples for other \c *Client classes: */ -/*! @page compute_future_reservations_v1::FutureReservationsClient-endpoint-snippet Override compute_future_reservations_v1::FutureReservationsClient Endpoint Configuration - -@snippet google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc set-client-endpoint - -*/ - /*! @page compute_global_addresses_v1::GlobalAddressesClient-endpoint-snippet Override compute_global_addresses_v1::GlobalAddressesClient Endpoint Configuration @snippet google/cloud/compute/global_addresses/v1/samples/global_addresses_client_samples.cc set-client-endpoint diff --git a/google/cloud/compute/doc/override-retry-policies.dox b/google/cloud/compute/doc/override-retry-policies.dox index db892923eb6cf..f4d8c845eca5d 100644 --- a/google/cloud/compute/doc/override-retry-policies.dox +++ b/google/cloud/compute/doc/override-retry-policies.dox @@ -90,7 +90,6 @@ Follow these links to find examples for other \c *Client classes: - [\c compute_firewall_policies_v1::FirewallPoliciesClient](@ref compute_firewall_policies_v1::FirewallPoliciesClient-retry-snippet) - [\c compute_firewalls_v1::FirewallsClient](@ref compute_firewalls_v1::FirewallsClient-retry-snippet) - [\c compute_forwarding_rules_v1::ForwardingRulesClient](@ref compute_forwarding_rules_v1::ForwardingRulesClient-retry-snippet) -- [\c compute_future_reservations_v1::FutureReservationsClient](@ref compute_future_reservations_v1::FutureReservationsClient-retry-snippet) - [\c compute_global_addresses_v1::GlobalAddressesClient](@ref compute_global_addresses_v1::GlobalAddressesClient-retry-snippet) - [\c compute_global_forwarding_rules_v1::GlobalForwardingRulesClient](@ref compute_global_forwarding_rules_v1::GlobalForwardingRulesClient-retry-snippet) - [\c compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient](@ref compute_global_network_endpoint_groups_v1::GlobalNetworkEndpointGroupsClient-retry-snippet) @@ -327,18 +326,6 @@ Assuming you have created a custom idempotency policy. Such as: */ -/*! @page compute_future_reservations_v1::FutureReservationsClient-retry-snippet Override compute_future_reservations_v1::FutureReservationsClient Retry Policies - -This shows how to override the retry policies for compute_future_reservations_v1::FutureReservationsClient: - -@snippet google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc set-retry-policy - -Assuming you have created a custom idempotency policy. Such as: - -@snippet google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc custom-idempotency-policy - -*/ - /*! @page compute_global_addresses_v1::GlobalAddressesClient-retry-snippet Override compute_global_addresses_v1::GlobalAddressesClient Retry Policies This shows how to override the retry policies for compute_global_addresses_v1::GlobalAddressesClient: diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_client.cc b/google/cloud/compute/future_reservations/v1/future_reservations_client.cc deleted file mode 100644 index 7edd65aa17d42..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_client.cc +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/future_reservations_client.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -FutureReservationsClient::FutureReservationsClient( - std::shared_ptr connection, Options opts) - : connection_(std::move(connection)), - options_( - internal::MergeOptions(std::move(opts), connection_->options())) {} -FutureReservationsClient::~FutureReservationsClient() = default; - -StreamRange> -FutureReservationsClient::AggregatedListFutureReservations( - std::string const& project, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request; - request.set_project(project); - return connection_->AggregatedListFutureReservations(request); -} - -StreamRange> -FutureReservationsClient::AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->AggregatedListFutureReservations(std::move(request)); -} - -future> -FutureReservationsClient::Cancel(std::string const& project, - std::string const& zone, - std::string const& future_reservation, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1::CancelRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - return connection_->Cancel(request); -} - -StatusOr -FutureReservationsClient::Cancel(NoAwaitTag, std::string const& project, - std::string const& zone, - std::string const& future_reservation, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1::CancelRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - return connection_->Cancel(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->Cancel(request); -} - -StatusOr -FutureReservationsClient::Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->Cancel(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::Cancel( - google::cloud::cpp::compute::v1::Operation const& operation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->Cancel(operation); -} - -future> -FutureReservationsClient::DeleteFutureReservation( - std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - return connection_->DeleteFutureReservation(request); -} - -StatusOr -FutureReservationsClient::DeleteFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - return connection_->DeleteFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->DeleteFutureReservation(request); -} - -StatusOr -FutureReservationsClient::DeleteFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->DeleteFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->DeleteFutureReservation(operation); -} - -StatusOr -FutureReservationsClient::GetFutureReservation( - std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - return connection_->GetFutureReservation(request); -} - -StatusOr -FutureReservationsClient::GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->GetFutureReservation(request); -} - -future> -FutureReservationsClient::InsertFutureReservation( - std::string const& project, std::string const& zone, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - *request.mutable_future_reservation_resource() = future_reservation_resource; - return connection_->InsertFutureReservation(request); -} - -StatusOr -FutureReservationsClient::InsertFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - *request.mutable_future_reservation_resource() = future_reservation_resource; - return connection_->InsertFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->InsertFutureReservation(request); -} - -StatusOr -FutureReservationsClient::InsertFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->InsertFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->InsertFutureReservation(operation); -} - -StreamRange -FutureReservationsClient::ListFutureReservations(std::string const& project, - std::string const& zone, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request; - request.set_project(project); - request.set_zone(zone); - return connection_->ListFutureReservations(request); -} - -StreamRange -FutureReservationsClient::ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->ListFutureReservations(std::move(request)); -} - -future> -FutureReservationsClient::UpdateFutureReservation( - std::string const& project, std::string const& zone, - std::string const& future_reservation, std::string const& update_mask, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - request.set_update_mask(update_mask); - *request.mutable_future_reservation_resource() = future_reservation_resource; - return connection_->UpdateFutureReservation(request); -} - -StatusOr -FutureReservationsClient::UpdateFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - std::string const& future_reservation, std::string const& update_mask, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest request; - request.set_project(project); - request.set_zone(zone); - request.set_future_reservation(future_reservation); - request.set_update_mask(update_mask); - *request.mutable_future_reservation_resource() = future_reservation_resource; - return connection_->UpdateFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->UpdateFutureReservation(request); -} - -StatusOr -FutureReservationsClient::UpdateFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request, - Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->UpdateFutureReservation(NoAwaitTag{}, request); -} - -future> -FutureReservationsClient::UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, Options opts) { - internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); - return connection_->UpdateFutureReservation(operation); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_client.h b/google/cloud/compute/future_reservations/v1/future_reservations_client.h deleted file mode 100644 index ab8723dba66ce..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_client.h +++ /dev/null @@ -1,828 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CLIENT_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CLIENT_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h" -#include "google/cloud/future.h" -#include "google/cloud/no_await_tag.h" -#include "google/cloud/options.h" -#include "google/cloud/polling_policy.h" -#include "google/cloud/status_or.h" -#include "google/cloud/version.h" -#include -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/// -/// Service for the futureReservations resource. -/// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations -/// -/// @par Equality -/// -/// Instances of this class created via copy-construction or copy-assignment -/// always compare equal. Instances created with equal -/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare -/// equal share the same underlying resources. -/// -/// @par Performance -/// -/// Creating a new instance of this class is a relatively expensive operation, -/// new objects establish new connections to the service. In contrast, -/// copy-construction, move-construction, and the corresponding assignment -/// operations are relatively efficient as the copies share all underlying -/// resources. -/// -/// @par Thread Safety -/// -/// Concurrent access to different instances of this class, even if they compare -/// equal, is guaranteed to work. Two or more threads operating on the same -/// instance of this class is not guaranteed to work. Since copy-construction -/// and move-construction is a relatively efficient operation, consider using -/// such a copy when using this class from multiple threads. -/// -class FutureReservationsClient { - public: - explicit FutureReservationsClient( - std::shared_ptr connection, - Options opts = {}); - ~FutureReservationsClient(); - - ///@{ - /// @name Copy and move support - FutureReservationsClient(FutureReservationsClient const&) = default; - FutureReservationsClient& operator=(FutureReservationsClient const&) = - default; - FutureReservationsClient(FutureReservationsClient&&) = default; - FutureReservationsClient& operator=(FutureReservationsClient&&) = default; - ///@} - - ///@{ - /// @name Equality - friend bool operator==(FutureReservationsClient const& a, - FutureReservationsClient const& b) { - return a.connection_ == b.connection_; - } - friend bool operator!=(FutureReservationsClient const& a, - FutureReservationsClient const& b) { - return !(a == b); - } - ///@} - - // clang-format off - /// - /// Retrieves an aggregated list of future reservations. To prevent failure, - /// Google recommends that you set the `returnPartialSuccess` parameter to - /// `true`. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/aggregatedList - /// - /// @param project Project ID for this request. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return a [StreamRange](@ref google::cloud::StreamRange) - /// to iterate of the results. See the documentation of this type for - /// details. In brief, this class has `begin()` and `end()` member - /// functions returning a iterator class meeting the - /// [input iterator requirements]. The value type for this iterator is a - /// [`StatusOr`] as the iteration may fail even after some values are - /// retrieved successfully, for example, if there is a network disconnect. - /// An empty set of results does not indicate an error, it indicates - /// that there are no resources meeting the request criteria. - /// On a successful iteration the `StatusOr` contains elements of type - /// [google.cloud.cpp.compute.v1.FutureReservationsScopedList], or rather, - /// the C++ class generated by Protobuf from that type. Please consult the - /// Protobuf documentation for details on the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.AggregatedListFutureReservationsRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L124} - /// [google.cloud.cpp.compute.v1.FutureReservationsScopedList]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L523} - /// - // clang-format on - StreamRange< - std::pair> - AggregatedListFutureReservations(std::string const& project, - Options opts = {}); - - // clang-format off - /// - /// Retrieves an aggregated list of future reservations. To prevent failure, - /// Google recommends that you set the `returnPartialSuccess` parameter to - /// `true`. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/aggregatedList - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.AggregatedListFutureReservationsRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return a [StreamRange](@ref google::cloud::StreamRange) - /// to iterate of the results. See the documentation of this type for - /// details. In brief, this class has `begin()` and `end()` member - /// functions returning a iterator class meeting the - /// [input iterator requirements]. The value type for this iterator is a - /// [`StatusOr`] as the iteration may fail even after some values are - /// retrieved successfully, for example, if there is a network disconnect. - /// An empty set of results does not indicate an error, it indicates - /// that there are no resources meeting the request criteria. - /// On a successful iteration the `StatusOr` contains elements of type - /// [google.cloud.cpp.compute.v1.FutureReservationsScopedList], or rather, - /// the C++ class generated by Protobuf from that type. Please consult the - /// Protobuf documentation for details on the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.AggregatedListFutureReservationsRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L124} - /// [google.cloud.cpp.compute.v1.FutureReservationsScopedList]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L523} - /// - // clang-format on - StreamRange< - std::pair> - AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request, - Options opts = {}); - - // clang-format off - /// - /// Cancel the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/cancel - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param future_reservation Name of the future reservation to retrieve. Name should conform to RFC1035. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.CancelRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L206} - /// - // clang-format on - future> Cancel( - std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts = {}); - - // clang-format off - /// - /// @copybrief Cancel - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr Cancel( - NoAwaitTag, std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts = {}); - - // clang-format off - /// - /// Cancel the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/cancel - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.CancelRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.CancelRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L206} - /// - // clang-format on - future> Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief Cancel - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief Cancel - /// - /// This method accepts a `google::cloud::cpp::compute::v1::Operation` that corresponds - /// to a previously started Long Running Operation (LRO) and polls the status - /// of the LRO in the background. - /// - // clang-format on - future> Cancel( - google::cloud::cpp::compute::v1::Operation const& operation, - Options opts = {}); - - // clang-format off - /// - /// Deletes the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/delete - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param future_reservation Name of the future reservation to retrieve. Name should conform to RFC1035. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.DeleteFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L239} - /// - // clang-format on - future> - DeleteFutureReservation(std::string const& project, std::string const& zone, - std::string const& future_reservation, - Options opts = {}); - - // clang-format off - /// - /// @copybrief DeleteFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr DeleteFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - std::string const& future_reservation, Options opts = {}); - - // clang-format off - /// - /// Deletes the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/delete - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.DeleteFutureReservationRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.DeleteFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L239} - /// - // clang-format on - future> - DeleteFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief DeleteFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr DeleteFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief DeleteFutureReservation - /// - /// This method accepts a `google::cloud::cpp::compute::v1::Operation` that corresponds - /// to a previously started Long Running Operation (LRO) and polls the status - /// of the LRO in the background. - /// - // clang-format on - future> - DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, - Options opts = {}); - - // clang-format off - /// - /// Retrieves information about the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/get - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param future_reservation Name of the future reservation to retrieve. Name should conform to RFC1035. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return the result of the RPC. The response message type - /// ([google.cloud.cpp.compute.v1.FutureReservation]) - /// is mapped to a C++ class using the [Protobuf mapping rules]. - /// If the request fails, the [`StatusOr`] contains the error details. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.GetFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L272} - /// [google.cloud.cpp.compute.v1.FutureReservation]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L28} - /// - // clang-format on - StatusOr - GetFutureReservation(std::string const& project, std::string const& zone, - std::string const& future_reservation, - Options opts = {}); - - // clang-format off - /// - /// Retrieves information about the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/get - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.GetFutureReservationRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return the result of the RPC. The response message type - /// ([google.cloud.cpp.compute.v1.FutureReservation]) - /// is mapped to a C++ class using the [Protobuf mapping rules]. - /// If the request fails, the [`StatusOr`] contains the error details. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.GetFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L272} - /// [google.cloud.cpp.compute.v1.FutureReservation]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L28} - /// - // clang-format on - StatusOr - GetFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// Creates a new Future Reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/insert - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param future_reservation_resource The FutureReservation for this request. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.InsertFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L286} - /// - // clang-format on - future> - InsertFutureReservation( - std::string const& project, std::string const& zone, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts = {}); - - // clang-format off - /// - /// @copybrief InsertFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr InsertFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts = {}); - - // clang-format off - /// - /// Creates a new Future Reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/insert - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.InsertFutureReservationRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.InsertFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L286} - /// - // clang-format on - future> - InsertFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief InsertFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr InsertFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief InsertFutureReservation - /// - /// This method accepts a `google::cloud::cpp::compute::v1::Operation` that corresponds - /// to a previously started Long Running Operation (LRO) and polls the status - /// of the LRO in the background. - /// - // clang-format on - future> - InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, - Options opts = {}); - - // clang-format off - /// - /// A list of all the future reservations that have been configured for the - /// specified project in specified zone. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/list - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return a [StreamRange](@ref google::cloud::StreamRange) - /// to iterate of the results. See the documentation of this type for - /// details. In brief, this class has `begin()` and `end()` member - /// functions returning a iterator class meeting the - /// [input iterator requirements]. The value type for this iterator is a - /// [`StatusOr`] as the iteration may fail even after some values are - /// retrieved successfully, for example, if there is a network disconnect. - /// An empty set of results does not indicate an error, it indicates - /// that there are no resources meeting the request criteria. - /// On a successful iteration the `StatusOr` contains elements of type - /// [google.cloud.cpp.compute.v1.FutureReservation], or rather, - /// the C++ class generated by Protobuf from that type. Please consult the - /// Protobuf documentation for details on the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.ListFutureReservationsRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L319} - /// [google.cloud.cpp.compute.v1.FutureReservation]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L28} - /// - // clang-format on - StreamRange - ListFutureReservations(std::string const& project, std::string const& zone, - Options opts = {}); - - // clang-format off - /// - /// A list of all the future reservations that have been configured for the - /// specified project in specified zone. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/list - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.ListFutureReservationsRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return a [StreamRange](@ref google::cloud::StreamRange) - /// to iterate of the results. See the documentation of this type for - /// details. In brief, this class has `begin()` and `end()` member - /// functions returning a iterator class meeting the - /// [input iterator requirements]. The value type for this iterator is a - /// [`StatusOr`] as the iteration may fail even after some values are - /// retrieved successfully, for example, if there is a network disconnect. - /// An empty set of results does not indicate an error, it indicates - /// that there are no resources meeting the request criteria. - /// On a successful iteration the `StatusOr` contains elements of type - /// [google.cloud.cpp.compute.v1.FutureReservation], or rather, - /// the C++ class generated by Protobuf from that type. Please consult the - /// Protobuf documentation for details on the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.ListFutureReservationsRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L319} - /// [google.cloud.cpp.compute.v1.FutureReservation]: @cloud_cpp_reference_link{google/cloud/compute/v1/internal/common_043.proto#L28} - /// - // clang-format on - StreamRange - ListFutureReservations(google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request, - Options opts = {}); - - // clang-format off - /// - /// Updates the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/update - /// - /// @param project Project ID for this request. - /// @param zone Name of the zone for this request. Name should conform to RFC1035. - /// @param future_reservation Name of the reservation to update. Name should conform to RFC1035. - /// @param update_mask update_mask indicates fields to be updated as part of this request. - /// @param future_reservation_resource The FutureReservation for this request. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.UpdateFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L390} - /// - // clang-format on - future> - UpdateFutureReservation( - std::string const& project, std::string const& zone, - std::string const& future_reservation, std::string const& update_mask, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts = {}); - - // clang-format off - /// - /// @copybrief UpdateFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr UpdateFutureReservation( - NoAwaitTag, std::string const& project, std::string const& zone, - std::string const& future_reservation, std::string const& update_mask, - google::cloud::cpp::compute::v1::FutureReservation const& - future_reservation_resource, - Options opts = {}); - - // clang-format off - /// - /// Updates the specified future reservation. - /// https://cloud.google.com/compute/docs/reference/rest/v1/futureReservations/update - /// - /// @param request Unary RPCs, such as the one wrapped by this - /// function, receive a single `request` proto message which includes all - /// the inputs for the RPC. In this case, the proto message is a - /// [google.cloud.cpp.compute.future_reservations.v1.UpdateFutureReservationRequest]. - /// Proto messages are converted to C++ classes by Protobuf, using the - /// [Protobuf mapping rules]. - /// @param opts Optional. Override the class-level options, such as retry and - /// backoff policies. - /// @return A [`future`] that becomes satisfied when the LRO - /// ([Long Running Operation]) completes or the polling policy in effect - /// for this call is exhausted. The future is satisfied with an error if - /// the LRO completes with an error or the polling policy is exhausted. - /// In this case the [`StatusOr`] returned by the future contains the - /// error. If the LRO completes successfully the value of the future - /// contains the LRO's result. For this RPC the result is a - /// [google.cloud.cpp.compute.v1.Operation] proto message. - /// The C++ class representing this message is created by Protobuf, using - /// the [Protobuf mapping rules]. - /// - /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ - /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator - /// [Long Running Operation]: http://cloud/compute/docs/api/how-tos/api-requests-responses#handling_api_responses - /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string - /// [`future`]: @ref google::cloud::future - /// [`StatusOr`]: @ref google::cloud::StatusOr - /// [`Status`]: @ref google::cloud::Status - /// [google.cloud.cpp.compute.future_reservations.v1.UpdateFutureReservationRequest]: @cloud_cpp_reference_link{google/cloud/compute/future_reservations/v1/future_reservations.proto#L390} - /// - // clang-format on - future> - UpdateFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief UpdateFutureReservation - /// - /// Specifying the [`NoAwaitTag`] immediately returns the - /// [`google::cloud::cpp::compute::v1::Operation`] that corresponds to the Long Running - /// Operation that has been started. No polling for operation status occurs. - /// - /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag - /// - // clang-format on - StatusOr UpdateFutureReservation( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request, - Options opts = {}); - - // clang-format off - /// - /// @copybrief UpdateFutureReservation - /// - /// This method accepts a `google::cloud::cpp::compute::v1::Operation` that corresponds - /// to a previously started Long Running Operation (LRO) and polls the status - /// of the LRO in the background. - /// - // clang-format on - future> - UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation, - Options opts = {}); - - private: - std::shared_ptr connection_; - Options options_; -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CLIENT_H diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_connection.cc b/google/cloud/compute/future_reservations/v1/future_reservations_connection.cc deleted file mode 100644 index 00496e83aa6e0..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_connection.cc +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_options.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h" -#include "google/cloud/background_threads.h" -#include "google/cloud/common_options.h" -#include "google/cloud/credentials.h" -#include "google/cloud/grpc_options.h" -#include "google/cloud/internal/pagination_range.h" -#include "google/cloud/internal/unified_grpc_credentials.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -FutureReservationsConnection::~FutureReservationsConnection() = default; - -StreamRange> -FutureReservationsConnection::AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest) { // NOLINT(performance-unnecessary-value-param) - return google::cloud::internal::MakeUnimplementedPaginationRange< - StreamRange>>(); -} - -future> -FutureReservationsConnection::Cancel( - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StatusOr -FutureReservationsConnection::Cancel( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const&) { - return StatusOr( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -future> -FutureReservationsConnection::Cancel( - google::cloud::cpp::compute::v1::Operation const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -future> -FutureReservationsConnection::DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StatusOr -FutureReservationsConnection::DeleteFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const&) { - return StatusOr( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -future> -FutureReservationsConnection::DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StatusOr -FutureReservationsConnection::GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const&) { - return Status(StatusCode::kUnimplemented, "not implemented"); -} - -future> -FutureReservationsConnection::InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StatusOr -FutureReservationsConnection::InsertFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const&) { - return StatusOr( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -future> -FutureReservationsConnection::InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StreamRange -FutureReservationsConnection::ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest) { // NOLINT(performance-unnecessary-value-param) - return google::cloud::internal::MakeUnimplementedPaginationRange< - StreamRange>(); -} - -future> -FutureReservationsConnection::UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -StatusOr -FutureReservationsConnection::UpdateFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const&) { - return StatusOr( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -future> -FutureReservationsConnection::UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const&) { - return google::cloud::make_ready_future< - StatusOr>( - Status(StatusCode::kUnimplemented, "not implemented")); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_connection.h b/google/cloud/compute/future_reservations/v1/future_reservations_connection.h deleted file mode 100644 index a386dfec8c7c9..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_connection.h +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h" -#include "google/cloud/backoff_policy.h" -#include "google/cloud/future.h" -#include "google/cloud/internal/retry_policy_impl.h" -#include "google/cloud/no_await_tag.h" -#include "google/cloud/options.h" -#include "google/cloud/polling_policy.h" -#include "google/cloud/status_or.h" -#include "google/cloud/stream_range.h" -#include "google/cloud/version.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/// The retry policy for `FutureReservationsConnection`. -class FutureReservationsRetryPolicy : public ::google::cloud::RetryPolicy { - public: - /// Creates a new instance of the policy, reset to the initial state. - virtual std::unique_ptr clone() const = 0; -}; - -/** - * A retry policy for `FutureReservationsConnection` based on counting errors. - * - * This policy stops retrying if: - * - An RPC returns a non-transient error. - * - More than a prescribed number of transient failures is detected. - * - * In this class the following status codes are treated as transient errors: - * - [`kUnavailable`](@ref google::cloud::StatusCode) - */ -class FutureReservationsLimitedErrorCountRetryPolicy - : public FutureReservationsRetryPolicy { - public: - /** - * Create an instance that tolerates up to @p maximum_failures transient - * errors. - * - * @note Disable the retry loop by providing an instance of this policy with - * @p maximum_failures == 0. - */ - explicit FutureReservationsLimitedErrorCountRetryPolicy(int maximum_failures) - : impl_(maximum_failures) {} - - FutureReservationsLimitedErrorCountRetryPolicy( - FutureReservationsLimitedErrorCountRetryPolicy&& rhs) noexcept - : FutureReservationsLimitedErrorCountRetryPolicy(rhs.maximum_failures()) { - } - FutureReservationsLimitedErrorCountRetryPolicy( - FutureReservationsLimitedErrorCountRetryPolicy const& rhs) noexcept - : FutureReservationsLimitedErrorCountRetryPolicy(rhs.maximum_failures()) { - } - - int maximum_failures() const { return impl_.maximum_failures(); } - - bool OnFailure(Status const& status) override { - return impl_.OnFailure(status); - } - bool IsExhausted() const override { return impl_.IsExhausted(); } - bool IsPermanentFailure(Status const& status) const override { - return impl_.IsPermanentFailure(status); - } - std::unique_ptr clone() const override { - return std::make_unique( - maximum_failures()); - } - - // This is provided only for backwards compatibility. - using BaseType = FutureReservationsRetryPolicy; - - private: - google::cloud::internal::LimitedErrorCountRetryPolicy< - compute_future_reservations_v1_internal::FutureReservationsRetryTraits> - impl_; -}; - -/** - * A retry policy for `FutureReservationsConnection` based on elapsed time. - * - * This policy stops retrying if: - * - An RPC returns a non-transient error. - * - The elapsed time in the retry loop exceeds a prescribed duration. - * - * In this class the following status codes are treated as transient errors: - * - [`kUnavailable`](@ref google::cloud::StatusCode) - */ -class FutureReservationsLimitedTimeRetryPolicy - : public FutureReservationsRetryPolicy { - public: - /** - * Constructor given a `std::chrono::duration<>` object. - * - * @tparam DurationRep a placeholder to match the `Rep` tparam for @p - * duration's type. The semantics of this template parameter are - * documented in `std::chrono::duration<>`. In brief, the underlying - * arithmetic type used to store the number of ticks. For our purposes it - * is simply a formal parameter. - * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p - * duration's type. The semantics of this template parameter are - * documented in `std::chrono::duration<>`. In brief, the length of the - * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is - * simply a formal parameter. - * @param maximum_duration the maximum time allowed before the policy expires. - * While the application can express this time in any units they desire, - * the class truncates to milliseconds. - * - * @see https://en.cppreference.com/w/cpp/chrono/duration for more information - * about `std::chrono::duration`. - */ - template - explicit FutureReservationsLimitedTimeRetryPolicy( - std::chrono::duration maximum_duration) - : impl_(maximum_duration) {} - - FutureReservationsLimitedTimeRetryPolicy( - FutureReservationsLimitedTimeRetryPolicy&& rhs) noexcept - : FutureReservationsLimitedTimeRetryPolicy(rhs.maximum_duration()) {} - FutureReservationsLimitedTimeRetryPolicy( - FutureReservationsLimitedTimeRetryPolicy const& rhs) noexcept - : FutureReservationsLimitedTimeRetryPolicy(rhs.maximum_duration()) {} - - std::chrono::milliseconds maximum_duration() const { - return impl_.maximum_duration(); - } - - bool OnFailure(Status const& status) override { - return impl_.OnFailure(status); - } - bool IsExhausted() const override { return impl_.IsExhausted(); } - bool IsPermanentFailure(Status const& status) const override { - return impl_.IsPermanentFailure(status); - } - std::unique_ptr clone() const override { - return std::make_unique( - maximum_duration()); - } - - // This is provided only for backwards compatibility. - using BaseType = FutureReservationsRetryPolicy; - - private: - google::cloud::internal::LimitedTimeRetryPolicy< - compute_future_reservations_v1_internal::FutureReservationsRetryTraits> - impl_; -}; - -/** - * The `FutureReservationsConnection` object for `FutureReservationsClient`. - * - * This interface defines virtual methods for each of the user-facing overload - * sets in `FutureReservationsClient`. This allows users to inject custom - * behavior (e.g., with a Google Mock object) when writing tests that use - * objects of type `FutureReservationsClient`. - * - * To create a concrete instance, see `MakeFutureReservationsConnection()`. - * - * For mocking, see - * `compute_future_reservations_v1_mocks::MockFutureReservationsConnection`. - */ -class FutureReservationsConnection { - public: - virtual ~FutureReservationsConnection() = 0; - - virtual Options options() { return Options{}; } - - virtual StreamRange< - std::pair> - AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request); - - virtual future> Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request); - - virtual StatusOr Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request); - - virtual future> Cancel( - google::cloud::cpp::compute::v1::Operation const& operation); - - virtual future> - DeleteFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request); - - virtual StatusOr - DeleteFutureReservation(NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request); - - virtual future> - DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation); - - virtual StatusOr - GetFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request); - - virtual future> - InsertFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request); - - virtual StatusOr - InsertFutureReservation(NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request); - - virtual future> - InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation); - - virtual StreamRange - ListFutureReservations(google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request); - - virtual future> - UpdateFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request); - - virtual StatusOr - UpdateFutureReservation(NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request); - - virtual future> - UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation); -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_H diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.cc b/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.cc deleted file mode 100644 index 44c9c7b5497ce..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -using ::google::cloud::Idempotency; - -FutureReservationsConnectionIdempotencyPolicy:: - ~FutureReservationsConnectionIdempotencyPolicy() = default; - -std::unique_ptr -FutureReservationsConnectionIdempotencyPolicy::clone() const { - return std::make_unique(*this); -} - -Idempotency -FutureReservationsConnectionIdempotencyPolicy::AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest) { // NOLINT - return Idempotency::kIdempotent; -} - -Idempotency FutureReservationsConnectionIdempotencyPolicy::Cancel( - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const&) { - return Idempotency::kNonIdempotent; -} - -Idempotency -FutureReservationsConnectionIdempotencyPolicy::DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const&) { - return Idempotency::kNonIdempotent; -} - -Idempotency FutureReservationsConnectionIdempotencyPolicy::GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const&) { - return Idempotency::kIdempotent; -} - -Idempotency -FutureReservationsConnectionIdempotencyPolicy::InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const&) { - return Idempotency::kNonIdempotent; -} - -Idempotency -FutureReservationsConnectionIdempotencyPolicy::ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest) { // NOLINT - return Idempotency::kIdempotent; -} - -Idempotency -FutureReservationsConnectionIdempotencyPolicy::UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const&) { - return Idempotency::kNonIdempotent; -} - -std::unique_ptr -MakeDefaultFutureReservationsConnectionIdempotencyPolicy() { - return std::make_unique(); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h b/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h deleted file mode 100644 index a512ba02a8cfe..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_IDEMPOTENCY_POLICY_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_IDEMPOTENCY_POLICY_H - -#include "google/cloud/idempotency.h" -#include "google/cloud/version.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -class FutureReservationsConnectionIdempotencyPolicy { - public: - virtual ~FutureReservationsConnectionIdempotencyPolicy(); - - /// Create a new copy of this object. - virtual std::unique_ptr clone() - const; - - virtual google::cloud::Idempotency AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request); - - virtual google::cloud::Idempotency Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request); - - virtual google::cloud::Idempotency DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request); - - virtual google::cloud::Idempotency GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request); - - virtual google::cloud::Idempotency InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request); - - virtual google::cloud::Idempotency ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request); - - virtual google::cloud::Idempotency UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request); -}; - -std::unique_ptr -MakeDefaultFutureReservationsConnectionIdempotencyPolicy(); - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_options.h b/google/cloud/compute/future_reservations/v1/future_reservations_options.h deleted file mode 100644 index fbe7b8d7fdc15..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_options.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_OPTIONS_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_OPTIONS_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h" -#include "google/cloud/backoff_policy.h" -#include "google/cloud/options.h" -#include "google/cloud/version.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/** - * Use with `google::cloud::Options` to configure the retry policy. - * - * @ingroup google-cloud-compute-options - */ -struct FutureReservationsRetryPolicyOption { - using Type = std::shared_ptr; -}; - -/** - * Use with `google::cloud::Options` to configure the backoff policy. - * - * @ingroup google-cloud-compute-options - */ -struct FutureReservationsBackoffPolicyOption { - using Type = std::shared_ptr; -}; - -/** - * Use with `google::cloud::Options` to configure which operations are retried. - * - * @ingroup google-cloud-compute-options - */ -struct FutureReservationsConnectionIdempotencyPolicyOption { - using Type = std::shared_ptr; -}; - -/** - * Use with `google::cloud::Options` to configure the long-running operations - * polling policy. - * - * @ingroup google-cloud-compute-options - */ -struct FutureReservationsPollingPolicyOption { - using Type = std::shared_ptr; -}; - -/** - * The options applicable to FutureReservations. - * - * @ingroup google-cloud-compute-options - */ -using FutureReservationsPolicyOptionList = - OptionList; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_OPTIONS_H diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.cc b/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.cc deleted file mode 100644 index d845d2272381b..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.cc +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_options.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h" -#include "google/cloud/common_options.h" -#include "google/cloud/credentials.h" -#include "google/cloud/internal/rest_background_threads_impl.h" -#include "google/cloud/internal/rest_options.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -std::shared_ptr -MakeFutureReservationsConnectionRest(Options options) { - internal::CheckExpectedOptions(options, - __func__); - options = - compute_future_reservations_v1_internal::FutureReservationsDefaultOptions( - std::move(options)); - auto background = std::make_unique< - rest_internal::AutomaticallyCreatedRestBackgroundThreads>(); - auto stub = compute_future_reservations_v1_internal:: - CreateDefaultFutureReservationsRestStub(options); - return compute_future_reservations_v1_internal:: - MakeFutureReservationsTracingConnection( - std::make_shared( - std::move(background), std::move(stub), std::move(options))); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h b/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h deleted file mode 100644 index cce2b17b06567..0000000000000 --- a/google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_REST_CONNECTION_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_REST_CONNECTION_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/options.h" -#include "google/cloud/version.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1 { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/** - * A factory function to construct an object of type - * `FutureReservationsConnection` that uses REST over HTTP as transport in lieu - * of gRPC. REST transport should only be used for services that do not support - * gRPC or if the existing network configuration precludes using gRPC. - * - * The returned connection object should not be used directly; instead it - * should be passed as an argument to the constructor of - * FutureReservationsClient. - * - * The optional @p options argument may be used to configure aspects of the - * returned `FutureReservationsConnection`. Expected options are any of the - * types in the following option lists: - * - * - `google::cloud::CommonOptionList` - * - `google::cloud::RestOptionList` - * - `google::cloud::UnifiedCredentialsOptionList` - * - - * `google::cloud::compute_future_reservations_v1::FutureReservationsPolicyOptionList` - * - * @note Unexpected options will be ignored. To log unexpected options instead, - * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. - * - * @param options (optional) Configure the `FutureReservationsConnection` - * created by this function. - */ -std::shared_ptr -MakeFutureReservationsConnectionRest(Options options = {}); - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1 -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_FUTURE_RESERVATIONS_REST_CONNECTION_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.cc deleted file mode 100644 index 756b57be22ce0..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.cc +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_options.h" -#include "google/cloud/internal/populate_common_options.h" -#include "google/cloud/internal/populate_grpc_options.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -namespace { -auto constexpr kBackoffScaling = 2.0; -} // namespace - -Options FutureReservationsDefaultOptions(Options options) { - options = internal::PopulateCommonOptions( - std::move(options), "GOOGLE_CLOUD_CPP_FUTURE_RESERVATIONS_ENDPOINT", "", - "GOOGLE_CLOUD_CPP_FUTURE_RESERVATIONS_AUTHORITY", - "compute.googleapis.com"); - options = internal::PopulateGrpcOptions(std::move(options)); - if (!options.has()) { - options.set< - compute_future_reservations_v1::FutureReservationsRetryPolicyOption>( - compute_future_reservations_v1:: - FutureReservationsLimitedTimeRetryPolicy(std::chrono::minutes(30)) - .clone()); - } - if (!options.has()) { - options.set< - compute_future_reservations_v1::FutureReservationsBackoffPolicyOption>( - ExponentialBackoffPolicy( - std::chrono::seconds(0), std::chrono::seconds(1), - std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) - .clone()); - } - if (!options.has()) { - options.set< - compute_future_reservations_v1::FutureReservationsPollingPolicyOption>( - GenericPollingPolicy( - options - .get() - ->clone(), - ExponentialBackoffPolicy(std::chrono::seconds(1), - std::chrono::minutes(5), kBackoffScaling) - .clone()) - .clone()); - } - if (!options.has()) { - options.set( - compute_future_reservations_v1:: - MakeDefaultFutureReservationsConnectionIdempotencyPolicy()); - } - - return options; -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h deleted file mode 100644 index d7e1dd845cd3e..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_OPTION_DEFAULTS_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_OPTION_DEFAULTS_H - -#include "google/cloud/options.h" -#include "google/cloud/version.h" - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -Options FutureReservationsDefaultOptions(Options options); - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_OPTION_DEFAULTS_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.cc deleted file mode 100644 index e514eb19df57a..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.cc +++ /dev/null @@ -1,676 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h" -#include "google/cloud/common_options.h" -#include "google/cloud/credentials.h" -#include "google/cloud/internal/async_rest_long_running_operation_custom.h" -#include "google/cloud/internal/extract_long_running_result.h" -#include "google/cloud/internal/pagination_range.h" -#include "google/cloud/internal/rest_lro_helpers.h" -#include "google/cloud/internal/rest_retry_loop.h" -#include "google/cloud/rest_options.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -FutureReservationsRestConnectionImpl::FutureReservationsRestConnectionImpl( - std::unique_ptr background, - std::shared_ptr< - compute_future_reservations_v1_internal::FutureReservationsRestStub> - stub, - Options options) - : background_(std::move(background)), - stub_(std::move(stub)), - options_(internal::MergeOptions( - std::move(options), FutureReservationsConnection::options())) {} - -StreamRange> -FutureReservationsRestConnectionImpl::AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request) { - request.clear_page_token(); - auto current = google::cloud::internal::SaveCurrentOptions(); - auto idempotency = - idempotency_policy(*current)->AggregatedListFutureReservations(request); - char const* function_name = __func__; - return google::cloud::internal::MakePaginationRange>>( - current, std::move(request), - [idempotency, function_name, stub = stub_, - retry = std::shared_ptr< - compute_future_reservations_v1::FutureReservationsRetryPolicy>( - retry_policy(*current)), - backoff = std::shared_ptr(backoff_policy(*current))]( - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& r) { - return google::cloud::rest_internal::RestRetryLoop( - retry->clone(), backoff->clone(), idempotency, - [stub](rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) { - return stub->AggregatedListFutureReservations(rest_context, - options, request); - }, - options, r, function_name); - }, - [](google::cloud::cpp::compute::v1:: - FutureReservationsAggregatedListResponse r) { - std::vector> - result(r.items().size()); - auto& messages = *r.mutable_items(); - std::move(messages.begin(), messages.end(), result.begin()); - return result; - }); -} - -future> -FutureReservationsRestConnectionImpl::Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, request, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const& request) { - return stub->AsyncCancel(cq, std::move(context), std::move(options), - request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->Cancel(request), polling_policy(*current), - __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [request]( - std::string const& op, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }, - [request](std::string const& op, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }); -} - -StatusOr -FutureReservationsRestConnectionImpl::Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return google::cloud::rest_internal::RestRetryLoop( - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->Cancel(request), - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const& request) { - return stub_->Cancel(rest_context, options, request); - }, - *current, request, __func__); -} - -future> -FutureReservationsRestConnectionImpl::Cancel( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestAwaitLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, operation, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [operation]( - std::string const&, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }, - [operation](std::string const&, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }); -} - -future> -FutureReservationsRestConnectionImpl::DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, request, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return stub->AsyncDeleteFutureReservation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->DeleteFutureReservation(request), - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [request]( - std::string const& op, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }, - [request](std::string const& op, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }); -} - -StatusOr -FutureReservationsRestConnectionImpl::DeleteFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return google::cloud::rest_internal::RestRetryLoop( - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->DeleteFutureReservation(request), - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return stub_->DeleteFutureReservation(rest_context, options, request); - }, - *current, request, __func__); -} - -future> -FutureReservationsRestConnectionImpl::DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestAwaitLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, operation, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [operation]( - std::string const&, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }, - [operation](std::string const&, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }); -} - -StatusOr -FutureReservationsRestConnectionImpl::GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return google::cloud::rest_internal::RestRetryLoop( - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->GetFutureReservation(request), - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - return stub_->GetFutureReservation(rest_context, options, request); - }, - *current, request, __func__); -} - -future> -FutureReservationsRestConnectionImpl::InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, request, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return stub->AsyncInsertFutureReservation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->InsertFutureReservation(request), - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [request]( - std::string const& op, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }, - [request](std::string const& op, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }); -} - -StatusOr -FutureReservationsRestConnectionImpl::InsertFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return google::cloud::rest_internal::RestRetryLoop( - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->InsertFutureReservation(request), - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return stub_->InsertFutureReservation(rest_context, options, request); - }, - *current, request, __func__); -} - -future> -FutureReservationsRestConnectionImpl::InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestAwaitLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, operation, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [operation]( - std::string const&, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }, - [operation](std::string const&, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }); -} - -StreamRange -FutureReservationsRestConnectionImpl::ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request) { - request.clear_page_token(); - auto current = google::cloud::internal::SaveCurrentOptions(); - auto idempotency = - idempotency_policy(*current)->ListFutureReservations(request); - char const* function_name = __func__; - return google::cloud::internal::MakePaginationRange< - StreamRange>( - current, std::move(request), - [idempotency, function_name, stub = stub_, - retry = std::shared_ptr< - compute_future_reservations_v1::FutureReservationsRetryPolicy>( - retry_policy(*current)), - backoff = std::shared_ptr(backoff_policy(*current))]( - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& r) { - return google::cloud::rest_internal::RestRetryLoop( - retry->clone(), backoff->clone(), idempotency, - [stub](rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) { - return stub->ListFutureReservations(rest_context, options, - request); - }, - options, r, function_name); - }, - [](google::cloud::cpp::compute::v1::FutureReservationsListResponse r) { - std::vector result( - r.items().size()); - auto& messages = *r.mutable_items(); - std::move(messages.begin(), messages.end(), result.begin()); - return result; - }); -} - -future> -FutureReservationsRestConnectionImpl::UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, request, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return stub->AsyncUpdateFutureReservation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->UpdateFutureReservation(request), - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [request]( - std::string const& op, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }, - [request](std::string const& op, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - r.set_project(request.project()); - r.set_zone(request.zone()); - r.set_operation(op); - }); -} - -StatusOr -FutureReservationsRestConnectionImpl::UpdateFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return google::cloud::rest_internal::RestRetryLoop( - retry_policy(*current), backoff_policy(*current), - idempotency_policy(*current)->UpdateFutureReservation(request), - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return stub_->UpdateFutureReservation(rest_context, options, request); - }, - *current, request, __func__); -} - -future> -FutureReservationsRestConnectionImpl::UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto current = google::cloud::internal::SaveCurrentOptions(); - return rest_internal::AsyncRestAwaitLongRunningOperation< - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::v1::Operation, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest, - google::cloud::cpp::compute::zone_operations::v1::DeleteOperationRequest>( - background_->cq(), current, operation, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return stub->AsyncGetOperation(cq, std::move(context), - std::move(options), request); - }, - [stub = stub_](CompletionQueue& cq, - std::unique_ptr context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return stub->AsyncCancelOperation(cq, std::move(context), - std::move(options), request); - }, - [](StatusOr op, - std::string const&) { return op; }, - polling_policy(*current), __func__, - [](google::cloud::cpp::compute::v1::Operation const& op) { - return op.status() == "DONE"; - }, - [operation]( - std::string const&, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest& - r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }, - [operation](std::string const&, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest& r) { - auto info = google::cloud::rest_internal::ParseComputeOperationInfo( - operation.self_link()); - - r.set_project(info.project); - r.set_zone(info.zone); - r.set_operation(info.operation); - }); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h deleted file mode 100644 index 777a4b0fefbbb..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.h +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_CONNECTION_IMPL_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_CONNECTION_IMPL_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_options.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h" -#include "google/cloud/background_threads.h" -#include "google/cloud/backoff_policy.h" -#include "google/cloud/options.h" -#include "google/cloud/status_or.h" -#include "google/cloud/stream_range.h" -#include "google/cloud/version.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -class FutureReservationsRestConnectionImpl - : public compute_future_reservations_v1::FutureReservationsConnection { - public: - ~FutureReservationsRestConnectionImpl() override = default; - - FutureReservationsRestConnectionImpl( - std::unique_ptr background, - std::shared_ptr< - compute_future_reservations_v1_internal::FutureReservationsRestStub> - stub, - Options options); - - Options options() override { return options_; } - - StreamRange< - std::pair> - AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request) override; - - future> Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - StatusOr Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - future> Cancel( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - future> - DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr DeleteFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - future> - DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - StatusOr - GetFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) override; - - future> - InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr InsertFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - future> - InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - StreamRange - ListFutureReservations(google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request) override; - - future> - UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - StatusOr UpdateFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - future> - UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - private: - static std::unique_ptr< - compute_future_reservations_v1::FutureReservationsRetryPolicy> - retry_policy(Options const& options) { - return options - .get() - ->clone(); - } - - static std::unique_ptr backoff_policy(Options const& options) { - return options - .get() - ->clone(); - } - - static std::unique_ptr - idempotency_policy(Options const& options) { - return options - .get() - ->clone(); - } - - static std::unique_ptr polling_policy(Options const& options) { - return options - .get() - ->clone(); - } - - std::unique_ptr background_; - std::shared_ptr< - compute_future_reservations_v1_internal::FutureReservationsRestStub> - stub_; - Options options_; -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_CONNECTION_IMPL_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.cc deleted file mode 100644 index 1b5a0e358bc47..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.cc +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h" -#include "google/cloud/internal/log_wrapper.h" -#include "google/cloud/status_or.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -FutureReservationsRestLogging::FutureReservationsRestLogging( - std::shared_ptr child, - TracingOptions tracing_options, std::set components) - : child_(std::move(child)), - tracing_options_(std::move(tracing_options)), - components_(std::move(components)) {} - -StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> -FutureReservationsRestLogging::AggregatedListFutureReservations( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) { - return child_->AggregatedListFutureReservations(rest_context, options, - request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -future> -FutureReservationsRestLogging::AsyncCancel( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const& request) { - return child_->AsyncCancel(cq, std::move(rest_context), - std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::Cancel( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const& request) { - return child_->Cancel(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -future> -FutureReservationsRestLogging::AsyncDeleteFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return child_->AsyncDeleteFutureReservation( - cq, std::move(rest_context), std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::DeleteFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - return child_->DeleteFutureReservation(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::GetFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - return child_->GetFutureReservation(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -future> -FutureReservationsRestLogging::AsyncInsertFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return child_->AsyncInsertFutureReservation( - cq, std::move(rest_context), std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::InsertFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - return child_->InsertFutureReservation(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::ListFutureReservations( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) { - return child_->ListFutureReservations(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -future> -FutureReservationsRestLogging::AsyncUpdateFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return child_->AsyncUpdateFutureReservation( - cq, std::move(rest_context), std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -StatusOr -FutureReservationsRestLogging::UpdateFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - return child_->UpdateFutureReservation(rest_context, options, request); - }, - rest_context, options, request, __func__, tracing_options_); -} - -future> -FutureReservationsRestLogging::AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest const& - request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) { - return child_->AsyncGetOperation(cq, std::move(rest_context), - std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -future FutureReservationsRestLogging::AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return google::cloud::internal::LogWrapper( - [this](CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - return child_->AsyncCancelOperation(cq, std::move(rest_context), - std::move(options), request); - }, - cq, std::move(rest_context), std::move(options), request, __func__, - tracing_options_); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h deleted file mode 100644 index f1f51f35dc0e3..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_LOGGING_DECORATOR_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_LOGGING_DECORATOR_H - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/future.h" -#include "google/cloud/internal/rest_context.h" -#include "google/cloud/tracing_options.h" -#include "google/cloud/version.h" -#include -#include -#include -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -class FutureReservationsRestLogging : public FutureReservationsRestStub { - public: - ~FutureReservationsRestLogging() override = default; - FutureReservationsRestLogging( - std::shared_ptr child, - TracingOptions tracing_options, std::set components); - - StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> - AggregatedListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) override; - - future> AsyncCancel( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - StatusOr Cancel( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - future> - AsyncDeleteFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr DeleteFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr - GetFutureReservation(google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) override; - - future> - AsyncInsertFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr InsertFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr - ListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) override; - - future> - AsyncUpdateFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - StatusOr UpdateFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - future> - AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) override; - - future AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) override; - - private: - std::shared_ptr child_; - TracingOptions tracing_options_; - std::set components_; -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_LOGGING_DECORATOR_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.cc deleted file mode 100644 index 7e1287668fbfe..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.cc +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h" -#include "google/cloud/internal/absl_str_cat_quiet.h" -#include "google/cloud/internal/api_client_header.h" -#include "google/cloud/internal/rest_set_metadata.h" -#include "google/cloud/status_or.h" -#include "absl/strings/str_format.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -FutureReservationsRestMetadata::FutureReservationsRestMetadata( - std::shared_ptr child, - std::string api_client_header) - : child_(std::move(child)), - api_client_header_( - api_client_header.empty() - ? google::cloud::internal::GeneratedLibClientHeader() - : std::move(api_client_header)) {} - -StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> -FutureReservationsRestMetadata::AggregatedListFutureReservations( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) { - SetMetadata(rest_context, options); - return child_->AggregatedListFutureReservations(rest_context, options, - request); -} - -future> -FutureReservationsRestMetadata::AsyncCancel( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - SetMetadata(*rest_context, *options); - return child_->AsyncCancel(cq, std::move(rest_context), std::move(options), - request); -} - -StatusOr -FutureReservationsRestMetadata::Cancel( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - SetMetadata(rest_context, options); - return child_->Cancel(rest_context, options, request); -} - -future> -FutureReservationsRestMetadata::AsyncDeleteFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - SetMetadata(*rest_context, *options); - return child_->AsyncDeleteFutureReservation(cq, std::move(rest_context), - std::move(options), request); -} - -StatusOr -FutureReservationsRestMetadata::DeleteFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - SetMetadata(rest_context, options); - return child_->DeleteFutureReservation(rest_context, options, request); -} - -StatusOr -FutureReservationsRestMetadata::GetFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - SetMetadata(rest_context, options); - return child_->GetFutureReservation(rest_context, options, request); -} - -future> -FutureReservationsRestMetadata::AsyncInsertFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - SetMetadata(*rest_context, *options); - return child_->AsyncInsertFutureReservation(cq, std::move(rest_context), - std::move(options), request); -} - -StatusOr -FutureReservationsRestMetadata::InsertFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - SetMetadata(rest_context, options); - return child_->InsertFutureReservation(rest_context, options, request); -} - -StatusOr -FutureReservationsRestMetadata::ListFutureReservations( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) { - SetMetadata(rest_context, options); - return child_->ListFutureReservations(rest_context, options, request); -} - -future> -FutureReservationsRestMetadata::AsyncUpdateFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - SetMetadata(*rest_context, *options); - return child_->AsyncUpdateFutureReservation(cq, std::move(rest_context), - std::move(options), request); -} - -StatusOr -FutureReservationsRestMetadata::UpdateFutureReservation( - rest_internal::RestContext& rest_context, Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - SetMetadata(rest_context, options); - return child_->UpdateFutureReservation(rest_context, options, request); -} - -future> -FutureReservationsRestMetadata::AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest const& - request) { - SetMetadata(*rest_context, *options); - return child_->AsyncGetOperation(cq, std::move(rest_context), - std::move(options), request); -} - -future FutureReservationsRestMetadata::AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - SetMetadata(*rest_context, *options); - return child_->AsyncCancelOperation(cq, std::move(rest_context), - std::move(options), request); -} - -void FutureReservationsRestMetadata::SetMetadata( - rest_internal::RestContext& rest_context, Options const& options, - std::vector const& params) { - google::cloud::rest_internal::SetMetadata(rest_context, options, params, - api_client_header_); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h deleted file mode 100644 index 767d7f59d1468..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_METADATA_DECORATOR_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_METADATA_DECORATOR_H - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/future.h" -#include "google/cloud/rest_options.h" -#include "google/cloud/version.h" -#include -#include -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -class FutureReservationsRestMetadata : public FutureReservationsRestStub { - public: - ~FutureReservationsRestMetadata() override = default; - explicit FutureReservationsRestMetadata( - std::shared_ptr child, - std::string api_client_header = ""); - - StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> - AggregatedListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) override; - - google::cloud::future> - AsyncCancel( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - StatusOr Cancel( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - google::cloud::future> - AsyncDeleteFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr DeleteFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr - GetFutureReservation(google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) override; - - google::cloud::future> - AsyncInsertFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr InsertFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr - ListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) override; - - google::cloud::future> - AsyncUpdateFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - StatusOr UpdateFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - google::cloud::future> - AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) override; - - google::cloud::future AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) override; - - private: - void SetMetadata(rest_internal::RestContext& rest_context, - Options const& options, - std::vector const& params = {}); - - std::shared_ptr child_; - std::string api_client_header_; -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_METADATA_DECORATOR_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.cc deleted file mode 100644 index a8de721c9d84b..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.cc +++ /dev/null @@ -1,416 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/common_options.h" -#include "google/cloud/internal/absl_str_cat_quiet.h" -#include "google/cloud/internal/rest_stub_helpers.h" -#include "google/cloud/status_or.h" -#include -#include -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -DefaultFutureReservationsRestStub::DefaultFutureReservationsRestStub( - Options options) - : service_(rest_internal::MakePooledRestClient( - options.get(), options)), - operations_(rest_internal::MakePooledRestClient( - options.get(), options)), - options_(std::move(options)) {} - -DefaultFutureReservationsRestStub::DefaultFutureReservationsRestStub( - std::shared_ptr service, - std::shared_ptr operations, Options options) - : service_(std::move(service)), - operations_(std::move(operations)), - options_(std::move(options)) {} - -StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> -DefaultFutureReservationsRestStub::AggregatedListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) { - std::vector> query_params; - query_params.push_back({"filter", request.filter()}); - query_params.push_back( - {"include_all_scopes", (request.include_all_scopes() ? "1" : "0")}); - query_params.push_back( - {"max_results", std::to_string(request.max_results())}); - query_params.push_back({"order_by", request.order_by()}); - query_params.push_back({"page_token", request.page_token()}); - query_params.push_back({"return_partial_success", - (request.return_partial_success() ? "1" : "0")}); - query_params.push_back( - {"service_project_number", request.service_project_number()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - return rest_internal::Get( - *service_, rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "aggregated", "/", - "futureReservations"), - std::move(query_params)); -} - -future> -DefaultFutureReservationsRestStub::AsyncCancel( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - promise> p; - future> f = - p.get_future(); - std::thread t{ - [](auto p, auto service, auto request, auto rest_context, auto options) { - std::vector> query_params; - p.set_value( - rest_internal::Post( - *service, *rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", *options), - "/", "projects", "/", request.project(), "/", - "zones", "/", request.zone(), "/", - "futureReservations", "/", - request.future_reservation(), "/", "cancel"), - std::move(query_params))); - }, - std::move(p), - service_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get(); - }); -} - -StatusOr -DefaultFutureReservationsRestStub::Cancel( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - std::vector> query_params; - return rest_internal::Post( - *service_, rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations", "/", - request.future_reservation(), "/", "cancel"), - std::move(query_params)); -} - -future> -DefaultFutureReservationsRestStub::AsyncDeleteFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - promise> p; - future> f = - p.get_future(); - std::thread t{ - [](auto p, auto service, auto request, auto rest_context, auto options) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - p.set_value( - rest_internal::Delete( - *service, *rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", *options), - "/", "projects", "/", request.project(), "/", - "zones", "/", request.zone(), "/", - "futureReservations", "/", - request.future_reservation()), - std::move(query_params))); - }, - std::move(p), - service_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get(); - }); -} - -StatusOr -DefaultFutureReservationsRestStub::DeleteFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - return rest_internal::Delete( - *service_, rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations", "/", - request.future_reservation()), - std::move(query_params)); -} - -StatusOr -DefaultFutureReservationsRestStub::GetFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - std::vector> query_params; - return rest_internal::Get( - *service_, rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations", "/", - request.future_reservation()), - std::move(query_params)); -} - -future> -DefaultFutureReservationsRestStub::AsyncInsertFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - promise> p; - future> f = - p.get_future(); - std::thread t{ - [](auto p, auto service, auto request, auto rest_context, auto options) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - p.set_value( - rest_internal::Post( - *service, *rest_context, request.future_reservation_resource(), - false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", *options), - "/", "projects", "/", request.project(), "/", - "zones", "/", request.zone(), "/", - "futureReservations"), - std::move(query_params))); - }, - std::move(p), - service_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get(); - }); -} - -StatusOr -DefaultFutureReservationsRestStub::InsertFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - return rest_internal::Post( - *service_, rest_context, request.future_reservation_resource(), false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations"), - std::move(query_params)); -} - -StatusOr -DefaultFutureReservationsRestStub::ListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) { - std::vector> query_params; - query_params.push_back({"filter", request.filter()}); - query_params.push_back( - {"max_results", std::to_string(request.max_results())}); - query_params.push_back({"order_by", request.order_by()}); - query_params.push_back({"page_token", request.page_token()}); - query_params.push_back({"return_partial_success", - (request.return_partial_success() ? "1" : "0")}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - return rest_internal::Get< - google::cloud::cpp::compute::v1::FutureReservationsListResponse>( - *service_, rest_context, request, false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations"), - std::move(query_params)); -} - -future> -DefaultFutureReservationsRestStub::AsyncUpdateFutureReservation( - CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - promise> p; - future> f = - p.get_future(); - std::thread t{ - [](auto p, auto service, auto request, auto rest_context, auto options) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params.push_back({"update_mask", request.update_mask()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - p.set_value( - rest_internal::Patch( - *service, *rest_context, request.future_reservation_resource(), - false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", *options), - "/", "projects", "/", request.project(), "/", - "zones", "/", request.zone(), "/", - "futureReservations", "/", - request.future_reservation()), - std::move(query_params))); - }, - std::move(p), - service_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get(); - }); -} - -StatusOr -DefaultFutureReservationsRestStub::UpdateFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - std::vector> query_params; - query_params.push_back({"request_id", request.request_id()}); - query_params.push_back({"update_mask", request.update_mask()}); - query_params = - rest_internal::TrimEmptyQueryParameters(std::move(query_params)); - return rest_internal::Patch( - *service_, rest_context, request.future_reservation_resource(), false, - absl::StrCat("/", "compute", "/", - rest_internal::DetermineApiVersion("v1", options), "/", - "projects", "/", request.project(), "/", "zones", "/", - request.zone(), "/", "futureReservations", "/", - request.future_reservation()), - std::move(query_params)); -} - -future> -DefaultFutureReservationsRestStub::AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1::GetOperationRequest const& - request) { - promise> p; - future> f = - p.get_future(); - std::thread t{ - [](auto p, auto operations, auto request, auto rest_context, - auto options) { - p.set_value( - rest_internal::Get( - *operations, *rest_context, request, false, - absl::StrCat("/compute/", - rest_internal::DetermineApiVersion("v1", *options), - "/projects/", request.project(), "/zones/", - request.zone(), "/operations/", - request.operation()))); - }, - std::move(p), - operations_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get(); - }); -} - -future DefaultFutureReservationsRestStub::AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) { - promise> p; - future> f = p.get_future(); - std::thread t{ - [](auto p, auto operations, auto request, auto rest_context, - auto options) { - p.set_value(rest_internal::Post( - *operations, *rest_context, request, false, - absl::StrCat("/compute/", - rest_internal::DetermineApiVersion("v1", *options), - "/projects/", request.project(), "/zones/", - request.zone(), "/operations/", request.operation()))); - }, - std::move(p), - operations_, - request, - std::move(rest_context), - std::move(options)}; - return f.then([t = std::move(t), cq](auto f) mutable { - cq.RunAsync([t = std::move(t)]() mutable { t.join(); }); - return f.get().status(); - }); -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h deleted file mode 100644 index 9e450284a7c7d..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_H - -#include "google/cloud/completion_queue.h" -#include "google/cloud/internal/rest_client.h" -#include "google/cloud/internal/rest_context.h" -#include "google/cloud/status_or.h" -#include "google/cloud/version.h" -#include -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -class FutureReservationsRestStub { - public: - virtual ~FutureReservationsRestStub() = default; - - virtual StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> - AggregatedListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) = 0; - - virtual future> - AsyncCancel( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) = 0; - - virtual StatusOr Cancel( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) = 0; - - virtual future> - AsyncDeleteFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) = 0; - - virtual StatusOr - DeleteFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) = 0; - - virtual StatusOr - GetFutureReservation(google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) = 0; - - virtual future> - AsyncInsertFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) = 0; - - virtual StatusOr - InsertFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) = 0; - - virtual StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsListResponse> - ListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) = 0; - - virtual future> - AsyncUpdateFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) = 0; - - virtual StatusOr - UpdateFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) = 0; - - virtual future> - AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) = 0; - - virtual future AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) = 0; -}; - -class DefaultFutureReservationsRestStub : public FutureReservationsRestStub { - public: - ~DefaultFutureReservationsRestStub() override = default; - - explicit DefaultFutureReservationsRestStub(Options options); - DefaultFutureReservationsRestStub( - std::shared_ptr service, - std::shared_ptr operations, Options options); - - StatusOr< - google::cloud::cpp::compute::v1::FutureReservationsAggregatedListResponse> - AggregatedListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest const& request) override; - - future> AsyncCancel( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - StatusOr Cancel( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - future> - AsyncDeleteFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr DeleteFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr - GetFutureReservation(google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) override; - - future> - AsyncInsertFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr InsertFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr - ListFutureReservations( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest const& request) override; - - future> - AsyncUpdateFutureReservation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - StatusOr UpdateFutureReservation( - google::cloud::rest_internal::RestContext& rest_context, - Options const& options, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - future> - AsyncGetOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - GetOperationRequest const& request) override; - - future AsyncCancelOperation( - google::cloud::CompletionQueue& cq, - std::unique_ptr rest_context, - google::cloud::internal::ImmutableOptions options, - google::cloud::cpp::compute::zone_operations::v1:: - DeleteOperationRequest const& request) override; - - private: - std::shared_ptr service_; - std::shared_ptr operations_; - Options options_; -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.cc deleted file mode 100644 index 65e86145a5bd9..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.cc +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.h" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/common_options.h" -#include "google/cloud/internal/algorithm.h" -#include "google/cloud/internal/populate_rest_options.h" -#include "google/cloud/log.h" -#include "google/cloud/options.h" -#include "google/cloud/rest_options.h" -#include "absl/strings/match.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -std::shared_ptr -CreateDefaultFutureReservationsRestStub(Options const& options) { - auto opts = internal::PopulateRestOptions(options); - std::shared_ptr stub = - std::make_shared(std::move(opts)); - stub = std::make_shared(std::move(stub)); - if (internal::Contains(options.get(), "rpc")) { - GCP_LOG(INFO) << "Enabled logging for REST rpc calls"; - stub = std::make_shared( - std::move(stub), options.get(), - options.get()); - } - return stub; -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h deleted file mode 100644 index 88fd18d5b90fb..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_FACTORY_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_FACTORY_H - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.h" -#include "google/cloud/options.h" -#include "google/cloud/version.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -std::shared_ptr -CreateDefaultFutureReservationsRestStub(Options const& options); - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_REST_STUB_FACTORY_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h deleted file mode 100644 index 7bda2a8cb888e..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_retry_traits.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_RETRY_TRAITS_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_RETRY_TRAITS_H - -#include "google/cloud/status.h" -#include "google/cloud/version.h" - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/// Define the gRPC status code semantics for retrying requests. -struct FutureReservationsRetryTraits { - static bool IsPermanentFailure(google::cloud::Status const& status) { - return status.code() != StatusCode::kOk && - status.code() != StatusCode::kUnavailable; - } -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_RETRY_TRAITS_H diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_sources.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_sources.cc deleted file mode 100644 index 085ae1b595e72..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_sources.cc +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -// NOLINTBEGIN(bugprone-suspicious-include) -#include "google/cloud/compute/future_reservations/v1/future_reservations_client.cc" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.cc" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.cc" -#include "google/cloud/compute/future_reservations/v1/future_reservations_rest_connection.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_option_defaults.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_connection_impl.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_logging_decorator.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_metadata_decorator.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_rest_stub_factory.cc" -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.cc" -// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.cc b/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.cc deleted file mode 100644 index 1182c95c13af4..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.cc +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h" -#include "google/cloud/internal/opentelemetry.h" -#include "google/cloud/internal/traced_stream_range.h" -#include -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - -FutureReservationsTracingConnection::FutureReservationsTracingConnection( - std::shared_ptr< - compute_future_reservations_v1::FutureReservationsConnection> - child) - : child_(std::move(child)) {} - -StreamRange> -FutureReservationsTracingConnection::AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "AggregatedListFutureReservations"); - internal::OTelScope scope(span); - auto sr = child_->AggregatedListFutureReservations(std::move(request)); - return internal::MakeTracedStreamRange< - std::pair>( - std::move(span), std::move(sr)); -} - -future> -FutureReservationsTracingConnection::Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::Cancel"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), child_->Cancel(request)); -} - -StatusOr -FutureReservationsTracingConnection::Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::Cancel"); - opentelemetry::trace::Scope scope(span); - return internal::EndSpan(*span, child_->Cancel(NoAwaitTag{}, request)); -} - -future> -FutureReservationsTracingConnection::Cancel( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::Cancel"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), child_->Cancel(operation)); -} - -future> -FutureReservationsTracingConnection::DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "DeleteFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->DeleteFutureReservation(request)); -} - -StatusOr -FutureReservationsTracingConnection::DeleteFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "DeleteFutureReservation"); - opentelemetry::trace::Scope scope(span); - return internal::EndSpan( - *span, child_->DeleteFutureReservation(NoAwaitTag{}, request)); -} - -future> -FutureReservationsTracingConnection::DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "DeleteFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->DeleteFutureReservation(operation)); -} - -StatusOr -FutureReservationsTracingConnection::GetFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "GetFutureReservation"); - auto scope = opentelemetry::trace::Scope(span); - return internal::EndSpan(*span, child_->GetFutureReservation(request)); -} - -future> -FutureReservationsTracingConnection::InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "InsertFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->InsertFutureReservation(request)); -} - -StatusOr -FutureReservationsTracingConnection::InsertFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "InsertFutureReservation"); - opentelemetry::trace::Scope scope(span); - return internal::EndSpan( - *span, child_->InsertFutureReservation(NoAwaitTag{}, request)); -} - -future> -FutureReservationsTracingConnection::InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "InsertFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->InsertFutureReservation(operation)); -} - -StreamRange -FutureReservationsTracingConnection::ListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "ListFutureReservations"); - internal::OTelScope scope(span); - auto sr = child_->ListFutureReservations(std::move(request)); - return internal::MakeTracedStreamRange< - google::cloud::cpp::compute::v1::FutureReservation>(std::move(span), - std::move(sr)); -} - -future> -FutureReservationsTracingConnection::UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "UpdateFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->UpdateFutureReservation(request)); -} - -StatusOr -FutureReservationsTracingConnection::UpdateFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "UpdateFutureReservation"); - opentelemetry::trace::Scope scope(span); - return internal::EndSpan( - *span, child_->UpdateFutureReservation(NoAwaitTag{}, request)); -} - -future> -FutureReservationsTracingConnection::UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) { - auto span = internal::MakeSpan( - "compute_future_reservations_v1::FutureReservationsConnection::" - "UpdateFutureReservation"); - internal::OTelScope scope(span); - return internal::EndSpan(std::move(span), - child_->UpdateFutureReservation(operation)); -} - -#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - -std::shared_ptr -MakeFutureReservationsTracingConnection( - std::shared_ptr< - compute_future_reservations_v1::FutureReservationsConnection> - conn) { -#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - if (internal::TracingEnabled(conn->options())) { - conn = - std::make_shared(std::move(conn)); - } -#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - return conn; -} - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google diff --git a/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h b/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h deleted file mode 100644 index e8d639b255b48..0000000000000 --- a/google/cloud/compute/future_reservations/v1/internal/future_reservations_tracing_connection.h +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_TRACING_CONNECTION_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_TRACING_CONNECTION_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include "google/cloud/version.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_internal { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - -class FutureReservationsTracingConnection - : public compute_future_reservations_v1::FutureReservationsConnection { - public: - ~FutureReservationsTracingConnection() override = default; - - explicit FutureReservationsTracingConnection( - std::shared_ptr< - compute_future_reservations_v1::FutureReservationsConnection> - child); - - Options options() override { return child_->options(); } - - StreamRange< - std::pair> - AggregatedListFutureReservations( - google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request) override; - - future> Cancel( - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - StatusOr Cancel( - NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1::CancelRequest const& - request) override; - - future> Cancel( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - future> - DeleteFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - StatusOr DeleteFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request) override; - - future> - DeleteFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - StatusOr - GetFutureReservation(google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request) override; - - future> - InsertFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - StatusOr InsertFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request) override; - - future> - InsertFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - StreamRange - ListFutureReservations(google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request) override; - - future> - UpdateFutureReservation( - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - StatusOr UpdateFutureReservation( - NoAwaitTag, google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request) override; - - future> - UpdateFutureReservation( - google::cloud::cpp::compute::v1::Operation const& operation) override; - - private: - std::shared_ptr - child_; -}; - -#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY - -/** - * Conditionally applies the tracing decorator to the given connection. - * - * The connection is only decorated if tracing is enabled (as determined by the - * connection's options). - */ -std::shared_ptr -MakeFutureReservationsTracingConnection( - std::shared_ptr< - compute_future_reservations_v1::FutureReservationsConnection> - conn); - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_internal -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_INTERNAL_FUTURE_RESERVATIONS_TRACING_CONNECTION_H diff --git a/google/cloud/compute/future_reservations/v1/mocks/mock_future_reservations_connection.h b/google/cloud/compute/future_reservations/v1/mocks/mock_future_reservations_connection.h deleted file mode 100644 index 9bf2d02acf012..0000000000000 --- a/google/cloud/compute/future_reservations/v1/mocks/mock_future_reservations_connection.h +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_MOCKS_MOCK_FUTURE_RESERVATIONS_CONNECTION_H -#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_MOCKS_MOCK_FUTURE_RESERVATIONS_CONNECTION_H - -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection.h" -#include - -namespace google { -namespace cloud { -namespace compute_future_reservations_v1_mocks { -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN - -/** - * A class to mock `FutureReservationsConnection`. - * - * Application developers may want to test their code with simulated responses, - * including errors, from an object of type `FutureReservationsClient`. To do - * so, construct an object of type `FutureReservationsClient` with an instance - * of this class. Then use the Google Test framework functions to program the - * behavior of this mock. - * - * @see [This example][bq-mock] for how to test your application with GoogleTest. - * While the example showcases types from the BigQuery library, the underlying - * principles apply for any pair of `*Client` and `*Connection`. - * - * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} - */ -class MockFutureReservationsConnection - : public compute_future_reservations_v1::FutureReservationsConnection { - public: - MOCK_METHOD(Options, options, (), (override)); - - MOCK_METHOD( - (StreamRange>), - AggregatedListFutureReservations, - (google::cloud::cpp::compute::future_reservations::v1:: - AggregatedListFutureReservationsRequest request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// Cancel(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - Cancel, - (google::cloud::cpp::compute::future_reservations::v1:: - CancelRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// EXPECT_CALL(*mock, Cancel(_, _)) - /// @endcode - MOCK_METHOD(StatusOr, Cancel, - (NoAwaitTag, google::cloud::cpp::compute::future_reservations:: - v1::CancelRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// Cancel(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - Cancel, - (google::cloud::cpp::compute::v1::Operation const& operation), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// DeleteFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - DeleteFutureReservation, - (google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// EXPECT_CALL(*mock, DeleteFutureReservation(_, _)) - /// @endcode - MOCK_METHOD(StatusOr, - DeleteFutureReservation, - (NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - DeleteFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// DeleteFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - DeleteFutureReservation, - (google::cloud::cpp::compute::v1::Operation const& operation), - (override)); - - MOCK_METHOD(StatusOr, - GetFutureReservation, - (google::cloud::cpp::compute::future_reservations::v1:: - GetFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// InsertFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - InsertFutureReservation, - (google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// EXPECT_CALL(*mock, InsertFutureReservation(_, _)) - /// @endcode - MOCK_METHOD(StatusOr, - InsertFutureReservation, - (NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - InsertFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// InsertFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - InsertFutureReservation, - (google::cloud::cpp::compute::v1::Operation const& operation), - (override)); - - MOCK_METHOD((StreamRange), - ListFutureReservations, - (google::cloud::cpp::compute::future_reservations::v1:: - ListFutureReservationsRequest request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// UpdateFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - UpdateFutureReservation, - (google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// EXPECT_CALL(*mock, UpdateFutureReservation(_, _)) - /// @endcode - MOCK_METHOD(StatusOr, - UpdateFutureReservation, - (NoAwaitTag, - google::cloud::cpp::compute::future_reservations::v1:: - UpdateFutureReservationRequest const& request), - (override)); - - /// To disambiguate calls, use: - /// - /// @code - /// using ::testing::_; - /// using ::testing::Matcher; - /// EXPECT_CALL(*mock, - /// UpdateFutureReservation(Matcher(_))) - /// @endcode - MOCK_METHOD(future>, - UpdateFutureReservation, - (google::cloud::cpp::compute::v1::Operation const& operation), - (override)); -}; - -GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END -} // namespace compute_future_reservations_v1_mocks -} // namespace cloud -} // namespace google - -#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_COMPUTE_FUTURE_RESERVATIONS_V1_MOCKS_MOCK_FUTURE_RESERVATIONS_CONNECTION_H diff --git a/google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc b/google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc deleted file mode 100644 index 4ba528f9e5c43..0000000000000 --- a/google/cloud/compute/future_reservations/v1/samples/future_reservations_client_samples.cc +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright 2024 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Generated by the Codegen C++ plugin. -// If you make any local changes, they will be lost. -// source: google/cloud/compute/future_reservations/v1/future_reservations.proto - -#include "google/cloud/compute/future_reservations/v1/future_reservations_client.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_connection_idempotency_policy.h" -#include "google/cloud/compute/future_reservations/v1/future_reservations_options.h" -#include "google/cloud/common_options.h" -#include "google/cloud/credentials.h" -#include "google/cloud/internal/getenv.h" -#include "google/cloud/polling_policy.h" -#include "google/cloud/testing_util/example_driver.h" -#include -#include -#include -#include - -// clang-format off -// main-dox-marker: compute_future_reservations_v1::FutureReservationsClient -// lro-marker: true -// clang-format on -namespace { - -void SetClientEndpoint(std::vector const& argv) { - if (!argv.empty()) { - throw google::cloud::testing_util::Usage{"set-client-endpoint"}; - } - //! [set-client-endpoint] - // This configuration is common with Private Google Access: - // https://cloud.google.com/vpc/docs/private-google-access - auto options = google::cloud::Options{}.set( - "private.googleapis.com"); - auto client = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - google::cloud::compute_future_reservations_v1:: - MakeFutureReservationsConnectionRest(options)); - //! [set-client-endpoint] -} - -//! [custom-idempotency-policy] -class CustomIdempotencyPolicy - : public google::cloud::compute_future_reservations_v1:: - FutureReservationsConnectionIdempotencyPolicy { - public: - ~CustomIdempotencyPolicy() override = default; - std::unique_ptr - clone() const override { - return std::make_unique(*this); - } - // Override inherited functions to define as needed. -}; -//! [custom-idempotency-policy] - -void SetRetryPolicy(std::vector const& argv) { - if (!argv.empty()) { - throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; - } - //! [set-retry-policy] - auto options = - google::cloud::Options{} - .set( - CustomIdempotencyPolicy().clone()) - .set( - google::cloud::compute_future_reservations_v1:: - FutureReservationsLimitedErrorCountRetryPolicy(3) - .clone()) - .set( - google::cloud::ExponentialBackoffPolicy( - /*initial_delay=*/std::chrono::milliseconds(200), - /*maximum_delay=*/std::chrono::seconds(45), - /*scaling=*/2.0) - .clone()); - auto connection = google::cloud::compute_future_reservations_v1:: - MakeFutureReservationsConnectionRest(options); - - // c1 and c2 share the same retry policies - auto c1 = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - connection); - auto c2 = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - connection); - - // You can override any of the policies in a new client. This new client - // will share the policies from c1 (or c2) *except* for the retry policy. - auto c3 = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - connection, google::cloud::Options{} - .set( - google::cloud::compute_future_reservations_v1:: - FutureReservationsLimitedTimeRetryPolicy( - std::chrono::minutes(5)) - .clone())); - - // You can also override the policies in a single call: - // c3.SomeRpc(..., google::cloud::Options{} - // .set( - // google::cloud::compute_future_reservations_v1::FutureReservationsLimitedErrorCountRetryPolicy(10).clone())); - //! [set-retry-policy] -} - -void SetPollingPolicy(std::vector const& argv) { - if (!argv.empty()) { - throw google::cloud::testing_util::Usage{"set-client-policy-policy"}; - } - //! [set-polling-policy] - - // The polling policy controls how the client waits for long-running - // operations. `GenericPollingPolicy<>` combines existing policies. - // In this case, keep polling until the operation completes (with success - // or error) or 45 minutes, whichever happens first. Initially pause for - // 10 seconds between polling requests, increasing the pause by a factor - // of 4 until it becomes 2 minutes. - auto options = - google::cloud::Options{} - .set( - google::cloud::GenericPollingPolicy< - google::cloud::compute_future_reservations_v1:: - FutureReservationsRetryPolicyOption::Type, - google::cloud::compute_future_reservations_v1:: - FutureReservationsBackoffPolicyOption::Type>( - google::cloud::compute_future_reservations_v1:: - FutureReservationsLimitedTimeRetryPolicy( - /*maximum_duration=*/std::chrono::minutes(45)) - .clone(), - google::cloud::ExponentialBackoffPolicy( - /*initial_delay=*/std::chrono::seconds(10), - /*maximum_delay=*/std::chrono::minutes(2), - /*scaling=*/4.0) - .clone()) - .clone()); - - auto connection = google::cloud::compute_future_reservations_v1:: - MakeFutureReservationsConnectionRest(options); - - // c1 and c2 share the same polling policies. - auto c1 = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - connection); - auto c2 = - google::cloud::compute_future_reservations_v1::FutureReservationsClient( - connection); - //! [set-polling-policy] -} - -void WithServiceAccount(std::vector const& argv) { - if (argv.size() != 1 || argv[0] == "--help") { - throw google::cloud::testing_util::Usage{"with-service-account "}; - } - //! [with-service-account] - [](std::string const& keyfile) { - auto is = std::ifstream(keyfile); - is.exceptions(std::ios::badbit); // Minimal error handling in examples - auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); - auto options = - google::cloud::Options{}.set( - google::cloud::MakeServiceAccountCredentials(contents)); - return google::cloud::compute_future_reservations_v1:: - FutureReservationsClient( - google::cloud::compute_future_reservations_v1:: - MakeFutureReservationsConnectionRest(options)); - } - //! [with-service-account] - (argv.at(0)); -} - -void AutoRun(std::vector const& argv) { - namespace examples = ::google::cloud::testing_util; - using ::google::cloud::internal::GetEnv; - if (!argv.empty()) throw examples::Usage{"auto"}; - examples::CheckEnvironmentVariablesAreSet( - {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); - auto const keyfile = - GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); - - std::cout << "\nRunning SetClientEndpoint() example" << std::endl; - SetClientEndpoint({}); - - std::cout << "\nRunning SetRetryPolicy() example" << std::endl; - SetRetryPolicy({}); - - std::cout << "\nRunning SetPollingPolicy() example" << std::endl; - SetPollingPolicy({}); - - std::cout << "\nRunning WithServiceAccount() example" << std::endl; - WithServiceAccount({keyfile}); -} - -} // namespace - -int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) - google::cloud::testing_util::Example example({ - {"set-client-endpoint", SetClientEndpoint}, - {"set-retry-policy", SetRetryPolicy}, - {"set-polling-policy", SetPollingPolicy}, - {"with-service-account", WithServiceAccount}, - {"auto", AutoRun}, - }); - return example.Run(argc, argv); -} diff --git a/google/cloud/compute/service_dirs.bzl b/google/cloud/compute/service_dirs.bzl index 92b72d7f36c80..c8f59773527cc 100644 --- a/google/cloud/compute/service_dirs.bzl +++ b/google/cloud/compute/service_dirs.bzl @@ -28,7 +28,6 @@ service_dirs = [ "firewall_policies/v1/", "firewalls/v1/", "forwarding_rules/v1/", - "future_reservations/v1/", "global_addresses/v1/", "global_forwarding_rules/v1/", "global_network_endpoint_groups/v1/", diff --git a/google/cloud/compute/service_dirs.cmake b/google/cloud/compute/service_dirs.cmake index ba512ba76d9e7..d65102a40ec62 100644 --- a/google/cloud/compute/service_dirs.cmake +++ b/google/cloud/compute/service_dirs.cmake @@ -27,7 +27,6 @@ set(service_dirs "firewall_policies/v1/" "firewalls/v1/" "forwarding_rules/v1/" - "future_reservations/v1/" "global_addresses/v1/" "global_forwarding_rules/v1/" "global_network_endpoint_groups/v1/" From a41a13674881a93a6946866068bc180fb4c79df4 Mon Sep 17 00:00:00 2001 From: Darren Bolduc Date: Thu, 31 Oct 2024 12:23:51 -0400 Subject: [PATCH 5/5] impl: parse impersonated ADC json (#14809) --- ...impersonate_service_account_credentials.cc | 100 ++++++++++++++++++ ..._impersonate_service_account_credentials.h | 13 +++ ...sonate_service_account_credentials_test.cc | 76 +++++++++++++ 3 files changed, 189 insertions(+) diff --git a/google/cloud/internal/oauth2_impersonate_service_account_credentials.cc b/google/cloud/internal/oauth2_impersonate_service_account_credentials.cc index f297050c043c4..16dfbb286a0d6 100644 --- a/google/cloud/internal/oauth2_impersonate_service_account_credentials.cc +++ b/google/cloud/internal/oauth2_impersonate_service_account_credentials.cc @@ -13,8 +13,11 @@ // limitations under the License. #include "google/cloud/internal/oauth2_impersonate_service_account_credentials.h" +#include "google/cloud/internal/make_status.h" #include "google/cloud/internal/oauth2_credential_constants.h" #include "google/cloud/internal/unified_rest_credentials.h" +#include "absl/strings/strip.h" +#include namespace google { namespace cloud { @@ -34,6 +37,103 @@ GenerateAccessTokenRequest MakeRequest( } // namespace +StatusOr +ParseImpersonatedServiceAccountCredentials(std::string const& content, + std::string const& source) { + auto credentials = nlohmann::json::parse(content, nullptr, false); + if (credentials.is_discarded()) { + return internal::InvalidArgumentError( + "Invalid ImpersonateServiceAccountCredentials, parsing failed on data " + "from " + + source, + GCP_ERROR_INFO()); + } + + ImpersonatedServiceAccountCredentialsInfo info; + + auto it = credentials.find("service_account_impersonation_url"); + if (it == credentials.end()) { + return internal::InvalidArgumentError( + "Missing `service_account_impersonation_url` field on data from " + + source, + GCP_ERROR_INFO()); + } + if (!it->is_string()) { + return internal::InvalidArgumentError( + "Malformed `service_account_impersonation_url` field is not a string " + "on data from " + + source, + GCP_ERROR_INFO()); + } + // We strip the service account from the path URL. + auto url = it->get(); + auto colon = url.rfind(':'); + if (colon == std::string::npos) { + return internal::InvalidArgumentError( + "Malformed `service_account_impersonation_url` field contents on data " + "from " + + source, + GCP_ERROR_INFO()); + } + if (url.substr(colon) != ":generateAccessToken") { + // While `generateIdToken` is a valid RPC, we do not currently support ID + // token flow. So we might as well error when parsing the credentials. + return internal::InvalidArgumentError( + "Only access token authentication is supported for impersonated " + "service accounts from " + + source, + GCP_ERROR_INFO()); + } + auto slash = url.rfind('/', colon); + if (slash == std::string::npos) { + return internal::InvalidArgumentError( + "Malformed `service_account_impersonation_url` field contents on data " + "from " + + source, + GCP_ERROR_INFO()); + } + info.service_account = std::string{url.substr(slash + 1, colon - slash - 1)}; + + it = credentials.find("delegates"); + if (it != credentials.end()) { + if (!it->is_array()) { + return internal::InvalidArgumentError( + "Malformed `delegates` field is not an array on data from " + source, + GCP_ERROR_INFO()); + } + for (auto const& delegate : it->items()) { + info.delegates.push_back(delegate.value().get()); + } + } + + it = credentials.find("quota_project_id"); + if (it != credentials.end()) { + if (!it->is_string()) { + return internal::InvalidArgumentError( + "Malformed `quota_project_id` field is not a string on data from " + + source, + GCP_ERROR_INFO()); + } + info.quota_project_id = it->get(); + } + + it = credentials.find("source_credentials"); + if (it == credentials.end()) { + return internal::InvalidArgumentError( + "Missing `source_credentials` field on data from " + source, + GCP_ERROR_INFO()); + } + if (!it->is_object()) { + return internal::InvalidArgumentError( + "Malformed `source_credentials` field is not an object on data from " + + source, + GCP_ERROR_INFO()); + } + info.source_credentials = it->dump(); + + return info; +} + ImpersonateServiceAccountCredentials::ImpersonateServiceAccountCredentials( google::cloud::internal::ImpersonateServiceAccountConfig const& config, HttpClientFactory client_factory) diff --git a/google/cloud/internal/oauth2_impersonate_service_account_credentials.h b/google/cloud/internal/oauth2_impersonate_service_account_credentials.h index ca80cbe572f4b..2cec516420a59 100644 --- a/google/cloud/internal/oauth2_impersonate_service_account_credentials.h +++ b/google/cloud/internal/oauth2_impersonate_service_account_credentials.h @@ -26,6 +26,19 @@ namespace cloud { namespace oauth2_internal { GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +struct ImpersonatedServiceAccountCredentialsInfo { + std::string service_account; + std::vector delegates; + absl::optional quota_project_id; + std::string source_credentials; +}; + +/// Parses the contents of a JSON keyfile into an +/// ImpersonatedServiceAccountCredentialsInfo. +StatusOr +ParseImpersonatedServiceAccountCredentials(std::string const& content, + std::string const& source); + /** * Provides Credentials when impersonating an existing service account. */ diff --git a/google/cloud/internal/oauth2_impersonate_service_account_credentials_test.cc b/google/cloud/internal/oauth2_impersonate_service_account_credentials_test.cc index a3e585d2e1feb..96563806cf687 100644 --- a/google/cloud/internal/oauth2_impersonate_service_account_credentials_test.cc +++ b/google/cloud/internal/oauth2_impersonate_service_account_credentials_test.cc @@ -15,6 +15,7 @@ #include "google/cloud/internal/oauth2_impersonate_service_account_credentials.h" #include "google/cloud/testing_util/status_matchers.h" #include +#include #include namespace google { @@ -30,8 +31,83 @@ using ::google::cloud::testing_util::IsOkAndHolds; using ::google::cloud::testing_util::StatusIs; using ::std::chrono::minutes; using ::std::chrono::seconds; +using ::testing::AllOf; +using ::testing::ElementsAre; +using ::testing::HasSubstr; +using ::testing::Optional; using ::testing::Return; +auto constexpr kFullValidConfig = R"""({ + "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/sa3@developer.gserviceaccount.com:generateAccessToken", + "delegates": [ + "sa1@developer.gserviceaccount.com", + "sa2@developer.gserviceaccount.com" + ], + "quota_project_id": "my-project", + "source_credentials": { + "type": "authorized_user" + }, + "type": "impersonated_service_account" +})"""; + +TEST(ParseImpersonatedServiceAccountCredentials, Success) { + auto actual = + ParseImpersonatedServiceAccountCredentials(kFullValidConfig, "test-data"); + ASSERT_STATUS_OK(actual); + EXPECT_EQ(actual->service_account, "sa3@developer.gserviceaccount.com"); + EXPECT_THAT(actual->delegates, + ElementsAre("sa1@developer.gserviceaccount.com", + "sa2@developer.gserviceaccount.com")); + EXPECT_THAT(actual->quota_project_id, Optional("my-project")); + EXPECT_THAT(actual->source_credentials, + AllOf(HasSubstr("type"), HasSubstr("authorized_user"))); +} + +TEST(ParseImpersonatedServiceAccountCredentials, MissingRequiredFieldsError) { + for (auto const& required_field : + {"service_account_impersonation_url", "source_credentials"}) { + auto json = nlohmann::json::parse(kFullValidConfig); + json.erase(required_field); + auto actual = ParseImpersonatedServiceAccountCredentials(json.dump(), ""); + EXPECT_THAT(actual, StatusIs(StatusCode::kInvalidArgument, + AllOf(HasSubstr("Missing"), + HasSubstr(required_field)))); + } +} + +TEST(ParseImpersonatedServiceAccountCredentials, MissingOptionalFieldsIsOk) { + for (auto const& optional_field : {"delegates", "quota_project_id"}) { + auto json = nlohmann::json::parse(kFullValidConfig); + json.erase(optional_field); + auto actual = ParseImpersonatedServiceAccountCredentials(json.dump(), ""); + EXPECT_STATUS_OK(actual); + } +} + +TEST(ParseImpersonatedServiceAccountCredentials, MalformedServiceAccountPath) { + auto json = nlohmann::json::parse(kFullValidConfig); + json["service_account_impersonation_url"] = "not-a-valid-url-path"; + auto actual = ParseImpersonatedServiceAccountCredentials(json.dump(), ""); + EXPECT_THAT(actual, + StatusIs(StatusCode::kInvalidArgument, + AllOf(HasSubstr("Malformed"), + HasSubstr("service_account_impersonation_url"), + HasSubstr("contents")))); +} + +TEST(ParseImpersonatedServiceAccountCredentials, MalformedJsonFields) { + for (auto const& non_int_field : + {"service_account_impersonation_url", "delegates", "quota_project_id", + "source_credentials"}) { + auto json = nlohmann::json::parse(kFullValidConfig); + json[non_int_field] = 0; // Provide an unexpected JSON type + auto actual = ParseImpersonatedServiceAccountCredentials(json.dump(), ""); + EXPECT_THAT(actual, StatusIs(StatusCode::kInvalidArgument, + AllOf(HasSubstr("Malformed"), + HasSubstr(non_int_field)))); + } +} + class MockMinimalIamCredentialsRest : public MinimalIamCredentialsRest { public: MOCK_METHOD(StatusOr, GenerateAccessToken,