Я пытаюсь создать экземпляр, используя клиентскую библиотеку Cloud API для Java. Я пробежался по различным классам Builder, используя кнопку «Эквивалентный REST» на консоли, чтобы увидеть, какие элементы мне не хватает, но теперь вызов insertInstance()
возвращает исключение UnavailableException. Проверка в консоли, я вижу, ничего не было создано. Кто может помочь мне найти то, что я сделал не так? Все URL-адреса кажутся правильными: когда их нет, я получаю полезное исключение с подробными ошибками.
Константа SETUP_NO_BOT
- это текст моего установочного скрипта, который создает пользователя, копирует файлы из корзины, и тому подобное. Это не должно быть проблемой, потому что тогда я ожидал бы работающую ВМ с ошибками в журналах запуска.
Все примеры, которые я мог бы найти, использовали либо старые пакеты com.google.api.services
, либо пакеты com.google.cloud.compute.deprecated
, и ни один из них не использовал сопоставимую структуру классов.
Если я использую тот же код с ошибкой в URL-адресах (теперь генерируемых вызовами getUrl()
), я получаю приятное сообщение об ошибке. Эта версия последовательно возвращает 503.
private Instance createInstance() {
logger.debug("createInstance(): Creating boot disk based on \"{}\".", getBaseImage());
AttachedDiskInitializeParams diskParams;
if (ifSet(getBaseImageProject())) {
diskParams = AttachedDiskInitializeParams.newBuilder()
.setSourceImage(getUrl(getBaseImageProject(), "images", getBaseImage()))
.setDiskSizeGb("10")
.setDiskType(getUrl(context, "diskTypes", "pd-standard"))
.build();
}
else {
diskParams = AttachedDiskInitializeParams.newBuilder()
.setSourceImage(getUrl("images", getBaseImage()))
.setDiskSizeGb("10")
.setDiskType(getUrl(context, "diskTypes", "pd-standard"))
.build();
}
AttachedDisk disk = AttachedDisk.newBuilder()
.setType("PERSISTENT")
.setBoot(true)
.setMode("READ_WRITE")
.setAutoDelete(true)
.setDeviceName(getName())
.setInitializeParams(diskParams)
.build();
logger.debug("createInstance(): Creating network interface to network \"{}\".", getNetwork());
AccessConfig accessConfig = AccessConfig.newBuilder()
.setName("External NAT")
.setType("ONE_TO_ONE_NAT")
.setNetworkTier("PREMIUM")
.build();
NetworkInterface netIntf = NetworkInterface.newBuilder()
.setNetwork(getUrl(context, "networks", getNetwork()))
.setSubnetwork(getRegionalUrl(context, "subnetworks", "default"))
.addAccessConfigs(accessConfig)
.build();
logger.debug("createInstane(): Creating startup script metadata.");
Items metadataItems = Items.newBuilder()
.setKey("startup-script")
.setValue(SETUP_NO_BOT)
.build();
Metadata metadata = Metadata.newBuilder()
.addItems(metadataItems)
.build();
logger.debug("createInstance(): Create the instance...");
Instance inst = Instance.newBuilder()
.setName(getName())
.setZone(getUrl(context, "zones", context.getZone()))
.setMachineType(getZonalUrl(context, "machineTypes", getMachineType()))
.addDisks(disk)
.setCanIpForward(false)
.addNetworkInterfaces(netIntf)
.setMetadata(metadata)
.build();
return gceUtil.createInstance(inst) ? gceUtil.getInstance(getName()) : null;
}
createInstance очень прост:
/**
* Create an {@link Instance}.
*/
public boolean createInstance(Instance instance) {
logger.debug("createInstance(): project = \"{}\", zone = \"{}\".", getProjectName(), getZoneName());
Operation response = instClient.insertInstance(ProjectZoneName.of(getProjectName(), getZoneName()), instance);
return isHttp2xx(response);
}