in compute/cloud-client/src/main/java/compute/custommachinetype/UpdateMemory.java [53:125]
public static void modifyInstanceWithExtendedMemory(
String project, String zone, String instanceName, int newMemory)
throws IOException, ExecutionException, InterruptedException, TimeoutException {
// Initialize client that will be used to send requests. This client only needs to be created
// once, and can be reused for multiple requests. After completing all of your requests, call
// the `instancesClient.close()` method on the client to safely
// clean up any remaining background resources.
try (InstancesClient instancesClient = InstancesClient.create()) {
// Create the get instance request object.
GetInstanceRequest getInstanceRequest = GetInstanceRequest.newBuilder()
.setProject(project)
.setZone(zone)
.setInstance(instanceName)
.build();
Instance instance = instancesClient.get(getInstanceRequest);
// Check the machine type.
if (!(instance.getMachineType().contains("machineTypes/n1-")
|| instance.getMachineType().contains("machineTypes/n2-")
|| instance.getMachineType().contains("machineTypes/n2d-"))) {
System.out.println("extra memory is available only for N1, N2 and N2D CPUs");
return;
}
// Make sure that the machine is turned off.
if (!(instance.getStatus().equals(Status.TERMINATED.toString())
|| instance.getStatus().equals(Status.STOPPED.toString()))) {
StopInstanceRequest stopInstanceRequest = StopInstanceRequest.newBuilder()
.setProject(project)
.setZone(zone)
.setInstance(instanceName)
.build();
OperationFuture<Operation, Operation> operation = instancesClient.stopAsync(
stopInstanceRequest);
Operation response = operation.get(3, TimeUnit.MINUTES);
if (response.hasError()) {
System.out.printf("Unable to stop instance %s", response.getError());
return;
}
}
// Modify the machine definition. Note that extended memory
// is available only for N1, N2 and N2D CPUs.
String machineType = instance.getMachineType();
String start = machineType.substring(0, machineType.lastIndexOf("-"));
// Create the machine type instance request object.
SetMachineTypeInstanceRequest setMachineTypeInstanceRequest =
SetMachineTypeInstanceRequest.newBuilder()
.setProject(project)
.setZone(zone)
.setInstance(instanceName)
.setInstancesSetMachineTypeRequestResource(InstancesSetMachineTypeRequest.newBuilder()
.setMachineType(String.format("%s-%d-ext", start, newMemory))
.build())
.build();
// Invoke the API with the request object and wait for the operation to complete.
Operation response = instancesClient.setMachineTypeAsync(setMachineTypeInstanceRequest)
.get(3, TimeUnit.MINUTES);
// Check for errors.
if (response.hasError()) {
System.out.printf("Unable to update instance %s", response.getError());
return;
}
System.out.println("Instance updated!");
}
}