diff --git a/internal/function/fn.go b/internal/function/fn.go index 9a99906..c7e8f4a 100644 --- a/internal/function/fn.go +++ b/internal/function/fn.go @@ -110,26 +110,26 @@ func (f *Function) RunFunction(ctx context.Context, req *fnv1beta1.RunFunctionRe return nil, errors.Wrapf(err, "rendered Pkl file was not in expected format. did you amend @crossplane/CompositionResponse.pkl?") } - fixedRequirements := &fnv1beta1.Requirements{ - ExtraResources: convertExtraResources(helperResponse.Requirements.ExtraResources), - } - responseMeta := &fnv1beta1.ResponseMeta{ Tag: req.GetMeta().GetTag(), Ttl: durationpb.New(response.DefaultTTL), } + if ttl := helperResponse.GetMeta().GetTtl(); ttl != nil { + responseMeta.Ttl = ttl + } // Note: consider not overwriting rsp and whether it makes a difference. rsp = &fnv1beta1.RunFunctionResponse{ - Meta: responseMeta, - Desired: helperResponse.Desired, - Results: helperResponse.Results, - Context: helperResponse.Context, - Requirements: fixedRequirements, + Meta: responseMeta, + Desired: helperResponse.Desired, + Results: helperResponse.Results, + Context: helperResponse.Context, } - if ttl := helperResponse.GetMeta().GetTtl(); ttl != nil { - rsp.Meta.Ttl = ttl + if helperResponse.Requirements != nil && helperResponse.Requirements.ExtraResources != nil { + rsp.Requirements = &fnv1beta1.Requirements{ + ExtraResources: convertExtraResources(helperResponse.Requirements.ExtraResources), + } } return rsp, nil diff --git a/internal/function/fn_test.go b/internal/function/fn_test.go index 7dcb3d3..4d4d93e 100644 --- a/internal/function/fn_test.go +++ b/internal/function/fn_test.go @@ -17,6 +17,7 @@ package function import ( "context" "fmt" + "github.com/crossplane/function-sdk-go/response" "os" "testing" @@ -54,6 +55,71 @@ func TestRunFunction(t *testing.T) { args args want want }{ + "Minimal": { + reason: "The Function should create a single resource", + args: args{ + ctx: context.TODO(), + req: &fnv1beta1.RunFunctionRequest{ + Input: resource.MustStructObject(&v1beta1.Pkl{ + Spec: v1beta1.PklSpec{ + Type: "local", + Local: &v1beta1.Local{ + ProjectDir: pklPackage, + File: pklPackage + "/minimal.pkl", + }, + }, + }), + Observed: &fnv1beta1.State{ + Composite: &fnv1beta1.Resource{ + Resource: resource.MustStructJSON(`{ + "apiVersion": "example.crossplane.io/v1", + "kind": "XR", + "metadata": { + "name": "example-xr" + }, + "spec": {} + }`), + }, + }, + }, + }, + want: want{ + rsp: &fnv1beta1.RunFunctionResponse{ + Meta: &fnv1beta1.ResponseMeta{ + Ttl: durationpb.New(response.DefaultTTL), + }, + Desired: &fnv1beta1.State{ + Composite: &fnv1beta1.Resource{}, + Resources: map[string]*fnv1beta1.Resource{ + "cm-minimal": { + Resource: resource.MustStructJSON(`{ + "apiVersion": "kubernetes.crossplane.io/v1alpha2", + "kind": "Object", + "metadata": { + "name": "cm-one" + }, + "spec": { + "forProvider": { + "manifest": { + "apiVersion": "v1", + "kind": "ConfigMap", + "metadata": { + "name": "cm-minimal", + "namespace": "crossplane-system" + }, + "data": { + "foo": "bar" + } + } + } + } + }`), + }, + }, + }, + }, + }, + }, "Full": { reason: "The Function should create a full functionResult", args: args{