Skip to content

Commit 1bb1237

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

File tree

8 files changed

+396
-210
lines changed

8 files changed

+396
-210
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: 32 additions & 47 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,22 @@ 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
242241
self.autoReady = None
243242
self.usages = None
243+
self.unknownsFatal = None
244244

245-
def __call__(self, apiVersion=_notset, kind=_notset, namespace=_notset, name=_notset):
245+
def __call__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset):
246246
self.desired()
247+
if kind != _notset:
248+
# Allow for apiVersion in the first arg and kind in the second arg
249+
if '/' in kind or kind == 'v1':
250+
if apiVersion != _notset:
251+
self.kind = apiVersion
252+
apiVersion = kind
253+
else:
254+
self.kind = kind
247255
if apiVersion != _notset:
248256
self.apiVersion = apiVersion
249-
if kind != _notset:
250-
self.kind = kind
251257
if namespace != _notset:
252258
self.metadata.namespace = namespace
253259
if name != _notset:
@@ -408,12 +414,18 @@ def __init__(self, composite, name):
408414
self._resources = composite.request.required_resources[name]
409415
self._cache = {}
410416

411-
def __call__(self, apiVersion=_notset, kind=_notset, namespace=_notset, name=_notset, labels=_notset):
417+
def __call__(self, kind=_notset, apiVersion=_notset, namespace=_notset, name=_notset, labels=_notset):
412418
self._selector()
419+
if kind != _notset:
420+
# Allow for apiVersion in the first arg and kind in the second arg
421+
if '/' in kind or kind == 'v1':
422+
if apiVersion != _notset:
423+
self.kind = apiVersion
424+
apiVersion = kind
425+
else:
426+
self.kind = kind
413427
if apiVersion != _notset:
414428
self.apiVersion = apiVersion
415-
if kind != _notset:
416-
self.kind = kind
417429
if namespace != _notset:
418430
self.namespace = namespace
419431
if name != _notset:
@@ -802,60 +814,36 @@ def _resource_name(self):
802814

803815
@property
804816
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
817+
return self._composite.response.observed.composite.connection_details
811818

812819
def __getattr__(self, key):
813820
return self[key]
814821

815822
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
823+
return self._composite.response.desired.composite.connection_details[key]
822824

823825
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)
826+
return bool(self._composite.response.desired.composite.connection_details)
827827

828828
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)
829+
return len(self._composite.response.desired.composite.connection_details)
832830

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

837834
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)
835+
for key, value in self._composite.response.desired.composite.connection_details:
836+
yield key, value
844837

845838
def __str__(self):
846839
return format(self)
847840

848841
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)
842+
return format(self._composite.response.desired.composite.connection_details, spec)
855843

856844
def __call__(self, **kwargs):
845+
self._composite.response.desired.composite.connection_details(**kwargs)
857846
if self._composite_v1:
858-
self._composite.response.desired.composite.connection_details(**kwargs)
859847
return
860848
del self._composite.resources[self._resource_name]
861849
for key, value in kwargs:
@@ -872,16 +860,13 @@ def __setitem__(self, key, value):
872860
if not value:
873861
return
874862
value = str(value)
875-
if self._composite.crossplane_v1:
876-
self._composite.response.desired.composite.connection_details[key] = value
863+
self._composite.response.desired.composite.connection_details[key] = value
864+
if self._composite.crossplane_v1 or not self._composite.connectionSecret.name:
877865
return
878-
#if not self._composite.connectionSecret.name:
879-
# return
880866
if self._resource_name in self._composite.resources:
881867
secret = self._composite.resources[self._resource_name]
882868
else:
883869
secret = self._composite.resources[self._resource_name]('v1', 'Secret')
884-
print(bool(self._composite.connectionSecret.name), len(self._composite.connectionSecret.name))
885870
if self._composite.connectionSecret.name and len(self._composite.connectionSecret.name):
886871
secret.metadata.name = self._composite.connectionSecret.name
887872
if not self._composite.metadata.namespace:
@@ -896,8 +881,8 @@ def __delattr__(self, key):
896881
del self[key]
897882

898883
def __delitem__(self, key):
884+
del self._composite.response.desired.composite.connection_details[key]
899885
if self._composite.crossplane_v1:
900-
del self._composite.response.desired.composite.connection_details[key]
901886
return
902887
if self._resource_name in self._composite.resources:
903888
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)