Skip to content

Commit 0a49c37

Browse files
committed
Revert "removing samples"
This reverts commit b06a3df.
1 parent a89afb0 commit 0a49c37

File tree

7 files changed

+211
-24
lines changed

7 files changed

+211
-24
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/Backup.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
package com.google.cloud.spanner;
1818

19-
import static com.google.common.base.Preconditions.checkArgument;
20-
2119
import com.google.api.client.util.Preconditions;
2220
import com.google.api.gax.longrunning.OperationFuture;
2321
import com.google.api.gax.paging.Page;
@@ -28,6 +26,8 @@
2826
import com.google.spanner.admin.database.v1.CreateBackupMetadata;
2927
import com.google.spanner.admin.database.v1.RestoreDatabaseMetadata;
3028

29+
import static com.google.common.base.Preconditions.checkArgument;
30+
3131
/**
3232
* Represents a Cloud Spanner database backup. {@code Backup} adds a layer of service related
3333
* functionality over {@code BackupInfo}.

google-cloud-spanner/src/main/java/com/google/cloud/spanner/BackupInfo.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
import com.google.cloud.spanner.encryption.BackupEncryptionConfig;
2222
import com.google.cloud.spanner.encryption.EncryptionInfo;
2323
import com.google.spanner.admin.database.v1.Database;
24+
25+
import javax.annotation.Nullable;
2426
import java.util.List;
2527
import java.util.Objects;
26-
import javax.annotation.Nullable;
2728

2829
/** Represents a Cloud Spanner database backup. */
2930
public class BackupInfo {

google-cloud-spanner/src/test/java/com/google/cloud/spanner/BackupTest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,6 @@
1616

1717
package com.google.cloud.spanner;
1818

19-
import static com.google.common.truth.Truth.assertThat;
20-
import static org.junit.Assert.*;
21-
import static org.mockito.Mockito.verify;
22-
import static org.mockito.Mockito.when;
23-
import static org.mockito.MockitoAnnotations.initMocks;
24-
2519
import com.google.cloud.Identity;
2620
import com.google.cloud.Policy;
2721
import com.google.cloud.Role;
@@ -39,6 +33,15 @@
3933
import org.mockito.Mock;
4034
import org.mockito.Mockito;
4135

36+
import java.util.Arrays;
37+
import java.util.Collections;
38+
39+
import static com.google.common.truth.Truth.assertThat;
40+
import static org.junit.Assert.*;
41+
import static org.mockito.Mockito.verify;
42+
import static org.mockito.Mockito.when;
43+
import static org.mockito.MockitoAnnotations.initMocks;
44+
4245
@RunWith(JUnit4.class)
4346
public class BackupTest {
4447

samples/pom.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,24 @@
3333
<module>snippets</module>
3434
</modules>
3535

36+
<dependencies>
37+
<dependency>
38+
<groupId>com.google.cloud</groupId>
39+
<artifactId>google-cloud-spanner</artifactId>
40+
<version>6.19.1-SNAPSHOT</version>
41+
</dependency>
42+
<!-- [END spanner_install_with_bom] -->
43+
<dependency>
44+
<groupId>com.google.api.grpc</groupId>
45+
<artifactId>grpc-google-cloud-spanner-admin-database-v1</artifactId>
46+
<version>6.19.1-SNAPSHOT</version>
47+
</dependency>
48+
<dependency>
49+
<groupId>com.google.api.grpc</groupId>
50+
<artifactId>proto-google-cloud-spanner-admin-database-v1</artifactId>
51+
<version>6.19.1-SNAPSHOT</version>
52+
</dependency>
53+
</dependencies>
3654
<build>
3755
<plugins>
3856
<plugin>
@@ -53,4 +71,4 @@
5371
</plugin>
5472
</plugins>
5573
</build>
56-
</project>
74+
</project>

samples/snippets/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,19 @@
4444
<dependency>
4545
<groupId>com.google.cloud</groupId>
4646
<artifactId>google-cloud-spanner</artifactId>
47+
<version>6.19.1-SNAPSHOT</version>
4748
</dependency>
4849
<!-- [END spanner_install_with_bom] -->
50+
<dependency>
51+
<groupId>com.google.api.grpc</groupId>
52+
<artifactId>grpc-google-cloud-spanner-admin-database-v1</artifactId>
53+
<version>6.19.1-SNAPSHOT</version>
54+
</dependency>
55+
<dependency>
56+
<groupId>com.google.api.grpc</groupId>
57+
<artifactId>proto-google-cloud-spanner-admin-database-v1</artifactId>
58+
<version>6.19.1-SNAPSHOT</version>
59+
</dependency>
4960

5061
<dependency>
5162
<groupId>io.opencensus</groupId>
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: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,14 @@
5656
import com.google.common.io.BaseEncoding;
5757
import com.google.longrunning.Operation;
5858
import com.google.protobuf.InvalidProtocolBufferException;
59+
import com.google.spanner.admin.database.v1.CopyBackupMetadata;
5960
import com.google.spanner.admin.database.v1.CreateBackupMetadata;
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;
6364
import com.google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata;
6465
import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
66+
import java.lang.Math;
6567
import java.math.BigDecimal;
6668
import java.time.Instant;
6769
import java.util.ArrayList;
@@ -1659,21 +1661,18 @@ static void cancelCreateBackup(
16591661
// [END spanner_cancel_backup_create]
16601662

16611663
// [START spanner_list_backup_operations]
1662-
static void listBackupOperations(InstanceAdminClient instanceAdminClient, DatabaseId databaseId) {
1664+
static void listBackupOperations(
1665+
InstanceAdminClient instanceAdminClient, DatabaseId databaseId, BackupId backupId) {
16631666
Instance instance = instanceAdminClient.getInstance(databaseId.getInstanceId().getInstance());
16641667
// Get create backup operations for the sample database.
1665-
Timestamp last24Hours = Timestamp.ofTimeSecondsAndNanos(TimeUnit.SECONDS.convert(
1666-
TimeUnit.HOURS.convert(Timestamp.now().getSeconds(), TimeUnit.SECONDS) - 24,
1667-
TimeUnit.HOURS), 0);
16681668
String filter =
16691669
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()) {
1670+
"(metadata.@type:type.googleapis.com/google.spanner.admin.database.v1.CreateBackupMetadata) "
1671+
+ "AND (metadata.database:%s)",
1672+
databaseId.getName());
1673+
Page<Operation> createBackupOperations = instance.listBackupOperations(Options.filter(filter));
1674+
System.out.println("Create Backup Operations:");
1675+
for (Operation op : createBackupOperations.iterateAll()) {
16771676
try {
16781677
CreateBackupMetadata metadata = op.getMetadata().unpack(CreateBackupMetadata.class);
16791678
System.out.println(
@@ -1687,6 +1686,30 @@ static void listBackupOperations(InstanceAdminClient instanceAdminClient, Databa
16871686
System.err.println(e.getMessage());
16881687
}
16891688
}
1689+
1690+
// Get copy backup operations for the sample database.
1691+
filter =
1692+
String.format(
1693+
"(metadata.@type:type.googleapis.com/"
1694+
+ "google.spanner.admin.database.v1.CopyBackupMetadata) "
1695+
+ "AND (metadata.source_backup:%s)",
1696+
backupId.getName());
1697+
Page<Operation> copyBackupOperations = instance.listBackupOperations(Options.filter(filter));
1698+
System.out.println("Copy Backup Operations:");
1699+
for (Operation op : copyBackupOperations.iterateAll()) {
1700+
try {
1701+
CopyBackupMetadata copyBackupMetadata = op.getMetadata().unpack(CopyBackupMetadata.class);
1702+
System.out.println(
1703+
String.format(
1704+
"Copy Backup %s on backup %s pending: %d%% complete",
1705+
copyBackupMetadata.getName(),
1706+
copyBackupMetadata.getSourceBackup(),
1707+
copyBackupMetadata.getProgress().getProgressPercent()));
1708+
} catch (InvalidProtocolBufferException e) {
1709+
// The returned operation does not contain CopyBackupMetadata.
1710+
System.err.println(e.getMessage());
1711+
}
1712+
}
16901713
}
16911714
// [END spanner_list_backup_operations]
16921715

@@ -1840,6 +1863,11 @@ static void updateBackup(DatabaseAdminClient dbAdminClient, BackupId backupId) {
18401863
TimeUnit.SECONDS.toMicros(backup.getExpireTime().getSeconds())
18411864
+ TimeUnit.NANOSECONDS.toMicros(backup.getExpireTime().getNanos())
18421865
+ TimeUnit.DAYS.toMicros(30L));
1866+
// New Expire Time must be less than Max Expire Time
1867+
expireTime = expireTime.compareTo(backup.getMaxExpireTime())<0?expireTime:backup.getMaxExpireTime();
1868+
int timeDiff = expireTime.compareTo(backup.getExpireTime());
1869+
Timestamp newExpireTime = (timeDiff < 0) ? expireTime : backup.getExpireTime();
1870+
18431871
System.out.println(String.format(
18441872
"Updating expire time of backup [%s] to %s...",
18451873
backupId.toString(),
@@ -2048,7 +2076,7 @@ static void run(
20482076
BackupId.of(backup.getInstanceId(), backup.getBackup() + "_cancel"));
20492077
break;
20502078
case "listbackupoperations":
2051-
listBackupOperations(instanceAdminClient, database);
2079+
listBackupOperations(instanceAdminClient, database, backup);
20522080
break;
20532081
case "listdatabaseoperations":
20542082
listDatabaseOperations(instanceAdminClient, dbAdminClient, database.getInstanceId());
@@ -2144,14 +2172,14 @@ static void printUsageAndExit() {
21442172
System.err.println(" SpannerExample querywithqueryoptions my-instance example-db");
21452173
System.err.println(" SpannerExample createbackup my-instance example-db");
21462174
System.err.println(" SpannerExample listbackups my-instance example-db");
2147-
System.err.println(" SpannerExample listbackupoperations my-instance example-db");
2175+
System.err.println(" SpannerExample listbackupoperations my-instance example-db backup-id");
21482176
System.err.println(" SpannerExample listdatabaseoperations my-instance example-db");
21492177
System.err.println(" SpannerExample restorebackup my-instance example-db");
21502178
System.exit(1);
21512179
}
21522180

21532181
public static void main(String[] args) throws Exception {
2154-
if (args.length != 3) {
2182+
if (args.length != 3 && args.length != 4) {
21552183
printUsageAndExit();
21562184
}
21572185
// [START init_client]
@@ -2175,6 +2203,9 @@ public static void main(String[] args) throws Exception {
21752203
String.format(
21762204
"%s_%02d",
21772205
db.getDatabase(), LocalDate.now().get(ChronoField.ALIGNED_WEEK_OF_YEAR));
2206+
if( args.length == 4) {
2207+
backupName = args[3];
2208+
}
21782209
BackupId backup = BackupId.of(db.getInstanceId(), backupName);
21792210

21802211
// [START init_client]

0 commit comments

Comments
 (0)