Skip to content

feat(cassandra): move the Cassandra stack off Bitnami to official Apache Cassandra - #328

Merged
nvjmcnamee merged 19 commits into
mainfrom
feat/cassandra-remove-bitnami
Jul 22, 2026
Merged

feat(cassandra): move the Cassandra stack off Bitnami to official Apache Cassandra#328
nvjmcnamee merged 19 commits into
mainfrom
feat/cassandra-remove-bitnami

Conversation

@nvjmcnamee

@nvjmcnamee nvjmcnamee commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

TL;DR

Moves the NVCF Cassandra stack off the archived Bitnami base and Helm subchart onto official Apache Cassandra 5.0.8 and an in-house Helm chart. Bitnami withdrew its public catalog and the migration image's bitnami/cassandra:5.0.6 base no longer resolves (#190); this removes the last Bitnami runtime dependency in Cassandra with equivalent behavior and a documented migration path.

Additional Details

  • Runtime image - new infra/cassandra built on cassandra:5.0.8, layering the Prometheus exporter agent and a checksum-verified yq. The exporter jar is not redistributed (only files/.gitkeep), so a bare build runs Cassandra without metrics.
  • Helm chart - replaces the bitnamicharts/cassandra subchart with an in-house StatefulSet (StatefulSet, headless/client Services, cassandra.yaml overlay). Defaults storage_compatibility_mode: NONE for streaming compatibility with the existing fleet, and adds cluster.extraSeeds for datacenter expansion. The resource-preset map is derived from the Bitnami common chart (Apache-2.0, Broadcom) and attributed inline; NOTICE stays minimal.
  • Migration image - rebased off bitnami/cassandra:5.0.6 onto cassandra:5.0.8, adding ca-certificates (the official Debian base ships none, which broke the kubectl HTTPS fetch).
  • Docs - 0.6.1 release notes and a 0.6.0-to-0.6.1 upgrade guide covering the three migration methods (datacenter expansion, in-place volume adoption, backup and restore) and their requirements (storage_compatibility_mode: NONE, token-allocation fallback, fsGroup: 999).
  • Testing note - this change is a Helm chart, a container image, docs, and operator shell scripts; there is no unit-test harness that applies. It is validated by helm lint / helm template, sh -n on the scripts (plus a filesystem test of the relocation logic), and the end-to-end k3d runs listed under For QA.

Review updates

Changes made in response to CodeRabbit and maintainer review, all validated on k3d:

  • Readiness probe scoped to the pod's own node - nodetool status | grep '^UN' matched any Up/Normal member, so a pod could report Ready before its own node joined. Now scoped to the pod's POD_IP.
  • Migration script preflights hardened - migrate-from-bitnami.sh rejects any --release other than cassandra (fixed resource names), renders the chart and refuses unless the data mount resolves to subPath: data before any destructive step, and requires a numeric pre-migration probe count.
  • Pod scheduling passthrough - nodeSelector, tolerations, and affinity exposed on the StatefulSet (empty by default) for parity with the previous chart.
  • Bootstrap-job toggles - cassandra.hooks.initializeCluster.enabled and .migrations.enabled (default true) gate the two post-install jobs, so a datacenter expansion can skip schema-init and migrations on the new datacenter while the pods still start from the pre-install ConfigMap/RBAC. The datacenter-expansion doc points at this mechanism.
  • In-place adoption caveat - release notes clarify the method is validated for the standard NVCF configuration and that a customized cassandra.yaml must be verified.

Follow-ups (not in this PR):

For the Reviewer

  • Start with infra/cassandra/Dockerfile, deploy/helm/cassandra/helm/templates/statefulset.yaml, and _helpers.tpl (the in-house chart replacing the subchart).
  • Licensing: _helpers.tpl carries an inline Broadcom attribution for the derived preset map, and NOTICE is intentionally minimal - reviewed and approved by the OSRB.
  • The operator migration scripts under deploy/helm/cassandra/upgrade/ touch data volumes; they have been through three CodeRabbit passes.

For QA

