Skip to content

Commit

Permalink
fix partial init errors
Browse files Browse the repository at this point in the history
  • Loading branch information
VenelinMartinov committed Dec 9, 2024
1 parent 0852d64 commit 5978502
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 13 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")
}
29 changes: 16 additions & 13 deletions pkg/tfshim/sdk-v2/provider2.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ func (p *planResourceChangeImpl) Apply(

resp, err := p.server.ApplyResourceChange(ctx, t, ty, cfg, st, pl, priv, meta)
if err != nil {
return nil, err
return resp, err
}
return &v2InstanceState2{
resourceType: t,
Expand Down Expand Up @@ -662,25 +662,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 newState, err

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / lint

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement) (typecheck)

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / lint

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement) (typecheck)

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / lint

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement) (typecheck)

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / lint

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement (typecheck)

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / test (1.23.x, ubuntu-latest, DEFAULT)

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement

Check failure on line 677 in pkg/tfshim/sdk-v2/provider2.go

View workflow job for this annotation

GitHub Actions / Test and Lint / test (1.23.x, ubuntu-latest, PULUMI_TF_BRIDGE_ACCURATE_BRIDGE_PREVIEW)

cannot use newState (variable of type "github.com/hashicorp/go-cty/cty".Value) as *v2InstanceState2 value in return statement
}
}
}
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 5978502

Please sign in to comment.