Skip to content

Commit 698cd97

Browse files
committed
changes to samples
1 parent c8fbab6 commit 698cd97

File tree

3 files changed

+174
-16
lines changed

3 files changed

+174
-16
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright 2022 Google Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.example.spanner;
18+
19+
// [START spanner_copy_backup]
20+
21+
import com.google.api.gax.longrunning.OperationFuture;
22+
import com.google.cloud.Timestamp;
23+
import com.google.cloud.spanner.Backup;
24+
import com.google.cloud.spanner.BackupId;
25+
import com.google.cloud.spanner.DatabaseAdminClient;
26+
import com.google.cloud.spanner.Spanner;
27+
import com.google.cloud.spanner.SpannerException;
28+
import com.google.cloud.spanner.SpannerExceptionFactory;
29+
import com.google.cloud.spanner.SpannerOptions;
30+
import com.google.spanner.admin.database.v1.CopyBackupMetadata;
31+
import java.time.LocalDateTime;
32+
import java.time.OffsetDateTime;
33+
import java.util.concurrent.ExecutionException;
34+
import java.util.concurrent.TimeUnit;
35+
36+
public class CopyBackupSample {
37+
38+
public static void main(String[] args) {
39+
if (args.length != 4) {
40+
throw new IllegalArgumentException(
41+
"Invalid number of arguments. "
42+
+ "Usage: CopyBackupSample "
43+
+ "<project-id> <instance-id> <source-backup-id> <destination-backup-id>");
44+
}
45+
String projectId = args[0];
46+
String instanceId = args[1];
47+
String sourceBackupId = args[2];
48+
String destinationBackupId = args[3];
49+
50+
try (Spanner spanner =
51+
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
52+
DatabaseAdminClient databaseAdminClient = spanner.getDatabaseAdminClient();
53+
copyBackup(databaseAdminClient, projectId, instanceId, sourceBackupId, destinationBackupId);
54+
}
55+
}
56+
57+
static void copyBackup() {
58+
// TODO(developer): Replace these variables before running the sample.
59+
String projectId = "my-project";
60+
String instanceId = "my-instance";
61+
String sourceBackupId = "my-backup";
62+
String destinationBackupId = "my-destination-backup";
63+
64+
try (Spanner spanner =
65+
SpannerOptions.newBuilder().setProjectId(projectId).build().getService()) {
66+
DatabaseAdminClient databaseAdminClient = spanner.getDatabaseAdminClient();
67+
copyBackup(databaseAdminClient, projectId, instanceId, sourceBackupId, destinationBackupId);
68+
}
69+
}
70+
71+
static Void copyBackup(
72+
DatabaseAdminClient databaseAdminClient,
73+
String projectId,
74+
String instanceId,
75+
String sourceBackupId,
76+
String destinationBackupId) {
77+
78+
Timestamp expireTime =
79+
Timestamp.ofTimeMicroseconds(
80+
TimeUnit.MICROSECONDS.convert(
81+
System.currentTimeMillis() + TimeUnit.DAYS.toMillis(14), TimeUnit.MILLISECONDS));
82+
// Creates a copy of an existing backup.
83+
Backup destinationBackup =
84+
databaseAdminClient
85+
.newBackupBuilder(BackupId.of(projectId, instanceId, destinationBackupId))
86+
.setExpireTime(expireTime)
87+
.build();
88+
89+
// Initiate the request which returns an OperationFuture.
90+
System.out.println("Copying backup [" + destinationBackup.getId() + "]...");
91+
OperationFuture<Backup, CopyBackupMetadata> op =
92+
databaseAdminClient.copyBackup(
93+
BackupId.of(projectId, instanceId, sourceBackupId), destinationBackup);
94+
try {
95+
// Wait for the backup operation to complete.
96+
destinationBackup = op.get();
97+
System.out.println("Copied backup [" + destinationBackup.getId() + "]");
98+
} catch (ExecutionException e) {
99+
throw (SpannerException) e.getCause();
100+
} catch (InterruptedException e) {
101+
throw SpannerExceptionFactory.propagateInterrupt(e);
102+
}
103+
104+
// Reload the metadata of the backup from the server.
105+
destinationBackup = destinationBackup.reload();
106+
System.out.println(
107+
String.format(
108+
"Backup %s of size %d bytes was copied at %s for version of database at %s",
109+
destinationBackup.getId().getName(),
110+
destinationBackup.getSize(),
111+
LocalDateTime.ofEpochSecond(
112+
destinationBackup.getProto().getCreateTime().getSeconds(),
113+
destinationBackup.getProto().getCreateTime().getNanos(),
114+
OffsetDateTime.now().getOffset()),
115+
LocalDateTime.ofEpochSecond(
116+
destinationBackup.getProto().getVersionTime().getSeconds(),
117+
destinationBackup.getProto().getVersionTime().getNanos(),
118+
OffsetDateTime.now().getOffset())));
119+
120+
return null;
121+
}
122+
}
123+
// [END spanner_copy_backup]

