diff --git a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BackupInfo.java b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BackupInfo.java index 3ea3329a6db..1349efeee2e 100644 --- a/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BackupInfo.java +++ b/google-cloud-spanner/src/main/java/com/google/cloud/spanner/BackupInfo.java @@ -156,9 +156,6 @@ public Builder setVersionTime(Timestamp versionTime) { @Override public Builder setDatabase(DatabaseId database) { - Preconditions.checkArgument( - database.getInstanceId().equals(id.getInstanceId()), - "The instance of the source database must be equal to the instance of the backup."); this.database = Preconditions.checkNotNull(database); return this; } diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java index dbb08f51a4c..ace26977bd3 100644 --- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java +++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/DatabaseAdminClientImplTest.java @@ -73,6 +73,7 @@ public class DatabaseAdminClientImplTest { private static final String PROJECT_ID = "my-project"; private static final String INSTANCE_ID = "my-instance"; + private static final String INSTANCE_ID_2 = "my-instance-2"; private static final String INSTANCE_NAME = "projects/my-project/instances/my-instance"; private static final String DB_ID = "my-db"; private static final String DB_NAME = "projects/my-project/instances/my-instance/databases/my-db"; @@ -591,6 +592,41 @@ public void copyBackupWithBackupObject() throws ExecutionException, InterruptedE assertThat(op.get().getId().getName()).isEqualTo(BK_NAME); } + @Test + public void copyBackupWithBackupObject_onDifferentInstances() + throws ExecutionException, InterruptedException { + Backup testProto = + Backup.newBuilder() + .setName(BK_NAME) + .setDatabase("projects/my-project/instances/my-instance-2/databases/my-db") + .setState(Backup.State.READY) + .build(); + final OperationFuture rawOperationFuture = + OperationFutureUtil.immediateOperationFuture( + "copyBackup", testProto, CopyBackupMetadata.getDefaultInstance()); + final Timestamp expireTime = + Timestamp.ofTimeMicroseconds( + TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()) + + TimeUnit.HOURS.toMicros(28)); + final Timestamp versionTime = + Timestamp.ofTimeMicroseconds( + TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()) - TimeUnit.DAYS.toMicros(2)); + final com.google.cloud.spanner.Backup requestBackup = + client + .newBackupBuilder(BackupId.of(PROJECT_ID, INSTANCE_ID_2, BK_ID)) + .setExpireTime(expireTime) + .setVersionTime(versionTime) + .build(); + BackupId sourceBackupId = BackupId.of(PROJECT_ID, INSTANCE_ID, BK_ID); + + when(rpc.copyBackup(sourceBackupId, requestBackup)).thenReturn(rawOperationFuture); + + final OperationFuture op = + client.copyBackup(sourceBackupId, requestBackup); + assertThat(op.isDone()).isTrue(); + assertThat(op.get().getId().getName()).isEqualTo(BK_NAME); + } + @Test public void copyEncryptedBackup() throws ExecutionException, InterruptedException { final OperationFuture rawOperationFuture =