Skip to content

Commit

Permalink
feat(compute): add compute consistency group stop replication (#9694)
Browse files Browse the repository at this point in the history
* Implemented compute_consistency_group_create and compute_consistency_group_delete samples, created test

* Implemented compute_consistency_group_stop_replication sample

* Implemented compute_consistency_group_stop_replication sample

* Created test and added needed classes for testing

* Fixed test

* Moved clean up methods

* Added clean up methods for reservations

* Fixed clean up method

* Fixed clean up method

* Added timeout

* Reverted not related changes

* Reverted not related changes

* Reverted not related changes

* Reverted not related changes

* Fixed code

* Split samples for zonal location

* Added comments for methods

* Fixed comments
  • Loading branch information
TetyanaYahodska authored Dec 23, 2024
1 parent 07416aa commit 7afa0d2
Show file tree
Hide file tree
Showing 3 changed files with 200 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package compute.disks.consistencygroup;

// [START compute_consistency_group_regional_stop_replication]
import com.google.cloud.compute.v1.DisksStopGroupAsyncReplicationResource;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.RegionDisksClient;
import com.google.cloud.compute.v1.StopGroupAsyncReplicationRegionDiskRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StopRegionalDiskReplicationConsistencyGroup {

public static void main(String[] args)
throws IOException, InterruptedException, ExecutionException, TimeoutException {
// TODO(developer): Replace these variables before running the sample.
// Project ID or project number of the Cloud project that contains the disk.
String project = "YOUR_PROJECT_ID";
// Region of the disk.
String region = "us-central1";
// Name of the consistency group.
String consistencyGroupName = "CONSISTENCY_GROUP";

stopRegionalDiskReplicationConsistencyGroup(project, region, consistencyGroupName);
}

// Stops replication of a consistency group for a project in a given region.
public static Status stopRegionalDiskReplicationConsistencyGroup(
String project, String region, String consistencyGroupName)
throws IOException, InterruptedException, ExecutionException, TimeoutException {
String resourcePolicy = String.format("projects/%s/regions/%s/resourcePolicies/%s",
project, region, consistencyGroupName);
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (RegionDisksClient disksClient = RegionDisksClient.create()) {
StopGroupAsyncReplicationRegionDiskRequest request =
StopGroupAsyncReplicationRegionDiskRequest.newBuilder()
.setProject(project)
.setRegion(region)
.setDisksStopGroupAsyncReplicationResourceResource(
DisksStopGroupAsyncReplicationResource.newBuilder()
.setResourcePolicy(resourcePolicy).build())
.build();
Operation response = disksClient.stopGroupAsyncReplicationAsync(request)
.get(3, TimeUnit.MINUTES);

if (response.hasError()) {
throw new Error("Error stopping disk replication! " + response.getError());
}
return response.getStatus();
}
}
}
// [END compute_consistency_group_regional_stop_replication]
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package compute.disks.consistencygroup;

// [START compute_consistency_group_stop_replication]
import com.google.cloud.compute.v1.DisksClient;
import com.google.cloud.compute.v1.DisksStopGroupAsyncReplicationResource;
import com.google.cloud.compute.v1.Operation;
import com.google.cloud.compute.v1.Operation.Status;
import com.google.cloud.compute.v1.StopGroupAsyncReplicationDiskRequest;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class StopZonalDiskReplicationConsistencyGroup {
public static void main(String[] args)
throws IOException, InterruptedException, ExecutionException, TimeoutException {
// TODO(developer): Replace these variables before running the sample.
// Project ID or project number of the Cloud project that contains the disk.
String project = "YOUR_PROJECT_ID";
// Zone of the disk.
String zone = "us-central1-a";
// Name of the consistency group.
String consistencyGroupName = "CONSISTENCY_GROUP";

stopZonalDiskReplicationConsistencyGroup(project, zone, consistencyGroupName);
}

// Stops replication of a consistency group for a project in a given zone.
public static Status stopZonalDiskReplicationConsistencyGroup(
String project, String zone, String consistencyGroupName)
throws IOException, InterruptedException, ExecutionException, TimeoutException {
String region = zone.substring(0, zone.lastIndexOf('-'));

String resourcePolicy = String.format("projects/%s/regions/%s/resourcePolicies/%s",
project, region, consistencyGroupName);
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests.
try (DisksClient disksClient = DisksClient.create()) {
StopGroupAsyncReplicationDiskRequest request =
StopGroupAsyncReplicationDiskRequest.newBuilder()
.setProject(project)
.setZone(zone)
.setDisksStopGroupAsyncReplicationResourceResource(
DisksStopGroupAsyncReplicationResource.newBuilder()
.setResourcePolicy(resourcePolicy).build())
.build();
Operation response = disksClient.stopGroupAsyncReplicationAsync(request)
.get(3, TimeUnit.MINUTES);

if (response.hasError()) {
throw new Error("Error stopping disk replication! " + response.getError());
}
return response.getStatus();
}
}
}
// [END compute_consistency_group_stop_replication]
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,16 @@
import com.google.cloud.compute.v1.RegionDisksClient;
import com.google.cloud.compute.v1.RemoveResourcePoliciesRegionDiskRequest;
import com.google.cloud.compute.v1.ResourcePoliciesClient;
import com.google.cloud.compute.v1.StopGroupAsyncReplicationDiskRequest;
import com.google.cloud.compute.v1.StopGroupAsyncReplicationRegionDiskRequest;
import compute.disks.consistencygroup.AddDiskToConsistencyGroup;
import compute.disks.consistencygroup.CreateConsistencyGroup;
import compute.disks.consistencygroup.DeleteConsistencyGroup;
import compute.disks.consistencygroup.ListRegionalDisksInConsistencyGroup;
import compute.disks.consistencygroup.ListZonalDisksInConsistencyGroup;
import compute.disks.consistencygroup.RemoveDiskFromConsistencyGroup;
import compute.disks.consistencygroup.StopRegionalDiskReplicationConsistencyGroup;
import compute.disks.consistencygroup.StopZonalDiskReplicationConsistencyGroup;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
Expand All @@ -54,6 +58,7 @@
public class ConsistencyGroupIT {
private static final String PROJECT_ID = "project-id";
private static final String REGION = "asia-east1";
private static final String ZONE = "asia-east1-c";
private static final String CONSISTENCY_GROUP_NAME = "consistency-group";
private static final String DISK_NAME = "disk-for-consistency";

Expand Down Expand Up @@ -193,4 +198,54 @@ public void testListZonalDisksInConsistencyGroup() throws Exception {
verify(mockResponse, times(1)).iterateAll();
}
}

@Test
public void testStopRegionalDiskReplicationConsistencyGroup() throws Exception {
try (MockedStatic<RegionDisksClient> mockedRegionDisksClient =
mockStatic(RegionDisksClient.class)) {
Operation operation = mock(Operation.class);
RegionDisksClient mockClient = mock(RegionDisksClient.class);
OperationFuture mockFuture = mock(OperationFuture.class);

mockedRegionDisksClient.when(RegionDisksClient::create).thenReturn(mockClient);
when(mockClient.stopGroupAsyncReplicationAsync(
any(StopGroupAsyncReplicationRegionDiskRequest.class))).thenReturn(mockFuture);
when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation);
when(operation.getStatus()).thenReturn(Status.DONE);

Status status = StopRegionalDiskReplicationConsistencyGroup
.stopRegionalDiskReplicationConsistencyGroup(
PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME);

verify(mockClient, times(1)).stopGroupAsyncReplicationAsync(
any(StopGroupAsyncReplicationRegionDiskRequest.class));
verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class));
assertEquals(Status.DONE, status);
}
}

@Test
public void testStopZonalDiskReplicationConsistencyGroup() throws Exception {
try (MockedStatic<DisksClient> mockedDisksClient =
mockStatic(DisksClient.class)) {
Operation operation = mock(Operation.class);
DisksClient mockClient = mock(DisksClient.class);
OperationFuture mockFuture = mock(OperationFuture.class);

mockedDisksClient.when(DisksClient::create).thenReturn(mockClient);
when(mockClient.stopGroupAsyncReplicationAsync(
any(StopGroupAsyncReplicationDiskRequest.class))).thenReturn(mockFuture);
when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation);
when(operation.getStatus()).thenReturn(Status.DONE);

Status status = StopZonalDiskReplicationConsistencyGroup
.stopZonalDiskReplicationConsistencyGroup(
PROJECT_ID, ZONE, CONSISTENCY_GROUP_NAME);

verify(mockClient, times(1)).stopGroupAsyncReplicationAsync(
any(StopGroupAsyncReplicationDiskRequest.class));
verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class));
assertEquals(Status.DONE, status);
}
}
}

0 comments on commit 7afa0d2

Please sign in to comment.