Validated end-to-end on a local k3d cluster against the built images and chart:

  • Fresh install: node UN, auth enforced, init + migrations complete (all app keyspaces), exporter serving 123 metric families.
  • In-place volume adoption: the official image adopts a Bitnami-written volume via subPath: data, reads the data, fsGroup: 999 resolving UID-1001 to UID-999 ownership.
  • Datacenter expansion: an official 5.0.8 datacenter joins a Bitnami 5.0.5 cluster and nodetool rebuild streams the data.
  • helm lint, helm template, and sh -n on the scripts.

Review-update validation (k3d):

  • Readiness probe: two-node install, both reach UN/Ready; the scoped probe matches only the local node's line, not any UN member.
  • Bootstrap-job toggles: enabled fresh install runs init + migrations to completion; helm upgrade re-runs them with migrations idempotent (golang-migrate reports "no change" for every keyspace); disabled fresh install brings the pod up with no init/migration jobs.

Is QA needed? Yes - validate the chosen migration method in staging before production.

Issues

Closes #317
Closes #190

Checklist

  • I am familiar with the Contributing Guidelines.
  • I have signed off my commits for Developer Certificate of Origin (DCO) compliance.
  • New or existing tests cover these changes.
  • The documentation is up to date with these changes.

Summary by CodeRabbit

  • New Features
    • Introduced an in-house Cassandra Helm deployment using Apache Cassandra 5.0.8.
    • Added Cassandra services (client + headless), config override support, and resource preset sizing with automatic heap sizing.
    • Strengthened initialization and enabled safer cluster migrations from Bitnami-based setups.
  • Documentation
    • Added/updated Cassandra migration and upgrade guides, including 0.6.1 release notes and upgrade procedures.
  • Bug Fixes
    • Improved superuser password initialization to reduce credential exposure and ensure correct role password setup.

Introduce infra/cassandra, the NVCF Cassandra runtime image built on the
official Apache cassandra:5.0.8 image, replacing the archived bitnamilegacy
base. Layers a pinned, checksum-verified yq (used by the chart's config init
container) and an NCP rack-from-pod cassandra-env.sh.

The Prometheus exporter agent jar is not redistributed: files/ ships only
.gitkeep and the Dockerfile defaults EXPORTER_JAR to that placeholder, so a
bare build runs Cassandra with no metrics agent. Builds that need metrics
pass EXPORTER_JAR and EXPORTER_JAVAAGENT together.

Verified locally: OSS-mode docker build succeeds (yq checksum verified).

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…lSet

Drop the bitnamicharts/cassandra subchart dependency and deploy Cassandra
directly from an in-house StatefulSet chart targeting the official-base image.
Removes Chart.lock and the vendored subchart.

Included:
- StatefulSet, headless/client services, and a cassandra.yaml overlay
  ConfigMap merged by the image's yq at init time.
- storage_compatibility_mode: NONE by default, to keep official-image nodes
  stream-compatible with the existing fleet.
- cluster.extraSeeds for datacenter-expansion.
- Resource-preset map derived from the Bitnami common chart
  (common.resources.preset, Copyright Broadcom Inc., Apache-2.0). Provenance is
  marked inline at the helper per OSS review guidance; NOTICE is kept minimal
  because the upstream chart ships no NOTICE file (per the ASF licensing-howto:
  do not add to NOTICE what is not legally required). The stack default xlarge
  stays 3Gi request / 6Gi limit.

Validated: helm lint passes; template renders presets (xlarge 3Gi/6Gi),
storage_compatibility_mode, and seeds correctly.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…e guide

Document the 0.6.1 maintenance release that moves Cassandra off the archived
Bitnami runtime to the official Apache Cassandra 5.0.8 image and the in-house
Helm chart:
- 0.6.1.md release notes (what changed, upgrade pointer).
- 0.6.0-to-0.6.1-upgrade.md: fresh-install note plus the three migration methods
  (datacenter expansion, in-place volume adoption, backup and restore) with
  trade-offs, and the datacenter-expansion requirements
  (storage_compatibility_mode NONE, token-allocation fallback).
- index and Fern nav entries.

img/whitespace lint clean and nav paths resolve. fern check could not run
locally (node 16 crash, reproduces on clean main); it runs in CI on a
supported node.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…ndra

Swap the schema-migration image off the archived bitnami/cassandra:5.0.6 base
onto the official cassandra:5.0.8 image, matching the runtime image and the
in-house chart. The image still installs kubectl and the golang-migrate binary
and runs execute_sqls.sh; the official Debian-based image provides apt and
cqlsh, so no other change is needed. README base reference updated.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…fficial base

