Description
Implement the controller for MCPTelemetryConfig following the same pattern as the MCPOIDCConfig controller. The controller handles validation, config hash computation, finalizer management, reference tracking with structured WorkloadReference, and deletion protection.
Controller Responsibilities
- Finalizer management:
mcptelemetryconfig.toolhive.stacklok.dev/finalizer
- Validation: Validate spec (endpoint requires tracing or metrics, sensitive header overlap with plaintext headers, empty names/keys)
- Config hash: SHA-256 hash of spec for change detection
- Reference tracking: Scan MCPServer for
spec.telemetryConfigRef.name == this.name. Store as status.referencingWorkloads[] with shared WorkloadReference{Kind, Name} (namespace is implicit)
- Deletion protection: Block finalizer removal while
referencingWorkloads is non-empty
- Status conditions: Set
Valid condition based on spec validation
- Watches: MCPServer via
EnqueueRequestsFromMapFunc to update reference tracking
Status Structure
type MCPTelemetryConfigStatus struct {
Conditions []metav1.Condition `json:"conditions,omitempty"`
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
ConfigHash string `json:"configHash,omitempty"`
ReferencingWorkloads []WorkloadReference `json:"referencingWorkloads,omitempty"`
}
// WorkloadReference is shared across CRDs (defined in mcpoidcconfig_types.go)
type WorkloadReference struct {
Kind string `json:"kind"` // MCPServer, VirtualMCPServer, MCPRemoteProxy
Name string `json:"name"`
}
Phase 2 Enhancements (follow-up PRs)
Ready condition (requires Secret resolution for sensitiveHeaders)
- Secret watches for sensitiveHeaders change detection
- Cascade annotations on referencing workloads
- MCPRemoteEndpoint reference tracking (when CRD lands)
Acceptance Criteria
Description
Implement the controller for
MCPTelemetryConfigfollowing the same pattern as the MCPOIDCConfig controller. The controller handles validation, config hash computation, finalizer management, reference tracking with structuredWorkloadReference, and deletion protection.Controller Responsibilities
mcptelemetryconfig.toolhive.stacklok.dev/finalizerspec.telemetryConfigRef.name == this.name. Store asstatus.referencingWorkloads[]with sharedWorkloadReference{Kind, Name}(namespace is implicit)referencingWorkloadsis non-emptyValidcondition based on spec validationEnqueueRequestsFromMapFuncto update reference trackingStatus Structure
Phase 2 Enhancements (follow-up PRs)
Readycondition (requires Secret resolution for sensitiveHeaders)Acceptance Criteria
status.referencingWorkloadstracks MCPServer references with shared WorkloadReference (Kind + Name)status.configHashcomputed from spec