From 83ccf508e87fc3e2cc552400033ba9c9a2558952 Mon Sep 17 00:00:00 2001 From: "Patrick J. McNerthney" Date: Mon, 4 Aug 2025 20:32:51 -1000 Subject: [PATCH] Enable self.resources.newresource = { ... } --- examples/get-started-app/composition.yaml | 4 +-- function/composite.py | 9 +++++- tests/fn_cases/bucket.yaml | 19 ------------ tests/fn_cases/buckets.yaml | 37 +++++++++++++++++++++++ tests/fn_cases/get-started-app.yaml | 7 +++-- 5 files changed, 52 insertions(+), 24 deletions(-) delete mode 100644 tests/fn_cases/bucket.yaml create mode 100644 tests/fn_cases/buckets.yaml diff --git a/examples/get-started-app/composition.yaml b/examples/get-started-app/composition.yaml index c29f4dd..3639dbb 100644 --- a/examples/get-started-app/composition.yaml +++ b/examples/get-started-app/composition.yaml @@ -19,7 +19,7 @@ spec: def compose(self): labels = {'example.crossplane.io/app': self.metadata.name} - d = self.resources.deployment('apps/v1', 'Deployment') + d = self.resources.deployment('apps/v1', 'Deployment', self.metadata.namespace) d.metadata.labels = labels d.spec.replicas = 2 d.spec.selector.matchLabels = labels @@ -29,7 +29,7 @@ spec: d.spec.template.spec.containers[0].ports[0].containerPort = 80 d.ready = d.conditions.Available.status - s = self.resources.service('v1', 'Service') + s = self.resources.service('v1', 'Service', self.metadata.namespace) s.metadata.labels = labels s.spec.selector = labels s.spec.ports[0].protocol = 'TCP' diff --git a/function/composite.py b/function/composite.py index 47cdd58..26841d5 100644 --- a/function/composite.py +++ b/function/composite.py @@ -90,7 +90,7 @@ def __iter__(self): class Resources: def __init__(self, composite): - self._composite = composite + self.__dict__['_composite'] = composite def __getattr__(self, key): return self[key] @@ -111,6 +111,13 @@ def __iter__(self): for name, resource in self._composite.response.desired.resources: yield name, self[name] + def __setattr__(self, key, resource): + self[key] = resource + + def __setitem__(self, key, resource): + print('SETITEM', key, resource) + self._composite.response.desired.resources[key].resource = resource + def __delattr__(self, key): del self[key] diff --git a/tests/fn_cases/bucket.yaml b/tests/fn_cases/bucket.yaml deleted file mode 100644 index 93841d3..0000000 --- a/tests/fn_cases/bucket.yaml +++ /dev/null @@ -1,19 +0,0 @@ -request: - input: - composite: | - class Composite(BaseComposite): - def compose(self): - self.resources.bucket.apiVersion = 's3.aws.upbound.io/v1beta2' - self.resources.bucket.kind = 'Bucket' - self.resources.bucket.spec.forProvider.region = 'us-east-1' - -response: - desired: - resources: - bucket: - resource: - apiVersion: s3.aws.upbound.io/v1beta2 - kind: Bucket - spec: - forProvider: - region: us-east-1 diff --git a/tests/fn_cases/buckets.yaml b/tests/fn_cases/buckets.yaml new file mode 100644 index 0000000..744d00a --- /dev/null +++ b/tests/fn_cases/buckets.yaml @@ -0,0 +1,37 @@ +request: + input: + composite: | + class Composite(BaseComposite): + def compose(self): + + self.resources.bucket1.apiVersion = 's3.aws.upbound.io/v1beta2' + self.resources.bucket1.kind = 'Bucket' + self.resources.bucket1.spec.forProvider.region = 'us-east-1' + + self.resources.bucket2 = { + 'apiVersion': 's3.aws.upbound.io/v1beta2', + 'kind': 'Bucket', + 'spec': { + 'forProvider': { + 'region': 'us-east-1', + }, + }, + } + +response: + desired: + resources: + bucket1: + resource: + apiVersion: s3.aws.upbound.io/v1beta2 + kind: Bucket + spec: + forProvider: + region: us-east-1 + bucket2: + resource: + apiVersion: s3.aws.upbound.io/v1beta2 + kind: Bucket + spec: + forProvider: + region: us-east-1 diff --git a/tests/fn_cases/get-started-app.yaml b/tests/fn_cases/get-started-app.yaml index 5273c5e..ab1eded 100644 --- a/tests/fn_cases/get-started-app.yaml +++ b/tests/fn_cases/get-started-app.yaml @@ -3,6 +3,7 @@ request: composite: resource: metadata: + namespace: my-namespace name: my-app spec: image: nginx @@ -26,7 +27,7 @@ request: def compose(self): labels = {'example.crossplane.io/app': self.metadata.name} - d = self.resources.deployment('apps/v1', 'Deployment') + d = self.resources.deployment('apps/v1', 'Deployment', self.metadata.namespace) d.metadata.labels = labels d.spec.replicas = 2 d.spec.selector.matchLabels = labels @@ -36,7 +37,7 @@ request: d.spec.template.spec.containers[0].ports[0].containerPort = 80 d.ready = d.conditions.Available.status - s = self.resources.service('v1', 'Service') + s = self.resources.service('v1', 'Service', self.metadata.namespace) s.metadata.labels = labels s.spec.selector = labels s.spec.ports[0].protocol = 'TCP' @@ -62,6 +63,7 @@ response: metadata: labels: example.crossplane.io/app: my-app + namespace: my-namespace spec: replicas: 2 selector: @@ -85,6 +87,7 @@ response: metadata: labels: example.crossplane.io/app: my-app + namespace: my-namespace spec: selector: example.crossplane.io/app: my-app