-
Notifications
You must be signed in to change notification settings - Fork 88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add support for updateDatabase in Cloud Spanner #914
Changes from 4 commits
e4163d0
1d64d5d
ee653cd
167f68b
b27fd76
545cd8c
430543c
babd236
5420284
a700a02
effbfbf
8ad7820
23c2014
970cb8a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,6 +29,7 @@ | |
from google.api_core import gapic_v1 | ||
from google.iam.v1 import iam_policy_pb2 | ||
from google.iam.v1 import options_pb2 | ||
from google.protobuf.field_mask_pb2 import FieldMask | ||
|
||
from google.cloud.spanner_admin_database_v1 import CreateDatabaseRequest | ||
from google.cloud.spanner_admin_database_v1 import Database as DatabasePB | ||
|
@@ -124,6 +125,9 @@ class Database(object): | |
(Optional) database dialect for the database | ||
:type database_role: str or None | ||
:param database_role: (Optional) user-assigned database_role for the session. | ||
:type enable_drop_protection: boolean | ||
:param enable_drop_protection: (Optional) Represents whether the database | ||
has drop protection enabled or not. | ||
""" | ||
|
||
_spanner_api = None | ||
|
@@ -138,6 +142,7 @@ def __init__( | |
encryption_config=None, | ||
database_dialect=DatabaseDialect.DATABASE_DIALECT_UNSPECIFIED, | ||
database_role=None, | ||
enable_drop_protection=False, | ||
): | ||
self.database_id = database_id | ||
self._instance = instance | ||
|
@@ -155,6 +160,8 @@ def __init__( | |
self._encryption_config = encryption_config | ||
self._database_dialect = database_dialect | ||
self._database_role = database_role | ||
self._enable_drop_protection = enable_drop_protection | ||
self._reconciling = False | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can't see any place where this value is updated? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is updated at line 359 of this file, using the property setter. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am referring to |
||
|
||
if pool is None: | ||
pool = BurstyPool(database_role=database_role) | ||
|
@@ -328,6 +335,29 @@ def database_role(self): | |
""" | ||
return self._database_role | ||
|
||
@property | ||
def reconciling(self): | ||
"""Whether the database is currently reconciling. | ||
|
||
:rtype: boolean | ||
:returns: a boolean representing whether the database is reconciling | ||
""" | ||
return self._reconciling | ||
|
||
@property | ||
def enable_drop_protection(self): | ||
"""Whether the database has drop protection enabled. | ||
|
||
:rtype: boolean | ||
:returns: a boolean representing whether the database has drop | ||
protection enabled | ||
""" | ||
return self._enable_drop_protection | ||
|
||
@enable_drop_protection.setter | ||
def enable_drop_protection(self, value): | ||
self._enable_drop_protection = value | ||
|
||
@property | ||
def logger(self): | ||
"""Logger used by the database. | ||
|
@@ -457,14 +487,15 @@ def reload(self): | |
self._encryption_info = response.encryption_info | ||
self._default_leader = response.default_leader | ||
self._database_dialect = response.database_dialect | ||
self._enable_drop_protection = response.enable_drop_protection | ||
|
||
def update_ddl(self, ddl_statements, operation_id=""): | ||
"""Update DDL for this database. | ||
|
||
Apply any configured schema from :attr:`ddl_statements`. | ||
|
||
See | ||
https://cloud.google.com/spanner/reference/rpc/google.spanner.admin.database.v1#google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase | ||
https://cloud.google.com/spanner/reference/rpc/google.spanner.admin.database.v1#google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabaseDdl | ||
|
||
:type ddl_statements: Sequence[str] | ||
:param ddl_statements: a list of DDL statements to use on this database | ||
|
@@ -488,6 +519,46 @@ def update_ddl(self, ddl_statements, operation_id=""): | |
future = api.update_database_ddl(request=request, metadata=metadata) | ||
return future | ||
|
||
def update(self, fields): | ||
"""Update this database. | ||
|
||
See | ||
https://cloud.google.com/spanner/reference/rpc/google.spanner.admin.database.v1#google.spanner.admin.database.v1.DatabaseAdmin.UpdateDatabase | ||
|
||
.. note:: | ||
|
||
Updates the specified fields of a Cloud Spanner database. Currently, | ||
only the `enable_drop_protection` field supports updates. To change | ||
this value before updating, set it via | ||
|
||
.. code:: python | ||
|
||
database.enable_drop_protection = True | ||
asthamohta marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
before calling :meth:`update`. | ||
|
||
:type fields: Sequence[str] | ||
:param fields: a list of fields to update | ||
|
||
:rtype: :class:`google.api_core.operation.Operation` | ||
:returns: an operation instance | ||
:raises NotFound: if the database does not exist | ||
""" | ||
api = self._instance._client.database_admin_api | ||
database_pb = DatabasePB( | ||
name=self.name, enable_drop_protection=self._enable_drop_protection | ||
) | ||
|
||
# Only support updating drop protection for now. | ||
field_mask = FieldMask(paths=fields) | ||
metadata = _metadata_with_prefix(self.name) | ||
|
||
future = api.update_database( | ||
database=database_pb, update_mask=field_mask, metadata=metadata | ||
) | ||
|
||
return future | ||
|
||
def drop(self): | ||
"""Drop this database. | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,8 +17,10 @@ | |
|
||
import mock | ||
from google.api_core import gapic_v1 | ||
from google.cloud.spanner_admin_database_v1 import Database as DatabasePB | ||
from google.cloud.spanner_v1.param_types import INT64 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks |
||
from google.api_core.retry import Retry | ||
from google.protobuf.field_mask_pb2 import FieldMask | ||
|
||
from google.cloud.spanner_v1 import RequestOptions | ||
|
||
|
@@ -877,6 +879,32 @@ def test_update_ddl_w_operation_id(self): | |
metadata=[("google-cloud-resource-prefix", database.name)], | ||
) | ||
|
||
def test_update_success(self): | ||
op_future = object() | ||
client = _Client() | ||
api = client.database_admin_api = self._make_database_admin_api() | ||
api.update_database.return_value = op_future | ||
|
||
instance = _Instance(self.INSTANCE_NAME, client=client) | ||
pool = _Pool() | ||
database = self._make_one( | ||
self.DATABASE_ID, instance, enable_drop_protection=True, pool=pool | ||
) | ||
|
||
future = database.update(["enable_drop_protection"]) | ||
|
||
self.assertIs(future, op_future) | ||
|
||
expected_database = DatabasePB(name=database.name, enable_drop_protection=True) | ||
|
||
field_mask = FieldMask(paths=["enable_drop_protection"]) | ||
|
||
api.update_database.assert_called_once_with( | ||
database=expected_database, | ||
update_mask=field_mask, | ||
metadata=[("google-cloud-resource-prefix", database.name)], | ||
) | ||
|
||
def test_drop_grpc_error(self): | ||
from google.api_core.exceptions import Unknown | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks