Skip to content

Commit e2cba82

Browse files
renovate[bot]iciclespider
authored andcommitted
Integrate render command with an active cluster
1 parent 4f53ce9 commit e2cba82

File tree

8 files changed

+415
-222
lines changed

8 files changed

+415
-222
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,9 @@ The BaseComposite also provides access to the following Crossplane Function leve
254254
| self.environment | Map | The response environment, initialized from the request context environment |
255255
| self.requireds | Requireds | Request and read additional local Kubernetes resources |
256256
| self.resources | Resources | Define and process composed resources |
257-
| self.unknownsFatal | Boolean | Terminate the composition if already created resources are assigned unknown values, default True |
258257
| self.usages| Boolean | Generate Crossplane Usages for resource dependencies, default False |
259258
| self.autoReady | Boolean | Perform auto ready processing on all composed resources, default True |
259+
| self.unknownsFatal | Boolean | Terminate the composition if already created resources are assigned unknown values, default False |
260260

261261
### Composed Resources
262262

@@ -281,9 +281,9 @@ Resource class:
281281
| Resource.conditions | Conditions | The resource conditions |
282282
| Resource.connection | Map | The resource observed connection details |
283283
| Resource.ready | Boolean | The resource ready state |
284-
| Resource.unknownsFatal | Boolean | Terminate the composition if this resource has been created and is assigned unknown values, default is Composite.unknownsFatal |
285284
| Resource.usages | Boolean | Generate Crossplane Usages for this resource, default is Composite.autoReady |
286285
| Resource.autoReady | Boolean | Perform auto ready processing on this resource, default is Composite.autoReady |
286+
| Resource.unknownsFatal | Boolean | Terminate the composition if this resource has been created and is assigned unknown values, default is Composite.unknownsFatal |
287287

288288
### Required Resources
289289

crossplane/pythonic/composite.py

Lines changed: 46 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ def __init__(self, crossplane_v1, request, single_use, logger):
111111
self.environment = self.context['apiextensions.crossplane.io/environment']
112112
self.requireds = Requireds(self)
113113
self.resources = Resources(self)
114-
self.unknownsFatal = True
115114
self.autoReady = True
116115
self.usages = False
116+
self.unknownsFatal = False
117117

118118
observed = self.request.observed.composite
119119
desired = self.response.desired.composite
@@ -238,16 +238,28 @@ def __init__(self, composite, name):
238238
self.desired = desired.resource
239239
self.conditions = Conditions(observed)
240240
self.connection = observed.connection_details
241-
self.unknownsFatal = None
241+
if self.desired._parent.ready == fnv1.Ready.READY_TRUE:
242+
self._ready = True
243+
elif self.desired._parent.ready == fnv1.Ready.READY_FALSE:
244+
self._ready = False
245+
else:
246+
self._ready = None
242247
self.autoReady = None
243248
self.usages = None
249+
self.unknownsFatal = None
244250

245-
def __call__(self, apiVersion=_notset, kind=_notset, namespace=_notset, name=_notset):
251+
def __call__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset):
246252
self.desired()
253+
if kind != _notset:
254+
# Allow for apiVersion in the first arg and kind in the second arg
255+
if '/' in kind or kind == 'v1':
256+
if apiVersion != _notset:
257+
self.kind = apiVersion
258+
apiVersion = kind
259+
else:
260+
self.kind = kind
247261
if apiVersion != _notset:
248262
self.apiVersion = apiVersion
249-
if kind != _notset:
250-
self.kind = kind
251263
if namespace != _notset:
252264
self.metadata.namespace = namespace
253265
if name != _notset:
@@ -296,6 +308,7 @@ def spec(self):
296308
def spec(self, spec):
297309
self.desired.spec = spec
298310

311+
# Used by Secret:v1
299312
@property
300313
def type(self):
301314
return self.desired.type
@@ -318,22 +331,17 @@ def status(self):
318331

319332
@property
320333
def ready(self):
321-
ready = self.desired._parent.ready
322-
if ready == fnv1.Ready.READY_TRUE:
323-
return True
324-
if ready == fnv1.Ready.READY_FALSE:
325-
return False
326-
return None
334+
return self._ready
327335

