crossplane-function-pythonic 0.1.3__tar.gz → 0.1.4__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 (120) hide show
  1. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/PKG-INFO +38 -2
  2. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/README.md +37 -1
  3. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/composite.py +16 -35
  4. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/function.py +3 -1
  5. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/protobuf.py +17 -9
  6. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/.gitignore +0 -0
  7. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/LICENSE +0 -0
  8. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/__init__.py +0 -0
  9. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/main.py +0 -0
  10. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/crossplane/pythonic/packages.py +0 -0
  11. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/.dev/functions.yaml +0 -0
  12. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/README.md +0 -0
  13. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/aks/kubernetescluster.py +0 -0
  14. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/aks/resourcegroup.py +0 -0
  15. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/cluster-function-pythonic.yaml +0 -0
  16. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/composition.yaml +0 -0
  17. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/definition.yaml +0 -0
  18. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/functions.yaml +0 -0
  19. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/install.sh +0 -0
  20. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/kustomization.yaml +0 -0
  21. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/providers.yaml +0 -0
  22. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/render.sh +0 -0
  23. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/aks-cluster/xr.yaml +0 -0
  24. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/composition-v2.yaml +0 -0
  25. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/composition.yaml +0 -0
  26. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/definition.yaml +0 -0
  27. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/functions.yaml +0 -0
  28. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/render-v2.sh +0 -0
  29. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/render.sh +0 -0
  30. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/eks-cluster/xr.yaml +0 -0
  31. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/README.md +0 -0
  32. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/composition.yaml +0 -0
  33. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/definition.yaml +0 -0
  34. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/function.yaml +0 -0
  35. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/kustomization.yaml +0 -0
  36. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/runtime.yaml +0 -0
  37. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/vcluster.py +0 -0
  38. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/filing-system/vcluster.yaml +0 -0
  39. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/conditions/composition.yaml +0 -0
  40. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/conditions/functions.yaml +0 -0
  41. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/conditions/render.sh +0 -0
  42. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/conditions/xr.yaml +0 -0
  43. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/conditions/xrd.yaml +0 -0
  44. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/composition.yaml +0 -0
  45. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/environmentConfigs.yaml +0 -0
  46. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/functions.yaml +0 -0
  47. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/render.sh +0 -0
  48. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/xr.yaml +0 -0
  49. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/context/xrd.yaml +0 -0
  50. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/extra-resources/composition.yaml +0 -0
  51. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/extra-resources/extraResources.yaml +0 -0
  52. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/extra-resources/functions.yaml +0 -0
  53. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/extra-resources/render.sh +0 -0
  54. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/extra-resources/xr.yaml +0 -0
  55. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/fromYaml/composition.yaml +0 -0
  56. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/fromYaml/functions.yaml +0 -0
  57. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/fromYaml/render.sh +0 -0
  58. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/fromYaml/xr.yaml +0 -0
  59. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getComposedResource/composition.yaml +0 -0
  60. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getComposedResource/functions.yaml +0 -0
  61. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getComposedResource/observed.yaml +0 -0
  62. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getComposedResource/render.sh +0 -0
  63. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getComposedResource/xr.yaml +0 -0
  64. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getCompositeResource/composition.yaml +0 -0
  65. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getCompositeResource/functions.yaml +0 -0
  66. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getCompositeResource/render.sh +0 -0
  67. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getCompositeResource/xr.yaml +0 -0
  68. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getResourceCondition/composition.yaml +0 -0
  69. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getResourceCondition/functions.yaml +0 -0
  70. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getResourceCondition/observed.yaml +0 -0
  71. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getResourceCondition/render.sh +0 -0
  72. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/getResourceCondition/xr.yaml +0 -0
  73. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/include/composition.yaml +0 -0
  74. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/include/functions.yaml +0 -0
  75. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/include/render.sh +0 -0
  76. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/include/xr.yaml +0 -0
  77. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/toYaml/composition.yaml +0 -0
  78. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/toYaml/functions.yaml +0 -0
  79. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/toYaml/render.sh +0 -0
  80. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/functions/toYaml/xr.yaml +0 -0
  81. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/inline/composition.yaml +0 -0
  82. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/inline/functions.yaml +0 -0
  83. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/inline/render.sh +0 -0
  84. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/inline/xr.yaml +0 -0
  85. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/recursive/composition-real.yaml +0 -0
  86. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/recursive/composition-wrapper.yaml +0 -0
  87. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/recursive/functions.yaml +0 -0
  88. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/recursive/render.sh +0 -0
  89. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/function-go-templating/recursive/xr.yaml +0 -0
  90. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/get-started-app/composition.yaml +0 -0
  91. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/get-started-app/definition.yaml +0 -0
  92. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/get-started-app/functions.yaml +0 -0
  93. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/get-started-app/render.sh +0 -0
  94. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/get-started-app/xr.yaml +0 -0
  95. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/composition.yaml +0 -0
  96. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/functions.yaml +0 -0
  97. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/kustomization.yaml +0 -0
  98. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/render.sh +0 -0
  99. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/run-function.sh +0 -0
  100. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/vcluster.py +0 -0
  101. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/xr.yaml +0 -0
  102. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/helm-copy-secret/xrd.yaml +0 -0
  103. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/README.md +0 -0
  104. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/composition.yaml +0 -0
  105. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/definition.yaml +0 -0
  106. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/functions.yaml +0 -0
  107. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/observed.yaml +0 -0
  108. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/provider-ec2.yaml +0 -0
  109. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/render.sh +0 -0
  110. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/import-existing-vpc/xr.yaml +0 -0
  111. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/single-purpose/functions.yaml +0 -0
  112. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/single-purpose/render.sh +0 -0
  113. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/single-purpose/xr.yaml +0 -0
  114. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/composition.yaml +0 -0
  115. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/extraResources.yaml +0 -0
  116. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/functions.yaml +0 -0
  117. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/observedResources.yaml +0 -0
  118. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/render.sh +0 -0
  119. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/examples/usages-extra/xr.yaml +0 -0
  120. {crossplane_function_pythonic-0.1.3 → crossplane_function_pythonic-0.1.4}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crossplane-function-pythonic
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: A Python centric Crossplane Function
5
5
  Project-URL: Documentation, https://github.com/fortra/function-pythonic#readme
