Overview

Upbound supports defining your control plane APIs in KCL, an open source constraint-based record and functional language.

Prerequisites

Install the following:

Example

The example below is a pre-generated function that detects if a composed resource is ready in your infrastructure.

The function file below describes the behavior of your function. This overview describes the core elements below.

import models.v1beta1 as v1beta1

_metadata = lambda name: str -> any {
    { annotations = { "krm.kcl.dev/composition-resource-name" = name }}
}

# This is the observed composite resource, provided as an input to the function
oxr = option("params").oxr

_items = [
    v1beta1.Instance {
      metadata: _metadata("vm-instance")
      spec.forProvider = {
          associatePublicIpAddress: True
          instanceType: "t3.micro"
          availabilityZone: oxr.spec.parameters.locaton
          cpuCoreCount: 10
      }
    }
]

# This function composes an EC2 instance.
items = _items

First, review the import statements.

import models.v1alpha1.nop_crossplane_io_v1alpha1_nop_resource as nopv1alpha1
import models.k8s.apimachinery.pkg.apis.meta.v1 as metav1

The function above can be generated from a corresponding XRD, which maps the resource schema for the resource you want to create.

apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
  name: xdatabases.platform.acme.co
spec:
  group: platform.acme.co
  names:
    kind: XDatabase
    plural: xdatabases
  claimNames:
    kind: Database
    plural: databases
  versions:
    - name: v1alpha1
      served: true
      referenceable: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              description: |
                The specification for how this database should be
                deployed.                
              properties:
                parameters:
                  type: object
                  description: |
                    The parameters indicating how this database should
                    be configured.                    
                  properties:
                    region:
                      type: string
                      enum:
                        - east
                        - west
                      description: |
                        The geographic region in which this database
                        should be deployed.                        
                    size:
                      type: string
                      enum:
                        - small
                        - medium
                        - large
                      description: |
                        The machine size for this database.                        
                    storage:
                      type: integer
                      description: |
                        The storage size for this database in GB.                        
                  required:
                    - region
                    - size
                    - storage
              required:
                - parameters

Compositions reference your function and automatically follow the function logic.

apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: xdatabases.platform.acme.co
spec:
  compositeTypeRef:
    apiVersion: platform.acme.co/v1alpha1
    kind: XDatabase
  mode: Pipeline
  pipeline:
    - step: compose
      functionRef:
        name: upbound-project-getting-startedxdatabase
    - step: automatically-detect-ready-composed-resources
      functionRef:
        name: crossplane-contrib-function-auto-ready

Control plane project model

The Upbound programming model defines the core concepts you can use when creating your control plane using Upbound. Concepts describes these concepts with examples available in KCL. This section contains guidance specifically for how to use the KCL language to do Crossplane-specific tasks. Read the KCL reference docs for comprehensive instruction.

The KCL experience is made available thanks to the function-kcl function.