Skip to content

Commit 99cb528

Browse files
Created compute_consistency_group_clone_zonal_disk sample and test
1 parent 636251a commit 99cb528

File tree

3 files changed

+122
-44
lines changed

3 files changed

+122
-44
lines changed

compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneDisksFromConsistencyGroup.java

Lines changed: 22 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717
package compute.disks.consistencygroup;
1818

1919
// [START compute_consistency_group_clone]
20-
import com.google.cloud.compute.v1.BulkInsertDiskRequest;
2120
import com.google.cloud.compute.v1.BulkInsertDiskResource;
2221
import com.google.cloud.compute.v1.BulkInsertRegionDiskRequest;
23-
import com.google.cloud.compute.v1.DisksClient;
2422
import com.google.cloud.compute.v1.Operation;
2523
import com.google.cloud.compute.v1.RegionDisksClient;
2624
import java.io.IOException;
@@ -35,58 +33,39 @@ public static void main(String[] args)
3533
// TODO(developer): Replace these variables before running the sample.
3634
// Project ID or project number of the Cloud project you want to use.
3735
String project = "YOUR_PROJECT_ID";
38-
// Name of the region or zone in which your disk is located.
39-
String disksLocation = "us-central1";
36+
// Region in which your disk and consistency group are located.
37+
String region = "us-central1";
4038
// Name of the consistency group you want to clone disks from.
4139
String consistencyGroupName = "YOUR_CONSISTENCY_GROUP_NAME";
42-
// Name of the region in which your consistency group is located.
43-
String consistencyGroupLocation = "us-central1";
4440

45-
cloneDisksFromConsistencyGroup(
46-
project, disksLocation, consistencyGroupName, consistencyGroupLocation);
41+
cloneDisksFromConsistencyGroup(project, region, consistencyGroupName);
4742
}
4843

49-
// Clones disks from a consistency group.
50-
public static Operation.Status cloneDisksFromConsistencyGroup(String project,
51-
String disksLocation, String consistencyGroupName, String consistencyGroupLocation)
44+
// Clones disks with regional location from a consistency group.
45+
public static Operation.Status cloneDisksFromConsistencyGroup(
46+
String project, String region, String consistencyGroupName)
5247
throws IOException, InterruptedException, ExecutionException, TimeoutException {
5348
String sourceConsistencyGroupPolicy = String.format(
54-
"projects/%s/regions/%s/resourcePolicies/%s", project, consistencyGroupLocation,
55-
consistencyGroupName);
56-
Operation response;
57-
if (Character.isDigit(disksLocation.charAt(disksLocation.length() - 1))) {
58-
// Initialize client that will be used to send requests. This client only needs to be created
59-
// once, and can be reused for multiple requests.
60-
try (RegionDisksClient disksClient = RegionDisksClient.create()) {
61-
BulkInsertRegionDiskRequest request = BulkInsertRegionDiskRequest.newBuilder()
62-
.setProject(project)
63-
.setRegion(disksLocation)
64-
.setBulkInsertDiskResourceResource(
65-
BulkInsertDiskResource.newBuilder()
66-
.setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy)
67-
.build())
68-
.build();
49+
"projects/%s/regions/%s/resourcePolicies/%s", project, region, consistencyGroupName);
50+
// Initialize client that will be used to send requests. This client only needs to be created
51+
// once, and can be reused for multiple requests.
52+
try (RegionDisksClient disksClient = RegionDisksClient.create()) {
53+
BulkInsertRegionDiskRequest request = BulkInsertRegionDiskRequest.newBuilder()
54+
.setProject(project)
55+
.setRegion(region)
56+
.setBulkInsertDiskResourceResource(
57+
BulkInsertDiskResource.newBuilder()
58+
.setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy)
59+
.build())
60+
.build();
6961

70-
response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES);
71-
}
72-
} else {
73-
try (DisksClient disksClient = DisksClient.create()) {
74-
BulkInsertDiskRequest request = BulkInsertDiskRequest.newBuilder()
75-
.setProject(project)
76-
.setZone(disksLocation)
77-
.setBulkInsertDiskResourceResource(
78-
BulkInsertDiskResource.newBuilder()
79-
.setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy)
80-
.build())
81-
.build();
62+
Operation response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES);
8263

