Skip to content

Condition Registry

Cross-CRD reference for the condition types and reasons emitted by fleet-management-operator. Use this table to write generic alerting and dashboard queries (e.g. "any CR with Ready=False for >10m" across the entire CRD family).

The source of truth is the internal/controller/*.go const blocks listed under each subsystem; this document mirrors them. Anyone adding a new condition type or reason must update this file in the same PR.

Condition types

CRDTypeMeaning
PipelineReadyPipeline is fully synced to Fleet Management and serving the current spec.
PipelineSyncedThe most recent reconciliation completed without error.
PipelineDiscoveryReadyMost recent ListPipelines succeeded and Pipeline CR mirroring is up to date.
PipelineDiscoverySyncedThe most recent reconciliation completed without error.
PipelineDiscoveryTruncatedConflictsstatus.conflicts is capped at 100; check events for the full list.
CollectorReadyThe merged remote-attribute set is reflected in Fleet for this collector.
CollectorSyncedThe most recent reconciliation completed without error.
RemoteAttributePolicyReadyThe selector matched at least one collector and status is up to date.
RemoteAttributePolicySyncedThe selector evaluated successfully (matched ≥0 collectors, no list error).
RemoteAttributePolicyTruncatedstatus.matchedCollectorIDs is capped at 1000; status.matchedCount holds the full count.
ExternalAttributeSyncReadyThe most recent fetch produced a usable result that has been claimed.
ExternalAttributeSyncSyncedThe most recent reconciliation completed without error.
ExternalAttributeSyncStalledAn empty fetch was suppressed by spec.allowEmptyResults=false; previous claim kept.
ExternalAttributeSyncTruncatedstatus.ownedKeys is capped at 1000; collectors beyond cap may retain attributes on CR deletion.
CollectorDiscoveryReadyMost recent ListCollectors succeeded and CR mirroring is up to date.
CollectorDiscoverySyncedThe most recent reconciliation completed without error.
CollectorDiscoveryTruncatedConflictsstatus.conflicts is capped at 100; check events for the full list.
TenantPolicyReadyMirrors Valid. Surfaced as the headline status for operators.
TenantPolicyValidSpec parses cleanly: matcher syntax + namespace selector are well-formed.

Reasons by CRD

Reason strings are short PascalCase identifiers. They are stable: a reason name is never repurposed across releases. Renames go through an additive-then-remove window.

Pipeline (internal/controller/pipeline_controller.go)

ReasonUsed onMeaning
SyncedReady, SyncedUpsertPipeline succeeded.
SyncFailedReady, SyncedFleet API call failed (network, 5xx, rate-limit).
ValidationErrorReady, SyncedSpec failed pre-API validation (configType/contents, matchers).
DeleteFailedReady, SyncedDeletePipeline returned an error other than 404.
ReadOnlyReady, SyncedPipeline is read-only (Grafana-sourced or imported via PipelineDiscovery); Fleet state was observed without applying spec changes. Both stay True.

Collector (internal/controller/collector_controller.go)

ReasonUsed onMeaning
SyncedReady, SyncedMerged desired-state successfully written via BulkUpdateCollectors.
SyncFailedReady, SyncedFleet API call failed.
NotRegisteredReady, SyncedCollector CR points at an ID that has not yet appeared in Fleet Management. Requeues.
ValidationErrorReady, SyncedSpec fails server-side validation (e.g. reserved key prefix slipped past a stale schema).
DeleteFailedReady, SyncedCleanup of owned keys failed.

RemoteAttributePolicy (internal/controller/policy_controller.go)

ReasonUsed onMeaning
MatchedReady, SyncedSelector matched at least one collector.
NoMatchReady, SyncedSelector matched zero collectors. Synced is still True (eval succeeded).
ListFailedReady, SyncedList of Collector CRs failed (cache miss / API error).
MatchedIDsTruncatedTruncatedmatchedCollectorIDs capped at 1000; matchedCount holds the full count.
NotTruncatedTruncatedmatchedCollectorIDs was not capped.

ExternalAttributeSync (internal/controller/external_sync_controller.go)

ReasonUsed onMeaning
SyncedReady, Synced, StalledFetch returned records and the claim was applied. On Stalled, signals recovery from a prior empty fetch.
SourceFailedReady, SyncedSource Fetch returned a non-nil error.
StalledReady, Synced, StalledFetch returned 0 records and spec.allowEmptyResults=false; claim preserved. Surfaced on all three condition types so generic alerts and the dedicated Stalled lane stay consistent.
InvalidScheduleReady, Syncedspec.schedule failed both duration and cron parsers.
OwnedKeysExceededReady, Synced, TruncatedownedKeys exceeded the supported cap; the sync is not Ready because the claim would be partial.
NotTruncatedTruncatedownedKeys was not capped.

PipelineDiscovery (internal/controller/pipeline_discovery_controller.go)

ReasonUsed onMeaning
SyncedReady, SyncedListPipelines succeeded; mirror CRs are up to date.
ListPipelinesFailedReady, SyncedFleet API ListPipelines call failed.
UpsertFailedReady, SyncedCreating or updating a mirrored Pipeline CR failed.
StaleProcessingFailedReady, SyncedProcessing Pipeline CRs no longer present in Fleet failed.
InvalidConfigReady, SyncedSpec failed validation post-admission, such as an invalid poll interval.
ConflictListTruncatedTruncatedConflictsstatus.conflicts truncated to 100; check events for the full conflict list.
NoConflictsTruncatedTruncatedConflictsstatus.conflicts was not truncated.

CollectorDiscovery (internal/controller/collector_discovery_controller.go)

ReasonUsed onMeaning
SyncedReady, SyncedListCollectors succeeded; mirror CRs are up to date.
ListCollectorsFailedReady, SyncedFleet API call failed.
UpsertFailedReady, SyncedCreating or updating a mirrored Collector CR failed.
InvalidConfigReady, SyncedSpec failed validation post-admission (e.g. malformed selector).
ConflictsTruncatedTruncatedConflictsstatus.conflicts truncated to 100; check events for the full conflict list.
NoConflictsTruncatedTruncatedConflictsstatus.conflicts was not truncated.

TenantPolicy (internal/controller/tenant_policy_controller.go)

ReasonUsed onMeaning
ValidReady, ValidSpec parses cleanly.
ParseErrorReady, ValidRequired-matcher syntax or namespace selector is malformed.

Conventions

  • Reason values are stable PascalCase identifiers.
  • Ready=True means the CR is fully usable. Partial success is Ready=False with a specific reason; no half-Ready states.
  • Conditions are written via meta.SetStatusCondition from k8s.io/apimachinery/pkg/api/meta so LastTransitionTime is managed correctly.
  • Conditions are persisted via Status().Update() only — never Update().
  • ObservedGeneration on each condition reflects the spec generation observed when the condition was set; status-level observedGeneration is updated alongside.
  • Event reasons (emitted via record.EventRecorder) intentionally mirror condition reasons where appropriate but are tracked separately in each controller's *EventReason* consts. Event reasons are not part of this registry — they are user-facing log text, not API surface.

Adding a new condition type or reason

  1. Add the const to the relevant internal/controller/*.go file.
  2. Add the row to the table above in this file.
  3. If a new condition type, mention it in the relevant CRD's Status.Conditions godoc on api/v1alpha1/*_types.go.
  4. If alerting / dashboards live elsewhere (Grafana Cloud, etc.), note the new reason in the relevant runbook so on-call knows what it means.