From 071a1d73459cbe4ba1991c6047befbe551107ba0 Mon Sep 17 00:00:00 2001 From: Matthew Jeffryes Date: Fri, 20 Jun 2025 13:32:07 -0700 Subject: [PATCH 1/2] WIP: try to bubble up resource replacements to module replacements --- pkg/modprovider/module.go | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pkg/modprovider/module.go b/pkg/modprovider/module.go index 71cc529c..bf67cb3a 100644 --- a/pkg/modprovider/module.go +++ b/pkg/modprovider/module.go @@ -127,9 +127,9 @@ func (h *moduleHandler) Diff( return nil, err } + inputsChanged := false if !oldInputs.DeepEquals(newInputs) { - // Inputs have changed, so we need tell the engine that an update is needed. - return &pulumirpc.DiffResponse{Changes: pulumirpc.DiffResponse_DIFF_SOME}, nil + inputsChanged = true } // Here, inputs have not changes but the underlying module might have changed @@ -142,7 +142,7 @@ func (h *moduleHandler) Diff( tf, err := h.prepSandbox( ctx, urn, - oldInputs, + newInputs, oldOutputs, inferredModule, moduleSource, @@ -159,12 +159,19 @@ func (h *moduleHandler) Diff( return nil, fmt.Errorf("error performing plan during Diff(...) %w", err) } + replaceKeys := []string{} resourcesChanged := false - plan.VisitResourcePlans(func(resource *tfsandbox.ResourcePlan) { - if resource.ChangeKind() != tfsandbox.NoOp { + plan.VisitResourcePlans(func(res *tfsandbox.ResourcePlan) { + println("Visiting resource plan for", res.Address()) + println("Change kind is", res.ChangeKind()) + if res.ChangeKind() != tfsandbox.NoOp { // if there is any resource change that is not a no-op, we need to update. resourcesChanged = true } + // Add any resources that are replacing to the replaceKeys list. + if res.ChangeKind() == tfsandbox.Replace || res.ChangeKind() == tfsandbox.ReplaceDestroyBeforeCreate { + replaceKeys = append(replaceKeys, string(res.Address())) + } }) outputsChanged := false @@ -175,8 +182,16 @@ func (h *moduleHandler) Diff( } } - if resourcesChanged || outputsChanged { - return &pulumirpc.DiffResponse{Changes: pulumirpc.DiffResponse_DIFF_SOME}, nil + println("Is it DIFF_SOME?", inputsChanged || resourcesChanged || outputsChanged) + println("inputsChanged?", inputsChanged) + println("resourcesChanged?", resourcesChanged) + println("outputsChanged?", outputsChanged) + + if inputsChanged || resourcesChanged || outputsChanged { + return &pulumirpc.DiffResponse{ + Changes: pulumirpc.DiffResponse_DIFF_SOME, + Replaces: replaceKeys, + }, nil } // the module has not changed, return DIFF_NONE. From 056eb0c4a0b45ca585eaee2b3287afb8c3d92677 Mon Sep 17 00:00:00 2001 From: Anton Tayanovskyy Date: Fri, 27 Jun 2025 11:00:28 -0400 Subject: [PATCH 2/2] Use a delete-before-replace variation --- pkg/modprovider/module.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pkg/modprovider/module.go b/pkg/modprovider/module.go index bf67cb3a..47a0064a 100644 --- a/pkg/modprovider/module.go +++ b/pkg/modprovider/module.go @@ -188,10 +188,14 @@ func (h *moduleHandler) Diff( println("outputsChanged?", outputsChanged) if inputsChanged || resourcesChanged || outputsChanged { - return &pulumirpc.DiffResponse{ - Changes: pulumirpc.DiffResponse_DIFF_SOME, - Replaces: replaceKeys, - }, nil + resp := &pulumirpc.DiffResponse{ + Changes: pulumirpc.DiffResponse_DIFF_SOME, + } + if len(replaceKeys) > 0 { + resp.Replaces = replaceKeys + resp.DeleteBeforeReplace = true + } + return resp, nil } // the module has not changed, return DIFF_NONE.