|
19 | 19 | """
|
20 | 20 |
|
21 | 21 | import argparse
|
22 |
| -import time |
23 | 22 | from datetime import datetime, timedelta
|
| 23 | +import time |
24 | 24 |
|
25 | 25 | from google.api_core import protobuf_helpers
|
26 | 26 | from google.cloud import spanner
|
|
31 | 31 | def create_backup(instance_id, database_id, backup_id, version_time):
|
32 | 32 | """Creates a backup for a database."""
|
33 | 33 |
|
34 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
35 |
| - backup as backup_pb |
| 34 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
36 | 35 |
|
37 | 36 | spanner_client = spanner.Client()
|
38 | 37 | database_admin_api = spanner_client.database_admin_api
|
@@ -76,10 +75,8 @@ def create_backup_with_encryption_key(
|
76 | 75 | ):
|
77 | 76 | """Creates a backup for a database using a Customer Managed Encryption Key (CMEK)."""
|
78 | 77 |
|
79 |
| - from google.cloud.spanner_admin_database_v1 import \ |
80 |
| - CreateBackupEncryptionConfig |
81 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
82 |
| - backup as backup_pb |
| 78 | + from google.cloud.spanner_admin_database_v1 import CreateBackupEncryptionConfig |
| 79 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
83 | 80 |
|
84 | 81 | spanner_client = spanner.Client()
|
85 | 82 | database_admin_api = spanner_client.database_admin_api
|
@@ -119,6 +116,53 @@ def create_backup_with_encryption_key(
|
119 | 116 |
|
120 | 117 | # [END spanner_create_backup_with_encryption_key]
|
121 | 118 |
|
| 119 | +# [START spanner_create_backup_with_MR_CMEK] |
| 120 | +def create_backup_with_multiple_kms_keys( |
| 121 | + instance_id, database_id, backup_id, kms_key_names |
| 122 | +): |
| 123 | + """Creates a backup for a database using multiple KMS keys(CMEK).""" |
| 124 | + |
| 125 | + from google.cloud.spanner_admin_database_v1 import CreateBackupEncryptionConfig |
| 126 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
| 127 | + |
| 128 | + spanner_client = spanner.Client() |
| 129 | + database_admin_api = spanner_client.database_admin_api |
| 130 | + |
| 131 | + # Create a backup |
| 132 | + expire_time = datetime.utcnow() + timedelta(days=14) |
| 133 | + encryption_config = { |
| 134 | + "encryption_type": CreateBackupEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION, |
| 135 | + "kms_key_names": kms_key_names, |
| 136 | + } |
| 137 | + request = backup_pb.CreateBackupRequest( |
| 138 | + parent=database_admin_api.instance_path(spanner_client.project, instance_id), |
| 139 | + backup_id=backup_id, |
| 140 | + backup=backup_pb.Backup( |
| 141 | + database=database_admin_api.database_path( |
| 142 | + spanner_client.project, instance_id, database_id |
| 143 | + ), |
| 144 | + expire_time=expire_time, |
| 145 | + ), |
| 146 | + encryption_config=encryption_config, |
| 147 | + ) |
| 148 | + operation = database_admin_api.create_backup(request) |
| 149 | + |
| 150 | + # Wait for backup operation to complete. |
| 151 | + backup = operation.result(2100) |
| 152 | + |
| 153 | + # Verify that the backup is ready. |
| 154 | + assert backup.state == backup_pb.Backup.State.READY |
| 155 | + |
| 156 | + # Get the name, create time, backup size and encryption key. |
| 157 | + print( |
| 158 | + "Backup {} of size {} bytes was created at {} using encryption key {}".format( |
| 159 | + backup.name, backup.size_bytes, backup.create_time, kms_key_names |
| 160 | + ) |
| 161 | + ) |
| 162 | + |
| 163 | + |
| 164 | +# [END spanner_create_backup_with_MR_CMEK] |
| 165 | + |
122 | 166 |
|
123 | 167 | # [START spanner_restore_backup]
|
124 | 168 | def restore_database(instance_id, new_database_id, backup_id):
|
@@ -162,7 +206,9 @@ def restore_database_with_encryption_key(
|
162 | 206 | ):
|
163 | 207 | """Restores a database from a backup using a Customer Managed Encryption Key (CMEK)."""
|
164 | 208 | from google.cloud.spanner_admin_database_v1 import (
|
165 |
| - RestoreDatabaseEncryptionConfig, RestoreDatabaseRequest) |
| 209 | + RestoreDatabaseEncryptionConfig, |
| 210 | + RestoreDatabaseRequest, |
| 211 | + ) |
166 | 212 |
|
167 | 213 | spanner_client = spanner.Client()
|
168 | 214 | database_admin_api = spanner_client.database_admin_api
|
@@ -200,11 +246,56 @@ def restore_database_with_encryption_key(
|
200 | 246 |
|
201 | 247 | # [END spanner_restore_backup_with_encryption_key]
|
202 | 248 |
|
| 249 | +# [START spanner_restore_backup_with_MR_CMEK] |
| 250 | +def restore_database_with_multiple_kms_keys( |
| 251 | + instance_id, new_database_id, backup_id, kms_key_names |
| 252 | +): |
| 253 | + """Restores a database from a backup using a Customer Managed Encryption Key (CMEK).""" |
| 254 | + from google.cloud.spanner_admin_database_v1 import ( |
| 255 | + RestoreDatabaseEncryptionConfig, |
| 256 | + RestoreDatabaseRequest, |
| 257 | + ) |
| 258 | + |
| 259 | + spanner_client = spanner.Client() |
| 260 | + database_admin_api = spanner_client.database_admin_api |
| 261 | + |
| 262 | + # Start restoring an existing backup to a new database. |
| 263 | + encryption_config = { |
| 264 | + "encryption_type": RestoreDatabaseEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION, |
| 265 | + "kms_key_names": kms_key_names, |
| 266 | + } |
| 267 | + |
| 268 | + request = RestoreDatabaseRequest( |
| 269 | + parent=database_admin_api.instance_path(spanner_client.project, instance_id), |
| 270 | + database_id=new_database_id, |
| 271 | + backup=database_admin_api.backup_path( |
| 272 | + spanner_client.project, instance_id, backup_id |
| 273 | + ), |
| 274 | + encryption_config=encryption_config, |
| 275 | + ) |
| 276 | + operation = database_admin_api.restore_database(request) |
| 277 | + |
| 278 | + # Wait for restore operation to complete. |
| 279 | + db = operation.result(1600) |
| 280 | + |
| 281 | + # Newly created database has restore information. |
| 282 | + restore_info = db.restore_info |
| 283 | + print( |
| 284 | + "Database {} restored to {} from backup {} with using encryption key {}.".format( |
| 285 | + restore_info.backup_info.source_database, |
| 286 | + new_database_id, |
| 287 | + restore_info.backup_info.backup, |
| 288 | + db.encryption_config.kms_key_names, |
| 289 | + ) |
| 290 | + ) |
| 291 | + |
| 292 | + |
| 293 | +# [END spanner_restore_backup_with_MR_CMEK] |
| 294 | + |
203 | 295 |
|
204 | 296 | # [START spanner_cancel_backup_create]
|
205 | 297 | def cancel_backup(instance_id, database_id, backup_id):
|
206 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
207 |
| - backup as backup_pb |
| 298 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
208 | 299 |
|
209 | 300 | spanner_client = spanner.Client()
|
210 | 301 | database_admin_api = spanner_client.database_admin_api
|
@@ -259,8 +350,7 @@ def cancel_backup(instance_id, database_id, backup_id):
|
259 | 350 |
|
260 | 351 | # [START spanner_list_backup_operations]
|
261 | 352 | def list_backup_operations(instance_id, database_id, backup_id):
|
262 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
263 |
| - backup as backup_pb |
| 353 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
264 | 354 |
|
265 | 355 | spanner_client = spanner.Client()
|
266 | 356 | database_admin_api = spanner_client.database_admin_api
|
@@ -314,8 +404,7 @@ def list_backup_operations(instance_id, database_id, backup_id):
|
314 | 404 |
|
315 | 405 | # [START spanner_list_database_operations]
|
316 | 406 | def list_database_operations(instance_id):
|
317 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
318 |
| - spanner_database_admin |
| 407 | + from google.cloud.spanner_admin_database_v1.types import spanner_database_admin |
319 | 408 |
|
320 | 409 | spanner_client = spanner.Client()
|
321 | 410 | database_admin_api = spanner_client.database_admin_api
|
@@ -346,8 +435,7 @@ def list_database_operations(instance_id):
|
346 | 435 |
|
347 | 436 | # [START spanner_list_backups]
|
348 | 437 | def list_backups(instance_id, database_id, backup_id):
|
349 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
350 |
| - backup as backup_pb |
| 438 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
351 | 439 |
|
352 | 440 | spanner_client = spanner.Client()
|
353 | 441 | database_admin_api = spanner_client.database_admin_api
|
@@ -444,8 +532,7 @@ def list_backups(instance_id, database_id, backup_id):
|
444 | 532 |
|
445 | 533 | # [START spanner_delete_backup]
|
446 | 534 | def delete_backup(instance_id, backup_id):
|
447 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
448 |
| - backup as backup_pb |
| 535 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
449 | 536 |
|
450 | 537 | spanner_client = spanner.Client()
|
451 | 538 | database_admin_api = spanner_client.database_admin_api
|
@@ -486,8 +573,7 @@ def delete_backup(instance_id, backup_id):
|
486 | 573 |
|
487 | 574 | # [START spanner_update_backup]
|
488 | 575 | def update_backup(instance_id, backup_id):
|
489 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
490 |
| - backup as backup_pb |
| 576 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
491 | 577 |
|
492 | 578 | spanner_client = spanner.Client()
|
493 | 579 | database_admin_api = spanner_client.database_admin_api
|
@@ -526,8 +612,7 @@ def create_database_with_version_retention_period(
|
526 | 612 | ):
|
527 | 613 | """Creates a database with a version retention period."""
|
528 | 614 |
|
529 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
530 |
| - spanner_database_admin |
| 615 | + from google.cloud.spanner_admin_database_v1.types import spanner_database_admin |
531 | 616 |
|
532 | 617 | spanner_client = spanner.Client()
|
533 | 618 | database_admin_api = spanner_client.database_admin_api
|
@@ -578,8 +663,7 @@ def create_database_with_version_retention_period(
|
578 | 663 | def copy_backup(instance_id, backup_id, source_backup_path):
|
579 | 664 | """Copies a backup."""
|
580 | 665 |
|
581 |
| - from google.cloud.spanner_admin_database_v1.types import \ |
582 |
| - backup as backup_pb |
| 666 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
583 | 667 |
|
584 | 668 | spanner_client = spanner.Client()
|
585 | 669 | database_admin_api = spanner_client.database_admin_api
|
@@ -613,6 +697,54 @@ def copy_backup(instance_id, backup_id, source_backup_path):
|
613 | 697 |
|
614 | 698 | # [END spanner_copy_backup]
|
615 | 699 |
|
| 700 | +# [START spanner_copy_backup_with_MR_CMEK] |
| 701 | +def copy_backup_with_multiple_kms_keys( |
| 702 | + instance_id, backup_id, source_backup_path, kms_key_names |
| 703 | +): |
| 704 | + """Copies a backup.""" |
| 705 | + |
| 706 | + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb |
| 707 | + from google.cloud.spanner_admin_database_v1 import CopyBackupEncryptionConfig |
| 708 | + |
| 709 | + spanner_client = spanner.Client() |
| 710 | + database_admin_api = spanner_client.database_admin_api |
| 711 | + |
| 712 | + encryption_config = { |
| 713 | + "encryption_type": CopyBackupEncryptionConfig.EncryptionType.CUSTOMER_MANAGED_ENCRYPTION, |
| 714 | + "kms_key_names": kms_key_names, |
| 715 | + } |
| 716 | + |
| 717 | + # Create a backup object and wait for copy backup operation to complete. |
| 718 | + expire_time = datetime.utcnow() + timedelta(days=14) |
| 719 | + request = backup_pb.CopyBackupRequest( |
| 720 | + parent=database_admin_api.instance_path(spanner_client.project, instance_id), |
| 721 | + backup_id=backup_id, |
| 722 | + source_backup=source_backup_path, |
| 723 | + expire_time=expire_time, |
| 724 | + encryption_config=encryption_config, |
| 725 | + ) |
| 726 | + |
| 727 | + operation = database_admin_api.copy_backup(request) |
| 728 | + |
| 729 | + # Wait for backup operation to complete. |
| 730 | + copy_backup = operation.result(2100) |
| 731 | + |
| 732 | + # Verify that the copy backup is ready. |
| 733 | + assert copy_backup.state == backup_pb.Backup.State.READY |
| 734 | + |
| 735 | + print( |
| 736 | + "Backup {} of size {} bytes was created at {} with version time {} using encryption keys {}".format( |
| 737 | + copy_backup.name, |
| 738 | + copy_backup.size_bytes, |
| 739 | + copy_backup.create_time, |
| 740 | + copy_backup.version_time, |
| 741 | + copy_backup.encryption_information, |
| 742 | + ) |
| 743 | + ) |
| 744 | + |
| 745 | + |
| 746 | +# [END spanner_copy_backup_with_MR_CMEK] |
| 747 | + |
616 | 748 |
|
617 | 749 | if __name__ == "__main__": # noqa: C901
|
618 | 750 | parser = argparse.ArgumentParser(
|
|
0 commit comments