Skip to content

Cinder Controller Events ​

Reference documentation for the Kubernetes events the Cinder controllers emit. The events make the lifecycle transitions readable through kubectl describe cinder and kubectl get events, without access to the controller logs.

Events complement the status conditions: a condition reflects current state for programmatic consumers, while an event is a timestamped record of a transition for human operators and alerting systems.

For the reconciler architecture and the sub-reconciler contracts, see Cinder Reconciler Architecture. For the two satellite kinds whose contract is carried by conditions, see CinderBackend CRD and CinderBackupBackend CRD.


Event Conventions ​

All events follow these conventions:

  • Reason strings are stable PascalCase identifiers. They are part of the controllers' public API and will not change without a deprecation notice.
  • Normal type indicates successful completion of a lifecycle transition.
  • Warning type indicates a failure, a validation error, or a condition that requires operator attention.
  • No events are emitted for in-progress or polling states, such as a db-sync Job that is still running. This keeps repeated requeue cycles from producing event noise.
  • Almost every event is emitted on the Cinder CR (involvedObject.kind: Cinder), including the ones a satellite's detach produces: the satellite is being deleted, so an event on it is collected with it, while the Cinder is where an operator reads why a detach is stuck. The one exception is ServiceRemoveSkipped, which lands on the CinderBackend. The CinderBackupBackend controller emits no events at all.
  • The Kubernetes API server deduplicates events by (involvedObject, reason, message, source). Repeated identical events increment a counter rather than creating new event objects.

Event Reasons Reference ​

Storage attachment ​

ReasonTypeTrigger ConditionExample Message
CinderBackendSkippedWarningAn attached volume backend carries no spec.nfs or spec.rbd block matching its type, a rendered value carries a control character, or the RBD key Secret vanished or stopped carrying a cephx key between the gate and the render; the backend is skipped while its healthy siblings keep projectingSkipping backend nfs-a: <error>
CinderBackupBackendSkippedWarningThe attached backup backend carries no spec.nfs or spec.rbd block matching its type, a rendered value carries a control character, or the RBD key Secret vanished or stopped carrying a cephx key between the gate and the render; nothing is projected and BackupBackendReady stays in its waiting stateSkipping backup backend nfs-backups: <error>
CephKeyringConflictWarningTwo sources of the backup pod's /etc/ceph (the RBD backup target and the RBD volume backends) project a keyring under one file name with different keys; the first writer, the target and then the backends in name order, keeps the file, and the other source's keyring is not applied therebackend rbd-b projects the keyring /etc/ceph/ceph.client.cinder.keyring that backend rbd-a already projects into the backup service with a different key, so its keyring is not applied there
SharedExportMountOptionsIgnoredWarningTwo volume backends serve the same export, which the backup pod mounts once, and their mountOptions differ; the backup service mounts it with the options of the backend projected first, and the other backend's are not applied thereBackend nfs-b serves the export nfs.example.com:/exports/volumes that backend nfs-a already mounts with "nfsvers=4.1,soft,timeo=30,retrans=2" in the backup service, so its own mountOptions "nfsvers=3,soft" are not applied there

Source: reconcileBackends in reconcile_backends.go; reconcileBackupBackend in reconcile_backup_backend.go; reconcileBackupService in reconcile_backupservice.go

Backend detach ​

ReasonTypeObjectTrigger ConditionExample Message
ServiceRemovedNormalCinderThe service-remove Job succeeded and the backend's finalizer was releasedRemoved the volume service cinder@nfs-a from the service registry
ServiceRemoveJobFailedWarningCinderThe service-remove Job failed permanently; the finalizer stays and deleting the Job retries the removalJob cinder-nfs-a-service-remove could not remove the volume service of backend nfs-a
ServiceRemoveSkippedNormalCinderBackendThe backend is deleting and its parent Cinder no longer exists, so no registry row can be removed and the finalizer is released unconditionallyParent Cinder openstack/cinder no longer exists, so no service registry row can be removed; released the backend
ServiceRemoveMetricEmissionDeferredWarningCinderPatching the last-observed Job UID annotation failed, deferring the service_remove metric emission to the next reconcilePatching last-observed service-remove-nfs-a Job UID failed; metric emission deferred to the next reconcile: <error>

