Patching 101
Crossplane Patching Basics¶
Component relationships¶
flowchart LR
XRD(Composite Resource Definition)
C(Composition)
CR(Composite Resource)
MR(Managed Resource)
MR2(Managed Resource)
Claim
Bucket(S3 Bucket)
Table(DynamoDB Table)
C --satisfies--> XRD
XRD --define schema \n create CRDs--> CRDs
C --defines--> CR --> MR --managed--> Bucket
CR --> MR2 --manage--> Table
Claim --trigger instantiation--> CR
From Composite Resource to Managed Resource¶
Crossplane compositions allow you to modify sub resources based on arbitrary fields from their composite resource. This type of patches are referred as FromCompositeFieldPath
. Take for an example:
This tells Crossplane to: 1. Look at the spec.region
field in the Composite Resource. 2. Then copy that value into the spec.forProvider.region
field in this instance of managed resource.
flowchart LR
subgraph Composite Resource
cs(spec: \n  region: <font color=red>us-west-2</font>)
end
subgraph Managed Resource
ms(spec: \n  forProvider: \n   region: <font color=red>us-west-2</font>)
end
style cs text-align:left
style ms text-align:left
cs --> ms
From Managed Resource to Composite Resource¶
Compositions also allow you to modify the composite resource from its sub resources. For example:
type: ToCompositeFieldPath
fromFieldPath: status.atProvider.arn
toFieldPath: status.bucketArn
policy:
fromFieldPath: Optional # This can be omitted since it defaults to Optional.
This tells Crossplane to: 1. Look at the status.atProvider.arn
field on the managed resource. 2. If the status.atProvider.arn
field is empty, skip this patch. 3. Copy the value into the status.bucketArn
field on the composite resource.
flowchart LR
subgraph Managed Resource
ms(status: \n  atProvider: \n   arn: <font color=red>arn:aws:s3:::my-bucket</font>)
end
subgraph Composite Resource
cs(status: \n  bucketArn: <font color=red>arn:aws:s3:::my-bucket</font>)
end
style cs text-align:left
style ms text-align:left
ms --> cs
Putting them together¶
With these patching methods together, you can pass values between managed resources.
type: FromCompositeFieldPath
fromFieldPath: status.bucketArn
toFieldPath: spec.forProvider.bucketArn
policy:
fromFieldPath: Required
This tells Crossplane to: 1. Look at the status.bucketArn
field in the Composite Resource. 2. If the status.bucketArn
field is empty, do not skip. Stop composing this managed resource. 3. Once the status.bucketArn
field is filled with a value, copy that value into the spec.forProvider.bucketArn
in the managed resource.
With the use of Required
policy, you can create a soft dependency. This is useful when you do not want to create a resource before another resource is ready.
flowchart LR
subgraph Managed Resource 1
ms(status: \n  atProvider: \n   arn: <font color=red>arn:aws:s3:::my-bucket</font>)
end
subgraph Managed Resource 2
ms2(spec: \n  forProvider: \n   bucketArn: <font color=red>arn:aws:s3:::my-bucket</font>)
end
subgraph Composite Resource
cs(status: \n  bucketArn: <font color=red>arn:aws:s3:::my-bucket</font>)
end
style cs text-align:left
style ms text-align:left
style ms2 text-align:left
ms --> cs
cs --> ms2
Transform¶
You can also perform modifications to values when patching. For example, you can use the following transformation to extract the accountId of this managed policy.
type: ToCompositeFieldPath
fromFieldPath: status.policyArn
toFieldPath: status.accountId
transforms:
- type: string
string:
type: Regexp
regexp:
match: 'arn:aws:iam::(\d+):.*'
group: 1
This tells Crossplane to: 1. Look at the status.policyArn
field in the Managed Resource. 2. If the field has a value, take that value and run a regular expression match against it. 3. When there is a match, take the first capture group and store it in the status.accountId
field in the Composite Resource.
flowchart LR
subgraph Managed Resource
ms(status: \n  policyArn: arn:aws:iam::<font color=red>12345</font>:policy/my-policy)
end
subgraph Composite Resource
cs(status: \n  accountId: <font color=red>12345</font>)
end
style cs text-align:left
style ms text-align:left
ms --regular expression match--> cs
Reference¶
See the official documentation for more information. https://docs.crossplane.io/master/concepts/composition/#patch-types