Files
cozystack/packages/apps/opensearch/README.md
T
Aleksei Sviridkin 5af5962edf feat(apps): mark stateful-app storageClass fields as immutable
Annotate storageClass as immutable across every stateful app whose
chart exposes one — clickhouse, foundationdb, harbor, http-cache,
kafka (Kafka + ZooKeeper), kubernetes (top-level only), mariadb,
mongodb, nats, openbao, opensearch, postgres, qdrant, rabbitmq,
redis, vm-disk. Without coverage across the catalogue the UI would
render storageClass read-only on some apps and editable on others —
a worse mental model than uniform behaviour.

The annotation lands at the schema layer (CEL XValidation rule
'self == oldSelf' on values.schema.json / types.go / embedded
openAPISchema in cozyrds/<app>.yaml). The cozystack aggregated
apiserver does not yet evaluate CEL on application-backed resources;
that is tracked at cozystack/cozystack#2657. The UI
(cozystack/cozystack-ui#6) consumes the marker today.

The PVC-pinning argument is identical for every chart: Kubernetes
fixes a PVC's storageClassName at creation time, so editing this
field on an existing resource never migrated data. The schema
annotation makes that contract explicit.

kubernetes.nodeGroups[name].storageClass is intentionally NOT
annotated: the field is optional and undefaulted, so a strict
'self == oldSelf' rule would block any future attempt to set it on
an existing node group. A richer ratcheting form is needed there —
see docs/storage-immutability.md.

A refactor in pkg/registry/apps/application/rest.go extracts the
inline schema-build path into buildSpecSchema so it can be
unit-tested. Three regression tests in rest_spec_schema_test.go pin
the contract that x-kubernetes-validations survives the
v1->internal->structural conversion (loaded from the actual MariaDB
ApplicationDefinition fixture on disk, not a hand-edited mock).

Each per-app README gains a one-line blockquote pointing to a new
docs/storage-immutability.md that explains the contract and which
consumers enforce it today.

Requires cozystack/cozyvalues-gen with @immutable support — bump the
pre-commit pin in .github/workflows/pre-commit.yml once the release
exists.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
2026-05-26 23:51:11 +03:00

5.0 KiB

Managed OpenSearch Service

storageClass is annotated as immutable in the chart schema — see docs/storage-immutability.md for the contract and which consumers enforce it.

Parameters

Common parameters

Name Description Type Value
replicas Number of OpenSearch nodes in the cluster. int 3
resources Explicit CPU and memory configuration for each OpenSearch node. When omitted, the preset defined in resourcesPreset is applied. object {}
resources.cpu CPU available to each node. quantity ""
resources.memory Memory (RAM) available to each node. quantity ""
resourcesPreset Default sizing preset used when resources is omitted. OpenSearch requires minimum 2Gi memory. string c1.medium
size Persistent Volume Claim size available for application data. quantity 10Gi
storageClass StorageClass used to store the data. string ""
external Enable external access from outside the cluster. bool false
topologySpreadPolicy How strictly to enforce pod distribution across nodes and zones. string soft
version OpenSearch major version to deploy. string v2

Image configuration

Name Description Type Value
images Container images used by the operator. object {}
images.opensearch OpenSearch image. string ""

Node roles configuration

Name Description Type Value
nodeRoles Node roles configuration. object {}
nodeRoles.master Enable cluster_manager role. bool true
nodeRoles.data Enable data role. bool true
nodeRoles.ingest Enable ingest role. bool true
nodeRoles.ml Enable machine learning role. bool false

Users configuration

Name Description Type Value
users Custom OpenSearch users configuration map. map[string]object {}
users[name].password Password for the user (auto-generated if omitted). string ""
users[name].roles List of OpenSearch roles. []string []

OpenSearch Dashboards configuration

Name Description Type Value
dashboards OpenSearch Dashboards configuration. object {}
dashboards.enabled Enable OpenSearch Dashboards deployment. bool false
dashboards.replicas Number of Dashboards replicas. int 1
dashboards.resources Explicit CPU and memory configuration for Dashboards. object {}
dashboards.resources.cpu CPU available to each node. quantity ""
dashboards.resources.memory Memory (RAM) available to each node. quantity ""
dashboards.resourcesPreset Default sizing preset for Dashboards. string c1.small