Source: detachBackend in reconcile_volumeservices.go (ServiceRemoved / ServiceRemoveJobFailed); reconcileDeleting in cinderbackend_controller.go (ServiceRemoveSkipped); the shared RecordJobTerminalState in internal/common/job/terminal.go (ServiceRemoveMetricEmissionDeferred)

Configuration ​

ReasonTypeTrigger ConditionExample Message
ExtraConfigOwnedKeyOverrideWarningspec.extraConfig overrides one or more operator-owned configuration keys (the per-service ownership registry)spec.extraConfig overrides operator-owned keys: [DEFAULT] host (the volumes a backend owns are keyed by this identity, so renaming it strands them on a host no service backs)

Source: reconcileConfig in reconcile_config.go

Note: The event is gated on the ExtraConfigHealthy=False condition's message. It fires once on the transition into False and once more when the overridden-key set changes, never on the steady reconcile poll. Removing the overrides transitions the condition back to ExtraConfigHealthy=True, Reason=NoOwnedKeysOverridden without a further event. The condition is informational and is not aggregated into Ready. The keys the webhook rejects outright never reach it; they are listed under extraConfig.

Database Sync ​

ReasonTypeTrigger ConditionExample Message
DatabaseSyncedNormalThe db-sync Job completes successfullyDatabase schema is up to date
DBSyncFailedWarningThe db-sync Job failsdb_sync job failed: <error>
DBSyncMetricEmissionDeferredWarningPatching the last-observed Job UID annotation fails, deferring the db_sync metric emission to the next reconcilePatching last-observed db-sync Job UID failed; metric emission deferred to the next reconcile: <error>

Source: the shared ReconcileSyncJobs in internal/common/database/flow.go (DatabaseSynced / DBSyncFailed); recordDBJobTerminalState in db_job_metrics.go (DBSyncMetricEmissionDeferred)

Note: Cinder runs a single cinder-manage db sync with no separate schema-check Job, so SchemaDriftDetected never fires for Cinder.

DB Purge ​

ReasonTypeTrigger ConditionExample Message
DBPurgeJobFailedWarningThe newest terminal Job spawned by the {name}-db-purge CronJob failedDatabase purge Job cinder-db-purge-29387520 failed; inspect its pod logs
DBPurgeMetricEmissionDeferredWarningPatching the last-observed Job UID annotation fails, deferring the db_purge metric emission to the next reconcilePatching last-observed db-purge Job UID failed; metric emission deferred to the next reconcile: <error>

Source: reconcileDBPurge in reconcile_dbpurge.go (DBPurgeJobFailed); the shared RecordJobTerminalState in internal/common/job/terminal.go (DBPurgeMetricEmissionDeferred)

Note: There is no Normal event for a successful purge run; a succeeding run only flips DBPurgeReady back to True. A run that wedges rather than fails reaches a terminal Failed state through the Job's activeDeadlineSeconds within the hour, so it surfaces on the same path. spec.dbPurge.suspend pauses the CronJob without deleting it and raises no event: a suspended purge is visible only through the DBPurgeSuspended condition reason.

Upgrade ​

A release transition (a spec.openStackRelease bump with the image in lockstep) walks the shared expand-migrate-contract flow, which emits these events on the Cinder CR. For the phase machine see Release upgrade.

