Skip to content

Commit b699b55

Browse files
committed
samples: add samples for CMMR Phase 2
1 parent 8bfb5ad commit b699b55

File tree

7 files changed

+401
-23
lines changed

7 files changed

+401
-23
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright 2022 Google LLC
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_create_instance_config]
20+
import com.google.api.gax.longrunning.OperationFuture;
21+
import com.google.cloud.spanner.InstanceAdminClient;
22+
import com.google.cloud.spanner.InstanceConfig;
23+
import com.google.cloud.spanner.InstanceConfigId;
24+
import com.google.cloud.spanner.InstanceConfigInfo;
25+
import com.google.cloud.spanner.ReplicaInfo;
26+
import com.google.cloud.spanner.Spanner;
27+
import com.google.cloud.spanner.SpannerOptions;
28+
import com.google.common.collect.ImmutableList;
29+
import com.google.spanner.admin.instance.v1.CreateInstanceConfigMetadata;
30+
import java.util.List;
31+
import java.util.concurrent.ExecutionException;
32+
import java.util.concurrent.TimeUnit;
33+
import java.util.concurrent.TimeoutException;
34+
35+
class CreateInstanceConfigSample {
36+
static void createInstanceConfig() {
37+
// TODO(developer): Replace these variables before running the sample.
38+
String projectId = "my-project";
39+
String baseInstanceConfig = "my-base-instance-config";
40+
String instanceConfigId = "custom-instance-config4";
41+
createInstanceConfig(projectId, baseInstanceConfig, instanceConfigId);
42+
}
43+
44+
static void createInstanceConfig(
45+
String projectId, String baseInstanceConfig, String instanceConfigId) {
46+
try (Spanner spanner =
47+
SpannerOptions.newBuilder()
48+
.setProjectId(projectId)
49+
.build()
50+
.getService()) {
51+
final InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient();
52+
53+
final InstanceConfig baseConfig = instanceAdminClient.getInstanceConfig(baseInstanceConfig);
54+
55+
List<ReplicaInfo> readOnlyReplicas = ImmutableList.of(baseConfig.getOptionalReplicas().get(0));
56+
57+
InstanceConfigInfo instanceConfigInfo =
58+
InstanceConfig.newBuilder(InstanceConfigId.of(projectId, instanceConfigId), baseConfig)
59+
.setDisplayName(instanceConfigId)
60+
.addReadOnlyReplicas(readOnlyReplicas)
61+
.build();
62+
63+
final OperationFuture<InstanceConfig, CreateInstanceConfigMetadata> operation =
64+
instanceAdminClient.createInstanceConfig(instanceConfigInfo);
65+
66+
try {
67+
System.out.printf("Waiting for operation on %s to complete...\n", instanceConfigId);
68+
InstanceConfig instanceConfig = operation.get(5, TimeUnit.MINUTES);
69+
System.out.printf("Created instance config %s\n", instanceConfig.getId());
70+
} catch (ExecutionException | TimeoutException e) {
71+
System.out.printf(
72+
"Error: Creating instance config %s failed with error message %s\n",
73+
instanceConfigInfo.getId(), e.getMessage());
74+
} catch (InterruptedException e) {
75+
System.out.println(
76+
"Error: Waiting for createInstanceConfig operation to finish was interrupted");
77+
}
78+
}
79+
}
80+
}
81+
// [END spanner_create_instance_config]
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2022 Google LLC
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_delete_instance_config]
20+
import com.google.cloud.spanner.InstanceAdminClient;
21+
import com.google.cloud.spanner.Spanner;
22+
import com.google.cloud.spanner.SpannerException;
23+
import com.google.cloud.spanner.SpannerOptions;
24+
25+
class DeleteInstanceConfigSample {
26+
static void deleteInstanceConfig() {
27+
// TODO(developer): Replace these variables before running the sample.
28+
String projectId = "my-project";
29+
String instanceConfigId = "custom-user-config";
30+
deleteInstanceConfig(projectId, instanceConfigId);
31+
}
32+
33+
static void deleteInstanceConfig(String projectId, String instanceConfigId) {
34+
try (Spanner spanner =
35+
SpannerOptions.newBuilder()
36+
.setProjectId(projectId)
37+
.build()
38+
.getService()) {
39+
final InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient();
40+
41+
try {
42+
System.out.printf("Waiting for operation on %s to complete...\n", instanceConfigId);
43+
instanceAdminClient.deleteInstanceConfig(instanceConfigId);
44+
System.out.printf("Deleted user instance config with id %s\n", instanceConfigId);
45+
} catch (SpannerException e) {
46+
System.out.printf(
47+
"Could not delete user instance config %s: %s\n", instanceConfigId, e.getMessage());
48+
}
49+
}
50+
}
51+
}
52+
// [END spanner_delete_instance_config]
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.example.spanner;
2+
3+
// [START spanner_list_instance_config_operations]
4+
import com.google.cloud.spanner.InstanceAdminClient;
5+
import com.google.cloud.spanner.Options;
6+
import com.google.cloud.spanner.Spanner;
7+
import com.google.cloud.spanner.SpannerOptions;
8+
import com.google.longrunning.Operation;
9+
import com.google.protobuf.InvalidProtocolBufferException;
10+
import com.google.spanner.admin.instance.v1.CreateInstanceConfigMetadata;
11+
12+
public class ListInstanceConfigOperationsSample {
13+
static void listInstanceConfigOperations() {
14+
// TODO(developer): Replace these variables before running the sample.
15+
String projectId = "my-project";
16+
listInstanceConfigOperations(projectId);
17+
}
18+
19+
static void listInstanceConfigOperations(String projectId) {
20+
try (Spanner spanner =
21+
SpannerOptions.newBuilder()
22+
.setProjectId(projectId)
23+
.build()
24+
.getService()) {
25+
final InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient();
26+
27+
try {
28+
System.out.printf(
29+
"Waiting for listing instance config operations on project %s to complete...\n",
30+
projectId);
31+
final Iterable<Operation> instanceConfigOperations =
32+
instanceAdminClient.listInstanceConfigOperations(
33+
Options.filter(
34+
"(metadata.@type=type.googleapis.com/google.spanner.admin.instance.v1.CreateInstanceConfigMetadata)"))
35+
.iterateAll();
36+
for (Operation operation : instanceConfigOperations) {
37+
CreateInstanceConfigMetadata metadata =
38+
operation.getMetadata().unpack(CreateInstanceConfigMetadata.class);
39+
System.out.printf(
40+
"List instance config operation on %s is %d%% completed.\n",
41+
metadata.getInstanceConfig().getName(),
42+
metadata.getProgress().getProgressPercent());
43+
}
44+
} catch (InvalidProtocolBufferException e) {
45+
System.out.printf(
46+
"Error: Listing instance config operations failed with error message %s\n",
47+
e.getMessage());
48+
e.printStackTrace();
49+
}
50+
}
51+
}
52+
}
53+
// [START spanner_list_instance_config_operations]
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright 2022 Google LLC
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_update_instance_config]
20+
import com.google.api.gax.longrunning.OperationFuture;
21+
import com.google.cloud.spanner.InstanceAdminClient;
22+
import com.google.cloud.spanner.InstanceConfig;
23+
import com.google.cloud.spanner.InstanceConfigId;
24+
import com.google.cloud.spanner.InstanceConfigInfo;
25+
import com.google.cloud.spanner.InstanceConfigInfo.InstanceConfigField;
26+
import com.google.cloud.spanner.Spanner;
27+
import com.google.cloud.spanner.SpannerOptions;
28+
import com.google.common.collect.ImmutableList;
29+
import com.google.spanner.admin.instance.v1.UpdateInstanceConfigMetadata;
30+
import java.util.concurrent.ExecutionException;
31+
import java.util.concurrent.TimeUnit;
32+
import java.util.concurrent.TimeoutException;
33+
34+
class UpdateInstanceConfigSample {
35+
static void updateInstanceConfig() {
36+
// TODO(developer): Replace these variables before running the sample.
37+
String projectId = "my-project";
38+
String instanceConfigId = "custom-instance-config";
39+
String displayName = "my-display-name";
40+
updateInstanceConfig(projectId, instanceConfigId, displayName);
41+
}
42+
43+
static void updateInstanceConfig(String projectId, String instanceConfigId, String displayName) {
44+
try (Spanner spanner =
45+
SpannerOptions.newBuilder()
46+
.setProjectId(projectId)
47+
.build()
48+
.getService()) {
49+
final InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient();
50+
51+
InstanceConfigInfo instanceConfigInfo =
52+
InstanceConfig.newBuilder(InstanceConfigId.of(projectId, instanceConfigId))
53+
.setDisplayName(displayName)
54+
.build();
55+
56+
final OperationFuture<InstanceConfig, UpdateInstanceConfigMetadata> operation =
57+
instanceAdminClient.updateInstanceConfig(
58+
instanceConfigInfo, ImmutableList.of(InstanceConfigField.DISPLAY_NAME));
59+
60+
try {
61+
System.out.printf("Waiting for operation on %s to complete...\n", instanceConfigId);
62+
InstanceConfig instanceConfig = operation.get(5, TimeUnit.MINUTES);
63+
System.out.printf(
64+
"Updated instance config %s with new display name %s\n",
65+
instanceConfig.getId(), instanceConfig.getDisplayName());
66+
} catch (ExecutionException | TimeoutException e) {
67+
System.out.printf(
68+
"Error: Updating instance config %s failed with error message %s\n",
69+
instanceConfigInfo.getId(), e.getMessage());
70+
e.printStackTrace();
71+
} catch (InterruptedException e) {
72+
System.out.println(
73+
"Error: Waiting for updateInstanceConfig operation to finish was interrupted");
74+
}
75+
}
76+
}
77+
}
78+
// [END spanner_update_instance_config]
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright 2022 Google LLC
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+
import static org.junit.Assert.assertTrue;
20+
21+
import org.junit.Test;
22+
23+
public class CustomInstanceConfigSampleIT extends SampleTestBase {
24+
25+
@Test
26+
public void testCustomInstanceConfigOperations() throws Exception {
27+
String customInstanceConfigId = idGenerator.generateInstanceConfigId();
28+
29+
// Create a random instance config. Display name is set to the instance config id in sample.
30+
final String out1 =
31+
SampleRunner.runSample(
32+
() ->
33+
CreateInstanceConfigSample.createInstanceConfig(
34+
projectId, instanceConfigName, customInstanceConfigId));
35+
assertTrue(
36+
"Expected instance config "
37+
+ customInstanceConfigId
38+
+ " to be created."
39+
+ " Output received was "
40+
+ out1,
41+
out1.contains(customInstanceConfigId));
42+
43+
// List the instance config operations.
44+
final String out2 =
45+
SampleRunner.runSample(
46+
() ->
47+
ListInstanceConfigOperationsSample.listInstanceConfigOperations(projectId));
48+
assertTrue(
49+
"Expected to list instance config for project: "
50+
+ projectId
51+
+ ". Output received was "
52+
+ out2,
53+
out2.contains(customInstanceConfigId));
54+
55+
// Update display name to a randomly generated instance config id.
56+
String newDisplayName = idGenerator.generateInstanceConfigId();
57+
final String out3 =
58+
SampleRunner.runSample(
59+
() ->
60+
UpdateInstanceConfigSample.updateInstanceConfig(
61+
projectId, customInstanceConfigId, newDisplayName));
62+
assertTrue(
63+
"Expected display name to be updated from "
64+
+ customInstanceConfigId
65+
+ " to "
66+
+ newDisplayName
67+
+ " for instance config "
68+
+ customInstanceConfigId
69+
+ "."
70+
+ " Output received was "
71+
+ out3,
72+
out3.contains(newDisplayName));
73+
74+
// Delete the created instance config.
75+
final String out4 =
76+
SampleRunner.runSample(
77+
() ->
78+
DeleteInstanceConfigSample.deleteInstanceConfig(projectId, customInstanceConfigId));
79+
assertTrue(
80+
"Expected instance config "
81+
+ customInstanceConfigId
82+
+ " to be deleted."
83+
+ " Output received was "
84+
+ out4,
85+
out4.contains(customInstanceConfigId));
86+
}
87+
}

0 commit comments

Comments
 (0)