crossplane-function-pythonic 0.1.3__tar.gz → 0.1.5__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.3/README.md → crossplane_function_pythonic-0.1.5/PKG-INFO +64 -4
- crossplane_function_pythonic-0.1.3/PKG-INFO → crossplane_function_pythonic-0.1.5/README.md +40 -28
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/composite.py +42 -35
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/function.py +10 -4
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/protobuf.py +18 -10
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/.dev/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/cluster-function-pythonic.yaml +1 -1
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/import-existing-vpc → crossplane_function_pythonic-0.1.5/examples/eks-cluster}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/function.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/context → crossplane_function_pythonic-0.1.5/examples/function-go-templating/conditions}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/conditions → crossplane_function_pythonic-0.1.5/examples/function-go-templating/context}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/fromYaml → crossplane_function_pythonic-0.1.5/examples/function-go-templating/extra-resources}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/getComposedResource → crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/fromYaml}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/getCompositeResource → crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getComposedResource}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/function-go-templating/extra-resources → crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getCompositeResource}/functions.yaml +1 -1
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getResourceCondition/functions.yaml +9 -0
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/include/functions.yaml +9 -0
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/toYaml/functions.yaml +9 -0
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/inline/functions.yaml +9 -0
- crossplane_function_pythonic-0.1.5/examples/function-go-templating/recursive/functions.yaml +9 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/single-purpose → crossplane_function_pythonic-0.1.5/examples/helm-copy-secret}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/eks-cluster → crossplane_function_pythonic-0.1.5/examples/import-existing-vpc}/functions.yaml +1 -1
- {crossplane_function_pythonic-0.1.3/examples/helm-copy-secret → crossplane_function_pythonic-0.1.5/examples/single-purpose}/functions.yaml +1 -1
- crossplane_function_pythonic-0.1.5/examples/usages-extra/functions.yaml +9 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/pyproject.toml +7 -7
- crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/getResourceCondition/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/include/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/toYaml/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.3/examples/function-go-templating/inline/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.3/examples/function-go-templating/recursive/functions.yaml +0 -9
- crossplane_function_pythonic-0.1.3/examples/usages-extra/functions.yaml +0 -9
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/.gitignore +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/LICENSE +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/__init__.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/main.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/packages.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/README.md +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/aks/kubernetescluster.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/aks/resourcegroup.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/install.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/providers.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/composition-v2.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/render-v2.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/README.md +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/runtime.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/vcluster.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/vcluster.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/environmentConfigs.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/extraResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/composition-real.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/composition-wrapper.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/kustomization.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/run-function.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/vcluster.py +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/xrd.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/README.md +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/definition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/observed.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/provider-ec2.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/single-purpose/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/single-purpose/xr.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/composition.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/extraResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/observedResources.yaml +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/render.sh +0 -0
- {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/xr.yaml +0 -0
|
@@ -1,3 +1,27 @@
|
|
|
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
|
+
|
|
1
25
|
# function-pythonic
|
|
2
26
|
|
|
3
27
|
## Introduction
|
|
@@ -57,7 +81,7 @@ kind: Function
|
|
|
57
81
|
metadata:
|
|
58
82
|
name: function-pythonic
|
|
59
83
|
spec:
|
|
60
|
-
package:
|
|
84
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
61
85
|
```
|
|
62
86
|
## Composed Resource Dependencies
|
|
63
87
|
|
|
@@ -203,8 +227,8 @@ 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.connection | Connection | The composite desired and observed connection detials, read from observed if not in desired |
|
|
207
230
|
| self.events | Events | Returned events against the Composite and optionally on the Claim |
|
|
231
|
+
| self.connection | Connection | The composite desired and observed connection detials, read from observed if not in desired |
|
|
208
232
|
| self.ready | Boolean | The composite desired ready state |
|
|
209
233
|
|
|
210
234
|
The BaseComposite also provides access to the following Crossplane Function level features:
|
|
@@ -214,6 +238,7 @@ The BaseComposite also provides access to the following Crossplane Function leve
|
|
|
214
238
|
| self.request | Message | Low level direct access to the RunFunctionRequest message |
|
|
215
239
|
| self.response | Message | Low level direct access to the RunFunctionResponse message |
|
|
216
240
|
| self.logger | Logger | Python logger to log messages to the running function stdout |
|
|
241
|
+
| self.parameters | Map | The configured step parameters |
|
|
217
242
|
| self.ttl | Integer | Get or set the response TTL, in seconds |
|
|
218
243
|
| self.credentials | Credentials | The request credentials |
|
|
219
244
|
| self.context | Map | The response context, initialized from the request context |
|
|
@@ -384,7 +409,7 @@ metadata:
|
|
|
384
409
|
annotations:
|
|
385
410
|
render.crossplane.io/runtime: Development
|
|
386
411
|
spec:
|
|
387
|
-
package:
|
|
412
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
388
413
|
```
|
|
389
414
|
In one terminal session, run function-pythonic:
|
|
390
415
|
```shell
|
|
@@ -486,7 +511,7 @@ kind: Function
|
|
|
486
511
|
metadata:
|
|
487
512
|
name: function-pythonic
|
|
488
513
|
spec:
|
|
489
|
-
package:
|
|
514
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
490
515
|
runtimeConfigRef:
|
|
491
516
|
name: function-pythonic
|
|
492
517
|
---
|
|
@@ -552,6 +577,41 @@ Secrets can also be used in an identical manner as ConfigMaps by enabling the
|
|
|
552
577
|
`--packages-secrets` command line option. Secrets permissions need to be
|
|
553
578
|
added to the above RBAC configuration.
|
|
554
579
|
|
|
580
|
+
## Step Parameters
|
|
581
|
+
|
|
582
|
+
Step specific parameters can be configured to be used by the composite
|
|
583
|
+
implementation. This is useful when setting the composite to the python class.
|
|
584
|
+
For example:
|
|
585
|
+
```yaml
|
|
586
|
+
apiVersion: v1
|
|
587
|
+
kind: ConfigMap
|
|
588
|
+
metadata:
|
|
589
|
+
namespace: crossplane-system
|
|
590
|
+
name: example-pythonic
|
|
591
|
+
labels:
|
|
592
|
+
function-pythonic.package: example.pythonic
|
|
593
|
+
data:
|
|
594
|
+
features.py: |
|
|
595
|
+
from crossplane.pythonic import BaseComposite
|
|
596
|
+
class GreetingComposite(BaseComposite):
|
|
597
|
+
def compose(self):
|
|
598
|
+
cm = self.resources.ConfigMap('v1', 'ConfigMap')
|
|
599
|
+
cm.data.greeting = f"Hello, {self.parameters.who}!"
|
|
600
|
+
```
|
|
601
|
+
```yaml
|
|
602
|
+
...
|
|
603
|
+
- step: pythonic
|
|
604
|
+
functionRef:
|
|
605
|
+
name: function-pythonic
|
|
606
|
+
input:
|
|
607
|
+
apiVersion: pythonic.fn.fortra.com/v1alpha1
|
|
608
|
+
kind: Composite
|
|
609
|
+
parameters:
|
|
610
|
+
who: World
|
|
611
|
+
composite: example.pythonic.features.GreetingComposite
|
|
612
|
+
...
|
|
613
|
+
```
|
|
614
|
+
|
|
555
615
|
## Filing System Packages
|
|
556
616
|
|
|
557
617
|
Composition Composite implementations can be coded in a stand alone python files
|
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: crossplane-function-pythonic
|
|
3
|
-
Version: 0.1.3
|
|
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.11
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
-
Requires-Python: <3.14,>=3.11
|
|
17
|
-
Requires-Dist: crossplane-function-sdk-python==0.9.0
|
|
18
|
-
Requires-Dist: pyyaml==6.0.2
|
|
19
|
-
Provides-Extra: packages
|
|
20
|
-
Requires-Dist: kopf==1.38.0; extra == 'packages'
|
|
21
|
-
Provides-Extra: pip-install
|
|
22
|
-
Requires-Dist: pip==25.2; extra == 'pip-install'
|
|
23
|
-
Description-Content-Type: text/markdown
|
|
24
|
-
|
|
25
1
|
# function-pythonic
|
|
26
2
|
|
|
27
3
|
## Introduction
|
|
@@ -81,7 +57,7 @@ kind: Function
|
|
|
81
57
|
metadata:
|
|
82
58
|
name: function-pythonic
|
|
83
59
|
spec:
|
|
84
|
-
package:
|
|
60
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
85
61
|
```
|
|
86
62
|
## Composed Resource Dependencies
|
|
87
63
|
|
|
@@ -227,8 +203,8 @@ 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.connection | Connection | The composite desired and observed connection detials, read from observed if not in desired |
|
|
231
206
|
| self.events | Events | Returned events against the Composite and optionally on the Claim |
|
|
207
|
+
| self.connection | Connection | The composite desired and observed connection detials, read from observed if not in desired |
|
|
232
208
|
| self.ready | Boolean | The composite desired ready state |
|
|
233
209
|
|
|
234
210
|
The BaseComposite also provides access to the following Crossplane Function level features:
|
|
@@ -238,6 +214,7 @@ The BaseComposite also provides access to the following Crossplane Function leve
|
|
|
238
214
|
| self.request | Message | Low level direct access to the RunFunctionRequest message |
|
|
239
215
|
| self.response | Message | Low level direct access to the RunFunctionResponse message |
|
|
240
216
|
| self.logger | Logger | Python logger to log messages to the running function stdout |
|
|
217
|
+
| self.parameters | Map | The configured step parameters |
|
|
241
218
|
| self.ttl | Integer | Get or set the response TTL, in seconds |
|
|
242
219
|
| self.credentials | Credentials | The request credentials |
|
|
243
220
|
| self.context | Map | The response context, initialized from the request context |
|
|
@@ -408,7 +385,7 @@ metadata:
|
|
|
408
385
|
annotations:
|
|
409
386
|
render.crossplane.io/runtime: Development
|
|
410
387
|
spec:
|
|
411
|
-
package:
|
|
388
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
412
389
|
```
|
|
413
390
|
In one terminal session, run function-pythonic:
|
|
414
391
|
```shell
|
|
@@ -510,7 +487,7 @@ kind: Function
|
|
|
510
487
|
metadata:
|
|
511
488
|
name: function-pythonic
|
|
512
489
|
spec:
|
|
513
|
-
package:
|
|
490
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
514
491
|
runtimeConfigRef:
|
|
515
492
|
name: function-pythonic
|
|
516
493
|
---
|
|
@@ -576,6 +553,41 @@ Secrets can also be used in an identical manner as ConfigMaps by enabling the
|
|
|
576
553
|
`--packages-secrets` command line option. Secrets permissions need to be
|
|
577
554
|
added to the above RBAC configuration.
|
|
578
555
|
|
|
556
|
+
## Step Parameters
|
|
557
|
+
|
|
558
|
+
Step specific parameters can be configured to be used by the composite
|
|
559
|
+
implementation. This is useful when setting the composite to the python class.
|
|
560
|
+
For example:
|
|
561
|
+
```yaml
|
|
562
|
+
apiVersion: v1
|
|
563
|
+
kind: ConfigMap
|
|
564
|
+
metadata:
|
|
565
|
+
namespace: crossplane-system
|
|
566
|
+
name: example-pythonic
|
|
567
|
+
labels:
|
|
568
|
+
function-pythonic.package: example.pythonic
|
|
569
|
+
data:
|
|
570
|
+
features.py: |
|
|
571
|
+
from crossplane.pythonic import BaseComposite
|
|
572
|
+
class GreetingComposite(BaseComposite):
|
|
573
|
+
def compose(self):
|
|
574
|
+
cm = self.resources.ConfigMap('v1', 'ConfigMap')
|
|
575
|
+
cm.data.greeting = f"Hello, {self.parameters.who}!"
|
|
576
|
+
```
|
|
577
|
+
```yaml
|
|
578
|
+
...
|
|
579
|
+
- step: pythonic
|
|
580
|
+
functionRef:
|
|
581
|
+
name: function-pythonic
|
|
582
|
+
input:
|
|
583
|
+
apiVersion: pythonic.fn.fortra.com/v1alpha1
|
|
584
|
+
kind: Composite
|
|
585
|
+
parameters:
|
|
586
|
+
who: World
|
|
587
|
+
composite: example.pythonic.features.GreetingComposite
|
|
588
|
+
...
|
|
589
|
+
```
|
|
590
|
+
|
|
579
591
|
## Filing System Packages
|
|
580
592
|
|
|
581
593
|
Composition Composite implementations can be coded in a stand alone python files
|
|
@@ -10,7 +10,7 @@ _notset = object()
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class BaseComposite:
|
|
13
|
-
def __init__(self, request, logger):
|
|
13
|
+
def __init__(self, request, single_use, logger):
|
|
14
14
|
self.request = protobuf.Message(None, 'request', request.DESCRIPTOR, request, 'Function Request')
|
|
15
15
|
response = fnv1.RunFunctionResponse(
|
|
16
16
|
meta=fnv1.ResponseMeta(
|
|
@@ -24,6 +24,10 @@ class BaseComposite:
|
|
|
24
24
|
)
|
|
25
25
|
self.response = protobuf.Message(None, 'response', response.DESCRIPTOR, response)
|
|
26
26
|
self.logger = logger
|
|
27
|
+
if single_use:
|
|
28
|
+
self.parameters = self.request.observed.composite.resource.spec.parameters
|
|
29
|
+
else:
|
|
30
|
+
self.parameters = self.request.input.parameters
|
|
27
31
|
self.credentials = Credentials(self.request)
|
|
28
32
|
self.context = self.response.context
|
|
29
33
|
self.environment = self.context['apiextensions.crossplane.io/environment']
|
|
@@ -43,7 +47,6 @@ class BaseComposite:
|
|
|
43
47
|
self.spec = self.observed.spec
|
|
44
48
|
self.status = self.desired.status
|
|
45
49
|
self.conditions = Conditions(observed, self.response)
|
|
46
|
-
self.connection = Connection(observed, desired)
|
|
47
50
|
self.events = Events(self.response)
|
|
48
51
|
|
|
49
52
|
@property
|
|
@@ -66,6 +69,16 @@ class BaseComposite:
|
|
|
66
69
|
else:
|
|
67
70
|
raise ValueError('ttl must be an int or float')
|
|
68
71
|
|
|
72
|
+
@property
|
|
73
|
+
def connection(self):
|
|
74
|
+
return self.response.desired.composite.connection_details
|
|
75
|
+
|
|
76
|
+
@connection.setter
|
|
77
|
+
def connection(self, connection):
|
|
78
|
+
self.response.desired.composite.connection_details()
|
|
79
|
+
for key, value in connection:
|
|
80
|
+
self.response.desired.composite.connection_details[key] = value
|
|
81
|
+
|
|
69
82
|
@property
|
|
70
83
|
def ready(self):
|
|
71
84
|
ready = self.desired._parent.ready
|
|
@@ -189,7 +202,7 @@ class Resource:
|
|
|
189
202
|
self.observed = observed.resource
|
|
190
203
|
self.desired = desired.resource
|
|
191
204
|
self.conditions = Conditions(observed)
|
|
192
|
-
self.connection =
|
|
205
|
+
self.connection = observed.connection_details
|
|
193
206
|
self.unknownsFatal = None
|
|
194
207
|
self.autoReady = None
|
|
195
208
|
self.usages = None
|
|
@@ -436,6 +449,32 @@ class Conditions:
|
|
|
436
449
|
def __getitem__(self, type):
|
|
437
450
|
return Condition(self, type)
|
|
438
451
|
|
|
452
|
+
def __bool__(self):
|
|
453
|
+
if self._response is not None:
|
|
454
|
+
if self._response.conditions:
|
|
455
|
+
return True
|
|
456
|
+
if self._observed.resource.status.conditions:
|
|
457
|
+
return True
|
|
458
|
+
return False
|
|
459
|
+
|
|
460
|
+
def __len__(self):
|
|
461
|
+
return len(self._types())
|
|
462
|
+
|
|
463
|
+
def __iter__(self):
|
|
464
|
+
for type in self._types():
|
|
465
|
+
yield self[type]
|
|
466
|
+
|
|
467
|
+
def _types(self):
|
|
468
|
+
types = set()
|
|
469
|
+
if self._response is not None:
|
|
470
|
+
for condition in self._response.conditions:
|
|
471
|
+
if condition.type:
|
|
472
|
+
types.add(str(condition.type))
|
|
473
|
+
for condition in self._observed.resource.status.conditions:
|
|
474
|
+
if condition.type:
|
|
475
|
+
types.add(str(condition.type))
|
|
476
|
+
return sorted(types)
|
|
477
|
+
|
|
439
478
|
|
|
440
479
|
class Condition(protobuf.ProtobufValue):
|
|
441
480
|
def __init__(self, conditions, type):
|
|
@@ -554,38 +593,6 @@ class Condition(protobuf.ProtobufValue):
|
|
|
554
593
|
return self._conditions._response.conditions.append(condition)
|
|
555
594
|
|
|
556
595
|
|
|
557
|
-
class Connection:
|
|
558
|
-
def __init__(self, observed, desired=None):
|
|
559
|
-
self.__dict__['_observed'] = observed
|
|
560
|
-
self.__dict__['_desired'] = desired
|
|
561
|
-
|
|
562
|
-
def __bool__(self):
|
|
563
|
-
if self._desired is not None and len(self._desired.connection_details) > 0:
|
|
564
|
-
return True
|
|
565
|
-
if self._observed is not None and len(self._observed.connection_details) > 0:
|
|
566
|
-
return True
|
|
567
|
-
return False
|
|
568
|
-
|
|
569
|
-
def __getattr__(self, key):
|
|
570
|
-
return self[key]
|
|
571
|
-
|
|
572
|
-
def __getitem__(self, key):
|
|
573
|
-
value = None
|
|
574
|
-
if self._desired is not None and key in self._desired.connection_details:
|
|
575
|
-
value = self._desired.connection_details[key]
|
|
576
|
-
if value is None and key in self._observed.connection_details:
|
|
577
|
-
value = self._observed.connection_details[key]
|
|
578
|
-
return value
|
|
579
|
-
|
|
580
|
-
def __setattr__(self, key, value):
|
|
581
|
-
self[key] = value
|
|
582
|
-
|
|
583
|
-
def __setitem__(self, key, value):
|
|
584
|
-
if self._desired is None:
|
|
585
|
-
raise ValueError('Connection is read only')
|
|
586
|
-
self._desired.connection_details[key] = value
|
|
587
|
-
|
|
588
|
-
|
|
589
596
|
class Events:
|
|
590
597
|
def __init__(self, response):
|
|
591
598
|
self._results = response.results
|
|
@@ -24,10 +24,14 @@ class FunctionRunner(grpcv1.FunctionRunnerService):
|
|
|
24
24
|
self.clazzes = {}
|
|
25
25
|
|
|
26
26
|
def invalidate_module(self, module):
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
ix = len(module)
|
|
28
|
+
while ix > 0:
|
|
29
|
+
module = module[:ix]
|
|
30
|
+
if module in sys.modules:
|
|
31
|
+
del sys.modules[module]
|
|
32
|
+
ix = module.rfind('.')
|
|
30
33
|
importlib.invalidate_caches()
|
|
34
|
+
self.clazzes.clear()
|
|
31
35
|
|
|
32
36
|
async def RunFunction(
|
|
33
37
|
self, request: fnv1.RunFunctionRequest, _: grpc.aio.ServicerContext
|
|
@@ -47,10 +51,12 @@ class FunctionRunner(grpcv1.FunctionRunnerService):
|
|
|
47
51
|
if composite['apiVersion'] == 'pythonic.fortra.com/v1alpha1' and composite['kind'] == 'Composite':
|
|
48
52
|
if 'spec' not in composite or 'composite' not in composite['spec']:
|
|
49
53
|
return self.fatal(request, logger, 'Missing spec "composite"')
|
|
54
|
+
single_use = True
|
|
50
55
|
composite = composite['spec']['composite']
|
|
51
56
|
else:
|
|
52
57
|
if 'composite' not in request.input:
|
|
53
58
|
return self.fatal(request, logger, 'Missing input "composite"')
|
|
59
|
+
single_use = False
|
|
54
60
|
composite = request.input['composite']
|
|
55
61
|
|
|
56
62
|
# Ideally this is something the Function API provides
|
|
@@ -94,7 +100,7 @@ class FunctionRunner(grpcv1.FunctionRunnerService):
|
|
|
94
100
|
self.clazzes[composite] = clazz
|
|
95
101
|
|
|
96
102
|
try:
|
|
97
|
-
composite = clazz(request, logger)
|
|
103
|
+
composite = clazz(request, single_use, logger)
|
|
98
104
|
except Exception as e:
|
|
99
105
|
return self.fatal(request, logger, 'Instantiate', e)
|
|
100
106
|
|
|
@@ -81,7 +81,7 @@ class Message:
|
|
|
81
81
|
value = getattr(self._message, key)
|
|
82
82
|
if value is _Unknown and field.has_default_value:
|
|
83
83
|
value = field.default_value
|
|
84
|
-
if field.
|
|
84
|
+
if field.is_repeated:
|
|
85
85
|
if field.type == field.TYPE_MESSAGE and field.message_type.GetOptions().map_entry:
|
|
86
86
|
value = MapMessage(self, key, field.message_type.fields_by_name['value'], value, self._readOnly)
|
|
87
87
|
else:
|
|
@@ -336,9 +336,12 @@ class MapMessage:
|
|
|
336
336
|
message = message._value
|
|
337
337
|
elif isinstance(message, Value):
|
|
338
338
|
message = message._raw
|
|
339
|
-
if
|
|
340
|
-
|
|
341
|
-
|
|
339
|
+
if message is _Unknown:
|
|
340
|
+
self._messages.pop(key, None)
|
|
341
|
+
else:
|
|
342
|
+
if self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
|
|
343
|
+
message = message.encode('utf-8')
|
|
344
|
+
self._messages[key] = message
|
|
342
345
|
self._cache.pop(key, None)
|
|
343
346
|
|
|
344
347
|
def __delattr__(self, key):
|
|
@@ -477,13 +480,18 @@ class RepeatedMessage:
|
|
|
477
480
|
message = message._value
|
|
478
481
|
elif isinstance(message, Value):
|
|
479
482
|
message = message._raw
|
|
480
|
-
if
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
483
|
+
if message is _Unknown:
|
|
484
|
+
if key < len(self._messages):
|
|
485
|
+
self._messages.pop(key)
|
|
486
|
+
self._cache.clear()
|
|
484
487
|
else:
|
|
485
|
-
self.
|
|
486
|
-
|
|
488
|
+
if self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
|
|
489
|
+
message = message.encode('utf-8')
|
|
490
|
+
if key >= len(self._messages):
|
|
491
|
+
self._messages.append(message)
|
|
492
|
+
else:
|
|
493
|
+
self._messages[key] = message
|
|
494
|
+
self._cache.pop(key, None)
|
|
487
495
|
|
|
488
496
|
def __delitem__(self, key):
|
|
489
497
|
if self._readOnly:
|
|
@@ -3,7 +3,7 @@ kind: Function
|
|
|
3
3
|
metadata:
|
|
4
4
|
name: function-pythonic
|
|
5
5
|
spec:
|
|
6
|
-
package:
|
|
6
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
7
7
|
runtimeConfigRef:
|
|
8
8
|
apiVersion: pkg.crossplane.io/v1beta1
|
|
9
9
|
kind: DeploymentRuntimeConfig
|
|
@@ -15,7 +15,7 @@ metadata:
|
|
|
15
15
|
# This tells crossplane beta render to connect to the function locally.
|
|
16
16
|
render.crossplane.io/runtime: Development
|
|
17
17
|
spec:
|
|
18
|
-
package:
|
|
18
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
19
19
|
---
|
|
20
20
|
apiVersion: pkg.crossplane.io/v1beta1
|
|
21
21
|
kind: Function
|
|
@@ -15,7 +15,7 @@ metadata:
|
|
|
15
15
|
# This tells crossplane beta render to connect to the function locally.
|
|
16
16
|
render.crossplane.io/runtime: Development
|
|
17
17
|
spec:
|
|
18
|
-
package:
|
|
18
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
19
19
|
---
|
|
20
20
|
apiVersion: pkg.crossplane.io/v1beta1
|
|
21
21
|
kind: Function
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/include/functions.yaml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/toYaml/functions.yaml
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
+
kind: Function
|
|
3
|
+
metadata:
|
|
4
|
+
name: function-pythonic
|
|
5
|
+
annotations:
|
|
6
|
+
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
+
render.crossplane.io/runtime: Development
|
|
8
|
+
spec:
|
|
9
|
+
package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
|
|
@@ -2,28 +2,28 @@
|
|
|
2
2
|
name = "crossplane-function-pythonic"
|
|
3
3
|
description = 'A Python centric Crossplane Function'
|
|
4
4
|
readme = "README.md"
|
|
5
|
-
requires-python = ">=3.
|
|
5
|
+
requires-python = ">=3.12,<3.15"
|
|
6
6
|
license = "Apache-2.0"
|
|
7
7
|
keywords = []
|
|
8
8
|
authors = [{ name = "Patrick J McNerthney", email = "pat@mcnerthney.com" }]
|
|
9
9
|
classifiers = [
|
|
10
10
|
"Development Status :: 4 - Beta",
|
|
11
11
|
"Programming Language :: Python",
|
|
12
|
-
"Programming Language :: Python :: 3.11",
|
|
13
12
|
"Programming Language :: Python :: 3.12",
|
|
14
13
|
"Programming Language :: Python :: 3.13",
|
|
14
|
+
"Programming Language :: Python :: 3.14",
|
|
15
15
|
]
|
|
16
16
|
|
|
17
17
|
dynamic = ["version"]
|
|
18
18
|
|
|
19
19
|
dependencies = [
|
|
20
|
-
"crossplane-function-sdk-python==0.
|
|
21
|
-
"pyyaml==6.0.
|
|
20
|
+
"crossplane-function-sdk-python==0.10.0",
|
|
21
|
+
"pyyaml==6.0.3",
|
|
22
22
|
]
|
|
23
23
|
|
|
24
24
|
[project.optional-dependencies]
|
|
25
|
-
packages = ["kopf==1.
|
|
26
|
-
pip-install = ["pip==25.
|
|
25
|
+
packages = ["kopf==1.39.0"]
|
|
26
|
+
pip-install = ["pip==25.3"]
|
|
27
27
|
|
|
28
28
|
[project.urls]
|
|
29
29
|
Documentation = "https://github.com/fortra/function-pythonic#readme"
|
|
@@ -75,7 +75,7 @@ check = "ruff check crossplane tests && ruff format --diff crossplane tests"
|
|
|
75
75
|
type = "virtual"
|
|
76
76
|
path = ".venv-test"
|
|
77
77
|
dependencies = [
|
|
78
|
-
"grpcio-tools==1.
|
|
78
|
+
"grpcio-tools==1.76.0",
|
|
79
79
|
"pytest==8.4.1",
|
|
80
80
|
"pytest-asyncio==1.1.0",
|
|
81
81
|
"pytest-cov==6.2.1",
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/include/functions.yaml
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/toYaml/functions.yaml
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
apiVersion: pkg.crossplane.io/v1beta1
|
|
2
|
-
kind: Function
|
|
3
|
-
metadata:
|
|
4
|
-
name: function-pythonic
|
|
5
|
-
annotations:
|
|
6
|
-
# This tells crossplane beta render to connect to the function locally.
|
|
7
|
-
render.crossplane.io/runtime: Development
|
|
8
|
-
spec:
|
|
9
|
-
package: ghcr.io/fortra/function-pythonic:v0.1.3
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|