适用于Java的Google Cloud Client库:insertInstance()导致UnavailableException

时间:2019-04-30 10:39:07

标签: java api google-cloud-sdk

我正在尝试使用Cloud API Client Library for Java创建实例。我已经通过不同的Builder类进行了工作,使用控制台中的“等效REST”按钮查看我可能缺少的项目,但是现在对insertInstance()的调用返回了UnavailableException。在控制台中检查,我什么也没创建。谁能帮助我找出我做错了什么?所有网址似乎都是正确的:如果网址不正确,我会得到一个有用的例外,其中包含详细的错误。

SETUP_NO_BOT常量是我的安装脚本的文本,该脚本创建一个用户,从存储桶中复制文件之类的东西。但是,那不应该是问题,因为那样我会期望运行中的VM的启动日志中有错误。

可以找到的所有示例都使用了较旧的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);
    }

0 个答案:

没有答案