crossplane-function-pythonic 0.1.5__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crossplane_function_pythonic-0.1.5/README.md → crossplane_function_pythonic-0.2.1/PKG-INFO +110 -50
- crossplane_function_pythonic-0.1.5/PKG-INFO → crossplane_function_pythonic-0.2.1/README.md +86 -74
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/__about__.py +2 -0
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/__main__.py +2 -0
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/command.py +102 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/crossplane/pythonic/composite.py +26 -23
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/crossplane/pythonic/function.py +7 -7
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/grpc.py +128 -0
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/main.py +28 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/crossplane/pythonic/protobuf.py +107 -30
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/render.py +462 -0
- crossplane_function_pythonic-0.2.1/crossplane/pythonic/version.py +13 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/.dev/functions.yaml +2 -2
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/cluster-function-pythonic.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/composition.yaml +2 -2
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/aks-cluster/render.sh +10 -0
- crossplane_function_pythonic-0.2.1/examples/connections/composite-connection.yaml +8 -0
- crossplane_function_pythonic-0.2.1/examples/connections/composition.yaml +39 -0
- crossplane_function_pythonic-0.2.1/examples/connections/rds-connection.yaml +8 -0
- crossplane_function_pythonic-0.2.1/examples/connections/rds-observed.yaml +21 -0
- crossplane_function_pythonic-0.2.1/examples/connections/render.sh +9 -0
- crossplane_function_pythonic-0.2.1/examples/connections/step-credential.yaml +8 -0
- crossplane_function_pythonic-0.2.1/examples/connections/xr.yaml +8 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/eks-cluster/composition-v2.yaml +3 -3
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/eks-cluster/composition.yaml +3 -3
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/eks-cluster/definition.yaml +3 -3
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/eks-cluster/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/eks-cluster/render-v2.sh +4 -0
- {crossplane_function_pythonic-0.1.5/examples/import-existing-vpc → crossplane_function_pythonic-0.2.1/examples/eks-cluster}/render.sh +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/eks-cluster/xr.yaml +2 -2
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/composition.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/function.yaml +2 -2
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/conditions/composition.yaml +1 -5
- {crossplane_function_pythonic-0.1.5/examples/function-go-templating/extra-resources → crossplane_function_pythonic-0.2.1/examples/function-go-templating/conditions}/functions.yaml +3 -2
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/conditions/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/context/composition.yaml +6 -17
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/context/environmentConfigs.yaml +1 -1
- {crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getComposedResource → crossplane_function_pythonic-0.2.1/examples/function-go-templating/context}/functions.yaml +3 -2
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/context/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/extra-resources/composition.yaml +1 -1
- {crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/fromYaml → crossplane_function_pythonic-0.2.1/examples/function-go-templating/extra-resources}/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/extra-resources/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/fromYaml/composition.yaml +1 -1
- {crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getCompositeResource → crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/fromYaml}/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/fromYaml/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getComposedResource/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getComposedResource/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getComposedResource/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getCompositeResource/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCompositeResource/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCompositeResource/render.sh +4 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCredentialData/composition.yaml +27 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCredentialData/credentials.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCredentialData/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCredentialData/render.sh +4 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getCredentialData/xr.yaml +5 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getResourceCondition/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getResourceCondition/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/getResourceCondition/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/include/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/include/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/include/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/toYaml/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/toYaml/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/functions/toYaml/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/inline/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/inline/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/inline/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/recursive/composition-real.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/recursive/composition-wrapper.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/recursive/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/function-go-templating/recursive/render.sh +7 -0
- crossplane_function_pythonic-0.2.1/examples/function-sequencer/composition.yaml +48 -0
- {crossplane_function_pythonic-0.1.5/examples/single-purpose → crossplane_function_pythonic-0.2.1/examples/function-sequencer}/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/function-sequencer/observed.yaml +27 -0
- crossplane_function_pythonic-0.2.1/examples/function-sequencer/render.sh +12 -0
- crossplane_function_pythonic-0.2.1/examples/function-sequencer/sequencer.py +12 -0
- crossplane_function_pythonic-0.2.1/examples/function-sequencer/xr.yaml +6 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/get-started-app/composition.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/get-started-app/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/get-started-app/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/composition.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/helm-copy-secret/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/vcluster.py +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/composition.yaml +2 -2
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/functions.yaml +2 -2
- crossplane_function_pythonic-0.2.1/examples/import-existing-vpc/render.sh +7 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/xr.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/single-purpose/functions.yaml +8 -0
- crossplane_function_pythonic-0.2.1/examples/single-purpose/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/single-purpose/xr.yaml +1 -1
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/usages-extra/composition.yaml +1 -1
- crossplane_function_pythonic-0.2.1/examples/usages-extra/functions.yaml +9 -0
- crossplane_function_pythonic-0.2.1/examples/usages-extra/render.sh +4 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/pyproject.toml +10 -10
- crossplane_function_pythonic-0.1.5/crossplane/pythonic/main.py +0 -198
- crossplane_function_pythonic-0.1.5/examples/aks-cluster/render.sh +0 -9
- crossplane_function_pythonic-0.1.5/examples/eks-cluster/render-v2.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/eks-cluster/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/conditions/functions.yaml +0 -25
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/conditions/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/context/functions.yaml +0 -25
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/context/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/extra-resources/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/fromYaml/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getComposedResource/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getCompositeResource/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getResourceCondition/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getResourceCondition/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/include/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/include/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/toYaml/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/toYaml/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/inline/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/inline/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/recursive/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/recursive/render.sh +0 -4
- crossplane_function_pythonic-0.1.5/examples/get-started-app/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/helm-copy-secret/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/single-purpose/render.sh +0 -3
- crossplane_function_pythonic-0.1.5/examples/usages-extra/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.5/examples/usages-extra/render.sh +0 -3
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/.gitignore +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/LICENSE +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/crossplane/pythonic/__init__.py +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/crossplane/pythonic/packages.py +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/README.md +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/aks/kubernetescluster.py +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/aks/resourcegroup.py +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/install.sh +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/providers.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/aks-cluster/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/README.md +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/runtime.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/vcluster.py +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/filing-system/vcluster.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/conditions/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/conditions/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/context/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/context/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/extra-resources/extraResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/extra-resources/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/fromYaml/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getComposedResource/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getComposedResource/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getCompositeResource/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getResourceCondition/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/getResourceCondition/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/include/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/functions/toYaml/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/inline/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/function-go-templating/recursive/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/get-started-app/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/get-started-app/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/run-function.sh +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/helm-copy-secret/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/README.md +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/import-existing-vpc/provider-ec2.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/usages-extra/extraResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/usages-extra/observedResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.5 → crossplane_function_pythonic-0.2.1}/examples/usages-extra/xr.yaml +0 -0
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: crossplane-function-pythonic
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: A Python centric Crossplane Function
|
|
5
|
+
Project-URL: Documentation, https://github.com/crossplane-contrib/function-pythonic#readme
|
|
6
|
+
Project-URL: Issues, https://github.com/crossplane-contrib/function-pythonic/issues
|
|
7
|
+
Project-URL: Source, https://github.com/crossplane-contrib/function-pythonic
|
|
8
|
+
Author-email: Patrick J McNerthney <pat@mcnerthney.com>
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Programming Language :: Python
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Requires-Python: <3.15,>=3.12
|
|
17
|
+
Requires-Dist: crossplane-function-sdk-python==0.10.0
|
|
18
|
+
Requires-Dist: pyyaml==6.0.3
|
|
19
|
+
Provides-Extra: packages
|
|
20
|
+
Requires-Dist: kopf==1.39.1; extra == 'packages'
|
|
21
|
+
Provides-Extra: pip-install
|
|
22
|
+
Requires-Dist: pip==25.3; extra == 'pip-install'
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
1
25
|
# function-pythonic
|
|
2
26
|
|
|
3
27
|
## Introduction
|
|
@@ -21,11 +45,11 @@ spec:
|
|
|
21
45
|
kind: XR
|
|
22
46
|
mode: Pipeline
|
|
23
47
|
pipeline:
|
|
24
|
-
- step:
|
|
48
|
+
- step:
|
|
25
49
|
functionRef:
|
|
26
50
|
name: function-pythonic
|
|
27
51
|
input:
|
|
28
|
-
apiVersion: pythonic.fn.
|
|
52
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
29
53
|
kind: Composite
|
|
30
54
|
composite: |
|
|
31
55
|
class VpcComposite(BaseComposite):
|
|
@@ -57,7 +81,7 @@ kind: Function
|
|
|
57
81
|
metadata:
|
|
58
82
|
name: function-pythonic
|
|
59
83
|
spec:
|
|
60
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1
|
|
84
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.2.1
|
|
61
85
|
```
|
|
62
86
|
## Composed Resource Dependencies
|
|
63
87
|
|
|
@@ -203,9 +227,10 @@ The BaseComposite class provides the following fields for manipulating the Compo
|
|
|
203
227
|
| self.spec | Map | The composite observed spec |
|
|
204
228
|
| self.status | Map | The composite desired and observed status, read from observed if not in desired |
|
|
205
229
|
| self.conditions | Conditions | The composite desired and observed conditions, read from observed if not in desired |
|
|
206
|
-
| self.
|
|
207
|
-
| self.connection |
|
|
230
|
+
| self.results | Results | Returned results applied to the Composite and optionally on the Claim |
|
|
231
|
+
| self.connection | Map | The composite desired connection detials |
|
|
208
232
|
| self.ready | Boolean | The composite desired ready state |
|
|
233
|
+
| self.observed.connection | Map | The composite observed connection detials |
|
|
209
234
|
|
|
210
235
|
The BaseComposite also provides access to the following Crossplane Function level features:
|
|
211
236
|
|
|
@@ -246,7 +271,7 @@ Resource class:
|
|
|
246
271
|
| Resource.data | Map | The resource data |
|
|
247
272
|
| Resource.status | Map | The resource status |
|
|
248
273
|
| Resource.conditions | Conditions | The resource conditions |
|
|
249
|
-
| Resource.connection |
|
|
274
|
+
| Resource.connection | Map | The resource observed connection details |
|
|
250
275
|
| Resource.ready | Boolean | The resource ready state |
|
|
251
276
|
| Resource.unknownsFatal | Boolean | Terminate the composition if this resource has been created and is assigned unknown values, default is Composite.unknownsFatal |
|
|
252
277
|
| Resource.usages | Boolean | Generate Crossplane Usages for this resource, default is Composite.autoReady |
|
|
@@ -286,6 +311,7 @@ Each resource in the list is the following RequiredResource class:
|
|
|
286
311
|
| RequiredResource.data | Map | The required resource data |
|
|
287
312
|
| RequiredResource.status | Map | The required resource status |
|
|
288
313
|
| RequiredResource.conditions | Map | The required resource conditions |
|
|
314
|
+
| RequiredResource.connection | Map | The required resource connection details |
|
|
289
315
|
|
|
290
316
|
### Conditions
|
|
291
317
|
|
|
@@ -302,19 +328,19 @@ The fields are read only for `Resource.conditions` and `RequiredResource.conditi
|
|
|
302
328
|
| Condition.lastTransitionTime | Timestamp | Last transition time, read only |
|
|
303
329
|
| Condition.claim | Boolean | Also apply the condition the claim |
|
|
304
330
|
|
|
305
|
-
###
|
|
331
|
+
### Results
|
|
306
332
|
|
|
307
|
-
The `BaseComposite.
|
|
333
|
+
The `BaseComposite.results` field is a list of results to apply to the Composite and
|
|
308
334
|
optionally to the Claim.
|
|
309
335
|
|
|
310
336
|
| Field | Type | Description |
|
|
311
337
|
| ----- | ---- | ----------- |
|
|
312
|
-
|
|
|
313
|
-
|
|
|
314
|
-
|
|
|
315
|
-
|
|
|
316
|
-
|
|
|
317
|
-
|
|
|
338
|
+
| Result.info | Boolean | Normal informational result |
|
|
339
|
+
| Result.warning | Boolean | Warning level result |
|
|
340
|
+
| Result.fatal | Boolean | Fatal results also terminate composing the Composite |
|
|
341
|
+
| Result.reason | String | PascalCase, machine-readable reason for this result |
|
|
342
|
+
| Result.message | String | Human-readable details about the result |
|
|
343
|
+
| Result.claim | Boolean | Also apply the result to the claim |
|
|
318
344
|
|
|
319
345
|
## Single use Composites
|
|
320
346
|
|
|
@@ -324,7 +350,7 @@ just to run that Composition once in a single use or initialize task?
|
|
|
324
350
|
function-pythonic installs a `Composite` CompositeResourceDefinition that enables
|
|
325
351
|
creating such tasks using a single Composite resource:
|
|
326
352
|
```yaml
|
|
327
|
-
apiVersion: pythonic.
|
|
353
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
328
354
|
kind: Composite
|
|
329
355
|
metadata:
|
|
330
356
|
name: composite-example
|
|
@@ -337,16 +363,62 @@ spec:
|
|
|
337
363
|
|
|
338
364
|
## Quick Start Development
|
|
339
365
|
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
366
|
+
function-pythonic includes a pure python implementation of the `crossplane render ...`
|
|
367
|
+
command, which can be used to render Compositions that only use function-pythonic. This
|
|
368
|
+
makes it very easy to test and debug using your IDE of choice. It is also blindingly
|
|
369
|
+
fast compared to `crossplane render`. To use, install the `crossplane-function-pythonic`
|
|
370
|
+
python package into the python environment.
|
|
343
371
|
```shell
|
|
344
372
|
$ pip install crossplane-function-pythonic
|
|
345
373
|
```
|
|
346
|
-
|
|
374
|
+
Then to render function-pythonic Compositions, use the `function-pythonic render ...`
|
|
375
|
+
command.
|
|
376
|
+
```shell
|
|
377
|
+
$ function-pythonic render -h
|
|
378
|
+
usage: Crossplane Function Pythonic render [-h] [--debug] [--log-name-width WIDTH] [--python-path DIRECTORY] [--render-unknowns]
|
|
379
|
+
[--allow-oversize-protos] [--context-files KEY=PATH] [--context-values KEY=VALUE]
|
|
380
|
+
[--observed-resources PATH] [--required-resources PATH] [--secret-store PATH] [--include-full-xr]
|
|
381
|
+
[--include-connection-xr] [--include-function-results] [--include-context]
|
|
382
|
+
PATH [PATH/CLASS]
|
|
383
|
+
|
|
384
|
+
positional arguments:
|
|
385
|
+
PATH A YAML file containing the Composite resource to render.
|
|
386
|
+
PATH/CLASS A YAML file containing the Composition resource or the complete path of a function=-pythonic BaseComposite subclass.
|
|
387
|
+
|
|
388
|
+
options:
|
|
389
|
+
-h, --help show this help message and exit
|
|
390
|
+
--debug, -d Emit debug logs.
|
|
391
|
+
--log-name-width WIDTH
|
|
392
|
+
Width of the logger name in the log output, default 40.
|
|
393
|
+
--python-path DIRECTORY
|
|
394
|
+
Filing system directories to add to the python path.
|
|
395
|
+
--render-unknowns, -u
|
|
396
|
+
Render resources with unknowns, useful during local development.
|
|
397
|
+
--allow-oversize-protos
|
|
398
|
+
Allow oversized protobuf messages
|
|
399
|
+
--context-files KEY=PATH
|
|
400
|
+
Context key-value pairs to pass to the Function pipeline. Values must be files containing YAML/JSON.
|
|
401
|
+
--context-values KEY=VALUE
|
|
402
|
+
Context key-value pairs to pass to the Function pipeline. Values must be YAML/JSON. Keys take precedence over --context-files.
|
|
403
|
+
--observed-resources, -o PATH
|
|
404
|
+
A YAML file or directory of YAML files specifying the observed state of composed resources.
|
|
405
|
+
--required-resources, -e PATH
|
|
406
|
+
A YAML file or directory of YAML files specifying required resources to pass to the Function pipeline.
|
|
407
|
+
--secret-store, -s PATH
|
|
408
|
+
A YAML file or directory of YAML files specifying Secrets to use to resolve connections and credentials.
|
|
409
|
+
--include-full-xr, -x
|
|
410
|
+
Include a direct copy of the input XR's spedc and metadata fields in the rendered output.
|
|
411
|
+
--include-connection-xr
|
|
412
|
+
Include the Composite connection values in the rendered output as a resource of kind: Connection.
|
|
413
|
+
--include-function-results, -r
|
|
414
|
+
Include informational and warning messages from Functions in the rendered output as resources of kind: Result..
|
|
415
|
+
--include-context, -c
|
|
416
|
+
Include the context in the rendered output as a resource of kind: Context.
|
|
417
|
+
```
|
|
418
|
+
The following example demonstrates how to locally render function-python compositions. First, create the following files:
|
|
347
419
|
#### xr.yaml
|
|
348
420
|
```yaml
|
|
349
|
-
apiVersion: pythonic.
|
|
421
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
350
422
|
kind: Hello
|
|
351
423
|
metadata:
|
|
352
424
|
name: world
|
|
@@ -358,10 +430,10 @@ spec:
|
|
|
358
430
|
apiVersion: apiextensions.crossplane.io/v1
|
|
359
431
|
kind: Composition
|
|
360
432
|
metadata:
|
|
361
|
-
name: hellos.pythonic.
|
|
433
|
+
name: hellos.pythonic.crossplane.io
|
|
362
434
|
spec:
|
|
363
435
|
compositeTypeRef:
|
|
364
|
-
apiVersion: pythonic.
|
|
436
|
+
apiVersion: pythonic.crossplane.io/v1alpha1
|
|
365
437
|
kind: Hello
|
|
366
438
|
mode: Pipeline
|
|
367
439
|
pipeline:
|
|
@@ -369,50 +441,38 @@ spec:
|
|
|
369
441
|
functionRef:
|
|
370
442
|
name: function-pythonic
|
|
371
443
|
input:
|
|
372
|
-
apiVersion: pythonic.fn.
|
|
444
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
373
445
|
kind: Composite
|
|
374
446
|
composite: |
|
|
375
447
|
class GreetingComposite(BaseComposite):
|
|
376
448
|
def compose(self):
|
|
377
449
|
self.status.greeting = f"Hello, {self.spec.who}!"
|
|
378
450
|
```
|
|
379
|
-
|
|
380
|
-
```yaml
|
|
381
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
382
|
-
kind: Function
|
|
383
|
-
metadata:
|
|
384
|
-
name: function-pythonic
|
|
385
|
-
annotations:
|
|
386
|
-
render.crossplane.io/runtime: Development
|
|
387
|
-
spec:
|
|
388
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
389
|
-
```
|
|
390
|
-
In one terminal session, run function-pythonic:
|
|
391
|
-
```shell
|
|
392
|
-
$ function-pythonic --insecure --debug --render-unknowns
|
|
393
|
-
[2025-08-21 15:32:37.966] grpc._cython.cygrpc [DEBUG ] Using AsyncIOEngine.POLLER as I/O engine
|
|
394
|
-
```
|
|
395
|
-
In another terminal session, render the Composite:
|
|
451
|
+
Then, to render the above composite and composition, run:
|
|
396
452
|
```shell
|
|
397
|
-
$
|
|
453
|
+
$ function-pythonic render --debug --render-unknowns xr.yaml composition.yaml
|
|
454
|
+
[2025-12-29 09:44:57.949] io.crossplane.fn.pythonic.Hello.world [DEBUG ] Starting compose, 1st step, 1st pass
|
|
455
|
+
[2025-12-29 09:44:57.949] io.crossplane.fn.pythonic.Hello.world [INFO ] Completed compose
|
|
398
456
|
---
|
|
399
|
-
apiVersion: pythonic.
|
|
457
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
400
458
|
kind: Hello
|
|
401
459
|
metadata:
|
|
402
460
|
name: world
|
|
403
461
|
status:
|
|
404
462
|
conditions:
|
|
405
|
-
- lastTransitionTime:
|
|
463
|
+
- lastTransitionTime: '2026-01-01T00:00:00Z'
|
|
406
464
|
reason: Available
|
|
407
|
-
status:
|
|
465
|
+
status: 'True'
|
|
408
466
|
type: Ready
|
|
409
|
-
- lastTransitionTime:
|
|
467
|
+
- lastTransitionTime: '2026-01-01T00:00:00Z'
|
|
410
468
|
message: All resources are composed
|
|
411
469
|
reason: AllComposed
|
|
412
|
-
status:
|
|
470
|
+
status: 'True'
|
|
413
471
|
type: ResourcesComposed
|
|
414
472
|
greeting: Hello, World!
|
|
415
473
|
```
|
|
474
|
+
Most of the examples contain a `render.sh` command which uses `function-pythonic render` to
|
|
475
|
+
render the example.
|
|
416
476
|
|
|
417
477
|
## ConfigMap Packages
|
|
418
478
|
|
|
@@ -441,7 +501,7 @@ Then, in your Composition:
|
|
|
441
501
|
functionRef:
|
|
442
502
|
name: function-pythonic
|
|
443
503
|
input:
|
|
444
|
-
apiVersion: pythonic.fn.
|
|
504
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
445
505
|
kind: Composite
|
|
446
506
|
composite: |
|
|
447
507
|
from example.pythonic import features
|
|
@@ -473,7 +533,7 @@ data:
|
|
|
473
533
|
functionRef:
|
|
474
534
|
name: function-pythonic
|
|
475
535
|
input:
|
|
476
|
-
apiVersion: pythonic.fn.
|
|
536
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
477
537
|
kind: Composite
|
|
478
538
|
composite: example.pythonic.features.FeatureOneComposite
|
|
479
539
|
...
|
|
@@ -487,7 +547,7 @@ kind: Function
|
|
|
487
547
|
metadata:
|
|
488
548
|
name: function-pythonic
|
|
489
549
|
spec:
|
|
490
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1
|
|
550
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.2.1
|
|
491
551
|
runtimeConfigRef:
|
|
492
552
|
name: function-pythonic
|
|
493
553
|
---
|
|
@@ -580,7 +640,7 @@ data:
|
|
|
580
640
|
functionRef:
|
|
581
641
|
name: function-pythonic
|
|
582
642
|
input:
|
|
583
|
-
apiVersion: pythonic.fn.
|
|
643
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
584
644
|
kind: Composite
|
|
585
645
|
parameters:
|
|
586
646
|
who: World
|
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: crossplane-function-pythonic
|
|
3
|
-
Version: 0.1.5
|
|
4
|
-
Summary: A Python centric Crossplane Function
|
|
5
|
-
Project-URL: Documentation, https://github.com/fortra/function-pythonic#readme
|
|
6
|
-
Project-URL: Issues, https://github.com/fortra/function-pythonic/issues
|
|
7
|
-
Project-URL: Source, https://github.com/fortra/function-pythonic
|
|
8
|
-
Author-email: Patrick J McNerthney <pat@mcnerthney.com>
|
|
9
|
-
License-Expression: Apache-2.0
|
|
10
|
-
License-File: LICENSE
|
|
11
|
-
Classifier: Development Status :: 4 - Beta
|
|
12
|
-
Classifier: Programming Language :: Python
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
-
Requires-Python: <3.15,>=3.12
|
|
17
|
-
Requires-Dist: crossplane-function-sdk-python==0.10.0
|
|
18
|
-
Requires-Dist: pyyaml==6.0.3
|
|
19
|
-
Provides-Extra: packages
|
|
20
|
-
Requires-Dist: kopf==1.39.0; extra == 'packages'
|
|
21
|
-
Provides-Extra: pip-install
|
|
22
|
-
Requires-Dist: pip==25.3; extra == 'pip-install'
|
|
23
|
-
Description-Content-Type: text/markdown
|
|
24
|
-
|
|
25
1
|
# function-pythonic
|
|
26
2
|
|
|
27
3
|
## Introduction
|
|
@@ -45,11 +21,11 @@ spec:
|
|
|
45
21
|
kind: XR
|
|
46
22
|
mode: Pipeline
|
|
47
23
|
pipeline:
|
|
48
|
-
- step:
|
|
24
|
+
- step:
|
|
49
25
|
functionRef:
|
|
50
26
|
name: function-pythonic
|
|
51
27
|
input:
|
|
52
|
-
apiVersion: pythonic.fn.
|
|
28
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
53
29
|
kind: Composite
|
|
54
30
|
composite: |
|
|
55
31
|
class VpcComposite(BaseComposite):
|
|
@@ -81,7 +57,7 @@ kind: Function
|
|
|
81
57
|
metadata:
|
|
82
58
|
name: function-pythonic
|
|
83
59
|
spec:
|
|
84
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1
|
|
60
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.2.1
|
|
85
61
|
```
|
|
86
62
|
## Composed Resource Dependencies
|
|
87
63
|
|
|
@@ -227,9 +203,10 @@ The BaseComposite class provides the following fields for manipulating the Compo
|
|
|
227
203
|
| self.spec | Map | The composite observed spec |
|
|
228
204
|
| self.status | Map | The composite desired and observed status, read from observed if not in desired |
|
|
229
205
|
| self.conditions | Conditions | The composite desired and observed conditions, read from observed if not in desired |
|
|
230
|
-
| self.
|
|
231
|
-
| self.connection |
|
|
206
|
+
| self.results | Results | Returned results applied to the Composite and optionally on the Claim |
|
|
207
|
+
| self.connection | Map | The composite desired connection detials |
|
|
232
208
|
| self.ready | Boolean | The composite desired ready state |
|
|
209
|
+
| self.observed.connection | Map | The composite observed connection detials |
|
|
233
210
|
|
|
234
211
|
The BaseComposite also provides access to the following Crossplane Function level features:
|
|
235
212
|
|
|
@@ -270,7 +247,7 @@ Resource class:
|
|
|
270
247
|
| Resource.data | Map | The resource data |
|
|
271
248
|
| Resource.status | Map | The resource status |
|
|
272
249
|
| Resource.conditions | Conditions | The resource conditions |
|
|
273
|
-
| Resource.connection |
|
|
250
|
+
| Resource.connection | Map | The resource observed connection details |
|
|
274
251
|
| Resource.ready | Boolean | The resource ready state |
|
|
275
252
|
| Resource.unknownsFatal | Boolean | Terminate the composition if this resource has been created and is assigned unknown values, default is Composite.unknownsFatal |
|
|
276
253
|
| Resource.usages | Boolean | Generate Crossplane Usages for this resource, default is Composite.autoReady |
|
|
@@ -310,6 +287,7 @@ Each resource in the list is the following RequiredResource class:
|
|
|
310
287
|
| RequiredResource.data | Map | The required resource data |
|
|
311
288
|
| RequiredResource.status | Map | The required resource status |
|
|
312
289
|
| RequiredResource.conditions | Map | The required resource conditions |
|
|
290
|
+
| RequiredResource.connection | Map | The required resource connection details |
|
|
313
291
|
|
|
314
292
|
### Conditions
|
|
315
293
|
|
|
@@ -326,19 +304,19 @@ The fields are read only for `Resource.conditions` and `RequiredResource.conditi
|
|
|
326
304
|
| Condition.lastTransitionTime | Timestamp | Last transition time, read only |
|
|
327
305
|
| Condition.claim | Boolean | Also apply the condition the claim |
|
|
328
306
|
|
|
329
|
-
###
|
|
307
|
+
### Results
|
|
330
308
|
|
|
331
|
-
The `BaseComposite.
|
|
309
|
+
The `BaseComposite.results` field is a list of results to apply to the Composite and
|
|
332
310
|
optionally to the Claim.
|
|
333
311
|
|
|
334
312
|
| Field | Type | Description |
|
|
335
313
|
| ----- | ---- | ----------- |
|
|
336
|
-
|
|
|
337
|
-
|
|
|
338
|
-
|
|
|
339
|
-
|
|
|
340
|
-
|
|
|
341
|
-
|
|
|
314
|
+
| Result.info | Boolean | Normal informational result |
|
|
315
|
+
| Result.warning | Boolean | Warning level result |
|
|
316
|
+
| Result.fatal | Boolean | Fatal results also terminate composing the Composite |
|
|
317
|
+
| Result.reason | String | PascalCase, machine-readable reason for this result |
|
|
318
|
+
| Result.message | String | Human-readable details about the result |
|
|
319
|
+
| Result.claim | Boolean | Also apply the result to the claim |
|
|
342
320
|
|
|
343
321
|
## Single use Composites
|
|
344
322
|
|
|
@@ -348,7 +326,7 @@ just to run that Composition once in a single use or initialize task?
|
|
|
348
326
|
function-pythonic installs a `Composite` CompositeResourceDefinition that enables
|
|
349
327
|
creating such tasks using a single Composite resource:
|
|
350
328
|
```yaml
|
|
351
|
-
apiVersion: pythonic.
|
|
329
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
352
330
|
kind: Composite
|
|
353
331
|
metadata:
|
|
354
332
|
name: composite-example
|
|
@@ -361,16 +339,62 @@ spec:
|
|
|
361
339
|
|
|
362
340
|
## Quick Start Development
|
|
363
341
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
342
|
+
function-pythonic includes a pure python implementation of the `crossplane render ...`
|
|
343
|
+
command, which can be used to render Compositions that only use function-pythonic. This
|
|
344
|
+
makes it very easy to test and debug using your IDE of choice. It is also blindingly
|
|
345
|
+
fast compared to `crossplane render`. To use, install the `crossplane-function-pythonic`
|
|
346
|
+
python package into the python environment.
|
|
367
347
|
```shell
|
|
368
348
|
$ pip install crossplane-function-pythonic
|
|
369
349
|
```
|
|
370
|
-
|
|
350
|
+
Then to render function-pythonic Compositions, use the `function-pythonic render ...`
|
|
351
|
+
command.
|
|
352
|
+
```shell
|
|
353
|
+
$ function-pythonic render -h
|
|
354
|
+
usage: Crossplane Function Pythonic render [-h] [--debug] [--log-name-width WIDTH] [--python-path DIRECTORY] [--render-unknowns]
|
|
355
|
+
[--allow-oversize-protos] [--context-files KEY=PATH] [--context-values KEY=VALUE]
|
|
356
|
+
[--observed-resources PATH] [--required-resources PATH] [--secret-store PATH] [--include-full-xr]
|
|
357
|
+
[--include-connection-xr] [--include-function-results] [--include-context]
|
|
358
|
+
PATH [PATH/CLASS]
|
|
359
|
+
|
|
360
|
+
positional arguments:
|
|
361
|
+
PATH A YAML file containing the Composite resource to render.
|
|
362
|
+
PATH/CLASS A YAML file containing the Composition resource or the complete path of a function=-pythonic BaseComposite subclass.
|
|
363
|
+
|
|
364
|
+
options:
|
|
365
|
+
-h, --help show this help message and exit
|
|
366
|
+
--debug, -d Emit debug logs.
|
|
367
|
+
--log-name-width WIDTH
|
|
368
|
+
Width of the logger name in the log output, default 40.
|
|
369
|
+
--python-path DIRECTORY
|
|
370
|
+
Filing system directories to add to the python path.
|
|
371
|
+
--render-unknowns, -u
|
|
372
|
+
Render resources with unknowns, useful during local development.
|
|
373
|
+
--allow-oversize-protos
|
|
374
|
+
Allow oversized protobuf messages
|
|
375
|
+
--context-files KEY=PATH
|
|
376
|
+
Context key-value pairs to pass to the Function pipeline. Values must be files containing YAML/JSON.
|
|
377
|
+
--context-values KEY=VALUE
|
|
378
|
+
Context key-value pairs to pass to the Function pipeline. Values must be YAML/JSON. Keys take precedence over --context-files.
|
|
379
|
+
--observed-resources, -o PATH
|
|
380
|
+
A YAML file or directory of YAML files specifying the observed state of composed resources.
|
|
381
|
+
--required-resources, -e PATH
|
|
382
|
+
A YAML file or directory of YAML files specifying required resources to pass to the Function pipeline.
|
|
383
|
+
--secret-store, -s PATH
|
|
384
|
+
A YAML file or directory of YAML files specifying Secrets to use to resolve connections and credentials.
|
|
385
|
+
--include-full-xr, -x
|
|
386
|
+
Include a direct copy of the input XR's spedc and metadata fields in the rendered output.
|
|
387
|
+
--include-connection-xr
|
|
388
|
+
Include the Composite connection values in the rendered output as a resource of kind: Connection.
|
|
389
|
+
--include-function-results, -r
|
|
390
|
+
Include informational and warning messages from Functions in the rendered output as resources of kind: Result..
|
|
391
|
+
--include-context, -c
|
|
392
|
+
Include the context in the rendered output as a resource of kind: Context.
|
|
393
|
+
```
|
|
394
|
+
The following example demonstrates how to locally render function-python compositions. First, create the following files:
|
|
371
395
|
#### xr.yaml
|
|
372
396
|
```yaml
|
|
373
|
-
apiVersion: pythonic.
|
|
397
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
374
398
|
kind: Hello
|
|
375
399
|
metadata:
|
|
376
400
|
name: world
|
|
@@ -382,10 +406,10 @@ spec:
|
|
|
382
406
|
apiVersion: apiextensions.crossplane.io/v1
|
|
383
407
|
kind: Composition
|
|
384
408
|
metadata:
|
|
385
|
-
name: hellos.pythonic.
|
|
409
|
+
name: hellos.pythonic.crossplane.io
|
|
386
410
|
spec:
|
|
387
411
|
compositeTypeRef:
|
|
388
|
-
apiVersion: pythonic.
|
|
412
|
+
apiVersion: pythonic.crossplane.io/v1alpha1
|
|
389
413
|
kind: Hello
|
|
390
414
|
mode: Pipeline
|
|
391
415
|
pipeline:
|
|
@@ -393,50 +417,38 @@ spec:
|
|
|
393
417
|
functionRef:
|
|
394
418
|
name: function-pythonic
|
|
395
419
|
input:
|
|
396
|
-
apiVersion: pythonic.fn.
|
|
420
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
397
421
|
kind: Composite
|
|
398
422
|
composite: |
|
|
399
423
|
class GreetingComposite(BaseComposite):
|
|
400
424
|
def compose(self):
|
|
401
425
|
self.status.greeting = f"Hello, {self.spec.who}!"
|
|
402
426
|
```
|
|
403
|
-
|
|
404
|
-
```yaml
|
|
405
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
406
|
-
kind: Function
|
|
407
|
-
metadata:
|
|
408
|
-
name: function-pythonic
|
|
409
|
-
annotations:
|
|
410
|
-
render.crossplane.io/runtime: Development
|
|
411
|
-
spec:
|
|
412
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
413
|
-
```
|
|
414
|
-
In one terminal session, run function-pythonic:
|
|
415
|
-
```shell
|
|
416
|
-
$ function-pythonic --insecure --debug --render-unknowns
|
|
417
|
-
[2025-08-21 15:32:37.966] grpc._cython.cygrpc [DEBUG ] Using AsyncIOEngine.POLLER as I/O engine
|
|
418
|
-
```
|
|
419
|
-
In another terminal session, render the Composite:
|
|
427
|
+
Then, to render the above composite and composition, run:
|
|
420
428
|
```shell
|
|
421
|
-
$
|
|
429
|
+
$ function-pythonic render --debug --render-unknowns xr.yaml composition.yaml
|
|
430
|
+
[2025-12-29 09:44:57.949] io.crossplane.fn.pythonic.Hello.world [DEBUG ] Starting compose, 1st step, 1st pass
|
|
431
|
+
[2025-12-29 09:44:57.949] io.crossplane.fn.pythonic.Hello.world [INFO ] Completed compose
|
|
422
432
|
---
|
|
423
|
-
apiVersion: pythonic.
|
|
433
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
424
434
|
kind: Hello
|
|
425
435
|
metadata:
|
|
426
436
|
name: world
|
|
427
437
|
status:
|
|
428
438
|
conditions:
|
|
429
|
-
- lastTransitionTime:
|
|
439
|
+
- lastTransitionTime: '2026-01-01T00:00:00Z'
|
|
430
440
|
reason: Available
|
|
431
|
-
status:
|
|
441
|
+
status: 'True'
|
|
432
442
|
type: Ready
|
|
433
|
-
- lastTransitionTime:
|
|
443
|
+
- lastTransitionTime: '2026-01-01T00:00:00Z'
|
|
434
444
|
message: All resources are composed
|
|
435
445
|
reason: AllComposed
|
|
436
|
-
status:
|
|
446
|
+
status: 'True'
|
|
437
447
|
type: ResourcesComposed
|
|
438
448
|
greeting: Hello, World!
|
|
439
449
|
```
|
|
450
|
+
Most of the examples contain a `render.sh` command which uses `function-pythonic render` to
|
|
451
|
+
render the example.
|
|
440
452
|
|
|
441
453
|
## ConfigMap Packages
|
|
442
454
|
|
|
@@ -465,7 +477,7 @@ Then, in your Composition:
|
|
|
465
477
|
functionRef:
|
|
466
478
|
name: function-pythonic
|
|
467
479
|
input:
|
|
468
|
-
apiVersion: pythonic.fn.
|
|
480
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
469
481
|
kind: Composite
|
|
470
482
|
composite: |
|
|
471
483
|
from example.pythonic import features
|
|
@@ -497,7 +509,7 @@ data:
|
|
|
497
509
|
functionRef:
|
|
498
510
|
name: function-pythonic
|
|
499
511
|
input:
|
|
500
|
-
apiVersion: pythonic.fn.
|
|
512
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
501
513
|
kind: Composite
|
|
502
514
|
composite: example.pythonic.features.FeatureOneComposite
|
|
503
515
|
...
|
|
@@ -511,7 +523,7 @@ kind: Function
|
|
|
511
523
|
metadata:
|
|
512
524
|
name: function-pythonic
|
|
513
525
|
spec:
|
|
514
|
-
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1
|
|
526
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.2.1
|
|
515
527
|
runtimeConfigRef:
|
|
516
528
|
name: function-pythonic
|
|
517
529
|
---
|
|
@@ -604,7 +616,7 @@ data:
|
|
|
604
616
|
functionRef:
|
|
605
617
|
name: function-pythonic
|
|
606
618
|
input:
|
|
607
|
-
apiVersion: pythonic.fn.
|
|
619
|
+
apiVersion: pythonic.fn.crossplane.io/v1alpha1
|
|
608
620
|
kind: Composite
|
|
609
621
|
parameters:
|
|
610
622
|
who: World
|