328336
@ready.setter
329337
def ready(self, ready):
330-
if ready:
331-
ready = fnv1.Ready.READY_TRUE
332-
elif ready == None or (isinstance(ready, protobuf.Value) and ready._isUnknown):
333-
ready = fnv1.Ready.READY_UNSPECIFIED
338+
self._ready = ready
339+
if ready is None:
340+
self.desired._parent.ready = fnv1.Ready.READY_UNSPECIFIED
341+
elif ready:
342+
self.desired._parent.ready = fnv1.Ready.READY_TRUE
334343
else:
335-
ready = fnv1.Ready.READY_FALSE
336-
self.desired._parent.ready = ready
344+
self.desired._parent.ready = fnv1.Ready.READY_FALSE
337345

338346

339347
class Requireds:
@@ -408,12 +416,18 @@ def __init__(self, composite, name):
408416
self._resources = composite.request.required_resources[name]
409417
self._cache = {}
410418

411-
def __call__(self, apiVersion=_notset, kind=_notset, namespace=_notset, name=_notset, labels=_notset):
419+
def __call__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset, labels=_notset):
412420
self._selector()
421+
if kind != _notset:
422+
# Allow for apiVersion in the first arg and kind in the second arg
423+
if '/' in kind or kind == 'v1':
424+
if apiVersion != _notset:
425+
self.kind = apiVersion
426+
apiVersion = kind
427+
else:
428+
self.kind = kind
413429
if apiVersion != _notset:
414430
self.apiVersion = apiVersion
415-
if kind != _notset:
416-
self.kind = kind
417431
if namespace != _notset:
418432
self.namespace = namespace
419433
if name != _notset:
@@ -802,60 +816,36 @@ def _resource_name(self):
802816

803817
@property
804818
def observed(self):
805-
if self._composite.crossplane_v1:
806-
return self._composite.response.observed.composite.connection_details
807-
data = protobuf.Map()
808-
for key, value in self._composite.resources[self._resource_name].observed.data:
809-
data[key] = protobuf.B64Decode(value)
810-
return data
819+
return self._composite.response.observed.composite.connection_details
811820

812821
def __getattr__(self, key):
813822
return self[key]
814823

815824
def __getitem__(self, key):
816-
if self._composite.crossplane_v1:
817-
return self._composite.response.desired.composite.connection_details[key]
818-
value = self._composite.resources[self._resource_name].data[key]
819-
if value:
820-
value = protobuf.B64Decode(value)
821-
return value
825+
return self._composite.response.desired.composite.connection_details[key]
822826

823827
def __bool__(self):
824-
if self._composite.crossplane_v1:
825-
return bool(self._composite.response.desired.composite.connection_details)
826-
return bool(self._composite.resources[self._resource_name].data)
828+
return bool(self._composite.response.desired.composite.connection_details)
827829

828830
def __len__(self):
829-
if self._composite.crossplane_v1:
830-
return len(self._composite.response.desired.composite.connection_details)
831-
return len(self._composite.resources[self._resource_name].data)
831+
return len(self._composite.response.desired.composite.connection_details)
832832

833833
def __contains__(self, key):
834-
if self._composite.crossplane_v1:
835-
return key in self._composite.response.desired.composite.connection_details
834+
return key in self._composite.response.desired.composite.connection_details
836835

837836
def __iter__(self):
838-
keys = set()
839-
if self._composite.crossplane_v1:
840-
for key, value in self._composite.response.desired.composite.connection_details:
841-
yield key, value
842-
for key, value in self._composite.resources[self._resource_name].data:
843-
yield key, protobuf.B64Decode(value)
837+
for key, value in self._composite.response.desired.composite.connection_details:
838+
yield key, value
844839

845840
def __str__(self):
846841
return format(self)
847842

848843
def __format__(self, spec='yaml'):
849-
if self._composite.crossplane_v1:
850-
return format(self._composite.response.desired.composite.connection_details, spec)
851-
data = protobuf.Map()
852-
for key, value in self._composite.resources[self._resource_name].data:
853-
data[key] = protobuf.B64Decode(value)
854-
return format(data, spec)
844+
return format(self._composite.response.desired.composite.connection_details, spec)
855845