83-
response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES);
64+
if (response.hasError()) {
65+
throw new Error("Error cloning disks! " + response.getError());
8466
}
67+
return response.getStatus();
8568
}
86-
if (response.hasError()) {
87-
throw new Error("Error cloning disks! " + response.getError());
88-
}
89-
return response.getStatus();
9069
}
9170
}
9271
// [END compute_consistency_group_clone]
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright 2024 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 compute.disks.consistencygroup;
18+
19+
// [START compute_consistency_group_clone_zonal_disk]
20+
import com.google.cloud.compute.v1.BulkInsertDiskRequest;
21+
import com.google.cloud.compute.v1.BulkInsertDiskResource;
22+
import com.google.cloud.compute.v1.DisksClient;
23+
import com.google.cloud.compute.v1.Operation;
24+
import java.io.IOException;
25+
import java.util.concurrent.ExecutionException;
26+
import java.util.concurrent.TimeUnit;
27+
import java.util.concurrent.TimeoutException;
28+
29+
public class CloneZonalDisksFromConsistencyGroup {
30+
public static void main(String[] args)
31+
throws IOException, ExecutionException, InterruptedException, TimeoutException {
32+
// TODO(developer): Replace these variables before running the sample.
33+
// Project ID or project number of the Cloud project you want to use.
34+
String project = "YOUR_PROJECT_ID";
35+
// Zone in which your disk is located.
36+
String disksLocation = "us-central1-a";
37+
// Name of the consistency group you want to clone disks from.
38+
String consistencyGroupName = "YOUR_CONSISTENCY_GROUP_NAME";
39+
40+
cloneZonalDisksFromConsistencyGroup(project, disksLocation, consistencyGroupName);
41+
}
42+
43+
// Clones disks with zonal location from a consistency group.
44+
public static Operation.Status cloneZonalDisksFromConsistencyGroup(
45+
String project, String zone, String consistencyGroupName)
46+
throws IOException, InterruptedException, ExecutionException, TimeoutException {
47+
String region = zone.substring(0, zone.lastIndexOf('-'));
48+
String sourceConsistencyGroupPolicy = String.format(
49+
"projects/%s/regions/%s/resourcePolicies/%s", project, region, consistencyGroupName);
50+
51+
// Initialize client that will be used to send requests. This client only needs to be created
52+
// once, and can be reused for multiple requests.
53+
try (DisksClient disksClient = DisksClient.create()) {
54+
BulkInsertDiskRequest request = BulkInsertDiskRequest.newBuilder()
55+
.setProject(project)
56+
.setZone(zone)
57+
.setBulkInsertDiskResourceResource(
58+
BulkInsertDiskResource.newBuilder()
59+
.setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy)
60+
.build())
61+
.build();
62+
63+
Operation response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES);
64+
65+
if (response.hasError()) {
66+
throw new Error("Error cloning disks! " + response.getError());
67+
}
68+
return response.getStatus();
69+
}
70+
}
71+
}
72+
// [END compute_consistency_group_clone_zonal_disk]

compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,17 @@
2727

2828
import com.google.api.gax.longrunning.OperationFuture;
2929
import com.google.cloud.compute.v1.AddResourcePoliciesRegionDiskRequest;
30+
import com.google.cloud.compute.v1.BulkInsertDiskRequest;
3031
import com.google.cloud.compute.v1.BulkInsertRegionDiskRequest;
32+
import com.google.cloud.compute.v1.DisksClient;
3133
import com.google.cloud.compute.v1.InsertResourcePolicyRequest;
3234
import com.google.cloud.compute.v1.Operation;
3335
import com.google.cloud.compute.v1.RegionDisksClient;
3436
import com.google.cloud.compute.v1.RemoveResourcePoliciesRegionDiskRequest;
3537
import com.google.cloud.compute.v1.ResourcePoliciesClient;
3638
import compute.disks.consistencygroup.AddDiskToConsistencyGroup;
3739
import compute.disks.consistencygroup.CloneDisksFromConsistencyGroup;
40+
import compute.disks.consistencygroup.CloneZonalDisksFromConsistencyGroup;
3841
import compute.disks.consistencygroup.CreateConsistencyGroup;
3942
import compute.disks.consistencygroup.DeleteConsistencyGroup;
4043
import compute.disks.consistencygroup.RemoveDiskFromConsistencyGroup;
@@ -163,12 +166,36 @@ public void testCloneDisksFromConsistencyGroup() throws Exception {
163166
when(operation.getStatus()).thenReturn(Operation.Status.DONE);
164167

165168
Operation.Status status = CloneDisksFromConsistencyGroup.cloneDisksFromConsistencyGroup(
166-
PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME, REGION);
169+
PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME);
167170

168171
verify(mockClient, times(1))
169172
.bulkInsertAsync(any(BulkInsertRegionDiskRequest.class));
170173
verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class));
171174
assertEquals(Operation.Status.DONE, status);
172175
}
173176
}
177+
178+
@Test
179+
public void testCloneZonalDisksFromConsistencyGroup() throws Exception {
180+
try (MockedStatic<DisksClient> mockedRegionDisksClient =
181+
mockStatic(DisksClient.class)) {
182+
Operation operation = mock(Operation.class);
183+
DisksClient mockClient = mock(DisksClient.class);
184+
OperationFuture mockFuture = mock(OperationFuture.class);
185+
186+
mockedRegionDisksClient.when(DisksClient::create).thenReturn(mockClient);
187+
when(mockClient.bulkInsertAsync(any(BulkInsertDiskRequest.class)))
188+
.thenReturn(mockFuture);
189+
when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation);
190+
when(operation.getStatus()).thenReturn(Operation.Status.DONE);
191+
192+
Operation.Status status = CloneZonalDisksFromConsistencyGroup
193+
.cloneZonalDisksFromConsistencyGroup(PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME);
194+
195+
verify(mockClient, times(1))
196+
.bulkInsertAsync(any(BulkInsertDiskRequest.class));
197+
verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class));
198+
assertEquals(Operation.Status.DONE, status);
199+
}
200+
}
174201
}

0 commit comments

Comments
 (0)