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.
@@ -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, '_connectionSecret', None)
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('Connection Secret cannot be set in Crossplane V1')
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, '_connection', None)
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) + (float(composite.response.meta.ttl.nanos) / 1000000000.0)
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((ttl - int(composite.response.meta.ttl.seconds)) * 1000000000)
71
+ composite.response.meta.ttl.nanos = int(
72
+ (ttl - int(composite.response.meta.ttl.seconds)) * 1000000000
73
+ )
69
74
  else:
70
- raise ValueError('ttl must be an int or float')
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, '_ready'):
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(None, 'request', request.DESCRIPTOR, request, 'Function Request')
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(None, 'response', response.DESCRIPTOR, response)
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['apiextensions.crossplane.io/environment']
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) # Deprecated, use self.results
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 fnv1.CAPABILITY_REQUIRED_RESOURCES in self._capabilities if self else None
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__['_request'] = request
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__['_credential'] = credential
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__['_composite'] = composite
219
- self.__dict__['_cache'] = {}
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__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset):
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 '/' in kind or kind == 'v1':
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['crossplane.io/external-name']
324
+ name = self.metadata.annotations["crossplane.io/external-name"]
311
325
  if not name:
312
- name = self.observed.metadata.annotations['crossplane.io/external-name']
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['crossplane.io/external-name'] = name
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, '_ready'):
374
+ if not hasattr(self, "_ready"):
361
375
  if self.desired._parent.ready == fnv1.Ready.READY_TRUE:
362
- self._ready = True
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 (self.autoReady is None and self._composite.autoReady):
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='Ready'):
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__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset, labels=_notset):
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 '/' in kind or kind == 'v1':
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
- if key in self._composite.response.requirements.schemas:
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 '/' in kind or kind == 'v1':
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
- for key, value in self._schema:
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 instance(other, Schema):
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='yaml'):
712
- return format(self,_schema, spec)
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 False
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
- 'type': self.type,
763
- 'status': 'Unknown' if status is None else str(status),
764
- 'reason': self.reason or '',
765
- 'message': self.message or '',
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['lastTransitionTime'] = time.isoformat().replace('+00:00', 'Z')
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, 'True', 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, 'False', 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('Condition is read only')
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 bool(self) and self._result.target == fnv1.Target.TARGET_COMPOSITE_AND_CLAIM
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 (isinstance(claim, protobuf.Value) and claim._isUnknown):
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('_composite', composite)
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 'connection-secret'
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
- for key, value in self._composite.response.desired.composite.connection_details:
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='yaml'):
1037
- return format(self._composite.response.desired.composite.connection_details, spec)
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
- if not value:
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]('v1', 'Secret')
1065
- if self._composite.connectionSecret.name and len(self._composite.connectionSecret.name):
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('ConnectionNoNamespace', 'Cluster scoped XR must specify connection secret namespace')
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 = 'connection.crossplane.io/v1alpha1'
1098
+ secret.type = "connection.crossplane.io/v1alpha1"
1073
1099
  secret.data[key] = protobuf.B64Encode(value)
1074
1100
 
1075
1101
  def __delattr__(self, key):