FireboltEngine.spec.engineClassRef to a class name. The Firebolt Operator resolves that name namespaced-first: a FireboltEngineClass in the Engine’s namespace if present, otherwise a ClusterFireboltEngineClass of the same name. Same name in both scopes is allowed; the namespaced object is the override and wins wholesale.
Values resolve in this order:
- The Engine value
- The namespace
FireboltEnginePresetvalue, when one object exists - The resolved class value (
FireboltEngineClass, elseClusterFireboltEngineClass) - The Firebolt Operator default
FireboltEngineClass is namespaced because its pod template can reference namespaced resources such as ServiceAccounts, Secrets, ConfigMaps, and persistent volume claims. ClusterFireboltEngineClass is SKU-only: instance type, resources, affinity/tolerations, init containers, and an optional engine image. It does not carry ServiceAccount names, Secret refs, IAM annotations, ConfigMap refs, persistentVolumeClaim volumes, resource claims, storage, rollout, drain-check, autoStop, or uiSidecar. Those stay on the namespaced class, Preset, or Engine spec.
A cluster-scoped object has no namespace of its own, so any of those references would bind to whatever happens to exist in each consuming namespace. The same catalog entry would then render differently per namespace, or not at all. The admission webhook and the Engine reconciler both reject them. Volume sources that name nothing, such as emptyDir and downwardAPI, stay allowed, as do ephemeral claim templates, which create a fresh claim in the consuming namespace from a cluster-scoped StorageClass. An ephemeral claim template must not set dataSource or dataSourceRef: those seed the new claim from a claim or snapshot resolved in the consuming namespace, which is the per-namespace binding the rule exists to prevent.
Pod template precedence
The Engine template overrides Preset, and Preset overrides the class, for conflicting scalar values. Collection behavior depends on the field:
The Firebolt Operator owns fields required for Engine identity, networking, probes, and StatefulSet behavior. See the FireboltEngineClass CRD reference for the complete allowed-field table.
Override a class image for one Engine
Use the class image as the shared default:Inherited Engine settings
FireboltEnginePreset
FireboltEnginePreset is an optional ambient overlay in the same namespace. Engines do not reference it by name. The object must be named firebolt — a validation rule baked into the CRD pins the name, so name uniqueness caps a namespace at one object.
Set spec.requirePreset: true on an Engine to keep it from becoming Ready until that object exists and is Ready. A present but unready Preset object fails closed for every Engine in the namespace even when requirePreset is unset.
See FireboltEnginePreset overview.
Class changes
Changes to class settings that alter Engine pods roll every bound Engine in the namespace. These include the pod template, storage, custom Engine configuration, and UI sidecar setting. AFireboltEnginePreset edit to the pod template, storage, or custom Engine configuration rolls every Engine in the namespace.
Changes to rollout, drain-check, and auto-stop policy take effect without forcing a pod rollout by themselves.
Inspect the number of referencing Engines with:
Delete a class
Class deletion remains blocked while Engines in the same namespace reference it. Remove or replacespec.engineClassRef on every bound Engine, wait for those updates to reconcile, then delete the class.
If deletion is blocked, status.conditions[type=Ready] reports reason DeletionBlocked and status.boundEngines shows the current consumer count.
ClusterFireboltEngineClass delete is not blocked. Engines that still name the SKU emit a Warning EngineClassNotFound Event and keep running the last applied pods until the catalog object is restored or spec.engineClassRef is changed.