The official Debian-based cassandra image does not ship a CA bundle, so the
kubectl download over HTTPS fails with `curl: (77) error setting certificate
file: /etc/ssl/certs/ca-certificates.crt`. The archived Bitnami base bundled
it. Add ca-certificates to the apt install so the image builds on the official
base.

Verified: the migration image builds from the official cassandra:5.0.8 base.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
… cluster name

Local validation of the in-place volume adoption path surfaced two operator
requirements the guide did not state:
- podSecurityContext.fsGroup: 999. Bitnami wrote the data as UID 1001; the
  official image runs as UID 999 and cannot read the adopted files without
  re-grouping the volume at mount.
- cluster.name must match the existing cluster, or Cassandra refuses to start
  on the adopted data.

Both were confirmed on k3d: the official image came up on a Bitnami-written
volume and read the data with these set.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
Local CodeRabbit review flagged several major items in the chart and the
operator helper scripts. Fixed here (the two license-header-tooling findings
are deferred for separate review):

- statefulset.yaml: use the cassandra.imagePullSecrets helper instead of a
  raw toYaml, so simplified string-form pull secrets render valid YAML.
- migrate-from-bitnami.sh: fail fast when only one of --probe-keyspace /
  --probe-table is set, and verify all ring members are UN post-upgrade
  rather than just one.
- relocate-bitnami-layout.sh: preflight every destination for collisions
  before moving any data, so a collision aborts with no partial move.
- cassandra-env.sh: derive the rack from the pod ordinal mod 3 so the
  three-rack rotation holds past nine replicas; non-numeric hostnames fall
  back to r1.

Verified: helm lint and render (string and empty pull-secret forms), sh -n on
the scripts, and the rack rotation across ordinals.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
apply-license-header.sh and check-license-header.sh (and their
.license-header.txt template) were byte-identical copies of the NATS chart's
scripts, not referenced by the Dockerfile, CI, or anything else in the subtree,
and redundant with the repo-wide tools/ci/check-license-headers. Removing them
also resolves two CodeRabbit findings about the scripts over-stripping and
under-verifying the upstream Apache header on cassandra-env.sh.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
A re-review surfaced four more items in the ported helper scripts:

- initdb.sh: run the keyspace init through the run_cqlsh helper (stdin) instead
  of passing -p on the cqlsh argv, so the password is not exposed via the
  process list.
- relocate-bitnami-layout.sh: preflight collisions BEFORE renaming the live
  data/ dir (correcting the earlier fix, which preflighted after the rename and
  could strand data in the temp dir and break idempotency on rerun). The data/
  child, whose target is the nested parent itself, is excluded from the check.
- migrate-from-bitnami.sh: scope pod discovery to the target release
  (app.kubernetes.io/instance=RELEASE) and die if none are found, instead of
  selecting every Cassandra pod in the namespace and masking failures.
- migrate-from-bitnami.sh: wait (up to ~10m) for all nodes to reach UN rather
  than probing once, so a node still joining is not reported as a failure.

Verified: sh -n, helm lint, and a filesystem test of the relocation (relocates
cleanly, aborts idempotently on a real collision with the volume untouched, no
false positive on the data/ child).

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
- relocate-bitnami-layout.sh: guard against an interrupted prior relocation. A
  leftover .bitnami-relocate.* temp dir means a previous run was cut off
  mid-move; refuse rather than silently reporting "nothing to do" on a
  half-relocated volume (the nested parent may already be renamed away).
- relocate-bitnami-layout.sh: the dry-run plan now iterates hidden entries too,
  matching what the execution paths actually move.

Not changed: the review also flagged the docs verify one-liner
`kubectl get pods -A | grep -vE 'Running|Completed|READY'` for missing a
0/1 Running pod. That is a pre-existing repo-wide docs idiom (also in
0.5.0-to-0.6.0-upgrade.md); changing it only here would diverge from every
other upgrade guide, so it is left for a repo-wide docs decision.

Verified: sh -n, interrupted-state guard aborts with the volume untouched,
normal relocation still completes, and dry-run lists hidden entries.

NO-REF

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
@nvjmcnamee
nvjmcnamee requested a review from a team as a code owner July 21, 2026 22:04
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 1a0bc9e3-2dd0-4fe7-afff-9ffc98e99e2f