samples/snippets/src/main/java/com/example/spanner/SpannerSample.java

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.google.longrunning.Operation;
5858
import com.google.protobuf.InvalidProtocolBufferException;
5959
import com.google.spanner.admin.database.v1.CreateBackupMetadata;
60+
import com.google.spanner.admin.database.v1.CopyBackupMetadata;
6061
import com.google.spanner.admin.database.v1.CreateDatabaseMetadata;
6162
import com.google.spanner.admin.database.v1.OptimizeRestoredDatabaseMetadata;
6263
import com.google.spanner.admin.database.v1.RestoreDatabaseMetadata;
@@ -1659,21 +1660,21 @@ static void cancelCreateBackup(
16591660
// [END spanner_cancel_backup_create]
16601661

16611662
// [START spanner_list_backup_operations]
1662-
static void listBackupOperations(InstanceAdminClient instanceAdminClient, DatabaseId databaseId) {
1663+
static void listBackupOperations(
1664+
InstanceAdminClient instanceAdminClient, DatabaseId databaseId, BackupId backupId) {
16631665
Instance instance = instanceAdminClient.getInstance(databaseId.getInstanceId().getInstance());
16641666
// Get create backup operations for the sample database.
16651667
Timestamp last24Hours = Timestamp.ofTimeSecondsAndNanos(TimeUnit.SECONDS.convert(
16661668
TimeUnit.HOURS.convert(Timestamp.now().getSeconds(), TimeUnit.SECONDS) - 24,
16671669
TimeUnit.HOURS), 0);
16681670
String filter =
16691671
String.format(
1670-
"(metadata.database:%s) AND "
1671-
+ "(metadata.@type:type.googleapis.com/"
1672-
+ "google.spanner.admin.database.v1.CreateBackupMetadata) AND "
1673-
+ "(metadata.progress.start_time > \"%s\")",
1674-
databaseId.getName(), last24Hours);
1675-
Page<Operation> operations = instance.listBackupOperations(Options.filter(filter));
1676-
for (Operation op : operations.iterateAll()) {
1672+
"(metadata.@type:type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) "
1673+
+ "AND (metadata.database:%s)",
1674+
databaseId.getName());
1675+
Page<Operation> createBackupOperations = instance.listBackupOperations(Options.filter(filter));
1676+
System.out.println("Create Backup Operations:");
1677+
for (Operation op : createBackupOperations.iterateAll()) {
16771678
try {
16781679
CreateBackupMetadata metadata = op.getMetadata().unpack(CreateBackupMetadata.class);
16791680
System.out.println(
@@ -1687,6 +1688,29 @@ static void listBackupOperations(InstanceAdminClient instanceAdminClient, Databa
16871688
System.err.println(e.getMessage());
16881689
}
16891690
}
1691+
// Get copy backup operations for the sample database.
1692+
filter =
1693+
String.format(
1694+
"(metadata.@type:type.googleapis.com/"
1695+
+ "google.spanner.admin.database.v1.CopyBackupMetadata) "
1696+
+ "AND (metadata.source_backup:%s)",
1697+
backupId.getName());
1698+
Page<Operation> copyBackupOperations = instance.listBackupOperations(Options.filter(filter));
1699+
System.out.println("Copy Backup Operations:");
1700+
for (Operation op : copyBackupOperations.iterateAll()) {
1701+
try {
1702+
CopyBackupMetadata copyBackupMetadata = op.getMetadata().unpack(CopyBackupMetadata.class);
1703+
System.out.println(
1704+
String.format(
1705+
"Copy Backup %s on backup %s pending: %d%% complete",
1706+
copyBackupMetadata.getName(),
1707+
copyBackupMetadata.getSourceBackup(),
1708+
copyBackupMetadata.getProgress().getProgressPercent()));
1709+
} catch (InvalidProtocolBufferException e) {
1710+
// The returned operation does not contain CopyBackupMetadata.
1711+
System.err.println(e.getMessage());
1712+
}
1713+
}
16901714
}
16911715
// [END spanner_list_backup_operations]
16921716

@@ -1840,7 +1864,12 @@ static void updateBackup(DatabaseAdminClient dbAdminClient, BackupId backupId) {
18401864
TimeUnit.SECONDS.toMicros(backup.getExpireTime().getSeconds())
18411865
+ TimeUnit.NANOSECONDS.toMicros(backup.getExpireTime().getNanos())
18421866
+ TimeUnit.DAYS.toMicros(30L));
1843-
System.out.println(String.format(
1867+
// New Expire Time must be less than Max Expire Time
1868+
expireTime = expireTime.compareTo(backup.getMaxExpireTime())<0?expireTime:backup.getMaxExpireTime();
1869+
int timeDiff = expireTime.compareTo(backup.getExpireTime());
1870+
Timestamp newExpireTime = (timeDiff < 0) ? expireTime : backup.getExpireTime();
1871+
1872+
System.out.println(String.format(
18441873
"Updating expire time of backup [%s] to %s...",
18451874
backupId.toString(),
18461875
LocalDateTime.ofEpochSecond(
@@ -2048,7 +2077,7 @@ static void run(
20482077
BackupId.of(backup.getInstanceId(), backup.getBackup() + "_cancel"));
20492078
break;
20502079
case "listbackupoperations":
2051-
listBackupOperations(instanceAdminClient, database);
2080+
listBackupOperations(instanceAdminClient, database, backup);
20522081
break;
20532082
case "listdatabaseoperations":
20542083
listDatabaseOperations(instanceAdminClient, dbAdminClient, database.getInstanceId());
@@ -2144,14 +2173,14 @@ static void printUsageAndExit() {
21442173
System.err.println(" SpannerExample querywithqueryoptions my-instance example-db");
21452174
System.err.println(" SpannerExample createbackup my-instance example-db");
21462175
System.err.println(" SpannerExample listbackups my-instance example-db");
2147-
System.err.println(" SpannerExample listbackupoperations my-instance example-db");
2176+
System.err.println(" SpannerExample listbackupoperations my-instance example-db backup-id");
21482177
System.err.println(" SpannerExample listdatabaseoperations my-instance example-db");
21492178
System.err.println(" SpannerExample restorebackup my-instance example-db");
21502179
System.exit(1);
21512180
}
21522181

21532182
public static void main(String[] args) throws Exception {
2154-
if (args.length != 3) {
2183+
if (args.length != 3 && args.length != 4) {
21552184
printUsageAndExit();
21562185
}
21572186
// [START init_client]
@@ -2176,6 +2205,9 @@ public static void main(String[] args) throws Exception {
21762205
"%s_%02d",
21772206
db.getDatabase(), LocalDate.now().get(ChronoField.ALIGNED_WEEK_OF_YEAR));
21782207
BackupId backup = BackupId.of(db.getInstanceId(), backupName);
2208+
if( args.length == 4) {
2209+
backupName = args[3];
2210+
}
21792211

21802212
// [START init_client]
21812213
DatabaseClient dbClient = spanner.getDatabaseClient(db);

samples/snippets/src/test/java/com/example/spanner/SpannerSampleIT.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public static void setUp() throws Exception {
9595
key = String.format("projects/%s/locations/%s/keyRings/%s/cryptoKeys/%s",
9696
options.getProjectId(), keyLocation, keyRing, keyName);
9797
}
98-
98+
9999
static void deleteStaleTestDatabases(String instanceId, String baseDbId) {
100100
Timestamp now = Timestamp.now();
101101
Pattern samplePattern = getTestDbIdPattern(baseDbId);
@@ -328,6 +328,9 @@ public void testSample() throws Exception {
328328
"Backup %s on database %s pending:",
329329
backupId.getName(),
330330
dbId.getName()));
331+
assertThat(out).contains(
332+
"Copy Backup Operations"
333+
);
331334
} catch (SpannerException e) {
332335
assertThat(e.getErrorCode()).isEqualTo(ErrorCode.INVALID_ARGUMENT);
333336
assertThat(e.getMessage()).contains("Cannot evaluate filter expression");
@@ -407,7 +410,7 @@ public void testSample() throws Exception {
407410
out = runSample("deletebackup");
408411
assertThat(out).contains("Deleted backup [" + backupId + "]");
409412
}
410-
413+
411414
@Test
412415
public void testEncryptedDatabaseAndBackupSamples() throws Exception {
413416
String projectId = spanner.getOptions().getProjectId();
@@ -510,7 +513,7 @@ public void testCreateInstanceSample() {
510513
private static int countOccurrences(String input, String search) {
511514
return input.split(search).length - 1;
512515
}
513-
516+
514517
private static String toComparableId(String baseId, String existingId) {
515518
String zeroUuid = "00000000-0000-0000-0000-0000-00000000";
516519
int shouldBeLength = (baseId + "-" + zeroUuid).length();
@@ -523,7 +526,7 @@ private static Pattern getTestDbIdPattern(String baseDbId) {
523526
baseDbId + "-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{8}",
524527
Pattern.CASE_INSENSITIVE);
525528
}
526-
529+
527530
static String formatForTest(String name) {
528531
return name + "-" + UUID.randomUUID().toString().substring(0, DBID_LENGTH);
529532
}

0 commit comments

Comments
 (0)