From 14d72bd2130cbfaec748f2363c17e6076d12182b Mon Sep 17 00:00:00 2001 From: Steven Borrelli Date: Fri, 6 Mar 2026 09:35:11 +0100 Subject: [PATCH] add getCondition and capabilities example Signed-off-by: Steven Borrelli --- package-configuration/crossplane.yaml | 2 +- src/function.ts | 30 +++++++++++++++++++++++++++ src/test-helpers.ts | 1 - 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/package-configuration/crossplane.yaml b/package-configuration/crossplane.yaml index 95a1d55..fb95b73 100644 --- a/package-configuration/crossplane.yaml +++ b/package-configuration/crossplane.yaml @@ -22,7 +22,7 @@ spec: - apiVersion: pkg.crossplane.io/v1 kind: Function package: ghcr.io/crossplane/function-template-typescript - version: ">=v0.2.0" + version: ">=v0.3.0" # Automatically set ready status for resources - apiVersion: pkg.crossplane.io/v1 kind: Function diff --git a/src/function.ts b/src/function.ts index 0a4a4b6..f60d6c6 100644 --- a/src/function.ts +++ b/src/function.ts @@ -9,6 +9,10 @@ import { getDesiredComposedResources, getDesiredCompositeResource, getObservedCompositeResource, + getObservedComposedResources, + getCondition, + hasCapability, + Capability, type FunctionHandler, type Logger, } from '@crossplane-org/function-sdk-typescript'; @@ -54,6 +58,15 @@ export class Function implements FunctionHandler { let rsp = to(req); try { + // Example: Check Crossplane capabilities + // hasCapability() allows checking what features are supported by the Crossplane version + // Starting with 2.2.0 Crossplane added the ability to download schemas. + const capabilities = { + requiredResources: hasCapability(req, Capability.CAPABILITY_REQUIRED_RESOURCES), + requiredSchemas: hasCapability(req, Capability.CAPABILITY_REQUIRED_SCHEMAS), + }; + logger?.info({ capabilities }, 'Crossplane capabilities detected'); + // Get our Observed Composite const observedComposite = getObservedCompositeResource(req); logger?.debug({ observedComposite }, 'Observed composite resource'); @@ -210,6 +223,23 @@ export class Function implements FunctionHandler { desiredComposed['deployment'] = fromModel(deployment); + // Example: Check the conditions of the observed deployment + // getCondition() extracts status conditions and returns "Unknown" if not found + const observedComposed = getObservedComposedResources(req); + const observedDeployment = observedComposed['deployment']; + if (observedDeployment?.resource) { + const availableCondition = getCondition(observedDeployment.resource, 'Available'); + const progressingCondition = getCondition(observedDeployment.resource, 'Progressing'); + logger?.info( + { + deployment: observedDeployment.resource.metadata?.name, + available: availableCondition.status, + progressing: progressingCondition.status, + }, + 'Deployment conditions' + ); + } + // Create Ingress if config is provided if (ingressConfig && Object.keys(ingressConfig).length > 0) { const ingress = new Ingress({ diff --git a/src/test-helpers.ts b/src/test-helpers.ts index 37a8a96..b50defc 100644 --- a/src/test-helpers.ts +++ b/src/test-helpers.ts @@ -359,7 +359,6 @@ export function assertResourceTypes(response: RunFunctionResponse, expectedTypes * Run all assertions for a test case */ export function assertTestCase(response: RunFunctionResponse, testCase: TestCase) { - if (testCase.expected.resources) { assertResources(response, testCase.expected.resources); }