856846
def __call__(self, **kwargs):
847+
self._composite.response.desired.composite.connection_details(**kwargs)
857848
if self._composite_v1:
858-
self._composite.response.desired.composite.connection_details(**kwargs)
859849
return
860850
del self._composite.resources[self._resource_name]
861851
for key, value in kwargs:
@@ -872,16 +862,13 @@ def __setitem__(self, key, value):
872862
if not value:
873863
return
874864
value = str(value)
875-
if self._composite.crossplane_v1:
876-
self._composite.response.desired.composite.connection_details[key] = value
865+
self._composite.response.desired.composite.connection_details[key] = value
866+
if self._composite.crossplane_v1 or not self._composite.connectionSecret.name:
877867
return
878-
#if not self._composite.connectionSecret.name:
879-
# return
880868
if self._resource_name in self._composite.resources:
881869
secret = self._composite.resources[self._resource_name]
882870
else:
883871
secret = self._composite.resources[self._resource_name]('v1', 'Secret')
884-
print(bool(self._composite.connectionSecret.name), len(self._composite.connectionSecret.name))
885872
if self._composite.connectionSecret.name and len(self._composite.connectionSecret.name):
886873
secret.metadata.name = self._composite.connectionSecret.name
887874
if not self._composite.metadata.namespace:
@@ -896,8 +883,8 @@ def __delattr__(self, key):
896883
del self[key]
897884

898885
def __delitem__(self, key):
886+
del self._composite.response.desired.composite.connection_details[key]
899887
if self._composite.crossplane_v1:
900-
del self._composite.response.desired.composite.connection_details[key]
901888
return
902889
if self._resource_name in self._composite.resources:
903890
del self._composite.resources[self._resource_name].data[key]

crossplane/pythonic/protobuf.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,29 @@ def Unknown():
3737

3838
def Yaml(string, readOnly=None):
3939
if isinstance(string, (FieldMessage, Value)):
40+
if not string:
41+
return string
4042
string = str(string)
4143
return Value(None, None, yaml.safe_load(string), readOnly)
4244

4345
def Json(string, readOnly=None):
4446
if isinstance(string, (FieldMessage, Value)):
47+
if not string:
48+
return string
4549
string = str(string)
4650
return Value(None, None, json.loads(string), readOnly)
4751

4852
def B64Encode(string):
4953
if isinstance(string, (FieldMessage, Value)):
54+
if not string:
55+
return string
5056
string = str(string)
5157
return base64.b64encode(string.encode('utf-8')).decode('utf-8')
5258

5359
def B64Decode(string):
5460
if isinstance(string, (FieldMessage, Value)):
61+
if not string:
62+
return string
5563
string = str(string)
5664
return base64.b64decode(string.encode('utf-8')).decode('utf-8')
5765

@@ -684,10 +692,11 @@ def __getattr__(self, key):
684692

685693
def __getitem__(self, key):
686694
key = self._validate_key(key)
687-
if key in self._cache:
688-
return self._cache[key]
689-
if key in self._unknowns:
690-
return self._unknowns[key]
695+
if key != append:
696+
if key in self._cache:
697+
return self._cache[key]
698+
if key in self._unknowns:
699+
return self._unknowns[key]
691700
if isinstance(key, str):
692701
match self._kind:
693702
case 'struct_value':
@@ -701,14 +710,26 @@ def __getitem__(self, key):
701710
elif isinstance(key, int):
702711
match self._kind:
703712
case 'list_value':
713+
if key < 0:
714+
key = len(self._value.list_value.values) + key
715+
if key < 0:
716+
key = 0
704717
if key < len(self._value.list_value.values):
705718
value = self._value.list_value.values[key]
706719
else:
720+
if key == append:
721+
key = len(self._value.list_value.values)
707722
value = _Unknown
708723
case 'ListValue':
724+
if key < 0:
725+
key = len(self._value.values) + key
726+
if key < 0:
727+
key = 0
709728
if key < len(self._value.values):
710729
value = self._value.values[key]
711730
else:
731+
if key == append:
732+
key = len(self._value.values)
712733
value = _Unknown
713734
case 'Unknown':
714735
value = _Unknown

0 commit comments

Comments
 (0)