From e59f10b123248fef685f84125faa447535713fe2 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 18 Oct 2022 15:24:04 +0200 Subject: [PATCH 01/12] chore(deps): update all dependencies (#492) --- samples/snippets/requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index a5c953b4..e4915aee 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,8 +1,8 @@ backoff==2.2.1 grpcio==1.49.1 -google-auth==2.12.0 +google-auth==2.13.0 google-auth-httplib2==0.1.0 google-cloud==0.34.0 google-cloud-storage==2.5.0 -google-cloud-dataproc==5.0.2 +google-cloud-dataproc==5.0.3 From 9877340a7555782fef963063f66d9076a9fb73ec Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 19 Oct 2022 16:04:17 +0200 Subject: [PATCH 02/12] chore(deps): update dependency grpcio to v1.50.0 (#493) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index e4915aee..658daf9f 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,6 +1,6 @@ backoff==2.2.1 -grpcio==1.49.1 +grpcio==1.50.0 google-auth==2.13.0 google-auth-httplib2==0.1.0 google-cloud==0.34.0 From 5777e99956c24058675a8070f660835ef33c1f36 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Wed, 26 Oct 2022 12:56:49 +0200 Subject: [PATCH 03/12] chore(deps): update all dependencies (#494) --- samples/snippets/requirements-test.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt index 1f2265d6..0c53ad2e 100644 --- a/samples/snippets/requirements-test.txt +++ b/samples/snippets/requirements-test.txt @@ -1,2 +1,2 @@ -pytest==7.1.3 -pytest-xdist==2.5.0 \ No newline at end of file +pytest==7.2.0 +pytest-xdist==3.0.2 \ No newline at end of file From b25aff2d740836d2ad072842b03ecda9e16ccd03 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Tue, 1 Nov 2022 14:08:42 +0100 Subject: [PATCH 04/12] chore(deps): update dependency google-auth to v2.14.0 (#496) --- samples/snippets/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 658daf9f..9414a8d3 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,7 +1,7 @@ backoff==2.2.1 grpcio==1.50.0 -google-auth==2.13.0 +google-auth==2.14.0 google-auth-httplib2==0.1.0 google-cloud==0.34.0 google-cloud-storage==2.5.0 From 993dd24f25583f2716150bfa3766324f7b17ed4f Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 02:20:33 +0000 Subject: [PATCH 05/12] chore(python): update dependencies in .kokoro/requirements.txt [autoapprove] (#497) Source-Link: https://togithub.com/googleapis/synthtool/commit/e3a1277ac35fc88c09db1930533e24292b132ced Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:452901c74a22f9b9a3bd02bce780b8e8805c97270d424684bff809ce5be8c2a2 --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 325 +++++++++++++++++++++----------------- noxfile.py | 11 +- 3 files changed, 187 insertions(+), 151 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 3815c983..12edee77 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 + digest: sha256:452901c74a22f9b9a3bd02bce780b8e8805c97270d424684bff809ce5be8c2a2 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index d15994ba..31425f16 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.6.15 \ - --hash=sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d \ - --hash=sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412 +certifi==2022.9.24 \ + --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ + --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ @@ -110,29 +110,33 @@ commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 # via rich -cryptography==37.0.4 \ - --hash=sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59 \ - --hash=sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596 \ - --hash=sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3 \ - --hash=sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5 \ - --hash=sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab \ - --hash=sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884 \ - --hash=sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82 \ - --hash=sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b \ - --hash=sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441 \ - --hash=sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa \ - --hash=sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d \ - --hash=sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b \ - --hash=sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a \ - --hash=sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6 \ - --hash=sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157 \ - --hash=sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280 \ - --hash=sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282 \ - --hash=sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67 \ - --hash=sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8 \ - --hash=sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046 \ - --hash=sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327 \ - --hash=sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9 +cryptography==38.0.3 \ + --hash=sha256:068147f32fa662c81aebab95c74679b401b12b57494872886eb5c1139250ec5d \ + --hash=sha256:06fc3cc7b6f6cca87bd56ec80a580c88f1da5306f505876a71c8cfa7050257dd \ + --hash=sha256:25c1d1f19729fb09d42e06b4bf9895212292cb27bb50229f5aa64d039ab29146 \ + --hash=sha256:402852a0aea73833d982cabb6d0c3bb582c15483d29fb7085ef2c42bfa7e38d7 \ + --hash=sha256:4e269dcd9b102c5a3d72be3c45d8ce20377b8076a43cbed6f660a1afe365e436 \ + --hash=sha256:5419a127426084933076132d317911e3c6eb77568a1ce23c3ac1e12d111e61e0 \ + --hash=sha256:554bec92ee7d1e9d10ded2f7e92a5d70c1f74ba9524947c0ba0c850c7b011828 \ + --hash=sha256:5e89468fbd2fcd733b5899333bc54d0d06c80e04cd23d8c6f3e0542358c6060b \ + --hash=sha256:65535bc550b70bd6271984d9863a37741352b4aad6fb1b3344a54e6950249b55 \ + --hash=sha256:6ab9516b85bebe7aa83f309bacc5f44a61eeb90d0b4ec125d2d003ce41932d36 \ + --hash=sha256:6addc3b6d593cd980989261dc1cce38263c76954d758c3c94de51f1e010c9a50 \ + --hash=sha256:728f2694fa743a996d7784a6194da430f197d5c58e2f4e278612b359f455e4a2 \ + --hash=sha256:785e4056b5a8b28f05a533fab69febf5004458e20dad7e2e13a3120d8ecec75a \ + --hash=sha256:78cf5eefac2b52c10398a42765bfa981ce2372cbc0457e6bf9658f41ec3c41d8 \ + --hash=sha256:7f836217000342d448e1c9a342e9163149e45d5b5eca76a30e84503a5a96cab0 \ + --hash=sha256:8d41a46251bf0634e21fac50ffd643216ccecfaf3701a063257fe0b2be1b6548 \ + --hash=sha256:984fe150f350a3c91e84de405fe49e688aa6092b3525f407a18b9646f6612320 \ + --hash=sha256:9b24bcff7853ed18a63cfb0c2b008936a9554af24af2fb146e16d8e1aed75748 \ + --hash=sha256:b1b35d9d3a65542ed2e9d90115dfd16bbc027b3f07ee3304fc83580f26e43249 \ + --hash=sha256:b1b52c9e5f8aa2b802d48bd693190341fae201ea51c7a167d69fc48b60e8a959 \ + --hash=sha256:bbf203f1a814007ce24bd4d51362991d5cb90ba0c177a9c08825f2cc304d871f \ + --hash=sha256:be243c7e2bfcf6cc4cb350c0d5cdf15ca6383bbcb2a8ef51d3c9411a9d4386f0 \ + --hash=sha256:bfbe6ee19615b07a98b1d2287d6a6073f734735b49ee45b11324d85efc4d5cbd \ + --hash=sha256:c46837ea467ed1efea562bbeb543994c2d1f6e800785bd5a2c98bc096f5cb220 \ + --hash=sha256:dfb4f4dd568de1b6af9f4cda334adf7d72cf5bc052516e1b2608b683375dd95c \ + --hash=sha256:ed7b00096790213e09eb11c97cc6e2b757f15f3d2f85833cd2d3ec3fe37c1722 # via # gcp-releasetool # secretstorage @@ -148,23 +152,23 @@ filelock==3.8.0 \ --hash=sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc \ --hash=sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4 # via virtualenv -gcp-docuploader==0.6.3 \ - --hash=sha256:ba8c9d76b3bbac54b0311c503a373b00edc2dc02d6d54ea9507045adb8e870f7 \ - --hash=sha256:c0f5aaa82ce1854a386197e4e359b120ad6d4e57ae2c812fce42219a3288026b +gcp-docuploader==0.6.4 \ + --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ + --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf # via -r requirements.in -gcp-releasetool==1.8.7 \ - --hash=sha256:3d2a67c9db39322194afb3b427e9cb0476ce8f2a04033695f0aeb63979fc2b37 \ - --hash=sha256:5e4d28f66e90780d77f3ecf1e9155852b0c3b13cbccb08ab07e66b2357c8da8d +gcp-releasetool==1.9.1 \ + --hash=sha256:952f4055d5d986b070ae2a71c4410b250000f9cc5a1e26398fcd55a5bbc5a15f \ + --hash=sha256:d0d3c814a97c1a237517e837d8cfa668ced8df4b882452578ecef4a4e79c583b # via -r requirements.in -google-api-core==2.8.2 \ - --hash=sha256:06f7244c640322b508b125903bb5701bebabce8832f85aba9335ec00b3d02edc \ - --hash=sha256:93c6a91ccac79079ac6bbf8b74ee75db970cc899278b97d53bc012f35908cf50 +google-api-core==2.10.2 \ + --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ + --hash=sha256:34f24bd1d5f72a8c4519773d99ca6bf080a6c4e041b4e9f024fe230191dda62e # via # google-cloud-core # google-cloud-storage -google-auth==2.11.0 \ - --hash=sha256:be62acaae38d0049c21ca90f27a23847245c9f161ff54ede13af2cb6afecbac9 \ - --hash=sha256:ed65ecf9f681832298e29328e1ef0a3676e3732b2e56f41532d45f70a22de0fb +google-auth==2.14.0 \ + --hash=sha256:1ad5b0e6eba5f69645971abb3d2c197537d5914070a8c6d30299dfdb07c5c700 \ + --hash=sha256:cf24817855d874ede2efd071aa22125445f555de1685b739a9782fcf408c2a3d # via # gcp-releasetool # google-api-core @@ -178,72 +182,97 @@ google-cloud-storage==2.5.0 \ --hash=sha256:19a26c66c317ce542cea0830b7e787e8dac2588b6bfa4d3fd3b871ba16305ab0 \ --hash=sha256:382f34b91de2212e3c2e7b40ec079d27ee2e3dbbae99b75b1bcd8c63063ce235 # via gcp-docuploader -google-crc32c==1.3.0 \ - --hash=sha256:04e7c220798a72fd0f08242bc8d7a05986b2a08a0573396187fd32c1dcdd58b3 \ - --hash=sha256:05340b60bf05b574159e9bd940152a47d38af3fb43803ffe71f11d704b7696a6 \ - --hash=sha256:12674a4c3b56b706153a358eaa1018c4137a5a04635b92b4652440d3d7386206 \ - --hash=sha256:127f9cc3ac41b6a859bd9dc4321097b1a4f6aa7fdf71b4f9227b9e3ebffb4422 \ - --hash=sha256:13af315c3a0eec8bb8b8d80b8b128cb3fcd17d7e4edafc39647846345a3f003a \ - --hash=sha256:1926fd8de0acb9d15ee757175ce7242e235482a783cd4ec711cc999fc103c24e \ - --hash=sha256:226f2f9b8e128a6ca6a9af9b9e8384f7b53a801907425c9a292553a3a7218ce0 \ - --hash=sha256:276de6273eb074a35bc598f8efbc00c7869c5cf2e29c90748fccc8c898c244df \ - --hash=sha256:318f73f5484b5671f0c7f5f63741ab020a599504ed81d209b5c7129ee4667407 \ - --hash=sha256:3bbce1be3687bbfebe29abdb7631b83e6b25da3f4e1856a1611eb21854b689ea \ - --hash=sha256:42ae4781333e331a1743445931b08ebdad73e188fd554259e772556fc4937c48 \ - --hash=sha256:58be56ae0529c664cc04a9c76e68bb92b091e0194d6e3c50bea7e0f266f73713 \ - --hash=sha256:5da2c81575cc3ccf05d9830f9e8d3c70954819ca9a63828210498c0774fda1a3 \ - --hash=sha256:6311853aa2bba4064d0c28ca54e7b50c4d48e3de04f6770f6c60ebda1e975267 \ - --hash=sha256:650e2917660e696041ab3dcd7abac160b4121cd9a484c08406f24c5964099829 \ - --hash=sha256:6a4db36f9721fdf391646685ecffa404eb986cbe007a3289499020daf72e88a2 \ - --hash=sha256:779cbf1ce375b96111db98fca913c1f5ec11b1d870e529b1dc7354b2681a8c3a \ - --hash=sha256:7f6fe42536d9dcd3e2ffb9d3053f5d05221ae3bbcefbe472bdf2c71c793e3183 \ - --hash=sha256:891f712ce54e0d631370e1f4997b3f182f3368179198efc30d477c75d1f44942 \ - --hash=sha256:95c68a4b9b7828ba0428f8f7e3109c5d476ca44996ed9a5f8aac6269296e2d59 \ - --hash=sha256:96a8918a78d5d64e07c8ea4ed2bc44354e3f93f46a4866a40e8db934e4c0d74b \ - --hash=sha256:9c3cf890c3c0ecfe1510a452a165431b5831e24160c5fcf2071f0f85ca5a47cd \ - --hash=sha256:9f58099ad7affc0754ae42e6d87443299f15d739b0ce03c76f515153a5cda06c \ - --hash=sha256:a0b9e622c3b2b8d0ce32f77eba617ab0d6768b82836391e4f8f9e2074582bf02 \ - --hash=sha256:a7f9cbea4245ee36190f85fe1814e2d7b1e5f2186381b082f5d59f99b7f11328 \ - --hash=sha256:bab4aebd525218bab4ee615786c4581952eadc16b1ff031813a2fd51f0cc7b08 \ - --hash=sha256:c124b8c8779bf2d35d9b721e52d4adb41c9bfbde45e6a3f25f0820caa9aba73f \ - --hash=sha256:c9da0a39b53d2fab3e5467329ed50e951eb91386e9d0d5b12daf593973c3b168 \ - --hash=sha256:ca60076c388728d3b6ac3846842474f4250c91efbfe5afa872d3ffd69dd4b318 \ - --hash=sha256:cb6994fff247987c66a8a4e550ef374671c2b82e3c0d2115e689d21e511a652d \ - --hash=sha256:d1c1d6236feab51200272d79b3d3e0f12cf2cbb12b208c835b175a21efdb0a73 \ - --hash=sha256:dd7760a88a8d3d705ff562aa93f8445ead54f58fd482e4f9e2bafb7e177375d4 \ - --hash=sha256:dda4d8a3bb0b50f540f6ff4b6033f3a74e8bf0bd5320b70fab2c03e512a62812 \ - --hash=sha256:e0f1ff55dde0ebcfbef027edc21f71c205845585fffe30d4ec4979416613e9b3 \ - --hash=sha256:e7a539b9be7b9c00f11ef16b55486141bc2cdb0c54762f84e3c6fc091917436d \ - --hash=sha256:eb0b14523758e37802f27b7f8cd973f5f3d33be7613952c0df904b68c4842f0e \ - --hash=sha256:ed447680ff21c14aaceb6a9f99a5f639f583ccfe4ce1a5e1d48eb41c3d6b3217 \ - --hash=sha256:f52a4ad2568314ee713715b1e2d79ab55fab11e8b304fd1462ff5cccf4264b3e \ - --hash=sha256:fbd60c6aaa07c31d7754edbc2334aef50601b7f1ada67a96eb1eb57c7c72378f \ - --hash=sha256:fc28e0db232c62ca0c3600884933178f0825c99be4474cdd645e378a10588125 \ - --hash=sha256:fe31de3002e7b08eb20823b3735b97c86c5926dd0581c7710a680b418a8709d4 \ - --hash=sha256:fec221a051150eeddfdfcff162e6db92c65ecf46cb0f7bb1bf812a1520ec026b \ - --hash=sha256:ff71073ebf0e42258a42a0b34f2c09ec384977e7f6808999102eedd5b49920e3 +google-crc32c==1.5.0 \ + --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ + --hash=sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876 \ + --hash=sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c \ + --hash=sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289 \ + --hash=sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298 \ + --hash=sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02 \ + --hash=sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f \ + --hash=sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2 \ + --hash=sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a \ + --hash=sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb \ + --hash=sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210 \ + --hash=sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5 \ + --hash=sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee \ + --hash=sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c \ + --hash=sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a \ + --hash=sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314 \ + --hash=sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd \ + --hash=sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65 \ + --hash=sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37 \ + --hash=sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4 \ + --hash=sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13 \ + --hash=sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894 \ + --hash=sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31 \ + --hash=sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e \ + --hash=sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709 \ + --hash=sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740 \ + --hash=sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc \ + --hash=sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d \ + --hash=sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c \ + --hash=sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c \ + --hash=sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d \ + --hash=sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906 \ + --hash=sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61 \ + --hash=sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57 \ + --hash=sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c \ + --hash=sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a \ + --hash=sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438 \ + --hash=sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946 \ + --hash=sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7 \ + --hash=sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96 \ + --hash=sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091 \ + --hash=sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae \ + --hash=sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d \ + --hash=sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88 \ + --hash=sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2 \ + --hash=sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd \ + --hash=sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541 \ + --hash=sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728 \ + --hash=sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178 \ + --hash=sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968 \ + --hash=sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346 \ + --hash=sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8 \ + --hash=sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93 \ + --hash=sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7 \ + --hash=sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273 \ + --hash=sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462 \ + --hash=sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94 \ + --hash=sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd \ + --hash=sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e \ + --hash=sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57 \ + --hash=sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b \ + --hash=sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9 \ + --hash=sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a \ + --hash=sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100 \ + --hash=sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325 \ + --hash=sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183 \ + --hash=sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556 \ + --hash=sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4 # via google-resumable-media -google-resumable-media==2.3.3 \ - --hash=sha256:27c52620bd364d1c8116eaac4ea2afcbfb81ae9139fb3199652fcac1724bfb6c \ - --hash=sha256:5b52774ea7a829a8cdaa8bd2d4c3d4bc660c91b30857ab2668d0eb830f4ea8c5 +google-resumable-media==2.4.0 \ + --hash=sha256:2aa004c16d295c8f6c33b2b4788ba59d366677c0a25ae7382436cb30f776deaa \ + --hash=sha256:8d5518502f92b9ecc84ac46779bd4f09694ecb3ba38a3e7ca737a86d15cbca1f # via google-cloud-storage googleapis-common-protos==1.56.4 \ --hash=sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394 \ --hash=sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417 # via google-api-core -idna==3.3 \ - --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ - --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via requests -importlib-metadata==4.12.0 \ - --hash=sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670 \ - --hash=sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23 +importlib-metadata==5.0.0 \ + --hash=sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab \ + --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # -r requirements.in # twine -jaraco-classes==3.2.2 \ - --hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \ - --hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647 +jaraco-classes==3.2.3 \ + --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ + --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a # via keyring jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ @@ -255,9 +284,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via gcp-releasetool -keyring==23.9.0 \ - --hash=sha256:4c32a31174faaee48f43a7e2c7e9c3216ec5e95acf22a2bebfb4a1d05056ee44 \ - --hash=sha256:98f060ec95ada2ab910c195a2d4317be6ef87936a766b239c46aa3c7aac4f0db +keyring==23.9.3 \ + --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ + --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 # via # gcp-releasetool # twine @@ -303,9 +332,9 @@ markupsafe==2.1.1 \ --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 # via jinja2 -more-itertools==8.14.0 \ - --hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \ - --hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750 +more-itertools==9.0.0 \ + --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ + --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab # via jaraco-classes nox==2022.8.7 \ --hash=sha256:1b894940551dc5c389f9271d197ca5d655d40bdc6ccf93ed6880e4042760a34b \ @@ -325,34 +354,34 @@ platformdirs==2.5.2 \ --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 # via virtualenv -protobuf==3.20.2 \ - --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ - --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ - --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ - --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ - --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ - --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ - --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ - --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ - --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ - --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ - --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ - --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ - --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ - --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ - --hash=sha256:9f876a69ca55aed879b43c295a328970306e8e80a263ec91cf6e9189243c613b \ - --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ - --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ - --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ - --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ - --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ - --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ - --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ - --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 +protobuf==3.20.3 \ + --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \ + --hash=sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c \ + --hash=sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2 \ + --hash=sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b \ + --hash=sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050 \ + --hash=sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9 \ + --hash=sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7 \ + --hash=sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454 \ + --hash=sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480 \ + --hash=sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469 \ + --hash=sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c \ + --hash=sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e \ + --hash=sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db \ + --hash=sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905 \ + --hash=sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b \ + --hash=sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86 \ + --hash=sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4 \ + --hash=sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402 \ + --hash=sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7 \ + --hash=sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4 \ + --hash=sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99 \ + --hash=sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee # via # gcp-docuploader # gcp-releasetool # google-api-core + # googleapis-common-protos py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 @@ -377,9 +406,9 @@ pygments==2.13.0 \ # via # readme-renderer # rich -pyjwt==2.4.0 \ - --hash=sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf \ - --hash=sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba +pyjwt==2.6.0 \ + --hash=sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd \ + --hash=sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14 # via gcp-releasetool pyparsing==3.0.9 \ --hash=sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb \ @@ -392,9 +421,9 @@ python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 # via gcp-releasetool -readme-renderer==37.0 \ - --hash=sha256:07b7ea234e03e58f77cc222e206e6abb8f4c0435becce5104794ee591f9301c5 \ - --hash=sha256:9fa416704703e509eeb900696751c908ddeb2011319d93700d8f18baff887a69 +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 # via twine requests==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ @@ -405,17 +434,17 @@ requests==2.28.1 \ # google-cloud-storage # requests-toolbelt # twine -requests-toolbelt==0.9.1 \ - --hash=sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f \ - --hash=sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0 +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d # via twine rfc3986==2.0.0 \ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c # via twine -rich==12.5.1 \ - --hash=sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb \ - --hash=sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca +rich==12.6.0 \ + --hash=sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e \ + --hash=sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0 # via twine rsa==4.9 \ --hash=sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7 \ @@ -437,9 +466,9 @@ twine==4.0.1 \ --hash=sha256:42026c18e394eac3e06693ee52010baa5313e4811d5a11050e7d48436cf41b9e \ --hash=sha256:96b1cf12f7ae611a4a40b6ae8e9570215daff0611828f5fe1f37a16255ab24a0 # via -r requirements.in -typing-extensions==4.3.0 \ - --hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \ - --hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6 +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e # via -r requirements.in urllib3==1.26.12 \ --hash=sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e \ @@ -447,9 +476,9 @@ urllib3==1.26.12 \ # via # requests # twine -virtualenv==20.16.4 \ - --hash=sha256:014f766e4134d0008dcaa1f95bafa0fb0f575795d07cae50b1bee514185d6782 \ - --hash=sha256:035ed57acce4ac35c82c9d8802202b0e71adac011a511ff650cbcf9635006a22 +virtualenv==20.16.6 \ + --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ + --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e # via nox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ @@ -459,13 +488,13 @@ wheel==0.37.1 \ --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 # via -r requirements.in -zipp==3.8.1 \ - --hash=sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2 \ - --hash=sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009 +zipp==3.10.0 \ + --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ + --hash=sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.2.0 \ - --hash=sha256:7f4bc85450898a09f76ebf28b72fa25bc7111f6c7d665d514a60bba9c75ef2a9 \ - --hash=sha256:a3ca5857c89f82f5c9410e8508cb32f4872a3bafd4aa7ae122a24ca33bccc750 +setuptools==65.5.0 \ + --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ + --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 # via -r requirements.in diff --git a/noxfile.py b/noxfile.py index 09cc685b..9777e109 100644 --- a/noxfile.py +++ b/noxfile.py @@ -277,7 +277,11 @@ def docs(session): """Build the docs for this library.""" session.install("-e", ".") - session.install("sphinx==4.0.1", "alabaster", "recommonmark") + session.install( + "sphinx==4.0.1", + "alabaster", + "recommonmark", + ) shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) session.run( @@ -300,7 +304,10 @@ def docfx(session): session.install("-e", ".") session.install( - "sphinx==4.0.1", "alabaster", "recommonmark", "gcp-sphinx-docfx-yaml" + "sphinx==4.0.1", + "alabaster", + "recommonmark", + "gcp-sphinx-docfx-yaml", ) shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) From ba689f1d614cf5b2e526ef556fbf1273d0dd229f Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Wed, 23 Nov 2022 10:33:08 -0500 Subject: [PATCH 06/12] chore(python): update release script dependencies (#500) Source-Link: https://github.com/googleapis/synthtool/commit/25083af347468dd5f90f69627420f7d452b6c50e Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:e6cbd61f1838d9ff6a31436dfc13717f372a7482a82fc1863ca954ec47bff8c8 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .github/workflows/docs.yml | 4 +-- .github/workflows/lint.yml | 2 +- .github/workflows/unittest.yml | 2 +- .kokoro/docker/docs/Dockerfile | 12 +++---- .kokoro/requirements.in | 4 ++- .kokoro/requirements.txt | 61 ++++++++++++++++++---------------- noxfile.py | 4 +-- 8 files changed, 48 insertions(+), 43 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 12edee77..3f1ccc08 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:452901c74a22f9b9a3bd02bce780b8e8805c97270d424684bff809ce5be8c2a2 + digest: sha256:e6cbd61f1838d9ff6a31436dfc13717f372a7482a82fc1863ca954ec47bff8c8 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 7092a139..e97d89e4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.9" - name: Install nox run: | python -m pip install --upgrade setuptools pip wheel @@ -28,7 +28,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.9" - name: Install nox run: | python -m pip install --upgrade setuptools pip wheel diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d2aee5b7..16d5a9e9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.8" - name: Install nox run: | python -m pip install --upgrade setuptools pip wheel diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 87ade4d5..23000c05 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -41,7 +41,7 @@ jobs: - name: Setup Python uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.8" - name: Install coverage run: | python -m pip install --upgrade setuptools pip wheel diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 238b87b9..f8137d0a 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -60,16 +60,16 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && rm -f /var/cache/apt/archives/*.deb -###################### Install python 3.8.11 +###################### Install python 3.9.13 -# Download python 3.8.11 -RUN wget https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz +# Download python 3.9.13 +RUN wget https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tgz # Extract files -RUN tar -xvf Python-3.8.11.tgz +RUN tar -xvf Python-3.9.13.tgz -# Install python 3.8.11 -RUN ./Python-3.8.11/configure --enable-optimizations +# Install python 3.9.13 +RUN ./Python-3.9.13/configure --enable-optimizations RUN make altinstall ###################### Install pip diff --git a/.kokoro/requirements.in b/.kokoro/requirements.in index 7718391a..cbd7e77f 100644 --- a/.kokoro/requirements.in +++ b/.kokoro/requirements.in @@ -5,4 +5,6 @@ typing-extensions twine wheel setuptools -nox \ No newline at end of file +nox +charset-normalizer<3 +click<8.1.0 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 31425f16..9c1b9be3 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -93,11 +93,14 @@ cffi==1.15.1 \ charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f - # via requests + # via + # -r requirements.in + # requests click==8.0.4 \ --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \ --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb # via + # -r requirements.in # gcp-docuploader # gcp-releasetool colorlog==6.7.0 \ @@ -156,9 +159,9 @@ gcp-docuploader==0.6.4 \ --hash=sha256:01486419e24633af78fd0167db74a2763974765ee8078ca6eb6964d0ebd388af \ --hash=sha256:70861190c123d907b3b067da896265ead2eeb9263969d6955c9e0bb091b5ccbf # via -r requirements.in -gcp-releasetool==1.9.1 \ - --hash=sha256:952f4055d5d986b070ae2a71c4410b250000f9cc5a1e26398fcd55a5bbc5a15f \ - --hash=sha256:d0d3c814a97c1a237517e837d8cfa668ced8df4b882452578ecef4a4e79c583b +gcp-releasetool==1.10.0 \ + --hash=sha256:72a38ca91b59c24f7e699e9227c90cbe4dd71b789383cb0164b088abae294c83 \ + --hash=sha256:8c7c99320208383d4bb2b808c6880eb7a81424afe7cdba3c8d84b25f4f0e097d # via -r requirements.in google-api-core==2.10.2 \ --hash=sha256:10c06f7739fe57781f87523375e8e1a3a4674bf6392cd6131a3222182b971320 \ @@ -166,9 +169,9 @@ google-api-core==2.10.2 \ # via # google-cloud-core # google-cloud-storage -google-auth==2.14.0 \ - --hash=sha256:1ad5b0e6eba5f69645971abb3d2c197537d5914070a8c6d30299dfdb07c5c700 \ - --hash=sha256:cf24817855d874ede2efd071aa22125445f555de1685b739a9782fcf408c2a3d +google-auth==2.14.1 \ + --hash=sha256:ccaa901f31ad5cbb562615eb8b664b3dd0bf5404a67618e642307f00613eda4d \ + --hash=sha256:f5d8701633bebc12e0deea4df8abd8aff31c28b355360597f7f2ee60f2e4d016 # via # gcp-releasetool # google-api-core @@ -178,9 +181,9 @@ google-cloud-core==2.3.2 \ --hash=sha256:8417acf6466be2fa85123441696c4badda48db314c607cf1e5d543fa8bdc22fe \ --hash=sha256:b9529ee7047fd8d4bf4a2182de619154240df17fbe60ead399078c1ae152af9a # via google-cloud-storage -google-cloud-storage==2.5.0 \ - --hash=sha256:19a26c66c317ce542cea0830b7e787e8dac2588b6bfa4d3fd3b871ba16305ab0 \ - --hash=sha256:382f34b91de2212e3c2e7b40ec079d27ee2e3dbbae99b75b1bcd8c63063ce235 +google-cloud-storage==2.6.0 \ + --hash=sha256:104ca28ae61243b637f2f01455cc8a05e8f15a2a18ced96cb587241cdd3820f5 \ + --hash=sha256:4ad0415ff61abdd8bb2ae81c1f8f7ec7d91a1011613f2db87c614c550f97bfe9 # via gcp-docuploader google-crc32c==1.5.0 \ --hash=sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a \ @@ -256,9 +259,9 @@ google-resumable-media==2.4.0 \ --hash=sha256:2aa004c16d295c8f6c33b2b4788ba59d366677c0a25ae7382436cb30f776deaa \ --hash=sha256:8d5518502f92b9ecc84ac46779bd4f09694ecb3ba38a3e7ca737a86d15cbca1f # via google-cloud-storage -googleapis-common-protos==1.56.4 \ - --hash=sha256:8eb2cbc91b69feaf23e32452a7ae60e791e09967d81d4fcc7fc388182d1bd394 \ - --hash=sha256:c25873c47279387cfdcbdafa36149887901d36202cb645a0e4f29686bf6e4417 +googleapis-common-protos==1.57.0 \ + --hash=sha256:27a849d6205838fb6cc3c1c21cb9800707a661bb21c6ce7fb13e99eb1f8a0c46 \ + --hash=sha256:a9f4a1d7f6d9809657b7f1316a1aa527f6664891531bcfcc13b6696e685f443c # via google-api-core idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ @@ -269,6 +272,7 @@ importlib-metadata==5.0.0 \ --hash=sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43 # via # -r requirements.in + # keyring # twine jaraco-classes==3.2.3 \ --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ @@ -284,9 +288,9 @@ jinja2==3.1.2 \ --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 # via gcp-releasetool -keyring==23.9.3 \ - --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ - --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 +keyring==23.11.0 \ + --hash=sha256:3dd30011d555f1345dec2c262f0153f2f0ca6bca041fb1dc4588349bb4c0ac1e \ + --hash=sha256:ad192263e2cdd5f12875dedc2da13534359a7e760e77f8d04b50968a821c2361 # via # gcp-releasetool # twine @@ -350,9 +354,9 @@ pkginfo==1.8.3 \ --hash=sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594 \ --hash=sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c # via twine -platformdirs==2.5.2 \ - --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ - --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 +platformdirs==2.5.4 \ + --hash=sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7 \ + --hash=sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10 # via virtualenv protobuf==3.20.3 \ --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \ @@ -381,7 +385,6 @@ protobuf==3.20.3 \ # gcp-docuploader # gcp-releasetool # google-api-core - # googleapis-common-protos py==1.11.0 \ --hash=sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719 \ --hash=sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378 @@ -476,17 +479,17 @@ urllib3==1.26.12 \ # via # requests # twine -virtualenv==20.16.6 \ - --hash=sha256:186ca84254abcbde98180fd17092f9628c5fe742273c02724972a1d8a2035108 \ - --hash=sha256:530b850b523c6449406dfba859d6345e48ef19b8439606c5d74d7d3c9e14d76e +virtualenv==20.16.7 \ + --hash=sha256:8691e3ff9387f743e00f6bb20f70121f5e4f596cae754531f2b3b3a1b1ac696e \ + --hash=sha256:efd66b00386fdb7dbe4822d172303f40cd05e50e01740b19ea42425cbe653e29 # via nox webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 # via bleach -wheel==0.37.1 \ - --hash=sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a \ - --hash=sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4 +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 # via -r requirements.in zipp==3.10.0 \ --hash=sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1 \ @@ -494,7 +497,7 @@ zipp==3.10.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.0 \ - --hash=sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17 \ - --hash=sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356 +setuptools==65.5.1 \ + --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ + --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f # via -r requirements.in diff --git a/noxfile.py b/noxfile.py index 9777e109..24536cf9 100644 --- a/noxfile.py +++ b/noxfile.py @@ -272,7 +272,7 @@ def cover(session): session.run("coverage", "erase") -@nox.session(python=DEFAULT_PYTHON_VERSION) +@nox.session(python="3.9") def docs(session): """Build the docs for this library.""" @@ -298,7 +298,7 @@ def docs(session): ) -@nox.session(python=DEFAULT_PYTHON_VERSION) +@nox.session(python="3.9") def docfx(session): """Build the docfx yaml files for this library.""" From 09e038c5948323cfab2885313970c0bcea0393fc Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:55:03 -0500 Subject: [PATCH 07/12] chore(python): drop flake8-import-order in samples noxfile (#503) Source-Link: https://github.com/googleapis/synthtool/commit/6ed3a831cb9ff69ef8a504c353e098ec0192ad93 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- samples/snippets/noxfile.py | 26 +++----------------------- 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 3f1ccc08..bb21147e 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:e6cbd61f1838d9ff6a31436dfc13717f372a7482a82fc1863ca954ec47bff8c8 + digest: sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 0398d72f..f5c32b22 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -18,7 +18,7 @@ import os from pathlib import Path import sys -from typing import Callable, Dict, List, Optional +from typing import Callable, Dict, Optional import nox @@ -109,22 +109,6 @@ def get_pytest_env_vars() -> Dict[str, str]: # -def _determine_local_import_names(start_dir: str) -> List[str]: - """Determines all import names that should be considered "local". - - This is used when running the linter to insure that import order is - properly checked. - """ - file_ext_pairs = [os.path.splitext(path) for path in os.listdir(start_dir)] - return [ - basename - for basename, extension in file_ext_pairs - if extension == ".py" - or os.path.isdir(os.path.join(start_dir, basename)) - and basename not in ("__pycache__") - ] - - # Linting with flake8. # # We ignore the following rules: @@ -139,7 +123,6 @@ def _determine_local_import_names(start_dir: str) -> List[str]: "--show-source", "--builtin=gettext", "--max-complexity=20", - "--import-order-style=google", "--exclude=.nox,.cache,env,lib,generated_pb2,*_pb2.py,*_pb2_grpc.py", "--ignore=E121,E123,E126,E203,E226,E24,E266,E501,E704,W503,W504,I202", "--max-line-length=88", @@ -149,14 +132,11 @@ def _determine_local_import_names(start_dir: str) -> List[str]: @nox.session def lint(session: nox.sessions.Session) -> None: if not TEST_CONFIG["enforce_type_hints"]: - session.install("flake8", "flake8-import-order") + session.install("flake8") else: - session.install("flake8", "flake8-import-order", "flake8-annotations") + session.install("flake8", "flake8-annotations") - local_names = _determine_local_import_names(".") args = FLAKE8_COMMON_ARGS + [ - "--application-import-names", - ",".join(local_names), ".", ] session.run("flake8", *args) From 57c53ba5ed876c77cd7bf8f0f576ae6df94b38c4 Mon Sep 17 00:00:00 2001 From: Sampath Kumar Date: Tue, 29 Nov 2022 19:11:48 +0100 Subject: [PATCH 08/12] chore: code clean up for samples are migrated to python-docs-samples (#501) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Repo clean-up * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Add README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Rename samples/README.md to samples/snippets/README.md Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- samples/snippets/README.md | 86 +----- samples/snippets/create_cluster.py | 73 ----- samples/snippets/create_cluster_test.py | 57 ---- samples/snippets/dataproc_e2e_donttest.py | 31 -- .../instantiate_inline_workflow_template.py | 97 ------ ...stantiate_inline_workflow_template_test.py | 31 -- samples/snippets/list_clusters.py | 59 ---- samples/snippets/noxfile.py | 292 ------------------ samples/snippets/noxfile_config.py | 42 --- samples/snippets/pyspark_sort.py | 28 -- samples/snippets/pyspark_sort_gcs.py | 30 -- samples/snippets/python-api-walkthrough.md | 157 ---------- samples/snippets/quickstart/quickstart.py | 133 -------- .../snippets/quickstart/quickstart_test.py | 90 ------ samples/snippets/requirements-test.txt | 2 - samples/snippets/requirements.txt | 8 - samples/snippets/single_job_workflow.py | 211 ------------- samples/snippets/submit_job.py | 82 ----- samples/snippets/submit_job_test.py | 74 ----- samples/snippets/submit_job_to_cluster.py | 190 ------------ samples/snippets/update_cluster.py | 80 ----- samples/snippets/update_cluster_test.py | 86 ------ 22 files changed, 3 insertions(+), 1936 deletions(-) delete mode 100644 samples/snippets/create_cluster.py delete mode 100644 samples/snippets/create_cluster_test.py delete mode 100644 samples/snippets/dataproc_e2e_donttest.py delete mode 100644 samples/snippets/instantiate_inline_workflow_template.py delete mode 100644 samples/snippets/instantiate_inline_workflow_template_test.py delete mode 100644 samples/snippets/list_clusters.py delete mode 100644 samples/snippets/noxfile.py delete mode 100644 samples/snippets/noxfile_config.py delete mode 100644 samples/snippets/pyspark_sort.py delete mode 100644 samples/snippets/pyspark_sort_gcs.py delete mode 100644 samples/snippets/python-api-walkthrough.md delete mode 100644 samples/snippets/quickstart/quickstart.py delete mode 100644 samples/snippets/quickstart/quickstart_test.py delete mode 100644 samples/snippets/requirements-test.txt delete mode 100644 samples/snippets/requirements.txt delete mode 100644 samples/snippets/single_job_workflow.py delete mode 100644 samples/snippets/submit_job.py delete mode 100644 samples/snippets/submit_job_test.py delete mode 100644 samples/snippets/submit_job_to_cluster.py delete mode 100644 samples/snippets/update_cluster.py delete mode 100644 samples/snippets/update_cluster_test.py diff --git a/samples/snippets/README.md b/samples/snippets/README.md index 98622be7..9b117168 100644 --- a/samples/snippets/README.md +++ b/samples/snippets/README.md @@ -1,84 +1,4 @@ -# Cloud Dataproc API Examples +Samples migrated +================ -[![Open in Cloud Shell][shell_img]][shell_link] - -[shell_img]: http://gstatic.com/cloudssh/images/open-btn.png -[shell_link]: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor=dataproc/README.md - -Sample command-line programs for interacting with the Cloud Dataproc API. - -See [the tutorial on the using the Dataproc API with the Python client -library](https://cloud.google.com/dataproc/docs/tutorials/python-library-example) -for information on a walkthrough you can run to try out the Cloud Dataproc API sample code. - -Note that while this sample demonstrates interacting with Dataproc via the API, the functionality demonstrated here could also be accomplished using the Cloud Console or the gcloud CLI. - -`list_clusters.py` is a simple command-line program to demonstrate connecting to the Cloud Dataproc API and listing the clusters in a region. - -`submit_job_to_cluster.py` demonstrates how to create a cluster, submit the -`pyspark_sort.py` job, download the output from Google Cloud Storage, and output the result. - -`single_job_workflow.py` uses the Cloud Dataproc InstantiateInlineWorkflowTemplate API to create an ephemeral cluster, run a job, then delete the cluster with one API request. - -`pyspark_sort.py_gcs` is the same as `pyspark_sort.py` but demonstrates - reading from a GCS bucket. - -## Prerequisites to run locally: - -* [pip](https://pypi.python.org/pypi/pip) - -Go to the [Google Cloud Console](https://console.cloud.google.com). - -Under API Manager, search for the Google Cloud Dataproc API and enable it. - -## Set Up Your Local Dev Environment - -To install, run the following commands. If you want to use [virtualenv](https://virtualenv.readthedocs.org/en/latest/) -(recommended), run the commands within a virtualenv. - - * pip install -r requirements.txt - -## Authentication - -Please see the [Google cloud authentication guide](https://cloud.google.com/docs/authentication/). -The recommended approach to running these samples is a Service Account with a JSON key. - -## Environment Variables - -Set the following environment variables: - - GOOGLE_CLOUD_PROJECT=your-project-id - REGION=us-central1 # or your region - CLUSTER_NAME=waprin-spark7 - ZONE=us-central1-b - -## Running the samples - -To run list_clusters.py: - - python list_clusters.py $GOOGLE_CLOUD_PROJECT --region=$REGION - -`submit_job_to_cluster.py` can create the Dataproc cluster or use an existing cluster. To create a cluster before running the code, you can use the [Cloud Console](console.cloud.google.com) or run: - - gcloud dataproc clusters create your-cluster-name - -To run submit_job_to_cluster.py, first create a GCS bucket (used by Cloud Dataproc to stage files) from the Cloud Console or with gsutil: - - gsutil mb gs:// - -Next, set the following environment variables: - - BUCKET=your-staging-bucket - CLUSTER=your-cluster-name - -Then, if you want to use an existing cluster, run: - - python submit_job_to_cluster.py --project_id=$GOOGLE_CLOUD_PROJECT --zone=us-central1-b --cluster_name=$CLUSTER --gcs_bucket=$BUCKET - -Alternatively, to create a new cluster, which will be deleted at the end of the job, run: - - python submit_job_to_cluster.py --project_id=$GOOGLE_CLOUD_PROJECT --zone=us-central1-b --cluster_name=$CLUSTER --gcs_bucket=$BUCKET --create_new_cluster - -The script will setup a cluster, upload the PySpark file, submit the job, print the result, then, if it created the cluster, delete the cluster. - -Optionally, you can add the `--pyspark_file` argument to change from the default `pyspark_sort.py` included in this script to a new script. +New location: https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/dataproc/snippets diff --git a/samples/snippets/create_cluster.py b/samples/snippets/create_cluster.py deleted file mode 100644 index 633b59e8..00000000 --- a/samples/snippets/create_cluster.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://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 sample walks a user through creating a Cloud Dataproc cluster using -# the Python client library. -# -# This script can be run on its own: -# python create_cluster.py ${PROJECT_ID} ${REGION} ${CLUSTER_NAME} - - -import sys - -# [START dataproc_create_cluster] -from google.cloud import dataproc_v1 as dataproc - - -def create_cluster(project_id, region, cluster_name): - """This sample walks a user through creating a Cloud Dataproc cluster - using the Python client library. - - Args: - project_id (string): Project to use for creating resources. - region (string): Region where the resources should live. - cluster_name (string): Name to use for creating a cluster. - """ - - # Create a client with the endpoint set to the desired cluster region. - cluster_client = dataproc.ClusterControllerClient( - client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} - ) - - # Create the cluster config. - cluster = { - "project_id": project_id, - "cluster_name": cluster_name, - "config": { - "master_config": {"num_instances": 1, "machine_type_uri": "n1-standard-2"}, - "worker_config": {"num_instances": 2, "machine_type_uri": "n1-standard-2"}, - }, - } - - # Create the cluster. - operation = cluster_client.create_cluster( - request={"project_id": project_id, "region": region, "cluster": cluster} - ) - result = operation.result() - - # Output a success message. - print(f"Cluster created successfully: {result.cluster_name}") - # [END dataproc_create_cluster] - - -if __name__ == "__main__": - if len(sys.argv) < 4: - sys.exit("python create_cluster.py project_id region cluster_name") - - project_id = sys.argv[1] - region = sys.argv[2] - cluster_name = sys.argv[3] - create_cluster(project_id, region, cluster_name) diff --git a/samples/snippets/create_cluster_test.py b/samples/snippets/create_cluster_test.py deleted file mode 100644 index 48941a1c..00000000 --- a/samples/snippets/create_cluster_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://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. - -import os -import uuid - -from google.api_core.exceptions import NotFound -from google.cloud import dataproc_v1 as dataproc -import pytest - -import create_cluster - - -PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] -REGION = "us-central1" -CLUSTER_NAME = "py-cc-test-{}".format(str(uuid.uuid4())) - - -@pytest.fixture(autouse=True) -def teardown(): - yield - - cluster_client = dataproc.ClusterControllerClient( - client_options={"api_endpoint": f"{REGION}-dataproc.googleapis.com:443"} - ) - # Client library function - try: - operation = cluster_client.delete_cluster( - request={ - "project_id": PROJECT_ID, - "region": REGION, - "cluster_name": CLUSTER_NAME, - } - ) - # Wait for cluster to delete - operation.result() - except NotFound: - print("Cluster already deleted") - - -def test_cluster_create(capsys): - # Wrapper function for client library function - create_cluster.create_cluster(PROJECT_ID, REGION, CLUSTER_NAME) - - out, _ = capsys.readouterr() - assert CLUSTER_NAME in out diff --git a/samples/snippets/dataproc_e2e_donttest.py b/samples/snippets/dataproc_e2e_donttest.py deleted file mode 100644 index a92f4606..00000000 --- a/samples/snippets/dataproc_e2e_donttest.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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 -# -# http://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. - -""" Integration tests for Dataproc samples. - -Creates a Dataproc cluster, uploads a pyspark file to Google Cloud Storage, -submits a job to Dataproc that runs the pyspark file, then downloads -the output logs from Cloud Storage and verifies the expected output.""" - -import os - -import submit_job_to_cluster - -PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"] -BUCKET = os.environ["CLOUD_STORAGE_BUCKET"] -CLUSTER_NAME = "testcluster3" -ZONE = "us-central1-b" - - -def test_e2e(): - output = submit_job_to_cluster.main(PROJECT, ZONE, CLUSTER_NAME, BUCKET) - assert b"['Hello,', 'dog', 'elephant', 'panther', 'world!']" in output diff --git a/samples/snippets/instantiate_inline_workflow_template.py b/samples/snippets/instantiate_inline_workflow_template.py deleted file mode 100644 index cbb1a218..00000000 --- a/samples/snippets/instantiate_inline_workflow_template.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright 2020 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 -# -# http://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 sample walks a user through instantiating an inline -# workflow for Cloud Dataproc using the Python client library. -# -# This script can be run on its own: -# python instantiate_inline_workflow_template.py ${PROJECT_ID} ${REGION} - - -import sys - -# [START dataproc_instantiate_inline_workflow_template] -from google.cloud import dataproc_v1 as dataproc - - -def instantiate_inline_workflow_template(project_id, region): - """This sample walks a user through submitting a workflow - for a Cloud Dataproc using the Python client library. - - Args: - project_id (string): Project to use for running the workflow. - region (string): Region where the workflow resources should live. - """ - - # Create a client with the endpoint set to the desired region. - workflow_template_client = dataproc.WorkflowTemplateServiceClient( - client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} - ) - - parent = "projects/{}/regions/{}".format(project_id, region) - - template = { - "jobs": [ - { - "hadoop_job": { - "main_jar_file_uri": "file:///usr/lib/hadoop-mapreduce/" - "hadoop-mapreduce-examples.jar", - "args": ["teragen", "1000", "hdfs:///gen/"], - }, - "step_id": "teragen", - }, - { - "hadoop_job": { - "main_jar_file_uri": "file:///usr/lib/hadoop-mapreduce/" - "hadoop-mapreduce-examples.jar", - "args": ["terasort", "hdfs:///gen/", "hdfs:///sort/"], - }, - "step_id": "terasort", - "prerequisite_step_ids": ["teragen"], - }, - ], - "placement": { - "managed_cluster": { - "cluster_name": "my-managed-cluster", - "config": { - "gce_cluster_config": { - # Leave 'zone_uri' empty for 'Auto Zone Placement' - # 'zone_uri': '' - "zone_uri": "us-central1-a" - } - }, - } - }, - } - - # Submit the request to instantiate the workflow from an inline template. - operation = workflow_template_client.instantiate_inline_workflow_template( - request={"parent": parent, "template": template} - ) - operation.result() - - # Output a success message. - print("Workflow ran successfully.") - # [END dataproc_instantiate_inline_workflow_template] - - -if __name__ == "__main__": - if len(sys.argv) < 3: - sys.exit( - "python instantiate_inline_workflow_template.py " + "project_id region" - ) - - project_id = sys.argv[1] - region = sys.argv[2] - instantiate_inline_workflow_template(project_id, region) diff --git a/samples/snippets/instantiate_inline_workflow_template_test.py b/samples/snippets/instantiate_inline_workflow_template_test.py deleted file mode 100644 index ef4f31a5..00000000 --- a/samples/snippets/instantiate_inline_workflow_template_test.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2020 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 -# -# http://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. - -import os - -import instantiate_inline_workflow_template - - -PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] -REGION = "us-central1" - - -def test_workflows(capsys): - # Wrapper function for client library function - instantiate_inline_workflow_template.instantiate_inline_workflow_template( - PROJECT_ID, REGION - ) - - out, _ = capsys.readouterr() - assert "successfully" in out diff --git a/samples/snippets/list_clusters.py b/samples/snippets/list_clusters.py deleted file mode 100644 index 11acdf5d..00000000 --- a/samples/snippets/list_clusters.py +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env python -# 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 -# -# http://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. -"""Sample command-line program to list Cloud Dataproc clusters in a region. - -Example usage: -python list_clusters.py --project_id=my-project-id --region=global - -""" -import argparse - -from google.cloud import dataproc_v1 - - -# [START dataproc_list_clusters] -def list_clusters(dataproc, project, region): - """List the details of clusters in the region.""" - for cluster in dataproc.list_clusters( - request={"project_id": project, "region": region} - ): - print(("{} - {}".format(cluster.cluster_name, cluster.status.state.name))) - - -# [END dataproc_list_clusters] - - -def main(project_id, region): - - if region == "global": - # Use the default gRPC global endpoints. - dataproc_cluster_client = dataproc_v1.ClusterControllerClient() - else: - # Use a regional gRPC endpoint. See: - # https://cloud.google.com/dataproc/docs/concepts/regional-endpoints - dataproc_cluster_client = dataproc_v1.ClusterControllerClient( - client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} - ) - - list_clusters(dataproc_cluster_client, project_id, region) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description=__doc__, formatter_class=(argparse.RawDescriptionHelpFormatter) - ) - parser.add_argument("--project_id", help="Project ID to access.", required=True) - parser.add_argument("--region", help="Region of clusters to list.", required=True) - - args = parser.parse_args() - main(args.project_id, args.region) diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py deleted file mode 100644 index f5c32b22..00000000 --- a/samples/snippets/noxfile.py +++ /dev/null @@ -1,292 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://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. - -from __future__ import print_function - -import glob -import os -from pathlib import Path -import sys -from typing import Callable, Dict, Optional - -import nox - - -# WARNING - WARNING - WARNING - WARNING - WARNING -# WARNING - WARNING - WARNING - WARNING - WARNING -# DO NOT EDIT THIS FILE EVER! -# WARNING - WARNING - WARNING - WARNING - WARNING -# WARNING - WARNING - WARNING - WARNING - WARNING - -BLACK_VERSION = "black==22.3.0" -ISORT_VERSION = "isort==5.10.1" - -# Copy `noxfile_config.py` to your directory and modify it instead. - -# `TEST_CONFIG` dict is a configuration hook that allows users to -# modify the test configurations. The values here should be in sync -# with `noxfile_config.py`. Users will copy `noxfile_config.py` into -# their directory and modify it. - -TEST_CONFIG = { - # You can opt out from the test for specific Python versions. - "ignored_versions": [], - # Old samples are opted out of enforcing Python type hints - # All new samples should feature them - "enforce_type_hints": False, - # An envvar key for determining the project id to use. Change it - # to 'BUILD_SPECIFIC_GCLOUD_PROJECT' if you want to opt in using a - # build specific Cloud project. You can also use your own string - # to use your own Cloud project. - "gcloud_project_env": "GOOGLE_CLOUD_PROJECT", - # 'gcloud_project_env': 'BUILD_SPECIFIC_GCLOUD_PROJECT', - # If you need to use a specific version of pip, - # change pip_version_override to the string representation - # of the version number, for example, "20.2.4" - "pip_version_override": None, - # A dictionary you want to inject into your test. Don't put any - # secrets here. These values will override predefined values. - "envs": {}, -} - - -try: - # Ensure we can import noxfile_config in the project's directory. - sys.path.append(".") - from noxfile_config import TEST_CONFIG_OVERRIDE -except ImportError as e: - print("No user noxfile_config found: detail: {}".format(e)) - TEST_CONFIG_OVERRIDE = {} - -# Update the TEST_CONFIG with the user supplied values. -TEST_CONFIG.update(TEST_CONFIG_OVERRIDE) - - -def get_pytest_env_vars() -> Dict[str, str]: - """Returns a dict for pytest invocation.""" - ret = {} - - # Override the GCLOUD_PROJECT and the alias. - env_key = TEST_CONFIG["gcloud_project_env"] - # This should error out if not set. - ret["GOOGLE_CLOUD_PROJECT"] = os.environ[env_key] - - # Apply user supplied envs. - ret.update(TEST_CONFIG["envs"]) - return ret - - -# DO NOT EDIT - automatically generated. -# All versions used to test samples. -ALL_VERSIONS = ["3.7", "3.8", "3.9", "3.10"] - -# Any default versions that should be ignored. -IGNORED_VERSIONS = TEST_CONFIG["ignored_versions"] - -TESTED_VERSIONS = sorted([v for v in ALL_VERSIONS if v not in IGNORED_VERSIONS]) - -INSTALL_LIBRARY_FROM_SOURCE = os.environ.get("INSTALL_LIBRARY_FROM_SOURCE", False) in ( - "True", - "true", -) - -# Error if a python version is missing -nox.options.error_on_missing_interpreters = True - -# -# Style Checks -# - - -# Linting with flake8. -# -# We ignore the following rules: -# E203: whitespace before ‘:’ -# E266: too many leading ‘#’ for block comment -# E501: line too long -# I202: Additional newline in a section of imports -# -# We also need to specify the rules which are ignored by default: -# ['E226', 'W504', 'E126', 'E123', 'W503', 'E24', 'E704', 'E121'] -FLAKE8_COMMON_ARGS = [ - "--show-source", - "--builtin=gettext", - "--max-complexity=20", - "--exclude=.nox,.cache,env,lib,generated_pb2,*_pb2.py,*_pb2_grpc.py", - "--ignore=E121,E123,E126,E203,E226,E24,E266,E501,E704,W503,W504,I202", - "--max-line-length=88", -] - - -@nox.session -def lint(session: nox.sessions.Session) -> None: - if not TEST_CONFIG["enforce_type_hints"]: - session.install("flake8") - else: - session.install("flake8", "flake8-annotations") - - args = FLAKE8_COMMON_ARGS + [ - ".", - ] - session.run("flake8", *args) - - -# -# Black -# - - -@nox.session -def blacken(session: nox.sessions.Session) -> None: - """Run black. Format code to uniform standard.""" - session.install(BLACK_VERSION) - python_files = [path for path in os.listdir(".") if path.endswith(".py")] - - session.run("black", *python_files) - - -# -# format = isort + black -# - -@nox.session -def format(session: nox.sessions.Session) -> None: - """ - Run isort to sort imports. Then run black - to format code to uniform standard. - """ - session.install(BLACK_VERSION, ISORT_VERSION) - python_files = [path for path in os.listdir(".") if path.endswith(".py")] - - # Use the --fss option to sort imports using strict alphabetical order. - # See https://pycqa.github.io/isort/docs/configuration/options.html#force-sort-within-sections - session.run("isort", "--fss", *python_files) - session.run("black", *python_files) - - -# -# Sample Tests -# - - -PYTEST_COMMON_ARGS = ["--junitxml=sponge_log.xml"] - - -def _session_tests( - session: nox.sessions.Session, post_install: Callable = None -) -> None: - # check for presence of tests - test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob("**/test_*.py", recursive=True) - test_list.extend(glob.glob("**/tests", recursive=True)) - - if len(test_list) == 0: - print("No tests found, skipping directory.") - return - - if TEST_CONFIG["pip_version_override"]: - pip_version = TEST_CONFIG["pip_version_override"] - session.install(f"pip=={pip_version}") - """Runs py.test for a particular project.""" - concurrent_args = [] - if os.path.exists("requirements.txt"): - if os.path.exists("constraints.txt"): - session.install("-r", "requirements.txt", "-c", "constraints.txt") - else: - session.install("-r", "requirements.txt") - with open("requirements.txt") as rfile: - packages = rfile.read() - - if os.path.exists("requirements-test.txt"): - if os.path.exists("constraints-test.txt"): - session.install( - "-r", "requirements-test.txt", "-c", "constraints-test.txt" - ) - else: - session.install("-r", "requirements-test.txt") - with open("requirements-test.txt") as rtfile: - packages += rtfile.read() - - if INSTALL_LIBRARY_FROM_SOURCE: - session.install("-e", _get_repo_root()) - - if post_install: - post_install(session) - - if "pytest-parallel" in packages: - concurrent_args.extend(['--workers', 'auto', '--tests-per-worker', 'auto']) - elif "pytest-xdist" in packages: - concurrent_args.extend(['-n', 'auto']) - - session.run( - "pytest", - *(PYTEST_COMMON_ARGS + session.posargs + concurrent_args), - # Pytest will return 5 when no tests are collected. This can happen - # on travis where slow and flaky tests are excluded. - # See http://doc.pytest.org/en/latest/_modules/_pytest/main.html - success_codes=[0, 5], - env=get_pytest_env_vars(), - ) - - -@nox.session(python=ALL_VERSIONS) -def py(session: nox.sessions.Session) -> None: - """Runs py.test for a sample using the specified version of Python.""" - if session.python in TESTED_VERSIONS: - _session_tests(session) - else: - session.skip( - "SKIPPED: {} tests are disabled for this sample.".format(session.python) - ) - - -# -# Readmegen -# - - -def _get_repo_root() -> Optional[str]: - """ Returns the root folder of the project. """ - # Get root of this repository. Assume we don't have directories nested deeper than 10 items. - p = Path(os.getcwd()) - for i in range(10): - if p is None: - break - if Path(p / ".git").exists(): - return str(p) - # .git is not available in repos cloned via Cloud Build - # setup.py is always in the library's root, so use that instead - # https://github.com/googleapis/synthtool/issues/792 - if Path(p / "setup.py").exists(): - return str(p) - p = p.parent - raise Exception("Unable to detect repository root.") - - -GENERATED_READMES = sorted([x for x in Path(".").rglob("*.rst.in")]) - - -@nox.session -@nox.parametrize("path", GENERATED_READMES) -def readmegen(session: nox.sessions.Session, path: str) -> None: - """(Re-)generates the readme for a sample.""" - session.install("jinja2", "pyyaml") - dir_ = os.path.dirname(path) - - if os.path.exists(os.path.join(dir_, "requirements.txt")): - session.install("-r", os.path.join(dir_, "requirements.txt")) - - in_file = os.path.join(dir_, "README.rst.in") - session.run( - "python", _get_repo_root() + "/scripts/readme-gen/readme_gen.py", in_file - ) diff --git a/samples/snippets/noxfile_config.py b/samples/snippets/noxfile_config.py deleted file mode 100644 index 646d77de..00000000 --- a/samples/snippets/noxfile_config.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2022 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 -# -# http://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. - -# Default TEST_CONFIG_OVERRIDE for python repos. - -# You can copy this file into your directory, then it will be imported from -# the noxfile.py. - -# The source of truth: -# https://github.com/GoogleCloudPlatform/python-docs-samples/blob/main/noxfile_config.py - -TEST_CONFIG_OVERRIDE = { - # You can opt out from the test for specific Python versions. - "ignored_versions": ["2.7", "3.6"], - # Old samples are opted out of enforcing Python type hints - # All new samples should feature them - # "enforce_type_hints": True, - # An envvar key for determining the project id to use. Change it - # to 'BUILD_SPECIFIC_GCLOUD_PROJECT' if you want to opt in using a - # build specific Cloud project. You can also use your own string - # to use your own Cloud project. - # "gcloud_project_env": "GOOGLE_CLOUD_PROJECT", - "gcloud_project_env": "BUILD_SPECIFIC_GCLOUD_PROJECT", - # If you need to use a specific version of pip, - # change pip_version_override to the string representation - # of the version number, for example, "20.2.4" - "pip_version_override": None, - # A dictionary you want to inject into your test. Don't put any - # secrets here. These values will override predefined values. - "envs": {}, -} diff --git a/samples/snippets/pyspark_sort.py b/samples/snippets/pyspark_sort.py deleted file mode 100644 index e43d57f1..00000000 --- a/samples/snippets/pyspark_sort.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python -# 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 -# -# http://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. - -""" Sample pyspark script to be uploaded to Cloud Storage and run on -Cloud Dataproc. - -Note this file is not intended to be run directly, but run inside a PySpark -environment. -""" - -# [START dataproc_pyspark_sort] -import pyspark - -sc = pyspark.SparkContext() -rdd = sc.parallelize(["Hello,", "world!", "dog", "elephant", "panther"]) -words = sorted(rdd.collect()) -print(words) -# [END dataproc_pyspark_sort] diff --git a/samples/snippets/pyspark_sort_gcs.py b/samples/snippets/pyspark_sort_gcs.py deleted file mode 100644 index 4b1e7b2d..00000000 --- a/samples/snippets/pyspark_sort_gcs.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python -# 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 -# -# http://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. - -""" Sample pyspark script to be uploaded to Cloud Storage and run on -Cloud Dataproc. - -Note this file is not intended to be run directly, but run inside a PySpark -environment. - -This file demonstrates how to read from a GCS bucket. See README.md for more -information. -""" - -# [START dataproc_pyspark_sort_gcs] -import pyspark - -sc = pyspark.SparkContext() -rdd = sc.textFile("gs://path-to-your-GCS-file") -print(sorted(rdd.collect())) -# [END dataproc_pyspark_sort_gcs] diff --git a/samples/snippets/python-api-walkthrough.md b/samples/snippets/python-api-walkthrough.md deleted file mode 100644 index c5eb884a..00000000 --- a/samples/snippets/python-api-walkthrough.md +++ /dev/null @@ -1,157 +0,0 @@ -# Use the Python Client Library to call Dataproc APIs - -Estimated completion time: - -## Overview - -This [Cloud Shell](https://cloud.google.com/shell/docs/) walkthrough leads you -through the steps to use the -[Cloud Client Libraries for Python](https://googleapis.github.io/google-cloud-python/latest/dataproc/index.html) -to programmatically interact with [Dataproc](https://cloud.google.com/dataproc/docs/). - -As you follow this walkthrough, you run Python code that calls -[Dataproc gRPC APIs](https://cloud.google.com/dataproc/docs/reference/rpc/) -to: - -* Create a Dataproc cluster -* Submit a PySpark word sort job to the cluster -* Delete the cluster after job completion - -## Using the walkthrough - -The `submit_job_to_cluster.py file` used in this walkthrough is opened in the -Cloud Shell editor when you launch the walkthrough. You can view -the code as your follow the walkthrough steps. - -**For more information**: See [Use the Cloud Client Libraries for Python](https://cloud.google.com/dataproc/docs/tutorials/python-library-example) for -an explanation of how the code works. - -**To reload this walkthrough:** Run the following command from the -`~/python-docs-samples/dataproc` directory in Cloud Shell: - - cloudshell launch-tutorial python-api-walkthrough.md - -**To copy and run commands**: Click the "Copy to Cloud Shell" button - () - on the side of a code box, then press `Enter` to run the command. - -## Prerequisites (1) - - - -1. Create or select a Google Cloud project to use for this - tutorial. - * - -1. Enable the Dataproc, Compute Engine, and Cloud Storage APIs in your - project. - - ```bash - gcloud services enable dataproc.googleapis.com \ - compute.googleapis.com \ - storage-component.googleapis.com \ - --project={{project_id}} - ``` - -## Prerequisites (2) - -1. This walkthrough uploads a PySpark file (`pyspark_sort.py`) to a - [Cloud Storage bucket](https://cloud.google.com/storage/docs/key-terms#buckets) in - your project. - * You can use the [Cloud Storage browser page](https://console.cloud.google.com/storage/browser) - in Google Cloud Console to view existing buckets in your project. - - **OR** - - * To create a new bucket, run the following command. Your bucket name must be unique. - - gsutil mb -p {{project-id}} gs://your-bucket-name - - -2. Set environment variables. - * Set the name of your bucket. - - BUCKET=your-bucket-name - -## Prerequisites (3) - -1. Set up a Python - [virtual environment](https://virtualenv.readthedocs.org/en/latest/). - - * Create the virtual environment. - - virtualenv ENV - - * Activate the virtual environment. - - source ENV/bin/activate - -1. Install library dependencies. - - pip install -r requirements.txt - -## Create a cluster and submit a job - -1. Set a name for your new cluster. - - CLUSTER=new-cluster-name - -1. Set a [region](https://cloud.google.com/compute/docs/regions-zones/#available) - where your new cluster will be located. You can change the pre-set - "us-central1" region beforew you copy and run the following command. - - REGION=us-central1 - -1. Run `submit_job_to_cluster.py` to create a new cluster and run the - `pyspark_sort.py` job on the cluster. - - python submit_job_to_cluster.py \ - --project_id={{project-id}} \ - --region=$REGION \ - --cluster_name=$CLUSTER \ - --gcs_bucket=$BUCKET - -## Job Output - -Job output displayed in the Cloud Shell terminaL shows cluster creation, -job completion, sorted job output, and then deletion of the cluster. - -```xml -Cluster created successfully: cliuster-name. -... -Job finished successfully. -... -['Hello,', 'dog', 'elephant', 'panther', 'world!'] -... -Cluster cluster-name successfully deleted. -``` - -## Congratulations on completing the Walkthrough! - - ---- - -### Next Steps: - -* **View job details in the Cloud Console.** View job details by selecting the - PySpark job name on the Dataproc - [Jobs page](https://console.cloud.google.com/dataproc/jobs) - in the Cloud console. - -* **Delete resources used in the walkthrough.** - The `submit_job_to_cluster.py` code deletes the cluster that it created for this - walkthrough. - - If you created a Cloud Storage bucket to use for this walkthrough, - you can run the following command to delete the bucket (the bucket must be empty). - - gsutil rb gs://$BUCKET - - * You can run the following command to **delete the bucket and all - objects within it. Note: the deleted objects cannot be recovered.** - - gsutil rm -r gs://$BUCKET - - -* **For more information.** See the [Dataproc documentation](https://cloud.google.com/dataproc/docs/) - for API reference and product feature information. diff --git a/samples/snippets/quickstart/quickstart.py b/samples/snippets/quickstart/quickstart.py deleted file mode 100644 index c9e73002..00000000 --- a/samples/snippets/quickstart/quickstart.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://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. - -# [START dataproc_quickstart] -""" -This quickstart sample walks a user through creating a Cloud Dataproc -cluster, submitting a PySpark job from Google Cloud Storage to the -cluster, reading the output of the job and deleting the cluster, all -using the Python client library. - -Usage: - python quickstart.py --project_id --region \ - --cluster_name --job_file_path -""" - -import argparse -import re - -from google.cloud import dataproc_v1 as dataproc -from google.cloud import storage - - -def quickstart(project_id, region, cluster_name, job_file_path): - # Create the cluster client. - cluster_client = dataproc.ClusterControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(region)} - ) - - # Create the cluster config. - cluster = { - "project_id": project_id, - "cluster_name": cluster_name, - "config": { - "master_config": {"num_instances": 1, "machine_type_uri": "n1-standard-2"}, - "worker_config": {"num_instances": 2, "machine_type_uri": "n1-standard-2"}, - }, - } - - # Create the cluster. - operation = cluster_client.create_cluster( - request={"project_id": project_id, "region": region, "cluster": cluster} - ) - result = operation.result() - - print("Cluster created successfully: {}".format(result.cluster_name)) - - # Create the job client. - job_client = dataproc.JobControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(region)} - ) - - # Create the job config. - job = { - "placement": {"cluster_name": cluster_name}, - "pyspark_job": {"main_python_file_uri": job_file_path}, - } - - operation = job_client.submit_job_as_operation( - request={"project_id": project_id, "region": region, "job": job} - ) - response = operation.result() - - # Dataproc job output gets saved to the Google Cloud Storage bucket - # allocated to the job. Use a regex to obtain the bucket and blob info. - matches = re.match("gs://(.*?)/(.*)", response.driver_output_resource_uri) - - output = ( - storage.Client() - .get_bucket(matches.group(1)) - .blob(f"{matches.group(2)}.000000000") - .download_as_string() - ) - - print(f"Job finished successfully: {output}") - - # Delete the cluster once the job has terminated. - operation = cluster_client.delete_cluster( - request={ - "project_id": project_id, - "region": region, - "cluster_name": cluster_name, - } - ) - operation.result() - - print("Cluster {} successfully deleted.".format(cluster_name)) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument( - "--project_id", - type=str, - required=True, - help="Project to use for creating resources.", - ) - parser.add_argument( - "--region", - type=str, - required=True, - help="Region where the resources should live.", - ) - parser.add_argument( - "--cluster_name", - type=str, - required=True, - help="Name to use for creating a cluster.", - ) - parser.add_argument( - "--job_file_path", - type=str, - required=True, - help="Job in GCS to execute against the cluster.", - ) - - args = parser.parse_args() - quickstart(args.project_id, args.region, args.cluster_name, args.job_file_path) -# [END dataproc_quickstart] diff --git a/samples/snippets/quickstart/quickstart_test.py b/samples/snippets/quickstart/quickstart_test.py deleted file mode 100644 index 4020ad80..00000000 --- a/samples/snippets/quickstart/quickstart_test.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://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. - -import os -import uuid - -import backoff -from google.api_core.exceptions import ServiceUnavailable -from google.cloud import dataproc_v1 as dataproc -from google.cloud import storage -import pytest - -import quickstart - - -PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] -REGION = "us-central1" -CLUSTER_NAME = "py-qs-test-{}".format(str(uuid.uuid4())) -STAGING_BUCKET = "py-dataproc-qs-bucket-{}".format(str(uuid.uuid4())) -JOB_FILE_NAME = "sum.py" -JOB_FILE_PATH = "gs://{}/{}".format(STAGING_BUCKET, JOB_FILE_NAME) -SORT_CODE = ( - "import pyspark\n" - "sc = pyspark.SparkContext()\n" - "rdd = sc.parallelize((1,2,3,4,5))\n" - "sum = rdd.reduce(lambda x, y: x + y)\n" -) - - -@pytest.fixture(autouse=True) -def blob(): - storage_client = storage.Client() - - @backoff.on_exception(backoff.expo, ServiceUnavailable, max_tries=5) - def create_bucket(): - return storage_client.create_bucket(STAGING_BUCKET) - - bucket = create_bucket() - blob = bucket.blob(JOB_FILE_NAME) - blob.upload_from_string(SORT_CODE) - - yield - - blob.delete() - bucket.delete() - - -@pytest.fixture(autouse=True) -def cluster(): - yield - - # The quickstart sample deletes the cluster, but if the test fails - # before cluster deletion occurs, it can be manually deleted here. - cluster_client = dataproc.ClusterControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(REGION)} - ) - - clusters = cluster_client.list_clusters( - request={"project_id": PROJECT_ID, "region": REGION} - ) - - for cluster in clusters: - if cluster.cluster_name == CLUSTER_NAME: - cluster_client.delete_cluster( - request={ - "project_id": PROJECT_ID, - "region": REGION, - "cluster_name": CLUSTER_NAME, - } - ) - - -def test_quickstart(capsys): - quickstart.quickstart(PROJECT_ID, REGION, CLUSTER_NAME, JOB_FILE_PATH) - out, _ = capsys.readouterr() - - assert "Cluster created successfully" in out - assert "Job finished successfully" in out - assert "successfully deleted" in out diff --git a/samples/snippets/requirements-test.txt b/samples/snippets/requirements-test.txt deleted file mode 100644 index 0c53ad2e..00000000 --- a/samples/snippets/requirements-test.txt +++ /dev/null @@ -1,2 +0,0 @@ -pytest==7.2.0 -pytest-xdist==3.0.2 \ No newline at end of file diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt deleted file mode 100644 index 9414a8d3..00000000 --- a/samples/snippets/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ - -backoff==2.2.1 -grpcio==1.50.0 -google-auth==2.14.0 -google-auth-httplib2==0.1.0 -google-cloud==0.34.0 -google-cloud-storage==2.5.0 -google-cloud-dataproc==5.0.3 diff --git a/samples/snippets/single_job_workflow.py b/samples/snippets/single_job_workflow.py deleted file mode 100644 index 04f73ea9..00000000 --- a/samples/snippets/single_job_workflow.py +++ /dev/null @@ -1,211 +0,0 @@ -#!/usr/bin/env python -# 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 -# -# http://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. -r"""Sample Cloud Dataproc inline workflow to run a pyspark job on an ephermeral -cluster. -Example Usage to run the inline workflow on a managed cluster: -python single_job_workflow.py --project_id=$PROJECT --gcs_bucket=$BUCKET \ - --cluster_name=$CLUSTER --zone=$ZONE -Example Usage to run the inline workflow on a global region managed cluster: -python submit_job_to_cluster.py --project_id=$PROJECT --gcs_bucket=$BUCKET \ - --cluster_name=$CLUSTER --zone=$ZONE --global_region -""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import argparse -import os - -from google.cloud import dataproc_v1 -from google.cloud import storage -from google.cloud.dataproc_v1.gapic.transports import ( - workflow_template_service_grpc_transport, -) - - -DEFAULT_FILENAME = "pyspark_sort.py" -waiting_callback = False - - -def get_pyspark_file(pyspark_file=None): - if pyspark_file: - f = open(pyspark_file, "rb") - return f, os.path.basename(pyspark_file) - else: - """Gets the PySpark file from current directory.""" - current_dir = os.path.dirname(os.path.abspath(__file__)) - f = open(os.path.join(current_dir, DEFAULT_FILENAME), "rb") - return f, DEFAULT_FILENAME - - -def get_region_from_zone(zone): - try: - region_as_list = zone.split("-")[:-1] - return "-".join(region_as_list) - except (AttributeError, IndexError, ValueError): - raise ValueError("Invalid zone provided, please check your input.") - - -def upload_pyspark_file(project, bucket_name, filename, spark_file): - """Uploads the PySpark file in this directory to the configured input - bucket.""" - print("Uploading pyspark file to Cloud Storage.") - client = storage.Client(project=project) - bucket = client.get_bucket(bucket_name) - blob = bucket.blob(filename) - blob.upload_from_file(spark_file) - - -def run_workflow(dataproc, project, region, zone, bucket_name, filename, cluster_name): - - parent = "projects/{}/regions/{}".format(project, region) - zone_uri = "https://www.googleapis.com/compute/v1/projects/{}/zones/{}".format( - project, zone - ) - - workflow_data = { - "placement": { - "managed_cluster": { - "cluster_name": cluster_name, - "config": { - "gce_cluster_config": {"zone_uri": zone_uri}, - "master_config": { - "num_instances": 1, - "machine_type_uri": "n1-standard-1", - }, - "worker_config": { - "num_instances": 2, - "machine_type_uri": "n1-standard-1", - }, - }, - } - }, - "jobs": [ - { - "pyspark_job": { - "main_python_file_uri": "gs://{}/{}".format(bucket_name, filename) - }, - "step_id": "pyspark-job", - } - ], - } - - workflow = dataproc.instantiate_inline_workflow_template( - request={"parent": parent, "template": workflow_data} - ) - - workflow.add_done_callback(callback) - global waiting_callback - waiting_callback = True - - -def callback(operation_future): - # Reset global when callback returns. - global waiting_callback - waiting_callback = False - - -def wait_for_workflow_end(): - """Wait for cluster creation.""" - print("Waiting for workflow completion ...") - print( - "Workflow and job progress, and job driver output available from: " - "https://console.cloud.google.com/dataproc/workflows/" - ) - - while True: - if not waiting_callback: - print("Workflow completed.") - break - - -def main( - project_id, - zone, - cluster_name, - bucket_name, - pyspark_file=None, - create_new_cluster=True, - global_region=True, -): - - # [START dataproc_get_workflow_template_client] - if global_region: - region = "global" - # Use the default gRPC global endpoints. - dataproc_workflow_client = dataproc_v1.WorkflowTemplateServiceClient() - else: - region = get_region_from_zone(zone) - # Use a regional gRPC endpoint. See: - # https://cloud.google.com/dataproc/docs/concepts/regional-endpoints - client_transport = workflow_template_service_grpc_transport.WorkflowTemplateServiceGrpcTransport( - address="{}-dataproc.googleapis.com:443".format(region) - ) - dataproc_workflow_client = dataproc_v1.WorkflowTemplateServiceClient( - client_transport - ) - # [END dataproc_get_workflow_template_client] - - try: - spark_file, spark_filename = get_pyspark_file(pyspark_file) - upload_pyspark_file(project_id, bucket_name, spark_filename, spark_file) - - run_workflow( - dataproc_workflow_client, - project_id, - region, - zone, - bucket_name, - spark_filename, - cluster_name, - ) - wait_for_workflow_end() - - finally: - spark_file.close() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description=__doc__, formatter_class=(argparse.RawDescriptionHelpFormatter) - ) - parser.add_argument( - "--project_id", help="Project ID you want to access.", required=True - ) - parser.add_argument( - "--zone", help="Zone to create clusters in/connect to", required=True - ) - parser.add_argument( - "--cluster_name", help="Name of the cluster to create/connect to", required=True - ) - parser.add_argument( - "--gcs_bucket", help="Bucket to upload Pyspark file to", required=True - ) - parser.add_argument( - "--pyspark_file", help="Pyspark filename. Defaults to pyspark_sort.py" - ) - parser.add_argument( - "--global_region", - action="iframe.php?url=https%3A%2F%2Fgithub.com%2Fstore_true", - help="If cluster is in the global region", - ) - - args = parser.parse_args() - main( - args.project_id, - args.zone, - args.cluster_name, - args.gcs_bucket, - args.pyspark_file, - ) diff --git a/samples/snippets/submit_job.py b/samples/snippets/submit_job.py deleted file mode 100644 index d7761b73..00000000 --- a/samples/snippets/submit_job.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2020 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 -# -# http://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 sample walks a user through submitting a Spark job using the Dataproc -# client library. - -# Usage: -# python submit_job.py --project_id --region \ -# --cluster_name - -# [START dataproc_submit_job] -import re - -# [END dataproc_submit_job] -import sys - -# [START dataproc_submit_job] - -from google.cloud import dataproc_v1 as dataproc -from google.cloud import storage - - -def submit_job(project_id, region, cluster_name): - # Create the job client. - job_client = dataproc.JobControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(region)} - ) - - # Create the job config. 'main_jar_file_uri' can also be a - # Google Cloud Storage URL. - job = { - "placement": {"cluster_name": cluster_name}, - "spark_job": { - "main_class": "org.apache.spark.examples.SparkPi", - "jar_file_uris": ["file:///usr/lib/spark/examples/jars/spark-examples.jar"], - "args": ["1000"], - }, - } - - operation = job_client.submit_job_as_operation( - request={"project_id": project_id, "region": region, "job": job} - ) - response = operation.result() - - # Dataproc job output gets saved to the Google Cloud Storage bucket - # allocated to the job. Use a regex to obtain the bucket and blob info. - matches = re.match("gs://(.*?)/(.*)", response.driver_output_resource_uri) - - output = ( - storage.Client() - .get_bucket(matches.group(1)) - .blob(f"{matches.group(2)}.000000000") - .download_as_string() - ) - - print(f"Job finished successfully: {output}") - - -# [END dataproc_submit_job] - - -if __name__ == "__main__": - if len(sys.argv) < 3: - sys.exit("python submit_job.py project_id region cluster_name") - - project_id = sys.argv[1] - region = sys.argv[2] - cluster_name = sys.argv[3] - submit_job(project_id, region, cluster_name) diff --git a/samples/snippets/submit_job_test.py b/samples/snippets/submit_job_test.py deleted file mode 100644 index c2e9bed9..00000000 --- a/samples/snippets/submit_job_test.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright 2020 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 -# -# http://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. - -import os -import uuid - -from google.api_core.exceptions import NotFound -from google.cloud import dataproc_v1 as dataproc -import pytest - -import submit_job - - -PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] -REGION = "us-central1" -CLUSTER_NAME = "py-sj-test-{}".format(str(uuid.uuid4())) -CLUSTER = { - "project_id": PROJECT_ID, - "cluster_name": CLUSTER_NAME, - "config": { - "master_config": {"num_instances": 1, "machine_type_uri": "n1-standard-2"}, - "worker_config": {"num_instances": 2, "machine_type_uri": "n1-standard-2"}, - }, -} - - -@pytest.fixture(autouse=True) -def setup_teardown(): - try: - cluster_client = dataproc.ClusterControllerClient( - client_options={ - "api_endpoint": "{}-dataproc.googleapis.com:443".format(REGION) - } - ) - - # Create the cluster. - operation = cluster_client.create_cluster( - request={"project_id": PROJECT_ID, "region": REGION, "cluster": CLUSTER} - ) - operation.result() - - yield - - finally: - try: - operation = cluster_client.delete_cluster( - request={ - "project_id": PROJECT_ID, - "region": REGION, - "cluster_name": CLUSTER_NAME, - } - ) - operation.result() - - except NotFound: - print("Cluster already deleted") - - -def test_submit_job(capsys): - submit_job.submit_job(PROJECT_ID, REGION, CLUSTER_NAME) - out, _ = capsys.readouterr() - - assert "Job finished successfully" in out diff --git a/samples/snippets/submit_job_to_cluster.py b/samples/snippets/submit_job_to_cluster.py deleted file mode 100644 index 506174df..00000000 --- a/samples/snippets/submit_job_to_cluster.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2022 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 -# -# http://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. - -# [START dataproc_quickstart] -""" -Command-line program to create a Dataproc cluster, -run a PySpark job located in Cloud Storage on the cluster, -then delete the cluster after the job completes. - -Usage: - python submit_job_to_cluster --project_id --region \ - --cluster_name --job_file_path -""" - -import argparse -import os -import re - -from google.cloud import dataproc_v1 -from google.cloud import storage - -DEFAULT_FILENAME = "pyspark_sort.py" -waiting_callback = False - - -def get_pyspark_file(pyspark_file=None): - if pyspark_file: - f = open(pyspark_file, "rb") - return f, os.path.basename(pyspark_file) - else: - """Gets the PySpark file from current directory.""" - current_dir = os.path.dirname(os.path.abspath(__file__)) - f = open(os.path.join(current_dir, DEFAULT_FILENAME), "rb") - return f, DEFAULT_FILENAME - - -def get_region_from_zone(zone): - try: - region_as_list = zone.split("-")[:-1] - return "-".join(region_as_list) - except (AttributeError, IndexError, ValueError): - raise ValueError("Invalid zone provided, please check your input.") - - -def upload_pyspark_file(project, bucket_name, filename, spark_file): - """Uploads the PySpark file in this directory to the configured input - bucket.""" - print("Uploading pyspark file to Cloud Storage.") - client = storage.Client(project=project) - bucket = client.get_bucket(bucket_name) - blob = bucket.blob(filename) - blob.upload_from_file(spark_file) - - -def download_output(project, cluster_id, output_bucket, job_id): - """Downloads the output file from Cloud Storage and returns it as a - string.""" - print("Downloading output file.") - client = storage.Client(project=project) - bucket = client.get_bucket(output_bucket) - output_blob = "google-cloud-dataproc-metainfo/{}/jobs/{}/driveroutput.000000000".format( - cluster_id, job_id - ) - return bucket.blob(output_blob).download_as_string() - - -# [START dataproc_create_cluster] -def quickstart(project_id, region, cluster_name, gcs_bucket, pyspark_file): - # Create the cluster client. - cluster_client = dataproc_v1.ClusterControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(region)} - ) - - # Create the cluster config. - cluster = { - "project_id": project_id, - "cluster_name": cluster_name, - "config": { - "master_config": {"num_instances": 1, "machine_type_uri": "n1-standard-2"}, - "worker_config": {"num_instances": 2, "machine_type_uri": "n1-standard-2"}, - }, - } - - # Create the cluster. - operation = cluster_client.create_cluster( - request={"project_id": project_id, "region": region, "cluster": cluster} - ) - result = operation.result() - - print("Cluster created successfully: {}".format(result.cluster_name)) - -# [END dataproc_create_cluster] - - spark_file, spark_filename = get_pyspark_file(pyspark_file) - upload_pyspark_file(project_id, gcs_bucket, spark_filename, spark_file) - -# [START dataproc_submit_job] - # Create the job client. - job_client = dataproc_v1.JobControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(region)} - ) - - # Create the job config. - job = { - "placement": {"cluster_name": cluster_name}, - "pyspark_job": {"main_python_file_uri": "gs://{}/{}".format(gcs_bucket, spark_filename)}, - } - - operation = job_client.submit_job_as_operation( - request={"project_id": project_id, "region": region, "job": job} - ) - response = operation.result() - - # Dataproc job output is saved to the Cloud Storage bucket - # allocated to the job. Use regex to obtain the bucket and blob info. - matches = re.match("gs://(.*?)/(.*)", response.driver_output_resource_uri) - - output = ( - storage.Client() - .get_bucket(matches.group(1)) - .blob(f"{matches.group(2)}.000000000") - .download_as_string() - ) - - print(f"Job finished successfully: {output}\r\n") - # [END dataproc_submit_job] - - # [START dataproc_delete_cluster] - # Delete the cluster once the job has terminated. - operation = cluster_client.delete_cluster( - request={ - "project_id": project_id, - "region": region, - "cluster_name": cluster_name, - } - ) - operation.result() - - print("Cluster {} successfully deleted.".format(cluster_name)) -# [END dataproc_delete_cluster] - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description=__doc__, - formatter_class=argparse.RawDescriptionHelpFormatter, - ) - parser.add_argument( - "--project_id", - type=str, - required=True, - help="Project to use for creating resources.", - ) - parser.add_argument( - "--region", - type=str, - required=True, - help="Region where the resources should live.", - ) - parser.add_argument( - "--cluster_name", - type=str, - required=True, - help="Name to use for creating a cluster.", - ) - - parser.add_argument( - "--gcs_bucket", help="Bucket to upload Pyspark file to", required=True - ) - - parser.add_argument( - "--pyspark_file", help="Pyspark filename. Defaults to pyspark_sort.py" - ) - - args = parser.parse_args() - quickstart(args.project_id, args.region, args.cluster_name, args.gcs_bucket, args.pyspark_file) -# [END dataproc_quickstart] diff --git a/samples/snippets/update_cluster.py b/samples/snippets/update_cluster.py deleted file mode 100644 index bae6eee2..00000000 --- a/samples/snippets/update_cluster.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright 2021 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 -# -# http://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 sample walks a user through updating the number of clusters using the Dataproc -# client library. - -# Usage: -# python update_cluster.py --project_id --region --cluster_name - -import sys - -# [START dataproc_update_cluster] -from google.cloud import dataproc_v1 as dataproc - - -def update_cluster(project_id, region, cluster_name, new_num_instances): - """This sample walks a user through updating a Cloud Dataproc cluster - using the Python client library. - - Args: - project_id (str): Project to use for creating resources. - region (str): Region where the resources should live. - cluster_name (str): Name to use for creating a cluster. - """ - - # Create a client with the endpoint set to the desired cluster region. - client = dataproc.ClusterControllerClient( - client_options={"api_endpoint": f"{region}-dataproc.googleapis.com:443"} - ) - - # Get cluster you wish to update. - cluster = client.get_cluster( - project_id=project_id, region=region, cluster_name=cluster_name - ) - - # Update number of clusters - mask = {"paths": {"config.worker_config.num_instances": str(new_num_instances)}} - - # Update cluster config - cluster.config.worker_config.num_instances = new_num_instances - - # Update cluster - operation = client.update_cluster( - project_id=project_id, - region=region, - cluster=cluster, - cluster_name=cluster_name, - update_mask=mask, - ) - - # Output a success message. - updated_cluster = operation.result() - print(f"Cluster was updated successfully: {updated_cluster.cluster_name}") - - -# [END dataproc_update_cluster] - - -if __name__ == "__main__": - if len(sys.argv) < 5: - sys.exit("python update_cluster.py project_id region cluster_name") - - project_id = sys.argv[1] - region = sys.argv[2] - cluster_name = sys.argv[3] - new_num_instances = sys.argv[4] - update_cluster(project_id, region, cluster_name) diff --git a/samples/snippets/update_cluster_test.py b/samples/snippets/update_cluster_test.py deleted file mode 100644 index 9a9d66c9..00000000 --- a/samples/snippets/update_cluster_test.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright 2021 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 -# -# http://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 sample walks a user through updating the number of clusters using the Dataproc -# client library. - - -import os -import uuid - -from google.api_core.exceptions import NotFound -from google.cloud.dataproc_v1.services.cluster_controller.client import ( - ClusterControllerClient, -) -import pytest - -import update_cluster - - -PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] -REGION = "us-central1" -CLUSTER_NAME = f"py-cc-test-{str(uuid.uuid4())}" -NEW_NUM_INSTANCES = 5 -CLUSTER = { - "project_id": PROJECT_ID, - "cluster_name": CLUSTER_NAME, - "config": { - "master_config": {"num_instances": 1, "machine_type_uri": "n1-standard-2"}, - "worker_config": {"num_instances": 2, "machine_type_uri": "n1-standard-2"}, - }, -} - - -@pytest.fixture -def cluster_client(): - cluster_client = ClusterControllerClient( - client_options={"api_endpoint": "{}-dataproc.googleapis.com:443".format(REGION)} - ) - return cluster_client - - -@pytest.fixture(autouse=True) -def setup_teardown(cluster_client): - try: - # Create the cluster. - operation = cluster_client.create_cluster( - request={"project_id": PROJECT_ID, "region": REGION, "cluster": CLUSTER} - ) - operation.result() - - yield - finally: - try: - operation = cluster_client.delete_cluster( - request={ - "project_id": PROJECT_ID, - "region": REGION, - "cluster_name": CLUSTER_NAME, - } - ) - operation.result() - except NotFound: - print("Cluster already deleted") - - -def test_update_cluster(capsys, cluster_client: ClusterControllerClient): - # Wrapper function for client library function - update_cluster.update_cluster(PROJECT_ID, REGION, CLUSTER_NAME, NEW_NUM_INSTANCES) - new_num_cluster = cluster_client.get_cluster( - project_id=PROJECT_ID, region=REGION, cluster_name=CLUSTER_NAME - ) - - out, _ = capsys.readouterr() - assert CLUSTER_NAME in out - assert new_num_cluster.config.worker_config.num_instances == NEW_NUM_INSTANCES From 84f1caa8d65ba7e8e3c19cb5bc292164432e5ef6 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Thu, 8 Dec 2022 15:00:14 -0500 Subject: [PATCH 09/12] build(deps): bump certifi from 2022.9.24 to 2022.12.7 in /synthtool/gcp/templates/python_library/.kokoro (#504) Source-Link: https://github.com/googleapis/synthtool/commit/b4fe62efb5114b6738ad4b13d6f654f2bf4b7cc0 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 Co-authored-by: Owl Bot --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 6 +++--- .pre-commit-config.yaml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index bb21147e..fccaa8e8 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:3abfa0f1886adaf0b83f07cb117b24a639ea1cb9cffe56d43280b977033563eb + digest: sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 9c1b9be3..05dc4672 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -20,9 +20,9 @@ cachetools==5.2.0 \ --hash=sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757 \ --hash=sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db # via google-auth -certifi==2022.9.24 \ - --hash=sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14 \ - --hash=sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382 +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 # via requests cffi==1.15.1 \ --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 46d23716..5405cc8f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,7 @@ repos: rev: 22.3.0 hooks: - id: black -- repo: https://gitlab.com/pycqa/flake8 +- repo: https://github.com/pycqa/flake8 rev: 3.9.2 hooks: - id: flake8 From 680d0d79a839e476703f6bd5d084850150778684 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 6 Jan 2023 11:44:37 +0000 Subject: [PATCH 10/12] chore(python): add support for python 3.11 [autoapprove] (#508) Source-Link: https://togithub.com/googleapis/synthtool/commit/7197a001ffb6d8ce7b0b9b11c280f0c536c1033a Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 --- .github/.OwlBot.lock.yaml | 4 +- .github/workflows/unittest.yml | 2 +- .kokoro/samples/python3.11/common.cfg | 40 ++++++++++++++++++++ .kokoro/samples/python3.11/continuous.cfg | 6 +++ .kokoro/samples/python3.11/periodic-head.cfg | 11 ++++++ .kokoro/samples/python3.11/periodic.cfg | 6 +++ .kokoro/samples/python3.11/presubmit.cfg | 6 +++ CONTRIBUTING.rst | 6 ++- noxfile.py | 2 +- 9 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 .kokoro/samples/python3.11/common.cfg create mode 100644 .kokoro/samples/python3.11/continuous.cfg create mode 100644 .kokoro/samples/python3.11/periodic-head.cfg create mode 100644 .kokoro/samples/python3.11/periodic.cfg create mode 100644 .kokoro/samples/python3.11/presubmit.cfg diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index fccaa8e8..889f77df 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 Google LLC +# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:3bf87e47c2173d7eed42714589dc4da2c07c3268610f1e47f8e1a30decbfc7f1 + digest: sha256:c43f1d918bcf817d337aa29ff833439494a158a0831508fda4ec75dc4c0d0320 diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 23000c05..8057a769 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python: ['3.7', '3.8', '3.9', '3.10'] + python: ['3.7', '3.8', '3.9', '3.10', '3.11'] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.kokoro/samples/python3.11/common.cfg b/.kokoro/samples/python3.11/common.cfg new file mode 100644 index 00000000..ff9a9cdd --- /dev/null +++ b/.kokoro/samples/python3.11/common.cfg @@ -0,0 +1,40 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +# Build logs will be here +action { + define_artifacts { + regex: "**/*sponge_log.xml" + } +} + +# Specify which tests to run +env_vars: { + key: "RUN_TESTS_SESSION" + value: "py-3.11" +} + +# Declare build specific Cloud project. +env_vars: { + key: "BUILD_SPECIFIC_GCLOUD_PROJECT" + value: "python-docs-samples-tests-311" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-dataproc/.kokoro/test-samples.sh" +} + +# Configure the docker image for kokoro-trampoline. +env_vars: { + key: "TRAMPOLINE_IMAGE" + value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker" +} + +# Download secrets for samples +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples" + +# Download trampoline resources. +gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline" + +# Use the trampoline script to run in docker. +build_file: "python-dataproc/.kokoro/trampoline_v2.sh" \ No newline at end of file diff --git a/.kokoro/samples/python3.11/continuous.cfg b/.kokoro/samples/python3.11/continuous.cfg new file mode 100644 index 00000000..a1c8d975 --- /dev/null +++ b/.kokoro/samples/python3.11/continuous.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/.kokoro/samples/python3.11/periodic-head.cfg b/.kokoro/samples/python3.11/periodic-head.cfg new file mode 100644 index 00000000..07ff9c8c --- /dev/null +++ b/.kokoro/samples/python3.11/periodic-head.cfg @@ -0,0 +1,11 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} + +env_vars: { + key: "TRAMPOLINE_BUILD_FILE" + value: "github/python-dataproc/.kokoro/test-samples-against-head.sh" +} diff --git a/.kokoro/samples/python3.11/periodic.cfg b/.kokoro/samples/python3.11/periodic.cfg new file mode 100644 index 00000000..71cd1e59 --- /dev/null +++ b/.kokoro/samples/python3.11/periodic.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "False" +} diff --git a/.kokoro/samples/python3.11/presubmit.cfg b/.kokoro/samples/python3.11/presubmit.cfg new file mode 100644 index 00000000..a1c8d975 --- /dev/null +++ b/.kokoro/samples/python3.11/presubmit.cfg @@ -0,0 +1,6 @@ +# Format: //devtools/kokoro/config/proto/build.proto + +env_vars: { + key: "INSTALL_LIBRARY_FROM_SOURCE" + value: "True" +} \ No newline at end of file diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 60e0e390..e0391ed5 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.7, 3.8, 3.9 and 3.10 on both UNIX and Windows. + 3.7, 3.8, 3.9, 3.10 and 3.11 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should @@ -72,7 +72,7 @@ We use `nox `__ to instrument our tests. - To run a single unit test:: - $ nox -s unit-3.10 -- -k + $ nox -s unit-3.11 -- -k .. note:: @@ -225,11 +225,13 @@ We support: - `Python 3.8`_ - `Python 3.9`_ - `Python 3.10`_ +- `Python 3.11`_ .. _Python 3.7: https://docs.python.org/3.7/ .. _Python 3.8: https://docs.python.org/3.8/ .. _Python 3.9: https://docs.python.org/3.9/ .. _Python 3.10: https://docs.python.org/3.10/ +.. _Python 3.11: https://docs.python.org/3.11/ Supported versions can be found in our ``noxfile.py`` `config`_. diff --git a/noxfile.py b/noxfile.py index 24536cf9..0b790954 100644 --- a/noxfile.py +++ b/noxfile.py @@ -31,7 +31,7 @@ DEFAULT_PYTHON_VERSION = "3.8" -UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10"] +UNIT_TEST_PYTHON_VERSIONS = ["3.7", "3.8", "3.9", "3.10", "3.11"] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "asyncmock", From b3b13c47129f807f385125bf6c96311793724066 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Sat, 7 Jan 2023 12:26:39 -0500 Subject: [PATCH 11/12] feat: added node groups API protos (#495) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update to gapic-generator-python 1.5.0 feat: add support for `google.cloud..__version__` PiperOrigin-RevId: 484665853 Source-Link: https://github.com/googleapis/googleapis/commit/8eb249a19db926c2fbc4ecf1dc09c0e521a88b22 Source-Link: https://github.com/googleapis/googleapis-gen/commit/c8aa327b5f478865fc3fd91e3c2768e54e26ad44 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYzhhYTMyN2I1ZjQ3ODg2NWZjM2ZkOTFlM2MyNzY4ZTU0ZTI2YWQ0NCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update version in gapic_version.py * add .release-please-manifest.json with correct version * set manifest to true in .github/release-please.yml * add release-please-config.json * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * chore: Update to gapic-generator-python 1.6.0 feat(python): Add typing to proto.Message based class attributes feat(python): Snippetgen handling of repeated enum field PiperOrigin-RevId: 487326846 Source-Link: https://github.com/googleapis/googleapis/commit/da380c77bb87ba0f752baf07605dd1db30e1f7e1 Source-Link: https://github.com/googleapis/googleapis-gen/commit/61ef5762ee6731a0cbbfea22fd0eecee51ab1c8e Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNjFlZjU3NjJlZTY3MzFhMGNiYmZlYTIyZmQwZWVjZWU1MWFiMWM4ZSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * feat: new APIs added to reflect updates to the filestore service - Add ENTERPRISE Tier - Add snapshot APIs: RevertInstance, ListSnapshots, CreateSnapshot, DeleteSnapshot, UpdateSnapshot - Add multi-share APIs: ListShares, GetShare, CreateShare, DeleteShare, UpdateShare - Add ConnectMode to NetworkConfig (for Private Service Access support) - New status codes (SUSPENDED/SUSPENDING, REVERTING/RESUMING) - Add SuspensionReason (for KMS related suspension) - Add new fields to Instance information: max_capacity_gb, capacity_step_size_gb, max_share_count, capacity_gb, multi_share_enabled PiperOrigin-RevId: 487492758 Source-Link: https://github.com/googleapis/googleapis/commit/5be5981f50322cf0c7388595e0f31ac5d0693469 Source-Link: https://github.com/googleapis/googleapis-gen/commit/ab0e217f560cc2c1afc11441c2eab6b6950efd2b Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYWIwZTIxN2Y1NjBjYzJjMWFmYzExNDQxYzJlYWI2YjY5NTBlZmQyYiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update path to snippet metadata json * chore: Update gapic-generator-python to v1.6.1 PiperOrigin-RevId: 488036204 Source-Link: https://github.com/googleapis/googleapis/commit/08f275f5c1c0d99056e1cb68376323414459ee19 Source-Link: https://github.com/googleapis/googleapis-gen/commit/555c0945e60649e38739ae64bc45719cdf72178f Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNTU1YzA5NDVlNjA2NDllMzg3MzlhZTY0YmM0NTcxOWNkZjcyMTc4ZiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix(deps): Require google-api-core >=1.34.0, >=2.11.0 fix: Drop usage of pkg_resources fix: Fix timeout default values docs(samples): Snippetgen should call await on the operation coroutine before calling result PiperOrigin-RevId: 493260409 Source-Link: https://github.com/googleapis/googleapis/commit/fea43879f83a8d0dacc9353b3f75f8f46d37162f Source-Link: https://github.com/googleapis/googleapis-gen/commit/387b7344c7529ee44be84e613b19a820508c612b Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMzg3YjczNDRjNzUyOWVlNDRiZTg0ZTYxM2IxOWE4MjA1MDhjNjEyYiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * add gapic_version.py * feat: added node groups API protos PiperOrigin-RevId: 494840237 Source-Link: https://github.com/googleapis/googleapis/commit/28449ecb37897d665a5a2c6d916133b1863f0966 Source-Link: https://github.com/googleapis/googleapis-gen/commit/786b1889c07c4ead16093d375c59455a0576ee25 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiNzg2YjE4ODljMDdjNGVhZDE2MDkzZDM3NWM1OTQ1NWEwNTc2ZWUyNSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update version in gapic_version.py * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * configure release please to use manifest * remove obsolete entry in release please config * use templated owlbot.py and setup.py * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * remove obsolete code in owlbot.py; restore noxfile Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .coveragerc | 5 - .github/release-please.yml | 1 + .release-please-manifest.json | 3 + docs/dataproc_v1/node_group_controller.rst | 6 + docs/dataproc_v1/services.rst | 1 + docs/dataproc_v1/types.rst | 1 - docs/index.rst | 19 +- google/cloud/dataproc/__init__.py | 26 + google/cloud/dataproc/gapic_version.py | 16 + google/cloud/dataproc_v1/__init__.py | 22 + google/cloud/dataproc_v1/gapic_metadata.json | 44 + google/cloud/dataproc_v1/gapic_version.py | 16 + .../async_client.py | 82 +- .../autoscaling_policy_service/client.py | 78 +- .../transports/base.py | 16 +- .../transports/grpc.py | 20 +- .../transports/grpc_asyncio.py | 16 +- .../services/batch_controller/async_client.py | 68 +- .../services/batch_controller/client.py | 64 +- .../batch_controller/transports/base.py | 16 +- .../batch_controller/transports/grpc.py | 20 +- .../transports/grpc_asyncio.py | 16 +- .../cluster_controller/async_client.py | 132 +- .../services/cluster_controller/client.py | 132 +- .../cluster_controller/transports/base.py | 16 +- .../cluster_controller/transports/grpc.py | 20 +- .../transports/grpc_asyncio.py | 16 +- .../services/job_controller/async_client.py | 110 +- .../services/job_controller/client.py | 100 +- .../job_controller/transports/base.py | 16 +- .../job_controller/transports/grpc.py | 20 +- .../job_controller/transports/grpc_asyncio.py | 16 +- .../node_group_controller/__init__.py | 22 + .../node_group_controller/async_client.py | 624 +++++ .../services/node_group_controller/client.py | 857 +++++++ .../transports/__init__.py | 35 + .../node_group_controller/transports/base.py | 192 ++ .../node_group_controller/transports/grpc.py | 342 +++ .../transports/grpc_asyncio.py | 347 +++ .../workflow_template_service/async_client.py | 116 +- .../workflow_template_service/client.py | 124 +- .../transports/base.py | 16 +- .../transports/grpc.py | 20 +- .../transports/grpc_asyncio.py | 16 +- google/cloud/dataproc_v1/types/__init__.py | 16 + .../dataproc_v1/types/autoscaling_policies.py | 58 +- google/cloud/dataproc_v1/types/batches.py | 136 +- google/cloud/dataproc_v1/types/clusters.py | 482 ++-- google/cloud/dataproc_v1/types/jobs.py | 381 +-- google/cloud/dataproc_v1/types/node_groups.py | 165 ++ google/cloud/dataproc_v1/types/operations.py | 124 +- google/cloud/dataproc_v1/types/shared.py | 98 +- .../dataproc_v1/types/workflow_templates.py | 190 +- owlbot.py | 49 +- release-please-config.json | 24 + ...ted_batch_controller_create_batch_async.py | 2 +- ...cluster_controller_create_cluster_async.py | 2 +- ...cluster_controller_delete_cluster_async.py | 2 +- ...uster_controller_diagnose_cluster_async.py | 2 +- ..._cluster_controller_start_cluster_async.py | 2 +- ...d_cluster_controller_stop_cluster_async.py | 2 +- ...cluster_controller_update_cluster_async.py | 2 +- ...ontroller_submit_job_as_operation_async.py | 2 +- ...roup_controller_create_node_group_async.py | 60 + ...group_controller_create_node_group_sync.py | 60 + ...e_group_controller_get_node_group_async.py | 52 + ...de_group_controller_get_node_group_sync.py | 52 + ...roup_controller_resize_node_group_async.py | 57 + ...group_controller_resize_node_group_sync.py | 57 + ...tantiate_inline_workflow_template_async.py | 2 +- ...ice_instantiate_workflow_template_async.py | 2 +- ...et_metadata_google.cloud.dataproc.v1.json} | 514 +++- scripts/fixup_dataproc_v1_keywords.py | 3 + setup.py | 48 +- testing/constraints-3.10.txt | 6 + testing/constraints-3.11.txt | 6 + testing/constraints-3.7.txt | 10 +- testing/constraints-3.8.txt | 6 + testing/constraints-3.9.txt | 6 + .../dataproc_v1/test_cluster_controller.py | 68 +- .../dataproc_v1/test_node_group_controller.py | 2220 +++++++++++++++++ .../test_workflow_template_service.py | 80 +- 82 files changed, 7571 insertions(+), 1322 deletions(-) create mode 100644 .release-please-manifest.json create mode 100644 docs/dataproc_v1/node_group_controller.rst create mode 100644 google/cloud/dataproc/gapic_version.py create mode 100644 google/cloud/dataproc_v1/gapic_version.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/__init__.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/async_client.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/client.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/transports/__init__.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/transports/base.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/transports/grpc.py create mode 100644 google/cloud/dataproc_v1/services/node_group_controller/transports/grpc_asyncio.py create mode 100644 google/cloud/dataproc_v1/types/node_groups.py create mode 100644 release-please-config.json create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_async.py create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_sync.py create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_async.py create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_sync.py create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_async.py create mode 100644 samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_sync.py rename samples/generated_samples/{snippet_metadata_dataproc_v1.json => snippet_metadata_google.cloud.dataproc.v1.json} (91%) create mode 100644 tests/unit/gapic/dataproc_v1/test_node_group_controller.py diff --git a/.coveragerc b/.coveragerc index 240638d1..8f752880 100644 --- a/.coveragerc +++ b/.coveragerc @@ -10,8 +10,3 @@ exclude_lines = pragma: NO COVER # Ignore debug-only repr def __repr__ - # Ignore pkg_resources exceptions. - # This is added at the module level as a safeguard for if someone - # generates the code and tries to run it without pip installing. This - # makes it virtually impossible to test properly. - except pkg_resources.DistributionNotFound diff --git a/.github/release-please.yml b/.github/release-please.yml index e25e4be0..df590806 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,5 +1,6 @@ releaseType: python handleGHRelease: true +manifest: true # NOTE: this section is generated by synthtool.languages.python # See https://github.com/googleapis/synthtool/blob/master/synthtool/languages/python.py branches: diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 00000000..f8d32fdd --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "5.0.3" +} diff --git a/docs/dataproc_v1/node_group_controller.rst b/docs/dataproc_v1/node_group_controller.rst new file mode 100644 index 00000000..55d67f48 --- /dev/null +++ b/docs/dataproc_v1/node_group_controller.rst @@ -0,0 +1,6 @@ +NodeGroupController +------------------------------------- + +.. automodule:: google.cloud.dataproc_v1.services.node_group_controller + :members: + :inherited-members: diff --git a/docs/dataproc_v1/services.rst b/docs/dataproc_v1/services.rst index ae0031d1..aee63982 100644 --- a/docs/dataproc_v1/services.rst +++ b/docs/dataproc_v1/services.rst @@ -7,4 +7,5 @@ Services for Google Cloud Dataproc v1 API batch_controller cluster_controller job_controller + node_group_controller workflow_template_service diff --git a/docs/dataproc_v1/types.rst b/docs/dataproc_v1/types.rst index bc1a0a30..5dde0cd6 100644 --- a/docs/dataproc_v1/types.rst +++ b/docs/dataproc_v1/types.rst @@ -3,5 +3,4 @@ Types for Google Cloud Dataproc v1 API .. automodule:: google.cloud.dataproc_v1.types :members: - :undoc-members: :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index cf0a9d21..965328b5 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,23 +2,26 @@ .. include:: multiprocessing.rst + API Reference ------------- .. toctree:: - :maxdepth: 2 + :maxdepth: 2 + + dataproc_v1/services + dataproc_v1/types - dataproc_v1/services - dataproc_v1/types Migration Guide --------------- -See the guide below for instructions on migrating to the 2.x release of this library. +See the guide below for instructions on migrating to the latest version. .. toctree:: - :maxdepth: 2 + :maxdepth: 2 + +  UPGRADING - UPGRADING Changelog --------- @@ -26,6 +29,6 @@ Changelog For a list of all ``google-cloud-dataproc`` releases: .. toctree:: - :maxdepth: 2 + :maxdepth: 2 - changelog \ No newline at end of file + changelog diff --git a/google/cloud/dataproc/__init__.py b/google/cloud/dataproc/__init__.py index 214250f5..d15065d3 100644 --- a/google/cloud/dataproc/__init__.py +++ b/google/cloud/dataproc/__init__.py @@ -13,6 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.dataproc import gapic_version as package_version + +__version__ = package_version.__version__ + from google.cloud.dataproc_v1.services.autoscaling_policy_service.client import ( AutoscalingPolicyServiceClient, @@ -36,6 +40,12 @@ from google.cloud.dataproc_v1.services.job_controller.async_client import ( JobControllerAsyncClient, ) +from google.cloud.dataproc_v1.services.node_group_controller.client import ( + NodeGroupControllerClient, +) +from google.cloud.dataproc_v1.services.node_group_controller.async_client import ( + NodeGroupControllerAsyncClient, +) from google.cloud.dataproc_v1.services.workflow_template_service.client import ( WorkflowTemplateServiceClient, ) @@ -83,6 +93,7 @@ from google.cloud.dataproc_v1.types.batches import SparkSqlBatch from google.cloud.dataproc_v1.types.clusters import AcceleratorConfig from google.cloud.dataproc_v1.types.clusters import AutoscalingConfig +from google.cloud.dataproc_v1.types.clusters import AuxiliaryNodeGroup from google.cloud.dataproc_v1.types.clusters import AuxiliaryServicesConfig from google.cloud.dataproc_v1.types.clusters import Cluster from google.cloud.dataproc_v1.types.clusters import ClusterConfig @@ -107,6 +118,7 @@ from google.cloud.dataproc_v1.types.clusters import ListClustersResponse from google.cloud.dataproc_v1.types.clusters import ManagedGroupConfig from google.cloud.dataproc_v1.types.clusters import MetastoreConfig +from google.cloud.dataproc_v1.types.clusters import NodeGroup from google.cloud.dataproc_v1.types.clusters import NodeGroupAffinity from google.cloud.dataproc_v1.types.clusters import NodeInitializationAction from google.cloud.dataproc_v1.types.clusters import ReservationAffinity @@ -119,6 +131,7 @@ from google.cloud.dataproc_v1.types.clusters import VirtualClusterConfig from google.cloud.dataproc_v1.types.jobs import CancelJobRequest from google.cloud.dataproc_v1.types.jobs import DeleteJobRequest +from google.cloud.dataproc_v1.types.jobs import DriverSchedulingConfig from google.cloud.dataproc_v1.types.jobs import GetJobRequest from google.cloud.dataproc_v1.types.jobs import HadoopJob from google.cloud.dataproc_v1.types.jobs import HiveJob @@ -141,9 +154,13 @@ from google.cloud.dataproc_v1.types.jobs import SubmitJobRequest from google.cloud.dataproc_v1.types.jobs import UpdateJobRequest from google.cloud.dataproc_v1.types.jobs import YarnApplication +from google.cloud.dataproc_v1.types.node_groups import CreateNodeGroupRequest +from google.cloud.dataproc_v1.types.node_groups import GetNodeGroupRequest +from google.cloud.dataproc_v1.types.node_groups import ResizeNodeGroupRequest from google.cloud.dataproc_v1.types.operations import BatchOperationMetadata from google.cloud.dataproc_v1.types.operations import ClusterOperationMetadata from google.cloud.dataproc_v1.types.operations import ClusterOperationStatus +from google.cloud.dataproc_v1.types.operations import NodeGroupOperationMetadata from google.cloud.dataproc_v1.types.shared import EnvironmentConfig from google.cloud.dataproc_v1.types.shared import ExecutionConfig from google.cloud.dataproc_v1.types.shared import GkeClusterConfig @@ -202,6 +219,8 @@ "ClusterControllerAsyncClient", "JobControllerClient", "JobControllerAsyncClient", + "NodeGroupControllerClient", + "NodeGroupControllerAsyncClient", "WorkflowTemplateServiceClient", "WorkflowTemplateServiceAsyncClient", "AutoscalingPolicy", @@ -226,6 +245,7 @@ "SparkSqlBatch", "AcceleratorConfig", "AutoscalingConfig", + "AuxiliaryNodeGroup", "AuxiliaryServicesConfig", "Cluster", "ClusterConfig", @@ -250,6 +270,7 @@ "ListClustersResponse", "ManagedGroupConfig", "MetastoreConfig", + "NodeGroup", "NodeGroupAffinity", "NodeInitializationAction", "ReservationAffinity", @@ -262,6 +283,7 @@ "VirtualClusterConfig", "CancelJobRequest", "DeleteJobRequest", + "DriverSchedulingConfig", "GetJobRequest", "HadoopJob", "HiveJob", @@ -284,9 +306,13 @@ "SubmitJobRequest", "UpdateJobRequest", "YarnApplication", + "CreateNodeGroupRequest", + "GetNodeGroupRequest", + "ResizeNodeGroupRequest", "BatchOperationMetadata", "ClusterOperationMetadata", "ClusterOperationStatus", + "NodeGroupOperationMetadata", "EnvironmentConfig", "ExecutionConfig", "GkeClusterConfig", diff --git a/google/cloud/dataproc/gapic_version.py b/google/cloud/dataproc/gapic_version.py new file mode 100644 index 00000000..6ed707c8 --- /dev/null +++ b/google/cloud/dataproc/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +__version__ = "5.0.3" # {x-release-please-version} diff --git a/google/cloud/dataproc_v1/__init__.py b/google/cloud/dataproc_v1/__init__.py index 729f5cbf..a5969782 100644 --- a/google/cloud/dataproc_v1/__init__.py +++ b/google/cloud/dataproc_v1/__init__.py @@ -13,6 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.dataproc import gapic_version as package_version + +__version__ = package_version.__version__ + from .services.autoscaling_policy_service import AutoscalingPolicyServiceClient from .services.autoscaling_policy_service import AutoscalingPolicyServiceAsyncClient @@ -22,6 +26,8 @@ from .services.cluster_controller import ClusterControllerAsyncClient from .services.job_controller import JobControllerClient from .services.job_controller import JobControllerAsyncClient +from .services.node_group_controller import NodeGroupControllerClient +from .services.node_group_controller import NodeGroupControllerAsyncClient from .services.workflow_template_service import WorkflowTemplateServiceClient from .services.workflow_template_service import WorkflowTemplateServiceAsyncClient @@ -47,6 +53,7 @@ from .types.batches import SparkSqlBatch from .types.clusters import AcceleratorConfig from .types.clusters import AutoscalingConfig +from .types.clusters import AuxiliaryNodeGroup from .types.clusters import AuxiliaryServicesConfig from .types.clusters import Cluster from .types.clusters import ClusterConfig @@ -71,6 +78,7 @@ from .types.clusters import ListClustersResponse from .types.clusters import ManagedGroupConfig from .types.clusters import MetastoreConfig +from .types.clusters import NodeGroup from .types.clusters import NodeGroupAffinity from .types.clusters import NodeInitializationAction from .types.clusters import ReservationAffinity @@ -83,6 +91,7 @@ from .types.clusters import VirtualClusterConfig from .types.jobs import CancelJobRequest from .types.jobs import DeleteJobRequest +from .types.jobs import DriverSchedulingConfig from .types.jobs import GetJobRequest from .types.jobs import HadoopJob from .types.jobs import HiveJob @@ -105,9 +114,13 @@ from .types.jobs import SubmitJobRequest from .types.jobs import UpdateJobRequest from .types.jobs import YarnApplication +from .types.node_groups import CreateNodeGroupRequest +from .types.node_groups import GetNodeGroupRequest +from .types.node_groups import ResizeNodeGroupRequest from .types.operations import BatchOperationMetadata from .types.operations import ClusterOperationMetadata from .types.operations import ClusterOperationStatus +from .types.operations import NodeGroupOperationMetadata from .types.shared import EnvironmentConfig from .types.shared import ExecutionConfig from .types.shared import GkeClusterConfig @@ -148,11 +161,13 @@ "BatchControllerAsyncClient", "ClusterControllerAsyncClient", "JobControllerAsyncClient", + "NodeGroupControllerAsyncClient", "WorkflowTemplateServiceAsyncClient", "AcceleratorConfig", "AutoscalingConfig", "AutoscalingPolicy", "AutoscalingPolicyServiceClient", + "AuxiliaryNodeGroup", "AuxiliaryServicesConfig", "BasicAutoscalingAlgorithm", "BasicYarnAutoscalingConfig", @@ -174,6 +189,7 @@ "CreateAutoscalingPolicyRequest", "CreateBatchRequest", "CreateClusterRequest", + "CreateNodeGroupRequest", "CreateWorkflowTemplateRequest", "DataprocMetricConfig", "DeleteAutoscalingPolicyRequest", @@ -184,6 +200,7 @@ "DiagnoseClusterRequest", "DiagnoseClusterResults", "DiskConfig", + "DriverSchedulingConfig", "EncryptionConfig", "EndpointConfig", "EnvironmentConfig", @@ -194,6 +211,7 @@ "GetBatchRequest", "GetClusterRequest", "GetJobRequest", + "GetNodeGroupRequest", "GetWorkflowTemplateRequest", "GkeClusterConfig", "GkeNodePoolConfig", @@ -230,7 +248,10 @@ "ManagedCluster", "ManagedGroupConfig", "MetastoreConfig", + "NodeGroup", "NodeGroupAffinity", + "NodeGroupControllerClient", + "NodeGroupOperationMetadata", "NodeInitializationAction", "OrderedJob", "ParameterValidation", @@ -242,6 +263,7 @@ "QueryList", "RegexValidation", "ReservationAffinity", + "ResizeNodeGroupRequest", "RuntimeConfig", "RuntimeInfo", "SecurityConfig", diff --git a/google/cloud/dataproc_v1/gapic_metadata.json b/google/cloud/dataproc_v1/gapic_metadata.json index 8e050e14..da52acb4 100644 --- a/google/cloud/dataproc_v1/gapic_metadata.json +++ b/google/cloud/dataproc_v1/gapic_metadata.json @@ -301,6 +301,50 @@ } } }, + "NodeGroupController": { + "clients": { + "grpc": { + "libraryClient": "NodeGroupControllerClient", + "rpcs": { + "CreateNodeGroup": { + "methods": [ + "create_node_group" + ] + }, + "GetNodeGroup": { + "methods": [ + "get_node_group" + ] + }, + "ResizeNodeGroup": { + "methods": [ + "resize_node_group" + ] + } + } + }, + "grpc-async": { + "libraryClient": "NodeGroupControllerAsyncClient", + "rpcs": { + "CreateNodeGroup": { + "methods": [ + "create_node_group" + ] + }, + "GetNodeGroup": { + "methods": [ + "get_node_group" + ] + }, + "ResizeNodeGroup": { + "methods": [ + "resize_node_group" + ] + } + } + } + } + }, "WorkflowTemplateService": { "clients": { "grpc": { diff --git a/google/cloud/dataproc_v1/gapic_version.py b/google/cloud/dataproc_v1/gapic_version.py new file mode 100644 index 00000000..6ed707c8 --- /dev/null +++ b/google/cloud/dataproc_v1/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +__version__ = "5.0.3" # {x-release-please-version} diff --git a/google/cloud/dataproc_v1/services/autoscaling_policy_service/async_client.py b/google/cloud/dataproc_v1/services/autoscaling_policy_service/async_client.py index 2f00fb39..df07acd0 100644 --- a/google/cloud/dataproc_v1/services/autoscaling_policy_service/async_client.py +++ b/google/cloud/dataproc_v1/services/autoscaling_policy_service/async_client.py @@ -16,8 +16,19 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -169,9 +180,9 @@ def transport(self) -> AutoscalingPolicyServiceTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, AutoscalingPolicyServiceTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the autoscaling policy service client. @@ -215,14 +226,14 @@ def __init__( async def create_autoscaling_policy( self, - request: Union[ - autoscaling_policies.CreateAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.CreateAutoscalingPolicyRequest, dict] ] = None, *, - parent: str = None, - policy: autoscaling_policies.AutoscalingPolicy = None, + parent: Optional[str] = None, + policy: Optional[autoscaling_policies.AutoscalingPolicy] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Creates new autoscaling policy. @@ -260,7 +271,7 @@ async def sample_create_autoscaling_policy(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.CreateAutoscalingPolicyRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.CreateAutoscalingPolicyRequest, dict]]): The request object. A request to create an autoscaling policy. parent (:class:`str`): @@ -346,13 +357,13 @@ async def sample_create_autoscaling_policy(): async def update_autoscaling_policy( self, - request: Union[ - autoscaling_policies.UpdateAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.UpdateAutoscalingPolicyRequest, dict] ] = None, *, - policy: autoscaling_policies.AutoscalingPolicy = None, + policy: Optional[autoscaling_policies.AutoscalingPolicy] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Updates (replaces) autoscaling policy. @@ -392,7 +403,7 @@ async def sample_update_autoscaling_policy(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.UpdateAutoscalingPolicyRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.UpdateAutoscalingPolicyRequest, dict]]): The request object. A request to update an autoscaling policy. policy (:class:`google.cloud.dataproc_v1.types.AutoscalingPolicy`): @@ -470,11 +481,13 @@ async def sample_update_autoscaling_policy(): async def get_autoscaling_policy( self, - request: Union[autoscaling_policies.GetAutoscalingPolicyRequest, dict] = None, + request: Optional[ + Union[autoscaling_policies.GetAutoscalingPolicyRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Retrieves autoscaling policy. @@ -506,7 +519,7 @@ async def sample_get_autoscaling_policy(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.GetAutoscalingPolicyRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.GetAutoscalingPolicyRequest, dict]]): The request object. A request to fetch an autoscaling policy. name (:class:`str`): @@ -592,13 +605,13 @@ async def sample_get_autoscaling_policy(): async def list_autoscaling_policies( self, - request: Union[ - autoscaling_policies.ListAutoscalingPoliciesRequest, dict + request: Optional[ + Union[autoscaling_policies.ListAutoscalingPoliciesRequest, dict] ] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListAutoscalingPoliciesAsyncPager: r"""Lists autoscaling policies in the project. @@ -631,7 +644,7 @@ async def sample_list_autoscaling_policies(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.ListAutoscalingPoliciesRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.ListAutoscalingPoliciesRequest, dict]]): The request object. A request to list autoscaling policies in a project. parent (:class:`str`): @@ -729,13 +742,13 @@ async def sample_list_autoscaling_policies(): async def delete_autoscaling_policy( self, - request: Union[ - autoscaling_policies.DeleteAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.DeleteAutoscalingPolicyRequest, dict] ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes an autoscaling policy. It is an error to @@ -766,7 +779,7 @@ async def sample_delete_autoscaling_policy(): await client.delete_autoscaling_policy(request=request) Args: - request (Union[google.cloud.dataproc_v1.types.DeleteAutoscalingPolicyRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DeleteAutoscalingPolicyRequest, dict]]): The request object. A request to delete an autoscaling policy. Autoscaling policies in use by one or more clusters will @@ -842,14 +855,9 @@ async def __aexit__(self, exc_type, exc, tb): await self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("AutoscalingPolicyServiceAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/autoscaling_policy_service/client.py b/google/cloud/dataproc_v1/services/autoscaling_policy_service/client.py index 7d458872..eefe3bd8 100644 --- a/google/cloud/dataproc_v1/services/autoscaling_policy_service/client.py +++ b/google/cloud/dataproc_v1/services/autoscaling_policy_service/client.py @@ -16,8 +16,20 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -57,7 +69,7 @@ class AutoscalingPolicyServiceClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[AutoscalingPolicyServiceTransport]: """Returns an appropriate transport class. @@ -334,8 +346,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, AutoscalingPolicyServiceTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, AutoscalingPolicyServiceTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the autoscaling policy service client. @@ -349,7 +361,7 @@ def __init__( transport (Union[str, AutoscalingPolicyServiceTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -379,6 +391,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -431,14 +444,14 @@ def __init__( def create_autoscaling_policy( self, - request: Union[ - autoscaling_policies.CreateAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.CreateAutoscalingPolicyRequest, dict] ] = None, *, - parent: str = None, - policy: autoscaling_policies.AutoscalingPolicy = None, + parent: Optional[str] = None, + policy: Optional[autoscaling_policies.AutoscalingPolicy] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Creates new autoscaling policy. @@ -564,13 +577,13 @@ def sample_create_autoscaling_policy(): def update_autoscaling_policy( self, - request: Union[ - autoscaling_policies.UpdateAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.UpdateAutoscalingPolicyRequest, dict] ] = None, *, - policy: autoscaling_policies.AutoscalingPolicy = None, + policy: Optional[autoscaling_policies.AutoscalingPolicy] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Updates (replaces) autoscaling policy. @@ -680,11 +693,13 @@ def sample_update_autoscaling_policy(): def get_autoscaling_policy( self, - request: Union[autoscaling_policies.GetAutoscalingPolicyRequest, dict] = None, + request: Optional[ + Union[autoscaling_policies.GetAutoscalingPolicyRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> autoscaling_policies.AutoscalingPolicy: r"""Retrieves autoscaling policy. @@ -792,13 +807,13 @@ def sample_get_autoscaling_policy(): def list_autoscaling_policies( self, - request: Union[ - autoscaling_policies.ListAutoscalingPoliciesRequest, dict + request: Optional[ + Union[autoscaling_policies.ListAutoscalingPoliciesRequest, dict] ] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListAutoscalingPoliciesPager: r"""Lists autoscaling policies in the project. @@ -921,13 +936,13 @@ def sample_list_autoscaling_policies(): def delete_autoscaling_policy( self, - request: Union[ - autoscaling_policies.DeleteAutoscalingPolicyRequest, dict + request: Optional[ + Union[autoscaling_policies.DeleteAutoscalingPolicyRequest, dict] ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes an autoscaling policy. It is an error to @@ -1043,14 +1058,9 @@ def __exit__(self, type, value, traceback): self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("AutoscalingPolicyServiceClient",) diff --git a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/base.py b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/base.py index e2bf3b59..6449d51b 100644 --- a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/base.py +++ b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/base.py @@ -15,7 +15,8 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources + +from google.cloud.dataproc_v1 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -28,14 +29,9 @@ from google.cloud.dataproc_v1.types import autoscaling_policies from google.protobuf import empty_pb2 # type: ignore -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) class AutoscalingPolicyServiceTransport(abc.ABC): @@ -49,7 +45,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc.py b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc.py index 2962dd25..0da7e6c4 100644 --- a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc.py +++ b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc.py @@ -49,14 +49,14 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -183,8 +183,8 @@ def __init__( def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc_asyncio.py index 87267eae..e37ed08e 100644 --- a/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc_asyncio.py +++ b/google/cloud/dataproc_v1/services/autoscaling_policy_service/transports/grpc_asyncio.py @@ -51,7 +51,7 @@ class AutoscalingPolicyServiceGrpcAsyncIOTransport(AutoscalingPolicyServiceTrans def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -94,15 +94,15 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/batch_controller/async_client.py b/google/cloud/dataproc_v1/services/batch_controller/async_client.py index 9935a0bb..c13320d1 100644 --- a/google/cloud/dataproc_v1/services/batch_controller/async_client.py +++ b/google/cloud/dataproc_v1/services/batch_controller/async_client.py @@ -16,8 +16,19 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -165,9 +176,9 @@ def transport(self) -> BatchControllerTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, BatchControllerTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the batch controller client. @@ -211,13 +222,13 @@ def __init__( async def create_batch( self, - request: Union[batches.CreateBatchRequest, dict] = None, + request: Optional[Union[batches.CreateBatchRequest, dict]] = None, *, - parent: str = None, - batch: batches.Batch = None, - batch_id: str = None, + parent: Optional[str] = None, + batch: Optional[batches.Batch] = None, + batch_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Creates a batch workload that executes @@ -252,13 +263,13 @@ async def sample_create_batch(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.CreateBatchRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.CreateBatchRequest, dict]]): The request object. A request to create a batch workload. parent (:class:`str`): @@ -354,11 +365,11 @@ async def sample_create_batch(): async def get_batch( self, - request: Union[batches.GetBatchRequest, dict] = None, + request: Optional[Union[batches.GetBatchRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> batches.Batch: r"""Gets the batch workload resource representation. @@ -390,7 +401,7 @@ async def sample_get_batch(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.GetBatchRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.GetBatchRequest, dict]]): The request object. A request to get the resource representation for a batch workload. name (:class:`str`): @@ -456,11 +467,11 @@ async def sample_get_batch(): async def list_batches( self, - request: Union[batches.ListBatchesRequest, dict] = None, + request: Optional[Union[batches.ListBatchesRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListBatchesAsyncPager: r"""Lists batch workloads. @@ -493,7 +504,7 @@ async def sample_list_batches(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.ListBatchesRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.ListBatchesRequest, dict]]): The request object. A request to list batch workloads in a project. parent (:class:`str`): @@ -570,11 +581,11 @@ async def sample_list_batches(): async def delete_batch( self, - request: Union[batches.DeleteBatchRequest, dict] = None, + request: Optional[Union[batches.DeleteBatchRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes the batch workload resource. If the batch is not in @@ -605,7 +616,7 @@ async def sample_delete_batch(): await client.delete_batch(request=request) Args: - request (Union[google.cloud.dataproc_v1.types.DeleteBatchRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DeleteBatchRequest, dict]]): The request object. A request to delete a batch workload. name (:class:`str`): @@ -667,14 +678,9 @@ async def __aexit__(self, exc_type, exc, tb): await self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("BatchControllerAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/batch_controller/client.py b/google/cloud/dataproc_v1/services/batch_controller/client.py index 40b977ae..c26d5d00 100644 --- a/google/cloud/dataproc_v1/services/batch_controller/client.py +++ b/google/cloud/dataproc_v1/services/batch_controller/client.py @@ -16,8 +16,20 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -62,7 +74,7 @@ class BatchControllerClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[BatchControllerTransport]: """Returns an appropriate transport class. @@ -339,8 +351,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, BatchControllerTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, BatchControllerTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the batch controller client. @@ -354,7 +366,7 @@ def __init__( transport (Union[str, BatchControllerTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -384,6 +396,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -436,13 +449,13 @@ def __init__( def create_batch( self, - request: Union[batches.CreateBatchRequest, dict] = None, + request: Optional[Union[batches.CreateBatchRequest, dict]] = None, *, - parent: str = None, - batch: batches.Batch = None, - batch_id: str = None, + parent: Optional[str] = None, + batch: Optional[batches.Batch] = None, + batch_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Creates a batch workload that executes @@ -579,11 +592,11 @@ def sample_create_batch(): def get_batch( self, - request: Union[batches.GetBatchRequest, dict] = None, + request: Optional[Union[batches.GetBatchRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> batches.Batch: r"""Gets the batch workload resource representation. @@ -681,11 +694,11 @@ def sample_get_batch(): def list_batches( self, - request: Union[batches.ListBatchesRequest, dict] = None, + request: Optional[Union[batches.ListBatchesRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListBatchesPager: r"""Lists batch workloads. @@ -795,11 +808,11 @@ def sample_list_batches(): def delete_batch( self, - request: Union[batches.DeleteBatchRequest, dict] = None, + request: Optional[Union[batches.DeleteBatchRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes the batch workload resource. If the batch is not in @@ -899,14 +912,9 @@ def __exit__(self, type, value, traceback): self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("BatchControllerClient",) diff --git a/google/cloud/dataproc_v1/services/batch_controller/transports/base.py b/google/cloud/dataproc_v1/services/batch_controller/transports/base.py index 6eae6f77..af56cafe 100644 --- a/google/cloud/dataproc_v1/services/batch_controller/transports/base.py +++ b/google/cloud/dataproc_v1/services/batch_controller/transports/base.py @@ -15,7 +15,8 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources + +from google.cloud.dataproc_v1 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -30,14 +31,9 @@ from google.longrunning import operations_pb2 # type: ignore from google.protobuf import empty_pb2 # type: ignore -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) class BatchControllerTransport(abc.ABC): @@ -51,7 +47,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/batch_controller/transports/grpc.py b/google/cloud/dataproc_v1/services/batch_controller/transports/grpc.py index d76c0ae0..4bd4368d 100644 --- a/google/cloud/dataproc_v1/services/batch_controller/transports/grpc.py +++ b/google/cloud/dataproc_v1/services/batch_controller/transports/grpc.py @@ -51,14 +51,14 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -186,8 +186,8 @@ def __init__( def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/dataproc_v1/services/batch_controller/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/batch_controller/transports/grpc_asyncio.py index 5536f3a0..73f90799 100644 --- a/google/cloud/dataproc_v1/services/batch_controller/transports/grpc_asyncio.py +++ b/google/cloud/dataproc_v1/services/batch_controller/transports/grpc_asyncio.py @@ -53,7 +53,7 @@ class BatchControllerGrpcAsyncIOTransport(BatchControllerTransport): def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -96,15 +96,15 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/cluster_controller/async_client.py b/google/cloud/dataproc_v1/services/cluster_controller/async_client.py index f81268ef..aaa45c1b 100644 --- a/google/cloud/dataproc_v1/services/cluster_controller/async_client.py +++ b/google/cloud/dataproc_v1/services/cluster_controller/async_client.py @@ -16,8 +16,19 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -53,6 +64,8 @@ class ClusterControllerAsyncClient: DEFAULT_ENDPOINT = ClusterControllerClient.DEFAULT_ENDPOINT DEFAULT_MTLS_ENDPOINT = ClusterControllerClient.DEFAULT_MTLS_ENDPOINT + node_group_path = staticmethod(ClusterControllerClient.node_group_path) + parse_node_group_path = staticmethod(ClusterControllerClient.parse_node_group_path) service_path = staticmethod(ClusterControllerClient.service_path) parse_service_path = staticmethod(ClusterControllerClient.parse_service_path) common_billing_account_path = staticmethod( @@ -165,9 +178,9 @@ def transport(self) -> ClusterControllerTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, ClusterControllerTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the cluster controller client. @@ -211,13 +224,13 @@ def __init__( async def create_cluster( self, - request: Union[clusters.CreateClusterRequest, dict] = None, + request: Optional[Union[clusters.CreateClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster: clusters.Cluster = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster: Optional[clusters.Cluster] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Creates a cluster in a project. The returned @@ -256,13 +269,13 @@ async def sample_create_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.CreateClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.CreateClusterRequest, dict]]): The request object. A request to create a cluster. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -368,15 +381,15 @@ async def sample_create_cluster(): async def update_cluster( self, - request: Union[clusters.UpdateClusterRequest, dict] = None, + request: Optional[Union[clusters.UpdateClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, - cluster: clusters.Cluster = None, - update_mask: field_mask_pb2.FieldMask = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, + cluster: Optional[clusters.Cluster] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Updates a cluster in a project. The returned @@ -419,13 +432,13 @@ async def sample_update_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.UpdateClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.UpdateClusterRequest, dict]]): The request object. A request to update a cluster. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -609,10 +622,10 @@ async def sample_update_cluster(): async def stop_cluster( self, - request: Union[clusters.StopClusterRequest, dict] = None, + request: Optional[Union[clusters.StopClusterRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Stops a cluster in a project. @@ -644,13 +657,13 @@ async def sample_stop_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.StopClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.StopClusterRequest, dict]]): The request object. A request to stop a cluster. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -710,10 +723,10 @@ async def sample_stop_cluster(): async def start_cluster( self, - request: Union[clusters.StartClusterRequest, dict] = None, + request: Optional[Union[clusters.StartClusterRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Starts a cluster in a project. @@ -745,13 +758,13 @@ async def sample_start_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.StartClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.StartClusterRequest, dict]]): The request object. A request to start a cluster. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -811,13 +824,13 @@ async def sample_start_cluster(): async def delete_cluster( self, - request: Union[clusters.DeleteClusterRequest, dict] = None, + request: Optional[Union[clusters.DeleteClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Deletes a cluster in a project. The returned @@ -852,13 +865,13 @@ async def sample_delete_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.DeleteClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DeleteClusterRequest, dict]]): The request object. A request to delete a cluster. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -973,13 +986,13 @@ async def sample_delete_cluster(): async def get_cluster( self, - request: Union[clusters.GetClusterRequest, dict] = None, + request: Optional[Union[clusters.GetClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> clusters.Cluster: r"""Gets the resource representation for a cluster in a @@ -1014,7 +1027,7 @@ async def sample_get_cluster(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.GetClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.GetClusterRequest, dict]]): The request object. Request to get the resource representation for a cluster in a project. project_id (:class:`str`): @@ -1115,13 +1128,13 @@ async def sample_get_cluster(): async def list_clusters( self, - request: Union[clusters.ListClustersRequest, dict] = None, + request: Optional[Union[clusters.ListClustersRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - filter: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListClustersAsyncPager: r"""Lists all regions/{region}/clusters in a project @@ -1156,7 +1169,7 @@ async def sample_list_clusters(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.ListClustersRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.ListClustersRequest, dict]]): The request object. A request to list the clusters in a project. project_id (:class:`str`): @@ -1290,13 +1303,13 @@ async def sample_list_clusters(): async def diagnose_cluster( self, - request: Union[clusters.DiagnoseClusterRequest, dict] = None, + request: Optional[Union[clusters.DiagnoseClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Gets cluster diagnostic information. The returned @@ -1335,13 +1348,13 @@ async def sample_diagnose_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.DiagnoseClusterRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DiagnoseClusterRequest, dict]]): The request object. A request to collect cluster diagnostic information. project_id (:class:`str`): @@ -1455,14 +1468,9 @@ async def __aexit__(self, exc_type, exc, tb): await self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("ClusterControllerAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/cluster_controller/client.py b/google/cloud/dataproc_v1/services/cluster_controller/client.py index aa4eb2ae..199ceb2a 100644 --- a/google/cloud/dataproc_v1/services/cluster_controller/client.py +++ b/google/cloud/dataproc_v1/services/cluster_controller/client.py @@ -16,8 +16,20 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -62,7 +74,7 @@ class ClusterControllerClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[ClusterControllerTransport]: """Returns an appropriate transport class. @@ -169,6 +181,30 @@ def transport(self) -> ClusterControllerTransport: """ return self._transport + @staticmethod + def node_group_path( + project: str, + region: str, + cluster: str, + node_group: str, + ) -> str: + """Returns a fully-qualified node_group string.""" + return "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + + @staticmethod + def parse_node_group_path(path: str) -> Dict[str, str]: + """Parses a node_group path into its component segments.""" + m = re.match( + r"^projects/(?P.+?)/regions/(?P.+?)/clusters/(?P.+?)/nodeGroups/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def service_path( project: str, @@ -339,8 +375,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, ClusterControllerTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, ClusterControllerTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the cluster controller client. @@ -354,7 +390,7 @@ def __init__( transport (Union[str, ClusterControllerTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -384,6 +420,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -436,13 +473,13 @@ def __init__( def create_cluster( self, - request: Union[clusters.CreateClusterRequest, dict] = None, + request: Optional[Union[clusters.CreateClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster: clusters.Cluster = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster: Optional[clusters.Cluster] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Creates a cluster in a project. The returned @@ -584,15 +621,15 @@ def sample_create_cluster(): def update_cluster( self, - request: Union[clusters.UpdateClusterRequest, dict] = None, + request: Optional[Union[clusters.UpdateClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, - cluster: clusters.Cluster = None, - update_mask: field_mask_pb2.FieldMask = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, + cluster: Optional[clusters.Cluster] = None, + update_mask: Optional[field_mask_pb2.FieldMask] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Updates a cluster in a project. The returned @@ -816,10 +853,10 @@ def sample_update_cluster(): def stop_cluster( self, - request: Union[clusters.StopClusterRequest, dict] = None, + request: Optional[Union[clusters.StopClusterRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Stops a cluster in a project. @@ -918,10 +955,10 @@ def sample_stop_cluster(): def start_cluster( self, - request: Union[clusters.StartClusterRequest, dict] = None, + request: Optional[Union[clusters.StartClusterRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Starts a cluster in a project. @@ -1020,13 +1057,13 @@ def sample_start_cluster(): def delete_cluster( self, - request: Union[clusters.DeleteClusterRequest, dict] = None, + request: Optional[Union[clusters.DeleteClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Deletes a cluster in a project. The returned @@ -1173,13 +1210,13 @@ def sample_delete_cluster(): def get_cluster( self, - request: Union[clusters.GetClusterRequest, dict] = None, + request: Optional[Union[clusters.GetClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> clusters.Cluster: r"""Gets the resource representation for a cluster in a @@ -1304,13 +1341,13 @@ def sample_get_cluster(): def list_clusters( self, - request: Union[clusters.ListClustersRequest, dict] = None, + request: Optional[Union[clusters.ListClustersRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - filter: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListClustersPager: r"""Lists all regions/{region}/clusters in a project @@ -1468,13 +1505,13 @@ def sample_list_clusters(): def diagnose_cluster( self, - request: Union[clusters.DiagnoseClusterRequest, dict] = None, + request: Optional[Union[clusters.DiagnoseClusterRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - cluster_name: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + cluster_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Gets cluster diagnostic information. The returned @@ -1631,14 +1668,9 @@ def __exit__(self, type, value, traceback): self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("ClusterControllerClient",) diff --git a/google/cloud/dataproc_v1/services/cluster_controller/transports/base.py b/google/cloud/dataproc_v1/services/cluster_controller/transports/base.py index 3cc68102..d6c88f6e 100644 --- a/google/cloud/dataproc_v1/services/cluster_controller/transports/base.py +++ b/google/cloud/dataproc_v1/services/cluster_controller/transports/base.py @@ -15,7 +15,8 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources + +from google.cloud.dataproc_v1 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -29,14 +30,9 @@ from google.cloud.dataproc_v1.types import clusters from google.longrunning import operations_pb2 # type: ignore -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) class ClusterControllerTransport(abc.ABC): @@ -50,7 +46,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc.py b/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc.py index 73522293..fb9a1c1c 100644 --- a/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc.py +++ b/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc.py @@ -50,14 +50,14 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -185,8 +185,8 @@ def __init__( def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc_asyncio.py index 182d7278..fda9a70f 100644 --- a/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc_asyncio.py +++ b/google/cloud/dataproc_v1/services/cluster_controller/transports/grpc_asyncio.py @@ -52,7 +52,7 @@ class ClusterControllerGrpcAsyncIOTransport(ClusterControllerTransport): def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -95,15 +95,15 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/job_controller/async_client.py b/google/cloud/dataproc_v1/services/job_controller/async_client.py index f5eb0563..3c41cd27 100644 --- a/google/cloud/dataproc_v1/services/job_controller/async_client.py +++ b/google/cloud/dataproc_v1/services/job_controller/async_client.py @@ -16,8 +16,19 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -158,9 +169,9 @@ def transport(self) -> JobControllerTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, JobControllerTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the job controller client. @@ -204,13 +215,13 @@ def __init__( async def submit_job( self, - request: Union[jobs.SubmitJobRequest, dict] = None, + request: Optional[Union[jobs.SubmitJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job: jobs.Job = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job: Optional[jobs.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Submits a job to a cluster. @@ -248,7 +259,7 @@ async def sample_submit_job(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.SubmitJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.SubmitJobRequest, dict]]): The request object. A request to submit a job. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -342,13 +353,13 @@ async def sample_submit_job(): async def submit_job_as_operation( self, - request: Union[jobs.SubmitJobRequest, dict] = None, + request: Optional[Union[jobs.SubmitJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job: jobs.Job = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job: Optional[jobs.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Submits job to a cluster. @@ -384,13 +395,13 @@ async def sample_submit_job_as_operation(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.SubmitJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.SubmitJobRequest, dict]]): The request object. A request to submit a job. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -497,13 +508,13 @@ async def sample_submit_job_as_operation(): async def get_job( self, - request: Union[jobs.GetJobRequest, dict] = None, + request: Optional[Union[jobs.GetJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Gets the resource representation for a job in a @@ -538,7 +549,7 @@ async def sample_get_job(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.GetJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.GetJobRequest, dict]]): The request object. A request to get the resource representation for a job in a project. project_id (:class:`str`): @@ -636,13 +647,13 @@ async def sample_get_job(): async def list_jobs( self, - request: Union[jobs.ListJobsRequest, dict] = None, + request: Optional[Union[jobs.ListJobsRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - filter: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobsAsyncPager: r"""Lists regions/{region}/jobs in a project. @@ -676,7 +687,7 @@ async def sample_list_jobs(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.ListJobsRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.ListJobsRequest, dict]]): The request object. A request to list jobs in a project. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -802,10 +813,10 @@ async def sample_list_jobs(): async def update_job( self, - request: Union[jobs.UpdateJobRequest, dict] = None, + request: Optional[Union[jobs.UpdateJobRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Updates a job in a project. @@ -844,7 +855,7 @@ async def sample_update_job(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.UpdateJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.UpdateJobRequest, dict]]): The request object. A request to update a job. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. @@ -901,13 +912,13 @@ async def sample_update_job(): async def cancel_job( self, - request: Union[jobs.CancelJobRequest, dict] = None, + request: Optional[Union[jobs.CancelJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Starts a job cancellation request. To access the job resource @@ -945,7 +956,7 @@ async def sample_cancel_job(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.CancelJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.CancelJobRequest, dict]]): The request object. A request to cancel a job. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -1042,13 +1053,13 @@ async def sample_cancel_job(): async def delete_job( self, - request: Union[jobs.DeleteJobRequest, dict] = None, + request: Optional[Union[jobs.DeleteJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes the job from the project. If the job is active, the @@ -1080,7 +1091,7 @@ async def sample_delete_job(): await client.delete_job(request=request) Args: - request (Union[google.cloud.dataproc_v1.types.DeleteJobRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DeleteJobRequest, dict]]): The request object. A request to delete a job. project_id (:class:`str`): Required. The ID of the Google Cloud @@ -1173,14 +1184,9 @@ async def __aexit__(self, exc_type, exc, tb): await self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("JobControllerAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/job_controller/client.py b/google/cloud/dataproc_v1/services/job_controller/client.py index b36531b8..560d8075 100644 --- a/google/cloud/dataproc_v1/services/job_controller/client.py +++ b/google/cloud/dataproc_v1/services/job_controller/client.py @@ -16,8 +16,20 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -57,7 +69,7 @@ class JobControllerClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[JobControllerTransport]: """Returns an appropriate transport class. @@ -310,8 +322,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, JobControllerTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, JobControllerTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the job controller client. @@ -325,7 +337,7 @@ def __init__( transport (Union[str, JobControllerTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -355,6 +367,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -407,13 +420,13 @@ def __init__( def submit_job( self, - request: Union[jobs.SubmitJobRequest, dict] = None, + request: Optional[Union[jobs.SubmitJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job: jobs.Job = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job: Optional[jobs.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Submits a job to a cluster. @@ -536,13 +549,13 @@ def sample_submit_job(): def submit_job_as_operation( self, - request: Union[jobs.SubmitJobRequest, dict] = None, + request: Optional[Union[jobs.SubmitJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job: jobs.Job = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job: Optional[jobs.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Submits job to a cluster. @@ -682,13 +695,13 @@ def sample_submit_job_as_operation(): def get_job( self, - request: Union[jobs.GetJobRequest, dict] = None, + request: Optional[Union[jobs.GetJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Gets the resource representation for a job in a @@ -810,13 +823,13 @@ def sample_get_job(): def list_jobs( self, - request: Union[jobs.ListJobsRequest, dict] = None, + request: Optional[Union[jobs.ListJobsRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - filter: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobsPager: r"""Lists regions/{region}/jobs in a project. @@ -965,10 +978,10 @@ def sample_list_jobs(): def update_job( self, - request: Union[jobs.UpdateJobRequest, dict] = None, + request: Optional[Union[jobs.UpdateJobRequest, dict]] = None, *, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Updates a job in a project. @@ -1056,13 +1069,13 @@ def sample_update_job(): def cancel_job( self, - request: Union[jobs.CancelJobRequest, dict] = None, + request: Optional[Union[jobs.CancelJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> jobs.Job: r"""Starts a job cancellation request. To access the job resource @@ -1186,13 +1199,13 @@ def sample_cancel_job(): def delete_job( self, - request: Union[jobs.DeleteJobRequest, dict] = None, + request: Optional[Union[jobs.DeleteJobRequest, dict]] = None, *, - project_id: str = None, - region: str = None, - job_id: str = None, + project_id: Optional[str] = None, + region: Optional[str] = None, + job_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes the job from the project. If the job is active, the @@ -1315,14 +1328,9 @@ def __exit__(self, type, value, traceback): self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("JobControllerClient",) diff --git a/google/cloud/dataproc_v1/services/job_controller/transports/base.py b/google/cloud/dataproc_v1/services/job_controller/transports/base.py index 9e6d02b0..bce3beb2 100644 --- a/google/cloud/dataproc_v1/services/job_controller/transports/base.py +++ b/google/cloud/dataproc_v1/services/job_controller/transports/base.py @@ -15,7 +15,8 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources + +from google.cloud.dataproc_v1 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -30,14 +31,9 @@ from google.longrunning import operations_pb2 # type: ignore from google.protobuf import empty_pb2 # type: ignore -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) class JobControllerTransport(abc.ABC): @@ -51,7 +47,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/job_controller/transports/grpc.py b/google/cloud/dataproc_v1/services/job_controller/transports/grpc.py index e2bff3e0..2fd0b373 100644 --- a/google/cloud/dataproc_v1/services/job_controller/transports/grpc.py +++ b/google/cloud/dataproc_v1/services/job_controller/transports/grpc.py @@ -50,14 +50,14 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -185,8 +185,8 @@ def __init__( def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/dataproc_v1/services/job_controller/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/job_controller/transports/grpc_asyncio.py index c9454d3a..b50ffe02 100644 --- a/google/cloud/dataproc_v1/services/job_controller/transports/grpc_asyncio.py +++ b/google/cloud/dataproc_v1/services/job_controller/transports/grpc_asyncio.py @@ -52,7 +52,7 @@ class JobControllerGrpcAsyncIOTransport(JobControllerTransport): def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -95,15 +95,15 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/node_group_controller/__init__.py b/google/cloud/dataproc_v1/services/node_group_controller/__init__.py new file mode 100644 index 00000000..b2a4fcee --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +from .client import NodeGroupControllerClient +from .async_client import NodeGroupControllerAsyncClient + +__all__ = ( + "NodeGroupControllerClient", + "NodeGroupControllerAsyncClient", +) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/async_client.py b/google/cloud/dataproc_v1/services/node_group_controller/async_client.py new file mode 100644 index 00000000..bc9b1f7d --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/async_client.py @@ -0,0 +1,624 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +from collections import OrderedDict +import functools +import re +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.cloud.dataproc_v1.types import operations +from .transports.base import NodeGroupControllerTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import NodeGroupControllerGrpcAsyncIOTransport +from .client import NodeGroupControllerClient + + +class NodeGroupControllerAsyncClient: + """The ``NodeGroupControllerService`` provides methods to manage node + groups of Compute Engine managed instances. + """ + + _client: NodeGroupControllerClient + + DEFAULT_ENDPOINT = NodeGroupControllerClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = NodeGroupControllerClient.DEFAULT_MTLS_ENDPOINT + + node_group_path = staticmethod(NodeGroupControllerClient.node_group_path) + parse_node_group_path = staticmethod( + NodeGroupControllerClient.parse_node_group_path + ) + common_billing_account_path = staticmethod( + NodeGroupControllerClient.common_billing_account_path + ) + parse_common_billing_account_path = staticmethod( + NodeGroupControllerClient.parse_common_billing_account_path + ) + common_folder_path = staticmethod(NodeGroupControllerClient.common_folder_path) + parse_common_folder_path = staticmethod( + NodeGroupControllerClient.parse_common_folder_path + ) + common_organization_path = staticmethod( + NodeGroupControllerClient.common_organization_path + ) + parse_common_organization_path = staticmethod( + NodeGroupControllerClient.parse_common_organization_path + ) + common_project_path = staticmethod(NodeGroupControllerClient.common_project_path) + parse_common_project_path = staticmethod( + NodeGroupControllerClient.parse_common_project_path + ) + common_location_path = staticmethod(NodeGroupControllerClient.common_location_path) + parse_common_location_path = staticmethod( + NodeGroupControllerClient.parse_common_location_path + ) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + NodeGroupControllerAsyncClient: The constructed client. + """ + return NodeGroupControllerClient.from_service_account_info.__func__(NodeGroupControllerAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + NodeGroupControllerAsyncClient: The constructed client. + """ + return NodeGroupControllerClient.from_service_account_file.__func__(NodeGroupControllerAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[ClientOptions] = None + ): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variabel is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return NodeGroupControllerClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> NodeGroupControllerTransport: + """Returns the transport used by the client instance. + + Returns: + NodeGroupControllerTransport: The transport used by the client instance. + """ + return self._client.transport + + get_transport_class = functools.partial( + type(NodeGroupControllerClient).get_transport_class, + type(NodeGroupControllerClient), + ) + + def __init__( + self, + *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Union[str, NodeGroupControllerTransport] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the node group controller client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Union[str, ~.NodeGroupControllerTransport]): The + transport to use. If set to None, a transport is chosen + automatically. + client_options (ClientOptions): Custom options for the client. It + won't take effect if a ``transport`` instance is provided. + (1) The ``api_endpoint`` property can be used to override the + default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT + environment variable can also be used to override the endpoint: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto switch to the + default mTLS endpoint if client certificate is present, this is + the default value). However, the ``api_endpoint`` property takes + precedence if provided. + (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide client certificate for mutual TLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = NodeGroupControllerClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + ) + + async def create_node_group( + self, + request: Optional[Union[node_groups.CreateNodeGroupRequest, dict]] = None, + *, + parent: Optional[str] = None, + node_group: Optional[clusters.NodeGroup] = None, + node_group_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation_async.AsyncOperation: + r"""Creates a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + async def sample_create_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + node_group = dataproc_v1.NodeGroup() + node_group.roles = ['DRIVER'] + + request = dataproc_v1.CreateNodeGroupRequest( + parent="parent_value", + node_group=node_group, + ) + + # Make the request + operation = client.create_node_group(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.dataproc_v1.types.CreateNodeGroupRequest, dict]]): + The request object. A request to create a node group. + parent (:class:`str`): + Required. The parent resource where this node group will + be created. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}`` + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + node_group (:class:`google.cloud.dataproc_v1.types.NodeGroup`): + Required. The node group to create. + This corresponds to the ``node_group`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + node_group_id (:class:`str`): + Optional. An optional node group ID. Generated if not + specified. + + The ID must contain only letters (a-z, A-Z), numbers + (0-9), underscores (_), and hyphens (-). Cannot begin or + end with underscore or hyphen. Must consist of from 3 to + 33 characters. + + This corresponds to the ``node_group_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation_async.AsyncOperation: + An object representing a long-running operation. + + The result type for the operation will be :class:`google.cloud.dataproc_v1.types.NodeGroup` Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([parent, node_group, node_group_id]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + request = node_groups.CreateNodeGroupRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + if node_group is not None: + request.node_group = node_group + if node_group_id is not None: + request.node_group_id = node_group_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = gapic_v1.method_async.wrap_method( + self._client._transport.create_node_group, + default_timeout=None, + client_info=DEFAULT_CLIENT_INFO, + ) + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), + ) + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation_async.from_gapic( + response, + self._client._transport.operations_client, + clusters.NodeGroup, + metadata_type=operations.NodeGroupOperationMetadata, + ) + + # Done; return the response. + return response + + async def resize_node_group( + self, + request: Optional[Union[node_groups.ResizeNodeGroupRequest, dict]] = None, + *, + name: Optional[str] = None, + size: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation_async.AsyncOperation: + r"""Resizes a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + async def sample_resize_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + request = dataproc_v1.ResizeNodeGroupRequest( + name="name_value", + size=443, + ) + + # Make the request + operation = client.resize_node_group(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.dataproc_v1.types.ResizeNodeGroupRequest, dict]]): + The request object. A request to resize a node group. + name (:class:`str`): + Required. The name of the node group to resize. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + size (:class:`int`): + Required. The number of running + instances for the node group to + maintain. The group adds or removes + instances to maintain the number of + instances specified by this parameter. + + This corresponds to the ``size`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation_async.AsyncOperation: + An object representing a long-running operation. + + The result type for the operation will be :class:`google.cloud.dataproc_v1.types.NodeGroup` Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([name, size]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + request = node_groups.ResizeNodeGroupRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + if size is not None: + request.size = size + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = gapic_v1.method_async.wrap_method( + self._client._transport.resize_node_group, + default_timeout=None, + client_info=DEFAULT_CLIENT_INFO, + ) + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), + ) + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation_async.from_gapic( + response, + self._client._transport.operations_client, + clusters.NodeGroup, + metadata_type=operations.NodeGroupOperationMetadata, + ) + + # Done; return the response. + return response + + async def get_node_group( + self, + request: Optional[Union[node_groups.GetNodeGroupRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> clusters.NodeGroup: + r"""Gets the resource representation for a node group in + a cluster. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + async def sample_get_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + request = dataproc_v1.GetNodeGroupRequest( + name="name_value", + ) + + # Make the request + response = await client.get_node_group(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.dataproc_v1.types.GetNodeGroupRequest, dict]]): + The request object. A request to get a node group . + name (:class:`str`): + Required. The name of the node group to retrieve. + Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.dataproc_v1.types.NodeGroup: + Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([name]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + request = node_groups.GetNodeGroupRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = gapic_v1.method_async.wrap_method( + self._client._transport.get_node_group, + default_timeout=None, + client_info=DEFAULT_CLIENT_INFO, + ) + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), + ) + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + + +__all__ = ("NodeGroupControllerAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/client.py b/google/cloud/dataproc_v1/services/node_group_controller/client.py new file mode 100644 index 00000000..cd79d212 --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/client.py @@ -0,0 +1,857 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +from collections import OrderedDict +import os +import re +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.cloud.dataproc_v1.types import operations +from .transports.base import NodeGroupControllerTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import NodeGroupControllerGrpcTransport +from .transports.grpc_asyncio import NodeGroupControllerGrpcAsyncIOTransport + + +class NodeGroupControllerClientMeta(type): + """Metaclass for the NodeGroupController client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + + _transport_registry = ( + OrderedDict() + ) # type: Dict[str, Type[NodeGroupControllerTransport]] + _transport_registry["grpc"] = NodeGroupControllerGrpcTransport + _transport_registry["grpc_asyncio"] = NodeGroupControllerGrpcAsyncIOTransport + + def get_transport_class( + cls, + label: Optional[str] = None, + ) -> Type[NodeGroupControllerTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class NodeGroupControllerClient(metaclass=NodeGroupControllerClientMeta): + """The ``NodeGroupControllerService`` provides methods to manage node + groups of Compute Engine managed instances. + """ + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + DEFAULT_ENDPOINT = "dataproc.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + NodeGroupControllerClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + NodeGroupControllerClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file(filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> NodeGroupControllerTransport: + """Returns the transport used by the client instance. + + Returns: + NodeGroupControllerTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def node_group_path( + project: str, + region: str, + cluster: str, + node_group: str, + ) -> str: + """Returns a fully-qualified node_group string.""" + return "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + + @staticmethod + def parse_node_group_path(path: str) -> Dict[str, str]: + """Parses a node_group path into its component segments.""" + m = re.match( + r"^projects/(?P.+?)/regions/(?P.+?)/clusters/(?P.+?)/nodeGroups/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path( + billing_account: str, + ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format( + billing_account=billing_account, + ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str, str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path( + folder: str, + ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format( + folder=folder, + ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str, str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path( + organization: str, + ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format( + organization=organization, + ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str, str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path( + project: str, + ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format( + project=project, + ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str, str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path( + project: str, + location: str, + ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format( + project=project, + location=location, + ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str, str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source( + cls, client_options: Optional[client_options_lib.ClientOptions] = None + ): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variabel is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError( + "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + ) + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError( + "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + ) + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or ( + use_mtls_endpoint == "auto" and client_cert_source + ): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + def __init__( + self, + *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, NodeGroupControllerTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the node group controller client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Union[str, NodeGroupControllerTransport]): The + transport to use. If set to None, a transport is chosen + automatically. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the + client. It won't take effect if a ``transport`` instance is provided. + (1) The ``api_endpoint`` property can be used to override the + default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT + environment variable can also be used to override the endpoint: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto switch to the + default mTLS endpoint if client certificate is present, this is + the default value). However, the ``api_endpoint`` property takes + precedence if provided. + (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide client certificate for mutual TLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + if isinstance(client_options, dict): + client_options = client_options_lib.from_dict(client_options) + if client_options is None: + client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) + + api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( + client_options + ) + + api_key_value = getattr(client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError( + "client_options.api_key and credentials are mutually exclusive" + ) + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + if isinstance(transport, NodeGroupControllerTransport): + # transport is a NodeGroupControllerTransport instance. + if credentials or client_options.credentials_file or api_key_value: + raise ValueError( + "When providing a transport instance, " + "provide its credentials directly." + ) + if client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = transport + else: + import google.auth._default # type: ignore + + if api_key_value and hasattr( + google.auth._default, "get_api_key_credentials" + ): + credentials = google.auth._default.get_api_key_credentials( + api_key_value + ) + + Transport = type(self).get_transport_class(transport) + self._transport = Transport( + credentials=credentials, + credentials_file=client_options.credentials_file, + host=api_endpoint, + scopes=client_options.scopes, + client_cert_source_for_mtls=client_cert_source_func, + quota_project_id=client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=client_options.api_audience, + ) + + def create_node_group( + self, + request: Optional[Union[node_groups.CreateNodeGroupRequest, dict]] = None, + *, + parent: Optional[str] = None, + node_group: Optional[clusters.NodeGroup] = None, + node_group_id: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation.Operation: + r"""Creates a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + def sample_create_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + node_group = dataproc_v1.NodeGroup() + node_group.roles = ['DRIVER'] + + request = dataproc_v1.CreateNodeGroupRequest( + parent="parent_value", + node_group=node_group, + ) + + # Make the request + operation = client.create_node_group(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.dataproc_v1.types.CreateNodeGroupRequest, dict]): + The request object. A request to create a node group. + parent (str): + Required. The parent resource where this node group will + be created. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}`` + + This corresponds to the ``parent`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + node_group (google.cloud.dataproc_v1.types.NodeGroup): + Required. The node group to create. + This corresponds to the ``node_group`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + node_group_id (str): + Optional. An optional node group ID. Generated if not + specified. + + The ID must contain only letters (a-z, A-Z), numbers + (0-9), underscores (_), and hyphens (-). Cannot begin or + end with underscore or hyphen. Must consist of from 3 to + 33 characters. + + This corresponds to the ``node_group_id`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation.Operation: + An object representing a long-running operation. + + The result type for the operation will be :class:`google.cloud.dataproc_v1.types.NodeGroup` Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([parent, node_group, node_group_id]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # Minor optimization to avoid making a copy if the user passes + # in a node_groups.CreateNodeGroupRequest. + # There's no risk of modifying the input as we've already verified + # there are no flattened fields. + if not isinstance(request, node_groups.CreateNodeGroupRequest): + request = node_groups.CreateNodeGroupRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if parent is not None: + request.parent = parent + if node_group is not None: + request.node_group = node_group + if node_group_id is not None: + request.node_group_id = node_group_id + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.create_node_group] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)), + ) + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation.from_gapic( + response, + self._transport.operations_client, + clusters.NodeGroup, + metadata_type=operations.NodeGroupOperationMetadata, + ) + + # Done; return the response. + return response + + def resize_node_group( + self, + request: Optional[Union[node_groups.ResizeNodeGroupRequest, dict]] = None, + *, + name: Optional[str] = None, + size: Optional[int] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation.Operation: + r"""Resizes a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + def sample_resize_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + request = dataproc_v1.ResizeNodeGroupRequest( + name="name_value", + size=443, + ) + + # Make the request + operation = client.resize_node_group(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.dataproc_v1.types.ResizeNodeGroupRequest, dict]): + The request object. A request to resize a node group. + name (str): + Required. The name of the node group to resize. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + size (int): + Required. The number of running + instances for the node group to + maintain. The group adds or removes + instances to maintain the number of + instances specified by this parameter. + + This corresponds to the ``size`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation.Operation: + An object representing a long-running operation. + + The result type for the operation will be :class:`google.cloud.dataproc_v1.types.NodeGroup` Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([name, size]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # Minor optimization to avoid making a copy if the user passes + # in a node_groups.ResizeNodeGroupRequest. + # There's no risk of modifying the input as we've already verified + # there are no flattened fields. + if not isinstance(request, node_groups.ResizeNodeGroupRequest): + request = node_groups.ResizeNodeGroupRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + if size is not None: + request.size = size + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.resize_node_group] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), + ) + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation.from_gapic( + response, + self._transport.operations_client, + clusters.NodeGroup, + metadata_type=operations.NodeGroupOperationMetadata, + ) + + # Done; return the response. + return response + + def get_node_group( + self, + request: Optional[Union[node_groups.GetNodeGroupRequest, dict]] = None, + *, + name: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> clusters.NodeGroup: + r"""Gets the resource representation for a node group in + a cluster. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import dataproc_v1 + + def sample_get_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + request = dataproc_v1.GetNodeGroupRequest( + name="name_value", + ) + + # Make the request + response = client.get_node_group(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.dataproc_v1.types.GetNodeGroupRequest, dict]): + The request object. A request to get a node group . + name (str): + Required. The name of the node group to retrieve. + Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + + This corresponds to the ``name`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.dataproc_v1.types.NodeGroup: + Dataproc Node Group. + **The Dataproc NodeGroup resource is not related to + the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + """ + # Create or coerce a protobuf request object. + # Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([name]) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # Minor optimization to avoid making a copy if the user passes + # in a node_groups.GetNodeGroupRequest. + # There's no risk of modifying the input as we've already verified + # there are no flattened fields. + if not isinstance(request, node_groups.GetNodeGroupRequest): + request = node_groups.GetNodeGroupRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if name is not None: + request.name = name + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_node_group] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("name", request.name),)), + ) + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + + +__all__ = ("NodeGroupControllerClient",) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/transports/__init__.py b/google/cloud/dataproc_v1/services/node_group_controller/transports/__init__.py new file mode 100644 index 00000000..0803a9a0 --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/transports/__init__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import NodeGroupControllerTransport +from .grpc import NodeGroupControllerGrpcTransport +from .grpc_asyncio import NodeGroupControllerGrpcAsyncIOTransport + + +# Compile a registry of transports. +_transport_registry = ( + OrderedDict() +) # type: Dict[str, Type[NodeGroupControllerTransport]] +_transport_registry["grpc"] = NodeGroupControllerGrpcTransport +_transport_registry["grpc_asyncio"] = NodeGroupControllerGrpcAsyncIOTransport + +__all__ = ( + "NodeGroupControllerTransport", + "NodeGroupControllerGrpcTransport", + "NodeGroupControllerGrpcAsyncIOTransport", +) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/transports/base.py b/google/cloud/dataproc_v1/services/node_group_controller/transports/base.py new file mode 100644 index 00000000..ae2cf6df --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/transports/base.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +import abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.dataproc_v1 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.longrunning import operations_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) + + +class NodeGroupControllerTransport(abc.ABC): + """Abstract transport class for NodeGroupController.""" + + AUTH_SCOPES = ("https://www.googleapis.com/auth/cloud-platform",) + + DEFAULT_HOST: str = "dataproc.googleapis.com" + + def __init__( + self, + *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to. + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs( + "'credentials_file' and 'credentials' are mutually exclusive" + ) + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, **scopes_kwargs, quota_project_id=quota_project_id + ) + elif credentials is None: + credentials, _ = google.auth.default( + **scopes_kwargs, quota_project_id=quota_project_id + ) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience( + api_audience if api_audience else host + ) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if ( + always_use_jwt_access + and isinstance(credentials, service_account.Credentials) + and hasattr(service_account.Credentials, "with_always_use_jwt_access") + ): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ":" not in host: + host += ":443" + self._host = host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.create_node_group: gapic_v1.method.wrap_method( + self.create_node_group, + default_timeout=None, + client_info=client_info, + ), + self.resize_node_group: gapic_v1.method.wrap_method( + self.resize_node_group, + default_timeout=None, + client_info=client_info, + ), + self.get_node_group: gapic_v1.method.wrap_method( + self.get_node_group, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def operations_client(self): + """Return the client designed to process long-running operations.""" + raise NotImplementedError() + + @property + def create_node_group( + self, + ) -> Callable[ + [node_groups.CreateNodeGroupRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def resize_node_group( + self, + ) -> Callable[ + [node_groups.ResizeNodeGroupRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def get_node_group( + self, + ) -> Callable[ + [node_groups.GetNodeGroupRequest], + Union[clusters.NodeGroup, Awaitable[clusters.NodeGroup]], + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ("NodeGroupControllerTransport",) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc.py b/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc.py new file mode 100644 index 00000000..3db942c3 --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +import warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import operations_v1 +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore + +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.longrunning import operations_pb2 # type: ignore +from .base import NodeGroupControllerTransport, DEFAULT_CLIENT_INFO + + +class NodeGroupControllerGrpcTransport(NodeGroupControllerTransport): + """gRPC backend transport for NodeGroupController. + + The ``NodeGroupControllerService`` provides methods to manage node + groups of Compute Engine managed instances. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _stubs: Dict[str, Callable] + + def __init__( + self, + *, + host: str = "dataproc.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to. + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if ``channel`` is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + channel (Optional[grpc.Channel]): A ``Channel`` instance through + which to make calls. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if ``channel`` is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if ``channel`` or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if channel: + # Ignore credentials if a channel was passed. + credentials = False + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + self._grpc_channel = type(self).create_channel( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel( + cls, + host: str = "dataproc.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs, + ) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs, + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service.""" + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsClient(self.grpc_channel) + + # Return the client from cache. + return self._operations_client + + @property + def create_node_group( + self, + ) -> Callable[[node_groups.CreateNodeGroupRequest], operations_pb2.Operation]: + r"""Return a callable for the create node group method over gRPC. + + Creates a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + Returns: + Callable[[~.CreateNodeGroupRequest], + ~.Operation]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "create_node_group" not in self._stubs: + self._stubs["create_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/CreateNodeGroup", + request_serializer=node_groups.CreateNodeGroupRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["create_node_group"] + + @property + def resize_node_group( + self, + ) -> Callable[[node_groups.ResizeNodeGroupRequest], operations_pb2.Operation]: + r"""Return a callable for the resize node group method over gRPC. + + Resizes a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + Returns: + Callable[[~.ResizeNodeGroupRequest], + ~.Operation]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "resize_node_group" not in self._stubs: + self._stubs["resize_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/ResizeNodeGroup", + request_serializer=node_groups.ResizeNodeGroupRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["resize_node_group"] + + @property + def get_node_group( + self, + ) -> Callable[[node_groups.GetNodeGroupRequest], clusters.NodeGroup]: + r"""Return a callable for the get node group method over gRPC. + + Gets the resource representation for a node group in + a cluster. + + Returns: + Callable[[~.GetNodeGroupRequest], + ~.NodeGroup]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_node_group" not in self._stubs: + self._stubs["get_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/GetNodeGroup", + request_serializer=node_groups.GetNodeGroupRequest.serialize, + response_deserializer=clusters.NodeGroup.deserialize, + ) + return self._stubs["get_node_group"] + + def close(self): + self.grpc_channel.close() + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ("NodeGroupControllerGrpcTransport",) diff --git a/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc_asyncio.py new file mode 100644 index 00000000..da94f442 --- /dev/null +++ b/google/cloud/dataproc_v1/services/node_group_controller/transports/grpc_asyncio.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.longrunning import operations_pb2 # type: ignore +from .base import NodeGroupControllerTransport, DEFAULT_CLIENT_INFO +from .grpc import NodeGroupControllerGrpcTransport + + +class NodeGroupControllerGrpcAsyncIOTransport(NodeGroupControllerTransport): + """gRPC AsyncIO backend transport for NodeGroupController. + + The ``NodeGroupControllerService`` provides methods to manage node + groups of Compute Engine managed instances. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel( + cls, + host: str = "dataproc.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs, + ) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs, + ) + + def __init__( + self, + *, + host: str = "dataproc.googleapis.com", + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to. + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if ``channel`` is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[aio.Channel]): A ``Channel`` instance through + which to make calls. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if ``channel`` is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if ``channel`` or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if channel: + # Ignore credentials if a channel was passed. + credentials = False + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + self._grpc_channel = type(self).create_channel( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsAsyncClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsAsyncClient( + self.grpc_channel + ) + + # Return the client from cache. + return self._operations_client + + @property + def create_node_group( + self, + ) -> Callable[ + [node_groups.CreateNodeGroupRequest], Awaitable[operations_pb2.Operation] + ]: + r"""Return a callable for the create node group method over gRPC. + + Creates a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + Returns: + Callable[[~.CreateNodeGroupRequest], + Awaitable[~.Operation]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "create_node_group" not in self._stubs: + self._stubs["create_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/CreateNodeGroup", + request_serializer=node_groups.CreateNodeGroupRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["create_node_group"] + + @property + def resize_node_group( + self, + ) -> Callable[ + [node_groups.ResizeNodeGroupRequest], Awaitable[operations_pb2.Operation] + ]: + r"""Return a callable for the resize node group method over gRPC. + + Resizes a node group in a cluster. The returned + [Operation.metadata][google.longrunning.Operation.metadata] is + `NodeGroupOperationMetadata `__. + + Returns: + Callable[[~.ResizeNodeGroupRequest], + Awaitable[~.Operation]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "resize_node_group" not in self._stubs: + self._stubs["resize_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/ResizeNodeGroup", + request_serializer=node_groups.ResizeNodeGroupRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["resize_node_group"] + + @property + def get_node_group( + self, + ) -> Callable[[node_groups.GetNodeGroupRequest], Awaitable[clusters.NodeGroup]]: + r"""Return a callable for the get node group method over gRPC. + + Gets the resource representation for a node group in + a cluster. + + Returns: + Callable[[~.GetNodeGroupRequest], + Awaitable[~.NodeGroup]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_node_group" not in self._stubs: + self._stubs["get_node_group"] = self.grpc_channel.unary_unary( + "/google.cloud.dataproc.v1.NodeGroupController/GetNodeGroup", + request_serializer=node_groups.GetNodeGroupRequest.serialize, + response_deserializer=clusters.NodeGroup.deserialize, + ) + return self._stubs["get_node_group"] + + def close(self): + return self.grpc_channel.close() + + +__all__ = ("NodeGroupControllerGrpcAsyncIOTransport",) diff --git a/google/cloud/dataproc_v1/services/workflow_template_service/async_client.py b/google/cloud/dataproc_v1/services/workflow_template_service/async_client.py index 4b264eba..bc45b2e1 100644 --- a/google/cloud/dataproc_v1/services/workflow_template_service/async_client.py +++ b/google/cloud/dataproc_v1/services/workflow_template_service/async_client.py @@ -16,8 +16,19 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions @@ -53,6 +64,10 @@ class WorkflowTemplateServiceAsyncClient: DEFAULT_ENDPOINT = WorkflowTemplateServiceClient.DEFAULT_ENDPOINT DEFAULT_MTLS_ENDPOINT = WorkflowTemplateServiceClient.DEFAULT_MTLS_ENDPOINT + node_group_path = staticmethod(WorkflowTemplateServiceClient.node_group_path) + parse_node_group_path = staticmethod( + WorkflowTemplateServiceClient.parse_node_group_path + ) service_path = staticmethod(WorkflowTemplateServiceClient.service_path) parse_service_path = staticmethod(WorkflowTemplateServiceClient.parse_service_path) workflow_template_path = staticmethod( @@ -176,9 +191,9 @@ def transport(self) -> WorkflowTemplateServiceTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, WorkflowTemplateServiceTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the workflow template service client. @@ -222,12 +237,14 @@ def __init__( async def create_workflow_template( self, - request: Union[workflow_templates.CreateWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.CreateWorkflowTemplateRequest, dict] + ] = None, *, - parent: str = None, - template: workflow_templates.WorkflowTemplate = None, + parent: Optional[str] = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Creates new workflow template. @@ -266,7 +283,7 @@ async def sample_create_workflow_template(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.CreateWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.CreateWorkflowTemplateRequest, dict]]): The request object. A request to create a workflow template. parent (:class:`str`): @@ -360,11 +377,13 @@ async def sample_create_workflow_template(): async def get_workflow_template( self, - request: Union[workflow_templates.GetWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.GetWorkflowTemplateRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Retrieves the latest workflow template. @@ -398,7 +417,7 @@ async def sample_get_workflow_template(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.GetWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.GetWorkflowTemplateRequest, dict]]): The request object. A request to fetch a workflow template. name (:class:`str`): @@ -486,14 +505,14 @@ async def sample_get_workflow_template(): async def instantiate_workflow_template( self, - request: Union[ - workflow_templates.InstantiateWorkflowTemplateRequest, dict + request: Optional[ + Union[workflow_templates.InstantiateWorkflowTemplateRequest, dict] ] = None, *, - name: str = None, - parameters: Mapping[str, str] = None, + name: Optional[str] = None, + parameters: Optional[MutableMapping[str, str]] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Instantiates a template and begins execution. @@ -543,13 +562,13 @@ async def sample_instantiate_workflow_template(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.InstantiateWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.InstantiateWorkflowTemplateRequest, dict]]): The request object. A request to instantiate a workflow template. name (:class:`str`): @@ -572,7 +591,7 @@ async def sample_instantiate_workflow_template(): This corresponds to the ``name`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - parameters (:class:`Mapping[str, str]`): + parameters (:class:`MutableMapping[str, str]`): Optional. Map from parameter names to values that should be used for those parameters. Values may not exceed 1000 @@ -667,14 +686,14 @@ async def sample_instantiate_workflow_template(): async def instantiate_inline_workflow_template( self, - request: Union[ - workflow_templates.InstantiateInlineWorkflowTemplateRequest, dict + request: Optional[ + Union[workflow_templates.InstantiateInlineWorkflowTemplateRequest, dict] ] = None, *, - parent: str = None, - template: workflow_templates.WorkflowTemplate = None, + parent: Optional[str] = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation_async.AsyncOperation: r"""Instantiates a template and begins execution. @@ -736,13 +755,13 @@ async def sample_instantiate_inline_workflow_template(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) Args: - request (Union[google.cloud.dataproc_v1.types.InstantiateInlineWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.InstantiateInlineWorkflowTemplateRequest, dict]]): The request object. A request to instantiate an inline workflow template. parent (:class:`str`): @@ -856,11 +875,13 @@ async def sample_instantiate_inline_workflow_template(): async def update_workflow_template( self, - request: Union[workflow_templates.UpdateWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.UpdateWorkflowTemplateRequest, dict] + ] = None, *, - template: workflow_templates.WorkflowTemplate = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Updates (replaces) workflow template. The updated @@ -900,7 +921,7 @@ async def sample_update_workflow_template(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.UpdateWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.UpdateWorkflowTemplateRequest, dict]]): The request object. A request to update a workflow template. template (:class:`google.cloud.dataproc_v1.types.WorkflowTemplate`): @@ -979,11 +1000,13 @@ async def sample_update_workflow_template(): async def list_workflow_templates( self, - request: Union[workflow_templates.ListWorkflowTemplatesRequest, dict] = None, + request: Optional[ + Union[workflow_templates.ListWorkflowTemplatesRequest, dict] + ] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListWorkflowTemplatesAsyncPager: r"""Lists workflows that match the specified filter in @@ -1017,7 +1040,7 @@ async def sample_list_workflow_templates(): print(response) Args: - request (Union[google.cloud.dataproc_v1.types.ListWorkflowTemplatesRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.ListWorkflowTemplatesRequest, dict]]): The request object. A request to list workflow templates in a project. parent (:class:`str`): @@ -1116,11 +1139,13 @@ async def sample_list_workflow_templates(): async def delete_workflow_template( self, - request: Union[workflow_templates.DeleteWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.DeleteWorkflowTemplateRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a workflow template. It does not cancel @@ -1150,7 +1175,7 @@ async def sample_delete_workflow_template(): await client.delete_workflow_template(request=request) Args: - request (Union[google.cloud.dataproc_v1.types.DeleteWorkflowTemplateRequest, dict]): + request (Optional[Union[google.cloud.dataproc_v1.types.DeleteWorkflowTemplateRequest, dict]]): The request object. A request to delete a workflow template. Currently started workflows will remain running. @@ -1234,14 +1259,9 @@ async def __aexit__(self, exc_type, exc, tb): await self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("WorkflowTemplateServiceAsyncClient",) diff --git a/google/cloud/dataproc_v1/services/workflow_template_service/client.py b/google/cloud/dataproc_v1/services/workflow_template_service/client.py index 6add50bb..5d34ed42 100644 --- a/google/cloud/dataproc_v1/services/workflow_template_service/client.py +++ b/google/cloud/dataproc_v1/services/workflow_template_service/client.py @@ -16,8 +16,20 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from google.cloud.dataproc_v1 import gapic_version as package_version from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions @@ -62,7 +74,7 @@ class WorkflowTemplateServiceClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[WorkflowTemplateServiceTransport]: """Returns an appropriate transport class. @@ -169,6 +181,30 @@ def transport(self) -> WorkflowTemplateServiceTransport: """ return self._transport + @staticmethod + def node_group_path( + project: str, + region: str, + cluster: str, + node_group: str, + ) -> str: + """Returns a fully-qualified node_group string.""" + return "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + + @staticmethod + def parse_node_group_path(path: str) -> Dict[str, str]: + """Parses a node_group path into its component segments.""" + m = re.match( + r"^projects/(?P.+?)/regions/(?P.+?)/clusters/(?P.+?)/nodeGroups/(?P.+?)$", + path, + ) + return m.groupdict() if m else {} + @staticmethod def service_path( project: str, @@ -361,8 +397,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, WorkflowTemplateServiceTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, WorkflowTemplateServiceTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the workflow template service client. @@ -376,7 +412,7 @@ def __init__( transport (Union[str, WorkflowTemplateServiceTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -406,6 +442,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -458,12 +495,14 @@ def __init__( def create_workflow_template( self, - request: Union[workflow_templates.CreateWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.CreateWorkflowTemplateRequest, dict] + ] = None, *, - parent: str = None, - template: workflow_templates.WorkflowTemplate = None, + parent: Optional[str] = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Creates new workflow template. @@ -587,11 +626,13 @@ def sample_create_workflow_template(): def get_workflow_template( self, - request: Union[workflow_templates.GetWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.GetWorkflowTemplateRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Retrieves the latest workflow template. @@ -702,14 +743,14 @@ def sample_get_workflow_template(): def instantiate_workflow_template( self, - request: Union[ - workflow_templates.InstantiateWorkflowTemplateRequest, dict + request: Optional[ + Union[workflow_templates.InstantiateWorkflowTemplateRequest, dict] ] = None, *, - name: str = None, - parameters: Mapping[str, str] = None, + name: Optional[str] = None, + parameters: Optional[MutableMapping[str, str]] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Instantiates a template and begins execution. @@ -788,7 +829,7 @@ def sample_instantiate_workflow_template(): This corresponds to the ``name`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - parameters (Mapping[str, str]): + parameters (MutableMapping[str, str]): Optional. Map from parameter names to values that should be used for those parameters. Values may not exceed 1000 @@ -877,14 +918,14 @@ def sample_instantiate_workflow_template(): def instantiate_inline_workflow_template( self, - request: Union[ - workflow_templates.InstantiateInlineWorkflowTemplateRequest, dict + request: Optional[ + Union[workflow_templates.InstantiateInlineWorkflowTemplateRequest, dict] ] = None, *, - parent: str = None, - template: workflow_templates.WorkflowTemplate = None, + parent: Optional[str] = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> operation.Operation: r"""Instantiates a template and begins execution. @@ -1063,11 +1104,13 @@ def sample_instantiate_inline_workflow_template(): def update_workflow_template( self, - request: Union[workflow_templates.UpdateWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.UpdateWorkflowTemplateRequest, dict] + ] = None, *, - template: workflow_templates.WorkflowTemplate = None, + template: Optional[workflow_templates.WorkflowTemplate] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> workflow_templates.WorkflowTemplate: r"""Updates (replaces) workflow template. The updated @@ -1177,11 +1220,13 @@ def sample_update_workflow_template(): def list_workflow_templates( self, - request: Union[workflow_templates.ListWorkflowTemplatesRequest, dict] = None, + request: Optional[ + Union[workflow_templates.ListWorkflowTemplatesRequest, dict] + ] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListWorkflowTemplatesPager: r"""Lists workflows that match the specified filter in @@ -1303,11 +1348,13 @@ def sample_list_workflow_templates(): def delete_workflow_template( self, - request: Union[workflow_templates.DeleteWorkflowTemplateRequest, dict] = None, + request: Optional[ + Union[workflow_templates.DeleteWorkflowTemplateRequest, dict] + ] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a workflow template. It does not cancel @@ -1419,14 +1466,9 @@ def __exit__(self, type, value, traceback): self.transport.close() -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) __all__ = ("WorkflowTemplateServiceClient",) diff --git a/google/cloud/dataproc_v1/services/workflow_template_service/transports/base.py b/google/cloud/dataproc_v1/services/workflow_template_service/transports/base.py index 779f15b6..f59a1ada 100644 --- a/google/cloud/dataproc_v1/services/workflow_template_service/transports/base.py +++ b/google/cloud/dataproc_v1/services/workflow_template_service/transports/base.py @@ -15,7 +15,8 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources + +from google.cloud.dataproc_v1 import gapic_version as package_version import google.auth # type: ignore import google.api_core @@ -30,14 +31,9 @@ from google.longrunning import operations_pb2 # type: ignore from google.protobuf import empty_pb2 # type: ignore -try: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=pkg_resources.get_distribution( - "google-cloud-dataproc", - ).version, - ) -except pkg_resources.DistributionNotFound: - DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=package_version.__version__ +) class WorkflowTemplateServiceTransport(abc.ABC): @@ -51,7 +47,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc.py b/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc.py index 758128b8..eba1616f 100644 --- a/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc.py +++ b/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc.py @@ -51,14 +51,14 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -186,8 +186,8 @@ def __init__( def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc_asyncio.py b/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc_asyncio.py index 686b55a8..8ec0fd4d 100644 --- a/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc_asyncio.py +++ b/google/cloud/dataproc_v1/services/workflow_template_service/transports/grpc_asyncio.py @@ -53,7 +53,7 @@ class WorkflowTemplateServiceGrpcAsyncIOTransport(WorkflowTemplateServiceTranspo def create_channel( cls, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -96,15 +96,15 @@ def __init__( self, *, host: str = "dataproc.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/dataproc_v1/types/__init__.py b/google/cloud/dataproc_v1/types/__init__.py index 2b3c58ff..48be150d 100644 --- a/google/cloud/dataproc_v1/types/__init__.py +++ b/google/cloud/dataproc_v1/types/__init__.py @@ -40,6 +40,7 @@ from .clusters import ( AcceleratorConfig, AutoscalingConfig, + AuxiliaryNodeGroup, AuxiliaryServicesConfig, Cluster, ClusterConfig, @@ -64,6 +65,7 @@ ListClustersResponse, ManagedGroupConfig, MetastoreConfig, + NodeGroup, NodeGroupAffinity, NodeInitializationAction, ReservationAffinity, @@ -78,6 +80,7 @@ from .jobs import ( CancelJobRequest, DeleteJobRequest, + DriverSchedulingConfig, GetJobRequest, HadoopJob, HiveJob, @@ -101,10 +104,16 @@ UpdateJobRequest, YarnApplication, ) +from .node_groups import ( + CreateNodeGroupRequest, + GetNodeGroupRequest, + ResizeNodeGroupRequest, +) from .operations import ( BatchOperationMetadata, ClusterOperationMetadata, ClusterOperationStatus, + NodeGroupOperationMetadata, ) from .shared import ( EnvironmentConfig, @@ -168,6 +177,7 @@ "SparkSqlBatch", "AcceleratorConfig", "AutoscalingConfig", + "AuxiliaryNodeGroup", "AuxiliaryServicesConfig", "Cluster", "ClusterConfig", @@ -192,6 +202,7 @@ "ListClustersResponse", "ManagedGroupConfig", "MetastoreConfig", + "NodeGroup", "NodeGroupAffinity", "NodeInitializationAction", "ReservationAffinity", @@ -204,6 +215,7 @@ "VirtualClusterConfig", "CancelJobRequest", "DeleteJobRequest", + "DriverSchedulingConfig", "GetJobRequest", "HadoopJob", "HiveJob", @@ -226,9 +238,13 @@ "SubmitJobRequest", "UpdateJobRequest", "YarnApplication", + "CreateNodeGroupRequest", + "GetNodeGroupRequest", + "ResizeNodeGroupRequest", "BatchOperationMetadata", "ClusterOperationMetadata", "ClusterOperationStatus", + "NodeGroupOperationMetadata", "EnvironmentConfig", "ExecutionConfig", "GkeClusterConfig", diff --git a/google/cloud/dataproc_v1/types/autoscaling_policies.py b/google/cloud/dataproc_v1/types/autoscaling_policies.py index 56e4c942..7eae0b8f 100644 --- a/google/cloud/dataproc_v1/types/autoscaling_policies.py +++ b/google/cloud/dataproc_v1/types/autoscaling_policies.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.protobuf import duration_pb2 # type: ignore @@ -71,7 +73,7 @@ class AutoscalingPolicy(proto.Message): secondary_worker_config (google.cloud.dataproc_v1.types.InstanceGroupAutoscalingPolicyConfig): Optional. Describes how the autoscaler will operate for secondary workers. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this autoscaling policy. Label **keys** must contain 1 to 63 characters, and must conform to `RFC @@ -82,31 +84,31 @@ class AutoscalingPolicy(proto.Message): 32 labels can be associated with an autoscaling policy. """ - id = proto.Field( + id: str = proto.Field( proto.STRING, number=1, ) - name = proto.Field( + name: str = proto.Field( proto.STRING, number=2, ) - basic_algorithm = proto.Field( + basic_algorithm: "BasicAutoscalingAlgorithm" = proto.Field( proto.MESSAGE, number=3, oneof="algorithm", message="BasicAutoscalingAlgorithm", ) - worker_config = proto.Field( + worker_config: "InstanceGroupAutoscalingPolicyConfig" = proto.Field( proto.MESSAGE, number=4, message="InstanceGroupAutoscalingPolicyConfig", ) - secondary_worker_config = proto.Field( + secondary_worker_config: "InstanceGroupAutoscalingPolicyConfig" = proto.Field( proto.MESSAGE, number=5, message="InstanceGroupAutoscalingPolicyConfig", ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=6, @@ -131,13 +133,13 @@ class BasicAutoscalingAlgorithm(proto.Message): Bounds: [2m, 1d]. Default: 2m. """ - yarn_config = proto.Field( + yarn_config: "BasicYarnAutoscalingConfig" = proto.Field( proto.MESSAGE, number=1, oneof="config", message="BasicYarnAutoscalingConfig", ) - cooldown_period = proto.Field( + cooldown_period: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=2, message=duration_pb2.Duration, @@ -200,24 +202,24 @@ class BasicYarnAutoscalingConfig(proto.Message): Bounds: [0.0, 1.0]. Default: 0.0. """ - graceful_decommission_timeout = proto.Field( + graceful_decommission_timeout: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=5, message=duration_pb2.Duration, ) - scale_up_factor = proto.Field( + scale_up_factor: float = proto.Field( proto.DOUBLE, number=1, ) - scale_down_factor = proto.Field( + scale_down_factor: float = proto.Field( proto.DOUBLE, number=2, ) - scale_up_min_worker_fraction = proto.Field( + scale_up_min_worker_fraction: float = proto.Field( proto.DOUBLE, number=3, ) - scale_down_min_worker_fraction = proto.Field( + scale_down_min_worker_fraction: float = proto.Field( proto.DOUBLE, number=4, ) @@ -265,15 +267,15 @@ class InstanceGroupAutoscalingPolicyConfig(proto.Message): only and no secondary workers. """ - min_instances = proto.Field( + min_instances: int = proto.Field( proto.INT32, number=1, ) - max_instances = proto.Field( + max_instances: int = proto.Field( proto.INT32, number=2, ) - weight = proto.Field( + weight: int = proto.Field( proto.INT32, number=3, ) @@ -299,11 +301,11 @@ class CreateAutoscalingPolicyRequest(proto.Message): Required. The autoscaling policy to create. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - policy = proto.Field( + policy: "AutoscalingPolicy" = proto.Field( proto.MESSAGE, number=2, message="AutoscalingPolicy", @@ -328,7 +330,7 @@ class GetAutoscalingPolicyRequest(proto.Message): ``projects/{project_id}/locations/{location}/autoscalingPolicies/{policy_id}`` """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -342,7 +344,7 @@ class UpdateAutoscalingPolicyRequest(proto.Message): Required. The updated autoscaling policy. """ - policy = proto.Field( + policy: "AutoscalingPolicy" = proto.Field( proto.MESSAGE, number=1, message="AutoscalingPolicy", @@ -369,7 +371,7 @@ class DeleteAutoscalingPolicyRequest(proto.Message): ``projects/{project_id}/locations/{location}/autoscalingPolicies/{policy_id}`` """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -401,15 +403,15 @@ class ListAutoscalingPoliciesRequest(proto.Message): results. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) @@ -420,7 +422,7 @@ class ListAutoscalingPoliciesResponse(proto.Message): project. Attributes: - policies (Sequence[google.cloud.dataproc_v1.types.AutoscalingPolicy]): + policies (MutableSequence[google.cloud.dataproc_v1.types.AutoscalingPolicy]): Output only. Autoscaling policies list. next_page_token (str): Output only. This token is included in the @@ -431,12 +433,12 @@ class ListAutoscalingPoliciesResponse(proto.Message): def raw_page(self): return self - policies = proto.RepeatedField( + policies: MutableSequence["AutoscalingPolicy"] = proto.RepeatedField( proto.MESSAGE, number=1, message="AutoscalingPolicy", ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) diff --git a/google/cloud/dataproc_v1/types/batches.py b/google/cloud/dataproc_v1/types/batches.py index e014bff1..1aa48877 100644 --- a/google/cloud/dataproc_v1/types/batches.py +++ b/google/cloud/dataproc_v1/types/batches.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.cloud.dataproc_v1.types import shared @@ -67,20 +69,20 @@ class CreateBatchRequest(proto.Message): is 40 characters. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - batch = proto.Field( + batch: "Batch" = proto.Field( proto.MESSAGE, number=2, message="Batch", ) - batch_id = proto.Field( + batch_id: str = proto.Field( proto.STRING, number=3, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=4, ) @@ -95,7 +97,7 @@ class GetBatchRequest(proto.Message): Required. The name of the batch to retrieve. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -119,15 +121,15 @@ class ListBatchesRequest(proto.Message): subsequent page. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) @@ -137,7 +139,7 @@ class ListBatchesResponse(proto.Message): r"""A list of batch workloads. Attributes: - batches (Sequence[google.cloud.dataproc_v1.types.Batch]): + batches (MutableSequence[google.cloud.dataproc_v1.types.Batch]): The batches from the specified collection. next_page_token (str): A token, which can be sent as ``page_token`` to retrieve the @@ -149,12 +151,12 @@ class ListBatchesResponse(proto.Message): def raw_page(self): return self - batches = proto.RepeatedField( + batches: MutableSequence["Batch"] = proto.RepeatedField( proto.MESSAGE, number=1, message="Batch", ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) @@ -169,7 +171,7 @@ class DeleteBatchRequest(proto.Message): delete. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -225,7 +227,7 @@ class Batch(proto.Message): creator (str): Output only. The email address of the user who created the batch. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this batch. Label **keys** must contain 1 to 63 characters, and must conform to `RFC 1035 `__. @@ -242,7 +244,7 @@ class Batch(proto.Message): operation (str): Output only. The resource name of the operation associated with this batch. - state_history (Sequence[google.cloud.dataproc_v1.types.Batch.StateHistory]): + state_history (MutableSequence[google.cloud.dataproc_v1.types.Batch.StateHistory]): Output only. Historical state information for the batch. """ @@ -272,101 +274,101 @@ class StateHistory(proto.Message): the historical state. """ - state = proto.Field( + state: "Batch.State" = proto.Field( proto.ENUM, number=1, enum="Batch.State", ) - state_message = proto.Field( + state_message: str = proto.Field( proto.STRING, number=2, ) - state_start_time = proto.Field( + state_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=3, message=timestamp_pb2.Timestamp, ) - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - uuid = proto.Field( + uuid: str = proto.Field( proto.STRING, number=2, ) - create_time = proto.Field( + create_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=3, message=timestamp_pb2.Timestamp, ) - pyspark_batch = proto.Field( + pyspark_batch: "PySparkBatch" = proto.Field( proto.MESSAGE, number=4, oneof="batch_config", message="PySparkBatch", ) - spark_batch = proto.Field( + spark_batch: "SparkBatch" = proto.Field( proto.MESSAGE, number=5, oneof="batch_config", message="SparkBatch", ) - spark_r_batch = proto.Field( + spark_r_batch: "SparkRBatch" = proto.Field( proto.MESSAGE, number=6, oneof="batch_config", message="SparkRBatch", ) - spark_sql_batch = proto.Field( + spark_sql_batch: "SparkSqlBatch" = proto.Field( proto.MESSAGE, number=7, oneof="batch_config", message="SparkSqlBatch", ) - runtime_info = proto.Field( + runtime_info: shared.RuntimeInfo = proto.Field( proto.MESSAGE, number=8, message=shared.RuntimeInfo, ) - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=9, enum=State, ) - state_message = proto.Field( + state_message: str = proto.Field( proto.STRING, number=10, ) - state_time = proto.Field( + state_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=11, message=timestamp_pb2.Timestamp, ) - creator = proto.Field( + creator: str = proto.Field( proto.STRING, number=12, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=13, ) - runtime_config = proto.Field( + runtime_config: shared.RuntimeConfig = proto.Field( proto.MESSAGE, number=14, message=shared.RuntimeConfig, ) - environment_config = proto.Field( + environment_config: shared.EnvironmentConfig = proto.Field( proto.MESSAGE, number=15, message=shared.EnvironmentConfig, ) - operation = proto.Field( + operation: str = proto.Field( proto.STRING, number=16, ) - state_history = proto.RepeatedField( + state_history: MutableSequence[StateHistory] = proto.RepeatedField( proto.MESSAGE, number=17, message=StateHistory, @@ -383,48 +385,48 @@ class PySparkBatch(proto.Message): Required. The HCFS URI of the main Python file to use as the Spark driver. Must be a .py file. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments that can be set as batch properties, such as ``--conf``, since a collision can occur that causes an incorrect batch submission. - python_file_uris (Sequence[str]): + python_file_uris (MutableSequence[str]): Optional. HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: ``.py``, ``.egg``, and ``.zip``. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the classpath of the Spark driver and tasks. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: ``.jar``, ``.tar``, ``.tar.gz``, ``.tgz``, and ``.zip``. """ - main_python_file_uri = proto.Field( + main_python_file_uri: str = proto.Field( proto.STRING, number=1, ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - python_file_uris = proto.RepeatedField( + python_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) @@ -453,46 +455,46 @@ class SparkBatch(proto.Message): specified in ``jar_file_uris``. This field is a member of `oneof`_ ``driver``. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments that can be set as batch properties, such as ``--conf``, since a collision can occur that causes an incorrect batch submission. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the classpath of the Spark driver and tasks. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: ``.jar``, ``.tar``, ``.tar.gz``, ``.tgz``, and ``.zip``. """ - main_jar_file_uri = proto.Field( + main_jar_file_uri: str = proto.Field( proto.STRING, number=1, oneof="driver", ) - main_class = proto.Field( + main_class: str = proto.Field( proto.STRING, number=2, oneof="driver", ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) @@ -507,33 +509,33 @@ class SparkRBatch(proto.Message): main_r_file_uri (str): Required. The HCFS URI of the main R file to use as the driver. Must be a ``.R`` or ``.r`` file. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the Spark driver. Do not include arguments that can be set as batch properties, such as ``--conf``, since a collision can occur that causes an incorrect batch submission. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: ``.jar``, ``.tar``, ``.tar.gz``, ``.tgz``, and ``.zip``. """ - main_r_file_uri = proto.Field( + main_r_file_uri: str = proto.Field( proto.STRING, number=1, ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) @@ -547,25 +549,25 @@ class SparkSqlBatch(proto.Message): query_file_uri (str): Required. The HCFS URI of the script that contains Spark SQL queries to execute. - query_variables (Mapping[str, str]): + query_variables (MutableMapping[str, str]): Optional. Mapping of query variable names to values (equivalent to the Spark SQL command: ``SET name="value";``). - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to be added to the Spark CLASSPATH. """ - query_file_uri = proto.Field( + query_file_uri: str = proto.Field( proto.STRING, number=1, ) - query_variables = proto.MapField( + query_variables: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=2, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) diff --git a/google/cloud/dataproc_v1/types/clusters.py b/google/cloud/dataproc_v1/types/clusters.py index b1b0debf..070a255e 100644 --- a/google/cloud/dataproc_v1/types/clusters.py +++ b/google/cloud/dataproc_v1/types/clusters.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.cloud.dataproc_v1.types import shared @@ -39,6 +41,8 @@ "ManagedGroupConfig", "AcceleratorConfig", "DiskConfig", + "AuxiliaryNodeGroup", + "NodeGroup", "NodeInitializationAction", "ClusterStatus", "SecurityConfig", @@ -73,24 +77,29 @@ class Cluster(proto.Message): Required. The Google Cloud Platform project ID that the cluster belongs to. cluster_name (str): - Required. The cluster name. Cluster names - within a project must be unique. Names of - deleted clusters can be reused. + Required. The cluster name, which must be + unique within a project. The name must start + with a lowercase letter, and can contain up to + 51 lowercase letters, numbers, and hyphens. It + cannot end with a hyphen. The name of a deleted + cluster can be reused. config (google.cloud.dataproc_v1.types.ClusterConfig): Optional. The cluster config for a cluster of Compute Engine Instances. Note that Dataproc may set default values, and values may change when clusters are updated. virtual_cluster_config (google.cloud.dataproc_v1.types.VirtualClusterConfig): - Optional. The virtual cluster config, used when creating a + Optional. The virtual cluster config is used when creating a Dataproc cluster that does not directly control the underlying compute resources, for example, when creating a `Dataproc-on-GKE - cluster `__. - Note that Dataproc may set default values, and values may - change when clusters are updated. Exactly one of config or - virtualClusterConfig must be specified. - labels (Mapping[str, str]): + cluster `__. + Dataproc may set default values, and values may change when + clusters are updated. Exactly one of + [config][google.cloud.dataproc.v1.Cluster.config] or + [virtual_cluster_config][google.cloud.dataproc.v1.Cluster.virtual_cluster_config] + must be specified. + labels (MutableMapping[str, str]): Optional. The labels to associate with this cluster. Label **keys** must contain 1 to 63 characters, and must conform to `RFC 1035 `__. @@ -100,7 +109,7 @@ class Cluster(proto.Message): 32 labels can be associated with a cluster. status (google.cloud.dataproc_v1.types.ClusterStatus): Output only. Cluster status. - status_history (Sequence[google.cloud.dataproc_v1.types.ClusterStatus]): + status_history (MutableSequence[google.cloud.dataproc_v1.types.ClusterStatus]): Output only. The previous cluster status. cluster_uuid (str): Output only. A cluster UUID (Unique Universal @@ -114,44 +123,44 @@ class Cluster(proto.Message): purposes only. It may be changed before final release. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) - config = proto.Field( + config: "ClusterConfig" = proto.Field( proto.MESSAGE, number=3, message="ClusterConfig", ) - virtual_cluster_config = proto.Field( + virtual_cluster_config: "VirtualClusterConfig" = proto.Field( proto.MESSAGE, number=10, message="VirtualClusterConfig", ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=8, ) - status = proto.Field( + status: "ClusterStatus" = proto.Field( proto.MESSAGE, number=4, message="ClusterStatus", ) - status_history = proto.RepeatedField( + status_history: MutableSequence["ClusterStatus"] = proto.RepeatedField( proto.MESSAGE, number=7, message="ClusterStatus", ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=6, ) - metrics = proto.Field( + metrics: "ClusterMetrics" = proto.Field( proto.MESSAGE, number=9, message="ClusterMetrics", @@ -203,7 +212,7 @@ class ClusterConfig(proto.Message): software_config (google.cloud.dataproc_v1.types.SoftwareConfig): Optional. The config settings for cluster software. - initialization_actions (Sequence[google.cloud.dataproc_v1.types.NodeInitializationAction]): + initialization_actions (MutableSequence[google.cloud.dataproc_v1.types.NodeInitializationAction]): Optional. Commands to execute on each node after config is completed. By default, executables are run on master and all worker nodes. You can test a node's ``role`` metadata to run @@ -237,101 +246,110 @@ class ClusterConfig(proto.Message): Optional. Metastore configuration. dataproc_metric_config (google.cloud.dataproc_v1.types.DataprocMetricConfig): Optional. The config for Dataproc metrics. + auxiliary_node_groups (MutableSequence[google.cloud.dataproc_v1.types.AuxiliaryNodeGroup]): + Optional. The node group settings. """ - config_bucket = proto.Field( + config_bucket: str = proto.Field( proto.STRING, number=1, ) - temp_bucket = proto.Field( + temp_bucket: str = proto.Field( proto.STRING, number=2, ) - gce_cluster_config = proto.Field( + gce_cluster_config: "GceClusterConfig" = proto.Field( proto.MESSAGE, number=8, message="GceClusterConfig", ) - master_config = proto.Field( + master_config: "InstanceGroupConfig" = proto.Field( proto.MESSAGE, number=9, message="InstanceGroupConfig", ) - worker_config = proto.Field( + worker_config: "InstanceGroupConfig" = proto.Field( proto.MESSAGE, number=10, message="InstanceGroupConfig", ) - secondary_worker_config = proto.Field( + secondary_worker_config: "InstanceGroupConfig" = proto.Field( proto.MESSAGE, number=12, message="InstanceGroupConfig", ) - software_config = proto.Field( + software_config: "SoftwareConfig" = proto.Field( proto.MESSAGE, number=13, message="SoftwareConfig", ) - initialization_actions = proto.RepeatedField( + initialization_actions: MutableSequence[ + "NodeInitializationAction" + ] = proto.RepeatedField( proto.MESSAGE, number=11, message="NodeInitializationAction", ) - encryption_config = proto.Field( + encryption_config: "EncryptionConfig" = proto.Field( proto.MESSAGE, number=15, message="EncryptionConfig", ) - autoscaling_config = proto.Field( + autoscaling_config: "AutoscalingConfig" = proto.Field( proto.MESSAGE, number=18, message="AutoscalingConfig", ) - security_config = proto.Field( + security_config: "SecurityConfig" = proto.Field( proto.MESSAGE, number=16, message="SecurityConfig", ) - lifecycle_config = proto.Field( + lifecycle_config: "LifecycleConfig" = proto.Field( proto.MESSAGE, number=17, message="LifecycleConfig", ) - endpoint_config = proto.Field( + endpoint_config: "EndpointConfig" = proto.Field( proto.MESSAGE, number=19, message="EndpointConfig", ) - metastore_config = proto.Field( + metastore_config: "MetastoreConfig" = proto.Field( proto.MESSAGE, number=20, message="MetastoreConfig", ) - dataproc_metric_config = proto.Field( + dataproc_metric_config: "DataprocMetricConfig" = proto.Field( proto.MESSAGE, number=23, message="DataprocMetricConfig", ) + auxiliary_node_groups: MutableSequence["AuxiliaryNodeGroup"] = proto.RepeatedField( + proto.MESSAGE, + number=25, + message="AuxiliaryNodeGroup", + ) class VirtualClusterConfig(proto.Message): - r"""Dataproc cluster config for a cluster that does not directly control - the underlying compute resources, such as a `Dataproc-on-GKE - cluster `__. + r"""The Dataproc cluster config for a cluster that does not directly + control the underlying compute resources, such as a `Dataproc-on-GKE + cluster `__. .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: staging_bucket (str): - Optional. A Storage bucket used to stage job dependencies, - config files, and job driver console output. If you do not - specify a staging bucket, Cloud Dataproc will determine a - Cloud Storage location (US, ASIA, or EU) for your cluster's - staging bucket according to the Compute Engine zone where - your cluster is deployed, and then create and manage this - project-level, per-location bucket (see `Dataproc staging - and temp + Optional. A Cloud Storage bucket used to stage job + dependencies, config files, and job driver console output. + If you do not specify a staging bucket, Cloud Dataproc will + determine a Cloud Storage location (US, ASIA, or EU) for + your cluster's staging bucket according to the Compute + Engine zone where your cluster is deployed, and then create + and manage this project-level, per-location bucket (see + `Dataproc staging and temp buckets `__). **This field requires a Cloud Storage bucket name, not a ``gs://...`` URI to a Cloud Storage bucket.** @@ -345,17 +363,17 @@ class VirtualClusterConfig(proto.Message): used by this cluster. """ - staging_bucket = proto.Field( + staging_bucket: str = proto.Field( proto.STRING, number=1, ) - kubernetes_cluster_config = proto.Field( + kubernetes_cluster_config: shared.KubernetesClusterConfig = proto.Field( proto.MESSAGE, number=6, oneof="infrastructure_config", message=shared.KubernetesClusterConfig, ) - auxiliary_services_config = proto.Field( + auxiliary_services_config: "AuxiliaryServicesConfig" = proto.Field( proto.MESSAGE, number=7, message="AuxiliaryServicesConfig", @@ -374,12 +392,12 @@ class AuxiliaryServicesConfig(proto.Message): configuration for the workload. """ - metastore_config = proto.Field( + metastore_config: "MetastoreConfig" = proto.Field( proto.MESSAGE, number=1, message="MetastoreConfig", ) - spark_history_server_config = proto.Field( + spark_history_server_config: shared.SparkHistoryServerConfig = proto.Field( proto.MESSAGE, number=2, message=shared.SparkHistoryServerConfig, @@ -390,7 +408,7 @@ class EndpointConfig(proto.Message): r"""Endpoint config for this cluster Attributes: - http_ports (Mapping[str, str]): + http_ports (MutableMapping[str, str]): Output only. The map of port descriptions to URLs. Will only be populated if enable_http_port_access is true. enable_http_port_access (bool): @@ -399,12 +417,12 @@ class EndpointConfig(proto.Message): sources. Defaults to false. """ - http_ports = proto.MapField( + http_ports: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=1, ) - enable_http_port_access = proto.Field( + enable_http_port_access: bool = proto.Field( proto.BOOL, number=2, ) @@ -427,7 +445,7 @@ class AutoscalingConfig(proto.Message): Dataproc region. """ - policy_uri = proto.Field( + policy_uri: str = proto.Field( proto.STRING, number=1, ) @@ -443,7 +461,7 @@ class EncryptionConfig(proto.Message): cluster. """ - gce_pd_kms_key_name = proto.Field( + gce_pd_kms_key_name: str = proto.Field( proto.STRING, number=1, ) @@ -513,7 +531,7 @@ class GceClusterConfig(proto.Message): If not specified, the `Compute Engine default service account `__ is used. - service_account_scopes (Sequence[str]): + service_account_scopes (MutableSequence[str]): Optional. The URIs of service account scopes to be included in Compute Engine instances. The following base set of scopes is always included: @@ -529,11 +547,11 @@ class GceClusterConfig(proto.Message): - https://www.googleapis.com/auth/bigtable.admin.table - https://www.googleapis.com/auth/bigtable.data - https://www.googleapis.com/auth/devstorage.full_control - tags (Sequence[str]): + tags (MutableSequence[str]): The Compute Engine tags to add to all instances (see `Tagging instances `__). - metadata (Mapping[str, str]): + metadata (MutableMapping[str, str]): The Compute Engine metadata entries to add to all instances (see `Project and instance metadata `__). @@ -565,60 +583,60 @@ class PrivateIpv6GoogleAccess(proto.Enum): OUTBOUND = 2 BIDIRECTIONAL = 3 - zone_uri = proto.Field( + zone_uri: str = proto.Field( proto.STRING, number=1, ) - network_uri = proto.Field( + network_uri: str = proto.Field( proto.STRING, number=2, ) - subnetwork_uri = proto.Field( + subnetwork_uri: str = proto.Field( proto.STRING, number=6, ) - internal_ip_only = proto.Field( + internal_ip_only: bool = proto.Field( proto.BOOL, number=7, ) - private_ipv6_google_access = proto.Field( + private_ipv6_google_access: PrivateIpv6GoogleAccess = proto.Field( proto.ENUM, number=12, enum=PrivateIpv6GoogleAccess, ) - service_account = proto.Field( + service_account: str = proto.Field( proto.STRING, number=8, ) - service_account_scopes = proto.RepeatedField( + service_account_scopes: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - tags = proto.RepeatedField( + tags: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - metadata = proto.MapField( + metadata: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=5, ) - reservation_affinity = proto.Field( + reservation_affinity: "ReservationAffinity" = proto.Field( proto.MESSAGE, number=11, message="ReservationAffinity", ) - node_group_affinity = proto.Field( + node_group_affinity: "NodeGroupAffinity" = proto.Field( proto.MESSAGE, number=13, message="NodeGroupAffinity", ) - shielded_instance_config = proto.Field( + shielded_instance_config: "ShieldedInstanceConfig" = proto.Field( proto.MESSAGE, number=14, message="ShieldedInstanceConfig", ) - confidential_instance_config = proto.Field( + confidential_instance_config: "ConfidentialInstanceConfig" = proto.Field( proto.MESSAGE, number=15, message="ConfidentialInstanceConfig", @@ -626,8 +644,9 @@ class PrivateIpv6GoogleAccess(proto.Enum): class NodeGroupAffinity(proto.Message): - r"""Node Group Affinity for clusters using sole-tenant node - groups. + r"""Node Group Affinity for clusters using sole-tenant node groups. + **The Dataproc ``NodeGroupAffinity`` resource is not related to the + Dataproc [NodeGroup][google.cloud.dataproc.v1.NodeGroup] resource.** Attributes: node_group_uri (str): @@ -643,7 +662,7 @@ class NodeGroupAffinity(proto.Message): - ``node-group-1`` """ - node_group_uri = proto.Field( + node_group_uri: str = proto.Field( proto.STRING, number=1, ) @@ -665,15 +684,15 @@ class ShieldedInstanceConfig(proto.Message): integrity monitoring enabled. """ - enable_secure_boot = proto.Field( + enable_secure_boot: bool = proto.Field( proto.BOOL, number=1, ) - enable_vtpm = proto.Field( + enable_vtpm: bool = proto.Field( proto.BOOL, number=2, ) - enable_integrity_monitoring = proto.Field( + enable_integrity_monitoring: bool = proto.Field( proto.BOOL, number=3, ) @@ -689,7 +708,7 @@ class ConfidentialInstanceConfig(proto.Message): have confidential compute enabled. """ - enable_confidential_compute = proto.Field( + enable_confidential_compute: bool = proto.Field( proto.BOOL, number=1, ) @@ -708,7 +727,7 @@ class InstanceGroupConfig(proto.Message): set to 3**. For standard cluster `master_config <#FIELDS.master_config>`__ groups, **must be set to 1**. - instance_names (Sequence[str]): + instance_names (MutableSequence[str]): Output only. The list of instance names. Dataproc derives the names from ``cluster_name``, ``num_instances``, and the instance group. @@ -766,7 +785,7 @@ class InstanceGroupConfig(proto.Message): Instance Group Manager that manages this group. This is only used for preemptible instance groups. - accelerators (Sequence[google.cloud.dataproc_v1.types.AcceleratorConfig]): + accelerators (MutableSequence[google.cloud.dataproc_v1.types.AcceleratorConfig]): Optional. The Compute Engine accelerator configuration for these instances. min_cpu_platform (str): @@ -776,55 +795,52 @@ class InstanceGroupConfig(proto.Message): """ class Preemptibility(proto.Enum): - r"""Controls the use of [preemptible instances] - (https://cloud.google.com/compute/docs/instances/preemptible) within - the group. - """ + r"""Controls the use of preemptible instances within the group.""" PREEMPTIBILITY_UNSPECIFIED = 0 NON_PREEMPTIBLE = 1 PREEMPTIBLE = 2 - num_instances = proto.Field( + num_instances: int = proto.Field( proto.INT32, number=1, ) - instance_names = proto.RepeatedField( + instance_names: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - image_uri = proto.Field( + image_uri: str = proto.Field( proto.STRING, number=3, ) - machine_type_uri = proto.Field( + machine_type_uri: str = proto.Field( proto.STRING, number=4, ) - disk_config = proto.Field( + disk_config: "DiskConfig" = proto.Field( proto.MESSAGE, number=5, message="DiskConfig", ) - is_preemptible = proto.Field( + is_preemptible: bool = proto.Field( proto.BOOL, number=6, ) - preemptibility = proto.Field( + preemptibility: Preemptibility = proto.Field( proto.ENUM, number=10, enum=Preemptibility, ) - managed_group_config = proto.Field( + managed_group_config: "ManagedGroupConfig" = proto.Field( proto.MESSAGE, number=7, message="ManagedGroupConfig", ) - accelerators = proto.RepeatedField( + accelerators: MutableSequence["AcceleratorConfig"] = proto.RepeatedField( proto.MESSAGE, number=8, message="AcceleratorConfig", ) - min_cpu_platform = proto.Field( + min_cpu_platform: str = proto.Field( proto.STRING, number=9, ) @@ -843,11 +859,11 @@ class ManagedGroupConfig(proto.Message): Manager for this group. """ - instance_template_name = proto.Field( + instance_template_name: str = proto.Field( proto.STRING, number=1, ) - instance_group_manager_name = proto.Field( + instance_group_manager_name: str = proto.Field( proto.STRING, number=2, ) @@ -880,11 +896,11 @@ class AcceleratorConfig(proto.Message): type exposed to this instance. """ - accelerator_type_uri = proto.Field( + accelerator_type_uri: str = proto.Field( proto.STRING, number=1, ) - accelerator_count = proto.Field( + accelerator_count: int = proto.Field( proto.INT32, number=2, ) @@ -906,7 +922,7 @@ class DiskConfig(proto.Message): Optional. Size in GB of the boot disk (default is 500GB). num_local_ssds (int): - Optional. Number of attached SSDs, from 0 to 4 (default is + Optional. Number of attached SSDs, from 0 to 8 (default is 0). If SSDs are not attached, the boot disk is used to store runtime logs and `HDFS `__ @@ -920,19 +936,97 @@ class DiskConfig(proto.Message): performance `__. """ - boot_disk_type = proto.Field( + boot_disk_type: str = proto.Field( proto.STRING, number=3, ) - boot_disk_size_gb = proto.Field( + boot_disk_size_gb: int = proto.Field( proto.INT32, number=1, ) - num_local_ssds = proto.Field( + num_local_ssds: int = proto.Field( proto.INT32, number=2, ) - local_ssd_interface = proto.Field( + local_ssd_interface: str = proto.Field( + proto.STRING, + number=4, + ) + + +class AuxiliaryNodeGroup(proto.Message): + r"""Node group identification and configuration information. + + Attributes: + node_group (google.cloud.dataproc_v1.types.NodeGroup): + Required. Node group configuration. + node_group_id (str): + Optional. A node group ID. Generated if not specified. + + The ID must contain only letters (a-z, A-Z), numbers (0-9), + underscores (_), and hyphens (-). Cannot begin or end with + underscore or hyphen. Must consist of from 3 to 33 + characters. + """ + + node_group: "NodeGroup" = proto.Field( + proto.MESSAGE, + number=1, + message="NodeGroup", + ) + node_group_id: str = proto.Field( + proto.STRING, + number=2, + ) + + +class NodeGroup(proto.Message): + r"""Dataproc Node Group. **The Dataproc ``NodeGroup`` resource is not + related to the Dataproc + [NodeGroupAffinity][google.cloud.dataproc.v1.NodeGroupAffinity] + resource.** + + Attributes: + name (str): + The Node group `resource name `__. + roles (MutableSequence[google.cloud.dataproc_v1.types.NodeGroup.Role]): + Required. Node group roles. + node_group_config (google.cloud.dataproc_v1.types.InstanceGroupConfig): + Optional. The node group instance group + configuration. + labels (MutableMapping[str, str]): + Optional. Node group labels. + + - Label **keys** must consist of from 1 to 63 characters + and conform to `RFC + 1035 `__. + - Label **values** can be empty. If specified, they must + consist of from 1 to 63 characters and conform to [RFC + 1035] (https://www.ietf.org/rfc/rfc1035.txt). + - The node group must have no more than 32 labels. + """ + + class Role(proto.Enum): + r"""Node group roles.""" + ROLE_UNSPECIFIED = 0 + DRIVER = 1 + + name: str = proto.Field( + proto.STRING, + number=1, + ) + roles: MutableSequence[Role] = proto.RepeatedField( + proto.ENUM, + number=2, + enum=Role, + ) + node_group_config: "InstanceGroupConfig" = proto.Field( + proto.MESSAGE, + number=3, + message="InstanceGroupConfig", + ) + labels: MutableMapping[str, str] = proto.MapField( + proto.STRING, proto.STRING, number=4, ) @@ -957,11 +1051,11 @@ class NodeInitializationAction(proto.Message): at end of the timeout period. """ - executable_file = proto.Field( + executable_file: str = proto.Field( proto.STRING, number=1, ) - execution_timeout = proto.Field( + execution_timeout: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=2, message=duration_pb2.Duration, @@ -1005,21 +1099,21 @@ class Substate(proto.Enum): UNHEALTHY = 1 STALE_STATUS = 2 - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=1, enum=State, ) - detail = proto.Field( + detail: str = proto.Field( proto.STRING, number=2, ) - state_start_time = proto.Field( + state_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=3, message=timestamp_pb2.Timestamp, ) - substate = proto.Field( + substate: Substate = proto.Field( proto.ENUM, number=4, enum=Substate, @@ -1039,12 +1133,12 @@ class SecurityConfig(proto.Message): multi-tenancy user mappings. """ - kerberos_config = proto.Field( + kerberos_config: "KerberosConfig" = proto.Field( proto.MESSAGE, number=1, message="KerberosConfig", ) - identity_config = proto.Field( + identity_config: "IdentityConfig" = proto.Field( proto.MESSAGE, number=2, message="IdentityConfig", @@ -1126,63 +1220,63 @@ class KerberosConfig(proto.Message): of hostnames will be the realm. """ - enable_kerberos = proto.Field( + enable_kerberos: bool = proto.Field( proto.BOOL, number=1, ) - root_principal_password_uri = proto.Field( + root_principal_password_uri: str = proto.Field( proto.STRING, number=2, ) - kms_key_uri = proto.Field( + kms_key_uri: str = proto.Field( proto.STRING, number=3, ) - keystore_uri = proto.Field( + keystore_uri: str = proto.Field( proto.STRING, number=4, ) - truststore_uri = proto.Field( + truststore_uri: str = proto.Field( proto.STRING, number=5, ) - keystore_password_uri = proto.Field( + keystore_password_uri: str = proto.Field( proto.STRING, number=6, ) - key_password_uri = proto.Field( + key_password_uri: str = proto.Field( proto.STRING, number=7, ) - truststore_password_uri = proto.Field( + truststore_password_uri: str = proto.Field( proto.STRING, number=8, ) - cross_realm_trust_realm = proto.Field( + cross_realm_trust_realm: str = proto.Field( proto.STRING, number=9, ) - cross_realm_trust_kdc = proto.Field( + cross_realm_trust_kdc: str = proto.Field( proto.STRING, number=10, ) - cross_realm_trust_admin_server = proto.Field( + cross_realm_trust_admin_server: str = proto.Field( proto.STRING, number=11, ) - cross_realm_trust_shared_password_uri = proto.Field( + cross_realm_trust_shared_password_uri: str = proto.Field( proto.STRING, number=12, ) - kdc_db_key_uri = proto.Field( + kdc_db_key_uri: str = proto.Field( proto.STRING, number=13, ) - tgt_lifetime_hours = proto.Field( + tgt_lifetime_hours: int = proto.Field( proto.INT32, number=14, ) - realm = proto.Field( + realm: str = proto.Field( proto.STRING, number=15, ) @@ -1193,11 +1287,11 @@ class IdentityConfig(proto.Message): based secure multi-tenancy user mappings. Attributes: - user_service_account_mapping (Mapping[str, str]): + user_service_account_mapping (MutableMapping[str, str]): Required. Map of user to service account. """ - user_service_account_mapping = proto.MapField( + user_service_account_mapping: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=1, @@ -1217,7 +1311,7 @@ class SoftwareConfig(proto.Message): "1.2.29"), or the `"preview" version `__. If unspecified, it defaults to the latest Debian version. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. The properties to set on daemon config files. Property keys are specified in ``prefix:property`` format, @@ -1236,21 +1330,21 @@ class SoftwareConfig(proto.Message): For more information, see `Cluster properties `__. - optional_components (Sequence[google.cloud.dataproc_v1.types.Component]): + optional_components (MutableSequence[google.cloud.dataproc_v1.types.Component]): Optional. The set of components to activate on the cluster. """ - image_version = proto.Field( + image_version: str = proto.Field( proto.STRING, number=1, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=2, ) - optional_components = proto.RepeatedField( + optional_components: MutableSequence[shared.Component] = proto.RepeatedField( proto.ENUM, number=3, enum=shared.Component, @@ -1296,24 +1390,24 @@ class LifecycleConfig(proto.Message): `Timestamp `__). """ - idle_delete_ttl = proto.Field( + idle_delete_ttl: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=1, message=duration_pb2.Duration, ) - auto_delete_time = proto.Field( + auto_delete_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=2, oneof="ttl", message=timestamp_pb2.Timestamp, ) - auto_delete_ttl = proto.Field( + auto_delete_ttl: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=3, oneof="ttl", message=duration_pb2.Duration, ) - idle_start_time = proto.Field( + idle_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=4, message=timestamp_pb2.Timestamp, @@ -1333,7 +1427,7 @@ class MetastoreConfig(proto.Message): - ``projects/[project_id]/locations/[dataproc_region]/services/[service-name]`` """ - dataproc_metastore_service = proto.Field( + dataproc_metastore_service: str = proto.Field( proto.STRING, number=1, ) @@ -1343,7 +1437,7 @@ class DataprocMetricConfig(proto.Message): r"""Dataproc metric config. Attributes: - metrics (Sequence[google.cloud.dataproc_v1.types.DataprocMetricConfig.Metric]): + metrics (MutableSequence[google.cloud.dataproc_v1.types.DataprocMetricConfig.Metric]): Required. Metrics sources to enable. """ @@ -1370,7 +1464,7 @@ class Metric(proto.Message): [Available OSS metrics] (https://cloud.google.com/dataproc/docs/guides/monitoring#available_oss_metrics) for more information). - metric_overrides (Sequence[str]): + metric_overrides (MutableSequence[str]): Optional. Specify one or more [available OSS metrics] (https://cloud.google.com/dataproc/docs/guides/monitoring#available_oss_metrics) to collect for the metric course (for the ``SPARK`` metric @@ -1404,17 +1498,17 @@ class Metric(proto.Message): default YARN metrics will be collected. """ - metric_source = proto.Field( + metric_source: "DataprocMetricConfig.MetricSource" = proto.Field( proto.ENUM, number=1, enum="DataprocMetricConfig.MetricSource", ) - metric_overrides = proto.RepeatedField( + metric_overrides: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - metrics = proto.RepeatedField( + metrics: MutableSequence[Metric] = proto.RepeatedField( proto.MESSAGE, number=1, message=Metric, @@ -1428,18 +1522,18 @@ class ClusterMetrics(proto.Message): only. It may be changed before final release. Attributes: - hdfs_metrics (Mapping[str, int]): + hdfs_metrics (MutableMapping[str, int]): The HDFS metrics. - yarn_metrics (Mapping[str, int]): + yarn_metrics (MutableMapping[str, int]): The YARN metrics. """ - hdfs_metrics = proto.MapField( + hdfs_metrics: MutableMapping[str, int] = proto.MapField( proto.STRING, proto.INT64, number=1, ) - yarn_metrics = proto.MapField( + yarn_metrics: MutableMapping[str, int] = proto.MapField( proto.STRING, proto.INT64, number=2, @@ -1478,24 +1572,24 @@ class CreateClusterRequest(proto.Message): creation fails. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - cluster = proto.Field( + cluster: "Cluster" = proto.Field( proto.MESSAGE, number=2, message="Cluster", ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=4, ) - action_on_failed_primary_workers = proto.Field( + action_on_failed_primary_workers: shared.FailureAction = proto.Field( proto.ENUM, number=5, enum=shared.FailureAction, @@ -1606,34 +1700,34 @@ class UpdateClusterRequest(proto.Message): characters. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=5, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) - cluster = proto.Field( + cluster: "Cluster" = proto.Field( proto.MESSAGE, number=3, message="Cluster", ) - graceful_decommission_timeout = proto.Field( + graceful_decommission_timeout: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=6, message=duration_pb2.Duration, ) - update_mask = proto.Field( + update_mask: field_mask_pb2.FieldMask = proto.Field( proto.MESSAGE, number=4, message=field_mask_pb2.FieldMask, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=7, ) @@ -1672,23 +1766,23 @@ class StopClusterRequest(proto.Message): characters. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=2, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=3, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=4, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=5, ) @@ -1727,23 +1821,23 @@ class StartClusterRequest(proto.Message): characters. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=2, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=3, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=4, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=5, ) @@ -1782,23 +1876,23 @@ class DeleteClusterRequest(proto.Message): characters. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=4, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=5, ) @@ -1819,15 +1913,15 @@ class GetClusterRequest(proto.Message): Required. The cluster name. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) @@ -1871,23 +1965,23 @@ class ListClustersRequest(proto.Message): Optional. The standard List page token. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=4, ) - filter = proto.Field( + filter: str = proto.Field( proto.STRING, number=5, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) @@ -1897,7 +1991,7 @@ class ListClustersResponse(proto.Message): r"""The list of all clusters in a project. Attributes: - clusters (Sequence[google.cloud.dataproc_v1.types.Cluster]): + clusters (MutableSequence[google.cloud.dataproc_v1.types.Cluster]): Output only. The clusters in the project. next_page_token (str): Output only. This token is included in the response if there @@ -1910,12 +2004,12 @@ class ListClustersResponse(proto.Message): def raw_page(self): return self - clusters = proto.RepeatedField( + clusters: MutableSequence["Cluster"] = proto.RepeatedField( proto.MESSAGE, number=1, message="Cluster", ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) @@ -1935,15 +2029,15 @@ class DiagnoseClusterRequest(proto.Message): Required. The cluster name. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) @@ -1960,7 +2054,7 @@ class DiagnoseClusterResults(proto.Message): diagnostics. """ - output_uri = proto.Field( + output_uri: str = proto.Field( proto.STRING, number=1, ) @@ -1975,7 +2069,7 @@ class ReservationAffinity(proto.Message): key (str): Optional. Corresponds to the label key of reservation resource. - values (Sequence[str]): + values (MutableSequence[str]): Optional. Corresponds to the label values of reservation resource. """ @@ -1989,16 +2083,16 @@ class Type(proto.Enum): ANY_RESERVATION = 2 SPECIFIC_RESERVATION = 3 - consume_reservation_type = proto.Field( + consume_reservation_type: Type = proto.Field( proto.ENUM, number=1, enum=Type, ) - key = proto.Field( + key: str = proto.Field( proto.STRING, number=2, ) - values = proto.RepeatedField( + values: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) diff --git a/google/cloud/dataproc_v1/types/jobs.py b/google/cloud/dataproc_v1/types/jobs.py index 2e785931..501b9446 100644 --- a/google/cloud/dataproc_v1/types/jobs.py +++ b/google/cloud/dataproc_v1/types/jobs.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.protobuf import field_mask_pb2 # type: ignore @@ -37,6 +39,7 @@ "JobReference", "YarnApplication", "Job", + "DriverSchedulingConfig", "JobScheduling", "SubmitJobRequest", "JobMetadata", @@ -54,7 +57,7 @@ class LoggingConfig(proto.Message): r"""The runtime logging config of the job. Attributes: - driver_log_levels (Mapping[str, google.cloud.dataproc_v1.types.LoggingConfig.Level]): + driver_log_levels (MutableMapping[str, google.cloud.dataproc_v1.types.LoggingConfig.Level]): The per-package log levels for the driver. This may include "root" package name to configure rootLogger. Examples: @@ -77,7 +80,7 @@ class Level(proto.Enum): FATAL = 7 OFF = 8 - driver_log_levels = proto.MapField( + driver_log_levels: MutableMapping[str, Level] = proto.MapField( proto.STRING, proto.ENUM, number=2, @@ -113,25 +116,25 @@ class HadoopJob(proto.Message): ``jar_file_uris``. This field is a member of `oneof`_ ``driver``. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments, such as ``-libjars`` or ``-Dfoo=bar``, that can be set as job properties, since a collision may occur that causes an incorrect job submission. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. Jar file URIs to add to the CLASSPATHs of the Hadoop driver and tasks. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS (Hadoop Compatible Filesystem) URIs of files to be copied to the working directory of Hadoop drivers and distributed tasks. Useful for naively parallel tasks. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted in the working directory of Hadoop drivers and tasks. Supported file types: .jar, .tar, .tar.gz, .tgz, or .zip. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure Hadoop. Properties that conflict with values set by the Dataproc API may be overwritten. Can include @@ -142,38 +145,38 @@ class HadoopJob(proto.Message): execution. """ - main_jar_file_uri = proto.Field( + main_jar_file_uri: str = proto.Field( proto.STRING, number=1, oneof="driver", ) - main_class = proto.Field( + main_class: str = proto.Field( proto.STRING, number=2, oneof="driver", ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=7, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=8, message="LoggingConfig", @@ -182,7 +185,7 @@ class HadoopJob(proto.Message): class SparkJob(proto.Message): r"""A Dataproc job for running `Apache - Spark `__ applications on YARN. + Spark `__ applications on YARN. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -203,24 +206,24 @@ class SparkJob(proto.Message): specified in ``jar_file_uris``. This field is a member of `oneof`_ ``driver``. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments, such as ``--conf``, that can be set as job properties, since a collision may occur that causes an incorrect job submission. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the CLASSPATHs of the Spark driver and tasks. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. Useful for naively parallel tasks. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure Spark. Properties that conflict with values set by the Dataproc API may @@ -232,38 +235,38 @@ class SparkJob(proto.Message): execution. """ - main_jar_file_uri = proto.Field( + main_jar_file_uri: str = proto.Field( proto.STRING, number=1, oneof="driver", ) - main_class = proto.Field( + main_class: str = proto.Field( proto.STRING, number=2, oneof="driver", ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=7, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=8, message="LoggingConfig", @@ -279,28 +282,28 @@ class PySparkJob(proto.Message): main_python_file_uri (str): Required. The HCFS URI of the main Python file to use as the driver. Must be a .py file. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments, such as ``--conf``, that can be set as job properties, since a collision may occur that causes an incorrect job submission. - python_file_uris (Sequence[str]): + python_file_uris (MutableSequence[str]): Optional. HCFS file URIs of Python files to pass to the PySpark framework. Supported file types: .py, .egg, and .zip. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the CLASSPATHs of the Python driver and tasks. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. Useful for naively parallel tasks. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure PySpark. Properties that conflict with values set by the Dataproc @@ -313,36 +316,36 @@ class PySparkJob(proto.Message): execution. """ - main_python_file_uri = proto.Field( + main_python_file_uri: str = proto.Field( proto.STRING, number=1, ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - python_file_uris = proto.RepeatedField( + python_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=7, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=8, message="LoggingConfig", @@ -353,7 +356,7 @@ class QueryList(proto.Message): r"""A list of queries to run on a cluster. Attributes: - queries (Sequence[str]): + queries (MutableSequence[str]): Required. The queries to execute. You do not need to end a query expression with a semicolon. Multiple queries can be specified in one string by separating each with a semicolon. @@ -373,7 +376,7 @@ class QueryList(proto.Message): } """ - queries = proto.RepeatedField( + queries: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=1, ) @@ -404,48 +407,48 @@ class HiveJob(proto.Message): Optional. Whether to continue executing queries if a query fails. The default value is ``false``. Setting to ``true`` can be useful when executing independent parallel queries. - script_variables (Mapping[str, str]): + script_variables (MutableMapping[str, str]): Optional. Mapping of query variable names to values (equivalent to the Hive command: ``SET name="value";``). - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names and values, used to configure Hive. Properties that conflict with values set by the Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/hive/conf/hive-site.xml, and classes in user code. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the CLASSPATH of the Hive server and Hadoop MapReduce (MR) tasks. Can contain Hive SerDes and UDFs. """ - query_file_uri = proto.Field( + query_file_uri: str = proto.Field( proto.STRING, number=1, oneof="queries", ) - query_list = proto.Field( + query_list: "QueryList" = proto.Field( proto.MESSAGE, number=2, oneof="queries", message="QueryList", ) - continue_on_failure = proto.Field( + continue_on_failure: bool = proto.Field( proto.BOOL, number=3, ) - script_variables = proto.MapField( + script_variables: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=4, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=5, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) @@ -453,7 +456,7 @@ class HiveJob(proto.Message): class SparkSqlJob(proto.Message): r"""A Dataproc job for running `Apache Spark - SQL `__ queries. + SQL `__ queries. This message has `oneof`_ fields (mutually exclusive fields). For each oneof, at most one member field can be set at the same time. @@ -472,16 +475,16 @@ class SparkSqlJob(proto.Message): A list of queries. This field is a member of `oneof`_ ``queries``. - script_variables (Mapping[str, str]): + script_variables (MutableMapping[str, str]): Optional. Mapping of query variable names to values (equivalent to the Spark SQL command: SET ``name="value";``). - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure Spark SQL's SparkConf. Properties that conflict with values set by the Dataproc API may be overwritten. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to be added to the Spark CLASSPATH. logging_config (google.cloud.dataproc_v1.types.LoggingConfig): @@ -489,32 +492,32 @@ class SparkSqlJob(proto.Message): execution. """ - query_file_uri = proto.Field( + query_file_uri: str = proto.Field( proto.STRING, number=1, oneof="queries", ) - query_list = proto.Field( + query_list: "QueryList" = proto.Field( proto.MESSAGE, number=2, oneof="queries", message="QueryList", ) - script_variables = proto.MapField( + script_variables: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=3, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=4, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=56, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=6, message="LoggingConfig", @@ -546,16 +549,16 @@ class PigJob(proto.Message): Optional. Whether to continue executing queries if a query fails. The default value is ``false``. Setting to ``true`` can be useful when executing independent parallel queries. - script_variables (Mapping[str, str]): + script_variables (MutableMapping[str, str]): Optional. Mapping of query variable names to values (equivalent to the Pig command: ``name=[value]``). - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure Pig. Properties that conflict with values set by the Dataproc API may be overwritten. Can include properties set in /etc/hadoop/conf/*-site.xml, /etc/pig/conf/pig.properties, and classes in user code. - jar_file_uris (Sequence[str]): + jar_file_uris (MutableSequence[str]): Optional. HCFS URIs of jar files to add to the CLASSPATH of the Pig Client and Hadoop MapReduce (MR) tasks. Can contain Pig UDFs. @@ -564,36 +567,36 @@ class PigJob(proto.Message): execution. """ - query_file_uri = proto.Field( + query_file_uri: str = proto.Field( proto.STRING, number=1, oneof="queries", ) - query_list = proto.Field( + query_list: "QueryList" = proto.Field( proto.MESSAGE, number=2, oneof="queries", message="QueryList", ) - continue_on_failure = proto.Field( + continue_on_failure: bool = proto.Field( proto.BOOL, number=3, ) - script_variables = proto.MapField( + script_variables: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=4, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=5, ) - jar_file_uris = proto.RepeatedField( + jar_file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=7, message="LoggingConfig", @@ -609,21 +612,21 @@ class SparkRJob(proto.Message): main_r_file_uri (str): Required. The HCFS URI of the main R file to use as the driver. Must be a .R file. - args (Sequence[str]): + args (MutableSequence[str]): Optional. The arguments to pass to the driver. Do not include arguments, such as ``--conf``, that can be set as job properties, since a collision may occur that causes an incorrect job submission. - file_uris (Sequence[str]): + file_uris (MutableSequence[str]): Optional. HCFS URIs of files to be placed in the working directory of each executor. Useful for naively parallel tasks. - archive_uris (Sequence[str]): + archive_uris (MutableSequence[str]): Optional. HCFS URIs of archives to be extracted into the working directory of each executor. Supported file types: .jar, .tar, .tar.gz, .tgz, and .zip. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, used to configure SparkR. Properties that conflict with values set by the Dataproc @@ -636,28 +639,28 @@ class SparkRJob(proto.Message): execution. """ - main_r_file_uri = proto.Field( + main_r_file_uri: str = proto.Field( proto.STRING, number=1, ) - args = proto.RepeatedField( + args: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - file_uris = proto.RepeatedField( + file_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) - archive_uris = proto.RepeatedField( + archive_uris: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=5, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=6, message="LoggingConfig", @@ -696,10 +699,10 @@ class PrestoJob(proto.Message): Optional. The format in which query output will be displayed. See the Presto documentation for supported output formats - client_tags (Sequence[str]): + client_tags (MutableSequence[str]): Optional. Presto client tags to attach to this query - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values. Used to set Presto `session properties `__ @@ -709,35 +712,35 @@ class PrestoJob(proto.Message): execution. """ - query_file_uri = proto.Field( + query_file_uri: str = proto.Field( proto.STRING, number=1, oneof="queries", ) - query_list = proto.Field( + query_list: "QueryList" = proto.Field( proto.MESSAGE, number=2, oneof="queries", message="QueryList", ) - continue_on_failure = proto.Field( + continue_on_failure: bool = proto.Field( proto.BOOL, number=3, ) - output_format = proto.Field( + output_format: str = proto.Field( proto.STRING, number=4, ) - client_tags = proto.RepeatedField( + client_tags: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=5, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=6, ) - logging_config = proto.Field( + logging_config: "LoggingConfig" = proto.Field( proto.MESSAGE, number=7, message="LoggingConfig", @@ -754,20 +757,20 @@ class JobPlacement(proto.Message): cluster_uuid (str): Output only. A cluster UUID generated by the Dataproc service when the job is submitted. - cluster_labels (Mapping[str, str]): + cluster_labels (MutableMapping[str, str]): Optional. Cluster labels to identify a cluster where the job will be submitted. """ - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=1, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=2, ) - cluster_labels = proto.MapField( + cluster_labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=3, @@ -813,21 +816,21 @@ class Substate(proto.Enum): QUEUED = 2 STALE_STATUS = 3 - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=1, enum=State, ) - details = proto.Field( + details: str = proto.Field( proto.STRING, number=2, ) - state_start_time = proto.Field( + state_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=6, message=timestamp_pb2.Timestamp, ) - substate = proto.Field( + substate: Substate = proto.Field( proto.ENUM, number=7, enum=Substate, @@ -854,11 +857,11 @@ class JobReference(proto.Message): by the server. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=2, ) @@ -903,20 +906,20 @@ class State(proto.Enum): FAILED = 7 KILLED = 8 - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=2, enum=State, ) - progress = proto.Field( + progress: float = proto.Field( proto.FLOAT, number=3, ) - tracking_url = proto.Field( + tracking_url: str = proto.Field( proto.STRING, number=4, ) @@ -977,9 +980,9 @@ class Job(proto.Message): Output only. The job status. Additional application-specific status information may be contained in the type_job and yarn_applications fields. - status_history (Sequence[google.cloud.dataproc_v1.types.JobStatus]): + status_history (MutableSequence[google.cloud.dataproc_v1.types.JobStatus]): Output only. The previous job status. - yarn_applications (Sequence[google.cloud.dataproc_v1.types.YarnApplication]): + yarn_applications (MutableSequence[google.cloud.dataproc_v1.types.YarnApplication]): Output only. The collection of YARN applications spun up by this job. @@ -993,7 +996,7 @@ class Job(proto.Message): control files which may be used as part of job setup and handling. If not present, control files may be placed in the same location as ``driver_output_uri``. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this job. Label **keys** must contain 1 to 63 characters, and must conform to `RFC 1035 `__. @@ -1012,107 +1015,136 @@ class Job(proto.Message): value is ``false``, the job is still in progress. If ``true``, the job is completed, and ``status.state`` field will indicate if it was successful, failed, or cancelled. + driver_scheduling_config (google.cloud.dataproc_v1.types.DriverSchedulingConfig): + Optional. Driver scheduling configuration. """ - reference = proto.Field( + reference: "JobReference" = proto.Field( proto.MESSAGE, number=1, message="JobReference", ) - placement = proto.Field( + placement: "JobPlacement" = proto.Field( proto.MESSAGE, number=2, message="JobPlacement", ) - hadoop_job = proto.Field( + hadoop_job: "HadoopJob" = proto.Field( proto.MESSAGE, number=3, oneof="type_job", message="HadoopJob", ) - spark_job = proto.Field( + spark_job: "SparkJob" = proto.Field( proto.MESSAGE, number=4, oneof="type_job", message="SparkJob", ) - pyspark_job = proto.Field( + pyspark_job: "PySparkJob" = proto.Field( proto.MESSAGE, number=5, oneof="type_job", message="PySparkJob", ) - hive_job = proto.Field( + hive_job: "HiveJob" = proto.Field( proto.MESSAGE, number=6, oneof="type_job", message="HiveJob", ) - pig_job = proto.Field( + pig_job: "PigJob" = proto.Field( proto.MESSAGE, number=7, oneof="type_job", message="PigJob", ) - spark_r_job = proto.Field( + spark_r_job: "SparkRJob" = proto.Field( proto.MESSAGE, number=21, oneof="type_job", message="SparkRJob", ) - spark_sql_job = proto.Field( + spark_sql_job: "SparkSqlJob" = proto.Field( proto.MESSAGE, number=12, oneof="type_job", message="SparkSqlJob", ) - presto_job = proto.Field( + presto_job: "PrestoJob" = proto.Field( proto.MESSAGE, number=23, oneof="type_job", message="PrestoJob", ) - status = proto.Field( + status: "JobStatus" = proto.Field( proto.MESSAGE, number=8, message="JobStatus", ) - status_history = proto.RepeatedField( + status_history: MutableSequence["JobStatus"] = proto.RepeatedField( proto.MESSAGE, number=13, message="JobStatus", ) - yarn_applications = proto.RepeatedField( + yarn_applications: MutableSequence["YarnApplication"] = proto.RepeatedField( proto.MESSAGE, number=9, message="YarnApplication", ) - driver_output_resource_uri = proto.Field( + driver_output_resource_uri: str = proto.Field( proto.STRING, number=17, ) - driver_control_files_uri = proto.Field( + driver_control_files_uri: str = proto.Field( proto.STRING, number=15, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=18, ) - scheduling = proto.Field( + scheduling: "JobScheduling" = proto.Field( proto.MESSAGE, number=20, message="JobScheduling", ) - job_uuid = proto.Field( + job_uuid: str = proto.Field( proto.STRING, number=22, ) - done = proto.Field( + done: bool = proto.Field( proto.BOOL, number=24, ) + driver_scheduling_config: "DriverSchedulingConfig" = proto.Field( + proto.MESSAGE, + number=27, + message="DriverSchedulingConfig", + ) + + +class DriverSchedulingConfig(proto.Message): + r"""Driver scheduling configuration. + + Attributes: + memory_mb (int): + Required. The amount of memory in MB the + driver is requesting. + vcores (int): + Required. The number of vCPUs the driver is + requesting. + """ + + memory_mb: int = proto.Field( + proto.INT32, + number=1, + ) + vcores: int = proto.Field( + proto.INT32, + number=2, + ) class JobScheduling(proto.Message): @@ -1124,31 +1156,32 @@ class JobScheduling(proto.Message): restarted as a result of driver exiting with non-zero code before job is reported failed. - A job may be reported as thrashing if driver exits with - non-zero code 4 times within 10 minute window. + A job may be reported as thrashing if the driver exits with + a non-zero code four times within a 10-minute window. Maximum value is 10. - **Note:** Currently, this restartable job option is not - supported in Dataproc `workflow - template `__ - jobs. + **Note:** This restartable job option is not supported in + Dataproc [workflow templates] + (https://cloud.google.com/dataproc/docs/concepts/workflows/using-workflows#adding_jobs_to_a_template). max_failures_total (int): - Optional. Maximum number of times in total a driver may be - restarted as a result of driver exiting with non-zero code - before job is reported failed. Maximum value is 240. + Optional. Maximum total number of times a driver may be + restarted as a result of the driver exiting with a non-zero + code. After the maximum number is reached, the job will be + reported as failed. + + Maximum value is 240. **Note:** Currently, this restartable job option is not supported in Dataproc `workflow - template `__ - jobs. + templates `__. """ - max_failures_per_hour = proto.Field( + max_failures_per_hour: int = proto.Field( proto.INT32, number=1, ) - max_failures_total = proto.Field( + max_failures_total: int = proto.Field( proto.INT32, number=2, ) @@ -1182,20 +1215,20 @@ class SubmitJobRequest(proto.Message): characters. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - job = proto.Field( + job: "Job" = proto.Field( proto.MESSAGE, number=2, message="Job", ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=4, ) @@ -1215,20 +1248,20 @@ class JobMetadata(proto.Message): Output only. Job submission time. """ - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=1, ) - status = proto.Field( + status: "JobStatus" = proto.Field( proto.MESSAGE, number=2, message="JobStatus", ) - operation_type = proto.Field( + operation_type: str = proto.Field( proto.STRING, number=3, ) - start_time = proto.Field( + start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=4, message=timestamp_pb2.Timestamp, @@ -1250,15 +1283,15 @@ class GetJobRequest(proto.Message): Required. The job ID. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=2, ) @@ -1316,32 +1349,32 @@ class JobStateMatcher(proto.Enum): ACTIVE = 1 NON_ACTIVE = 2 - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=6, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=4, ) - job_state_matcher = proto.Field( + job_state_matcher: JobStateMatcher = proto.Field( proto.ENUM, number=5, enum=JobStateMatcher, ) - filter = proto.Field( + filter: str = proto.Field( proto.STRING, number=7, ) @@ -1369,24 +1402,24 @@ class UpdateJobRequest(proto.Message): Currently, labels is the only field that can be updated. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=2, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=3, ) - job = proto.Field( + job: "Job" = proto.Field( proto.MESSAGE, number=4, message="Job", ) - update_mask = proto.Field( + update_mask: field_mask_pb2.FieldMask = proto.Field( proto.MESSAGE, number=5, message=field_mask_pb2.FieldMask, @@ -1397,7 +1430,7 @@ class ListJobsResponse(proto.Message): r"""A list of jobs in a project. Attributes: - jobs (Sequence[google.cloud.dataproc_v1.types.Job]): + jobs (MutableSequence[google.cloud.dataproc_v1.types.Job]): Output only. Jobs list. next_page_token (str): Optional. This token is included in the response if there @@ -1410,12 +1443,12 @@ class ListJobsResponse(proto.Message): def raw_page(self): return self - jobs = proto.RepeatedField( + jobs: MutableSequence["Job"] = proto.RepeatedField( proto.MESSAGE, number=1, message="Job", ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) @@ -1435,15 +1468,15 @@ class CancelJobRequest(proto.Message): Required. The job ID. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=2, ) @@ -1463,15 +1496,15 @@ class DeleteJobRequest(proto.Message): Required. The job ID. """ - project_id = proto.Field( + project_id: str = proto.Field( proto.STRING, number=1, ) - region = proto.Field( + region: str = proto.Field( proto.STRING, number=3, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=2, ) diff --git a/google/cloud/dataproc_v1/types/node_groups.py b/google/cloud/dataproc_v1/types/node_groups.py new file mode 100644 index 00000000..49c4f572 --- /dev/null +++ b/google/cloud/dataproc_v1/types/node_groups.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + +from google.cloud.dataproc_v1.types import clusters +from google.protobuf import duration_pb2 # type: ignore + + +__protobuf__ = proto.module( + package="google.cloud.dataproc.v1", + manifest={ + "CreateNodeGroupRequest", + "ResizeNodeGroupRequest", + "GetNodeGroupRequest", + }, +) + + +class CreateNodeGroupRequest(proto.Message): + r"""A request to create a node group. + + Attributes: + parent (str): + Required. The parent resource where this node group will be + created. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}`` + node_group (google.cloud.dataproc_v1.types.NodeGroup): + Required. The node group to create. + node_group_id (str): + Optional. An optional node group ID. Generated if not + specified. + + The ID must contain only letters (a-z, A-Z), numbers (0-9), + underscores (_), and hyphens (-). Cannot begin or end with + underscore or hyphen. Must consist of from 3 to 33 + characters. + request_id (str): + Optional. A unique ID used to identify the request. If the + server receives two + `CreateNodeGroupRequest `__ + with the same ID, the second request is ignored and the + first + [google.longrunning.Operation][google.longrunning.Operation] + created and stored in the backend is returned. + + Recommendation: Set this value to a + `UUID `__. + + The ID must contain only letters (a-z, A-Z), numbers (0-9), + underscores (_), and hyphens (-). The maximum length is 40 + characters. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + node_group: clusters.NodeGroup = proto.Field( + proto.MESSAGE, + number=2, + message=clusters.NodeGroup, + ) + node_group_id: str = proto.Field( + proto.STRING, + number=4, + ) + request_id: str = proto.Field( + proto.STRING, + number=3, + ) + + +class ResizeNodeGroupRequest(proto.Message): + r"""A request to resize a node group. + + Attributes: + name (str): + Required. The name of the node group to resize. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + size (int): + Required. The number of running instances for + the node group to maintain. The group adds or + removes instances to maintain the number of + instances specified by this parameter. + request_id (str): + Optional. A unique ID used to identify the request. If the + server receives two + `ResizeNodeGroupRequest `__ + with the same ID, the second request is ignored and the + first + [google.longrunning.Operation][google.longrunning.Operation] + created and stored in the backend is returned. + + Recommendation: Set this value to a + `UUID `__. + + The ID must contain only letters (a-z, A-Z), numbers (0-9), + underscores (_), and hyphens (-). The maximum length is 40 + characters. + graceful_decommission_timeout (google.protobuf.duration_pb2.Duration): + Optional. Timeout for graceful YARN decommissioning. + [Graceful decommissioning] + (https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scaling-clusters#graceful_decommissioning) + allows the removal of nodes from the Compute Engine node + group without interrupting jobs in progress. This timeout + specifies how long to wait for jobs in progress to finish + before forcefully removing nodes (and potentially + interrupting jobs). Default timeout is 0 (for forceful + decommission), and the maximum allowed timeout is 1 day. + (see JSON representation of + `Duration `__). + + Only supported on Dataproc image versions 1.2 and higher. + """ + + name: str = proto.Field( + proto.STRING, + number=1, + ) + size: int = proto.Field( + proto.INT32, + number=2, + ) + request_id: str = proto.Field( + proto.STRING, + number=3, + ) + graceful_decommission_timeout: duration_pb2.Duration = proto.Field( + proto.MESSAGE, + number=4, + message=duration_pb2.Duration, + ) + + +class GetNodeGroupRequest(proto.Message): + r"""A request to get a node group . + + Attributes: + name (str): + Required. The name of the node group to retrieve. Format: + ``projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{nodeGroup}`` + """ + + name: str = proto.Field( + proto.STRING, + number=1, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/cloud/dataproc_v1/types/operations.py b/google/cloud/dataproc_v1/types/operations.py index 572f35f9..3b7e353d 100644 --- a/google/cloud/dataproc_v1/types/operations.py +++ b/google/cloud/dataproc_v1/types/operations.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.protobuf import timestamp_pb2 # type: ignore @@ -24,6 +26,7 @@ "BatchOperationMetadata", "ClusterOperationStatus", "ClusterOperationMetadata", + "NodeGroupOperationMetadata", }, ) @@ -44,9 +47,9 @@ class BatchOperationMetadata(proto.Message): The operation type. description (str): Short description of the operation. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Labels associated with the operation. - warnings (Sequence[str]): + warnings (MutableSequence[str]): Warnings encountered during operation execution. """ @@ -56,39 +59,39 @@ class BatchOperationType(proto.Enum): BATCH_OPERATION_TYPE_UNSPECIFIED = 0 BATCH = 1 - batch = proto.Field( + batch: str = proto.Field( proto.STRING, number=1, ) - batch_uuid = proto.Field( + batch_uuid: str = proto.Field( proto.STRING, number=2, ) - create_time = proto.Field( + create_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=3, message=timestamp_pb2.Timestamp, ) - done_time = proto.Field( + done_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=4, message=timestamp_pb2.Timestamp, ) - operation_type = proto.Field( + operation_type: BatchOperationType = proto.Field( proto.ENUM, number=6, enum=BatchOperationType, ) - description = proto.Field( + description: str = proto.Field( proto.STRING, number=7, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=8, ) - warnings = proto.RepeatedField( + warnings: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=9, ) @@ -118,20 +121,20 @@ class State(proto.Enum): RUNNING = 2 DONE = 3 - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=1, enum=State, ) - inner_state = proto.Field( + inner_state: str = proto.Field( proto.STRING, number=2, ) - details = proto.Field( + details: str = proto.Field( proto.STRING, number=3, ) - state_start_time = proto.Field( + state_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=4, message=timestamp_pb2.Timestamp, @@ -149,55 +152,126 @@ class ClusterOperationMetadata(proto.Message): Output only. Cluster UUID for the operation. status (google.cloud.dataproc_v1.types.ClusterOperationStatus): Output only. Current operation status. - status_history (Sequence[google.cloud.dataproc_v1.types.ClusterOperationStatus]): + status_history (MutableSequence[google.cloud.dataproc_v1.types.ClusterOperationStatus]): Output only. The previous operation status. operation_type (str): Output only. The operation type. description (str): Output only. Short description of operation. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Output only. Labels associated with the operation - warnings (Sequence[str]): + warnings (MutableSequence[str]): Output only. Errors encountered during operation execution. """ - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=7, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=8, ) - status = proto.Field( + status: "ClusterOperationStatus" = proto.Field( proto.MESSAGE, number=9, message="ClusterOperationStatus", ) - status_history = proto.RepeatedField( + status_history: MutableSequence["ClusterOperationStatus"] = proto.RepeatedField( proto.MESSAGE, number=10, message="ClusterOperationStatus", ) - operation_type = proto.Field( + operation_type: str = proto.Field( proto.STRING, number=11, ) - description = proto.Field( + description: str = proto.Field( proto.STRING, number=12, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=13, ) - warnings = proto.RepeatedField( + warnings: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=14, ) +class NodeGroupOperationMetadata(proto.Message): + r"""Metadata describing the node group operation. + + Attributes: + node_group_id (str): + Output only. Node group ID for the operation. + cluster_uuid (str): + Output only. Cluster UUID associated with the + node group operation. + status (google.cloud.dataproc_v1.types.ClusterOperationStatus): + Output only. Current operation status. + status_history (MutableSequence[google.cloud.dataproc_v1.types.ClusterOperationStatus]): + Output only. The previous operation status. + operation_type (google.cloud.dataproc_v1.types.NodeGroupOperationMetadata.NodeGroupOperationType): + The operation type. + description (str): + Output only. Short description of operation. + labels (MutableMapping[str, str]): + Output only. Labels associated with the + operation. + warnings (MutableSequence[str]): + Output only. Errors encountered during + operation execution. + """ + + class NodeGroupOperationType(proto.Enum): + r"""Operation type for node group resources.""" + NODE_GROUP_OPERATION_TYPE_UNSPECIFIED = 0 + CREATE = 1 + UPDATE = 2 + DELETE = 3 + RESIZE = 4 + + node_group_id: str = proto.Field( + proto.STRING, + number=1, + ) + cluster_uuid: str = proto.Field( + proto.STRING, + number=2, + ) + status: "ClusterOperationStatus" = proto.Field( + proto.MESSAGE, + number=3, + message="ClusterOperationStatus", + ) + status_history: MutableSequence["ClusterOperationStatus"] = proto.RepeatedField( + proto.MESSAGE, + number=4, + message="ClusterOperationStatus", + ) + operation_type: NodeGroupOperationType = proto.Field( + proto.ENUM, + number=5, + enum=NodeGroupOperationType, + ) + description: str = proto.Field( + proto.STRING, + number=6, + ) + labels: MutableMapping[str, str] = proto.MapField( + proto.STRING, + proto.STRING, + number=7, + ) + warnings: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=8, + ) + + __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/cloud/dataproc_v1/types/shared.py b/google/cloud/dataproc_v1/types/shared.py index e0fd8024..95603a13 100644 --- a/google/cloud/dataproc_v1/types/shared.py +++ b/google/cloud/dataproc_v1/types/shared.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore @@ -72,21 +74,21 @@ class RuntimeConfig(proto.Message): Optional. Optional custom container image for the job runtime environment. If not specified, a default container image will be used. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): Optional. A mapping of property names to values, which are used to configure workload execution. """ - version = proto.Field( + version: str = proto.Field( proto.STRING, number=1, ) - container_image = proto.Field( + container_image: str = proto.Field( proto.STRING, number=2, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=3, @@ -105,12 +107,12 @@ class EnvironmentConfig(proto.Message): workload has access to. """ - execution_config = proto.Field( + execution_config: "ExecutionConfig" = proto.Field( proto.MESSAGE, number=1, message="ExecutionConfig", ) - peripherals_config = proto.Field( + peripherals_config: "PeripheralsConfig" = proto.Field( proto.MESSAGE, number=2, message="PeripheralsConfig", @@ -140,7 +142,7 @@ class ExecutionConfig(proto.Message): to. This field is a member of `oneof`_ ``network``. - network_tags (Sequence[str]): + network_tags (MutableSequence[str]): Optional. Tags used for network traffic control. kms_key (str): @@ -148,25 +150,25 @@ class ExecutionConfig(proto.Message): encryption. """ - service_account = proto.Field( + service_account: str = proto.Field( proto.STRING, number=2, ) - network_uri = proto.Field( + network_uri: str = proto.Field( proto.STRING, number=4, oneof="network", ) - subnetwork_uri = proto.Field( + subnetwork_uri: str = proto.Field( proto.STRING, number=5, oneof="network", ) - network_tags = proto.RepeatedField( + network_tags: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=6, ) - kms_key = proto.Field( + kms_key: str = proto.Field( proto.STRING, number=7, ) @@ -185,7 +187,7 @@ class SparkHistoryServerConfig(proto.Message): - ``projects/[project_id]/regions/[region]/clusters/[cluster_name]`` """ - dataproc_cluster = proto.Field( + dataproc_cluster: str = proto.Field( proto.STRING, number=1, ) @@ -207,11 +209,11 @@ class PeripheralsConfig(proto.Message): configuration for the workload. """ - metastore_service = proto.Field( + metastore_service: str = proto.Field( proto.STRING, number=1, ) - spark_history_server_config = proto.Field( + spark_history_server_config: "SparkHistoryServerConfig" = proto.Field( proto.MESSAGE, number=2, message="SparkHistoryServerConfig", @@ -222,7 +224,7 @@ class RuntimeInfo(proto.Message): r"""Runtime information about workload execution. Attributes: - endpoints (Mapping[str, str]): + endpoints (MutableMapping[str, str]): Output only. Map of remote access endpoints (such as web interfaces and APIs) to their URIs. output_uri (str): @@ -233,16 +235,16 @@ class RuntimeInfo(proto.Message): of the diagnostics tarball. """ - endpoints = proto.MapField( + endpoints: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=1, ) - output_uri = proto.Field( + output_uri: str = proto.Field( proto.STRING, number=2, ) - diagnostic_output_uri = proto.Field( + diagnostic_output_uri: str = proto.Field( proto.STRING, number=3, ) @@ -257,7 +259,7 @@ class GkeClusterConfig(proto.Message): the same project and region as the Dataproc cluster (the GKE cluster can be zonal or regional). Format: 'projects/{project}/locations/{location}/clusters/{cluster_id}' - node_pool_target (Sequence[google.cloud.dataproc_v1.types.GkeNodePoolTarget]): + node_pool_target (MutableSequence[google.cloud.dataproc_v1.types.GkeNodePoolTarget]): Optional. GKE NodePools where workloads will be scheduled. At least one node pool must be assigned the 'default' role. Each role can be @@ -267,11 +269,11 @@ class GkeClusterConfig(proto.Message): constructs a default nodePoolTarget. """ - gke_cluster_target = proto.Field( + gke_cluster_target: str = proto.Field( proto.STRING, number=2, ) - node_pool_target = proto.RepeatedField( + node_pool_target: MutableSequence["GkeNodePoolTarget"] = proto.RepeatedField( proto.MESSAGE, number=3, message="GkeNodePoolTarget", @@ -303,17 +305,17 @@ class KubernetesClusterConfig(proto.Message): Dataproc cluster running on Kubernetes. """ - kubernetes_namespace = proto.Field( + kubernetes_namespace: str = proto.Field( proto.STRING, number=1, ) - gke_cluster_config = proto.Field( + gke_cluster_config: "GkeClusterConfig" = proto.Field( proto.MESSAGE, number=2, oneof="config", message="GkeClusterConfig", ) - kubernetes_software_config = proto.Field( + kubernetes_software_config: "KubernetesSoftwareConfig" = proto.Field( proto.MESSAGE, number=3, message="KubernetesSoftwareConfig", @@ -325,14 +327,14 @@ class KubernetesSoftwareConfig(proto.Message): on Kubernetes. Attributes: - component_version (Mapping[str, str]): + component_version (MutableMapping[str, str]): The components that should be installed in this Dataproc cluster. The key must be a string from the KubernetesComponent enumeration. The value is the version of the software to be installed. At least one entry must be specified. - properties (Mapping[str, str]): + properties (MutableMapping[str, str]): The properties to set on daemon config files. Property keys are specified in ``prefix:property`` format, @@ -345,12 +347,12 @@ class KubernetesSoftwareConfig(proto.Message): properties `__. """ - component_version = proto.MapField( + component_version: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=1, ) - properties = proto.MapField( + properties: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=2, @@ -364,7 +366,7 @@ class GkeNodePoolTarget(proto.Message): node_pool (str): Required. The target GKE NodePool. Format: 'projects/{project}/locations/{location}/clusters/{cluster}/nodePools/{node_pool}' - roles (Sequence[google.cloud.dataproc_v1.types.GkeNodePoolTarget.Role]): + roles (MutableSequence[google.cloud.dataproc_v1.types.GkeNodePoolTarget.Role]): Required. The types of role for a GKE NodePool node_pool_config (google.cloud.dataproc_v1.types.GkeNodePoolConfig): @@ -394,16 +396,16 @@ class Role(proto.Enum): SPARK_DRIVER = 3 SPARK_EXECUTOR = 4 - node_pool = proto.Field( + node_pool: str = proto.Field( proto.STRING, number=1, ) - roles = proto.RepeatedField( + roles: MutableSequence[Role] = proto.RepeatedField( proto.ENUM, number=2, enum=Role, ) - node_pool_config = proto.Field( + node_pool_config: "GkeNodePoolConfig" = proto.Field( proto.MESSAGE, number=3, message="GkeNodePoolConfig", @@ -417,7 +419,7 @@ class GkeNodePoolConfig(proto.Message): Attributes: config (google.cloud.dataproc_v1.types.GkeNodePoolConfig.GkeNodeConfig): Optional. The node pool configuration. - locations (Sequence[str]): + locations (MutableSequence[str]): Optional. The list of Compute Engine `zones `__ where NodePool's nodes will be located. @@ -447,7 +449,7 @@ class GkeNodeConfig(proto.Message): node, which is limited by the maximum number of disks allowable per zone (see `Adding Local SSDs `__). - accelerators (Sequence[google.cloud.dataproc_v1.types.GkeNodePoolConfig.GkeNodePoolAcceleratorConfig]): + accelerators (MutableSequence[google.cloud.dataproc_v1.types.GkeNodePoolConfig.GkeNodePoolAcceleratorConfig]): Optional. A list of `hardware accelerators `__ to attach to each node. @@ -460,24 +462,26 @@ class GkeNodeConfig(proto.Message): or Intel Sandy Bridge". """ - machine_type = proto.Field( + machine_type: str = proto.Field( proto.STRING, number=1, ) - preemptible = proto.Field( + preemptible: bool = proto.Field( proto.BOOL, number=10, ) - local_ssd_count = proto.Field( + local_ssd_count: int = proto.Field( proto.INT32, number=7, ) - accelerators = proto.RepeatedField( + accelerators: MutableSequence[ + "GkeNodePoolConfig.GkeNodePoolAcceleratorConfig" + ] = proto.RepeatedField( proto.MESSAGE, number=11, message="GkeNodePoolConfig.GkeNodePoolAcceleratorConfig", ) - min_cpu_platform = proto.Field( + min_cpu_platform: str = proto.Field( proto.STRING, number=13, ) @@ -495,11 +499,11 @@ class GkeNodePoolAcceleratorConfig(proto.Message): GPUs on Compute Engine). """ - accelerator_count = proto.Field( + accelerator_count: int = proto.Field( proto.INT64, number=1, ) - accelerator_type = proto.Field( + accelerator_type: str = proto.Field( proto.STRING, number=2, ) @@ -519,25 +523,25 @@ class GkeNodePoolAutoscalingConfig(proto.Message): up the cluster. """ - min_node_count = proto.Field( + min_node_count: int = proto.Field( proto.INT32, number=2, ) - max_node_count = proto.Field( + max_node_count: int = proto.Field( proto.INT32, number=3, ) - config = proto.Field( + config: GkeNodeConfig = proto.Field( proto.MESSAGE, number=2, message=GkeNodeConfig, ) - locations = proto.RepeatedField( + locations: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=13, ) - autoscaling = proto.Field( + autoscaling: GkeNodePoolAutoscalingConfig = proto.Field( proto.MESSAGE, number=4, message=GkeNodePoolAutoscalingConfig, diff --git a/google/cloud/dataproc_v1/types/workflow_templates.py b/google/cloud/dataproc_v1/types/workflow_templates.py index 17bff61c..08ec9eda 100644 --- a/google/cloud/dataproc_v1/types/workflow_templates.py +++ b/google/cloud/dataproc_v1/types/workflow_templates.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.cloud.dataproc_v1.types import clusters @@ -84,7 +86,7 @@ class WorkflowTemplate(proto.Message): update_time (google.protobuf.timestamp_pb2.Timestamp): Output only. The time template was last updated. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this template. These labels will be propagated to all jobs and clusters created by the workflow instance. @@ -101,10 +103,10 @@ class WorkflowTemplate(proto.Message): placement (google.cloud.dataproc_v1.types.WorkflowTemplatePlacement): Required. WorkflowTemplate scheduling information. - jobs (Sequence[google.cloud.dataproc_v1.types.OrderedJob]): + jobs (MutableSequence[google.cloud.dataproc_v1.types.OrderedJob]): Required. The Directed Acyclic Graph of Jobs to submit. - parameters (Sequence[google.cloud.dataproc_v1.types.TemplateParameter]): + parameters (MutableSequence[google.cloud.dataproc_v1.types.TemplateParameter]): Optional. Template parameters whose values are substituted into the template. Values for parameters must be provided when the template is @@ -123,49 +125,49 @@ class WorkflowTemplate(proto.Message): the cluster is deleted. """ - id = proto.Field( + id: str = proto.Field( proto.STRING, number=2, ) - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - version = proto.Field( + version: int = proto.Field( proto.INT32, number=3, ) - create_time = proto.Field( + create_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=4, message=timestamp_pb2.Timestamp, ) - update_time = proto.Field( + update_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=5, message=timestamp_pb2.Timestamp, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=6, ) - placement = proto.Field( + placement: "WorkflowTemplatePlacement" = proto.Field( proto.MESSAGE, number=7, message="WorkflowTemplatePlacement", ) - jobs = proto.RepeatedField( + jobs: MutableSequence["OrderedJob"] = proto.RepeatedField( proto.MESSAGE, number=8, message="OrderedJob", ) - parameters = proto.RepeatedField( + parameters: MutableSequence["TemplateParameter"] = proto.RepeatedField( proto.MESSAGE, number=9, message="TemplateParameter", ) - dag_timeout = proto.Field( + dag_timeout: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=10, message=duration_pb2.Duration, @@ -199,13 +201,13 @@ class WorkflowTemplatePlacement(proto.Message): This field is a member of `oneof`_ ``placement``. """ - managed_cluster = proto.Field( + managed_cluster: "ManagedCluster" = proto.Field( proto.MESSAGE, number=1, oneof="placement", message="ManagedCluster", ) - cluster_selector = proto.Field( + cluster_selector: "ClusterSelector" = proto.Field( proto.MESSAGE, number=2, oneof="placement", @@ -228,7 +230,7 @@ class ManagedCluster(proto.Message): characters. config (google.cloud.dataproc_v1.types.ClusterConfig): Required. The cluster configuration. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this cluster. Label keys must be between 1 and 63 characters long, and @@ -243,16 +245,16 @@ class ManagedCluster(proto.Message): cluster. """ - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=2, ) - config = proto.Field( + config: clusters.ClusterConfig = proto.Field( proto.MESSAGE, number=3, message=clusters.ClusterConfig, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=4, @@ -270,16 +272,16 @@ class ClusterSelector(proto.Message): selection of the cluster. If unspecified, the zone of the first cluster matching the selector is used. - cluster_labels (Mapping[str, str]): + cluster_labels (MutableMapping[str, str]): Required. The cluster labels. Cluster must have all labels to match. """ - zone = proto.Field( + zone: str = proto.Field( proto.STRING, number=1, ) - cluster_labels = proto.MapField( + cluster_labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=2, @@ -342,7 +344,7 @@ class OrderedJob(proto.Message): Optional. Job is a Presto job. This field is a member of `oneof`_ ``job_type``. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): Optional. The labels to associate with this job. Label keys must be between 1 and 63 characters long, and @@ -356,75 +358,75 @@ class OrderedJob(proto.Message): No more than 32 labels can be associated with a given job. scheduling (google.cloud.dataproc_v1.types.JobScheduling): Optional. Job scheduling configuration. - prerequisite_step_ids (Sequence[str]): + prerequisite_step_ids (MutableSequence[str]): Optional. The optional list of prerequisite job step_ids. If not specified, the job will start at the beginning of workflow. """ - step_id = proto.Field( + step_id: str = proto.Field( proto.STRING, number=1, ) - hadoop_job = proto.Field( + hadoop_job: gcd_jobs.HadoopJob = proto.Field( proto.MESSAGE, number=2, oneof="job_type", message=gcd_jobs.HadoopJob, ) - spark_job = proto.Field( + spark_job: gcd_jobs.SparkJob = proto.Field( proto.MESSAGE, number=3, oneof="job_type", message=gcd_jobs.SparkJob, ) - pyspark_job = proto.Field( + pyspark_job: gcd_jobs.PySparkJob = proto.Field( proto.MESSAGE, number=4, oneof="job_type", message=gcd_jobs.PySparkJob, ) - hive_job = proto.Field( + hive_job: gcd_jobs.HiveJob = proto.Field( proto.MESSAGE, number=5, oneof="job_type", message=gcd_jobs.HiveJob, ) - pig_job = proto.Field( + pig_job: gcd_jobs.PigJob = proto.Field( proto.MESSAGE, number=6, oneof="job_type", message=gcd_jobs.PigJob, ) - spark_r_job = proto.Field( + spark_r_job: gcd_jobs.SparkRJob = proto.Field( proto.MESSAGE, number=11, oneof="job_type", message=gcd_jobs.SparkRJob, ) - spark_sql_job = proto.Field( + spark_sql_job: gcd_jobs.SparkSqlJob = proto.Field( proto.MESSAGE, number=7, oneof="job_type", message=gcd_jobs.SparkSqlJob, ) - presto_job = proto.Field( + presto_job: gcd_jobs.PrestoJob = proto.Field( proto.MESSAGE, number=12, oneof="job_type", message=gcd_jobs.PrestoJob, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=8, ) - scheduling = proto.Field( + scheduling: gcd_jobs.JobScheduling = proto.Field( proto.MESSAGE, number=9, message=gcd_jobs.JobScheduling, ) - prerequisite_step_ids = proto.RepeatedField( + prerequisite_step_ids: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=10, ) @@ -449,7 +451,7 @@ class TemplateParameter(proto.Message): must contain only capital letters (A-Z), numbers (0-9), and underscores (_), and must not start with a number. The maximum length is 40 characters. - fields (Sequence[str]): + fields (MutableSequence[str]): Required. Paths to all fields that the parameter replaces. A field is allowed to appear in at most one parameter's list of field paths. @@ -509,19 +511,19 @@ class TemplateParameter(proto.Message): this parameter's value. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - fields = proto.RepeatedField( + fields: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - description = proto.Field( + description: str = proto.Field( proto.STRING, number=3, ) - validation = proto.Field( + validation: "ParameterValidation" = proto.Field( proto.MESSAGE, number=4, message="ParameterValidation", @@ -549,13 +551,13 @@ class ParameterValidation(proto.Message): This field is a member of `oneof`_ ``validation_type``. """ - regex = proto.Field( + regex: "RegexValidation" = proto.Field( proto.MESSAGE, number=1, oneof="validation_type", message="RegexValidation", ) - values = proto.Field( + values: "ValueValidation" = proto.Field( proto.MESSAGE, number=2, oneof="validation_type", @@ -567,14 +569,14 @@ class RegexValidation(proto.Message): r"""Validation based on regular expressions. Attributes: - regexes (Sequence[str]): + regexes (MutableSequence[str]): Required. RE2 regular expressions used to validate the parameter's value. The value must match the regex in its entirety (substring matches are not sufficient). """ - regexes = proto.RepeatedField( + regexes: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=1, ) @@ -584,12 +586,12 @@ class ValueValidation(proto.Message): r"""Validation based on a list of allowed values. Attributes: - values (Sequence[str]): + values (MutableSequence[str]): Required. List of allowed values for the parameter. """ - values = proto.RepeatedField( + values: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=1, ) @@ -626,7 +628,7 @@ class WorkflowMetadata(proto.Message): Output only. The workflow state. cluster_name (str): Output only. The name of the target cluster. - parameters (Mapping[str, str]): + parameters (MutableMapping[str, str]): Map from parameter names to values that were used for those parameters. start_time (google.protobuf.timestamp_pb2.Timestamp): @@ -656,68 +658,68 @@ class State(proto.Enum): RUNNING = 2 DONE = 3 - template = proto.Field( + template: str = proto.Field( proto.STRING, number=1, ) - version = proto.Field( + version: int = proto.Field( proto.INT32, number=2, ) - create_cluster = proto.Field( + create_cluster: "ClusterOperation" = proto.Field( proto.MESSAGE, number=3, message="ClusterOperation", ) - graph = proto.Field( + graph: "WorkflowGraph" = proto.Field( proto.MESSAGE, number=4, message="WorkflowGraph", ) - delete_cluster = proto.Field( + delete_cluster: "ClusterOperation" = proto.Field( proto.MESSAGE, number=5, message="ClusterOperation", ) - state = proto.Field( + state: State = proto.Field( proto.ENUM, number=6, enum=State, ) - cluster_name = proto.Field( + cluster_name: str = proto.Field( proto.STRING, number=7, ) - parameters = proto.MapField( + parameters: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=8, ) - start_time = proto.Field( + start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=9, message=timestamp_pb2.Timestamp, ) - end_time = proto.Field( + end_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=10, message=timestamp_pb2.Timestamp, ) - cluster_uuid = proto.Field( + cluster_uuid: str = proto.Field( proto.STRING, number=11, ) - dag_timeout = proto.Field( + dag_timeout: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=12, message=duration_pb2.Duration, ) - dag_start_time = proto.Field( + dag_start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=13, message=timestamp_pb2.Timestamp, ) - dag_end_time = proto.Field( + dag_end_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=14, message=timestamp_pb2.Timestamp, @@ -736,15 +738,15 @@ class ClusterOperation(proto.Message): Output only. Indicates the operation is done. """ - operation_id = proto.Field( + operation_id: str = proto.Field( proto.STRING, number=1, ) - error = proto.Field( + error: str = proto.Field( proto.STRING, number=2, ) - done = proto.Field( + done: bool = proto.Field( proto.BOOL, number=3, ) @@ -754,11 +756,11 @@ class WorkflowGraph(proto.Message): r"""The workflow graph. Attributes: - nodes (Sequence[google.cloud.dataproc_v1.types.WorkflowNode]): + nodes (MutableSequence[google.cloud.dataproc_v1.types.WorkflowNode]): Output only. The workflow nodes. """ - nodes = proto.RepeatedField( + nodes: MutableSequence["WorkflowNode"] = proto.RepeatedField( proto.MESSAGE, number=1, message="WorkflowNode", @@ -771,7 +773,7 @@ class WorkflowNode(proto.Message): Attributes: step_id (str): Output only. The name of the node. - prerequisite_step_ids (Sequence[str]): + prerequisite_step_ids (MutableSequence[str]): Output only. Node's prerequisite nodes. job_id (str): Output only. The job id; populated after the @@ -791,24 +793,24 @@ class NodeState(proto.Enum): COMPLETED = 4 FAILED = 5 - step_id = proto.Field( + step_id: str = proto.Field( proto.STRING, number=1, ) - prerequisite_step_ids = proto.RepeatedField( + prerequisite_step_ids: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - job_id = proto.Field( + job_id: str = proto.Field( proto.STRING, number=3, ) - state = proto.Field( + state: NodeState = proto.Field( proto.ENUM, number=5, enum=NodeState, ) - error = proto.Field( + error: str = proto.Field( proto.STRING, number=6, ) @@ -835,11 +837,11 @@ class CreateWorkflowTemplateRequest(proto.Message): create. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - template = proto.Field( + template: "WorkflowTemplate" = proto.Field( proto.MESSAGE, number=2, message="WorkflowTemplate", @@ -869,11 +871,11 @@ class GetWorkflowTemplateRequest(proto.Message): If unspecified, retrieves the current version. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - version = proto.Field( + version: int = proto.Field( proto.INT32, number=2, ) @@ -915,25 +917,25 @@ class InstantiateWorkflowTemplateRequest(proto.Message): The tag must contain only letters (a-z, A-Z), numbers (0-9), underscores (_), and hyphens (-). The maximum length is 40 characters. - parameters (Mapping[str, str]): + parameters (MutableMapping[str, str]): Optional. Map from parameter names to values that should be used for those parameters. Values may not exceed 1000 characters. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - version = proto.Field( + version: int = proto.Field( proto.INT32, number=2, ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=5, ) - parameters = proto.MapField( + parameters: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=6, @@ -974,16 +976,16 @@ class InstantiateInlineWorkflowTemplateRequest(proto.Message): characters. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - template = proto.Field( + template: "WorkflowTemplate" = proto.Field( proto.MESSAGE, number=2, message="WorkflowTemplate", ) - request_id = proto.Field( + request_id: str = proto.Field( proto.STRING, number=3, ) @@ -1000,7 +1002,7 @@ class UpdateWorkflowTemplateRequest(proto.Message): version. """ - template = proto.Field( + template: "WorkflowTemplate" = proto.Field( proto.MESSAGE, number=1, message="WorkflowTemplate", @@ -1032,15 +1034,15 @@ class ListWorkflowTemplatesRequest(proto.Message): results. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) @@ -1051,7 +1053,7 @@ class ListWorkflowTemplatesResponse(proto.Message): project. Attributes: - templates (Sequence[google.cloud.dataproc_v1.types.WorkflowTemplate]): + templates (MutableSequence[google.cloud.dataproc_v1.types.WorkflowTemplate]): Output only. WorkflowTemplates list. next_page_token (str): Output only. This token is included in the response if there @@ -1064,12 +1066,12 @@ class ListWorkflowTemplatesResponse(proto.Message): def raw_page(self): return self - templates = proto.RepeatedField( + templates: MutableSequence["WorkflowTemplate"] = proto.RepeatedField( proto.MESSAGE, number=1, message="WorkflowTemplate", ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) @@ -1100,11 +1102,11 @@ class DeleteWorkflowTemplateRequest(proto.Message): specified version. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - version = proto.Field( + version: int = proto.Field( proto.INT32, number=2, ) diff --git a/owlbot.py b/owlbot.py index a68f29df..29f936a1 100644 --- a/owlbot.py +++ b/owlbot.py @@ -1,4 +1,4 @@ -# Copyright 2018 Google LLC +# Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,47 +12,50 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""This script is used to synthesize generated parts of this library.""" - -import re +import json +from pathlib import Path +import shutil import synthtool as s -from synthtool import gcp +import synthtool.gcp as gcp from synthtool.languages import python -common = gcp.CommonTemplates() +# ---------------------------------------------------------------------------- +# Copy the generated client from the owl-bot staging directory +# ---------------------------------------------------------------------------- + +clean_up_generated_samples = True -default_version = "v1" +# Load the default version defined in .repo-metadata.json. +default_version = json.load(open(".repo-metadata.json", "rt")).get( + "default_version" +) for library in s.get_staging_dirs(default_version): - # Rename `policy_` to `policy` to avoid breaking change in a GA library - # Only replace if a non-alphanumeric (\W) character follows `policy_` - s.replace(library / "**/*.py", "policy_(\W)", "policy\g<1>") - - s.move(library, excludes=["docs/index.rst", "nox.py", "README.rst", "setup.py"]) + if clean_up_generated_samples: + shutil.rmtree("samples/generated_samples", ignore_errors=True) + clean_up_generated_samples = False + s.move(library, excludes=["**/gapic_version.py"]) s.remove_staging_dirs() # ---------------------------------------------------------------------------- # Add templated files # ---------------------------------------------------------------------------- -templated_files = common.py_library( - samples=True, # set to True only if there are samples + +templated_files = gcp.CommonTemplates().py_library( + cov_level=100, microgenerator=True, - cov_level=100 + versions=gcp.common.detect_versions(path="./google", default_first=True), ) -s.move(templated_files, excludes=[".coveragerc"]) # microgenerator has a good .coveragerc file +s.move(templated_files, excludes=[".coveragerc", ".github/release-please.yml"]) -# ---------------------------------------------------------------------------- -# Samples templates -# ---------------------------------------------------------------------------- python.py_samples(skip_readmes=True) -python.configure_previous_major_version_branches() - # Temporarily disable warnings due to # https://github.com/googleapis/gapic-generator-python/issues/525 s.replace("noxfile.py", '[\"\']-W[\"\']', '# "-W"') -s.shell.run(["nox", "-s", "blacken"], hide_output=False) - +# run format session for all directories which have a noxfile +for noxfile in Path(".").glob("**/noxfile.py"): + s.shell.run(["nox", "-s", "blacken"], cwd=noxfile.parent, hide_output=False) diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 00000000..4088aad7 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "python", + "extra-files": [ + "google/cloud/dataproc_v1/gapic_version.py", + "google/cloud/dataproc/gapic_version.py", + { + "type": "json", + "path": "samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json", + "jsonpath": "$.clientLibrary.version" + } + ] + } + }, + "release-type": "python", + "plugins": [ + { + "type": "sentence-case" + } + ], + "initial-version": "0.1.0" +} diff --git a/samples/generated_samples/dataproc_v1_generated_batch_controller_create_batch_async.py b/samples/generated_samples/dataproc_v1_generated_batch_controller_create_batch_async.py index 6ddc2433..3fccbdb6 100644 --- a/samples/generated_samples/dataproc_v1_generated_batch_controller_create_batch_async.py +++ b/samples/generated_samples/dataproc_v1_generated_batch_controller_create_batch_async.py @@ -52,7 +52,7 @@ async def sample_create_batch(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_create_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_create_cluster_async.py index 02a47541..959706a7 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_create_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_create_cluster_async.py @@ -54,7 +54,7 @@ async def sample_create_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_delete_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_delete_cluster_async.py index 45efb13d..2bb27e4b 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_delete_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_delete_cluster_async.py @@ -50,7 +50,7 @@ async def sample_delete_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_diagnose_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_diagnose_cluster_async.py index 4ad32f03..262d0214 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_diagnose_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_diagnose_cluster_async.py @@ -50,7 +50,7 @@ async def sample_diagnose_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_start_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_start_cluster_async.py index 4d765d83..c422a025 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_start_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_start_cluster_async.py @@ -50,7 +50,7 @@ async def sample_start_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_stop_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_stop_cluster_async.py index 9e998bcc..d1c16454 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_stop_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_stop_cluster_async.py @@ -50,7 +50,7 @@ async def sample_stop_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_cluster_controller_update_cluster_async.py b/samples/generated_samples/dataproc_v1_generated_cluster_controller_update_cluster_async.py index 2452f5ea..1408ebe0 100644 --- a/samples/generated_samples/dataproc_v1_generated_cluster_controller_update_cluster_async.py +++ b/samples/generated_samples/dataproc_v1_generated_cluster_controller_update_cluster_async.py @@ -55,7 +55,7 @@ async def sample_update_cluster(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_job_controller_submit_job_as_operation_async.py b/samples/generated_samples/dataproc_v1_generated_job_controller_submit_job_as_operation_async.py index e9924188..215bafca 100644 --- a/samples/generated_samples/dataproc_v1_generated_job_controller_submit_job_as_operation_async.py +++ b/samples/generated_samples/dataproc_v1_generated_job_controller_submit_job_as_operation_async.py @@ -54,7 +54,7 @@ async def sample_submit_job_as_operation(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_async.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_async.py new file mode 100644 index 00000000..8898bc64 --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_async.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for CreateNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_CreateNodeGroup_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +async def sample_create_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + node_group = dataproc_v1.NodeGroup() + node_group.roles = ['DRIVER'] + + request = dataproc_v1.CreateNodeGroupRequest( + parent="parent_value", + node_group=node_group, + ) + + # Make the request + operation = client.create_node_group(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_CreateNodeGroup_async] diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_sync.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_sync.py new file mode 100644 index 00000000..584705f4 --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_create_node_group_sync.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for CreateNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_CreateNodeGroup_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +def sample_create_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + node_group = dataproc_v1.NodeGroup() + node_group.roles = ['DRIVER'] + + request = dataproc_v1.CreateNodeGroupRequest( + parent="parent_value", + node_group=node_group, + ) + + # Make the request + operation = client.create_node_group(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_CreateNodeGroup_sync] diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_async.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_async.py new file mode 100644 index 00000000..27249c74 --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_async.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for GetNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_GetNodeGroup_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +async def sample_get_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + request = dataproc_v1.GetNodeGroupRequest( + name="name_value", + ) + + # Make the request + response = await client.get_node_group(request=request) + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_GetNodeGroup_async] diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_sync.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_sync.py new file mode 100644 index 00000000..cb232497 --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_get_node_group_sync.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for GetNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_GetNodeGroup_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +def sample_get_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + request = dataproc_v1.GetNodeGroupRequest( + name="name_value", + ) + + # Make the request + response = client.get_node_group(request=request) + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_GetNodeGroup_sync] diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_async.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_async.py new file mode 100644 index 00000000..cbf2188d --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_async.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for ResizeNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +async def sample_resize_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerAsyncClient() + + # Initialize request argument(s) + request = dataproc_v1.ResizeNodeGroupRequest( + name="name_value", + size=443, + ) + + # Make the request + operation = client.resize_node_group(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_async] diff --git a/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_sync.py b/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_sync.py new file mode 100644 index 00000000..6a7f7616 --- /dev/null +++ b/samples/generated_samples/dataproc_v1_generated_node_group_controller_resize_node_group_sync.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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 code. DO NOT EDIT! +# +# Snippet for ResizeNodeGroup +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-dataproc + + +# [START dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import dataproc_v1 + + +def sample_resize_node_group(): + # Create a client + client = dataproc_v1.NodeGroupControllerClient() + + # Initialize request argument(s) + request = dataproc_v1.ResizeNodeGroupRequest( + name="name_value", + size=443, + ) + + # Make the request + operation = client.resize_node_group(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + +# [END dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_sync] diff --git a/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_inline_workflow_template_async.py b/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_inline_workflow_template_async.py index aa8120f3..74181006 100644 --- a/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_inline_workflow_template_async.py +++ b/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_inline_workflow_template_async.py @@ -55,7 +55,7 @@ async def sample_instantiate_inline_workflow_template(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_workflow_template_async.py b/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_workflow_template_async.py index 50cf5b45..d54d6904 100644 --- a/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_workflow_template_async.py +++ b/samples/generated_samples/dataproc_v1_generated_workflow_template_service_instantiate_workflow_template_async.py @@ -48,7 +48,7 @@ async def sample_instantiate_workflow_template(): print("Waiting for operation to complete...") - response = await operation.result() + response = (await operation).result() # Handle the response print(response) diff --git a/samples/generated_samples/snippet_metadata_dataproc_v1.json b/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json similarity index 91% rename from samples/generated_samples/snippet_metadata_dataproc_v1.json rename to samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json index 58a3fe7c..f1a48076 100644 --- a/samples/generated_samples/snippet_metadata_dataproc_v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json @@ -7,7 +7,8 @@ } ], "language": "PYTHON", - "name": "google-cloud-dataproc" + "name": "google-cloud-dataproc", + "version": "0.1.0" }, "snippets": [ { @@ -4064,6 +4065,513 @@ ], "title": "dataproc_v1_generated_job_controller_update_job_sync.py" }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient", + "shortName": "NodeGroupControllerAsyncClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient.create_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.CreateNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "CreateNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.CreateNodeGroupRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "node_group", + "type": "google.cloud.dataproc_v1.types.NodeGroup" + }, + { + "name": "node_group_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "create_node_group" + }, + "description": "Sample for CreateNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_create_node_group_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_CreateNodeGroup_async", + "segments": [ + { + "end": 59, + "start": 27, + "type": "FULL" + }, + { + "end": 59, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 49, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 56, + "start": 50, + "type": "REQUEST_EXECUTION" + }, + { + "end": 60, + "start": 57, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_create_node_group_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient", + "shortName": "NodeGroupControllerClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient.create_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.CreateNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "CreateNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.CreateNodeGroupRequest" + }, + { + "name": "parent", + "type": "str" + }, + { + "name": "node_group", + "type": "google.cloud.dataproc_v1.types.NodeGroup" + }, + { + "name": "node_group_id", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "create_node_group" + }, + "description": "Sample for CreateNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_create_node_group_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_CreateNodeGroup_sync", + "segments": [ + { + "end": 59, + "start": 27, + "type": "FULL" + }, + { + "end": 59, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 49, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 56, + "start": 50, + "type": "REQUEST_EXECUTION" + }, + { + "end": 60, + "start": 57, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_create_node_group_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient", + "shortName": "NodeGroupControllerAsyncClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient.get_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.GetNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "GetNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.GetNodeGroupRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.dataproc_v1.types.NodeGroup", + "shortName": "get_node_group" + }, + "description": "Sample for GetNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_get_node_group_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_GetNodeGroup_async", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_get_node_group_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient", + "shortName": "NodeGroupControllerClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient.get_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.GetNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "GetNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.GetNodeGroupRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.dataproc_v1.types.NodeGroup", + "shortName": "get_node_group" + }, + "description": "Sample for GetNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_get_node_group_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_GetNodeGroup_sync", + "segments": [ + { + "end": 51, + "start": 27, + "type": "FULL" + }, + { + "end": 51, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 45, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 48, + "start": 46, + "type": "REQUEST_EXECUTION" + }, + { + "end": 52, + "start": 49, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_get_node_group_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient", + "shortName": "NodeGroupControllerAsyncClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerAsyncClient.resize_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.ResizeNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "ResizeNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.ResizeNodeGroupRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "resize_node_group" + }, + "description": "Sample for ResizeNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_resize_node_group_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_async", + "segments": [ + { + "end": 56, + "start": 27, + "type": "FULL" + }, + { + "end": 56, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 53, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 57, + "start": 54, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_resize_node_group_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient", + "shortName": "NodeGroupControllerClient" + }, + "fullName": "google.cloud.dataproc_v1.NodeGroupControllerClient.resize_node_group", + "method": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController.ResizeNodeGroup", + "service": { + "fullName": "google.cloud.dataproc.v1.NodeGroupController", + "shortName": "NodeGroupController" + }, + "shortName": "ResizeNodeGroup" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.dataproc_v1.types.ResizeNodeGroupRequest" + }, + { + "name": "name", + "type": "str" + }, + { + "name": "size", + "type": "int" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "resize_node_group" + }, + "description": "Sample for ResizeNodeGroup", + "file": "dataproc_v1_generated_node_group_controller_resize_node_group_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "dataproc_v1_generated_NodeGroupController_ResizeNodeGroup_sync", + "segments": [ + { + "end": 56, + "start": 27, + "type": "FULL" + }, + { + "end": 56, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 53, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 57, + "start": 54, + "type": "RESPONSE_HANDLING" + } + ], + "title": "dataproc_v1_generated_node_group_controller_resize_node_group_sync.py" + }, { "canonical": true, "clientMethod": { @@ -4746,7 +5254,7 @@ }, { "name": "parameters", - "type": "Mapping[str, str]" + "type": "MutableMapping[str, str]" }, { "name": "retry", @@ -4830,7 +5338,7 @@ }, { "name": "parameters", - "type": "Mapping[str, str]" + "type": "MutableMapping[str, str]" }, { "name": "retry", diff --git a/scripts/fixup_dataproc_v1_keywords.py b/scripts/fixup_dataproc_v1_keywords.py index 15acbb36..64ed85f6 100644 --- a/scripts/fixup_dataproc_v1_keywords.py +++ b/scripts/fixup_dataproc_v1_keywords.py @@ -43,6 +43,7 @@ class dataprocCallTransformer(cst.CSTTransformer): 'create_autoscaling_policy': ('parent', 'policy', ), 'create_batch': ('parent', 'batch', 'batch_id', 'request_id', ), 'create_cluster': ('project_id', 'region', 'cluster', 'request_id', 'action_on_failed_primary_workers', ), + 'create_node_group': ('parent', 'node_group', 'node_group_id', 'request_id', ), 'create_workflow_template': ('parent', 'template', ), 'delete_autoscaling_policy': ('name', ), 'delete_batch': ('name', ), @@ -54,6 +55,7 @@ class dataprocCallTransformer(cst.CSTTransformer): 'get_batch': ('name', ), 'get_cluster': ('project_id', 'region', 'cluster_name', ), 'get_job': ('project_id', 'region', 'job_id', ), + 'get_node_group': ('name', ), 'get_workflow_template': ('name', 'version', ), 'instantiate_inline_workflow_template': ('parent', 'template', 'request_id', ), 'instantiate_workflow_template': ('name', 'version', 'request_id', 'parameters', ), @@ -62,6 +64,7 @@ class dataprocCallTransformer(cst.CSTTransformer): 'list_clusters': ('project_id', 'region', 'filter', 'page_size', 'page_token', ), 'list_jobs': ('project_id', 'region', 'page_size', 'page_token', 'cluster_name', 'job_state_matcher', 'filter', ), 'list_workflow_templates': ('parent', 'page_size', 'page_token', ), + 'resize_node_group': ('name', 'size', 'request_id', 'graceful_decommission_timeout', ), 'start_cluster': ('project_id', 'region', 'cluster_name', 'cluster_uuid', 'request_id', ), 'stop_cluster': ('project_id', 'region', 'cluster_name', 'cluster_uuid', 'request_id', ), 'submit_job': ('project_id', 'region', 'job', 'request_id', ), diff --git a/setup.py b/setup.py index 38af9291..0aa8585d 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,5 @@ -# Copyright 2018 Google LLC +# -*- coding: utf-8 -*- +# Copyright 2022 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,32 +12,35 @@ # 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. - +# import io import os -import setuptools +import setuptools # type: ignore - -# Package metadata. +package_root = os.path.abspath(os.path.dirname(__file__)) name = "google-cloud-dataproc" + + description = "Google Cloud Dataproc API client library" -version = "5.0.3" -# Should be one of: -# 'Development Status :: 3 - Alpha' -# 'Development Status :: 4 - Beta' -# 'Development Status :: 5 - Production/Stable' -release_status = "Development Status :: 5 - Production/Stable" + +version = {} +with open(os.path.join(package_root, "google/cloud/dataproc/gapic_version.py")) as fp: + exec(fp.read(), version) +version = version["__version__"] + +if version[0] == "0": + release_status = "Development Status :: 4 - Beta" +else: + release_status = "Development Status :: 5 - Production/Stable" + dependencies = [ - "google-api-core[grpc] >= 1.32.0, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*", + "google-api-core[grpc] >= 1.34.0, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", "proto-plus >= 1.22.0, <2.0.0dev", "protobuf>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", ] -extras = {"libcst": "libcst >= 0.2.5"} - - -# Setup boilerplate below this line. +url = "https://github.com/googleapis/python-dataproc" package_root = os.path.abspath(os.path.dirname(__file__)) @@ -44,20 +48,16 @@ with io.open(readme_filename, encoding="utf-8") as readme_file: readme = readme_file.read() -# Only include packages under the 'google' namespace. Do not include tests, -# benchmarks, etc. packages = [ package for package in setuptools.PEP420PackageFinder.find() if package.startswith("google") ] -# Determine which namespaces are needed. namespaces = ["google"] if "google.cloud" in packages: namespaces.append("google.cloud") - setuptools.setup( name=name, version=version, @@ -66,7 +66,7 @@ author="Google LLC", author_email="googleapis-packages@google.com", license="Apache 2.0", - url="iframe.php?url=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-dataproc", + url=url, classifiers=[ release_status, "Intended Audience :: Developers", @@ -82,13 +82,9 @@ ], platforms="Posix; MacOS X; Windows", packages=packages, + python_requires=">=3.7", namespace_packages=namespaces, install_requires=dependencies, - extras_require=extras, - python_requires=">=3.7", - scripts=[ - "scripts/fixup_dataproc_v1_keywords.py", - ], include_package_data=True, zip_safe=False, ) diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index e69de29b..ed7f9aed 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index e69de29b..ed7f9aed 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index 12b4d142..6c44adfe 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -1,11 +1,9 @@ # This constraints file is used to check that lower bounds # are correct in setup.py -# List *all* library dependencies and extras in this file. +# List all library dependencies and extras in this file. # Pin the version to the lower bound. -# -# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", -# Then this file should have foo==1.14.0 -google-api-core==1.32.0 -libcst==0.2.5 +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", +# Then this file should have google-cloud-foo==1.14.0 +google-api-core==1.34.0 proto-plus==1.22.0 protobuf==3.19.5 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt index e69de29b..ed7f9aed 100644 --- a/testing/constraints-3.8.txt +++ b/testing/constraints-3.8.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index e69de29b..ed7f9aed 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/tests/unit/gapic/dataproc_v1/test_cluster_controller.py b/tests/unit/gapic/dataproc_v1/test_cluster_controller.py index 2444b55e..dbb07acb 100644 --- a/tests/unit/gapic/dataproc_v1/test_cluster_controller.py +++ b/tests/unit/gapic/dataproc_v1/test_cluster_controller.py @@ -53,6 +53,7 @@ from google.longrunning import operations_pb2 from google.oauth2 import service_account from google.protobuf import duration_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore from google.protobuf import field_mask_pb2 # type: ignore from google.protobuf import timestamp_pb2 # type: ignore import google.auth @@ -3257,10 +3258,41 @@ def test_cluster_controller_grpc_lro_async_client(): assert transport.operations_client is transport.operations_client -def test_service_path(): +def test_node_group_path(): project = "squid" - location = "clam" - service = "whelk" + region = "clam" + cluster = "whelk" + node_group = "octopus" + expected = "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + actual = ClusterControllerClient.node_group_path( + project, region, cluster, node_group + ) + assert expected == actual + + +def test_parse_node_group_path(): + expected = { + "project": "oyster", + "region": "nudibranch", + "cluster": "cuttlefish", + "node_group": "mussel", + } + path = ClusterControllerClient.node_group_path(**expected) + + # Check that the path construction is reversible. + actual = ClusterControllerClient.parse_node_group_path(path) + assert expected == actual + + +def test_service_path(): + project = "winkle" + location = "nautilus" + service = "scallop" expected = "projects/{project}/locations/{location}/services/{service}".format( project=project, location=location, @@ -3272,9 +3304,9 @@ def test_service_path(): def test_parse_service_path(): expected = { - "project": "octopus", - "location": "oyster", - "service": "nudibranch", + "project": "abalone", + "location": "squid", + "service": "clam", } path = ClusterControllerClient.service_path(**expected) @@ -3284,7 +3316,7 @@ def test_parse_service_path(): def test_common_billing_account_path(): - billing_account = "cuttlefish" + billing_account = "whelk" expected = "billingAccounts/{billing_account}".format( billing_account=billing_account, ) @@ -3294,7 +3326,7 @@ def test_common_billing_account_path(): def test_parse_common_billing_account_path(): expected = { - "billing_account": "mussel", + "billing_account": "octopus", } path = ClusterControllerClient.common_billing_account_path(**expected) @@ -3304,7 +3336,7 @@ def test_parse_common_billing_account_path(): def test_common_folder_path(): - folder = "winkle" + folder = "oyster" expected = "folders/{folder}".format( folder=folder, ) @@ -3314,7 +3346,7 @@ def test_common_folder_path(): def test_parse_common_folder_path(): expected = { - "folder": "nautilus", + "folder": "nudibranch", } path = ClusterControllerClient.common_folder_path(**expected) @@ -3324,7 +3356,7 @@ def test_parse_common_folder_path(): def test_common_organization_path(): - organization = "scallop" + organization = "cuttlefish" expected = "organizations/{organization}".format( organization=organization, ) @@ -3334,7 +3366,7 @@ def test_common_organization_path(): def test_parse_common_organization_path(): expected = { - "organization": "abalone", + "organization": "mussel", } path = ClusterControllerClient.common_organization_path(**expected) @@ -3344,7 +3376,7 @@ def test_parse_common_organization_path(): def test_common_project_path(): - project = "squid" + project = "winkle" expected = "projects/{project}".format( project=project, ) @@ -3354,7 +3386,7 @@ def test_common_project_path(): def test_parse_common_project_path(): expected = { - "project": "clam", + "project": "nautilus", } path = ClusterControllerClient.common_project_path(**expected) @@ -3364,8 +3396,8 @@ def test_parse_common_project_path(): def test_common_location_path(): - project = "whelk" - location = "octopus" + project = "scallop" + location = "abalone" expected = "projects/{project}/locations/{location}".format( project=project, location=location, @@ -3376,8 +3408,8 @@ def test_common_location_path(): def test_parse_common_location_path(): expected = { - "project": "oyster", - "location": "nudibranch", + "project": "squid", + "location": "clam", } path = ClusterControllerClient.common_location_path(**expected) diff --git a/tests/unit/gapic/dataproc_v1/test_node_group_controller.py b/tests/unit/gapic/dataproc_v1/test_node_group_controller.py new file mode 100644 index 00000000..3046da76 --- /dev/null +++ b/tests/unit/gapic/dataproc_v1/test_node_group_controller.py @@ -0,0 +1,2220 @@ +# -*- coding: utf-8 -*- +# Copyright 2022 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 +# +# http://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. +# +import os + +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +import math +import pytest +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import future +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import operation +from google.api_core import operation_async # type: ignore +from google.api_core import operations_v1 +from google.api_core import path_template +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.dataproc_v1.services.node_group_controller import ( + NodeGroupControllerAsyncClient, +) +from google.cloud.dataproc_v1.services.node_group_controller import ( + NodeGroupControllerClient, +) +from google.cloud.dataproc_v1.services.node_group_controller import transports +from google.cloud.dataproc_v1.types import clusters +from google.cloud.dataproc_v1.types import node_groups +from google.cloud.dataproc_v1.types import operations +from google.longrunning import operations_pb2 +from google.oauth2 import service_account +from google.protobuf import duration_pb2 # type: ignore +import google.auth + + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return ( + "foo.googleapis.com" + if ("localhost" in client.DEFAULT_ENDPOINT) + else client.DEFAULT_ENDPOINT + ) + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert NodeGroupControllerClient._get_default_mtls_endpoint(None) is None + assert ( + NodeGroupControllerClient._get_default_mtls_endpoint(api_endpoint) + == api_mtls_endpoint + ) + assert ( + NodeGroupControllerClient._get_default_mtls_endpoint(api_mtls_endpoint) + == api_mtls_endpoint + ) + assert ( + NodeGroupControllerClient._get_default_mtls_endpoint(sandbox_endpoint) + == sandbox_mtls_endpoint + ) + assert ( + NodeGroupControllerClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) + == sandbox_mtls_endpoint + ) + assert ( + NodeGroupControllerClient._get_default_mtls_endpoint(non_googleapi) + == non_googleapi + ) + + +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (NodeGroupControllerClient, "grpc"), + (NodeGroupControllerAsyncClient, "grpc_asyncio"), + ], +) +def test_node_group_controller_client_from_service_account_info( + client_class, transport_name +): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object( + service_account.Credentials, "from_service_account_info" + ) as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ("dataproc.googleapis.com:443") + + +@pytest.mark.parametrize( + "transport_class,transport_name", + [ + (transports.NodeGroupControllerGrpcTransport, "grpc"), + (transports.NodeGroupControllerGrpcAsyncIOTransport, "grpc_asyncio"), + ], +) +def test_node_group_controller_client_service_account_always_use_jwt( + transport_class, transport_name +): + with mock.patch.object( + service_account.Credentials, "with_always_use_jwt_access", create=True + ) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object( + service_account.Credentials, "with_always_use_jwt_access", create=True + ) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (NodeGroupControllerClient, "grpc"), + (NodeGroupControllerAsyncClient, "grpc_asyncio"), + ], +) +def test_node_group_controller_client_from_service_account_file( + client_class, transport_name +): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object( + service_account.Credentials, "from_service_account_file" + ) as factory: + factory.return_value = creds + client = client_class.from_service_account_file( + "dummy/file/path.json", transport=transport_name + ) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json( + "dummy/file/path.json", transport=transport_name + ) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ("dataproc.googleapis.com:443") + + +def test_node_group_controller_client_get_transport_class(): + transport = NodeGroupControllerClient.get_transport_class() + available_transports = [ + transports.NodeGroupControllerGrpcTransport, + ] + assert transport in available_transports + + transport = NodeGroupControllerClient.get_transport_class("grpc") + assert transport == transports.NodeGroupControllerGrpcTransport + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name", + [ + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + ), + ], +) +@mock.patch.object( + NodeGroupControllerClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerClient), +) +@mock.patch.object( + NodeGroupControllerAsyncClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerAsyncClient), +) +def test_node_group_controller_client_client_options( + client_class, transport_class, transport_name +): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(NodeGroupControllerClient, "get_transport_class") as gtc: + transport = transport_class(credentials=ga_credentials.AnonymousCredentials()) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(NodeGroupControllerClient, "get_transport_class") as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError): + client = client_class(transport=transport_name) + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"} + ): + with pytest.raises(ValueError): + client = client_class(transport=transport_name) + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions( + api_audience="https://language.googleapis.com" + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com", + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,use_client_cert_env", + [ + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + "true", + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + "true", + ), + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + "false", + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + "false", + ), + ], +) +@mock.patch.object( + NodeGroupControllerClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerClient), +) +@mock.patch.object( + NodeGroupControllerAsyncClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerAsyncClient), +) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_node_group_controller_client_mtls_env_auto( + client_class, transport_class, transport_name, use_client_cert_env +): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + options = client_options.ClientOptions( + client_cert_source=client_cert_source_callback + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client.DEFAULT_ENDPOINT + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + with mock.patch.object(transport_class, "__init__") as patched: + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=True, + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=client_cert_source_callback, + ): + if use_client_cert_env == "false": + expected_host = client.DEFAULT_ENDPOINT + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict( + os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env} + ): + with mock.patch.object(transport_class, "__init__") as patched: + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=False, + ): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize( + "client_class", [NodeGroupControllerClient, NodeGroupControllerAsyncClient] +) +@mock.patch.object( + NodeGroupControllerClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerClient), +) +@mock.patch.object( + NodeGroupControllerAsyncClient, + "DEFAULT_ENDPOINT", + modify_default_endpoint(NodeGroupControllerAsyncClient), +) +def test_node_group_controller_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions( + client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint + ) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source( + options + ) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=False, + ): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch( + "google.auth.transport.mtls.has_default_client_cert_source", + return_value=True, + ): + with mock.patch( + "google.auth.transport.mtls.default_client_cert_source", + return_value=mock_client_cert_source, + ): + ( + api_endpoint, + cert_source, + ) = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name", + [ + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + ), + ], +) +def test_node_group_controller_client_client_options_scopes( + client_class, transport_class, transport_name +): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,grpc_helpers", + [ + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + grpc_helpers, + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + grpc_helpers_async, + ), + ], +) +def test_node_group_controller_client_client_options_credentials_file( + client_class, transport_class, transport_name, grpc_helpers +): + # Check the case credentials file is provided. + options = client_options.ClientOptions(credentials_file="credentials.json") + + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +def test_node_group_controller_client_client_options_from_dict(): + with mock.patch( + "google.cloud.dataproc_v1.services.node_group_controller.transports.NodeGroupControllerGrpcTransport.__init__" + ) as grpc_transport: + grpc_transport.return_value = None + client = NodeGroupControllerClient( + client_options={"api_endpoint": "squid.clam.whelk"} + ) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize( + "client_class,transport_class,transport_name,grpc_helpers", + [ + ( + NodeGroupControllerClient, + transports.NodeGroupControllerGrpcTransport, + "grpc", + grpc_helpers, + ), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + "grpc_asyncio", + grpc_helpers_async, + ), + ], +) +def test_node_group_controller_client_create_channel_credentials_file( + client_class, transport_class, transport_name, grpc_helpers +): + # Check the case credentials file is provided. + options = client_options.ClientOptions(credentials_file="credentials.json") + + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "dataproc.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=("https://www.googleapis.com/auth/cloud-platform",), + scopes=None, + default_host="dataproc.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize( + "request_type", + [ + node_groups.CreateNodeGroupRequest, + dict, + ], +) +def test_create_node_group(request_type, transport: str = "grpc"): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/spam") + response = client.create_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.CreateNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +def test_create_node_group_empty_call(): + # This test is a coverage failsafe to make sure that totally empty calls, + # i.e. request == None and no flattened fields passed, work. + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + client.create_node_group() + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.CreateNodeGroupRequest() + + +@pytest.mark.asyncio +async def test_create_node_group_async( + transport: str = "grpc_asyncio", request_type=node_groups.CreateNodeGroupRequest +): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/spam") + ) + response = await client.create_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.CreateNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +@pytest.mark.asyncio +async def test_create_node_group_async_from_dict(): + await test_create_node_group_async(request_type=dict) + + +def test_create_node_group_field_headers(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.CreateNodeGroupRequest() + + request.parent = "parent_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + call.return_value = operations_pb2.Operation(name="operations/op") + client.create_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] + + +@pytest.mark.asyncio +async def test_create_node_group_field_headers_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.CreateNodeGroupRequest() + + request.parent = "parent_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/op") + ) + await client.create_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] + + +def test_create_node_group_flattened(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/op") + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.create_node_group( + parent="parent_value", + node_group=clusters.NodeGroup(name="name_value"), + node_group_id="node_group_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].node_group + mock_val = clusters.NodeGroup(name="name_value") + assert arg == mock_val + arg = args[0].node_group_id + mock_val = "node_group_id_value" + assert arg == mock_val + + +def test_create_node_group_flattened_error(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.create_node_group( + node_groups.CreateNodeGroupRequest(), + parent="parent_value", + node_group=clusters.NodeGroup(name="name_value"), + node_group_id="node_group_id_value", + ) + + +@pytest.mark.asyncio +async def test_create_node_group_flattened_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.create_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/op") + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/spam") + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.create_node_group( + parent="parent_value", + node_group=clusters.NodeGroup(name="name_value"), + node_group_id="node_group_id_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].parent + mock_val = "parent_value" + assert arg == mock_val + arg = args[0].node_group + mock_val = clusters.NodeGroup(name="name_value") + assert arg == mock_val + arg = args[0].node_group_id + mock_val = "node_group_id_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_create_node_group_flattened_error_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.create_node_group( + node_groups.CreateNodeGroupRequest(), + parent="parent_value", + node_group=clusters.NodeGroup(name="name_value"), + node_group_id="node_group_id_value", + ) + + +@pytest.mark.parametrize( + "request_type", + [ + node_groups.ResizeNodeGroupRequest, + dict, + ], +) +def test_resize_node_group(request_type, transport: str = "grpc"): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/spam") + response = client.resize_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.ResizeNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +def test_resize_node_group_empty_call(): + # This test is a coverage failsafe to make sure that totally empty calls, + # i.e. request == None and no flattened fields passed, work. + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + client.resize_node_group() + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.ResizeNodeGroupRequest() + + +@pytest.mark.asyncio +async def test_resize_node_group_async( + transport: str = "grpc_asyncio", request_type=node_groups.ResizeNodeGroupRequest +): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/spam") + ) + response = await client.resize_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.ResizeNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +@pytest.mark.asyncio +async def test_resize_node_group_async_from_dict(): + await test_resize_node_group_async(request_type=dict) + + +def test_resize_node_group_field_headers(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.ResizeNodeGroupRequest() + + request.name = "name_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + call.return_value = operations_pb2.Operation(name="operations/op") + client.resize_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] + + +@pytest.mark.asyncio +async def test_resize_node_group_field_headers_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.ResizeNodeGroupRequest() + + request.name = "name_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/op") + ) + await client.resize_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] + + +def test_resize_node_group_flattened(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/op") + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.resize_node_group( + name="name_value", + size=443, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].size + mock_val = 443 + assert arg == mock_val + + +def test_resize_node_group_flattened_error(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.resize_node_group( + node_groups.ResizeNodeGroupRequest(), + name="name_value", + size=443, + ) + + +@pytest.mark.asyncio +async def test_resize_node_group_flattened_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.resize_node_group), "__call__" + ) as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name="operations/op") + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name="operations/spam") + ) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.resize_node_group( + name="name_value", + size=443, + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + arg = args[0].size + mock_val = 443 + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_resize_node_group_flattened_error_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.resize_node_group( + node_groups.ResizeNodeGroupRequest(), + name="name_value", + size=443, + ) + + +@pytest.mark.parametrize( + "request_type", + [ + node_groups.GetNodeGroupRequest, + dict, + ], +) +def test_get_node_group(request_type, transport: str = "grpc"): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = clusters.NodeGroup( + name="name_value", + roles=[clusters.NodeGroup.Role.DRIVER], + ) + response = client.get_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.GetNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, clusters.NodeGroup) + assert response.name == "name_value" + assert response.roles == [clusters.NodeGroup.Role.DRIVER] + + +def test_get_node_group_empty_call(): + # This test is a coverage failsafe to make sure that totally empty calls, + # i.e. request == None and no flattened fields passed, work. + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + client.get_node_group() + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.GetNodeGroupRequest() + + +@pytest.mark.asyncio +async def test_get_node_group_async( + transport: str = "grpc_asyncio", request_type=node_groups.GetNodeGroupRequest +): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + clusters.NodeGroup( + name="name_value", + roles=[clusters.NodeGroup.Role.DRIVER], + ) + ) + response = await client.get_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == node_groups.GetNodeGroupRequest() + + # Establish that the response is the type that we expect. + assert isinstance(response, clusters.NodeGroup) + assert response.name == "name_value" + assert response.roles == [clusters.NodeGroup.Role.DRIVER] + + +@pytest.mark.asyncio +async def test_get_node_group_async_from_dict(): + await test_get_node_group_async(request_type=dict) + + +def test_get_node_group_field_headers(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.GetNodeGroupRequest() + + request.name = "name_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + call.return_value = clusters.NodeGroup() + client.get_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] + + +@pytest.mark.asyncio +async def test_get_node_group_field_headers_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = node_groups.GetNodeGroupRequest() + + request.name = "name_value" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(clusters.NodeGroup()) + await client.get_node_group(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] + + +def test_get_node_group_flattened(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = clusters.NodeGroup() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.get_node_group( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +def test_get_node_group_flattened_error(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.get_node_group( + node_groups.GetNodeGroupRequest(), + name="name_value", + ) + + +@pytest.mark.asyncio +async def test_get_node_group_flattened_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_node_group), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = clusters.NodeGroup() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(clusters.NodeGroup()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.get_node_group( + name="name_value", + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].name + mock_val = "name_value" + assert arg == mock_val + + +@pytest.mark.asyncio +async def test_get_node_group_flattened_error_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.get_node_group( + node_groups.GetNodeGroupRequest(), + name="name_value", + ) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = NodeGroupControllerClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = NodeGroupControllerClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = mock.Mock() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = NodeGroupControllerClient( + client_options=options, credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = NodeGroupControllerClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = NodeGroupControllerClient(transport=transport) + assert client.transport is transport + + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.NodeGroupControllerGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.NodeGroupControllerGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, "default") as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + + +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + ], +) +def test_transport_kind(transport_name): + transport = NodeGroupControllerClient.get_transport_class(transport_name)( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert transport.kind == transport_name + + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.NodeGroupControllerGrpcTransport, + ) + + +def test_node_group_controller_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.NodeGroupControllerTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json", + ) + + +def test_node_group_controller_base_transport(): + # Instantiate the base transport. + with mock.patch( + "google.cloud.dataproc_v1.services.node_group_controller.transports.NodeGroupControllerTransport.__init__" + ) as Transport: + Transport.return_value = None + transport = transports.NodeGroupControllerTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + "create_node_group", + "resize_node_group", + "get_node_group", + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Additionally, the LRO client (a property) should + # also raise NotImplementedError + with pytest.raises(NotImplementedError): + transport.operations_client + + # Catch all for all remaining methods and properties + remainder = [ + "kind", + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_node_group_controller_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch( + "google.cloud.dataproc_v1.services.node_group_controller.transports.NodeGroupControllerTransport._prep_wrapped_messages" + ) as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.NodeGroupControllerTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with( + "credentials.json", + scopes=None, + default_scopes=("https://www.googleapis.com/auth/cloud-platform",), + quota_project_id="octopus", + ) + + +def test_node_group_controller_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( + "google.cloud.dataproc_v1.services.node_group_controller.transports.NodeGroupControllerTransport._prep_wrapped_messages" + ) as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.NodeGroupControllerTransport() + adc.assert_called_once() + + +def test_node_group_controller_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + NodeGroupControllerClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=("https://www.googleapis.com/auth/cloud-platform",), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_node_group_controller_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=("https://www.googleapis.com/auth/cloud-platform",), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_node_group_controller_transport_auth_gdch_credentials(transport_class): + host = "https://language.com" + api_audience_tests = [None, "https://language2.com"] + api_audience_expect = [host, "https://language2.com"] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, "default", autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock( + return_value=gdch_mock + ) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with(e) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.NodeGroupControllerGrpcTransport, grpc_helpers), + (transports.NodeGroupControllerGrpcAsyncIOTransport, grpc_helpers_async), + ], +) +def test_node_group_controller_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + + create_channel.assert_called_with( + "dataproc.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=("https://www.googleapis.com/auth/cloud-platform",), + scopes=["1", "2"], + default_host="dataproc.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_node_group_controller_grpc_transport_client_cert_source_for_mtls( + transport_class, +): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds, + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback, + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, private_key=expected_key + ) + + +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_node_group_controller_host_no_port(transport_name): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions( + api_endpoint="dataproc.googleapis.com" + ), + transport=transport_name, + ) + assert client.transport._host == ("dataproc.googleapis.com:443") + + +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_node_group_controller_host_with_port(transport_name): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions( + api_endpoint="dataproc.googleapis.com:8000" + ), + transport=transport_name, + ) + assert client.transport._host == ("dataproc.googleapis.com:8000") + + +def test_node_group_controller_grpc_transport_channel(): + channel = grpc.secure_channel("http://localhost/", grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.NodeGroupControllerGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_node_group_controller_grpc_asyncio_transport_channel(): + channel = aio.secure_channel("http://localhost/", grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.NodeGroupControllerGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_node_group_controller_transport_channel_mtls_with_client_cert_source( + transport_class, +): + with mock.patch( + "grpc.ssl_channel_credentials", autospec=True + ) as grpc_ssl_channel_cred: + with mock.patch.object( + transport_class, "create_channel" + ) as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, "default") as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize( + "transport_class", + [ + transports.NodeGroupControllerGrpcTransport, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ], +) +def test_node_group_controller_transport_channel_mtls_with_adc(transport_class): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object( + transport_class, "create_channel" + ) as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_node_group_controller_grpc_lro_client(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_node_group_controller_grpc_lro_async_client(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc_asyncio", + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsAsyncClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_node_group_path(): + project = "squid" + region = "clam" + cluster = "whelk" + node_group = "octopus" + expected = "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + actual = NodeGroupControllerClient.node_group_path( + project, region, cluster, node_group + ) + assert expected == actual + + +def test_parse_node_group_path(): + expected = { + "project": "oyster", + "region": "nudibranch", + "cluster": "cuttlefish", + "node_group": "mussel", + } + path = NodeGroupControllerClient.node_group_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_node_group_path(path) + assert expected == actual + + +def test_common_billing_account_path(): + billing_account = "winkle" + expected = "billingAccounts/{billing_account}".format( + billing_account=billing_account, + ) + actual = NodeGroupControllerClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "nautilus", + } + path = NodeGroupControllerClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_common_billing_account_path(path) + assert expected == actual + + +def test_common_folder_path(): + folder = "scallop" + expected = "folders/{folder}".format( + folder=folder, + ) + actual = NodeGroupControllerClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "abalone", + } + path = NodeGroupControllerClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_common_folder_path(path) + assert expected == actual + + +def test_common_organization_path(): + organization = "squid" + expected = "organizations/{organization}".format( + organization=organization, + ) + actual = NodeGroupControllerClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "clam", + } + path = NodeGroupControllerClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_common_organization_path(path) + assert expected == actual + + +def test_common_project_path(): + project = "whelk" + expected = "projects/{project}".format( + project=project, + ) + actual = NodeGroupControllerClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "octopus", + } + path = NodeGroupControllerClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_common_project_path(path) + assert expected == actual + + +def test_common_location_path(): + project = "oyster" + location = "nudibranch" + expected = "projects/{project}/locations/{location}".format( + project=project, + location=location, + ) + actual = NodeGroupControllerClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "cuttlefish", + "location": "mussel", + } + path = NodeGroupControllerClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = NodeGroupControllerClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object( + transports.NodeGroupControllerTransport, "_prep_wrapped_messages" + ) as prep: + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object( + transports.NodeGroupControllerTransport, "_prep_wrapped_messages" + ) as prep: + transport_class = NodeGroupControllerClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +@pytest.mark.asyncio +async def test_transport_close_async(): + client = NodeGroupControllerAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc_asyncio", + ) + with mock.patch.object( + type(getattr(client.transport, "grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close(): + transports = { + "grpc": "_grpc_channel", + } + + for transport, close_name in transports.items(): + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + with mock.patch.object( + type(getattr(client.transport, close_name)), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = NodeGroupControllerClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + + +@pytest.mark.parametrize( + "client_class,transport_class", + [ + (NodeGroupControllerClient, transports.NodeGroupControllerGrpcTransport), + ( + NodeGroupControllerAsyncClient, + transports.NodeGroupControllerGrpcAsyncIOTransport, + ), + ], +) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client.DEFAULT_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) diff --git a/tests/unit/gapic/dataproc_v1/test_workflow_template_service.py b/tests/unit/gapic/dataproc_v1/test_workflow_template_service.py index 1fe49bec..a746971d 100644 --- a/tests/unit/gapic/dataproc_v1/test_workflow_template_service.py +++ b/tests/unit/gapic/dataproc_v1/test_workflow_template_service.py @@ -56,6 +56,7 @@ from google.longrunning import operations_pb2 from google.oauth2 import service_account from google.protobuf import duration_pb2 # type: ignore +from google.protobuf import empty_pb2 # type: ignore from google.protobuf import timestamp_pb2 # type: ignore import google.auth @@ -3208,10 +3209,41 @@ def test_workflow_template_service_grpc_lro_async_client(): assert transport.operations_client is transport.operations_client -def test_service_path(): +def test_node_group_path(): project = "squid" - location = "clam" - service = "whelk" + region = "clam" + cluster = "whelk" + node_group = "octopus" + expected = "projects/{project}/regions/{region}/clusters/{cluster}/nodeGroups/{node_group}".format( + project=project, + region=region, + cluster=cluster, + node_group=node_group, + ) + actual = WorkflowTemplateServiceClient.node_group_path( + project, region, cluster, node_group + ) + assert expected == actual + + +def test_parse_node_group_path(): + expected = { + "project": "oyster", + "region": "nudibranch", + "cluster": "cuttlefish", + "node_group": "mussel", + } + path = WorkflowTemplateServiceClient.node_group_path(**expected) + + # Check that the path construction is reversible. + actual = WorkflowTemplateServiceClient.parse_node_group_path(path) + assert expected == actual + + +def test_service_path(): + project = "winkle" + location = "nautilus" + service = "scallop" expected = "projects/{project}/locations/{location}/services/{service}".format( project=project, location=location, @@ -3223,9 +3255,9 @@ def test_service_path(): def test_parse_service_path(): expected = { - "project": "octopus", - "location": "oyster", - "service": "nudibranch", + "project": "abalone", + "location": "squid", + "service": "clam", } path = WorkflowTemplateServiceClient.service_path(**expected) @@ -3235,9 +3267,9 @@ def test_parse_service_path(): def test_workflow_template_path(): - project = "cuttlefish" - region = "mussel" - workflow_template = "winkle" + project = "whelk" + region = "octopus" + workflow_template = "oyster" expected = "projects/{project}/regions/{region}/workflowTemplates/{workflow_template}".format( project=project, region=region, @@ -3251,9 +3283,9 @@ def test_workflow_template_path(): def test_parse_workflow_template_path(): expected = { - "project": "nautilus", - "region": "scallop", - "workflow_template": "abalone", + "project": "nudibranch", + "region": "cuttlefish", + "workflow_template": "mussel", } path = WorkflowTemplateServiceClient.workflow_template_path(**expected) @@ -3263,7 +3295,7 @@ def test_parse_workflow_template_path(): def test_common_billing_account_path(): - billing_account = "squid" + billing_account = "winkle" expected = "billingAccounts/{billing_account}".format( billing_account=billing_account, ) @@ -3273,7 +3305,7 @@ def test_common_billing_account_path(): def test_parse_common_billing_account_path(): expected = { - "billing_account": "clam", + "billing_account": "nautilus", } path = WorkflowTemplateServiceClient.common_billing_account_path(**expected) @@ -3283,7 +3315,7 @@ def test_parse_common_billing_account_path(): def test_common_folder_path(): - folder = "whelk" + folder = "scallop" expected = "folders/{folder}".format( folder=folder, ) @@ -3293,7 +3325,7 @@ def test_common_folder_path(): def test_parse_common_folder_path(): expected = { - "folder": "octopus", + "folder": "abalone", } path = WorkflowTemplateServiceClient.common_folder_path(**expected) @@ -3303,7 +3335,7 @@ def test_parse_common_folder_path(): def test_common_organization_path(): - organization = "oyster" + organization = "squid" expected = "organizations/{organization}".format( organization=organization, ) @@ -3313,7 +3345,7 @@ def test_common_organization_path(): def test_parse_common_organization_path(): expected = { - "organization": "nudibranch", + "organization": "clam", } path = WorkflowTemplateServiceClient.common_organization_path(**expected) @@ -3323,7 +3355,7 @@ def test_parse_common_organization_path(): def test_common_project_path(): - project = "cuttlefish" + project = "whelk" expected = "projects/{project}".format( project=project, ) @@ -3333,7 +3365,7 @@ def test_common_project_path(): def test_parse_common_project_path(): expected = { - "project": "mussel", + "project": "octopus", } path = WorkflowTemplateServiceClient.common_project_path(**expected) @@ -3343,8 +3375,8 @@ def test_parse_common_project_path(): def test_common_location_path(): - project = "winkle" - location = "nautilus" + project = "oyster" + location = "nudibranch" expected = "projects/{project}/locations/{location}".format( project=project, location=location, @@ -3355,8 +3387,8 @@ def test_common_location_path(): def test_parse_common_location_path(): expected = { - "project": "scallop", - "location": "abalone", + "project": "cuttlefish", + "location": "mussel", } path = WorkflowTemplateServiceClient.common_location_path(**expected) From 6ca3905a63b6d8bcc5f28103bcba1e0540c0071e Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 9 Jan 2023 11:21:58 -0500 Subject: [PATCH 12/12] chore(main): release 5.1.0 (#509) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- .release-please-manifest.json | 2 +- CHANGELOG.md | 23 +++++++++++++++++++ google/cloud/dataproc/gapic_version.py | 2 +- google/cloud/dataproc_v1/gapic_version.py | 2 +- ...pet_metadata_google.cloud.dataproc.v1.json | 2 +- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index f8d32fdd..affd1ab3 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "5.0.3" + ".": "5.1.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index fd0699a3..6af230c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,29 @@ [1]: https://pypi.org/project/google-cloud-dataproc/#history +## [5.1.0](https://github.com/googleapis/python-dataproc/compare/v5.0.3...v5.1.0) (2023-01-07) + + +### Features + +* Add support for `google.cloud.dataproc.__version__` ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* Add typing to proto.Message based class attributes ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* Added node groups API protos ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) + + +### Bug Fixes + +* Add dict typing for client_options ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* **deps:** Require google-api-core >=1.34.0, >=2.11.0 ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* Drop usage of pkg_resources ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* Fix timeout default values ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) + + +### Documentation + +* **samples:** Snippetgen handling of repeated enum field ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) +* **samples:** Snippetgen should call await on the operation coroutine before calling result ([b3b13c4](https://github.com/googleapis/python-dataproc/commit/b3b13c47129f807f385125bf6c96311793724066)) + ## [5.0.3](https://github.com/googleapis/python-dataproc/compare/v5.0.2...v5.0.3) (2022-10-07) diff --git a/google/cloud/dataproc/gapic_version.py b/google/cloud/dataproc/gapic_version.py index 6ed707c8..6989a2af 100644 --- a/google/cloud/dataproc/gapic_version.py +++ b/google/cloud/dataproc/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "5.0.3" # {x-release-please-version} +__version__ = "5.1.0" # {x-release-please-version} diff --git a/google/cloud/dataproc_v1/gapic_version.py b/google/cloud/dataproc_v1/gapic_version.py index 6ed707c8..6989a2af 100644 --- a/google/cloud/dataproc_v1/gapic_version.py +++ b/google/cloud/dataproc_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "5.0.3" # {x-release-please-version} +__version__ = "5.1.0" # {x-release-please-version} diff --git a/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json b/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json index f1a48076..0109e051 100644 --- a/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.dataproc.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-dataproc", - "version": "0.1.0" + "version": "5.1.0" }, "snippets": [ {