Skip to main content
This page is the reference companion to Configure per-deployment migration and Manage and observe per-deployment migration. It documents the configuration settings, cluster failover states, mission and flight states, migration errors and skips, the GraphQL surface, and the permissions for per-deployment migration on Astro Private Cloud (APC) 2.1 and later.

Configuration settings

There is no per-deployment migration feature flag, no separate mutation to enable, and no per-cluster opt-in beyond failoverEnabled. The settings that govern it are the data plane failover settings plus the new region model.

Cluster failover states

The cluster detail page shows a Failover field, which replaces the older binary “Failover Enabled.” Reading it is how you tell whether a cluster can participate in migration: The underlying API fields are Cluster.failoverEnabled (the control-plane-effective state) and Cluster.failoverUpgradeStatus (not_started, in_progress, complete, or null).
Cluster.failoverEnabled starts from what the data plane reports, but the control plane force-downgrades it to false whenever an eligibility check fails. It reflects reality, not intent. If you enabled the Helm value and the field is still false, something in the eligibility check is failing, and the Failover status tells you which.

Failover-readiness shield states

The Deployments list shows a failover-readiness shield next to each Deployment name, on failover-capable clusters only. It uses one outline icon, distinguished by color, plus an exclamation badge for Attention. The API field behind it is Deployment.failoverReadiness.
The shield tracks the one-time failover-upgrade lifecycle, not migrations. A Deployment that is mid-migration keeps a green Ready shield the entire time. Use the Mission Status column, or Deployment.activeMission, to see an in-flight migration.

Mission states

Selecting N Deployments creates N independent missions, one per Deployment. Each moves through the following states:
CLEANUP_PENDING doesn’t occur in per-deployment migration. Migrations always run in controlled mode, so the Scavenger flight (source cleanup) must succeed before the Hyperjump flight is dispatched. Once the Hyperjump succeeds, the source is already cleaned and the mission goes straight to COMPLETED. If the Scavenger fails, the Hyperjump never runs and the mission is FAILED. This state arises only in a forced cluster failover, where the Hyperjump can cut over while source-side cleanup is still deferred or has failed — and even there it isn’t an error.

Flight states

Each flight within a mission has its own state: AWAITING_DP_HEALTH is a wait, not a failure: the circuit breaker parked the flight because the data plane was unreachable. Fix the data plane and it resumes on its own.

Migration errors and skips

migrateDeployments has two failure modes. Whole-mutation errors are about the destination and reject the entire call, so nothing moves. Per-deployment skips pass over one Deployment and let the rest proceed.

Whole-mutation errors

These are evaluated in order, and the first match wins. Because cordon and in-flight-failover are checked before authorization, an unauthorized caller may see a health or cordon error first.

Per-deployment skips

When a Deployment is skipped, the rest of the batch still migrates. Skips are safe to retry: re-issuing migrateDeployments with just the skipped IDs is a normal workflow, because a skipped Deployment was never claimed and nothing is left in a partial state.

Cluster failover skipping a migrating Deployment

The exclusion runs both ways. If a cluster failover starts while one of your migration missions is in flight, the failover silently skips that Deployment rather than aborting, and records it in FailoverRequest.skippedDeployments. Each entry carries the Deployment ID, release name, mission ID, and reason. The skipped list is surfaced on the cluster detail page at reconcile finalization. Those Deployments weren’t failed over — once the migration mission completes, retry them explicitly.

GraphQL surface

Relevant fields

The data plane health signal the migration gate reads is an internal control plane column and isn’t exposed on the Cluster GraphQL type. To confirm it from the API, use failoverTargetClusters, which already filters on it.

Enumerations

Permissions

Migration is a cluster-admin operation. To migrate Deployments you must be a System Admin, or hold cluster.config.update on both the source and the destination cluster. Deployment-level permissions alone aren’t enough. If you lack a cluster-admin role on the destination, the whole call is rejected with DESTINATION_NOT_AUTHORIZED. If you have it on the destination but not on a given Deployment’s source cluster, that Deployment is skipped with SOURCE_CLUSTER_NOT_AUTHORIZED while the rest proceed.

Troubleshooting index