Skip to content

Commit

Permalink
Revert "Revert "Pass state back to the engine if Apply encountered an…
Browse files Browse the repository at this point in the history
… error" (#2707)"
  • Loading branch information
VenelinMartinov committed Dec 10, 2024
1 parent 545a6f3 commit 0ef10a3
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 21 deletions.
51 changes: 51 additions & 0 deletions pkg/tests/schema_pulumi_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,54 @@ func TestMakeTerraformResultNilVsEmptyMap(t *testing.T) {
assert.True(t, props["test"].DeepEquals(emptyMap))
})
}

func TestResourceInitFailure(t *testing.T) {
t.Parallel()

resMap := map[string]*schema.Resource{
"prov_test": {
Schema: map[string]*schema.Schema{
"test": {
Type: schema.TypeString,
Required: true,
},
},
CreateContext: func(ctx context.Context, rd *schema.ResourceData, i interface{}) diag.Diagnostics {
rd.SetId("1")
return diag.Errorf("INIT TEST ERROR")
},
},
}
prov := &schema.Provider{ResourcesMap: resMap}
bridgedProvider := pulcheck.BridgedProvider(t, "prov", prov)

pt := pulcheck.PulCheck(t, bridgedProvider, `
name: test
runtime: yaml
resources:
mainRes:
type: prov:index:Test
properties:
test: "hello"
`)

_, err := pt.CurrentStack().Up(pt.Context())
require.Error(t, err)
require.ErrorContains(t, err, "INIT TEST ERROR")

stack := pt.ExportStack(t)

data, err := stack.Deployment.MarshalJSON()
require.NoError(t, err)

var stateMap map[string]interface{}
err = json.Unmarshal(data, &stateMap)
require.NoError(t, err)

resourcesList := stateMap["resources"].([]interface{})
require.Len(t, resourcesList, 3)
mainResState := resourcesList[2].(map[string]interface{}) // stack, provider, resource
initErrors := mainResState["initErrors"].([]interface{})
require.Len(t, initErrors, 1)
require.Contains(t, initErrors[0], "INIT TEST ERROR")
}
37 changes: 16 additions & 21 deletions pkg/tfshim/sdk-v2/provider2.go
Original file line number Diff line number Diff line change
Expand Up @@ -347,15 +347,7 @@ func (p *planResourceChangeImpl) Apply(
maps.Copy(priv, diff.v2InstanceDiff.tf.Meta)
}

resp, err := p.server.ApplyResourceChange(ctx, t, ty, cfg, st, pl, priv, meta)
if err != nil {
return nil, err
}
return &v2InstanceState2{
resourceType: t,
stateValue: resp.stateValue,
meta: resp.meta,
}, nil
return p.server.ApplyResourceChange(ctx, t, ty, cfg, st, pl, priv, meta)
}

// This method is called to service `pulumi refresh` requests and maps naturally to the TF
Expand Down Expand Up @@ -662,25 +654,28 @@ func (s *grpcServer) ApplyResourceChange(
}
req.ProviderMeta = &tfprotov5.DynamicValue{MsgPack: providerMetaVal}
}
resp, err := s.gserver.ApplyResourceChange(ctx, req)
if err := handleDiagnostics(ctx, resp.Diagnostics, err); err != nil {
return nil, err
}
newState, err := msgpack.Unmarshal(resp.NewState.MsgPack, ty)
if err != nil {
return nil, err
}
resp, applyErr := s.gserver.ApplyResourceChange(ctx, req)
newState := cty.Value{}
var meta map[string]interface{}
if resp.Private != nil {
if err := json.Unmarshal(resp.Private, &meta); err != nil {
return nil, err
if resp != nil {
if resp.NewState != nil {
newState, err = msgpack.Unmarshal(resp.NewState.MsgPack, ty)
if err != nil {
return nil, err
}
}
if resp.Private != nil {
if err := json.Unmarshal(resp.Private, &meta); err != nil {
return nil, err
}
}
}
returnErr := handleDiagnostics(ctx, resp.Diagnostics, applyErr)
return &v2InstanceState2{
resourceType: typeName,
stateValue: newState,
meta: meta,
}, nil
}, returnErr
}

func (s *grpcServer) ReadResource(
Expand Down

0 comments on commit 0ef10a3

Please sign in to comment.