ReasonTypeTrigger ConditionExample Message
UpgradeInitiatedNormalAn accepted release bump starts the upgradeUpgrade initiated: 2026.1 to 2026.2
ExpandCompleteNormalThe expand phase Job succeededExpand phase complete: 2026.1 to 2026.2
MigrateCompleteNormalThe migrate phase Job succeededMigrate phase complete: 2026.1 to 2026.2
UpgradeCheckCompletedNormalThe migrate phase's cinder-status upgrade check exited 0, or its exit code could not be read off the podcinder-status upgrade check exit 0
UpgradeCheckWarningsWarningThe same check exited 1 (warnings) or 2 (a failed check, typically a volume whose service_uuid is still NULL); neither wedges the upgradecinder-status upgrade check exit 2
DeploymentRolloutCompleteNormalThe API Deployment rolled out; the phase flips to ContractingDeployment rollout complete during upgrade 2026.1 to 2026.2
UpgradeCompleteNormalThe contract phase Job succeeded; the upgrade finishedUpgrade complete: 2026.1 to 2026.2
UpgradeAbortedNormalspec.openStackRelease reverted to the installed release, cancelling the upgradeUpgrade 2026.1 to 2026.2 aborted: spec release reverted to installed release 2026.1
UpgradeCheckEventEmissionDeferredWarningPatching the last-observed Job UID annotation failed, deferring the upgrade-check report to the next reconcilePatching last-observed db-migrate-check Job UID failed; metric emission deferred to the next reconcile: <error>
VersionParseErrorWarningThe installed or target release is not a valid YYYY.N stringFailed to parse target release "latest": ...
DowngradeNotSupportedWarningThe target release is older than the installed releaseDowngrade from 2026.2 to 2026.1 is not supported
UpgradePathInvalidWarningThe requested jump is not a single sequential stepUpgrade from 2024.2 to 2026.1 is not sequential
UpgradeTargetChangedWarningspec.openStackRelease changed to a third value during an active upgradeSpec release changed to 2027.1 during active upgrade 2026.1 to 2026.2
ExpandFailedWarningThe expand phase Job failed permanentlyExpand job cinder-db-expand failed: ...
MigrateFailedWarningThe migrate phase Job failed permanentlyMigrate job cinder-db-migrate failed: ...
ContractFailedWarningThe contract phase Job failed permanentlyContract job cinder-db-contract failed: ...

Source: the shared expand-migrate-contract flow in internal/common/database/upgrade.go; reportUpgradeCheck in reconcile_database.go for the two check events

Finalization ​

Emitted while the finalizer tears a deleted Cinder CR down. FinalizingDatabase is gated on live MariaDB cleanup work remaining, so brownfield CRs and repeated requeue polls produce no noise.

ReasonTypeTrigger ConditionExample Message
FinalizingDatabaseNormalDeletion begins while MariaDB Database/User/Grant CRs are still liveCleaning up MariaDB Database, User, and Grant before removing Cinder
DatabaseFinalizedNormalThe MariaDB resources are marked for deletion; the finalizer is releasedMariaDB Database, User, and Grant marked for deletion; releasing finalizer
RemoteChildrenAbandonedWarningDeletion begins while the target cluster the CR named no longer resolves; the finalizer is released without touching what was written thereTarget cluster is no longer registered; releasing the finalizer without deleting the MariaDB Database, User, and Grant on it

Source: reconcileDelete in cinder_controller.go


Alerting Configuration ​

Event reason strings are stable identifiers for alerting rules. Use kubectl get events --field-selector to filter by reason:

bash
# Watch for a failed backend detach
kubectl get events --field-selector reason=ServiceRemoveJobFailed -w

# Watch for a failed database purge
kubectl get events --field-selector reason=DBPurgeJobFailed -w

# Watch for a skipped volume backend
kubectl get events --field-selector reason=CinderBackendSkipped -w

# Watch for all Warning events from the cinder-controller
kubectl get events --field-selector type=Warning,reportingComponent=cinder-controller -w

Prometheus Alertmanager Example ​

With kube-state-metrics and event metrics enabled, the Warning reasons that leave work undone are worth alerting on: a failed db-sync, a failed purge, a stuck detach, and a failed upgrade phase.

