Skip to content

Update cluster connection API Reference

PATCH
/tenants/{tenant}/registries/{name}/bindings/{binding}
curl --request PATCH \
--url https://api.kupe.cloud/api/v1/tenants/acme/registries/registry/bindings/prod \
--header 'Authorization: <Authorization>' \
--header 'Content-Type: application/json' \
--header 'If-Match: 582020' \
--data '{ "pushNamespaces": [ "ci", "release" ] }'

Replace a cluster connection’s push namespaces (JSON merge-patch semantics: the list sent is the new list; [] removes every push credential). A namespace added gets the push Secret; a namespace left out loses its Secret, and the push credential is replaced, so build jobs in the push namespaces that remain must restart to read the new Secret (while the platform has the registry switched off or the tenant is suspended, the replacement waits until the registry is on and the tenant active again). pushNamespaces is the only field that can change: sending secretName or any other field is a 400.

tenant
required
string

Tenant name

name
required
string

Registry name: always registry

binding
required
string

Cluster connection name: the cluster’s name

If-Match
string

ETag for optimistic locking

The new push namespace list

Media type application/json
object
pushNamespaces

The new list of push namespaces (replaces the old one; [] removes every push credential). Same rules as on create. A namespace added gets the push Secret; one left out loses it.

Array<string>
Example
[
"ci",
"release"
]

Updated cluster connection

Media type application/json
object
cluster
string
createdAt
string
name

Name is the cluster’s name.

string
pushNamespaces

PushNamespaces are the namespaces that hold a push credential (empty: pull only).

Array<string>
registry
string
resourceVersion
string
secretName

SecretName is the push credential Secret’s name in each push namespace.

string
status
object
conditions
Array<object>
object
key
additional properties
message

Message gives detail; once Ready it says that pods running before the connection need a restart to pull.

string
namespaces

Namespaces reports what was delivered into each push namespace. A namespace removed from pushNamespaces stays here until its Secret is withdrawn and the push credential is replaced; while the platform has the registry switched off or the tenant is suspended, the replacement, and with it the entry’s removal, waits until the registry is on and the tenant active again.

Array<object>
object
message

Message gives detail while the namespace is not Ready.

string
name
string
phase
string
Allowed values: Pending Ready Failed
phase

Phase is Ready only when pull works and every push namespace is Ready.

string
Allowed values: Pending Ready Failed
pullUsername

PullUsername is the registry username of the cluster’s pull credential.

string
pushUsername

PushUsername is the registry username of the push credential; empty without push namespaces.

string
rotation
object
appliedAt
string
pending

Pending is true while RequestedAt differs from AppliedAt.

boolean
requestedAt

RequestedAt is the token of the last rotation requested; empty if none ever was.

string
Example
{
"cluster": "prod",
"createdAt": "2026-10-21T10:05:00Z",
"name": "prod",
"pushNamespaces": [
"ci"
],
"registry": "registry",
"resourceVersion": "582020",
"secretName": "kupe-registry-push",
"status": {
"message": "",
"namespaces": [
{
"message": "",
"name": "ci",
"phase": "Pending"
}
],
"phase": "Pending",
"pullUsername": "kupe+acme+pull-prod",
"pushUsername": "kupe+acme+push-prod",
"rotation": {
"appliedAt": "2026-10-21T12:00:00.123456789Z",
"pending": false,
"requestedAt": "2026-10-21T12:00:00.123456789Z"
}
}
}
ETag
string

New resource version

Validation error, or too many push namespaces (codes REGISTRY_PUSH_NAMESPACES_LIMIT, REGISTRY_PUSH_NAMESPACES_SERVICE_LIMIT, field spec.pushNamespaces)

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Missing or invalid authentication

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Admin access required

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Cluster connection not found for this registry, or the registry is switched off and the change adds a namespace (code registries_unavailable)

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

The connection or the registry is being deleted (code terminating), or the connection kept changing while it was being updated

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

ETag mismatch

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}

Rate limit exceeded

Media type application/json
object
code
string
error
string
field
string
message
string
severity
string
Example generated
{
"code": "example",
"error": "example",
"field": "example",
"message": "example",
"severity": "example"
}