From 7afa0d22b939a28a6bc9145afe3ddf67a6535d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B5=D1=82=D1=8F=D0=BD=D0=B0=20=D0=AF=D0=B3=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D1=8C=D0=BA=D0=B0?= <49729677+TetyanaYahodska@users.noreply.github.com> Date: Mon, 23 Dec 2024 14:38:34 +0100 Subject: [PATCH] feat(compute): add compute consistency group stop replication (#9694) * 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 --- ...gionalDiskReplicationConsistencyGroup.java | 72 ++++++++++++++++++ ...pZonalDiskReplicationConsistencyGroup.java | 73 +++++++++++++++++++ .../compute/disks/ConsistencyGroupIT.java | 55 ++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopRegionalDiskReplicationConsistencyGroup.java create mode 100644 compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopZonalDiskReplicationConsistencyGroup.java diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopRegionalDiskReplicationConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopRegionalDiskReplicationConsistencyGroup.java new file mode 100644 index 00000000000..6e293eef0cf --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopRegionalDiskReplicationConsistencyGroup.java @@ -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] diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopZonalDiskReplicationConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopZonalDiskReplicationConsistencyGroup.java new file mode 100644 index 00000000000..38c31e1850d --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/StopZonalDiskReplicationConsistencyGroup.java @@ -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] diff --git a/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java b/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java index 75716d474df..e7038724d45 100644 --- a/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java +++ b/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java @@ -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; @@ -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"; @@ -193,4 +198,54 @@ public void testListZonalDisksInConsistencyGroup() throws Exception { verify(mockResponse, times(1)).iterateAll(); } } + + @Test + public void testStopRegionalDiskReplicationConsistencyGroup() throws Exception { + try (MockedStatic 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 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); + } + } } \ No newline at end of file