Skip to content

Commit ea35eb2

Browse files
Fix PF provider_server detailed diff handling (#2628)
This change fixes an issue with the `provider_server` implementation's detailed diff handling. Previously passing a detailed diff to it would result in the previews being deleted. This is tested as part of #2629 The problem was that we were re-calculating the `diffs` and `replaces` keys for the GRPC Diff protocol in the `provider_server` implementation but also doing that incorrectly. Instead this change now makes `provider_server`'s `marshalDiff` just pass through the `diffs` and `replaces` which we have already calculated in https://github.com/pulumi/pulumi-terraform-bridge/blob/1d6b032f3e376af4667c6c4d80a65eff072df807/pkg/pf/tfbridge/provider_diff.go#L108-L109 fixes #2620
1 parent bc33162 commit ea35eb2

File tree

2 files changed

+124
-39
lines changed

2 files changed

+124
-39
lines changed

pkg/pf/internal/plugin/provider_server.go

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ import (
2323
pbempty "github.com/golang/protobuf/ptypes/empty"
2424
"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
2525
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/config"
26-
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
2726
pl "github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
2827
"github.com/pulumi/pulumi/sdk/v3/go/common/tokens"
28+
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
2929
pulumirpc "github.com/pulumi/pulumi/sdk/v3/proto/go"
3030
"google.golang.org/grpc/codes"
3131
"google.golang.org/grpc/status"
@@ -76,82 +76,85 @@ func (p *providerServer) checkNYI(method string, err error) error {
7676
return err
7777
}
7878

79+
func pluginDiffKindToRPC(kind pl.DiffKind) pulumirpc.PropertyDiff_Kind {
80+
switch kind {
81+
case pl.DiffAdd:
82+
return pulumirpc.PropertyDiff_ADD
83+
case pl.DiffAddReplace:
84+
return pulumirpc.PropertyDiff_ADD_REPLACE
85+
case pl.DiffDelete:
86+
return pulumirpc.PropertyDiff_DELETE
87+
case pl.DiffDeleteReplace:
88+
return pulumirpc.PropertyDiff_DELETE_REPLACE
89+
case pl.DiffUpdate:
90+
return pulumirpc.PropertyDiff_UPDATE
91+
case pl.DiffUpdateReplace:
92+
return pulumirpc.PropertyDiff_UPDATE_REPLACE
93+
default:
94+
contract.Assertf(false, "unknown diff kind: %v", kind)
95+
return pulumirpc.PropertyDiff_ADD
96+
}
97+
}
98+
7999
func (p *providerServer) marshalDiff(diff pl.DiffResult) (*pulumirpc.DiffResponse, error) {
80-
changes := pulumirpc.DiffResponse_DIFF_UNKNOWN
100+
var changes pulumirpc.DiffResponse_DiffChanges
81101
switch diff.Changes {
82102
case pl.DiffNone:
83103
changes = pulumirpc.DiffResponse_DIFF_NONE
84104
case pl.DiffSome:
85105
changes = pulumirpc.DiffResponse_DIFF_SOME
106+
case pl.DiffUnknown:
107+
changes = pulumirpc.DiffResponse_DIFF_UNKNOWN
86108
}
87109

88110
// Infer the result from the detailed diff.
89111
var diffs, replaces []string
90112
var detailedDiff map[string]*pulumirpc.PropertyDiff
91-
if len(diff.DetailedDiff) == 0 {
92-
diffs = make([]string, len(diff.ChangedKeys))
93-
for i, k := range diff.ChangedKeys {
94-
diffs[i] = string(k)
95-
}
96-
replaces = make([]string, len(diff.ReplaceKeys))
97-
for i, k := range diff.ReplaceKeys {
98-
replaces[i] = string(k)
99-
}
100-
} else {
101-
changes = pulumirpc.DiffResponse_DIFF_SOME
102-
113+
if len(diff.DetailedDiff) != 0 {
103114
detailedDiff = make(map[string]*pulumirpc.PropertyDiff)
104115
for path, diff := range diff.DetailedDiff {
105-
diffs = append(diffs, path)
106-
107-
var kind pulumirpc.PropertyDiff_Kind
108-
switch diff.Kind {
109-
case pl.DiffAdd:
110-
kind = pulumirpc.PropertyDiff_ADD
111-
case pl.DiffAddReplace:
112-
kind, replaces = pulumirpc.PropertyDiff_ADD_REPLACE, append(replaces, path)
113-
case pl.DiffDelete:
114-
kind = pulumirpc.PropertyDiff_DELETE
115-
case pl.DiffDeleteReplace:
116-
kind, replaces = pulumirpc.PropertyDiff_DELETE, append(replaces, path)
117-
case pl.DiffUpdate:
118-
kind = pulumirpc.PropertyDiff_UPDATE
119-
case pl.DiffUpdateReplace:
120-
kind, replaces = pulumirpc.PropertyDiff_UPDATE_REPLACE, append(replaces, path)
121-
}
122-
123116
detailedDiff[path] = &pulumirpc.PropertyDiff{
124-
Kind: kind,
117+
Kind: pluginDiffKindToRPC(diff.Kind),
125118
InputDiff: diff.InputDiff,
126119
}
127120
}
128121
}
129122

123+
diffs = make([]string, len(diff.ChangedKeys))
124+
for i, k := range diff.ChangedKeys {
125+
diffs[i] = string(k)
126+
}
127+
replaces = make([]string, len(diff.ReplaceKeys))
128+
for i, k := range diff.ReplaceKeys {
129+
replaces[i] = string(k)
130+
}
131+
130132
return &pulumirpc.DiffResponse{
131133
Replaces: replaces,
132134
DeleteBeforeReplace: diff.DeleteBeforeReplace,
133135
Changes: changes,
134136
Diffs: diffs,
135137
DetailedDiff: detailedDiff,
138+
HasDetailedDiff: len(detailedDiff) > 0,
136139
}, nil
137140
}
138141

139142
type forwardServer struct {
140-
plugin.UnimplementedProvider
143+
pl.UnimplementedProvider
141144

142-
parameterize func(context.Context, plugin.ParameterizeRequest) (plugin.ParameterizeResponse, error)
145+
parameterize func(context.Context, pl.ParameterizeRequest) (pl.ParameterizeResponse, error)
143146
}
144147

145148
func (p forwardServer) Parameterize(
146-
ctx context.Context, req plugin.ParameterizeRequest,
147-
) (plugin.ParameterizeResponse, error) {
149+
ctx context.Context, req pl.ParameterizeRequest,
150+
) (pl.ParameterizeResponse, error) {
148151
return p.parameterize(ctx, req)
149152
}
150153

151154
func (p *providerServer) Parameterize(
152155
ctx context.Context, req *pulumirpc.ParameterizeRequest,
153156
) (*pulumirpc.ParameterizeResponse, error) {
154-
return plugin.NewProviderServer(&forwardServer{
157+
return pl.NewProviderServer(&forwardServer{
155158
parameterize: p.provider.ParameterizeWithContext,
156159
}).Parameterize(ctx, req)
157160
}
@@ -167,7 +170,7 @@ func (p *providerServer) GetSchema(ctx context.Context,
167170
}
168171
subpackageVersion = &ver
169172
}
170-
schema, err := p.provider.GetSchemaWithContext(ctx, plugin.GetSchemaRequest{
173+
schema, err := p.provider.GetSchemaWithContext(ctx, pl.GetSchemaRequest{
171174
Version: req.GetVersion(),
172175
SubpackageName: req.SubpackageName,
173176
SubpackageVersion: subpackageVersion,
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package plugin
2+
3+
import (
4+
"testing"
5+
6+
"github.com/pulumi/pulumi/sdk/v3/go/common/resource"
7+
"github.com/pulumi/pulumi/sdk/v3/go/common/resource/plugin"
8+
pulumirpc "github.com/pulumi/pulumi/sdk/v3/proto/go"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestMarshalDiff(t *testing.T) {
13+
t.Parallel()
14+
15+
runTest := func(t *testing.T, diff plugin.DiffResult) *pulumirpc.DiffResponse {
16+
server := providerServer{}
17+
resp, err := server.marshalDiff(diff)
18+
require.NoError(t, err)
19+
return resp
20+
}
21+
22+
t.Run("no diffs", func(t *testing.T) {
23+
diff := plugin.DiffResult{
24+
Changes: plugin.DiffNone,
25+
ReplaceKeys: []resource.PropertyKey{},
26+
ChangedKeys: []resource.PropertyKey{},
27+
DetailedDiff: map[string]plugin.PropertyDiff{},
28+
}
29+
30+
require.Equal(t, &pulumirpc.DiffResponse{
31+
Replaces: []string{},
32+
Changes: pulumirpc.DiffResponse_DIFF_NONE,
33+
Diffs: []string{},
34+
}, runTest(t, diff))
35+
})
36+
37+
t.Run("diff without detailed diff", func(t *testing.T) {
38+
diff := plugin.DiffResult{
39+
Changes: plugin.DiffSome,
40+
ReplaceKeys: []resource.PropertyKey{"replace"},
41+
ChangedKeys: []resource.PropertyKey{"change"},
42+
}
43+
44+
require.Equal(t, &pulumirpc.DiffResponse{
45+
Replaces: []string{"replace"},
46+
Changes: pulumirpc.DiffResponse_DIFF_SOME,
47+
Diffs: []string{"change"},
48+
}, runTest(t, diff))
49+
})
50+
51+
t.Run("diff with detailed diff", func(t *testing.T) {
52+
diff := plugin.DiffResult{
53+
Changes: plugin.DiffSome,
54+
ReplaceKeys: []resource.PropertyKey{"replace"},
55+
ChangedKeys: []resource.PropertyKey{"change", "replace"},
56+
DetailedDiff: map[string]plugin.PropertyDiff{
57+
"change": {
58+
Kind: plugin.DiffAdd,
59+
},
60+
"replace": {
61+
Kind: plugin.DiffDeleteReplace,
62+
},
63+
},
64+
}
65+
66+
require.Equal(t, &pulumirpc.DiffResponse{
67+
Replaces: []string{
68+
"replace",
69+
},
70+
Changes: pulumirpc.DiffResponse_DIFF_SOME,
71+
Diffs: []string{
72+
"change",
73+
"replace",
74+
},
75+
DetailedDiff: map[string]*pulumirpc.PropertyDiff{
76+
"change": {},
77+
"replace": {Kind: pulumirpc.PropertyDiff_DELETE_REPLACE},
78+
},
79+
HasDetailedDiff: true,
80+
}, runTest(t, diff))
81+
})
82+
}

0 commit comments

Comments
 (0)