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.
Files changed (126) hide show
  1. crossplane_function_pythonic-0.1.3/README.md → crossplane_function_pythonic-0.1.5/PKG-INFO +64 -4
  2. crossplane_function_pythonic-0.1.3/PKG-INFO → crossplane_function_pythonic-0.1.5/README.md +40 -28
  3. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/composite.py +42 -35
  4. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/function.py +10 -4
  5. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/protobuf.py +18 -10
  6. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/.dev/functions.yaml +1 -1
  7. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/cluster-function-pythonic.yaml +1 -1
  8. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/functions.yaml +1 -1
  9. {crossplane_function_pythonic-0.1.3/examples/import-existing-vpc → crossplane_function_pythonic-0.1.5/examples/eks-cluster}/functions.yaml +1 -1
  10. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/function.yaml +1 -1
  11. {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
  12. {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
  13. {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
  14. {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
  15. {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
  16. {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
  17. crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/getResourceCondition/functions.yaml +9 -0
  18. crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/include/functions.yaml +9 -0
  19. crossplane_function_pythonic-0.1.5/examples/function-go-templating/functions/toYaml/functions.yaml +9 -0
  20. crossplane_function_pythonic-0.1.5/examples/function-go-templating/inline/functions.yaml +9 -0
  21. crossplane_function_pythonic-0.1.5/examples/function-go-templating/recursive/functions.yaml +9 -0
  22. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/functions.yaml +1 -1
  23. {crossplane_function_pythonic-0.1.3/examples/single-purpose → crossplane_function_pythonic-0.1.5/examples/helm-copy-secret}/functions.yaml +1 -1
  24. {crossplane_function_pythonic-0.1.3/examples/eks-cluster → crossplane_function_pythonic-0.1.5/examples/import-existing-vpc}/functions.yaml +1 -1
  25. {crossplane_function_pythonic-0.1.3/examples/helm-copy-secret → crossplane_function_pythonic-0.1.5/examples/single-purpose}/functions.yaml +1 -1
  26. crossplane_function_pythonic-0.1.5/examples/usages-extra/functions.yaml +9 -0
  27. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/pyproject.toml +7 -7
  28. crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/getResourceCondition/functions.yaml +0 -9
  29. crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/include/functions.yaml +0 -9
  30. crossplane_function_pythonic-0.1.3/examples/function-go-templating/functions/toYaml/functions.yaml +0 -9
  31. crossplane_function_pythonic-0.1.3/examples/function-go-templating/inline/functions.yaml +0 -9
  32. crossplane_function_pythonic-0.1.3/examples/function-go-templating/recursive/functions.yaml +0 -9
  33. crossplane_function_pythonic-0.1.3/examples/usages-extra/functions.yaml +0 -9
  34. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/.gitignore +0 -0
  35. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/LICENSE +0 -0
  36. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/__init__.py +0 -0
  37. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/main.py +0 -0
  38. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/crossplane/pythonic/packages.py +0 -0
  39. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/README.md +0 -0
  40. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/aks/kubernetescluster.py +0 -0
  41. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/aks/resourcegroup.py +0 -0
  42. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/composition.yaml +0 -0
  43. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/definition.yaml +0 -0
  44. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/install.sh +0 -0
  45. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/kustomization.yaml +0 -0
  46. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/providers.yaml +0 -0
  47. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/render.sh +0 -0
  48. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/aks-cluster/xr.yaml +0 -0
  49. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/composition-v2.yaml +0 -0
  50. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/composition.yaml +0 -0
  51. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/definition.yaml +0 -0
  52. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/render-v2.sh +0 -0
  53. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/render.sh +0 -0
  54. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/eks-cluster/xr.yaml +0 -0
  55. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/README.md +0 -0
  56. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/composition.yaml +0 -0
  57. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/definition.yaml +0 -0
  58. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/kustomization.yaml +0 -0
  59. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/runtime.yaml +0 -0
  60. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/vcluster.py +0 -0
  61. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/filing-system/vcluster.yaml +0 -0
  62. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/composition.yaml +0 -0
  63. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/render.sh +0 -0
  64. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/xr.yaml +0 -0
  65. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/conditions/xrd.yaml +0 -0
  66. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/composition.yaml +0 -0
  67. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/environmentConfigs.yaml +0 -0
  68. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/render.sh +0 -0
  69. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/xr.yaml +0 -0
  70. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/context/xrd.yaml +0 -0
  71. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/composition.yaml +0 -0
  72. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/extraResources.yaml +0 -0
  73. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/render.sh +0 -0
  74. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/extra-resources/xr.yaml +0 -0
  75. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/composition.yaml +0 -0
  76. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/render.sh +0 -0
  77. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/fromYaml/xr.yaml +0 -0
  78. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/composition.yaml +0 -0
  79. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/observed.yaml +0 -0
  80. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/render.sh +0 -0
  81. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getComposedResource/xr.yaml +0 -0
  82. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/composition.yaml +0 -0
  83. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/render.sh +0 -0
  84. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getCompositeResource/xr.yaml +0 -0
  85. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/composition.yaml +0 -0
  86. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/observed.yaml +0 -0
  87. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/render.sh +0 -0
  88. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/getResourceCondition/xr.yaml +0 -0
  89. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/composition.yaml +0 -0
  90. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/render.sh +0 -0
  91. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/include/xr.yaml +0 -0
  92. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/composition.yaml +0 -0
  93. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/render.sh +0 -0
  94. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/functions/toYaml/xr.yaml +0 -0
  95. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/composition.yaml +0 -0
  96. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/render.sh +0 -0
  97. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/inline/xr.yaml +0 -0
  98. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/composition-real.yaml +0 -0
  99. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/composition-wrapper.yaml +0 -0
  100. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/render.sh +0 -0
  101. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/function-go-templating/recursive/xr.yaml +0 -0
  102. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/composition.yaml +0 -0
  103. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/definition.yaml +0 -0
  104. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/render.sh +0 -0
  105. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/get-started-app/xr.yaml +0 -0
  106. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/composition.yaml +0 -0
  107. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/kustomization.yaml +0 -0
  108. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/render.sh +0 -0
  109. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/run-function.sh +0 -0
  110. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/vcluster.py +0 -0
  111. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/xr.yaml +0 -0
  112. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/helm-copy-secret/xrd.yaml +0 -0
  113. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/README.md +0 -0
  114. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/composition.yaml +0 -0
  115. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/definition.yaml +0 -0
  116. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/observed.yaml +0 -0
  117. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/provider-ec2.yaml +0 -0
  118. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/render.sh +0 -0
  119. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/import-existing-vpc/xr.yaml +0 -0
  120. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/single-purpose/render.sh +0 -0
  121. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/single-purpose/xr.yaml +0 -0
  122. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/composition.yaml +0 -0
  123. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/extraResources.yaml +0 -0
  124. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/observedResources.yaml +0 -0
  125. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.5}/examples/usages-extra/render.sh +0 -0
  126. {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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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 = Connection(observed)
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
- self.clazzes.clear()
28
- if module in sys.modules:
29
- del sys.modules[module]
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.label == field.LABEL_REPEATED:
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 self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
340
- message = message.encode('utf-8')
341
- self._messages[key] = message
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 self._field.type == self._field.TYPE_BYTES and isinstance(message, str):
481
- message = message.encode('utf-8')
482
- if key >= len(self._messages):
483
- self._messages.append(message)
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._messages[key] = message
486
- self._cache.pop(key, None)
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:
@@ -10,4 +10,4 @@ metadata:
10
10
  render.crossplane.io/runtime: Development
11
11
  render.crossplane.io/runtime-development-target: localhost:9443
12
12
  spec:
13
- package: ghcr.io/fortra/function-pythonic:v0.1.3
13
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -3,7 +3,7 @@ kind: Function
3
3
  metadata:
4
4
  name: function-pythonic
5
5
  spec:
6
- package: ghcr.io/fortra/function-pythonic:v0.1.3
6
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
7
7
  runtimeConfigRef:
8
8
  name: function-pythonic
9
9
  ---
@@ -5,6 +5,6 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
9
9
  runtimeConfigRef:
10
10
  name: function-pythonic
@@ -5,4 +5,4 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -3,7 +3,7 @@ kind: Function
3
3
  metadata:
4
4
  name: function-pythonic
5
5
  spec:
6
- package: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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: ghcr.io/fortra/function-pythonic:v0.1.3
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
@@ -6,4 +6,4 @@ metadata:
6
6
  # This tells crossplane beta render to connect to the function locally.
7
7
  render.crossplane.io/runtime: Development
8
8
  spec:
9
- package: ghcr.io/fortra/function-pythonic:v0.1.3
9
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -6,4 +6,4 @@ metadata:
6
6
  # This tells crossplane beta render to connect to the function locally.
7
7
  render.crossplane.io/runtime: Development
8
8
  spec:
9
- package: ghcr.io/fortra/function-pythonic:v0.1.3
9
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -6,4 +6,4 @@ metadata:
6
6
  # This tells crossplane beta render to connect to the function locally.
7
7
  render.crossplane.io/runtime: Development
8
8
  spec:
9
- package: ghcr.io/fortra/function-pythonic:v0.1.3
9
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -6,4 +6,4 @@ metadata:
6
6
  # This tells crossplane beta render to connect to the function locally.
7
7
  render.crossplane.io/runtime: Development
8
8
  spec:
9
- package: ghcr.io/fortra/function-pythonic:v0.1.3
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
@@ -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
@@ -5,4 +5,4 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -5,4 +5,4 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -5,4 +5,4 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ package: xpkg.upbound.io/crossplane-contrib/function-pythonic:v0.1.5
@@ -5,4 +5,4 @@ metadata:
5
5
  annotations:
6
6
  render.crossplane.io/runtime: Development
7
7
  spec:
8
- package: ghcr.io/fortra/function-pythonic:v0.1.3
8
+ 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.11,<3.14"
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.9.0",
21
- "pyyaml==6.0.2",
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.38.0"]
26
- pip-install = ["pip==25.2"]
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.74.0",
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
@@ -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
@@ -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