Skip to content

Commit 3867882

Browse files
feat: Add ListDatabaseRoles API to support role based access control (#774)
* feat: Add ListDatabaseRoles API to support role based access control PiperOrigin-RevId: 462086058 Source-Link: googleapis/googleapis@4f072bf Source-Link: googleapis/googleapis-gen@06f699d Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiMDZmNjk5ZGE2NmY3YTA3Yjk1NDFlNTdhN2QwMzg2M2I0ZGY0OTcxYyJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 12854d5 commit 3867882

15 files changed

+1323
-15
lines changed

google/cloud/spanner_admin_database_v1/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@
3939
from .types.spanner_database_admin import CreateDatabaseMetadata
4040
from .types.spanner_database_admin import CreateDatabaseRequest
4141
from .types.spanner_database_admin import Database
42+
from .types.spanner_database_admin import DatabaseRole
4243
from .types.spanner_database_admin import DropDatabaseRequest
4344
from .types.spanner_database_admin import GetDatabaseDdlRequest
4445
from .types.spanner_database_admin import GetDatabaseDdlResponse
4546
from .types.spanner_database_admin import GetDatabaseRequest
4647
from .types.spanner_database_admin import ListDatabaseOperationsRequest
4748
from .types.spanner_database_admin import ListDatabaseOperationsResponse
49+
from .types.spanner_database_admin import ListDatabaseRolesRequest
50+
from .types.spanner_database_admin import ListDatabaseRolesResponse
4851
from .types.spanner_database_admin import ListDatabasesRequest
4952
from .types.spanner_database_admin import ListDatabasesResponse
5053
from .types.spanner_database_admin import OptimizeRestoredDatabaseMetadata
@@ -71,6 +74,7 @@
7174
"Database",
7275
"DatabaseAdminClient",
7376
"DatabaseDialect",
77+
"DatabaseRole",
7478
"DeleteBackupRequest",
7579
"DropDatabaseRequest",
7680
"EncryptionConfig",
@@ -85,6 +89,8 @@
8589
"ListBackupsResponse",
8690
"ListDatabaseOperationsRequest",
8791
"ListDatabaseOperationsResponse",
92+
"ListDatabaseRolesRequest",
93+
"ListDatabaseRolesResponse",
8894
"ListDatabasesRequest",
8995
"ListDatabasesResponse",
9096
"OperationProgress",

google/cloud/spanner_admin_database_v1/gapic_metadata.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@
7070
"list_database_operations"
7171
]
7272
},
73+
"ListDatabaseRoles": {
74+
"methods": [
75+
"list_database_roles"
76+
]
77+
},
7378
"ListDatabases": {
7479
"methods": [
7580
"list_databases"
@@ -165,6 +170,11 @@
165170
"list_database_operations"
166171
]
167172
},
173+
"ListDatabaseRoles": {
174+
"methods": [
175+
"list_database_roles"
176+
]
177+
},
168178
"ListDatabases": {
169179
"methods": [
170180
"list_databases"

google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ class DatabaseAdminAsyncClient:
7575
)
7676
database_path = staticmethod(DatabaseAdminClient.database_path)
7777
parse_database_path = staticmethod(DatabaseAdminClient.parse_database_path)
78+
database_role_path = staticmethod(DatabaseAdminClient.database_role_path)
79+
parse_database_role_path = staticmethod(
80+
DatabaseAdminClient.parse_database_role_path
81+
)
7882
instance_path = staticmethod(DatabaseAdminClient.instance_path)
7983
parse_instance_path = staticmethod(DatabaseAdminClient.parse_instance_path)
8084
common_billing_account_path = staticmethod(
@@ -2595,6 +2599,125 @@ async def sample_list_backup_operations():
25952599
# Done; return the response.
25962600
return response
25972601

2602+
async def list_database_roles(
2603+
self,
2604+
request: Union[spanner_database_admin.ListDatabaseRolesRequest, dict] = None,
2605+
*,
2606+
parent: str = None,
2607+
retry: OptionalRetry = gapic_v1.method.DEFAULT,
2608+
timeout: float = None,
2609+
metadata: Sequence[Tuple[str, str]] = (),
2610+
) -> pagers.ListDatabaseRolesAsyncPager:
2611+
r"""Lists Cloud Spanner database roles.
2612+
2613+
.. code-block:: python
2614+
2615+
from google.cloud import spanner_admin_database_v1
2616+
2617+
async def sample_list_database_roles():
2618+
# Create a client
2619+
client = spanner_admin_database_v1.DatabaseAdminAsyncClient()
2620+
2621+
# Initialize request argument(s)
2622+
request = spanner_admin_database_v1.ListDatabaseRolesRequest(
2623+
parent="parent_value",
2624+
)
2625+
2626+
# Make the request
2627+
page_result = client.list_database_roles(request=request)
2628+
2629+
# Handle the response
2630+
async for response in page_result:
2631+
print(response)
2632+
2633+
Args:
2634+
request (Union[google.cloud.spanner_admin_database_v1.types.ListDatabaseRolesRequest, dict]):
2635+
The request object. The request for
2636+
[ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles].
2637+
parent (:class:`str`):
2638+
Required. The database whose roles should be listed.
2639+
Values are of the form
2640+
``projects/<project>/instances/<instance>/databases/<database>/databaseRoles``.
2641+
2642+
This corresponds to the ``parent`` field
2643+
on the ``request`` instance; if ``request`` is provided, this
2644+
should not be set.
2645+
retry (google.api_core.retry.Retry): Designation of what errors, if any,
2646+
should be retried.
2647+
timeout (float): The timeout for this request.
2648+
metadata (Sequence[Tuple[str, str]]): Strings which should be
2649+
sent along with the request as metadata.
2650+
2651+
Returns:
2652+
google.cloud.spanner_admin_database_v1.services.database_admin.pagers.ListDatabaseRolesAsyncPager:
2653+
The response for
2654+
[ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles].
2655+
2656+
Iterating over this object will yield results and
2657+
resolve additional pages automatically.
2658+
2659+
"""
2660+
# Create or coerce a protobuf request object.
2661+
# Quick check: If we got a request object, we should *not* have
2662+
# gotten any keyword arguments that map to the request.
2663+
has_flattened_params = any([parent])
2664+
if request is not None and has_flattened_params:
2665+
raise ValueError(
2666+
"If the `request` argument is set, then none of "
2667+
"the individual field arguments should be set."
2668+
)
2669+
2670+
request = spanner_database_admin.ListDatabaseRolesRequest(request)
2671+
2672+
# If we have keyword arguments corresponding to fields on the
2673+
# request, apply these.
2674+
if parent is not None:
2675+
request.parent = parent
2676+
2677+
# Wrap the RPC method; this adds retry and timeout information,
2678+
# and friendly error handling.
2679+
rpc = gapic_v1.method_async.wrap_method(
2680+
self._client._transport.list_database_roles,
2681+
default_retry=retries.Retry(
2682+
initial=1.0,
2683+
maximum=32.0,
2684+
multiplier=1.3,
2685+
predicate=retries.if_exception_type(
2686+
core_exceptions.DeadlineExceeded,
2687+
core_exceptions.ServiceUnavailable,
2688+
),
2689+
deadline=3600.0,
2690+
),
2691+
default_timeout=3600.0,
2692+
client_info=DEFAULT_CLIENT_INFO,
2693+
)
2694+
2695+
# Certain fields should be provided within the metadata header;
2696+
# add these here.
2697+
metadata = tuple(metadata) + (
2698+
gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)),
2699+
)
2700+
2701+
# Send the request.
2702+
response = await rpc(
2703+
request,
2704+
retry=retry,
2705+
timeout=timeout,
2706+
metadata=metadata,
2707+
)
2708+
2709+
# This method is paged; wrap the response in a pager, which provides
2710+
# an `__aiter__` convenience method.
2711+
response = pagers.ListDatabaseRolesAsyncPager(
2712+
method=rpc,
2713+
request=request,
2714+
response=response,
2715+
metadata=metadata,
2716+
)
2717+
2718+
# Done; return the response.
2719+
return response
2720+
25982721
async def __aenter__(self):
25992722
return self
26002723

