Updating XRD default values does not affect claims
What happened?
Updating default values in an XRD does not update claims that use default values
How can we reproduce it?
Create a simple XRD like:
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xexamples.example.com
spec:
group: example.com
names:
kind: XExample
plural: xexamples
claimNames:
kind: Example
plural: examples
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
values:
x-kubernetes-preserve-unknown-fields: true
description: An example default value
type: string
default: "default value"
Create Claim that uses the default value:
apiVersion: example.com/v1alpha1
kind: Example
metadata:
name: example-test
namespace: default
spec: {}
Resulting Claim in cluster looks like:
apiVersion: example.com/v1alpha1
kind: Example
metadata: <removed for brevity>
spec:
compositeDeletePolicy: Background
compositionUpdatePolicy: Automatic
resourceRef:
apiVersion: example.com/v1alpha1
kind: XExample
name: example-test-9p6k8
values: default value
status: <removed for brevity>
Update default value in XRD like so:
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xexamples.example.com
spec:
group: example.com
names:
kind: XExample
plural: xexamples
claimNames:
kind: Example
plural: examples
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
values:
x-kubernetes-preserve-unknown-fields: true
description: An example default value
type: string
default: "new default value"
Expected results:
- Claim is updated with new default value
Actual results:
- Claim has old default value
What environment did it happen in?
Crossplane version: v1.15.0 Kubernetes version: v1.26.13
Isn't this the exact thing happening with plain CustomResourceDefinitions (CRD)? I think that's how defaults are supposed to work.
Default values are only set at create time. They don't apply retroactively to existing claims. It's better to think of them as default initialization values.
As @phisco mentions, this is how Kubernetes custom resource definitions (CRDs) work. Crossplane XRDs are built on CRDs. I think the behavior we have today is reasonable - it's what I would personally expect.
I don't think we're likely to change this. At best we could update our docs to make it clearer.
Copy. That makes sense.
For my use case, it looks like I can put default data that may update in the composition.
Thanks for the discussion! We can close this if you'd like.