Skip to content

Commit 543a5fd

Browse files
partheachalmerlowe
andauthored
chore: regenerate google-cloud-bigtable (#17722)
This PR also includes the fixes from #17707 Closes #17719 Closes #17707 Fixes #17709 --------- Co-authored-by: chalmer lowe <chalmerlowe@google.com>
1 parent c824b6d commit 543a5fd

10 files changed

Lines changed: 167 additions & 80 deletions

File tree

librarian.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,6 @@ libraries:
635635
apis:
636636
- path: google/bigtable/v2
637637
- path: google/bigtable/admin/v2
638-
skip_generate: true
639638
python:
640639
library_type: GAPIC_COMBO
641640
opt_args_by_api:

packages/google-cloud-bigtable/mypy.ini

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# We use the constraints file for the latest Python version
2+
# (currently this file) to check that the latest
3+
# major versions of dependencies are supported in setup.py.
4+
# List all library dependencies and extras in this file.
5+
# Require the latest major version be installed for each dependency.
6+
# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0",
7+
# Then this file should have google-cloud-foo>=1
8+
google-api-core>=2
9+
google-auth>=2
10+
grpcio>=1
11+
proto-plus>=1
12+
protobuf>=7

packages/google-cloud-bigtable/tests/system/data/test_system_async.py

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ async def add_row(
6868
elif isinstance(value, int):
6969
value = value.to_bytes(8, byteorder="big", signed=True)
7070
request = {
71-
"table_name": self.target.table_name,
71+
**self.target._request_path,
7272
"row_key": row_key,
7373
"mutations": [
7474
{
@@ -88,7 +88,7 @@ async def add_aggregate_row(
8888
self, row_key, *, family=TEST_AGGREGATE_FAMILY, qualifier=b"q", input=0
8989
):
9090
request = {
91-
"table_name": self.target.table_name,
91+
**self.target._request_path,
9292
"row_key": row_key,
9393
"mutations": [
9494
{
@@ -107,14 +107,44 @@ async def add_aggregate_row(
107107
@CrossSync.convert
108108
async def delete_rows(self):
109109
if self.rows:
110-
request = {
111-
"table_name": self.target.table_name,
112-
"entries": [
113-
{"row_key": row, "mutations": [{"delete_from_row": {}}]}
114-
for row in self.rows
115-
],
116-
}
117-
await self.target.client._gapic_client.mutate_rows(request)
110+
# Chunk deletions to 5,000 rows. While Bigtable officially supports up to
111+
# 100,000 mutations per MutateRows RPC, sending massive batches may hit
112+
# the default gRPC 4MB client payload size limit due to metadata
113+
# serialization overhead. Keeping chunks at 5,000 ensures we stay safely
114+
# under 4MB and minimizes transient network timeouts on live connections.
115+
chunk_size = 5000
116+
rows_list = list(self.rows)
117+
118+
# Check if the test target is an Authorized View
119+
is_authorized_view = "authorized_view_name" in self.target._request_path
120+
121+
if is_authorized_view:
122+
# For Authorized Views, we cannot use delete_from_row because it attempts
123+
# to delete families outside the view's scope. We must delete explicitly
124+
# from the allowed families we wrote to.
125+
mutations = [
126+
{"delete_from_family": {"family_name": TEST_FAMILY}},
127+
{"delete_from_family": {"family_name": TEST_AGGREGATE_FAMILY}},
128+
]
129+
else:
130+
mutations = [{"delete_from_row": {}}]
131+
132+
for i in range(0, len(rows_list), chunk_size):
133+
chunk = rows_list[i : i + chunk_size]
134+
request = {
135+
**self.target._request_path,
136+
"entries": [
137+
{"row_key": row, "mutations": mutations} for row in chunk
138+
],
139+
}
140+
# Await and consume the gRPC stream to guarantee execution
141+
stream = await self.target.client._gapic_client.mutate_rows(request)
142+
async for response in stream:
143+
for entry in response.entries:
144+
if entry.status.code != 0:
145+
raise RuntimeError(
146+
f"Failed to delete row: {entry.status.message}"
147+
)
118148

119149
@CrossSync.convert
120150
async def retrieve_cell_value(self, target, row_key):

packages/google-cloud-bigtable/tests/system/data/test_system_autogen.py

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def add_row(
5757
elif isinstance(value, int):
5858
value = value.to_bytes(8, byteorder="big", signed=True)
5959
request = {
60-
"table_name": self.target.table_name,
60+
**self.target._request_path,
6161
"row_key": row_key,
6262
"mutations": [
6363
{
@@ -76,7 +76,7 @@ def add_aggregate_row(
7676
self, row_key, *, family=TEST_AGGREGATE_FAMILY, qualifier=b"q", input=0
7777
):
7878
request = {
79-
"table_name": self.target.table_name,
79+
**self.target._request_path,
8080
"row_key": row_key,
8181
"mutations": [
8282
{
@@ -94,14 +94,31 @@ def add_aggregate_row(
9494

9595
def delete_rows(self):
9696
if self.rows:
97-
request = {
98-
"table_name": self.target.table_name,
99-
"entries": [
100-
{"row_key": row, "mutations": [{"delete_from_row": {}}]}
101-
for row in self.rows
102-
],
103-
}
104-
self.target.client._gapic_client.mutate_rows(request)
97+
chunk_size = 5000
98+
rows_list = list(self.rows)
99+
is_authorized_view = "authorized_view_name" in self.target._request_path
100+
if is_authorized_view:
101+
mutations = [
102+
{"delete_from_family": {"family_name": TEST_FAMILY}},
103+
{"delete_from_family": {"family_name": TEST_AGGREGATE_FAMILY}},
104+
]
105+
else:
106+
mutations = [{"delete_from_row": {}}]
107+
for i in range(0, len(rows_list), chunk_size):
108+
chunk = rows_list[i : i + chunk_size]
109+
request = {
110+
**self.target._request_path,
111+
"entries": [
112+
{"row_key": row, "mutations": mutations} for row in chunk
113+
],
114+
}
115+
stream = self.target.client._gapic_client.mutate_rows(request)
116+
for response in stream:
117+
for entry in response.entries:
118+
if entry.status.code != 0:
119+
raise RuntimeError(
120+
f"Failed to delete row: {entry.status.message}"
121+
)
105122

106123
def retrieve_cell_value(self, target, row_key):
107124
"""Helper to read an individual row"""

packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,15 +2998,11 @@ def test_execute_query_with_params(self, client, execute_query_mock, prepare_moc
29982998
def test_execute_query_with_view_parameters(
29992999
self, client, execute_query_mock, prepare_mock
30003000
):
3001-
values = [
3002-
*chunked_responses(2, str_val("test2"), int_val(9), token=b"r2"),
3003-
]
3001+
values = [*chunked_responses(2, str_val("test2"), int_val(9), token=b"r2")]
30043002
execute_query_mock.return_value = self._make_gapic_stream(values)
30053003
query_str = f"SELECT a, b FROM {self.TABLE_NAME} WHERE user_id = VIEW_PARAMETERS('user_id')"
30063004
result = client.execute_query(
3007-
query_str,
3008-
self.INSTANCE_NAME,
3009-
view_parameters={"user_id": "alice"},
3005+
query_str, self.INSTANCE_NAME, view_parameters={"user_id": "alice"}
30103006
)
30113007
results = [r for r in result]
30123008
assert len(results) == 1
@@ -3015,7 +3011,6 @@ def test_execute_query_with_view_parameters(
30153011
assert execute_query_mock.call_count == 1
30163012
assert prepare_mock.call_count == 1
30173013
assert prepare_mock.call_args[1]["request"]["query"] == query_str
3018-
30193014
request = execute_query_mock.call_args[0][0]
30203015
assert "user_id" in request.view_parameters
30213016
assert request.view_parameters["user_id"].string_value == "alice"

packages/google-cloud-bigtable/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6414,6 +6414,9 @@ def test_list_app_profiles_pager(transport_name: str = "grpc"):
64146414
assert pager._retry == retry
64156415
assert pager._timeout == timeout
64166416

6417+
assert pager.next_page_token == "abc"
6418+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
6419+
64176420
results = list(pager)
64186421
assert len(results) == 6
64196422
assert all(isinstance(i, instance.AppProfile) for i in results)
@@ -6506,6 +6509,8 @@ async def test_list_app_profiles_async_pager():
65066509
request={},
65076510
)
65086511
assert async_pager.next_page_token == "abc"
6512+
assert str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
6513+
65096514
responses = []
65106515
async for response in async_pager: # pragma: no branch
65116516
responses.append(response)
@@ -8686,6 +8691,9 @@ def test_list_hot_tablets_pager(transport_name: str = "grpc"):
86868691
assert pager._retry == retry
86878692
assert pager._timeout == timeout
86888693

8694+
assert pager.next_page_token == "abc"
8695+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
8696+
86898697
results = list(pager)
86908698
assert len(results) == 6
86918699
assert all(isinstance(i, instance.HotTablet) for i in results)
@@ -8774,6 +8782,8 @@ async def test_list_hot_tablets_async_pager():
87748782
request={},
87758783
)
87768784
assert async_pager.next_page_token == "abc"
8785+
assert str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
8786+
87778787
responses = []
87788788
async for response in async_pager: # pragma: no branch
87798789
responses.append(response)
@@ -9928,6 +9938,9 @@ def test_list_logical_views_pager(transport_name: str = "grpc"):
99289938
assert pager._retry == retry
99299939
assert pager._timeout == timeout
99309940

9941+
assert pager.next_page_token == "abc"
9942+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
9943+
99319944
results = list(pager)
99329945
assert len(results) == 6
99339946
assert all(isinstance(i, instance.LogicalView) for i in results)
@@ -10020,6 +10033,8 @@ async def test_list_logical_views_async_pager():
1002010033
request={},
1002110034
)
1002210035
assert async_pager.next_page_token == "abc"
10036+
assert str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
10037+
1002310038
responses = []
1002410039
async for response in async_pager: # pragma: no branch
1002510040
responses.append(response)
@@ -11885,6 +11900,9 @@ def test_list_materialized_views_pager(transport_name: str = "grpc"):
1188511900
assert pager._retry == retry
1188611901
assert pager._timeout == timeout
1188711902

11903+
assert pager.next_page_token == "abc"
11904+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
11905+
1188811906
results = list(pager)
1188911907
assert len(results) == 6
1189011908
assert all(isinstance(i, instance.MaterializedView) for i in results)
@@ -11977,6 +11995,8 @@ async def test_list_materialized_views_async_pager():
1197711995
request={},
1197811996
)
1197911997
assert async_pager.next_page_token == "abc"
11998+
assert str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
11999+
1198012000
responses = []
1198112001
async for response in async_pager: # pragma: no branch
1198212002
responses.append(response)
@@ -15370,6 +15390,9 @@ def test_list_app_profiles_rest_pager(transport: str = "rest"):
1537015390

1537115391
pager = client.list_app_profiles(request=sample_request)
1537215392

15393+
assert pager.next_page_token == "abc"
15394+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
15395+
1537315396
results = list(pager)
1537415397
assert len(results) == 6
1537515398
assert all(isinstance(i, instance.AppProfile) for i in results)
@@ -16596,6 +16619,9 @@ def test_list_hot_tablets_rest_pager(transport: str = "rest"):
1659616619

1659716620
pager = client.list_hot_tablets(request=sample_request)
1659816621

16622+
assert pager.next_page_token == "abc"
16623+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
16624+
1659916625
results = list(pager)
1660016626
assert len(results) == 6
1660116627
assert all(isinstance(i, instance.HotTablet) for i in results)
@@ -17251,6 +17277,9 @@ def test_list_logical_views_rest_pager(transport: str = "rest"):
1725117277

1725217278
pager = client.list_logical_views(request=sample_request)
1725317279

17280+
assert pager.next_page_token == "abc"
17281+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
17282+
1725417283
results = list(pager)
1725517284
assert len(results) == 6
1725617285
assert all(isinstance(i, instance.LogicalView) for i in results)
@@ -18281,6 +18310,9 @@ def test_list_materialized_views_rest_pager(transport: str = "rest"):
1828118310

1828218311
pager = client.list_materialized_views(request=sample_request)
1828318312

18313+
assert pager.next_page_token == "abc"
18314+
assert str(pager).startswith(f"{pager.__class__.__name__}<")
18315+
1828418316
results = list(pager)
1828518317
assert len(results) == 6
1828618318
assert all(isinstance(i, instance.MaterializedView) for i in results)

0 commit comments

Comments
 (0)