Launch an instance.
curl --request POST \ --url https://stratum.example.com/v1/projects/example/compute/instances \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "displayName": "example", "description": "example", "instanceType": "example", "vcpus": 1, "memoryBytes": 1, "imageId": "example", "availabilityZone": "example", "rootVolumeId": "example", "rootVolumeSizeBytes": 1, "rootVolumeName": "example", "rootStorageClass": "example", "rootPoolId": "example", "subnetIds": [ "example" ], "noNetwork": false, "securityGroupIds": [ "example" ], "floatingIPPool": "example", "keyPairName": "example", "placementGroupName": "example", "iamInstanceProfileId": "example", "userData": "example", "tags": { "additionalProperty": "example" }, "stopProtection": true, "terminationProtection": true, "autostart": true, "desiredState": "running", "agentEnabled": true, "metadataOptions": { "httpEndpoint": "enabled", "httpTokens": "optional", "httpPutResponseHopLimit": 1, "instanceMetadataTags": "enabled" }, "blockDeviceMappings": [ { "deviceIndex": 1, "sizeBytes": 1, "deleteOnTermination": true } ] }'Async — returns 202 with the new instance in state=creating.
Poll GET /v1/projects/{projectId}/compute/instances/{id}
until state=running. The hypervisor-driver dispatch is owned
by the lifecycle worker; this endpoint never blocks on the
driver.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”Launch a VM. The launch shape is XOR’d: pass either
instanceType (a catalog entry name) OR both vcpus +
memoryBytes for an custom-shape launch. Passing both
or neither is rejected with INVALID_INPUT.
object
Per-project unique customer name.
Catalog name (e.g. m1.large); must be in state=active.
Optional when vcpus + memoryBytes are both set (
custom-shape launch). Either this OR the custom pair must
be provided.
custom-shape vCPU count. Required when
instanceType is empty; ignored when instanceType is
set. At v1 custom shapes default to amd64 + the install’s
configured hypervisor driver; expands
this surface at 2.x.
custom-shape memory in bytes (minimum 1 MiB).
Required when instanceType is empty; ignored when set.
Defaults to the install’s single AZ at v1 per master-plan D10.
Pre-provisioned root volume ID. Optional — when omitted + the VolumeProvisioner SPI is wired (production default), the compute service auto-provisions the root volume from the image catalog.
Size override for the auto-provisioned root volume. Ignored
when rootVolumeId is set. Defaults to the image’s size
when omitted.
Display name for the auto-provisioned root volume, so a
launch can name its disk instead of accepting the generated default
(“rootVolumeId
is set: a reused volume keeps its own name, exactly as
rootVolumeSizeBytes, rootStorageClass and rootPoolId are ignored
in that case.
Sets the volume’s displayName only. Its name slug stays
root-<instanceId> and is NOT configurable: keyed that slug to
the instance id precisely because instance names are unique only among
LIVE instances, so a terraform apply that forces replacement raced its
predecessor’s volume and failed intermittently with “name already
taken”. A caller-supplied slug would reintroduce that.
Storage class (by name) for the auto-provisioned root volume.
Ignored when rootVolumeId is set. Defaults to the image’s own
class. Another class must be one of the image’s
launchableStorageClasses, or the launch is refused with 409
IMAGE_POOL_MISMATCH.
operator placement OVERRIDE (advanced): an
explicit storage pool (pool-…) to provision the root volume from.
Pins the instance to the pool’s owner node, bypassing storage-tier
scheduling. Operator-facing; omit for the normal tier/class-based
automatic placement. Ignored when rootVolumeId is set; fail-closed
(an unknown or full pool fails the launch).
Subnet(s) to attach NICs to. v1 only uses the first entry (primary NIC); 2.x multi-NIC launches consume the rest. When supplied + the NICProvisioner SPI is wired, the compute service auto-creates the NIC + attaches it.
Omitted, the instance lands in the project’s default subnet
(default-<az> of its default VPC). A project with none refuses
the launch with 400 NO_DEFAULT_SUBNET (AWS VPCIdNotSpecified);
one whose default VPC is still being built answers
503 DEFAULT_VPC_CREATING with Retry-After. Neither launches an
instance without a network — that takes noNetwork: true.
Launch the instance with no network interface at all.
The only way to get one: without it, a launch that names no subnet
uses the project’s default subnet or is refused. Cannot be combined
with subnetIds, securityGroupIds or floatingIPPool
(400 INVALID_INPUT).
Security groups bound to the auto-provisioned primary NIC.
Ignored when subnetIds is empty.
When set, the compute service auto-allocates a floating IP from this region’s pool + associates it with the primary NIC. Ignored when the instance has no NIC. Released on terminate.
It is a REGION selector, not a pool name: "default" for the
instance’s own region, an explicit region name for a multi-region
install, or omit it for no public IP. Anything else is
422 REGION_UNKNOWN naming what is accepted — it used to reach the
store and come back 500 INTERNAL_ERROR, which reads as the
platform breaking rather than a typo. 422 rather than 400
because the body is well formed and references something that does
not exist, which is ’s own example for the code, and it is
what the meta FIP pool create answers for the same condition.
Optional key pair (must belong to the same project).
Launch into a placement group. The group must belong to this project.
Membership is declared HERE and is immutable for the instance’s life — there is no operation that moves an instance between groups, because joining one after placement either violates the rule immediately or triggers a migration nobody asked for.
A strict spread that cannot be satisfied fails the launch with
409 PLACEMENT_GROUP_AT_CAPACITY, naming the group, the level
and how many hosts were available. That ceiling is the cluster’s
current size at the level, not a fixed quota: adding a node
raises it.
Attach an instance profile at launch. The
profile must exist, be active, and belong to this project, and
the caller needs compute:AttachInstanceProfile. Apps in the VM
then mint short-lived credentials for the profile’s service
account via IMDS.
Raw cloud-init user-data bytes. Cap is 64 KiB. The field is JSON-string-encoded, not base64 — pass the bytes verbatim. cloud-init is first-class per the project design decision (unlike Proxmox snippets).
object
See Instance.autostart. Default false.
The power state to converge to after create. Defaults to
running.
stopped still boots the instance first and then stops it: the
hypervisor has no way to define a domain without starting it. What it
buys is expressibility — a volume attachment needs a stopped instance
(hot-plug is 2.0), and before this there was no way to write that in
Terraform at all.
Whether to install the in-VM Stratum agent. Defaults to true.
Set false for an appliance or hardened image that must not run
platform software, or where the operator simply does not want it.
The agent is then omitted from the cloud-init vendor-data entirely,
and the instance reports health: agent_disabled rather than
unhealthy — its absence is the configured intent, so it must not
raise instances-unhealthy for the life of the instance.
Declining the agent gives up what the agent carries: guest posture, the Session Manager, software inventory and in-guest exec. Everything outside the guest — power state, networking, volumes, load-balancer health checks — is unaffected.
To change it later use the enable-agent and disable-agent actions, not an update: they carry the guest side (an install
command to run in the guest, an uninstall sent to the agent) that a
flag on its own could not.
Per-instance AWS-shape IMDS options. Returned on
the Instance and settable at launch (CreateInstanceRequest) or via the
modify-metadata-options action. httpEndpoint is enforced: when
disabled the whole IMDS surface (including the Stratum SSH-CA agent
plane) is off for the instance. httpTokens + httpPutResponseHopLimit
are recorded for AWS parity only — Stratum’s IMDS always requires a
session token (effectively IMDSv2-only), so optional does not relax
that in v1. Omitted fields default to enabled / required / 1.
object
Whether IMDS is reachable for the instance. Default enabled.
IMDSv2 token requirement (recorded; Stratum is always v2). Default required.
Recorded for AWS parity. Default 1.
When enabled the guest can read its own tags at /latest/meta-data/tags/instance/. Default disabled; the image builder enables it on a build instance.
Per-device overrides for a multi-volume image; every data device the image carries is launched (cloned from its snapshot and attached before first boot) whether or not it is named here. 400 for a device the image does not have or a size below the snapshot’s.
A per-device override for one of the data devices a
multi-volume image carries. deviceIndex must be one the image has
(>= 1; device 0 is the root, sized by rootVolumeSizeBytes);
sizeBytes must be at or above the snapshot’s; absent fields keep the
image’s values. Devices not named are launched as the image mapped them.
object
Responses
Section titled “Responses”Accepted; reconciliation in progress.
object
Catalog name (e.g. m1.large); references the instance-type
catalog. Empty for custom-shape launches — read
vcpus + memoryBytes for the effective shape in that case.
Effective vCPU count. Populated for every instance mirrors the catalog entry for catalog launches; carries the operator’s override for custom-shape launches.
Effective memory in bytes. Populated for every instance (catalog or custom).
Empty until the scheduler stamps it.
customer-visible state.
Human-readable detail set when state=error.
aggregated, read-time instance-health roll-up, derived from durable signals (lifecycle state + agent heartbeat recency). healthy: running, agent heartbeating. degraded: running and heartbeating but the host can’t read a fresh domain sample (or vice-versa). unhealthy: running with no agent heartbeat, or state=error. migrating: a cold migration is in flight. unknown: transitional or deliberately-down states where the lifecycle state itself is the signal, and an agent enabled after launch whose install command has not been run yet. agent_disabled: agentEnabled: false, at launch or since, so the agent’s absence is the configured intent, not a fault — distinct from unhealthy precisely so an appliance image or an operator who declined the agent does not read as broken forever. Stable across a control-plane restart (the in-memory session channel is not an input).
Why health reads the way it does. Present only on the
describe path (GET-by-id), and only when health needs explaining;
omitted for a healthy instance.
Read this before acting on health: unhealthy: it is what separates an
agent that never arrived (permanent — rebuild) from one that has merely
gone quiet (often self-resolving), and it carries the first-heartbeat
deadline so a normal launch is not mistaken for a broken one.
object
Machine-readable cause.
agent_pending: running, no heartbeat yet, still inside the
first-heartbeat grace window. health already reads unhealthy (it flips
within ~3 minutes), so this is what distinguishes a perfectly normal
launch from a broken one — see deadline.
agent_never_reported: past the grace window having never reported.
Permanent without intervention; run enable-agent for a new install
command, or disable-agent if the instance is not meant to have an
agent.
agent_gone_quiet: reported at least once and then stopped. The agent was
installed correctly, so this is not a delivery bug; frequently
self-resolving.
agent_disabled: agentEnabled: false, declined at launch or
disabled since. Not a fault — reported rather than omitted so
a reader who expected an agent learns why there is none instead of
hunting a failure that never happened.
agent_enrollment_pending: enable-agent ran and its install command has
not been run in the guest yet. health reads unknown;
nothing has failed.
Human-readable explanation, including what to do about it. Not a stable contract — switch on code.
When the reported condition began — launch (or enrollment, for an agent added later) for an agent that never reported, the last heartbeat for one that has gone quiet.
When a pending agent stops being given the benefit of the doubt. Set only for agent_pending; after this the code becomes agent_never_reported.
Whether the instance is meant to run the in-VM Stratum agent.
Set at create (CreateInstanceRequest.agentEnabled); changed later only
by the enable-agent and disable-agent actions.
False means the agent is not wanted, so health reports
agent_disabled rather than unhealthy and the instance is excluded
from agent-presence reconciliation. Read this before concluding an
instance is broken because it never reported.
enable-agent ran and its install command has not been run
in the guest yet. health reads unknown (reason
agent_enrollment_pending) until it is.
When an enable-agent install command last enrolled the
agent, or, with agentActivation: automatic, when
enable-agent turned it on. Absent for an agent installed at launch.
The first-heartbeat grace window runs from here rather than from
launchedAt.
How the agent is turned on in the guest after launch, fixed
at launch from the image the instance launched from. It changes once
at most: enable-agent with force: true turns
automatic into install-command for good, for a guest whose dormant
package was removed.
automatic: the image ships the agent installed but dormant, with a
timer that follows the agent flag. enable-agent and disable-agent
take effect in the guest within a minute, with nothing to run there,
and disabling keeps the package installed.
install-command: any other image. enable-agent returns a one-time
install command to run in the guest, and disable-agent removes the
agent.
Images created from the instance (create-image, image builder output)
carry the stratum.dev/agent-activation: automatic tag only while it
reads automatic.
In-VM agent liveness, embedded on the instance
describe (GET-by-id) response so a detail view has agent
health without a second round-trip to .../agent-status. Present only on the describe path; omitted on
list and the action responses. An instance whose agent has
never reported carries health: unknown.
object
Derived agent liveness. agent_disabled: the instance’s agentEnabled is false, so no agent is wanted and its silence is not a fault. enrollment_pending: enable-agent ran and its install command has not been run in the guest yet. Exactly the instance fields, so the two never disagree.
When the control plane last received a heartbeat.
The agent’s reported build version.
Result of the agent’s most recent reconcile (“ok” or “error”).
When the agent last completed a reconcile.
True when the root volume was auto-provisioned by CreateInstance and is cleaned up on terminate.
object
Guest device path (e.g. /dev/vdb).
Set when the launch cloned this volume from a multi-volume image’s data device.
The image snapshot this volume was cloned from at launch.
Primary network interface ID. Set by the launch path when SubnetIDs are supplied or the project’s default subnet is resolved.
True when the primary NIC was auto-provisioned by CreateInstance and is cleaned up on terminate.
Floating IP attached to the primary NIC, when one was allocated at launch via floatingIPPool / –public-ip.
True when the primary FIP was auto-allocated by CreateInstance and is released on terminate.
object
The NIC’s primary private IPv4 address within its subnet. Empty until the NIC is scheduled onto a subnet and an address is assigned (e.g. while the instance is still creating).
The subnet this NIC actually landed in, enriched at read time from the network NIC row.
Nothing on the instance reported placement before. A create request naming subnetId instead of the real subnetIds had the field silently dropped, returned 201, and attached the NIC to the default platform network — with no response field distinguishing that from a correctly placed instance.
The VPC the NIC’s subnet belongs to.
AWS-parity alias of primaryPrivateIP.
The instance’s public DNS name,
<instance-id>.compute.<parent> (the AWS PublicDnsName). The install’s
authoritative DNS answers it with primaryPublicIP, and with the
private IP when asked from inside the instance’s own VPC.
Set while that record is published: the instance has a floating IP on
its primary NIC, its VPC has dnsHostnames on, and the install has a
DNS parent domain. Omitted otherwise. The record follows within one
reconciler pass (30 s) of the floating IP being associated or the VPC
setting changing. The same name IMDS serves at
meta-data/public-hostname.
For a name of your own, create an alias record in a hosted zone. An
aliasTarget of type: fip answers the floating IP’s address; one of
type: instance answers the instance’s private IP and publishes a
public.<name> companion for its floating IP. Both follow the address
as it changes.
The placement group this instance was placed by. Absent when it joined none.
It can become absent without the instance changing: deleting a group leaves its members running and drops the reference. That is losing the guarantee, not moving between groups.
Name of the placement group this instance was placed by — what
the tenant declared at launch. Absent when it joined none, and
absent alongside placementGroupId once the group is deleted.
SHA-256 over the user-data bytes, sha256:<hex>.
Reserved for instance profiles (/ 2.x).
Attached instance profile. Apps inside the VM that hit IMDS get short-lived credentials for the profile’s service account. Empty when no profile is attached.
object
When true the controlplane queues a start
lifecycle action against this instance on boot if libvirt
currently has the domain shut off. Default false.
The power state the operator has ASKED for, as distinct from
state, which is what the instance actually is. A leader-gated
reconciler converges the two, so setting this
returns immediately rather than blocking for a guest shutdown.
They are separate fields deliberately: collapsing them would make “someone
stopped this by hand” indistinguishable from “this is meant to be
stopped”. An instance manually stopped while desiredState=running is
started again on the next pass.
Only running and stopped are accepted. starting/stopping are
transitions the worker owns and are never a destination.
True while a stop asked with force: true (a hard stop, the Multi-AZ fence) is in flight; cleared when the instance leaves stopping.
Per-instance AWS-shape IMDS options. Returned on
the Instance and settable at launch (CreateInstanceRequest) or via the
modify-metadata-options action. httpEndpoint is enforced: when
disabled the whole IMDS surface (including the Stratum SSH-CA agent
plane) is off for the instance. httpTokens + httpPutResponseHopLimit
are recorded for AWS parity only — Stratum’s IMDS always requires a
session token (effectively IMDSv2-only), so optional does not relax
that in v1. Omitted fields default to enabled / required / 1.
object
Whether IMDS is reachable for the instance. Default enabled.
IMDSv2 token requirement (recorded; Stratum is always v2). Default required.
Recorded for AWS parity. Default 1.
When enabled the guest can read its own tags at /latest/meta-data/tags/instance/. Default disabled; the image builder enables it on a build instance.
Example
{ "state": "creating", "health": "healthy", "healthReason": { "code": "agent_pending", "message": "the agent has NEVER checked in, 4 days after it was installed — it was not installed, or it cannot reach IMDS. This will NOT resolve on its own and no retry is scheduled: run enable-agent for a new install command and run it in the guest, or disable the agent if the instance is not meant to have one." }, "agentActivation": "automatic", "agentStatus": { "instanceId": "i-A8c2D4e6F", "health": "healthy" }, "networkInterfaces": [ { "privateIp": "172.31.0.42", "subnetId": "subnet-6arpymeu32", "vpcId": "vpc-puhtjesijq" } ], "desiredState": "running", "metadataOptions": { "httpEndpoint": "enabled", "httpTokens": "optional", "instanceMetadataTags": "enabled" }}INVALID_INPUT — a malformed or contradictory request (e.g.
noNetwork together with subnetIds).
NO_DEFAULT_SUBNET — no subnetIds and the project has no
default subnet: it declined its default VPC, deleted it, or
predates it. Pass subnetIds, ask for one with
create-default-vpc, or pass noNetwork: true for an instance
with no network. Before, this launch was accepted and
ran with no NIC.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}NAME_TAKEN — another instance in this project already has this
name. The request is refused before anything is created. An
instance stops holding its name as soon as its termination is
accepted, so a name can be reused straight away: the resources
created with an instance (its volumes and primary network interface)
are named after its ID, not its name, and a predecessor still being
torn down does not hold the name.
IMAGE_POOL_MISMATCH — rootStorageClass cannot hold a clone of
the image: it is on another storage driver, or (lvm-thin)
on a pool the image is not staged in. Nothing is created. details
(ImagePoolMismatchDetails) names the image’s pools, the class asked
for and storageClasses, the classes that can launch it, equal to
the image’s launchableStorageClasses. Omitting
rootStorageClass always can.
NO_STORAGE_CLASS — the launch needs a root volume made for it
(no rootVolumeId, rootPoolId or rootStorageClass) and the
cluster has no active storage class at all. A cluster whose only
data disks were reserved for Ceph has Ceph as its compute storage
and none until Ceph is set up on day 2 and given a default class;
readiness reports it as StorageAwaitsCeph. Nothing is created.
Other conflicts on this route: IMAGE_DISABLED,
INSTANCE_TYPE_NOT_ACTIVE, INVALID_STATE, NO_ELIGIBLE_NODE,
PLACEMENT_GROUP_AT_CAPACITY and CONFLICT.
A 409 on a route that can answer IMAGE_POOL_MISMATCH: a
Problem whose details, for that code, is an ImagePoolMismatchDetails.
The route’s other conflict codes carry no details.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
details of a 409 IMAGE_POOL_MISMATCH problem,
the same on POST /v1/projects/{projectId}/compute/instances and the
image create-volume action: the storage class asked for cannot hold a
clone of the image.
object
The storage driver the image is stored on.
The pools the image’s base lives in.
The storage class asked for, by name.
The driver that class puts volumes on.
The pool that class puts volumes in.
The classes, by name, that can launch the image (equal to the image’s
launchableStorageClasses). Omitting the class always can.
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}REGION_UNKNOWN — a field references something this install does
not have, e.g. a floatingIPPool that is not a region.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}QUOTA_EXCEEDED: the project’s compute.instances.count, compute.vcpus or compute.memory.bytes would pass its limit.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}Retryable, with Retry-After.
DEFAULT_VPC_CREATING — no subnetIds, and the project’s default
VPC is still being built (a new project’s takes a few reconciler
passes). The same request succeeds once it is available.
INSUFFICIENT_CAPACITY — no node has room for the shape right now.
object
The findings of a rejected IAM policy document (custom and resource policies).
One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.
object
The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.
Index of the statement at fault; -1 for the document as a whole.
The offending action, where one is at fault (ACTION_NOT_APPLICABLE).
Field errors, for codes that carry them: each problem at its field
(see FieldError). Documented on the responses that set it, e.g.
approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED.
Absent otherwise.
One field’s problem, the stage-2 installer API’s shape.
field is the field’s path, message what is wrong with it.
object
The field’s path, e.g. links[0].interface, disks[1].confirm,
mgmt.address or role; empty for the whole request.
Structured facts about the refusal, for codes that carry them. The
shape is fixed per code and documented on the response that answers
it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and
IMAGE_IN_USE. Absent for codes that carry none.
object
Example
{ "issues": [ { "code": "ACTION_NOT_APPLICABLE", "action": "compute:CreateVpc" } ]}