Move Namespace
Moves a namespace and its persistent volumes to target_cluster_id. The controller drains it (refuses new workloads, suspends sandboxes, scales apps to zero, waits up to 15 minutes for running jobs and then cancels them), archives each persistent volume, places the namespace on the target and provisions its runner namespace there, re-seeds each persistent volume from its archive (populated on its first mount on the target; cache and scratch volumes are dropped and rebuilt on use), deletes the source's runner namespace and volumes, and brings apps back to their desired replicas; sandboxes stay suspended until resumed. Progress is Namespace.move. A failure before the volumes are re-seeded rolls back to the source, which still has everything. While a move runs, workload operations in the namespace and UpdateNamespace/DeleteNamespace are refused with FailedPrecondition. With dry_run nothing starts and the response carries the downtime estimate. The target must be a cluster the namespace's owner team may place on (PermissionDenied otherwise, NotFound if not visible) and CONNECTED (FailedPrecondition).
Access: a platform admin, or an admin of the namespace's owner team.
Authorization
BearerAuth A namespace-scoped API key (cpk_…) for machines, or a Xeonr Auth OIDC
token for humans. The key's namespace and role are pinned server-side.
In: header
Header Parameters
Define the version of the Connect protocol
Define the timeout, in ms
Request Body
application/json
1 <= length <= 64^cl-[0-9a-f]{16}$Validate and estimate only; nothing starts. validate:skip a flag
Response Body
application/json
application/json
curl -X POST "https://containers.xeonr.io/containers.api.v1.NamespaceService/MoveNamespace" \ -H "Connect-Protocol-Version: 1" \ -H "Connect-Timeout-Ms: 1000" \ -H "Content-Type: application/json" \ -d '{}'{
"namespace": {
"namespace": "string",
"displayName": "string",
"k8sRunnerNamespace": "string",
"groups": [
{
"oidcGroup": "string",
"role": "ROLE_UNSPECIFIED"
}
],
"defaultLimits": {
"cpuMillis": 0,
"memoryMb": 0,
"ephemeralMb": 0,
"pids": 0
},
"quotaCpuMillis": 0,
"quotaMemoryMb": 0,
"quotaMaxPods": 0,
"quotaStorageMb": 0,
"quotaMaxVolumes": 0,
"internalTargets": [
{
"host": "string",
"port": 1
}
],
"imagePullSecrets": [
"string"
],
"ownerTeam": "string",
"clusterId": "string",
"move": {
"state": "STATE_UNSPECIFIED",
"sourceClusterId": "string",
"targetClusterId": "string",
"startedAt": "2023-01-15T01:30:15.01Z",
"updatedAt": "2023-01-15T01:30:15.01Z",
"finishedAt": "2023-01-15T01:30:15.01Z",
"message": "string",
"rolledBack": true,
"estimatedDowntimeSec": 0,
"volumes": [
{
"volumeId": "string",
"archiveSnapshotId": "string",
"sourceNode": "string",
"sourceState": "VOLUME_STATE_UNSPECIFIED",
"reseeded": true
}
],
"startedBy": "string"
}
}
}{
"code": "not_found",
"message": "string",
"details": [
{
"type": "string",
"value": "string",
"debug": {}
}
]
}List Namespaces POST
Lists the namespaces visible to the caller, ordered by name. `page_size` 0 means 100 and is clamped to 1000; `page_token` is the opaque offset from `next_page_token`. **Access:** any authenticated caller; results are filtered to namespaces the caller can read (all of them for a platform admin).
Revoke API Key POST
Revokes an API key; it is refused within 30 seconds. The key stays in Xeonr Auth's audit trail. Authorisation is checked against the key's own namespace, not anything in the request. `key_id` is the URN ListApiKeys returns; a key id from before keys moved to Xeonr Auth is NotFound. **Access:** admin role in the key's namespace, or a platform admin. Other callers get NotFound.