Skip to content

Commit 75b5a45

Browse files
authored
Merge pull request crossplane-contrib#55 from phisco/dev/patch-and-order
2 parents f6c8462 + 1160364 commit 75b5a45

12 files changed

+1051
-480
lines changed

fn.go

+10-55
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,11 @@ func (f *Function) RunFunction(ctx context.Context, req *fnv1beta1.RunFunctionRe
114114
}
115115

116116
if input.Environment != nil {
117-
// Run all patches that are from the (observed) XR to the environment.
118-
if err := RenderToEnvironmentPatches(env, oxr.Resource, input.Environment.Patches); err != nil {
117+
// Run all patches that are from the (observed) XR to the environment or from the environment to the (desired) XR.
118+
if err := RenderEnvironmentPatches(env, oxr.Resource, dxr.Resource, input.Environment.Patches); err != nil {
119119
response.Fatal(rsp, errors.Wrapf(err, "cannot render ToEnvironment patches from the composite resource"))
120120
return rsp, nil
121121
}
122-
123-
// Run all patches that are from the environment to the (desired) XR.
124-
if err := RenderFromEnvironmentPatches(dxr.Resource, env, input.Environment.Patches); err != nil {
125-
response.Fatal(rsp, errors.Wrapf(err, "cannot render FromEnvironment patches to the composite resource"))
126-
return rsp, nil
127-
}
128122
}
129123

130124
// Increment this if you emit a warning result.
@@ -196,58 +190,19 @@ func (f *Function) RunFunction(ctx context.Context, req *fnv1beta1.RunFunctionRe
196190
log.Debug("Found corresponding observed resource",
197191
"ready", ready,
198192
"name", ocd.Resource.GetName())
199-
200-
// TODO(negz): Should failures to patch the XR be terminal? It could
201-
// indicate a required patch failed. A required patch means roughly
202-
// "this patch has to succeed before you mutate the resource". This
203-
// is useful to make sure we never create a composed resource in the
204-
// wrong state. It's less clear how useful it is for the XR, given
205-
// we'll only ever be updating it, not creating it.
206-
207-
// We want to patch the XR from observed composed resources, not
208-
// from desired state. This is because folks will typically be
209-
// patching from a field that is set once the observed resource is
210-
// applied such as its status.
211-
if err := RenderToCompositePatches(dxr.Resource, ocd.Resource, t.Patches); err != nil {
212-
response.Warning(rsp, errors.Wrapf(err, "cannot render ToComposite patches for composed resource %q", t.Name))
213-
log.Info("Cannot render ToComposite patches for composed resource", "warning", err)
214-
warnings++
215-
}
216-
217-
// TODO(negz): Same as above, but for the Environment. What does it
218-
// mean for a required patch to the environment to fail? Should it
219-
// be terminal?
220-
221-
// Run all patches that are from the (observed) composed resource to
222-
// the environment.
223-
if err := RenderToEnvironmentPatches(env, ocd.Resource, t.Patches); err != nil {
224-
response.Warning(rsp, errors.Wrapf(err, "cannot render ToEnvironment patches for composed resource %q", t.Name))
225-
log.Info("Cannot render ToEnvironment patches for composed resource", "warning", err)
226-
warnings++
227-
}
228193
}
229194

230-
// If either of the below renderings return an error, most likely a
231-
// required FromComposite or FromEnvironment patch failed. A required
232-
// patch means roughly "this patch has to succeed before you mutate the
233-
// resource." This is useful to make sure we never create a composed
234-
// resource in the wrong state. To that end, we don't want to add this
235-
// resource to our accumulated desired state.
236-
if err := RenderFromCompositePatches(dcd.Resource, oxr.Resource, t.Patches); err != nil {
237-
response.Warning(rsp, errors.Wrapf(err, "cannot render FromComposite patches for composed resource %q", t.Name))
238-
log.Info("Cannot render FromComposite patches for composed resource", "warning", err)
195+
errs, store := RenderComposedPatches(ocd.Resource, dcd.Resource, oxr.Resource, dxr.Resource, env, t.Patches)
196+
for _, err := range errs {
197+
response.Warning(rsp, errors.Wrapf(err, "cannot render patches for composed resource %q", t.Name))
198+
log.Info("Cannot render patches for composed resource", "warning", err)
239199
warnings++
240-
continue
241-
}
242-
if err := RenderFromEnvironmentPatches(dcd.Resource, env, t.Patches); err != nil {
243-
response.Warning(rsp, errors.Wrapf(err, "cannot render FromEnvironment patches for composed resource %q", t.Name))
244-
log.Info("Cannot render FromEnvironment patches for composed resource", "warning", err)
245-
warnings++
246-
continue
247200
}
248201

249-
// Add or replace our desired resource.
250-
desired[resource.Name(t.Name)] = dcd
202+
if store {
203+
// Add or replace our desired resource.
204+
desired[resource.Name(t.Name)] = dcd
205+
}
251206
}
252207

253208
if err := response.SetDesiredCompositeResource(rsp, dxr); err != nil {

0 commit comments

Comments
 (0)