Skip to content

v0.3.0

Latest

Choose a tag to compare

@stevendborrelli stevendborrelli released this 30 Aug 16:48
3a77998

Release Notes - v0.3.0

Release Date: August 30, 2026

Overview

This release adopts the serve module added in
function-sdk-typescript v0.7.0,
which lets a composition function drop the gRPC server it used to assemble by hand.

The Network API is unchanged. The XRD and the Composition are byte-identical to v0.2.0, and
rendering the example produces the same sixteen composed resources. Existing Network resources
need no edits, and there is nothing to do on upgrade.

The one behavioral change is a shutdown fix, described below.

Installing

Configuration Package

apiVersion: pkg.crossplane.io/v1
kind: Configuration
metadata:
  name: configuration-aws-network-ts
spec:
  package: xpkg.upbound.io/upbound/configuration-aws-network-ts:v0.3.0

Function Package

The composition function is embedded in the configuration package and is published and installed
along with it. There is no separate function package to install or reference yourself.

Upgrading from v0.2.0

No action required. The API, the Composition and the set of composed resources are unchanged.

What's Changed from v0.2.0

Fixed: the function now shuts down cleanly on SIGTERM

The hand-written entrypoint trapped only SIGINT. Kubernetes sends SIGTERM, so every rollout
of the function was terminating it ungracefully rather than letting it drain. The SDK's serve()
handles both signals, so this is fixed as a side effect of adopting it.

This is the only change in this release that alters runtime behaviour.

The function is now a single function

src/main.ts went from 85 lines to 6. Flag parsing, logger construction, server startup and
signal handling were scaffolded boilerplate that had never been edited — serve() does all of
it:

#!/usr/bin/env node

import { serve } from '@crossplane-org/function-sdk-typescript';
import { compose } from './function.js';

serve(compose, { name: 'configuration-aws-network' });

src/function.ts is now a ComposeFunction rather than a class implementing FunctionHandler.
It receives a response already built from the request, so the to(req) preamble and the
getDesiredComposedResources() / setDesiredComposedResources() round trip are gone.

The function also gained a -h, --help flag, which the previous entrypoint never advertised.

Composed resources are built with the SDK's helper

Ten repetitions of

desiredComposed['igw'] = Resource.fromJSON({ resource: igw.toJSON() });

became desiredComposed['igw'] = fromModel(igw). The two produce identical protobuf encodings.

The XR status type comes from the generated model

XRStatus was hand-written as { [key: string]: string | string[] }, which restated the status
block in apis/network/definition.yaml and accepted any field name at all. It is now
NonNullable<INetwork['status']>, taken from the model generated from the XRD, so the XRD is the
single source of truth and a misspelt status field fails to compile.

Dependencies

Dependency v0.2.0 v0.3.0
@crossplane-org/function-sdk-typescript ^0.6.0 ^0.7.0
commander ^15.0.0 removed
pino ^10.3.0 removed

commander and pino were only used by the entrypoint that serve() replaced. Neither is a
direct dependency any more, so both drop out of the function image.

Testing

  • Added coverage for the invalid-input path, which had none: an XR missing a required parameter
    now has tests asserting it produces a fatal result naming the field and composes no resources.
    This matters because the SDK types an observed resource as { [key: string]: any }, so no XR
    parameter is checked at compile time and validate() is the only guard.
  • 18 tests to 21.

Developer experience

  • crossplane project run can now bring up a working dev cluster in one command, with the
    namespace and ProviderConfig it needs:

    crossplane project run \
      --init-resources=examples/network/namespace-network-team.yaml \
      --extra-resources=examples/network/providerconfig.yaml
  • Added a pre-commit hook in .githooks/ that refuses to commit AWS credentials, since
    examples/network/providerconfig.yaml is tracked with placeholders and meant to be edited
    locally. Enable it with git config core.hooksPath .githooks.

  • The README now documents building the crossplane CLI from source, which is a prerequisite
    for working on this repository and was previously left for the reader to work out.

  • CI pins the CLI build to a commit rather than a branch, so a release build cannot change
    underneath us.

What's Changed

Full Changelog: v0.2.0...v0.3.0