yaml
groups:
  - name: cinder-events
    rules:
      - alert: CinderDBSyncFailed
        expr: |
          increase(kube_event_count{
            reason="DBSyncFailed",
            involved_object_kind="Cinder"
          }[5m]) > 0
        for: 0m
        labels:
          severity: critical
        annotations:
          summary: "Cinder db-sync failed"
          description: "The Cinder db-sync Job has failed. Check the Job logs for details."

      - alert: CinderDBPurgeFailed
        expr: |
          increase(kube_event_count{
            reason="DBPurgeJobFailed",
            involved_object_kind="Cinder"
          }[5m]) > 0
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: "Cinder database purge failed"
          description: "The Cinder db-purge Job has failed. Soft-deleted volume, snapshot and backup rows keep accumulating until a run succeeds; check the Job logs for details."

      - alert: CinderServiceRemoveFailed
        expr: |
          increase(kube_event_count{
            reason="ServiceRemoveJobFailed",
            involved_object_kind="Cinder"
          }[5m]) > 0
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: "Cinder backend detach is stuck"
          description: "A service-remove Job failed, so the detaching CinderBackend keeps its finalizer and stays in Terminating. Check the Job logs, then delete the Job to retry the removal."

      - alert: CinderUpgradePhaseFailed
        expr: |
          increase(kube_event_count{
            reason=~"ExpandFailed|MigrateFailed|ContractFailed",
            involved_object_kind="Cinder"
          }[5m]) > 0
        for: 0m
        labels:
          severity: critical
        annotations:
          summary: "Cinder database upgrade phase failed"
          description: "An expand, migrate, or contract Job failed during a Cinder release upgrade. Check the phase Job logs and consider aborting the upgrade."

Event Flow ​

The event flow of the Cinder operator: the two reconcilers, the sub-reconcilers that emit events, and for each the condition and the event it emits. CinderReconciler.Reconcile(): reconcileDelete() (deletionTimestamp set) emits Normal FinalizingDatabase when MariaDB CRs still live; Normal DatabaseFinalized when MariaDB cleanup done; Warning RemoteChildrenAbandoned when target cluster gone; reconcileBackends() emits Warning CinderBackendSkipped when per-backend fault; reconcileBackupBackend() emits Warning CinderBackupBackendSkipped when backup-target fault; reconcileConfig() emits Warning ExtraConfigOwnedKeyOverride when extraConfig overrides an operator-owned key; reconcileDatabase() emits Warning DBSyncFailed when db_sync fails; Normal DatabaseSynced when db_sync succeeds; Warning DBSyncMetricEmissionDeferred when Job-UID patch fails; Normal UpgradeCheckCompleted and Warning UpgradeCheckWarnings when migrate phase terminal; Normal UpgradeInitiated or ExpandComplete or MigrateComplete or UpgradeComplete or UpgradeAborted and Warning VersionParseError or DowngradeNotSupported or UpgradePathInvalid or UpgradeTargetChanged or ExpandFailed or MigrateFailed or ContractFailed when release upgrade; reconcileVolumeServices() emits Normal ServiceRemoved when detach completed; Warning ServiceRemoveJobFailed when service-remove Job failed; Warning ServiceRemoveMetricEmissionDeferred when Job-UID patch fails; reconcileBackupService() emits Warning SharedExportMountOptionsIgnored when shared export, divergent mountOptions; Warning CephKeyringConflict when one keyring file, two keys; reconcileDeployment() emits Normal DeploymentRolloutComplete when rollout ready mid-upgrade; reconcileDBPurge() emits Warning DBPurgeJobFailed when newest run failed; Warning DBPurgeMetricEmissionDeferred when Job-UID patch fails; CinderBackendReconciler.Reconcile(): reconcileDeleting() (parent Cinder already gone) emits Normal ServiceRemoveSkipped when finalizer released;

The figure draws which sub-reconciler emits which event, and on what. The Event Reasons Reference describes every reason.