📥 Commits

Reviewing files that changed from the base of the PR and between 558d21d and 2fb1866.

📒 Files selected for processing (2)
  • deploy/helm/cassandra/helm/templates/statefulset.yaml
  • deploy/helm/cassandra/helm/values.yaml
🚧 Files skipped from review as they are similar to previous changes (2)
  • deploy/helm/cassandra/helm/templates/statefulset.yaml
  • deploy/helm/cassandra/helm/values.yaml

📝 Walkthrough

Walkthrough

The Cassandra stack now uses official Apache Cassandra 5.0.8 images, an in-house Helm StatefulSet chart, updated initialization and migration tooling, and new 0.6.1 upgrade documentation.

Changes

Cassandra runtime replacement

Layer / File(s) Summary
Official runtime images
infra/cassandra/*, migrations/cassandra/*
Adds the Cassandra 5.0.8 runtime image with verified yq, optional exporter support, JVM configuration, rack assignment, and updated migration-image dependencies.

In-house Helm chart deployment

Layer / File(s) Summary
Chart configuration and deployment resources
deploy/helm/cassandra/helm/*
Adds the in-house StatefulSet, Services, configuration overlay, storage, probes, resource presets, heap sizing, initialization hooks, and migration wiring.
Chart documentation and metadata
deploy/helm/cassandra/{AGENTS.md,CLAUDE.md,README.md}, deploy/helm/cassandra/helm/Chart.yaml
Updates chart guidance, image examples, and the Cassandra application version.

Credential and data migration operations

Layer / File(s) Summary
Initialization and migration tooling
deploy/helm/cassandra/helm/scripts/initdb.sh, deploy/helm/cassandra/upgrade/*, deploy/helm/cassandra/docs/*
Adds password enforcement, guarded PVC adoption, data-layout relocation, snapshotting, row-count checks, StatefulSet recreation, and migration runbooks.

Release and upgrade publication

Layer / File(s) Summary
0.6.1 release documentation
docs/user/release-notes/*, fern/versions/dev.yml
Adds 0.6.1 release notes, migration procedures, and navigation links.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Operator
  participant MigrationScript
  participant Kubernetes
  participant Helm
  participant Cassandra
  Operator->>MigrationScript: confirm migration
  MigrationScript->>Kubernetes: validate release, PVC, and retention
  MigrationScript->>Cassandra: snapshot and record optional row count
  MigrationScript->>Kubernetes: recreate StatefulSet while retaining PVC
  MigrationScript->>Helm: upgrade to in-house chart
  Helm->>Cassandra: start pods with retained data
  MigrationScript->>Cassandra: verify node status and row count
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.36% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: moving the Cassandra stack off Bitnami to official Apache Cassandra.
Linked Issues check ✅ Passed The PR covers the official Cassandra runtime, in-house Helm chart, migration image, and upgrade docs required by #317 and #190.
Out of Scope Changes check ✅ Passed The changes stay centered on the Cassandra stack migration and its supporting docs, templates, and scripts.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/cassandra-remove-bitnami

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

The license-headers CI job (tools/ci/check-license) verifies the root NOTICE
lists every sub-NOTICE. Adding deploy/helm/cassandra/NOTICE requires
regenerating the root index; done via tools/scripts/update-license.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
The chart carries no third-party attribution that belongs in a NOTICE: the
Bitnami subchart was removed, and the one derived artifact (the resource-preset
map) is attributed inline in _helpers.tpl per OSRB guidance. In this repo only
charts with real third-party notices carry a NOTICE (nats, openbao,
container-cache attribute their bundled upstreams); a contentless NVIDIA-only
NOTICE should not exist. This also reverts the root NOTICE index entry added in
the prior commit.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@deploy/helm/cassandra/helm/templates/statefulset.yaml`:
- Around line 175-179: Update the readinessProbe exec command in the StatefulSet
template to match only the current pod’s nodetool status entry, using the
existing POD_IP environment variable in the grep pattern alongside the UN state.
Preserve the current probe timing settings and shell-based execution.

In `@deploy/helm/cassandra/upgrade/migrate-from-bitnami.sh`:
- Around line 73-75: Validate the --release value parsed in the
argument-handling flow and reject any value other than “cassandra” before
deletion, PVC migration, deployment, or post-upgrade checks proceed. Keep the
chart’s fixed resource naming unchanged and emit a clear error for unsupported
release names.
- Around line 89-93: Extend the preflight validation near the existing VALUES
and CHART_DIR checks to render the Helm chart using the supplied values, then
inspect the Cassandra volume mount configuration. Fail before any deletion
unless the effective mount explicitly resolves to subPath: data, while
preserving the existing required-argument and file/directory validations.
- Around line 164-168: Update the pre-migration probe in the CONFIRM path to
fail immediately unless cqlsh and the subsequent parsing produce a non-empty
numeric pre_count. Remove the error-suppressing behavior that hides
authentication, query, or parsing failures, and ensure the destructive migration
steps do not run when the --probe-* count cannot be obtained.

In `@docs/user/release-notes/0.6.0-to-0.6.1-upgrade.md`:
- Around line 99-109: Finalize the in-place adoption support policy before
publishing the upgrade path: in
docs/user/release-notes/0.6.0-to-0.6.1-upgrade.md:99-109, do not present it as
supported until requirements are finalized; in
deploy/helm/cassandra/docs/upgrade-from-bitnami.md:121-129, document the
complete compatible configuration and runbook or adopt a backup-and-restore-only
policy; and in deploy/helm/cassandra/upgrade/README.md:14-18, align the upgrade
tool status and prerequisites with that same policy.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4c7e5dc4-a806-495b-8953-169bba4e30de

📥 Commits

Reviewing files that changed from the base of the PR and between d6c2206 and 59a0a76.

⛔ Files ignored due to path filters (1)
  • deploy/helm/cassandra/helm/Chart.lock is excluded by !**/*.lock
