crossplane-function-pythonic 0.6.1__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 -67
- crossplane/pythonic/diff.py +880 -0
- crossplane/pythonic/function.py +194 -99
- crossplane/pythonic/grpc.py +85 -62
- crossplane/pythonic/main.py +13 -4
- crossplane/pythonic/packages.py +77 -50
- 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 +413 -201
- crossplane/pythonic/version.py +2 -3
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/METADATA +23 -25
- crossplane_function_pythonic-0.6.3.dist-info/RECORD +22 -0
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/WHEEL +1 -1
- {crossplane_function_pythonic-0.6.1.dist-info → crossplane_function_pythonic-0.6.3.dist-info}/entry_points.txt +1 -0
- crossplane_function_pythonic-0.6.1.dist-info/RECORD +0 -22
- crossplane_function_pythonic-0.6.1.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,14 +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)
|
|
124
|
+
self.watched = self.requireds["ops.crossplane.io/watched-resource"][0]
|
|
115
125
|
self.schemas = Schemas(self)
|
|
116
126
|
self.resources = Resources(self)
|
|
117
127
|
self.autoReady = True
|
|
@@ -130,7 +140,7 @@ class BaseComposite:
|
|
|
130
140
|
self.output = self.response.output
|
|
131
141
|
self.conditions = Conditions(observed, self.response)
|
|
132
142
|
self.results = Results(self.response)
|
|
133
|
-
self.events = Results(self.response)
|
|
143
|
+
self.events = Results(self.response) # Deprecated, use self.results
|
|
134
144
|
|
|
135
145
|
ttl = TTL()
|
|
136
146
|
connectionSecret = ConnectionSecret()
|
|
@@ -150,7 +160,9 @@ class Capabilities:
|
|
|
150
160
|
|
|
151
161
|
@property
|
|
152
162
|
def requireds(self):
|
|
153
|
-
return
|
|
163
|
+
return (
|
|
164
|
+
fnv1.CAPABILITY_REQUIRED_RESOURCES in self._capabilities if self else None
|
|
165
|
+
)
|
|
154
166
|
|
|
155
167
|
@property
|
|
156
168
|
def credentials(self):
|
|
@@ -167,7 +179,7 @@ class Capabilities:
|
|
|
167
179
|
|
|
168
180
|
class Credentials:
|
|
169
181
|
def __init__(self, request):
|
|
170
|
-
self.__dict__[
|
|
182
|
+
self.__dict__["_request"] = request
|
|
171
183
|
|
|
172
184
|
def __getattr__(self, key):
|
|
173
185
|
return self[key]
|
|
@@ -191,7 +203,7 @@ class Credentials:
|
|
|
191
203
|
|
|
192
204
|
class Credential:
|
|
193
205
|
def __init__(self, credential):
|
|
194
|
-
self.__dict__[
|
|
206
|
+
self.__dict__["_credential"] = credential
|
|
195
207
|
|
|
196
208
|
def __getattr__(self, key):
|
|
197
209
|
return self[key]
|
|
@@ -215,8 +227,8 @@ class Credential:
|
|
|
215
227
|
|
|
216
228
|
class Resources:
|
|
217
229
|
def __init__(self, composite):
|
|
218
|
-
self.__dict__[
|
|
219
|
-
self.__dict__[
|
|
230
|
+
self.__dict__["_composite"] = composite
|
|
231
|
+
self.__dict__["_cache"] = {}
|
|
220
232
|
|
|
221
233
|
def __getattr__(self, key):
|
|
222
234
|
return self[key]
|
|
@@ -271,11 +283,13 @@ class Resource:
|
|
|
271
283
|
self.usages = None
|
|
272
284
|
self.unknownsFatal = None
|
|
273
285
|
|
|
274
|
-
def __call__(
|
|
286
|
+
def __call__(
|
|
287
|
+
self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset
|
|
288
|
+
):
|
|
275
289
|
self.desired()
|
|
276
290
|
if kind != _notset:
|
|
277
291
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
278
|
-
if
|
|
292
|
+
if "/" in kind or kind == "v1":
|
|
279
293
|
if apiVersion != _notset:
|
|
280
294
|
self.kind = apiVersion
|
|
281
295
|
apiVersion = kind
|
|
@@ -307,16 +321,16 @@ class Resource:
|
|
|
307
321
|
|
|
308
322
|
@property
|
|
309
323
|
def externalName(self):
|
|
310
|
-
name = self.metadata.annotations[
|
|
324
|
+
name = self.metadata.annotations["crossplane.io/external-name"]
|
|
311
325
|
if not name:
|
|
312
|
-
name = self.observed.metadata.annotations[
|
|
326
|
+
name = self.observed.metadata.annotations["crossplane.io/external-name"]
|
|
313
327
|
if name:
|
|
314
328
|
self.externalName = name
|
|
315
329
|
return name
|
|
316
330
|
|
|
317
331
|
@externalName.setter
|
|
318
332
|
def externalName(self, name):
|
|
319
|
-
self.metadata.annotations[
|
|
333
|
+
self.metadata.annotations["crossplane.io/external-name"] = name
|
|
320
334
|
|
|
321
335
|
@property
|
|
322
336
|
def metadata(self):
|
|
@@ -357,14 +371,16 @@ class Resource:
|
|
|
357
371
|
|
|
358
372
|
@property
|
|
359
373
|
def ready(self):
|
|
360
|
-
if not hasattr(self,
|
|
374
|
+
if not hasattr(self, "_ready"):
|
|
361
375
|
if self.desired._parent.ready == fnv1.Ready.READY_TRUE:
|
|
362
|
-
self._ready =
|
|
376
|
+
self._ready = True
|
|
363
377
|
elif self.desired._parent.ready == fnv1.Ready.READY_FALSE:
|
|
364
378
|
self._ready = False
|
|
365
379
|
else:
|
|
366
380
|
self._ready = None
|
|
367
|
-
if self.autoReady or (
|
|
381
|
+
if self.autoReady or (
|
|
382
|
+
self.autoReady is None and self._composite.autoReady
|
|
383
|
+
):
|
|
368
384
|
ready = auto_ready.resource_ready(self)
|
|
369
385
|
if ready:
|
|
370
386
|
self._ready = ready
|
|
@@ -381,7 +397,7 @@ class Resource:
|
|
|
381
397
|
else:
|
|
382
398
|
self.desired._parent.ready = fnv1.Ready.READY_FALSE
|
|
383
399
|
|
|
384
|
-
def setReadyCondition(self, type=
|
|
400
|
+
def setReadyCondition(self, type="Ready"):
|
|
385
401
|
condition = self.conditions[type]
|
|
386
402
|
if condition.status:
|
|
387
403
|
self.ready = self.observed.metadata.name
|
|
@@ -412,6 +428,7 @@ class Resource:
|
|
|
412
428
|
field = resource.status.notReady
|
|
413
429
|
self.metadata.annotations[f"pythonic.dependency/{resource.name}"] = field
|
|
414
430
|
|
|
431
|
+
|
|
415
432
|
class Requireds:
|
|
416
433
|
def __init__(self, composite):
|
|
417
434
|
self._composite = composite
|
|
@@ -484,11 +501,18 @@ class RequiredResources:
|
|
|
484
501
|
self._resources = composite.request.required_resources[name]
|
|
485
502
|
self._cache = {}
|
|
486
503
|
|
|
487
|
-
def __call__(
|
|
504
|
+
def __call__(
|
|
505
|
+
self,
|
|
506
|
+
kind=_notset,
|
|
507
|
+
apiVersion=_notset,
|
|
508
|
+
namespace=_notset,
|
|
509
|
+
name=_notset,
|
|
510
|
+
labels=_notset,
|
|
511
|
+
):
|
|
488
512
|
self._selector()
|
|
489
513
|
if kind != _notset:
|
|
490
514
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
491
|
-
if
|
|
515
|
+
if "/" in kind or kind == "v1":
|
|
492
516
|
if apiVersion != _notset:
|
|
493
517
|
self.kind = apiVersion
|
|
494
518
|
apiVersion = kind
|
|
@@ -616,9 +640,7 @@ class Schemas:
|
|
|
616
640
|
def __contains__(self, key):
|
|
617
641
|
if key in self._composite.request.required_schemas:
|
|
618
642
|
return True
|
|
619
|
-
|
|
620
|
-
return True
|
|
621
|
-
return False
|
|
643
|
+
return key in self._composite.response.requirements.schemas
|
|
622
644
|
|
|
623
645
|
def __iter__(self):
|
|
624
646
|
names = set()
|
|
@@ -640,7 +662,7 @@ class Schema:
|
|
|
640
662
|
self._selector()
|
|
641
663
|
if kind != _notset:
|
|
642
664
|
# Allow for apiVersion in the first arg and kind in the second arg
|
|
643
|
-
if
|
|
665
|
+
if "/" in kind or kind == "v1":
|
|
644
666
|
if apiVersion != _notset:
|
|
645
667
|
self.kind = apiVersion
|
|
646
668
|
apiVersion = kind
|
|
@@ -694,22 +716,21 @@ class Schema:
|
|
|
694
716
|
return item in self._schema
|
|
695
717
|
|
|
696
718
|
def __iter__(self):
|
|
697
|
-
|
|
698
|
-
yield key, value
|
|
719
|
+
yield from self._schema
|
|
699
720
|
|
|
700
721
|
def __hash__(self):
|
|
701
722
|
return hash(self._schema)
|
|
702
723
|
|
|
703
724
|
def __eq__(self, other):
|
|
704
|
-
if
|
|
725
|
+
if isinstance(other, Schema):
|
|
705
726
|
other = other._schema
|
|
706
727
|
return self._schema == other
|
|
707
728
|
|
|
708
729
|
def __str__(self):
|
|
709
730
|
return str(self._schema)
|
|
710
731
|
|
|
711
|
-
def __format__(self, spec=
|
|
712
|
-
return format(self
|
|
732
|
+
def __format__(self, spec="yaml"):
|
|
733
|
+
return format(self._schema, spec)
|
|
713
734
|
|
|
714
735
|
|
|
715
736
|
class Conditions:
|
|
@@ -724,12 +745,9 @@ class Conditions:
|
|
|
724
745
|
return Condition(self, type)
|
|
725
746
|
|
|
726
747
|
def __bool__(self):
|
|
727
|
-
if self._response is not None:
|
|
728
|
-
if self._response.conditions:
|
|
729
|
-
return True
|
|
730
|
-
if self._observed.resource.status.conditions:
|
|
748
|
+
if self._response is not None and self._response.conditions:
|
|
731
749
|
return True
|
|
732
|
-
return
|
|
750
|
+
return bool(self._observed.resource.status.conditions)
|
|
733
751
|
|
|
734
752
|
def __len__(self):
|
|
735
753
|
return len(self._types())
|
|
@@ -759,14 +777,14 @@ class Condition(protobuf.ProtobufValue):
|
|
|
759
777
|
def _protobuf_value(self):
|
|
760
778
|
status = self.status
|
|
761
779
|
value = {
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
780
|
+
"type": self.type,
|
|
781
|
+
"status": "Unknown" if status is None else str(status),
|
|
782
|
+
"reason": self.reason or "",
|
|
783
|
+
"message": self.message or "",
|
|
766
784
|
}
|
|
767
785
|
time = self.lastTransitionTime
|
|
768
786
|
if time:
|
|
769
|
-
value[
|
|
787
|
+
value["lastTransitionTime"] = time.isoformat().replace("+00:00", "Z")
|
|
770
788
|
return value
|
|
771
789
|
|
|
772
790
|
def __call__(self, reason=_notset, message=_notset, status=_notset, claim=_notset):
|
|
@@ -785,9 +803,9 @@ class Condition(protobuf.ProtobufValue):
|
|
|
785
803
|
def status(self):
|
|
786
804
|
condition = self._find_condition()
|
|
787
805
|
if condition:
|
|
788
|
-
if condition.status in (fnv1.Status.STATUS_CONDITION_TRUE,
|
|
806
|
+
if condition.status in (fnv1.Status.STATUS_CONDITION_TRUE, "True", True):
|
|
789
807
|
return True
|
|
790
|
-
if condition.status in (fnv1.Status.STATUS_CONDITION_FALSE,
|
|
808
|
+
if condition.status in (fnv1.Status.STATUS_CONDITION_FALSE, "False", False):
|
|
791
809
|
return False
|
|
792
810
|
return None
|
|
793
811
|
|
|
@@ -803,7 +821,6 @@ class Condition(protobuf.ProtobufValue):
|
|
|
803
821
|
else:
|
|
804
822
|
condition.status = fnv1.Status.STATUS_CONDITION_FALSE
|
|
805
823
|
|
|
806
|
-
|
|
807
824
|
@property
|
|
808
825
|
def reason(self):
|
|
809
826
|
condition = self._find_condition()
|
|
@@ -861,7 +878,7 @@ class Condition(protobuf.ProtobufValue):
|
|
|
861
878
|
return observed
|
|
862
879
|
return None
|
|
863
880
|
if self._conditions._response is None:
|
|
864
|
-
raise ValueError(
|
|
881
|
+
raise ValueError("Condition is read only")
|
|
865
882
|
condition = fnv1.Condition()
|
|
866
883
|
condition.type = self.type
|
|
867
884
|
return self._conditions._response.conditions.append(condition)
|
|
@@ -983,14 +1000,18 @@ class Result:
|
|
|
983
1000
|
|
|
984
1001
|
@property
|
|
985
1002
|
def claim(self):
|
|
986
|
-
return
|
|
1003
|
+
return (
|
|
1004
|
+
bool(self) and self._result.target == fnv1.Target.TARGET_COMPOSITE_AND_CLAIM
|
|
1005
|
+
)
|
|
987
1006
|
|
|
988
1007
|
@claim.setter
|
|
989
1008
|
def claim(self, claim):
|
|
990
1009
|
if bool(self):
|
|
991
1010
|
if claim:
|
|
992
1011
|
self._result.target = fnv1.Target.TARGET_COMPOSITE_AND_CLAIM
|
|
993
|
-
elif claim == None or (
|
|
1012
|
+
elif claim == None or (
|
|
1013
|
+
isinstance(claim, protobuf.Value) and claim._isUnknown
|
|
1014
|
+
):
|
|
994
1015
|
self._result.target = fnv1.Target.TARGET_UNSPECIFIED
|
|
995
1016
|
else:
|
|
996
1017
|
self._result.target = fnv1.Target.TARGET_COMPOSITE
|
|
@@ -998,14 +1019,14 @@ class Result:
|
|
|
998
1019
|
|
|
999
1020
|
class _Connection:
|
|
1000
1021
|
def __init__(self, composite):
|
|
1001
|
-
self._set_attribute(
|
|
1022
|
+
self._set_attribute("_composite", composite)
|
|
1002
1023
|
|
|
1003
1024
|
def _set_attribute(self, key, value):
|
|
1004
1025
|
self.__dict__[key] = value
|
|
1005
1026
|
|
|
1006
1027
|
@property
|
|
1007
1028
|
def _resource_name(self):
|
|
1008
|
-
return self._composite.connectionSecret.resourceName or
|
|
1029
|
+
return self._composite.connectionSecret.resourceName or "connection-secret"
|
|
1009
1030
|
|
|
1010
1031
|
@property
|
|
1011
1032
|
def observed(self):
|
|
@@ -1027,14 +1048,15 @@ class _Connection:
|
|
|
1027
1048
|
return key in self._composite.response.desired.composite.connection_details
|
|
1028
1049
|
|
|
1029
1050
|
def __iter__(self):
|
|
1030
|
-
|
|
1031
|
-
yield key, value
|
|
1051
|
+
yield from self._composite.response.desired.composite.connection_details
|
|
1032
1052
|
|
|
1033
1053
|
def __str__(self):
|
|
1034
1054
|
return format(self)
|
|
1035
1055
|
|
|
1036
|
-
def __format__(self, spec=
|
|
1037
|
-
return format(
|
|
1056
|
+
def __format__(self, spec="yaml"):
|
|
1057
|
+
return format(
|
|
1058
|
+
self._composite.response.desired.composite.connection_details, spec
|
|
1059
|
+
)
|
|
1038
1060
|
|
|
1039
1061
|
def __call__(self, **kwargs):
|
|
1040
1062
|
self._composite.response.desired.composite.connection_details(**kwargs)
|
|
@@ -1051,9 +1073,8 @@ class _Connection:
|
|
|
1051
1073
|
if not isinstance(value, str):
|
|
1052
1074
|
if value is None:
|
|
1053
1075
|
return
|
|
1054
|
-
if isinstance(value, (protobuf.FieldMessage, protobuf.Value)):
|
|
1055
|
-
|
|
1056
|
-
return
|
|
1076
|
+
if isinstance(value, (protobuf.FieldMessage, protobuf.Value)) and not value:
|
|
1077
|
+
return
|
|
1057
1078
|
value = str(value)
|
|
1058
1079
|
self._composite.response.desired.composite.connection_details[key] = value
|
|
1059
1080
|
if self._composite.crossplane_v1 or not self._composite.connectionSecret.name:
|
|
@@ -1061,15 +1082,20 @@ class _Connection:
|
|
|
1061
1082
|
if self._resource_name in self._composite.resources:
|
|
1062
1083
|
secret = self._composite.resources[self._resource_name]
|
|
1063
1084
|
else:
|
|
1064
|
-
secret = self._composite.resources[self._resource_name](
|
|
1065
|
-
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
|
+
):
|
|
1066
1089
|
secret.metadata.name = self._composite.connectionSecret.name
|
|
1067
1090
|
if not self._composite.metadata.namespace:
|
|
1068
1091
|
if not self._composite.connectionSecret.namespace:
|
|
1069
|
-
self._composite.results.fatal(
|
|
1092
|
+
self._composite.results.fatal(
|
|
1093
|
+
"ConnectionNoNamespace",
|
|
1094
|
+
"Cluster scoped XR must specify connection secret namespace",
|
|
1095
|
+
)
|
|
1070
1096
|
return
|
|
1071
1097
|
secret.metadata.namespace = self._composite.connectionSecret.namespace
|
|
1072
|
-
secret.type =
|
|
1098
|
+
secret.type = "connection.crossplane.io/v1alpha1"
|
|
1073
1099
|
secret.data[key] = protobuf.B64Encode(value)
|
|
1074
1100
|
|
|
1075
1101
|
def __delattr__(self, key):
|