@@ -45,6 +45,11 @@ LastName STRING(1024)
4545 AlbumTitle STRING(MAX)
4646 ) PRIMARY KEY (SingerId, AlbumId)" ;
4747
48+ public const string BackupInstancePrefix = "default-schedule-test-" ;
49+ public const string InstanceWithProcessingUnitsPrefix = "my-ins-pu-" ;
50+ public const string InstanceWithMultiRegionPrefix = "my-ins-mr-" ;
51+ public const string InstanceWithInstancePartitionPrefix = "my-ins-prt-" ;
52+
4853 public string ProjectId { get ; } = Environment . GetEnvironmentVariable ( "GOOGLE_PROJECT_ID" ) ;
4954 // Allow environment variables to override the default instance and database names.
5055 public string InstanceId { get ; } = Environment . GetEnvironmentVariable ( "TEST_SPANNER_INSTANCE" ) ?? "my-instance" ;
@@ -86,13 +91,15 @@ AlbumTitle STRING(MAX)
8691 Environment . GetEnvironmentVariable ( "spanner.test.key.name" ) ?? "spanner-test-key" ) ;
8792 public CryptoKeyName [ ] KmsKeyNames { get ; private set ; }
8893
89- public string InstanceIdWithProcessingUnits { get ; } = GenerateId ( "my-ins-pu-" ) ;
90- public string InstanceIdWithMultiRegion { get ; } = GenerateId ( "my-ins-mr-" ) ;
91- public string InstanceIdWithInstancePartition { get ; } = GenerateId ( "my-ins-prt-" ) ;
94+ public string InstanceIdWithProcessingUnits { get ; } = GenerateId ( InstanceWithProcessingUnitsPrefix ) ;
95+ public string InstanceIdWithMultiRegion { get ; } = GenerateId ( InstanceWithMultiRegionPrefix ) ;
96+ public string InstanceIdWithInstancePartition { get ; } = GenerateId ( InstanceWithInstancePartitionPrefix ) ;
9297 public string InstanceConfigId { get ; } = "nam6" ;
9398
9499 private IList < string > TempDbIds { get ; } = new List < string > ( ) ;
95100
101+ private IList < string > TempInstanceIds { get ; } = new List < string > ( ) ;
102+
96103 public DatabaseAdminClient DatabaseAdminClient { get ; private set ; }
97104 public InstanceAdminClient InstanceAdminClient { get ; private set ; }
98105 public SpannerConnection AdminSpannerConnection { get ; private set ; }
@@ -151,7 +158,9 @@ public async Task DisposeAsync()
151158 DeleteInstanceAsync ( InstanceIdWithInstancePartition ) ,
152159 DeleteBackupAsync ( ToBeCancelledBackupId ) ,
153160 DeleteBackupAsync ( EncryptedBackupId ) ,
154- DeleteBackupAsync ( MultiRegionEncryptedRestoreDatabaseId )
161+ DeleteBackupAsync ( MultiRegionEncryptedRestoreDatabaseId ) ,
162+ DeleteStaleInstancesAsync ( ) ,
163+ DeleteStaleDatabaseAsync ( ) ,
155164 } ;
156165 DeleteInstanceConfig ( CreateCustomInstanceConfigId ) ;
157166 DeleteInstanceConfig ( UpdateCustomInstanceConfigId ) ;
@@ -162,6 +171,11 @@ public async Task DisposeAsync()
162171 cleanupTasks . Add ( DeleteDatabaseAsync ( id ) ) ;
163172 }
164173
174+ foreach ( string id in TempInstanceIds )
175+ {
176+ cleanupTasks . Add ( DeleteInstanceAsync ( id ) ) ;
177+ }
178+
165179 await Task . WhenAll ( cleanupTasks ) ;
166180 }
167181 finally
@@ -422,6 +436,49 @@ private async Task InitializeMultiRegionEncryptedBackupAsync()
422436 }
423437 }
424438
439+ /// <summary>
440+ /// Not all tests delete resources appropiately.
441+ /// We should fix that, but in the meantime, we can at least clean some stale resources.
442+ /// </summary>
443+ private async Task DeleteStaleInstancesAsync ( )
444+ {
445+ var now = DateTimeOffset . UtcNow ;
446+ var oneDay = TimeSpan . FromDays ( 1 ) ;
447+ await foreach ( var instance in InstanceAdminClient . ListInstancesAsync ( ProjectName . FromProject ( ProjectId ) ) )
448+ {
449+ if ( ( instance . InstanceName . InstanceId . StartsWith ( BackupInstancePrefix ) ||
450+ instance . InstanceName . InstanceId . StartsWith ( InstanceWithInstancePartitionPrefix ) ||
451+ instance . InstanceName . InstanceId . StartsWith ( InstanceWithMultiRegionPrefix ) ||
452+ instance . InstanceName . InstanceId . StartsWith ( InstanceWithProcessingUnitsPrefix ) ) &&
453+ now - instance . CreateTime . ToDateTimeOffset ( ) > oneDay )
454+ {
455+ await DeleteInstanceAsync ( instance . InstanceName . InstanceId ) ;
456+ }
457+ }
458+ }
459+
460+ /// <summary>
461+ /// Not all tests delete resources appropiately.
462+ /// We should fix that, but in the meantime, we can at least clean some stale resources.
463+ /// </summary>
464+ private async Task DeleteStaleDatabaseAsync ( )
465+ {
466+ var now = DateTimeOffset . UtcNow ;
467+ var oneDay = TimeSpan . FromDays ( 1 ) ;
468+ await foreach ( var database in DatabaseAdminClient . ListDatabasesAsync ( InstanceName . FromProjectInstance ( ProjectId , InstanceId ) ) )
469+ {
470+ if ( ( database . DatabaseName . DatabaseId . StartsWith ( "my-db-" ) ||
471+ database . DatabaseName . DatabaseId . StartsWith ( "my-enc-db-" ) ||
472+ database . DatabaseName . DatabaseId . StartsWith ( "my-mr-db-" ) ||
473+ database . DatabaseName . DatabaseId . StartsWith ( "my-restore-db-" ) ||
474+ database . DatabaseName . DatabaseId . StartsWith ( "temp-db-" ) ) &&
475+ now - database . CreateTime . ToDateTimeOffset ( ) > oneDay )
476+ {
477+ await DeleteDatabaseAsync ( database . DatabaseName . DatabaseId ) ;
478+ }
479+ }
480+ }
481+
425482 private async Task DeleteInstanceAsync ( string instanceId )
426483 {
427484 try
@@ -698,4 +755,6 @@ public async Task CreateTableAsyncPostgres(string createTableStatement)
698755 using var cmd = PgSpannerConnection . CreateDdlCommand ( createTableStatement ) ;
699756 await cmd . ExecuteNonQueryAsync ( ) ;
700757 }
758+
759+ internal void MarkInstanceForDeletion ( string instanceId ) => TempInstanceIds . Add ( instanceId ) ;
701760}
0 commit comments