📒 Files selected for processing (31)
  • deploy/helm/cassandra/AGENTS.md
  • deploy/helm/cassandra/CLAUDE.md
  • deploy/helm/cassandra/README.md
  • deploy/helm/cassandra/docs/upgrade-from-bitnami.md
  • deploy/helm/cassandra/helm/Chart.yaml
  • deploy/helm/cassandra/helm/scripts/initdb.sh
  • deploy/helm/cassandra/helm/templates/_helpers.tpl
  • deploy/helm/cassandra/helm/templates/configmap-cassandra-conf.yaml
  • deploy/helm/cassandra/helm/templates/hook-post-01-initdb.yaml
  • deploy/helm/cassandra/helm/templates/hook-post-02-migrations.yaml
  • deploy/helm/cassandra/helm/templates/hook-pre-01-account-rbac.yaml
  • deploy/helm/cassandra/helm/templates/hook-pre-01-initdb-configmap.yaml
  • deploy/helm/cassandra/helm/templates/service-client.yaml
  • deploy/helm/cassandra/helm/templates/service-headless.yaml
  • deploy/helm/cassandra/helm/templates/statefulset.yaml
  • deploy/helm/cassandra/helm/values.yaml
  • deploy/helm/cassandra/upgrade/README.md
  • deploy/helm/cassandra/upgrade/migrate-from-bitnami.sh
  • deploy/helm/cassandra/upgrade/relocate-bitnami-layout.sh
  • docs/user/release-notes/0.6.0-to-0.6.1-upgrade.md
  • docs/user/release-notes/0.6.1.md
  • docs/user/release-notes/index.md
  • fern/versions/dev.yml
  • infra/cassandra/AGENTS.md
  • infra/cassandra/CLAUDE.md
  • infra/cassandra/Dockerfile
  • infra/cassandra/README.md
  • infra/cassandra/files/.gitkeep
  • infra/cassandra/scripts/cassandra-env.sh
  • migrations/cassandra/Dockerfile
  • migrations/cassandra/README.md

Comment thread deploy/helm/cassandra/helm/templates/statefulset.yaml
Comment thread deploy/helm/cassandra/upgrade/migrate-from-bitnami.sh
Comment thread deploy/helm/cassandra/upgrade/migrate-from-bitnami.sh
Comment thread deploy/helm/cassandra/upgrade/migrate-from-bitnami.sh Outdated
Comment thread docs/user/release-notes/0.6.0-to-0.6.1-upgrade.md

