crossplane-function-pythonic 0.6.2__py3-none-any.whl → 0.6.3__py3-none-any.whl
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/pythonic/__about__.py +8 -2
- crossplane/pythonic/__init__.py +21 -13
- crossplane/pythonic/__main__.py +1 -0
- crossplane/pythonic/auto_ready.py +89 -41
- crossplane/pythonic/command.py +43 -39
- crossplane/pythonic/composite.py +93 -68
- crossplane/pythonic/diff.py +880 -0
- crossplane/pythonic/function.py +185 -103
- crossplane/pythonic/grpc.py +85 -62
- crossplane/pythonic/main.py +13 -4
- crossplane/pythonic/packages.py +65 -42
- crossplane/pythonic/proto/v1/run_function_pb2.py +3 -3
- crossplane/pythonic/proto/v1/run_function_pb2_grpc.py +4 -4
- crossplane/pythonic/protobuf.py +281 -214
- crossplane/pythonic/render.py +408 -200
- crossplane/pythonic/version.py +2 -3
- {crossplane_function_pythonic-0.6.2.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/METADATA +23 -26
- crossplane_function_pythonic-0.6.3.dist-info/RECORD +22 -0
- {crossplane_function_pythonic-0.6.2.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/WHEEL +1 -1
- {crossplane_function_pythonic-0.6.2.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/entry_points.txt +1 -0
- crossplane_function_pythonic-0.6.2.dist-info/RECORD +0 -22
- crossplane_function_pythonic-0.6.2.dist-info/licenses/LICENSE +0 -201
crossplane/pythonic/composite.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
1
|
import datetime
|
|
2
|
+
|
|
3
3
|
from google.protobuf.duration_pb2 import Duration
|
|
4
4
|
|
|
5
5
|
from . import (
|
|
@@ -8,7 +8,6 @@ from . import (
|
|
|
8
8
|
)
|
|
9
9
|
from .proto.v1 import run_function_pb2 as fnv1
|
|
10
10
|
|
|
11
|
-
|
|
12
11
|
_notset = object()
|
|
13
12
|
|
|
14
13
|
|
|
@@ -16,7 +15,7 @@ class ConnectionSecret:
|
|
|
16
15
|
def __get__(self, composite, objtype=None):
|
|
17
16
|
if composite.crossplane_v1:
|
|
18
17
|
return composite.spec.writeConnectionSecretToRef
|
|
19
|
-
secret = getattr(composite,
|
|
18
|
+
secret = getattr(composite, "_connectionSecret", None)
|
|
20
19
|
if not secret:
|
|
21
20
|
secret = protobuf.Map()
|
|
22
21
|
for key, value in composite.request.input.writeConnectionSecretToRef:
|
|
@@ -27,7 +26,9 @@ class ConnectionSecret:
|
|
|
27
26
|
def __set__(self, composite, values):
|
|
28
27
|
if composite.crossplane_v1:
|
|
29
28
|
if values != composite.spec.writeConnectionSecretToRef:
|
|
30
|
-
raise NotImplementedError(
|
|
29
|
+
raise NotImplementedError(
|
|
30
|
+
"Connection Secret cannot be set in Crossplane V1"
|
|
31
|
+
)
|
|
31
32
|
return
|
|
32
33
|
secret = protobuf.Map()
|
|
33
34
|
for key, value in values:
|
|
@@ -37,7 +38,7 @@ class ConnectionSecret:
|
|
|
37
38
|
|
|
38
39
|
class Connection:
|
|
39
40
|
def __get__(self, composite, objtype=None):
|
|
40
|
-
connection = getattr(composite,
|
|
41
|
+
connection = getattr(composite, "_connection", None)
|
|
41
42
|
if not connection:
|
|
42
43
|
connection = _Connection(composite)
|
|
43
44
|
composite._connection = connection
|
|
@@ -53,7 +54,9 @@ class Connection:
|
|
|
53
54
|
class TTL:
|
|
54
55
|
def __get__(self, composite, objtype=None):
|
|
55
56
|
if composite.response.meta.ttl.nanos:
|
|
56
|
-
return float(composite.response.meta.ttl.seconds) + (
|
|
57
|
+
return float(composite.response.meta.ttl.seconds) + (
|
|
58
|
+
float(composite.response.meta.ttl.nanos) / 1000000000.0
|
|
59
|
+
)
|
|
57
60
|
return int(composite.response.meta.ttl.seconds)
|
|
58
61
|
|
|
59
62
|
def __set__(self, composite, ttl):
|
|
@@ -65,14 +68,16 @@ class TTL:
|
|
|
65
68
|
if ttl.is_integer():
|
|
66
69
|
composite.response.meta.ttl.nanos = 0
|
|
67
70
|
else:
|
|
68
|
-
composite.response.meta.ttl.nanos = int(
|
|
71
|
+
composite.response.meta.ttl.nanos = int(
|
|
72
|
+
(ttl - int(composite.response.meta.ttl.seconds)) * 1000000000
|
|
73
|
+
)
|
|
69
74
|
else:
|
|
70
|
-
raise
|
|
75
|
+
raise TypeError("ttl must be an int or float")
|
|
71
76
|
|
|
72
77
|
|
|
73
78
|
class Ready:
|
|
74
79
|
def __get__(self, composite, objtype=None):
|
|
75
|
-
if hasattr(composite,
|
|
80
|
+
if hasattr(composite, "_ready"):
|
|
76
81
|
return composite._ready
|
|
77
82
|
if composite.desired._parent.ready == fnv1.Ready.READY_TRUE:
|
|
78
83
|
return True
|
|
@@ -93,7 +98,9 @@ class Ready:
|
|
|
93
98
|
class BaseComposite:
|
|
94
99
|
def __init__(self, crossplane_v1, request, logger):
|
|
95
100
|
self.crossplane_v1 = crossplane_v1
|
|
96
|
-
self.request = protobuf.Message(
|
|
101
|
+
self.request = protobuf.Message(
|
|
102
|
+
None, "request", request.DESCRIPTOR, request, "Function Request"
|
|
103
|
+
)
|
|
97
104
|
response = fnv1.RunFunctionResponse(
|
|
98
105
|
meta=fnv1.ResponseMeta(
|
|
99
106
|
tag=request.meta.tag,
|
|
@@ -104,15 +111,17 @@ class BaseComposite:
|
|
|
104
111
|
desired=request.desired,
|
|
105
112
|
context=request.context,
|
|
106
113
|
)
|
|
107
|
-
self.response = protobuf.Message(
|
|
114
|
+
self.response = protobuf.Message(
|
|
115
|
+
None, "response", response.DESCRIPTOR, response
|
|
116
|
+
)
|
|
108
117
|
self.logger = logger
|
|
109
118
|
self.capabilities = Capabilities(self.request.meta.capabilities)
|
|
110
119
|
self.parameters = self.request.input.parameters
|
|
111
120
|
self.credentials = Credentials(self.request)
|
|
112
121
|
self.context = self.response.context
|
|
113
|
-
self.environment = self.context[
|
|
122
|
+
self.environment = self.context["apiextensions.crossplane.io/environment"]
|
|
114
123
|
self.requireds = Requireds(self)
|
|
115
|
-
self.watched = self.requireds[
|
|
124
|
+
self.watched = self.requireds["ops.crossplane.io/watched-resource"][0]
|
|
116
125
|
self.schemas = Schemas(self)
|
|
117
126
|
self.resources = Resources(self)
|
|
118
127
|
self.autoReady = True
|
|
@@ -131,7 +140,7 @@ class BaseComposite:
|
|
|
131
140
|
self.output = self.response.output
|
|
132
141
|
self.conditions = Conditions(observed, self.response)
|
|
133
142
|
self.results = Results(self.response)
|
|
134
|
-
self.events = Results(self.response)
|
|
143
|
+
self.events = Results(self.response) # Deprecated, use self.results
|
|
135
144
|
|
|
136
145
|
ttl = TTL()
|
|
137
146
|
connectionSecret = ConnectionSecret()
|
|
@@ -151,7 +160,9 @@ class Capabilities:
|
|
|
151
160
|
|
|
152
161
|
@property
|
|
153
162
|
def requireds(self):
|
|
154
|
-
return
|
|
163
|
+
return (
|
|
164
|
+
fnv1.CAPABILITY_REQUIRED_RESOURCES in self._capabilities if self else None
|
|
165
|
+
)
|
|
155
166
|
|
|
156
167
|
@property
|
|
157
168
|
def credentials(self):
|
|
@@ -168,7 +179,7 @@ class Capabilities:
|
|
|
168
179
|
|
|
169
180
|
class Credentials:
|
|
170
181
|
def __init__(self, request):
|
|
171
|
-
self.__dict__[
|
|
182
|
+
self.__dict__["_request"] = request
|
|
172
183
|
|
|
173
184
|
def __getattr__(self, key):
|
|
174
185
|
return self[key]
|
|
@@ -192,7 +203,7 @@ class Credentials:
|
|
|
192
203
|
|
|
193
204
|
class Credential:
|
|
194
205
|
def __init__(self, credential):
|
|
195
|
-
self.__dict__[
|
|
206
|
+
self.__dict__["_credential"] = credential
|
|
196
207
|
|
|
197
208
|
def __getattr__(self, key):
|
|
198
209
|
return self[key]
|
|
@@ -216,8 +227,8 @@ class Credential:
|
|
|
216
227
|
|
|
217
228
|
class Resources:
|
|
218
229
|
def __init__(self, composite):
|
|
219
|
-
self.__dict__[
|
|
220
|
-
self.__dict__[
|
|
230
|
+
self.__dict__["_composite"] = composite
|
|
231
|
+
self.__dict__["_cache"] = {}
|
|
221
232
|
|
|
222
233
|
def __getattr__(self, key):
|
|
223
234
|
return self[key]
|
|
@@ -272,11 +283,13 @@ class Resource:
|
|
|
272
283
|
self.usages = None
|
|
273
284
|
self.unknownsFatal = None
|
|
274
285
|
|
|
275
|
-
def __call__(
|
|
286
|
+
def __call__(
|
|
287
|
+
self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset
|
|
288
|
+
):
|
|
276
289
|
self.desired()
|
|
277
290
|
if kind != _notset:
|
|
278
291
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
279
|
-
if
|
|
292
|
+
if "/" in kind or kind == "v1":
|
|
280
293
|
if apiVersion != _notset:
|
|
281
294
|
self.kind = apiVersion
|
|
282
295
|
apiVersion = kind
|
|
@@ -308,16 +321,16 @@ class Resource:
|
|
|
308
321
|
|
|
309
322
|
@property
|
|
310
323
|
def externalName(self):
|
|
311
|
-
name = self.metadata.annotations[
|
|
324
|
+
name = self.metadata.annotations["crossplane.io/external-name"]
|
|
312
325
|
if not name:
|
|
313
|
-
name = self.observed.metadata.annotations[
|
|
326
|
+
name = self.observed.metadata.annotations["crossplane.io/external-name"]
|
|
314
327
|
if name:
|
|
315
328
|
self.externalName = name
|
|
316
329
|
return name
|
|
317
330
|
|
|
318
331
|
@externalName.setter
|
|
319
332
|
def externalName(self, name):
|
|
320
|
-
self.metadata.annotations[
|
|
333
|
+
self.metadata.annotations["crossplane.io/external-name"] = name
|
|
321
334
|
|
|
322
335
|
@property
|
|
323
336
|
def metadata(self):
|
|
@@ -358,14 +371,16 @@ class Resource:
|
|
|
358
371
|
|
|
359
372
|
@property
|
|
360
373
|
def ready(self):
|
|
361
|
-
if not hasattr(self,
|
|
374
|
+
if not hasattr(self, "_ready"):
|
|
362
375
|
if self.desired._parent.ready == fnv1.Ready.READY_TRUE:
|
|
363
|
-
self._ready =
|
|
376
|
+
self._ready = True
|
|
364
377
|
elif self.desired._parent.ready == fnv1.Ready.READY_FALSE:
|
|
365
378
|
self._ready = False
|
|
366
379
|
else:
|
|
367
380
|
self._ready = None
|
|
368
|
-
if self.autoReady or (
|
|
381
|
+
if self.autoReady or (
|
|
382
|
+
self.autoReady is None and self._composite.autoReady
|
|
383
|
+
):
|
|
369
384
|
ready = auto_ready.resource_ready(self)
|
|
370
385
|
if ready:
|
|
371
386
|
self._ready = ready
|
|
@@ -382,7 +397,7 @@ class Resource:
|
|
|
382
397
|
else:
|
|
383
398
|
self.desired._parent.ready = fnv1.Ready.READY_FALSE
|
|
384
399
|
|
|
385
|
-
def setReadyCondition(self, type=
|
|
400
|
+
def setReadyCondition(self, type="Ready"):
|
|
386
401
|
condition = self.conditions[type]
|
|
387
402
|
if condition.status:
|
|
388
403
|
self.ready = self.observed.metadata.name
|
|
@@ -413,6 +428,7 @@ class Resource:
|
|
|
413
428
|
field = resource.status.notReady
|
|
414
429
|
self.metadata.annotations[f"pythonic.dependency/{resource.name}"] = field
|
|
415
430
|
|
|
431
|
+
|
|
416
432
|
class Requireds:
|
|
417
433
|
def __init__(self, composite):
|
|
418
434
|
self._composite = composite
|
|
@@ -485,11 +501,18 @@ class RequiredResources:
|
|
|
485
501
|
self._resources = composite.request.required_resources[name]
|
|
486
502
|
self._cache = {}
|
|
487
503
|
|
|
488
|
-
def __call__(
|
|
504
|
+
def __call__(
|
|
505
|
+
self,
|
|
506
|
+
kind=_notset,
|
|
507
|
+
apiVersion=_notset,
|
|
508
|
+
namespace=_notset,
|
|
509
|
+
name=_notset,
|
|
510
|
+
labels=_notset,
|
|
511
|
+
):
|
|
489
512
|
self._selector()
|
|
490
513
|
if kind != _notset:
|
|
491
514
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
492
|
-
if
|
|
515
|
+
if "/" in kind or kind == "v1":
|
|
493
516
|
if apiVersion != _notset:
|
|
494
517
|
self.kind = apiVersion
|
|
495
518
|
apiVersion = kind
|
|
@@ -617,9 +640,7 @@ class Schemas:
|
|
|
617
640
|
def __contains__(self, key):
|
|
618
641
|
if key in self._composite.request.required_schemas:
|
|
619
642
|
return True
|
|
620
|
-
|
|
621
|
-
return True
|
|
622
|
-
return False
|
|
643
|
+
return key in self._composite.response.requirements.schemas
|
|
623
644
|
|
|
624
645
|
def __iter__(self):
|
|
625
646
|
names = set()
|
|
@@ -641,7 +662,7 @@ class Schema:
|
|
|
641
662
|
self._selector()
|
|
642
663
|
if kind != _notset:
|
|
643
664
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
644
|
-
if
|
|
665
|
+
if "/" in kind or kind == "v1":
|
|
645
666
|
if apiVersion != _notset:
|
|
646
667
|
self.kind = apiVersion
|
|
647
668
|
apiVersion = kind
|
|
@@ -695,22 +716,21 @@ class Schema:
|
|
|
695
716
|
return item in self._schema
|
|
696
717
|
|
|
697
718
|
def __iter__(self):
|
|
698
|
-
|
|
699
|
-
yield key, value
|
|
719
|
+
yield from self._schema
|
|
700
720
|
|
|
701
721
|
def __hash__(self):
|
|
702
722
|
return hash(self._schema)
|
|
703
723
|
|
|
704
724
|
def __eq__(self, other):
|
|
705
|
-
if
|
|
725
|
+
if isinstance(other, Schema):
|
|
706
726
|
other = other._schema
|
|
707
727
|
return self._schema == other
|
|
708
728
|
|
|
709
729
|
def __str__(self):
|
|
710
730
|
return str(self._schema)
|
|
711
731
|
|
|
712
|
-
def __format__(self, spec=
|
|
713
|
-
return format(self
|
|
732
|
+
def __format__(self, spec="yaml"):
|
|
733
|
+
return format(self._schema, spec)
|
|
714
734
|
|
|
715
735
|
|
|
716
736
|
class Conditions:
|
|
@@ -725,12 +745,9 @@ class Conditions:
|
|
|
725
745
|
return Condition(self, type)
|
|
726
746
|
|
|
727
747
|
def __bool__(self):
|
|
728
|
-
if self._response is not None:
|
|
729
|
-
if self._response.conditions:
|
|
730
|
-
return True
|
|
731
|
-
if self._observed.resource.status.conditions:
|
|
748
|
+
if self._response is not None and self._response.conditions:
|
|
732
749
|
return True
|
|
733
|
-
return
|
|
750
|
+
return bool(self._observed.resource.status.conditions)
|
|
734
751
|
|
|
735
752
|
def __len__(self):
|
|
736
753
|
return len(self._types())
|
|
@@ -760,14 +777,14 @@ class Condition(protobuf.ProtobufValue):
|
|
|
760
777
|
def _protobuf_value(self):
|
|
761
778
|
status = self.status
|
|
762
779
|
value = {
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
780
|
+
"type": self.type,
|
|
781
|
+
"status": "Unknown" if status is None else str(status),
|
|
782
|
+
"reason": self.reason or "",
|
|
783
|
+
"message": self.message or "",
|
|
767
784
|
}
|
|
768
785
|
time = self.lastTransitionTime
|
|
769
786
|
if time:
|
|
770
|
-
value[
|
|
787
|
+
value["lastTransitionTime"] = time.isoformat().replace("+00:00", "Z")
|
|
771
788
|
return value
|
|
772
789
|
|
|
773
790
|
def __call__(self, reason=_notset, message=_notset, status=_notset, claim=_notset):
|
|
@@ -786,9 +803,9 @@ class Condition(protobuf.ProtobufValue):
|
|
|
786
803
|
def status(self):
|
|
787
804
|
condition = self._find_condition()
|
|
788
805
|
if condition:
|
|
789
|
-
if condition.status in (fnv1.Status.STATUS_CONDITION_TRUE,
|
|
806
|
+
if condition.status in (fnv1.Status.STATUS_CONDITION_TRUE, "True", True):
|
|
790
807
|
return True
|
|
791
|
-
if condition.status in (fnv1.Status.STATUS_CONDITION_FALSE,
|
|
808
|
+
if condition.status in (fnv1.Status.STATUS_CONDITION_FALSE, "False", False):
|
|
792
809
|
return False
|
|
793
810
|
return None
|
|
794
811
|
|
|
@@ -804,7 +821,6 @@ class Condition(protobuf.ProtobufValue):
|
|
|
804
821
|
else:
|
|
805
822
|
condition.status = fnv1.Status.STATUS_CONDITION_FALSE
|
|
806
823
|
|
|
807
|
-
|
|
808
824
|
@property
|
|
809
825
|
def reason(self):
|
|
810
826
|
condition = self._find_condition()
|
|
@@ -862,7 +878,7 @@ class Condition(protobuf.ProtobufValue):
|
|
|
862
878
|
return observed
|
|
863
879
|
return None
|
|
864
880
|
if self._conditions._response is None:
|
|
865
|
-
raise ValueError(
|
|
881
|
+
raise ValueError("Condition is read only")
|
|
866
882
|
condition = fnv1.Condition()
|
|
867
883
|
condition.type = self.type
|
|
868
884
|
return self._conditions._response.conditions.append(condition)
|
|
@@ -984,14 +1000,18 @@ class Result:
|
|
|
984
1000
|
|
|
985
1001
|
@property
|
|
986
1002
|
def claim(self):
|
|
987
|
-
return
|
|
1003
|
+
return (
|
|
1004
|
+
bool(self) and self._result.target == fnv1.Target.TARGET_COMPOSITE_AND_CLAIM
|
|
1005
|
+
)
|
|
988
1006
|
|
|
989
1007
|
@claim.setter
|
|
990
1008
|
def claim(self, claim):
|
|
991
1009
|
if bool(self):
|
|
992
1010
|
if claim:
|
|
993
1011
|
self._result.target = fnv1.Target.TARGET_COMPOSITE_AND_CLAIM
|
|
994
|
-
elif claim == None or (
|
|
1012
|
+
elif claim == None or (
|
|
1013
|
+
isinstance(claim, protobuf.Value) and claim._isUnknown
|
|
1014
|
+
):
|
|
995
1015
|
self._result.target = fnv1.Target.TARGET_UNSPECIFIED
|
|
996
1016
|
else:
|
|
997
1017
|
self._result.target = fnv1.Target.TARGET_COMPOSITE
|
|
@@ -999,14 +1019,14 @@ class Result:
|
|
|
999
1019
|
|
|
1000
1020
|
class _Connection:
|
|
1001
1021
|
def __init__(self, composite):
|
|
1002
|
-
self._set_attribute(
|
|
1022
|
+
self._set_attribute("_composite", composite)
|
|
1003
1023
|
|
|
1004
1024
|
def _set_attribute(self, key, value):
|
|
1005
1025
|
self.__dict__[key] = value
|
|
1006
1026
|
|
|
1007
1027
|
@property
|
|
1008
1028
|
def _resource_name(self):
|
|
1009
|
-
return self._composite.connectionSecret.resourceName or
|
|
1029
|
+
return self._composite.connectionSecret.resourceName or "connection-secret"
|
|
1010
1030
|
|
|
1011
1031
|
@property
|
|
1012
1032
|
def observed(self):
|
|
@@ -1028,14 +1048,15 @@ class _Connection:
|
|
|
1028
1048
|
return key in self._composite.response.desired.composite.connection_details
|
|
1029
1049
|
|
|
1030
1050
|
def __iter__(self):
|
|
1031
|
-
|
|
1032
|
-
yield key, value
|
|
1051
|
+
yield from self._composite.response.desired.composite.connection_details
|
|
1033
1052
|
|
|
1034
1053
|
def __str__(self):
|
|
1035
1054
|
return format(self)
|
|
1036
1055
|
|
|
1037
|
-
def __format__(self, spec=
|
|
1038
|
-
return format(
|
|
1056
|
+
def __format__(self, spec="yaml"):
|
|
1057
|
+
return format(
|
|
1058
|
+
self._composite.response.desired.composite.connection_details, spec
|
|
1059
|
+
)
|
|
1039
1060
|
|
|
1040
1061
|
def __call__(self, **kwargs):
|
|
1041
1062
|
self._composite.response.desired.composite.connection_details(**kwargs)
|
|
@@ -1052,9 +1073,8 @@ class _Connection:
|
|
|
1052
1073
|
if not isinstance(value, str):
|
|
1053
1074
|
if value is None:
|
|
1054
1075
|
return
|
|
1055
|
-
if isinstance(value, (protobuf.FieldMessage, protobuf.Value)):
|
|
1056
|
-
|
|
1057
|
-
return
|
|
1076
|
+
if isinstance(value, (protobuf.FieldMessage, protobuf.Value)) and not value:
|
|
1077
|
+
return
|
|
1058
1078
|
value = str(value)
|
|
1059
1079
|
self._composite.response.desired.composite.connection_details[key] = value
|
|
1060
1080
|
if self._composite.crossplane_v1 or not self._composite.connectionSecret.name:
|
|
@@ -1062,15 +1082,20 @@ class _Connection:
|
|
|
1062
1082
|
if self._resource_name in self._composite.resources:
|
|
1063
1083
|
secret = self._composite.resources[self._resource_name]
|
|
1064
1084
|
else:
|
|
1065
|
-
secret = self._composite.resources[self._resource_name](
|
|
1066
|
-
if self._composite.connectionSecret.name and len(
|
|
1085
|
+
secret = self._composite.resources[self._resource_name]("v1", "Secret")
|
|
1086
|
+
if self._composite.connectionSecret.name and len(
|
|
1087
|
+
self._composite.connectionSecret.name
|
|
1088
|
+
):
|
|
1067
1089
|
secret.metadata.name = self._composite.connectionSecret.name
|
|
1068
1090
|
if not self._composite.metadata.namespace:
|
|
1069
1091
|
if not self._composite.connectionSecret.namespace:
|
|
1070
|
-
self._composite.results.fatal(
|
|
1092
|
+
self._composite.results.fatal(
|
|
1093
|
+
"ConnectionNoNamespace",
|
|
1094
|
+
"Cluster scoped XR must specify connection secret namespace",
|
|
1095
|
+
)
|
|
1071
1096
|
return
|
|
1072
1097
|
secret.metadata.namespace = self._composite.connectionSecret.namespace
|
|
1073
|
-
secret.type =
|
|
1098
|
+
secret.type = "connection.crossplane.io/v1alpha1"
|
|
1074
1099
|
secret.data[key] = protobuf.B64Encode(value)
|
|
1075
1100
|
|
|
1076
1101
|
def __delattr__(self, key):
|