@@ -59,7 +59,6 @@ metadata:
5959spec :
6060 package : ghcr.io/fortra/function-pythonic:v0.0.7
6161` ` `
62-
6362## Composed Resource Dependencies
6463
6564function-pythonic automatically handles dependencies between composed resources.
@@ -253,34 +252,45 @@ selection. For now, use matchLabels and filter the results if required.
253252RequiredResources acts like a Python list to provide access to the found required resources.
254253Each resource in the list is the following RequiredResource class :
255254
256- | Field | Description |
257- | ----- | ----------- |
258- | RequiredResource.name | The required resource name |
259- | RequiredResource.observed | Low level direct access to the observed required resource |
260- | RequiredResource.apiVersion | The required resource apiVersion |
261- | RequiredResource.kind | The required resource kind |
262- | RequiredResource.metadata | The required resource metadata |
263- | RequiredResource.spec | The required resource spec |
264- | RequiredResource.data | The required resource data |
265- | RequiredResource.status | The required resource status |
266- | RequiredResource.conditions | The required resource conditions |
255+ | Field | Type | Description |
256+ | ----- | ---- | ---- ------- |
257+ | RequiredResource.name | String | The required resource name |
258+ | RequiredResource.observed | Map | Low level direct access to the observed required resource |
259+ | RequiredResource.apiVersion | String | The required resource apiVersion |
260+ | RequiredResource.kind | String | The required resource kind |
261+ | RequiredResource.metadata | Map | The required resource metadata |
262+ | RequiredResource.spec | Map | The required resource spec |
263+ | RequiredResource.data | Map | The required resource data |
264+ | RequiredResource.status | Map | The required resource status |
265+ | RequiredResource.conditions | Map | The required resource conditions |
267266
268267# ## Conditions
269268
270269The `conditions` field is a map of the resource's status conditions array, with
271270the map key being the condition type.
272271
273- | Field | Description |
274- | ----- | ----------- |
275- | Condition.type | The condtion type |
276- | Condition.status | RequiredResource.observed | Low level direct access to the observed required resource |
277- | RequiredResource.apiVersion | The required resource apiVersion |
278- | RequiredResource.kind | The required resource kind |
279- | RequiredResource.metadata | The required resource metadata |
280- | RequiredResource.spec | The required resource spec |
281- | RequiredResource.data | The required resource data |
282- | RequiredResource.status | The required resource status |
283- | RequiredResource.conditions | The required resource conditions |
272+ | Field | Type | Description |
273+ | ----- | ---- | ----------- |
274+ | Condition.type | String | The condtion type, or name |
275+ | Condition.status | Boolean | The condition status |
276+ | Condition.reason | String | PascalCase, machine-readable reason for this condition |
277+ | Condition.message | String | Human-readable details about the condition |
278+ | Condition.lastTransitionTime | Timestamp | Last transition time, read only |
279+ | Condition.claim | Boolean | Also apply the condition the claim |
280+
281+ # ## Events
282+
283+ The `events` field is a list of events to apply to the Composite and
284+ optionally to the Claim.
285+
286+ | Field | Type | Description |
287+ | ----- | ---- | ----------- |
288+ | Event.info | Boolean | Normal informational event |
289+ | Event.warning | Boolean | Warning level event |
290+ | Event.fatal | Boolean | Fatal events also terminate composing the Composite |
291+ | Event.reason | String | PascalCase, machine-readable reason for this event |
292+ | Event.message | String | Human-readable details about the event |
293+ | Event.claim | Boolean | Also apply the event to the claim |
284294
285295# # Single use Composites
286296
@@ -301,6 +311,85 @@ spec:
301311 self.status.composite = 'Hello, World!'
302312` ` `
303313
314+ # # Quick Start Development
315+
316+ The following example demonstrates how to locally render function-python
317+ compositions. First, install the `crossplane-function-pythonic` python
318+ package into the python environment :
319+ ` ` ` shell
320+ $ pip install crossplane-function-pythonic
321+ ` ` `
322+ Then create the following files :
323+ # ### xr.yaml
324+ ` ` ` yaml
325+ apiVersion: pythonic.fortra.com/v1alpha1
326+ kind: Hello
327+ metadata:
328+ name: world
329+ spec:
330+ who: World
331+ ` ` `
332+ # ### composition.yaml
333+ ` ` ` yaml
334+ apiVersion: apiextensions.crossplane.io/v1
335+ kind: Composition
336+ metadata:
337+ name: hellos.pythonic.fortra.com
338+ spec:
339+ compositeTypeRef:
340+ apiVersion: pythonic.fortra.com/v1alpha1
341+ kind: Hello
342+ mode: Pipeline
343+ pipeline:
344+ - step: pythonic
345+ functionRef:
346+ name: function-pythonic
347+ input:
348+ apiVersion: pythonic.fn.fortra.com/v1alpha1
349+ kind: Composite
350+ composite: |
351+ class Composite(BaseComposite):
352+ def compose(self):
353+ self.status.greeting = f"Hello, {self.spec.who}!"
354+ ` ` `
355+ # ### functions.yaml
356+ ` ` ` yaml
357+ apiVersion: pkg.crossplane.io/v1beta1
358+ kind: Function
359+ metadata:
360+ name: function-pythonic
361+ annotations:
362+ render.crossplane.io/runtime: Development
363+ spec:
364+ package: ghcr.io/fortra/function-pythonic:v0.0.7
365+ ` ` `
366+ In one terminal session, run function-pythonic :
367+ ` ` ` shell
368+ $ function-pythonic --insecure --debug
369+ [2025-08-21 15:32:37.966] grpc._cython.cygrpc [DEBUG ] Using AsyncIOEngine.POLLER as I/O engine
370+ ` ` `
371+ In other terminal session, render the Composite :
372+ ` ` ` shell
373+ $ crossplane render xr.yaml composition.yaml functions.yaml
374+ ---
375+ apiVersion: pythonic.fortra.com/v1alpha1
376+ kind: Hello
377+ metadata:
378+ name: world
379+ status:
380+ conditions:
381+ - lastTransitionTime: "2024-01-01T00:00:00Z"
382+ reason: Available
383+ status: "True"
384+ type: Ready
385+ - lastTransitionTime: "2024-01-01T00:00:00Z"
386+ message: All resources are composed
387+ reason: AllComposed
388+ status: "True"
389+ type: ResourcesComposed
390+ greeting: Hello, World!
391+ ` ` `
392+
304393# # ConfigMap Packages
305394
306395ConfigMap based python packages are enable using the `--packages` and
0 commit comments