Skip to content

Commit aea57f7

Browse files
Merge pull request #11 from stevendborrelli/new-0.5-sdk-features
add getCondition and capabilities example
2 parents 4930415 + 14d72bd commit aea57f7

3 files changed

Lines changed: 31 additions & 2 deletions

File tree

package-configuration/crossplane.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ spec:
2222
- apiVersion: pkg.crossplane.io/v1
2323
kind: Function
2424
package: ghcr.io/crossplane/function-template-typescript
25-
version: ">=v0.2.0"
25+
version: ">=v0.3.0"
2626
# Automatically set ready status for resources
2727
- apiVersion: pkg.crossplane.io/v1
2828
kind: Function

src/function.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import {
99
getDesiredComposedResources,
1010
getDesiredCompositeResource,
1111
getObservedCompositeResource,
12+
getObservedComposedResources,
13+
getCondition,
14+
hasCapability,
15+
Capability,
1216
type FunctionHandler,
1317
type Logger,
1418
} from '@crossplane-org/function-sdk-typescript';
@@ -54,6 +58,15 @@ export class Function implements FunctionHandler {
5458
let rsp = to(req);
5559

5660
try {
61+
// Example: Check Crossplane capabilities
62+
// hasCapability() allows checking what features are supported by the Crossplane version
63+
// Starting with 2.2.0 Crossplane added the ability to download schemas.
64+
const capabilities = {
65+
requiredResources: hasCapability(req, Capability.CAPABILITY_REQUIRED_RESOURCES),
66+
requiredSchemas: hasCapability(req, Capability.CAPABILITY_REQUIRED_SCHEMAS),
67+
};
68+
logger?.info({ capabilities }, 'Crossplane capabilities detected');
69+
5770
// Get our Observed Composite
5871
const observedComposite = getObservedCompositeResource(req);
5972
logger?.debug({ observedComposite }, 'Observed composite resource');
@@ -210,6 +223,23 @@ export class Function implements FunctionHandler {
210223

211224
desiredComposed['deployment'] = fromModel(deployment);
212225

226+
// Example: Check the conditions of the observed deployment
227+
// getCondition() extracts status conditions and returns "Unknown" if not found
228+
const observedComposed = getObservedComposedResources(req);
229+
const observedDeployment = observedComposed['deployment'];
230+
if (observedDeployment?.resource) {
231+
const availableCondition = getCondition(observedDeployment.resource, 'Available');
232+
const progressingCondition = getCondition(observedDeployment.resource, 'Progressing');
233+
logger?.info(
234+
{
235+
deployment: observedDeployment.resource.metadata?.name,
236+
available: availableCondition.status,
237+
progressing: progressingCondition.status,
238+
},
239+
'Deployment conditions'
240+
);
241+
}
242+
213243
// Create Ingress if config is provided
214244
if (ingressConfig && Object.keys(ingressConfig).length > 0) {
215245
const ingress = new Ingress({

src/test-helpers.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,6 @@ export function assertResourceTypes(response: RunFunctionResponse, expectedTypes
359359
* Run all assertions for a test case
360360
*/
361361
export function assertTestCase(response: RunFunctionResponse, testCase: TestCase) {
362-
363362
if (testCase.expected.resources) {
364363
assertResources(response, testCase.expected.resources);
365364
}

0 commit comments

Comments
 (0)