| 
 | 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.reservation;  | 
 | 18 | + | 
 | 19 | +// [START compute_consume_single_project_reservation]  | 
 | 20 | +import static com.google.cloud.compute.v1.ReservationAffinity.ConsumeReservationType.SPECIFIC_RESERVATION;  | 
 | 21 | + | 
 | 22 | +import com.google.api.gax.longrunning.OperationFuture;  | 
 | 23 | +import com.google.cloud.compute.v1.AttachedDisk;  | 
 | 24 | +import com.google.cloud.compute.v1.AttachedDiskInitializeParams;  | 
 | 25 | +import com.google.cloud.compute.v1.InsertInstanceRequest;  | 
 | 26 | +import com.google.cloud.compute.v1.Instance;  | 
 | 27 | +import com.google.cloud.compute.v1.InstancesClient;  | 
 | 28 | +import com.google.cloud.compute.v1.NetworkInterface;  | 
 | 29 | +import com.google.cloud.compute.v1.Operation;  | 
 | 30 | +import com.google.cloud.compute.v1.ReservationAffinity;  | 
 | 31 | +import java.io.IOException;  | 
 | 32 | +import java.util.concurrent.ExecutionException;  | 
 | 33 | +import java.util.concurrent.TimeUnit;  | 
 | 34 | +import java.util.concurrent.TimeoutException;  | 
 | 35 | + | 
 | 36 | +public class ConsumeSingleProjectReservation {  | 
 | 37 | +  public static void main(String[] args)  | 
 | 38 | +      throws IOException, ExecutionException, InterruptedException, TimeoutException {  | 
 | 39 | +    // TODO(developer): Replace these variables before running the sample.  | 
 | 40 | +    // Project ID or project number of the Cloud project you want to use.  | 
 | 41 | +    String projectId = "YOUR_PROJECT_ID";  | 
 | 42 | +    // Name of the zone where the reservation is located.  | 
 | 43 | +    String zone = "us-central1-a";  | 
 | 44 | +    // Name of the reservation you want to query.  | 
 | 45 | +    String reservationName = "YOUR_RESERVATION_NAME";  | 
 | 46 | +    // Name of the VM instance you want to query.  | 
 | 47 | +    String instanceName = "YOUR_INSTANCE_NAME";  | 
 | 48 | +    // machineType: machine type of the VM being created.  | 
 | 49 | +    // *   For a list of machine types, see https://cloud.google.com/compute/docs/machine-types  | 
 | 50 | +    String machineTypeName = "n1-standard-4";  | 
 | 51 | +    // sourceImage: path to the operating system image to mount.  | 
 | 52 | +    // *   For details about images you can mount, see https://cloud.google.com/compute/docs/images  | 
 | 53 | +    String sourceImage = "projects/debian-cloud/global/images/family/debian-11";  | 
 | 54 | +    // diskSizeGb: storage size of the boot disk to attach to the instance.  | 
 | 55 | +    long diskSizeGb = 10L;  | 
 | 56 | +    // networkName: network interface to associate with the instance.  | 
 | 57 | +    String networkName = "default";  | 
 | 58 | +    // Minimum CPU platform of the instances.  | 
 | 59 | +    String minCpuPlatform = "Intel Skylake";  | 
 | 60 | + | 
 | 61 | +    createInstanceAsync(projectId, zone, instanceName, reservationName, machineTypeName,  | 
 | 62 | +        sourceImage, diskSizeGb, networkName, minCpuPlatform);  | 
 | 63 | +  }  | 
 | 64 | + | 
 | 65 | +  // Create a virtual machine targeted with the reserveAffinity field.  | 
 | 66 | +  // Ensure that the VM's properties match the reservation's VM properties.  | 
 | 67 | +  public static Instance createInstanceAsync(String projectId, String zone, String instanceName,  | 
 | 68 | +      String reservationName, String machineTypeName, String sourceImage, long diskSizeGb,  | 
 | 69 | +      String networkName, String minCpuPlatform)  | 
 | 70 | +      throws IOException, InterruptedException, ExecutionException, TimeoutException {  | 
 | 71 | +    String machineType = String.format("zones/%s/machineTypes/%s", zone, machineTypeName);  | 
 | 72 | +    // Initialize client that will be used to send requests. This client only needs to be created  | 
 | 73 | +    // once, and can be reused for multiple requests.  | 
 | 74 | +    try (InstancesClient instancesClient = InstancesClient.create()) {  | 
 | 75 | +      AttachedDisk disk =  | 
 | 76 | +          AttachedDisk.newBuilder()  | 
 | 77 | +              .setBoot(true)  | 
 | 78 | +              .setAutoDelete(true)  | 
 | 79 | +              .setType(AttachedDisk.Type.PERSISTENT.toString())  | 
 | 80 | +              .setDeviceName("disk-1")  | 
 | 81 | +              .setInitializeParams(  | 
 | 82 | +                  AttachedDiskInitializeParams.newBuilder()  | 
 | 83 | +                      .setSourceImage(sourceImage)  | 
 | 84 | +                      .setDiskSizeGb(diskSizeGb)  | 
 | 85 | +                      .build())  | 
 | 86 | +              .build();  | 
 | 87 | + | 
 | 88 | +      NetworkInterface networkInterface = NetworkInterface.newBuilder()  | 
 | 89 | +          .setName(networkName)  | 
 | 90 | +          .build();  | 
 | 91 | + | 
 | 92 | +      ReservationAffinity reservationAffinity =  | 
 | 93 | +          ReservationAffinity.newBuilder()  | 
 | 94 | +              .setConsumeReservationType(SPECIFIC_RESERVATION.toString())  | 
 | 95 | +              .setKey("compute.googleapis.com/reservation-name")  | 
 | 96 | +              // Set specific reservation  | 
 | 97 | +              .addValues(reservationName)  | 
 | 98 | +              .build();  | 
 | 99 | + | 
 | 100 | +      Instance instanceResource =  | 
 | 101 | +          Instance.newBuilder()  | 
 | 102 | +              .setName(instanceName)  | 
 | 103 | +              .setMachineType(machineType)  | 
 | 104 | +              .addDisks(disk)  | 
 | 105 | +              .addNetworkInterfaces(networkInterface)  | 
 | 106 | +              .setMinCpuPlatform(minCpuPlatform)  | 
 | 107 | +              .setReservationAffinity(reservationAffinity)  | 
 | 108 | +              .build();  | 
 | 109 | + | 
 | 110 | +      InsertInstanceRequest insertInstanceRequest = InsertInstanceRequest.newBuilder()  | 
 | 111 | +          .setProject(projectId)  | 
 | 112 | +          .setZone(zone)  | 
 | 113 | +          .setInstanceResource(instanceResource)  | 
 | 114 | +          .build();  | 
 | 115 | + | 
 | 116 | +      OperationFuture<Operation, Operation> operation = instancesClient.insertAsync(  | 
 | 117 | +          insertInstanceRequest);  | 
 | 118 | +      Operation response = operation.get(3, TimeUnit.MINUTES);  | 
 | 119 | + | 
 | 120 | +      if (response.hasError()) {  | 
 | 121 | +        return null;  | 
 | 122 | +      }  | 
 | 123 | +      return instancesClient.get(projectId, zone, instanceName);  | 
 | 124 | +    }  | 
 | 125 | +  }  | 
 | 126 | +}  | 
 | 127 | +// [END compute_consume_single_project_reservation]  | 
0 commit comments