@sbaum1994 sbaum1994 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Follow up notes when comparing with current helmfile stack

  • stack itself needs to consume new cassandra image instead of bitnami-cassandra
  • stack exposes cassandra.global.defaultStorageClass which is bitnami specific, new chart only reads cassandra.persistence.storageClass

Comment thread deploy/helm/cassandra/helm/templates/statefulset.yaml
Comment thread docs/user/release-notes/0.6.0-to-0.6.1-upgrade.md Outdated
Comment thread deploy/helm/cassandra/helm/templates/statefulset.yaml Outdated
nodetool status | grep -E '^UN' matched any Up/Normal member, so a pod
could report Ready off another node's (or a seed's) UN line before its
own node had joined. Scope the match to the pod's own POD_IP so the
readiness gate reflects this node's state. Validated on k3d: both nodes
reach Ready and the probe matches only the local node's line.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
Reject any --release other than 'cassandra' (the chart's resource names
are fixed, so another value would adopt and verify the wrong resources).
Render the chart and refuse unless the data mount resolves to
subPath: data before any destructive step. Require a numeric
pre-migration probe count so a silent cqlsh failure cannot skip the
post-migration row-count comparison.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…gles

Expose nodeSelector, tolerations, and affinity on the StatefulSet pod
template (empty by default) for parity with the previous chart. Add
cassandra.hooks.initializeCluster.enabled and .migrations.enabled
(default true) that gate the two post-install jobs, so a datacenter
expansion can skip schema-init and migrations on the new datacenter
while the pods still start from the pre-install ConfigMap and RBAC.
Validated on k3d: enabled install and upgrade run the jobs (migrations
idempotent on re-run); disabled install brings the pod up with no jobs.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…teps

Note that in-place volume adoption is validated for the standard NVCF
configuration and that a customized cassandra.yaml must be verified.
Point the datacenter-expansion procedure at the concrete mechanism for
skipping the bootstrap jobs on the new datacenter (the hooks.*.enabled
values) and explain why running the migrations there is unsafe.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
…ageClass fallback

The self-managed stack routes global.storageClass to
cassandra.global.defaultStorageClass (the Bitnami-subchart key). The
in-house chart read only persistence.storageClass, so at cutover that
value would be silently dropped and the data PVC would fall back to the
cluster default StorageClass. Read global.defaultStorageClass as a
fallback behind persistence.storageClass, marked deprecated for removal
once the stack emits persistence.storageClass directly. Validated on
k3d: persistence.storageClass and the global fallback each bind a named
StorageClass; unset falls back to the cluster default.

Signed-off-by: James McNamee <jmcnamee@nvidia.com>
@nvjmcnamee

Copy link
Copy Markdown
Contributor Author

Thanks @sbaum1994 - following up on the two notes from your review:

storageClass (global.defaultStorageClass vs persistence.storageClass): addressed in 2fb18661. The self-managed stack routes global.storageClass to cassandra.global.defaultStorageClass (deploy/stacks/self-managed/global.yaml.gotmpl), which the new chart initially ignored - so at cutover the data PVC would have silently dropped to the cluster default StorageClass. The chart now reads cassandra.global.defaultStorageClass as a deprecated fallback behind persistence.storageClass. Live-verified on k3d: both keys bind a named StorageClass; unset falls back to the cluster default. The fallback is marked for removal once the stack emits cassandra.persistence.storageClass directly.

Stack consuming the new image: agreed - repointing the self-managed stack (and the umbrella) off bitnami-cassandra onto this image/chart, including the storageClass emitter change above, is stack-cutover work outside this chart PR. It should be tracked as a follow-up under the umbrella (#317); flag if you'd like it filed now.

Separately, the installer-neutral lifecycle-job rendering (hook | resource | disabled) your design notes call for is tracked in #337; the per-hook enabled toggles added here are an interim mechanism it will reconcile.

@nvjmcnamee
nvjmcnamee added this pull request to the merge queue Jul 22, 2026
Merged via the queue into main with commit a159dc8 Jul 22, 2026
13 checks passed
@nvjmcnamee
nvjmcnamee deleted the feat/cassandra-remove-bitnami branch July 22, 2026 16:57
@balajinvda

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version helm-nvcf-cassandra-v0.18.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@balajinvda

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version nvcf-cassandra-migrations-v0.14.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

3 participants