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.0Function 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 andvalidate()is the only guard. - 18 tests to 21.
Developer experience
-
crossplane project runcan 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.yamlis tracked with placeholders and meant to be edited
locally. Enable it withgit config core.hooksPath .githooks. -
The README now documents building the
crossplaneCLI 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
- Use the SDK's serve() so the function is one function by @stevendborrelli in #23
- Add dev-cluster resources for crossplane project run by @stevendborrelli in #24
Full Changelog: v0.2.0...v0.3.0