Skip to main content
A deployment is described by one body: you create a deployment with it, read the deployment back in the same shape, and change it with it. The body carries schemaVersion: 1, so the schema can evolve without new routes: the endpoints stay /api/clusters and /api/clusters/{name}. The Admin UI and every example on this page use it.

The body

A read adds status: state and ready, node and sentinel counts, endpoints, the TLS certificate’s expiry, pendingChanges (accepted but not applied yet), and unmanagedFields (settings made outside this API, such as with the YAML editor). A read leaves out what is not kept on the deployment itself: config.enterprise and config.server (they live in redis.conf) and backup. An inline security.auth.password reads back as the passwordSecretRef of the Secret it was moved into.

Create, read and change

  • GET /api/clusters?schemaVersion=1 lists deployments as { "schemaVersion": 1, "deployments": [...], "total": N }.
  • PATCH takes a JSON Merge Patch: send only what changes. Objects merge, lists are replaced whole, and null removes a field.
  • PUT takes a whole body. Fields it leaves out are removed, with these exceptions:
    • config.enterprise and config.server: only the settings it names change.
    • version, componentDefinition, and lifecycle’s state and deletionPolicy: these keep their current values, so leaving them out doesn’t upgrade, start a stopped deployment, or drop DoNotTerminate.
    • Labels and annotations that other tools manage. These keep their current values when the body leaves them out. Their key prefix is one of:
      • kubeblocks.io/ or falkordb.cloud/, or a subdomain of one, such as apps.kubeblocks.io/ or keel.falkordb.cloud/.
      • app.kubernetes.io/, exactly.
      • A domain in the Admin Server’s ADMIN_SERVER_PRESERVED_LABEL_PREFIXES, or a subdomain of one.
      Legacy falkordb.io/ and falkordb.com/ keys are moved to falkordb.cloud/ with the same name, and kept there.
    To remove a tool-managed label or annotation, PATCH it to null by name, for example {"schemaVersion": 1, "metadata": {"labels": {"keel.falkordb.cloud/cell": null}}}. Setting the whole map to null ("labels": null) removes only the other labels; the tool-managed ones stay. Reserved annotations can’t be removed at all, even by name: those under kubeblocks.io/ or apps.kubeblocks.io/, and the Admin Server’s own TLS and pending-settings annotations. A null for one of them is ignored. A PUT of what a read returns changes nothing. That includes a Sentinel left on an older addon release: to bring it to the data nodes’ definition, PATCH spec.componentDefinition. Don’t send backup or an inline password again: both are set at create time only.
  • If-Match takes the metadata.generation you read. When the deployment changed since, the update is refused with 412 instead of overwriting the other change.
  • ?dryRun=true returns what the update would do without doing it.
An update answers with { "schemaVersion": 1, "deployment": {...}, "plan": {...} }. It answers 202 when part of the change is applied after the write: volume growth, and config.enterprise or config.server settings. Those show in status.pendingChanges until they are applied.

Rules an update follows

  • Volumes only grow, and their storage class can’t change.
  • A deployment can’t move between sharded and not sharded, or gain or lose sentinels. A primary with replicas and no sentinels can become a single node and back.
  • The FalkorDB version can’t go back.
  • config.enterprise and config.server change only while the deployment is running. See how settings are applied for which ones restart the pods, and how to reset or empty one.
  • Settings and volume growth are applied after the write, and only while the deployment is running: otherwise they answer 409.
  • While earlier settings or volume growth still wait to be applied, another update that queues some answers 409. Retry once they are applied.
  • While a Reconfiguring operation runs, an update that sets one of its settings to another value answers 409; the same value is taken as already on its way.
  • A request that stops the deployment can’t also change settings or grow volumes: that answers 422.
  • config.server can’t set the directives the FalkorDB addon manages: the listening port and TLS, accounts (requirepass, user, …), modules, the data directory and file names, replication and cluster wiring, announced addresses, logfile, pidfile, and the switches that open MODULE and DEBUG.
  • GET /api/clusters/{name}/config shows credentials set as enterprise settings only to users who may read the deployment’s credentials (clusters:update). Anyone else sees (redacted).
  • A field set outside this API is not overwritten: the update answers 422 naming it. Add ?overwriteUnmanaged=true to replace it.

How settings are applied

Each setting falls into one of three categories: To undo a change:
  • An enterprise setting set to null goes back to its default. When the default is empty, as with the LDAP settings, null or "" empties it, so setting falkordbe.ldap_servers to null turns LDAP authentication off. An empty value for any other enterprise setting answers 422.
  • A config.graph setting set to null is removed, and the server uses its default.
  • A config.server directive has no default the API knows, so null answers 422: set the value you want. "" empties a directive that is applied on the fly. A directive that needs a restart can’t be emptied, because a bad empty value could keep the pods from starting.
  • A whole section (config.server: null) can’t be removed.

Errors

A 400 or 422 lists each problem:

Deprecated requests

These requests still work. Their answers carry a Deprecation header (RFC 9745) and a Link to this section, and the Admin Server logs the callers that still use them. Move to the replacement. Restart, switchover, rebalancing a sharded deployment (/ops/rebalance), moving its slots (/ops/reshard), reconfiguring Sentinel (/ops/configure with componentName: falkordb-sent), and reading or deleting OpsRequests are not deprecated: they have no counterpart in the deployment body.
Reading a deployment without ?schemaVersion=1 still returns the earlier shape and is not deprecated.