Skip to content

Configuration

The operator is configured entirely through three cluster-scoped custom resources, all in the terasky.com/v1alpha1 API group:

CRD Purpose
XRDConversionConfig One per target Crossplane XRD. Declares the hub version and, per spoke version, the declarative rules that convert to and from it.
CRDConversionConfig The same thing for a plain native CustomResourceDefinition — identical spec shape and rule vocabulary, different target resource type.
ConversionWebhookServer A deployable, independently scalable instance of the shared conversion webhook runtime that serves ConversionReview requests for both of the above.

XRD and native-CRD support are independently toggleable — see Installation: Feature toggles — so an installation can run with only one of the two CRDs actually active.

How they relate

Neither an XRDConversionConfig nor a CRDConversionConfig runs anything itself — each is a declaration that the operator validates and, once healthy, uses to configure a ConversionWebhookServer instance to serve that resource's conversions. Most installs only ever need the one default instance the Helm chart creates; you'd create more ConversionWebhookServer instances for scale-out or to isolate one tenant's conversion traffic from another's, then point specific configs at a non-default instance via spec.webhookServerRef.

flowchart TB
    subgraph configs["Your XRDConversionConfigs"]
        C1["xwidgets-conversion\n(no webhookServerRef)"]
        C2["xdatabases-conversion\ntenant-a-webhook"]
    end
    subgraph servers["ConversionWebhookServer instances"]
        D["default\n(spec.default: true)"]
        T["tenant-a-webhook"]
    end
    C1 -.resolves to.-> D
    C2 -->|"webhookServerRef: tenant-a-webhook"| T

This resolution — "which ConversionWebhookServer serves this config" — is computed by one shared function used identically by the operator's controller and every webhook-server replica, so there's never any ambiguity or drift between what the controller thinks is serving a config and what actually is.

See Architecture for how validation, patching, and serving fit together end to end.