@@ -60,23 +60,31 @@ AlbumTitle STRING(MAX)
6060 public string ToBeCancelledBackupId { get ; } = GenerateId ( "my-backup-" ) ;
6161 public string RestoredDatabaseId { get ; private set ; }
6262
63- public bool RunCmekBackupSampleTests { get ; private set ; }
63+ public bool SkipCmekBackupSampleTests { get ; private set ; }
6464 public const string SkipCmekBackupSamplesMessage = "Spanner CMEK backup sample tests are disabled by default for performance reasons. Set the environment variable RUN_SPANNER_CMEK_BACKUP_SAMPLES_TESTS=true to enable the test." ;
6565
6666 public string EncryptedDatabaseId { get ; private set ; }
6767 public string EncryptedBackupId { get ; } = GenerateId ( "my-enc-backup-" ) ;
68- // 'restore' is abbreviated to prevent the name from becoming longer than 30 characters.
6968 public string EncryptedRestoreDatabaseId { get ; private set ; }
7069
7170 // These are intentionally kept on the instance to avoid the need to create a new encrypted database and backup for each run.
7271 public string FixedEncryptedDatabaseId { get ; } = "fixed-enc-backup-db" ;
7372 public string FixedEncryptedBackupId { get ; } = "fixed-enc-backup" ;
7473
74+ public string MultiRegionEncryptedDatabaseId { get ; private set ; }
75+ public string MultiRegionEncryptedBackupId { get ; } = GenerateId ( "my-mr-enc-backup-" ) ;
76+ public string MultiRegionEncryptedRestoreDatabaseId { get ; private set ; }
77+
78+ // These are intentionally kept on the instance to avoid the need to create a new encrypted database and backup for each run.
79+ public string FixedMultiRegionEncryptedDatabaseId { get ; } = "fixed-mr-backup-db" ;
80+ public string FixedMultiRegionEncryptedBackupId { get ; } = "fixed-mr-backup" ;
81+
7582 public CryptoKeyName KmsKeyName { get ; } = new CryptoKeyName (
7683 Environment . GetEnvironmentVariable ( "spanner.test.key.project" ) ?? Environment . GetEnvironmentVariable ( "GOOGLE_PROJECT_ID" ) ,
7784 Environment . GetEnvironmentVariable ( "spanner.test.key.location" ) ?? "us-central1" ,
7885 Environment . GetEnvironmentVariable ( "spanner.test.key.ring" ) ?? "spanner-test-keyring" ,
7986 Environment . GetEnvironmentVariable ( "spanner.test.key.name" ) ?? "spanner-test-key" ) ;
87+ public CryptoKeyName [ ] KmsKeyNames { get ; private set ; }
8088
8189 public string InstanceIdWithProcessingUnits { get ; } = GenerateId ( "my-ins-pu-" ) ;
8290 public string InstanceIdWithMultiRegion { get ; } = GenerateId ( "my-ins-mr-" ) ;
@@ -103,6 +111,9 @@ public async Task InitializeAsync()
103111 RestoredDatabaseId = GenerateTempDatabaseId ( "my-restore-db-" ) ;
104112 EncryptedDatabaseId = GenerateTempDatabaseId ( "my-enc-db-" ) ;
105113 EncryptedRestoreDatabaseId = GenerateTempDatabaseId ( "my-enc-r-db-" ) ;
114+ MultiRegionEncryptedDatabaseId = GenerateTempDatabaseId ( "my-mr-db-" ) ;
115+ MultiRegionEncryptedRestoreDatabaseId = GenerateTempDatabaseId ( "my-mr-r-db-" ) ;
116+ KmsKeyNames = new CryptoKeyName [ ] { KmsKeyName } ;
106117
107118 DatabaseAdminClient = await DatabaseAdminClient . CreateAsync ( ) ;
108119 InstanceAdminClient = await InstanceAdminClient . CreateAsync ( ) ;
@@ -111,7 +122,7 @@ public async Task InitializeAsync()
111122 PgSpannerConnection = new SpannerConnection ( $ "Data Source=projects/{ ProjectId } /instances/{ InstanceId } /databases/{ PostgreSqlDatabaseId } ") ;
112123
113124 bool . TryParse ( Environment . GetEnvironmentVariable ( "RUN_SPANNER_CMEK_BACKUP_SAMPLES_TESTS" ) , out var runCmekBackupSampleTests ) ;
114- RunCmekBackupSampleTests = runCmekBackupSampleTests ;
125+ SkipCmekBackupSampleTests = ! runCmekBackupSampleTests ;
115126
116127 await MaybeInitializeTestInstanceAsync ( ) ;
117128 await CreateInstanceWithMultiRegionAsync ( ) ;
@@ -122,9 +133,10 @@ public async Task InitializeAsync()
122133
123134 // Create encryption key for creating an encrypted database and optionally backing up and restoring an encrypted database.
124135 await InitializeEncryptionKeys ( ) ;
125- if ( RunCmekBackupSampleTests )
136+ if ( ! SkipCmekBackupSampleTests )
126137 {
127138 await InitializeEncryptedBackupAsync ( ) ;
139+ await InitializeMultiRegionEncryptedBackupAsync ( ) ;
128140 }
129141 }
130142
@@ -138,9 +150,9 @@ public async Task DisposeAsync()
138150 DeleteInstanceAsync ( InstanceIdWithProcessingUnits ) ,
139151 DeleteInstanceAsync ( InstanceIdWithInstancePartition ) ,
140152 DeleteBackupAsync ( ToBeCancelledBackupId ) ,
141- DeleteBackupAsync ( EncryptedBackupId )
153+ DeleteBackupAsync ( EncryptedBackupId ) ,
154+ DeleteBackupAsync ( MultiRegionEncryptedRestoreDatabaseId )
142155 } ;
143-
144156 DeleteInstanceConfig ( CreateCustomInstanceConfigId ) ;
145157 DeleteInstanceConfig ( UpdateCustomInstanceConfigId ) ;
146158 DeleteInstanceConfig ( DeleteCustomInstanceConfigId ) ;
@@ -378,6 +390,38 @@ private async Task InitializeEncryptedBackupAsync()
378390 }
379391 }
380392
393+ private async Task InitializeMultiRegionEncryptedBackupAsync ( )
394+ {
395+ // Sample backup for MR CMEK restore test.
396+ try
397+ {
398+ CreateDatabaseWithMultiRegionEncryptionAsyncSample createDatabaseAsyncSample = new CreateDatabaseWithMultiRegionEncryptionAsyncSample ( ) ;
399+ InsertDataAsyncSample insertDataAsyncSample = new InsertDataAsyncSample ( ) ;
400+ await createDatabaseAsyncSample . CreateDatabaseWithMultiRegionEncryptionAsync ( ProjectId , InstanceId , FixedMultiRegionEncryptedDatabaseId , KmsKeyNames ) ;
401+ await insertDataAsyncSample . InsertDataAsync ( ProjectId , InstanceId , FixedMultiRegionEncryptedDatabaseId ) ;
402+ }
403+ catch ( Exception e ) when ( e . ToString ( ) . Contains ( "Database already exists" ) )
404+ {
405+ // We intentionally keep an existing database around to reduce
406+ // the likelihood of test timeouts when creating a backup so
407+ // it's ok to get an AlreadyExists error.
408+ Console . WriteLine ( $ "Database { FixedMultiRegionEncryptedDatabaseId } already exists.") ;
409+ }
410+
411+ try
412+ {
413+ CreateBackupWithMultiRegionEncryptionAsyncSample createBackupSample = new CreateBackupWithMultiRegionEncryptionAsyncSample ( ) ;
414+ await createBackupSample . CreateBackupWithMultiRegionEncryptionAsync ( ProjectId , InstanceId , FixedMultiRegionEncryptedDatabaseId , FixedMultiRegionEncryptedBackupId , KmsKeyNames ) ;
415+ }
416+ catch ( RpcException e ) when ( e . StatusCode == StatusCode . AlreadyExists )
417+ {
418+ // We intentionally keep an existing backup around to reduce
419+ // the likelihood of test timeouts when creating a backup so
420+ // it's ok to get an AlreadyExists error.
421+ Console . WriteLine ( $ "Backup { FixedMultiRegionEncryptedBackupId } already exists.") ;
422+ }
423+ }
424+
381425 private async Task DeleteInstanceAsync ( string instanceId )
382426 {
383427 try
0 commit comments