6
6
  Project-URL: Issues, https://github.com/fortra/function-pythonic/issues
@@ -227,8 +227,8 @@ The BaseComposite class provides the following fields for manipulating the Compo
227
227
  | self.spec | Map | The composite observed spec |
228
228
  | self.status | Map | The composite desired and observed status, read from observed if not in desired |
229
229
  | 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
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 |
232
232
  | self.ready | Boolean | The composite desired ready state |
233
233
 
234
234
  The BaseComposite also provides access to the following Crossplane Function level features:
@@ -238,6 +238,7 @@ The BaseComposite also provides access to the following Crossplane Function leve
238
238
  | self.request | Message | Low level direct access to the RunFunctionRequest message |
239
239
  | self.response | Message | Low level direct access to the RunFunctionResponse message |
240
240
  | self.logger | Logger | Python logger to log messages to the running function stdout |
241
+ | self.parameters | Map | The configured step parameters |
241
242
  | self.ttl | Integer | Get or set the response TTL, in seconds |
242
243
  | self.credentials | Credentials | The request credentials |
243
244
  | self.context | Map | The response context, initialized from the request context |
@@ -576,6 +577,41 @@ Secrets can also be used in an identical manner as ConfigMaps by enabling the
576
577
  `--packages-secrets` command line option. Secrets permissions need to be
577
578
  added to the above RBAC configuration.
578
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
+
579
615
  ## Filing System Packages
580
616
 
581
617
  Composition Composite implementations can be coded in a stand alone python files
@@ -203,8 +203,8 @@ The BaseComposite class provides the following fields for manipulating the Compo
203
203
  | self.spec | Map | The composite observed spec |
204
204
  | self.status | Map | The composite desired and observed status, read from observed if not in desired |
205
205
  | 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
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 |
208
208
  | self.ready | Boolean | The composite desired ready state |
209
209
 
210
210
  The BaseComposite also provides access to the following Crossplane Function level features:
@@ -214,6 +214,7 @@ The BaseComposite also provides access to the following Crossplane Function leve
214
214
  | self.request | Message | Low level direct access to the RunFunctionRequest message |
215
215
  | self.response | Message | Low level direct access to the RunFunctionResponse message |
216
216
  | self.logger | Logger | Python logger to log messages to the running function stdout |
217
+ | self.parameters | Map | The configured step parameters |
217
218
  | self.ttl | Integer | Get or set the response TTL, in seconds |
218
219
  | self.credentials | Credentials | The request credentials |
219
220
  | self.context | Map | The response context, initialized from the request context |
@@ -552,6 +553,41 @@ Secrets can also be used in an identical manner as ConfigMaps by enabling the
552
553
  `--packages-secrets` command line option. Secrets permissions need to be
553
554
  added to the above RBAC configuration.
554
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
+
555
591
  ## Filing System Packages
556
592
 
557
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
@@ -554,38 +567,6 @@ class Condition(protobuf.ProtobufValue):
554
567
  return self._conditions._response.conditions.append(condition)
555
568
 
556
569
 
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
570
  class Events:
590
571
  def __init__(self, response):
591
572
  self._results = response.results
@@ -47,10 +47,12 @@ class FunctionRunner(grpcv1.FunctionRunnerService):
47
47
  if composite['apiVersion'] == 'pythonic.fortra.com/v1alpha1' and composite['kind'] == 'Composite':
48
48
  if 'spec' not in composite or 'composite' not in composite['spec']:
49
49
  return self.fatal(request, logger, 'Missing spec "composite"')
50
+ single_use = True
50
51
  composite = composite['spec']['composite']
51
52
  else:
52
53
  if 'composite' not in request.input:
53
54
  return self.fatal(request, logger, 'Missing input "composite"')
55
+ single_use = False
54
56
  composite = request.input['composite']
55
57
 
56
58
  # Ideally this is something the Function API provides
@@ -94,7 +96,7 @@ class FunctionRunner(grpcv1.FunctionRunnerService):
94
96
  self.clazzes[composite] = clazz
95
97
 
96
98
  try:
97
- composite = clazz(request, logger)
99
+ composite = clazz(request, single_use, logger)
98
100
  except Exception as e:
99
101
  return self.fatal(request, logger, 'Instantiate', e)
100
102
 
@@ -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: