Skip to content

Commit 38fb890

Browse files
feat: Add support for UpdateDatabase in Cloud Spanner (#941)
* feat: Add support for UpdateDatabase in Cloud Spanner PiperOrigin-RevId: 531423380 Source-Link: googleapis/googleapis@3e054d1 Source-Link: googleapis/googleapis-gen@e347738 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZTM0NzczODQ4Mzc0M2U4ZTg2NmNhYzcyMmRiMGU5NDI1MzU2ZmM4MCJ9 * 🦉 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 998b87a commit 38fb890

17 files changed

+1647
-3
lines changed

google/cloud/spanner_admin_database_v1/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
from .types.spanner_database_admin import RestoreInfo
6262
from .types.spanner_database_admin import UpdateDatabaseDdlMetadata
6363
from .types.spanner_database_admin import UpdateDatabaseDdlRequest
64+
from .types.spanner_database_admin import UpdateDatabaseMetadata
65+
from .types.spanner_database_admin import UpdateDatabaseRequest
6466
from .types.spanner_database_admin import RestoreSourceType
6567

6668
__all__ = (
@@ -107,4 +109,6 @@
107109
"UpdateBackupRequest",
108110
"UpdateDatabaseDdlMetadata",
109111
"UpdateDatabaseDdlRequest",
112+
"UpdateDatabaseMetadata",
113+
"UpdateDatabaseRequest",
110114
)

google/cloud/spanner_admin_database_v1/gapic_metadata.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@
100100
"update_backup"
101101
]
102102
},
103+
"UpdateDatabase": {
104+
"methods": [
105+
"update_database"
106+
]
107+
},
103108
"UpdateDatabaseDdl": {
104109
"methods": [
105110
"update_database_ddl"
@@ -200,6 +205,11 @@
200205
"update_backup"
201206
]
202207
},
208+
"UpdateDatabase": {
209+
"methods": [
210+
"update_database"
211+
]
212+
},
203213
"UpdateDatabaseDdl": {
204214
"methods": [
205215
"update_database_ddl"
@@ -300,6 +310,11 @@
300310
"update_backup"
301311
]
302312
},
313+
"UpdateDatabase": {
314+
"methods": [
315+
"update_database"
316+
]
317+
},
303318
"UpdateDatabaseDdl": {
304319
"methods": [
305320
"update_database_ddl"

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

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,188 @@ async def sample_get_database():
633633
# Done; return the response.
634634
return response
635635

636+
async def update_database(
637+
self,
638+
request: Optional[
639+
Union[spanner_database_admin.UpdateDatabaseRequest, dict]
640+
] = None,
641+
*,
642+
database: Optional[spanner_database_admin.Database] = None,
643+
update_mask: Optional[field_mask_pb2.FieldMask] = None,
644+
retry: OptionalRetry = gapic_v1.method.DEFAULT,
645+
timeout: Union[float, object] = gapic_v1.method.DEFAULT,
646+
metadata: Sequence[Tuple[str, str]] = (),
647+
) -> operation_async.AsyncOperation:
648+
r"""Updates a Cloud Spanner database. The returned [long-running
649+
operation][google.longrunning.Operation] can be used to track
650+
the progress of updating the database. If the named database
651+
does not exist, returns ``NOT_FOUND``.
652+
653+
While the operation is pending:
654+
655+
- The database's
656+
[reconciling][google.spanner.admin.database.v1.Database.reconciling]
657+
field is set to true.
658+
- Cancelling the operation is best-effort. If the cancellation
659+
succeeds, the operation metadata's
660+
[cancel_time][google.spanner.admin.database.v1.UpdateDatabaseMetadata.cancel_time]
661+
is set, the updates are reverted, and the operation
662+
terminates with a ``CANCELLED`` status.
663+
- New UpdateDatabase requests will return a
664+
``FAILED_PRECONDITION`` error until the pending operation is
665+
done (returns successfully or with error).
666+
- Reading the database via the API continues to give the
667+
pre-request values.
668+
669+
Upon completion of the returned operation:
670+
671+
- The new values are in effect and readable via the API.
672+
- The database's
673+
[reconciling][google.spanner.admin.database.v1.Database.reconciling]
674+
field becomes false.
675+
676+
The returned [long-running
677+
operation][google.longrunning.Operation] will have a name of the
678+
format
679+
``projects/<project>/instances/<instance>/databases/<database>/operations/<operation_id>``
680+
and can be used to track the database modification. The
681+
[metadata][google.longrunning.Operation.metadata] field type is
682+
[UpdateDatabaseMetadata][google.spanner.admin.database.v1.UpdateDatabaseMetadata].
683+
The [response][google.longrunning.Operation.response] field type
684+
is [Database][google.spanner.admin.database.v1.Database], if
685+
successful.
686+
687+
.. code-block:: python
688+
689+
# This snippet has been automatically generated and should be regarded as a
690+
# code template only.
691+
# It will require modifications to work:
692+
# - It may require correct/in-range values for request initialization.
693+
# - It may require specifying regional endpoints when creating the service
694+
# client as shown in:
695+
# https://googleapis.dev/python/google-api-core/latest/client_options.html
696+
from google.cloud import spanner_admin_database_v1
697+
698+
async def sample_update_database():
699+
# Create a client
700+
client = spanner_admin_database_v1.DatabaseAdminAsyncClient()
701+
702+
# Initialize request argument(s)
703+
database = spanner_admin_database_v1.Database()
704+
database.name = "name_value"
705+
706+
request = spanner_admin_database_v1.UpdateDatabaseRequest(
707+
database=database,
708+
)
709+
710+
# Make the request
711+
operation = client.update_database(request=request)
712+
713+
print("Waiting for operation to complete...")
714+
715+
response = (await operation).result()
716+
717+
# Handle the response
718+
print(response)
719+
720+
Args:
721+
request (Optional[Union[google.cloud.spanner_admin_database_v1.types.UpdateDatabaseRequest, dict]]):
722+
The request object. The request for
723+
[UpdateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase].
724+
database (:class:`google.cloud.spanner_admin_database_v1.types.Database`):
725+
Required. The database to update. The ``name`` field of
726+
the database is of the form
727+
``projects/<project>/instances/<instance>/databases/<database>``.
728+
729+
This corresponds to the ``database`` field
730+
on the ``request`` instance; if ``request`` is provided, this
731+
should not be set.
732+
update_mask (:class:`google.protobuf.field_mask_pb2.FieldMask`):
733+
Required. The list of fields to update. Currently, only
734+
``enable_drop_protection`` field can be updated.
735+
736+
This corresponds to the ``update_mask`` field
737+
on the ``request`` instance; if ``request`` is provided, this
738+
should not be set.
739+
retry (google.api_core.retry.Retry): Designation of what errors, if any,
740+
should be retried.
741+
timeout (float): The timeout for this request.
742+
metadata (Sequence[Tuple[str, str]]): Strings which should be
743+
sent along with the request as metadata.
744+
745+
Returns:
746+
google.api_core.operation_async.AsyncOperation:
747+
An object representing a long-running operation.
748+
749+
The result type for the operation will be
750+
:class:`google.cloud.spanner_admin_database_v1.types.Database`
751+
A Cloud Spanner database.
752+
753+
"""
754+
# Create or coerce a protobuf request object.
755+
# Quick check: If we got a request object, we should *not* have
756+
# gotten any keyword arguments that map to the request.
757+
has_flattened_params = any([database, update_mask])
758+
if request is not None and has_flattened_params:
759+
raise ValueError(
760+
"If the `request` argument is set, then none of "
761+
"the individual field arguments should be set."
762+
)
763+
764+
request = spanner_database_admin.UpdateDatabaseRequest(request)
765+
766+
# If we have keyword arguments corresponding to fields on the
767+
# request, apply these.
768+
if database is not None:
769+
request.database = database
770+
if update_mask is not None:
771+
request.update_mask = update_mask
772+
773+
# Wrap the RPC method; this adds retry and timeout information,
774+
# and friendly error handling.
775+
rpc = gapic_v1.method_async.wrap_method(
776+
self._client._transport.update_database,
777+
default_retry=retries.Retry(
778+
initial=1.0,
779+
maximum=32.0,
780+
multiplier=1.3,
781+
predicate=retries.if_exception_type(
782+
core_exceptions.DeadlineExceeded,
783+
core_exceptions.ServiceUnavailable,
784+
),
785+
deadline=3600.0,
786+
),
787+
default_timeout=3600.0,
788+
client_info=DEFAULT_CLIENT_INFO,
789+
)
790+
791+
# Certain fields should be provided within the metadata header;
792+
# add these here.
793+
metadata = tuple(metadata) + (
794+
gapic_v1.routing_header.to_grpc_metadata(
795+
(("database.name", request.database.name),)
796+
),
797+
)
798+
799+
# Send the request.
800+
response = await rpc(
801+
request,
802+
retry=retry,
803+
timeout=timeout,
804+
metadata=metadata,
805+
)
806+
807+
# Wrap the response in an operation future.
808+
response = operation_async.from_gapic(
809+
response,
810+
self._client._transport.operations_client,
811+
spanner_database_admin.Database,
812+
metadata_type=spanner_database_admin.UpdateDatabaseMetadata,
813+
)
814+
815+
# Done; return the response.
816+
return response
817+
636818
async def update_database_ddl(
637819
self,
638820
request: Optional[

0 commit comments

Comments
 (0)