diff --git a/compute/cloud-client/src/main/java/compute/disks/CreateReplicatedDisk.java b/compute/cloud-client/src/main/java/compute/disks/CreateReplicatedDisk.java index e2ad1fc40cc..384921da4f9 100644 --- a/compute/cloud-client/src/main/java/compute/disks/CreateReplicatedDisk.java +++ b/compute/cloud-client/src/main/java/compute/disks/CreateReplicatedDisk.java @@ -20,6 +20,7 @@ import com.google.cloud.compute.v1.Disk; import com.google.cloud.compute.v1.InsertRegionDiskRequest; import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; import com.google.cloud.compute.v1.RegionDisksClient; import java.io.IOException; import java.util.ArrayList; @@ -55,7 +56,7 @@ public static void main(String[] args) } // Create a disk for synchronous data replication between two zones in the same region - public static Operation.Status createReplicatedDisk(String projectId, String region, + public static Status createReplicatedDisk(String projectId, String region, List replicaZones, String diskName, int diskSizeGb, String diskType) throws IOException, InterruptedException, ExecutionException, TimeoutException { // Initialize client that will be used to send requests. This client only needs to be created diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddDiskToConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddDiskToConsistencyGroup.java deleted file mode 100644 index 7c4650fad09..00000000000 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddDiskToConsistencyGroup.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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_add_disk] -import com.google.cloud.compute.v1.AddResourcePoliciesDiskRequest; -import com.google.cloud.compute.v1.AddResourcePoliciesRegionDiskRequest; -import com.google.cloud.compute.v1.DisksAddResourcePoliciesRequest; -import com.google.cloud.compute.v1.DisksClient; -import com.google.cloud.compute.v1.Operation; -import com.google.cloud.compute.v1.RegionDisksAddResourcePoliciesRequest; -import com.google.cloud.compute.v1.RegionDisksClient; -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class AddDiskToConsistencyGroup { - public static void main(String[] args) - throws IOException, ExecutionException, InterruptedException, 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 or region of the disk. - String location = "us-central1"; - // Name of the disk. - String diskName = "DISK_NAME"; - // Name of the consistency group. - String consistencyGroupName = "CONSISTENCY_GROUP"; - // Region of the consistency group. - String consistencyGroupLocation = "us-central1"; - - addDiskToConsistencyGroup( - project, location, diskName, consistencyGroupName, consistencyGroupLocation); - } - - // Adds a disk to a consistency group. - public static Operation.Status addDiskToConsistencyGroup( - String project, String location, String diskName, - String consistencyGroupName, String consistencyGroupLocation) - throws IOException, ExecutionException, InterruptedException, TimeoutException { - String consistencyGroupUrl = String.format( - "https://www.googleapis.com/compute/v1/projects/%s/regions/%s/resourcePolicies/%s", - project, consistencyGroupLocation, consistencyGroupName); - Operation response; - if (Character.isDigit(location.charAt(location.length() - 1))) { - // 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()) { - AddResourcePoliciesRegionDiskRequest request = - AddResourcePoliciesRegionDiskRequest.newBuilder() - .setDisk(diskName) - .setRegion(location) - .setProject(project) - .setRegionDisksAddResourcePoliciesRequestResource( - RegionDisksAddResourcePoliciesRequest.newBuilder() - .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) - .build()) - .build(); - response = disksClient.addResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); - } - } else { - try (DisksClient disksClient = DisksClient.create()) { - AddResourcePoliciesDiskRequest request = - AddResourcePoliciesDiskRequest.newBuilder() - .setDisk(diskName) - .setZone(location) - .setProject(project) - .setDisksAddResourcePoliciesRequestResource( - DisksAddResourcePoliciesRequest.newBuilder() - .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) - .build()) - .build(); - response = disksClient.addResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); - } - } - if (response.hasError()) { - throw new Error("Error adding disk to consistency group! " + response.getError()); - } - return response.getStatus(); - } -} -// [END compute_consistency_group_add_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddRegionalDiskToConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddRegionalDiskToConsistencyGroup.java new file mode 100644 index 00000000000..bd88639d370 --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddRegionalDiskToConsistencyGroup.java @@ -0,0 +1,77 @@ +/* + * 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_add_regional_disk] +import com.google.cloud.compute.v1.AddResourcePoliciesRegionDiskRequest; +import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; +import com.google.cloud.compute.v1.RegionDisksAddResourcePoliciesRequest; +import com.google.cloud.compute.v1.RegionDisksClient; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class AddRegionalDiskToConsistencyGroup { + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, 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 in which your disk and consistency group are located. + String region = "us-central1"; + // Name of the disk. + String diskName = "DISK_NAME"; + // Name of the consistency group. + String consistencyGroupName = "CONSISTENCY_GROUP"; + + addRegionalDiskToConsistencyGroup(project, region, diskName, consistencyGroupName); + } + + // Adds regional disk to a consistency group. + public static Status addRegionalDiskToConsistencyGroup( + String project, String region, String diskName, String consistencyGroupName) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + String consistencyGroupUrl = String.format( + "https://www.googleapis.com/compute/v1/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()) { + AddResourcePoliciesRegionDiskRequest request = + AddResourcePoliciesRegionDiskRequest.newBuilder() + .setDisk(diskName) + .setRegion(region) + .setProject(project) + .setRegionDisksAddResourcePoliciesRequestResource( + RegionDisksAddResourcePoliciesRequest.newBuilder() + .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) + .build()) + .build(); + Operation response = disksClient.addResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); + + if (response.hasError()) { + throw new Error("Error adding regional disk to consistency group! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_add_regional_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddZonalDiskToConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddZonalDiskToConsistencyGroup.java new file mode 100644 index 00000000000..8f817ef4725 --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/AddZonalDiskToConsistencyGroup.java @@ -0,0 +1,80 @@ +/* + * 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_add_zonal_disk] +import com.google.cloud.compute.v1.AddResourcePoliciesDiskRequest; +import com.google.cloud.compute.v1.DisksAddResourcePoliciesRequest; +import com.google.cloud.compute.v1.DisksClient; +import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class AddZonalDiskToConsistencyGroup { + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, 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 diskLocation = "us-central1-a"; + // Name of the disk. + String diskName = "DISK_NAME"; + // Name of the consistency group. + String consistencyGroupName = "CONSISTENCY_GROUP"; + + addZonalDiskToConsistencyGroup( + project, diskLocation, diskName, consistencyGroupName); + } + + // Adds zonal disk to a consistency group. + public static Status addZonalDiskToConsistencyGroup( + String project, String diskLocation, String diskName, + String consistencyGroupName) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + String region = diskLocation.substring(0, diskLocation.lastIndexOf('-')); + String consistencyGroupUrl = String.format( + "https://www.googleapis.com/compute/v1/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()) { + AddResourcePoliciesDiskRequest request = + AddResourcePoliciesDiskRequest.newBuilder() + .setDisk(diskName) + .setZone(diskLocation) + .setProject(project) + .setDisksAddResourcePoliciesRequestResource( + DisksAddResourcePoliciesRequest.newBuilder() + .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) + .build()) + .build(); + Operation response = disksClient.addResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); + + if (response.hasError()) { + throw new Error("Error adding disk to consistency group! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_add_zonal_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneRegionalDisksFromConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneRegionalDisksFromConsistencyGroup.java new file mode 100644 index 00000000000..f6d458c76bf --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneRegionalDisksFromConsistencyGroup.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_clone_regional_disk] +import com.google.cloud.compute.v1.BulkInsertDiskResource; +import com.google.cloud.compute.v1.BulkInsertRegionDiskRequest; +import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; +import com.google.cloud.compute.v1.RegionDisksClient; +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class CloneRegionalDisksFromConsistencyGroup { + + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + // TODO(developer): Replace these variables before running the sample. + // Project ID or project number of the Cloud project you want to use. + String project = "YOUR_PROJECT_ID"; + // Region in which your disks and consistency group are located. + String region = "us-central1"; + // Name of the consistency group you want to clone disks from. + String consistencyGroupName = "YOUR_CONSISTENCY_GROUP_NAME"; + + cloneRegionalDisksFromConsistencyGroup(project, region, consistencyGroupName); + } + + // Clones regional disks from a consistency group. + public static Status cloneRegionalDisksFromConsistencyGroup( + String project, String region, String consistencyGroupName) + throws IOException, InterruptedException, ExecutionException, TimeoutException { + String sourceConsistencyGroupPolicy = 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()) { + BulkInsertRegionDiskRequest request = BulkInsertRegionDiskRequest.newBuilder() + .setProject(project) + .setRegion(region) + .setBulkInsertDiskResourceResource( + BulkInsertDiskResource.newBuilder() + .setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy) + .build()) + .build(); + + Operation response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES); + + if (response.hasError()) { + throw new Error("Error cloning regional disks! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_clone_regional_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneZonalDisksFromConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneZonalDisksFromConsistencyGroup.java new file mode 100644 index 00000000000..546388ad95a --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CloneZonalDisksFromConsistencyGroup.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_clone_zonal_disk] +import com.google.cloud.compute.v1.BulkInsertDiskRequest; +import com.google.cloud.compute.v1.BulkInsertDiskResource; +import com.google.cloud.compute.v1.DisksClient; +import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class CloneZonalDisksFromConsistencyGroup { + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + // TODO(developer): Replace these variables before running the sample. + // Project ID or project number of the Cloud project you want to use. + String project = "YOUR_PROJECT_ID"; + // Zone in which your disks are located. + String disksLocation = "us-central1-a"; + // Name of the consistency group you want to clone disks from. + String consistencyGroupName = "YOUR_CONSISTENCY_GROUP_NAME"; + + cloneZonalDisksFromConsistencyGroup(project, disksLocation, consistencyGroupName); + } + + // Clones zonal disks from a consistency group. + public static Status cloneZonalDisksFromConsistencyGroup( + String project, String zone, String consistencyGroupName) + throws IOException, InterruptedException, ExecutionException, TimeoutException { + String region = zone.substring(0, zone.lastIndexOf('-')); + String sourceConsistencyGroupPolicy = 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()) { + BulkInsertDiskRequest request = BulkInsertDiskRequest.newBuilder() + .setProject(project) + .setZone(zone) + .setBulkInsertDiskResourceResource( + BulkInsertDiskResource.newBuilder() + .setSourceConsistencyGroupPolicy(sourceConsistencyGroupPolicy) + .build()) + .build(); + + Operation response = disksClient.bulkInsertAsync(request).get(3, TimeUnit.MINUTES); + + if (response.hasError()) { + throw new Error("Error cloning zonal disks! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_clone_zonal_disk] diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CreateConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CreateConsistencyGroup.java index df6c324d8d5..b1769f6fd1b 100644 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CreateConsistencyGroup.java +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/CreateConsistencyGroup.java @@ -19,6 +19,7 @@ // [START compute_consistency_group_create] import com.google.cloud.compute.v1.InsertResourcePolicyRequest; import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; import com.google.cloud.compute.v1.ResourcePoliciesClient; import com.google.cloud.compute.v1.ResourcePolicy; import java.io.IOException; @@ -42,7 +43,7 @@ public static void main(String[] args) } // Creates a new consistency group resource policy in the specified project and region. - public static Operation.Status createConsistencyGroup( + public static Status createConsistencyGroup( String project, String region, String consistencyGroupName) throws IOException, ExecutionException, InterruptedException, TimeoutException { // Initialize client that will be used to send requests. This client only needs to be created diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/DeleteConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/DeleteConsistencyGroup.java index 89ab6f756e0..89eaae58e01 100644 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/DeleteConsistencyGroup.java +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/DeleteConsistencyGroup.java @@ -18,6 +18,7 @@ // [START compute_consistency_group_delete] import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; import com.google.cloud.compute.v1.ResourcePoliciesClient; import java.io.IOException; import java.util.concurrent.ExecutionException; @@ -40,7 +41,7 @@ public static void main(String[] args) } // Deletes a consistency group resource policy in the specified project and region. - public static Operation.Status deleteConsistencyGroup( + public static Status deleteConsistencyGroup( String project, String region, String consistencyGroupName) throws IOException, ExecutionException, InterruptedException, TimeoutException { // Initialize client that will be used to send requests. This client only needs to be created diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListRegionalDisksInConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListRegionalDisksInConsistencyGroup.java index 36fe60cf2ad..d4889d543fa 100644 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListRegionalDisksInConsistencyGroup.java +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListRegionalDisksInConsistencyGroup.java @@ -16,7 +16,7 @@ package compute.disks.consistencygroup; -// [START compute_consistency_group_list_disks_regional] +// [START compute_consistency_group_list_regional_disks] import com.google.cloud.compute.v1.Disk; import com.google.cloud.compute.v1.ListRegionDisksRequest; import com.google.cloud.compute.v1.RegionDisksClient; @@ -33,22 +33,19 @@ public static void main(String[] args) String project = "YOUR_PROJECT_ID"; // Name of the consistency group. String consistencyGroupName = "CONSISTENCY_GROUP_ID"; - // Region of the disk. - String disksLocation = "us-central1"; - // Region of the consistency group. - String consistencyGroupLocation = "us-central1"; + // Region in which your disks and consistency group are located. + String region = "us-central1"; listRegionalDisksInConsistencyGroup( - project, consistencyGroupName, consistencyGroupLocation, disksLocation); + project, consistencyGroupName, region); } // Lists disks in a consistency group. - public static List listRegionalDisksInConsistencyGroup(String project, - String consistencyGroupName, String consistencyGroupLocation, String disksLocation) - throws IOException { + public static List listRegionalDisksInConsistencyGroup( + String project, String consistencyGroupName, String region) throws IOException { String filter = String .format("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/resourcePolicies/%s", - project, consistencyGroupLocation, consistencyGroupName); + project, region, consistencyGroupName); List disksList = new ArrayList<>(); // Initialize client that will be used to send requests. This client only needs to be created @@ -57,7 +54,7 @@ public static List listRegionalDisksInConsistencyGroup(String project, ListRegionDisksRequest request = ListRegionDisksRequest.newBuilder() .setProject(project) - .setRegion(disksLocation) + .setRegion(region) .build(); RegionDisksClient.ListPagedResponse response = disksClient.list(request); @@ -71,4 +68,4 @@ public static List listRegionalDisksInConsistencyGroup(String project, return disksList; } } -// [END compute_consistency_group_list_disks_regional] \ No newline at end of file +// [END compute_consistency_group_list_regional_disks] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListZonalDisksInConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListZonalDisksInConsistencyGroup.java index 2434802d860..05cd688ac7b 100644 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListZonalDisksInConsistencyGroup.java +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/ListZonalDisksInConsistencyGroup.java @@ -16,7 +16,7 @@ package compute.disks.consistencygroup; -// [START compute_consistency_group_list_disks_zonal] +// [START compute_consistency_group_list_zonal_disks] import com.google.cloud.compute.v1.Disk; import com.google.cloud.compute.v1.DisksClient; import com.google.cloud.compute.v1.ListDisksRequest; @@ -33,23 +33,21 @@ public static void main(String[] args) String project = "YOUR_PROJECT_ID"; // Name of the consistency group. String consistencyGroupName = "CONSISTENCY_GROUP_ID"; - // Zone of the disk. + // Zone in which your disks are located. String disksLocation = "us-central1-a"; - // Region of the consistency group. - String consistencyGroupLocation = "us-central1"; - listZonalDisksInConsistencyGroup( - project, consistencyGroupName, consistencyGroupLocation, disksLocation); + listZonalDisksInConsistencyGroup(project, consistencyGroupName, disksLocation); } // Lists disks in a consistency group. - public static List listZonalDisksInConsistencyGroup(String project, - String consistencyGroupName, String consistencyGroupLocation, String disksLocation) - throws IOException { + public static List listZonalDisksInConsistencyGroup( + String project, String consistencyGroupName, String disksLocation) throws IOException { + String region = disksLocation.substring(0, disksLocation.lastIndexOf('-')); String filter = String .format("https://www.googleapis.com/compute/v1/projects/%s/regions/%s/resourcePolicies/%s", - project, consistencyGroupLocation, consistencyGroupName); + project, region, consistencyGroupName); List disksList = new ArrayList<>(); + // 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()) { @@ -70,4 +68,4 @@ public static List listZonalDisksInConsistencyGroup(String project, return disksList; } } -// [END compute_consistency_group_list_disks_zonal] +// [END compute_consistency_group_list_zonal_disks] diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveDiskFromConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveDiskFromConsistencyGroup.java deleted file mode 100644 index b791125b0dd..00000000000 --- a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveDiskFromConsistencyGroup.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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_remove_disk] -import com.google.cloud.compute.v1.DisksClient; -import com.google.cloud.compute.v1.DisksRemoveResourcePoliciesRequest; -import com.google.cloud.compute.v1.Operation; -import com.google.cloud.compute.v1.RegionDisksClient; -import com.google.cloud.compute.v1.RegionDisksRemoveResourcePoliciesRequest; -import com.google.cloud.compute.v1.RemoveResourcePoliciesDiskRequest; -import com.google.cloud.compute.v1.RemoveResourcePoliciesRegionDiskRequest; -import java.io.IOException; -import java.util.Arrays; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -public class RemoveDiskFromConsistencyGroup { - - public static void main(String[] args) - throws IOException, ExecutionException, InterruptedException, 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 or region of the disk. - String location = "us-central1"; - // Name of the disk. - String diskName = "DISK_NAME"; - // Name of the consistency group. - String consistencyGroupName = "CONSISTENCY_GROUP"; - // Region of the consistency group. - String consistencyGroupLocation = "us-central1"; - - removeDiskFromConsistencyGroup( - project, location, diskName, consistencyGroupName, consistencyGroupLocation); - } - - // Removes a disk from a consistency group. - public static Operation.Status removeDiskFromConsistencyGroup( - String project, String location, String diskName, - String consistencyGroupName, String consistencyGroupLocation) - throws IOException, ExecutionException, InterruptedException, TimeoutException { - String consistencyGroupUrl = String.format( - "https://www.googleapis.com/compute/v1/projects/%s/regions/%s/resourcePolicies/%s", - project, consistencyGroupLocation, consistencyGroupName); - Operation response; - if (Character.isDigit(location.charAt(location.length() - 1))) { - // 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()) { - RemoveResourcePoliciesRegionDiskRequest request = - RemoveResourcePoliciesRegionDiskRequest.newBuilder() - .setDisk(diskName) - .setRegion(location) - .setProject(project) - .setRegionDisksRemoveResourcePoliciesRequestResource( - RegionDisksRemoveResourcePoliciesRequest.newBuilder() - .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) - .build()) - .build(); - - response = disksClient.removeResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); - } - } else { - try (DisksClient disksClient = DisksClient.create()) { - RemoveResourcePoliciesDiskRequest request = - RemoveResourcePoliciesDiskRequest.newBuilder() - .setDisk(diskName) - .setZone(location) - .setProject(project) - .setDisksRemoveResourcePoliciesRequestResource( - DisksRemoveResourcePoliciesRequest.newBuilder() - .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) - .build()) - .build(); - response = disksClient.removeResourcePoliciesAsync(request).get(1, TimeUnit.MINUTES); - } - } - if (response.hasError()) { - throw new Error("Error removing disk from consistency group! " + response.getError()); - } - return response.getStatus(); - } -} -// [END compute_consistency_group_remove_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveRegionalDiskFromConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveRegionalDiskFromConsistencyGroup.java new file mode 100644 index 00000000000..7c20de4b7f2 --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveRegionalDiskFromConsistencyGroup.java @@ -0,0 +1,80 @@ +/* + * 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_remove_regional_disk] +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.RegionDisksRemoveResourcePoliciesRequest; +import com.google.cloud.compute.v1.RemoveResourcePoliciesRegionDiskRequest; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class RemoveRegionalDiskFromConsistencyGroup { + + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, 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 in which your disk and consistency group are located. + String region = "us-central1"; + // Name of the disk. + String diskName = "DISK_NAME"; + // Name of the consistency group. + String consistencyGroupName = "CONSISTENCY_GROUP"; + + removeRegionalDiskFromConsistencyGroup(project, region, diskName, consistencyGroupName); + } + + // Removes a disk from a consistency group. + public static Status removeRegionalDiskFromConsistencyGroup( + String project, String region, String diskName, String consistencyGroupName) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + String consistencyGroupUrl = String.format( + "https://www.googleapis.com/compute/v1/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()) { + RemoveResourcePoliciesRegionDiskRequest request = + RemoveResourcePoliciesRegionDiskRequest.newBuilder() + .setDisk(diskName) + .setRegion(region) + .setProject(project) + .setRegionDisksRemoveResourcePoliciesRequestResource( + RegionDisksRemoveResourcePoliciesRequest.newBuilder() + .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) + .build()) + .build(); + + Operation response = disksClient.removeResourcePoliciesAsync(request) + .get(1, TimeUnit.MINUTES); + + if (response.hasError()) { + throw new Error("Error removing disk from consistency group! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_remove_regional_disk] diff --git a/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveZonalDiskFromConsistencyGroup.java b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveZonalDiskFromConsistencyGroup.java new file mode 100644 index 00000000000..5d7b6200711 --- /dev/null +++ b/compute/cloud-client/src/main/java/compute/disks/consistencygroup/RemoveZonalDiskFromConsistencyGroup.java @@ -0,0 +1,81 @@ +/* + * 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_remove_zonal_disk] +import com.google.cloud.compute.v1.DisksClient; +import com.google.cloud.compute.v1.DisksRemoveResourcePoliciesRequest; +import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; +import com.google.cloud.compute.v1.RemoveResourcePoliciesDiskRequest; +import java.io.IOException; +import java.util.Arrays; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class RemoveZonalDiskFromConsistencyGroup { + + public static void main(String[] args) + throws IOException, ExecutionException, InterruptedException, 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 diskLocation = "us-central1-a"; + // Name of the disk. + String diskName = "DISK_NAME"; + // Name of the consistency group. + String consistencyGroupName = "CONSISTENCY_GROUP"; + + removeZonalDiskFromConsistencyGroup(project, diskLocation, diskName, consistencyGroupName); + } + + // Removes a disk from a consistency group. + public static Status removeZonalDiskFromConsistencyGroup( + String project, String diskLocation, String diskName, String consistencyGroupName) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + String region = diskLocation.substring(0, diskLocation.lastIndexOf('-')); + String consistencyGroupUrl = String.format( + "https://www.googleapis.com/compute/v1/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()) { + RemoveResourcePoliciesDiskRequest request = + RemoveResourcePoliciesDiskRequest.newBuilder() + .setDisk(diskName) + .setZone(diskLocation) + .setProject(project) + .setDisksRemoveResourcePoliciesRequestResource( + DisksRemoveResourcePoliciesRequest.newBuilder() + .addAllResourcePolicies(Arrays.asList(consistencyGroupUrl)) + .build()) + .build(); + Operation response = disksClient.removeResourcePoliciesAsync(request) + .get(1, TimeUnit.MINUTES); + + + if (response.hasError()) { + throw new Error("Error removing disk from consistency group! " + response.getError()); + } + return response.getStatus(); + } + } +} +// [END compute_consistency_group_remove_zonal_disk] \ No newline at end of file diff --git a/compute/cloud-client/src/test/java/compute/Util.java b/compute/cloud-client/src/test/java/compute/Util.java index ccc3b8135cf..7629e4b913e 100644 --- a/compute/cloud-client/src/test/java/compute/Util.java +++ b/compute/cloud-client/src/test/java/compute/Util.java @@ -16,7 +16,6 @@ package compute; -import com.google.cloud.compute.v1.DeleteStoragePoolRequest; import com.google.cloud.compute.v1.Disk; import com.google.cloud.compute.v1.DisksClient; import com.google.cloud.compute.v1.Instance; @@ -25,15 +24,12 @@ import com.google.cloud.compute.v1.InstanceTemplatesClient.ListPagedResponse; import com.google.cloud.compute.v1.InstancesClient; import com.google.cloud.compute.v1.ListRegionInstanceTemplatesRequest; -import com.google.cloud.compute.v1.Operation; import com.google.cloud.compute.v1.RegionDisksClient; import com.google.cloud.compute.v1.RegionInstanceTemplatesClient; import com.google.cloud.compute.v1.Reservation; import com.google.cloud.compute.v1.ReservationsClient; import com.google.cloud.compute.v1.Snapshot; import com.google.cloud.compute.v1.SnapshotsClient; -import com.google.cloud.compute.v1.StoragePool; -import com.google.cloud.compute.v1.StoragePoolsClient; import compute.deleteprotection.SetDeleteProtection; import compute.disks.DeleteDisk; import compute.disks.DeleteSnapshot; @@ -48,7 +44,6 @@ import java.util.Base64; import java.util.Random; import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.stream.IntStream; @@ -218,22 +213,6 @@ && isCreatedBeforeThresholdTime(disk.getCreationTimestamp())) { } } - // Delete regional disks which starts with the given prefixToDelete and - // has creation timestamp >24 hours. - public static void cleanUpExistingRegionalDisks( - String prefixToDelete, String projectId, String region) - throws IOException, ExecutionException, InterruptedException, TimeoutException { - try (RegionDisksClient disksClient = RegionDisksClient.create()) { - for (Disk disk : disksClient.list(projectId, region).iterateAll()) { - if (disk.getName().contains(prefixToDelete) - && disk.getRegion().equals(region) - && isCreatedBeforeThresholdTime(disk.getCreationTimestamp())) { - RegionalDelete.deleteRegionalDisk(projectId, region, disk.getName()); - } - } - } - } - // Delete snapshots which starts with the given prefixToDelete and // has creation timestamp >24 hours. public static void cleanUpExistingSnapshots(String prefixToDelete, String projectId) @@ -248,41 +227,22 @@ && isCreatedBeforeThresholdTime(snapshot.getCreationTimestamp())) { } } - // Delete storagePools which starts with the given prefixToDelete and + // Delete disks which starts with the given prefixToDelete and // has creation timestamp >24 hours. - public static void cleanUpExistingStoragePool( - String prefixToDelete, String projectId, String zone) - throws IOException, ExecutionException, InterruptedException, TimeoutException { - try (StoragePoolsClient storagePoolsClient = StoragePoolsClient.create()) { - for (StoragePool storagePool : storagePoolsClient.list(projectId, zone).iterateAll()) { - if (containPrefixToDeleteAndZone(storagePool, prefixToDelete, zone) - && isCreatedBeforeThresholdTime(storagePool.getCreationTimestamp())) { - deleteStoragePool(projectId, zone, storagePool.getName()); + public static void cleanUpExistingRegionalDisks( + String prefixToDelete, String projectId, String region) + throws IOException, ExecutionException, InterruptedException, TimeoutException { + try (RegionDisksClient disksClient = RegionDisksClient.create()) { + for (Disk disk : disksClient.list(projectId, region).iterateAll()) { + if (disk.getName().contains(prefixToDelete) + && disk.getRegion().equals(region) + && isCreatedBeforeThresholdTime(disk.getCreationTimestamp())) { + RegionalDelete.deleteRegionalDisk(projectId, region, disk.getName()); } } } } - public static void deleteStoragePool(String project, String zone, String storagePoolName) - throws IOException, ExecutionException, InterruptedException, TimeoutException { - try (StoragePoolsClient storagePoolsClient = StoragePoolsClient.create()) { - DeleteStoragePoolRequest request = - DeleteStoragePoolRequest.newBuilder() - .setProject(project) - .setZone(zone) - .setStoragePool(storagePoolName) - .build(); - Operation operation = storagePoolsClient.deleteAsync(request).get(3, TimeUnit.MINUTES); - if (operation.hasError()) { - System.out.println("StoragePool deletion failed!"); - throw new Error(operation.getError().toString()); - } - // Wait for server update - TimeUnit.SECONDS.sleep(50); - System.out.println("Deleted storage pool: " + storagePoolName); - } - } - public static boolean containPrefixToDeleteAndZone( Object resource, String prefixToDelete, String zone) { boolean containPrefixAndZone = false; @@ -304,10 +264,6 @@ public static boolean containPrefixToDeleteAndZone( containPrefixAndZone = ((Disk) resource).getName().contains(prefixToDelete) && ((Disk) resource).getZone().contains(zone); } - if (resource instanceof StoragePool) { - containPrefixAndZone = ((StoragePool) resource).getName().contains(prefixToDelete) - && ((StoragePool) resource).getZone().contains(zone); - } } catch (NullPointerException e) { System.out.println("Resource not found, skipping deletion:"); } 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 61d4ec81940..ec767be15db 100644 --- a/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java +++ b/compute/cloud-client/src/test/java/compute/disks/ConsistencyGroupIT.java @@ -26,21 +26,30 @@ import static org.mockito.Mockito.when; import com.google.api.gax.longrunning.OperationFuture; +import com.google.cloud.compute.v1.AddResourcePoliciesDiskRequest; import com.google.cloud.compute.v1.AddResourcePoliciesRegionDiskRequest; +import com.google.cloud.compute.v1.BulkInsertDiskRequest; +import com.google.cloud.compute.v1.BulkInsertRegionDiskRequest; import com.google.cloud.compute.v1.DisksClient; import com.google.cloud.compute.v1.InsertResourcePolicyRequest; import com.google.cloud.compute.v1.ListDisksRequest; import com.google.cloud.compute.v1.ListRegionDisksRequest; 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.RemoveResourcePoliciesDiskRequest; import com.google.cloud.compute.v1.RemoveResourcePoliciesRegionDiskRequest; import com.google.cloud.compute.v1.ResourcePoliciesClient; -import compute.disks.consistencygroup.AddDiskToConsistencyGroup; +import compute.disks.consistencygroup.AddRegionalDiskToConsistencyGroup; +import compute.disks.consistencygroup.AddZonalDiskToConsistencyGroup; +import compute.disks.consistencygroup.CloneRegionalDisksFromConsistencyGroup; +import compute.disks.consistencygroup.CloneZonalDisksFromConsistencyGroup; 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.RemoveRegionalDiskFromConsistencyGroup; +import compute.disks.consistencygroup.RemoveZonalDiskFromConsistencyGroup; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; @@ -52,6 +61,7 @@ @Timeout(value = 2, unit = TimeUnit.MINUTES) public class ConsistencyGroupIT { private static final String PROJECT_ID = "project-id"; + private static final String ZONE = "asia-east1-c"; private static final String REGION = "asia-east1"; private static final String CONSISTENCY_GROUP_NAME = "consistency-group"; private static final String DISK_NAME = "disk-for-consistency"; @@ -68,14 +78,14 @@ public void testCreateConsistencyGroupResourcePolicy() throws Exception { when(mockClient.insertAsync(any(InsertResourcePolicyRequest.class))) .thenReturn(mockFuture); when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); - when(operation.getStatus()).thenReturn(Operation.Status.DONE); + when(operation.getStatus()).thenReturn(Status.DONE); - Operation.Status status = CreateConsistencyGroup.createConsistencyGroup( + Status status = CreateConsistencyGroup.createConsistencyGroup( PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME); verify(mockClient, times(1)).insertAsync(any(InsertResourcePolicyRequest.class)); verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); - assertEquals(Operation.Status.DONE, status); + assertEquals(Status.DONE, status); } } @@ -91,20 +101,44 @@ public void testAddRegionalDiskToConsistencyGroup() throws Exception { when(mockClient.addResourcePoliciesAsync(any(AddResourcePoliciesRegionDiskRequest.class))) .thenReturn(mockFuture); when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); - when(operation.getStatus()).thenReturn(Operation.Status.DONE); + when(operation.getStatus()).thenReturn(Status.DONE); - Operation.Status status = AddDiskToConsistencyGroup.addDiskToConsistencyGroup( - PROJECT_ID, REGION, DISK_NAME, CONSISTENCY_GROUP_NAME, REGION); + Status status = AddRegionalDiskToConsistencyGroup.addRegionalDiskToConsistencyGroup( + PROJECT_ID, REGION, DISK_NAME, CONSISTENCY_GROUP_NAME); verify(mockClient, times(1)) .addResourcePoliciesAsync(any(AddResourcePoliciesRegionDiskRequest.class)); verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); - assertEquals(Operation.Status.DONE, status); + assertEquals(Status.DONE, status); } } @Test - public void testRemoveDiskFromConsistencyGroup() throws Exception { + public void testAddZonalDiskToConsistencyGroup() throws Exception { + try (MockedStatic mockedRegionDisksClient = + mockStatic(DisksClient.class)) { + Operation operation = mock(Operation.class); + DisksClient mockClient = mock(DisksClient.class); + OperationFuture mockFuture = mock(OperationFuture.class); + + mockedRegionDisksClient.when(DisksClient::create).thenReturn(mockClient); + when(mockClient.addResourcePoliciesAsync(any(AddResourcePoliciesDiskRequest.class))) + .thenReturn(mockFuture); + when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); + when(operation.getStatus()).thenReturn(Status.DONE); + + Status status = AddZonalDiskToConsistencyGroup.addZonalDiskToConsistencyGroup( + PROJECT_ID, REGION, DISK_NAME, CONSISTENCY_GROUP_NAME); + + verify(mockClient, times(1)) + .addResourcePoliciesAsync(any(AddResourcePoliciesDiskRequest.class)); + verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); + assertEquals(Status.DONE, status); + } + } + + @Test + public void testRemoveRegionalDiskFromConsistencyGroup() throws Exception { try (MockedStatic mockedRegionDisksClient = mockStatic(RegionDisksClient.class)) { Operation operation = mock(Operation.class); @@ -115,15 +149,41 @@ public void testRemoveDiskFromConsistencyGroup() throws Exception { when(mockClient.removeResourcePoliciesAsync( any(RemoveResourcePoliciesRegionDiskRequest.class))).thenReturn(mockFuture); when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); - when(operation.getStatus()).thenReturn(Operation.Status.DONE); + when(operation.getStatus()).thenReturn(Status.DONE); - Operation.Status status = RemoveDiskFromConsistencyGroup.removeDiskFromConsistencyGroup( - PROJECT_ID, REGION, DISK_NAME, CONSISTENCY_GROUP_NAME, REGION); + Status status = RemoveRegionalDiskFromConsistencyGroup + .removeRegionalDiskFromConsistencyGroup( + PROJECT_ID, REGION, DISK_NAME, CONSISTENCY_GROUP_NAME); verify(mockClient, times(1)) .removeResourcePoliciesAsync(any(RemoveResourcePoliciesRegionDiskRequest.class)); verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); - assertEquals(Operation.Status.DONE, status); + assertEquals(Status.DONE, status); + } + } + + @Test + public void testRemoveZonalDiskFromConsistencyGroup() throws Exception { + try (MockedStatic mockedRegionDisksClient = + mockStatic(DisksClient.class)) { + Operation operation = mock(Operation.class); + DisksClient mockClient = mock(DisksClient.class); + OperationFuture mockFuture = mock(OperationFuture.class); + + mockedRegionDisksClient.when(DisksClient::create).thenReturn(mockClient); + when(mockClient.removeResourcePoliciesAsync( + any(RemoveResourcePoliciesDiskRequest.class))).thenReturn(mockFuture); + when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); + when(operation.getStatus()).thenReturn(Status.DONE); + + Status status = RemoveZonalDiskFromConsistencyGroup + .removeZonalDiskFromConsistencyGroup( + PROJECT_ID, ZONE, DISK_NAME, CONSISTENCY_GROUP_NAME); + + verify(mockClient, times(1)) + .removeResourcePoliciesAsync(any(RemoveResourcePoliciesDiskRequest.class)); + verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); + assertEquals(Status.DONE, status); } } @@ -139,15 +199,15 @@ public void testDeleteConsistencyGroup() throws Exception { when(mockClient.deleteAsync(PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME)) .thenReturn(mockFuture); when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); - when(operation.getStatus()).thenReturn(Operation.Status.DONE); + when(operation.getStatus()).thenReturn(Status.DONE); - Operation.Status status = DeleteConsistencyGroup.deleteConsistencyGroup( + Status status = DeleteConsistencyGroup.deleteConsistencyGroup( PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME); verify(mockClient, times(1)) .deleteAsync(PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME); verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); - assertEquals(Operation.Status.DONE, status); + assertEquals(Status.DONE, status); } } @@ -164,7 +224,7 @@ public void testListRegionalDisksInConsistencyGroup() throws Exception { .thenReturn(mockResponse); ListRegionalDisksInConsistencyGroup.listRegionalDisksInConsistencyGroup( - PROJECT_ID, CONSISTENCY_GROUP_NAME, REGION, REGION); + PROJECT_ID, CONSISTENCY_GROUP_NAME, REGION); verify(mockClient, times(1)) .list(any(ListRegionDisksRequest.class)); @@ -172,6 +232,55 @@ public void testListRegionalDisksInConsistencyGroup() throws Exception { } } + @Test + public void testCloneRegionalDisksFromConsistencyGroup() 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.bulkInsertAsync(any(BulkInsertRegionDiskRequest.class))) + .thenReturn(mockFuture); + when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); + when(operation.getStatus()).thenReturn(Status.DONE); + + Status status = CloneRegionalDisksFromConsistencyGroup + .cloneRegionalDisksFromConsistencyGroup( + PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME); + + verify(mockClient, times(1)) + .bulkInsertAsync(any(BulkInsertRegionDiskRequest.class)); + verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); + assertEquals(Status.DONE, status); + } + } + + @Test + public void testCloneZonalDisksFromConsistencyGroup() throws Exception { + try (MockedStatic mockedRegionDisksClient = + mockStatic(DisksClient.class)) { + Operation operation = mock(Operation.class); + DisksClient mockClient = mock(DisksClient.class); + OperationFuture mockFuture = mock(OperationFuture.class); + + mockedRegionDisksClient.when(DisksClient::create).thenReturn(mockClient); + when(mockClient.bulkInsertAsync(any(BulkInsertDiskRequest.class))) + .thenReturn(mockFuture); + when(mockFuture.get(anyLong(), any(TimeUnit.class))).thenReturn(operation); + when(operation.getStatus()).thenReturn(Status.DONE); + + Status status = CloneZonalDisksFromConsistencyGroup + .cloneZonalDisksFromConsistencyGroup(PROJECT_ID, REGION, CONSISTENCY_GROUP_NAME); + + verify(mockClient, times(1)) + .bulkInsertAsync(any(BulkInsertDiskRequest.class)); + verify(mockFuture, times(1)).get(anyLong(), any(TimeUnit.class)); + assertEquals(Status.DONE, status); + } + } + @Test public void testListZonalDisksInConsistencyGroup() throws Exception { try (MockedStatic mockedRegionDisksClient = @@ -185,7 +294,7 @@ public void testListZonalDisksInConsistencyGroup() throws Exception { .thenReturn(mockResponse); ListZonalDisksInConsistencyGroup.listZonalDisksInConsistencyGroup( - PROJECT_ID, CONSISTENCY_GROUP_NAME, REGION, REGION); + PROJECT_ID, CONSISTENCY_GROUP_NAME, ZONE); verify(mockClient, times(1)) .list(any(ListDisksRequest.class)); diff --git a/compute/cloud-client/src/test/java/compute/disks/DisksIT.java b/compute/cloud-client/src/test/java/compute/disks/DisksIT.java index cd293c0c82f..94e1dec864e 100644 --- a/compute/cloud-client/src/test/java/compute/disks/DisksIT.java +++ b/compute/cloud-client/src/test/java/compute/disks/DisksIT.java @@ -31,6 +31,7 @@ import com.google.cloud.compute.v1.InstancesClient; import com.google.cloud.compute.v1.NetworkInterface; import com.google.cloud.compute.v1.Operation; +import com.google.cloud.compute.v1.Operation.Status; import com.google.cloud.compute.v1.Snapshot; import com.google.cloud.compute.v1.SnapshotsClient; import compute.DeleteInstance; @@ -305,9 +306,9 @@ public void testDiskAttachResize() @Test public void testCreateReplicatedDisk() throws IOException, ExecutionException, InterruptedException, TimeoutException { - Operation.Status status = CreateReplicatedDisk.createReplicatedDisk(PROJECT_ID, REGION, + Status status = CreateReplicatedDisk.createReplicatedDisk(PROJECT_ID, REGION, replicaZones, REGIONAL_REPLICATED_DISK, 100, DISK_TYPE); - assertThat(status).isEqualTo(Operation.Status.DONE); + assertThat(status).isEqualTo(Status.DONE); } }