Skip to content

crossplane-contrib/function-cel-filter

Repository files navigation

function-cel-filter

CI

A composition function that filters matching composed resources using CEL expressions.

Each filter:

  • Matches composed resources by name using a regular expression.
  • Specifies whether resources should be included using a CEL expression.

If a filter's CEL expression evaluates to true, Crossplane creates the matching composed resources.

Filters only apply to matching composed resources. The function doesn't filter composed resources that don't match a filter.

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: function-template-go
spec:
  compositeTypeRef:
    apiVersion: example.crossplane.io/v1
    kind: NoSQL
  mode: Pipeline
  pipeline:
  - step: patch-and-transform
    functionRef:
      name: function-patch-and-transform
    input:
      apiVersion: pt.fn.crossplane.io/v1beta1
      kind: Resources
      resources:
      - name: table
        base:
          apiVersion: dynamodb.aws.upbound.io/v1beta1
          kind: Table
          metadata:
            name: crossplane-quickstart-database
          spec:
            forProvider:
              region: "us-east-2"
              writeCapacity: 1
              readCapacity: 1
              attribute:
                - name: S3ID
                  type: S
              hashKey: S3ID
      - name: bucket
        base:
          apiVersion: s3.aws.upbound.io/v1beta1
          kind: Bucket
          spec:
            forProvider:
              region: us-east-2
  - step: filter-composed-resources
    functionRef:
      name: function-cel-filter
    input:
      apiVersion: cel.fn.crossplane.io/v1beta1
      kind: Filters
      filters:
      # Only create the bucket if the XR's spec.export field is set to "S3".
      - name: bucket
        expression: observed.composite.resource.spec.export == "S3"

The following top-level variables are available to the CEL expression:

  • observed
  • desired
  • context

Example expressions:

  • observed.composite.resource.spec.widgets == 42
  • observed.resources['bucket'].connection_details['user'] == b'admin'
  • desired.resources['bucket'].resource.spec.widgets == 42
  • "bucket" in desired.resources

Expressions must evaluate to true for the composed resource to be included.

See the RunFunctionRequest protobuf message for schema details. The introduction to CEL documentation shows more example expressions.