in compute/cloud-client/src/main/java/compute/custommachinetype/CreateWithHelper.java [236:304]
public static String customMachineTypeUri(String zone, String cpuSeries, int coreCount,
int memory) {
if (!Arrays.asList(CpuSeries.E2.cpuSeries, CpuSeries.N1.cpuSeries, CpuSeries.N2.cpuSeries,
CpuSeries.N2D.cpuSeries).contains(cpuSeries)) {
throw new Error(String.format("Incorrect cpu type: %s", cpuSeries));
}
TypeLimits typeLimit = Objects.requireNonNull(
typeLimitsMap.get(CpuSeries.get(cpuSeries).name())).typeLimits;
// Perform the following checks to verify if the requested parameters are allowed.
// Find more information about limitations of custom machine types at:
// https://cloud.google.com/compute/docs/general-purpose-machines#custom_machine_types
// 1. Check the number of cores and if the coreCount is present in allowedCores.
if (typeLimit.allowedCores.length > 0 && Arrays.stream(typeLimit.allowedCores)
.noneMatch(x -> x == coreCount)) {
throw new Error(String.format(
"Invalid number of cores requested. "
+ "Number of cores requested for CPU %s should be one of: %s",
cpuSeries,
Arrays.toString(typeLimit.allowedCores)));
}
// 2. Memory must be a multiple of 256 MB
if (memory % 256 != 0) {
throw new Error("Requested memory must be a multiple of 256 MB");
}
// 3. Check if the requested memory isn't too little
if (memory < coreCount * typeLimit.minMemPerCore) {
throw new Error(
String.format("Requested memory is too low. Minimum memory for %s is %s MB per core",
cpuSeries, typeLimit.minMemPerCore));
}
// 4. Check if the requested memory isn't too much
if (memory > coreCount * typeLimit.maxMemPerCore && !typeLimit.allowExtraMemory) {
throw new Error(String.format(
"Requested memory is too large.. Maximum memory allowed for %s is %s MB per core",
cpuSeries, typeLimit.extraMemoryLimit));
}
// 5. Check if the requested memory isn't too large
if (memory > typeLimit.extraMemoryLimit && typeLimit.allowExtraMemory) {
throw new Error(
String.format("Requested memory is too large.. Maximum memory allowed for %s is %s MB",
cpuSeries, typeLimit.extraMemoryLimit));
}
// Check if the CPU Series is E2 and return the custom machine type in the form of a string
// acceptable by Compute Engine API.
if (Arrays.asList(CpuSeries.E2_SMALL.cpuSeries, CpuSeries.E2_MICRO.cpuSeries,
CpuSeries.E2_MEDIUM.cpuSeries).contains(cpuSeries)) {
return String.format("zones/%s/machineTypes/%s-%s", zone, cpuSeries, memory);
}
// Check if extended memory was requested and return the extended custom machine type
// in the form of a string acceptable by Compute Engine API.
if (memory > coreCount * typeLimit.maxMemPerCore) {
return String.format("zones/%s/machineTypes/%s-%s-%s-ext", zone, cpuSeries, coreCount,
memory);
}
// Return the custom machine type in the form of a standard string
// acceptable by Compute Engine API.
return String.format("zones/%s/machineTypes/%s-%s-%s", zone, cpuSeries, coreCount, memory);
}