google/cloud/spanner_admin_database_v1/services/database_admin/client.py

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,30 @@ def parse_database_path(path: str) -> Dict[str, str]:
273273
)
274274
return m.groupdict() if m else {}
275275

276+
@staticmethod
277+
def database_role_path(
278+
project: str,
279+
instance: str,
280+
database: str,
281+
role: str,
282+
) -> str:
283+
"""Returns a fully-qualified database_role string."""
284+
return "projects/{project}/instances/{instance}/databases/{database}/databaseRoles/{role}".format(
285+
project=project,
286+
instance=instance,
287+
database=database,
288+
role=role,
289+
)
290+
291+
@staticmethod
292+
def parse_database_role_path(path: str) -> Dict[str, str]:
293+
"""Parses a database_role path into its component segments."""
294+
m = re.match(
295+
r"^projects/(?P<project>.+?)/instances/(?P<instance>.+?)/databases/(?P<database>.+?)/databaseRoles/(?P<role>.+?)$",
296+
path,
297+
)
298+
return m.groupdict() if m else {}
299+
276300
@staticmethod
277301
def instance_path(
278302
project: str,
@@ -2771,6 +2795,115 @@ def sample_list_backup_operations():
27712795
# Done; return the response.
27722796
return response
27732797

2798+
def list_database_roles(
2799+
self,
2800+
request: Union[spanner_database_admin.ListDatabaseRolesRequest, dict] = None,
2801+
*,
2802+
parent: str = None,
2803+
retry: OptionalRetry = gapic_v1.method.DEFAULT,
2804+
timeout: float = None,
2805+
metadata: Sequence[Tuple[str, str]] = (),
2806+
) -> pagers.ListDatabaseRolesPager:
2807+
r"""Lists Cloud Spanner database roles.
2808+
2809+
.. code-block:: python
2810+
2811+
from google.cloud import spanner_admin_database_v1
2812+
2813+
def sample_list_database_roles():
2814+
# Create a client
2815+
client = spanner_admin_database_v1.DatabaseAdminClient()
2816+
2817+
# Initialize request argument(s)
2818+
request = spanner_admin_database_v1.ListDatabaseRolesRequest(
2819+
parent="parent_value",
2820+
)
2821+
2822+
# Make the request
2823+
page_result = client.list_database_roles(request=request)
2824+
2825+
# Handle the response
2826+
for response in page_result:
2827+
print(response)
2828+
2829+
Args:
2830+
request (Union[google.cloud.spanner_admin_database_v1.types.ListDatabaseRolesRequest, dict]):
2831+
The request object. The request for
2832+
[ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles].
2833+
parent (str):
2834+
Required. The database whose roles should be listed.
2835+
Values are of the form
2836+
``projects/<project>/instances/<instance>/databases/<database>/databaseRoles``.
2837+
2838+
This corresponds to the ``parent`` field
2839+
on the ``request`` instance; if ``request`` is provided, this
2840+
should not be set.
2841+
retry (google.api_core.retry.Retry): Designation of what errors, if any,
2842+
should be retried.
2843+
timeout (float): The timeout for this request.
2844+
metadata (Sequence[Tuple[str, str]]): Strings which should be
2845+
sent along with the request as metadata.
2846+
2847+
Returns:
2848+
google.cloud.spanner_admin_database_v1.services.database_admin.pagers.ListDatabaseRolesPager:
2849+
The response for
2850+
[ListDatabaseRoles][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseRoles].
2851+
2852+
Iterating over this object will yield results and
2853+
resolve additional pages automatically.
2854+
2855+
"""
2856+
# Create or coerce a protobuf request object.
2857+
# Quick check: If we got a request object, we should *not* have
2858+
# gotten any keyword arguments that map to the request.
2859+
has_flattened_params = any([parent])
2860+
if request is not None and has_flattened_params:
2861+
raise ValueError(
2862+
"If the `request` argument is set, then none of "
2863+
"the individual field arguments should be set."
2864+
)
2865+
2866+
# Minor optimization to avoid making a copy if the user passes
2867+
# in a spanner_database_admin.ListDatabaseRolesRequest.
2868+
# There's no risk of modifying the input as we've already verified
2869+
# there are no flattened fields.
2870+
if not isinstance(request, spanner_database_admin.ListDatabaseRolesRequest):
2871+
request = spanner_database_admin.ListDatabaseRolesRequest(request)
2872+
# If we have keyword arguments corresponding to fields on the
2873+
# request, apply these.
2874+
if parent is not None:
2875+
request.parent = parent
2876+
2877+
# Wrap the RPC method; this adds retry and timeout information,
2878+
# and friendly error handling.
2879+
rpc = self._transport._wrapped_methods[self._transport.list_database_roles]
2880+
2881+
# Certain fields should be provided within the metadata header;
2882+
# add these here.
2883+
metadata = tuple(metadata) + (
2884+
gapic_v1.routing_header.to_grpc_metadata((("parent", request.parent),)),
2885+
)
2886+
2887+
# Send the request.
2888+
response = rpc(
2889+
request,
2890+
retry=retry,
2891+
timeout=timeout,
2892+
metadata=metadata,
2893+
)
2894+
2895+
# This method is paged; wrap the response in a pager, which provides
2896+
# an `__iter__` convenience method.
2897+
response = pagers.ListDatabaseRolesPager(
2898+
method=rpc,
2899+
request=request,
2900+
response=response,
2901+
metadata=metadata,
2902+
)
2903+
2904+
# Done; return the response.
2905+
return response
2906+
27742907
def __enter__(self):
27752908
return self
27762909

0 commit comments

Comments
 (0)