Skip to content

Commit d312015

Browse files
authored
[Internal] Fix irregularities in plugin framework converter function errors (#4010)
## Changes <!-- Summary of your changes that are easy to understand --> I noticed few irregularities in converter functions while working on clusters plugin framework migration, creating a PR to address those: 1. Typo in error message -- in `GoSdkToTfSdkStruct` we say: `tfsdk to gosdk struct conversion failure`. It should be `gosdk to tfsdk struct conversion failure` 2. In `GoSdkToTfSdkStruct ` we don't specify destination value type but we do it in `TfSdkToGoSdkStruct`. 3. Abstract the error message out to reduce redundancy 4. Standardise similar types of error messages to be same so it's easier to maintain. ## Tests <!-- How is this tested? Please see the checklist below and also describe any other relevant tests --> Added unit tests. - [ ] `make test` run locally - [ ] relevant change in `docs/` folder - [ ] covered with integration tests in `internal/acceptance` - [ ] relevant acceptance tests are passing - [ ] using Go SDK
1 parent e8ce7e7 commit d312015

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed

internal/providers/pluginfw/converters/converters_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"reflect"
77
"testing"
88

9+
"github.com/hashicorp/terraform-plugin-framework/diag"
910
"github.com/hashicorp/terraform-plugin-framework/types"
1011
"github.com/stretchr/testify/assert"
1112
)
@@ -100,6 +101,24 @@ func RunConverterTest(t *testing.T, description string, tfSdkStruct DummyTfSdk,
100101
assert.True(t, reflect.DeepEqual(convertedTfSdkStruct, tfSdkStruct), fmt.Sprintf("gosdk to tfsdk conversion - %s", description))
101102
}
102103

104+
func TestTfSdkToGoSdkStructConversionFailure(t *testing.T) {
105+
tfSdkStruct := DummyTfSdk{}
106+
goSdkStruct := DummyGoSdk{}
107+
actualDiagnostics := TfSdkToGoSdkStruct(context.Background(), tfSdkStruct, goSdkStruct)
108+
expectedDiagnostics := diag.Diagnostics{diag.NewErrorDiagnostic(tfSdkToGoSdkStructConversionFailureMessage, "please provide a pointer for the gosdk struct, got DummyGoSdk")}
109+
assert.True(t, actualDiagnostics.HasError())
110+
assert.True(t, actualDiagnostics.Equal(expectedDiagnostics))
111+
}
112+
113+
func TestGoSdkToTfSdkStructConversionFailure(t *testing.T) {
114+
tfSdkStruct := DummyTfSdk{}
115+
goSdkStruct := DummyGoSdk{}
116+
actualDiagnostics := GoSdkToTfSdkStruct(context.Background(), goSdkStruct, tfSdkStruct)
117+
expectedDiagnostics := diag.Diagnostics{diag.NewErrorDiagnostic(goSdkToTfSdkStructConversionFailureMessage, "please provide a pointer for the tfsdk struct, got DummyTfSdk")}
118+
assert.True(t, actualDiagnostics.HasError())
119+
assert.True(t, actualDiagnostics.Equal(expectedDiagnostics))
120+
}
121+
103122
var tests = []struct {
104123
name string
105124
tfSdkStruct DummyTfSdk

internal/providers/pluginfw/converters/go_to_tf.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import (
1313
"github.com/databricks/terraform-provider-databricks/internal/tfreflect"
1414
)
1515

16+
const goSdkToTfSdkStructConversionFailureMessage = "gosdk to tfsdk struct conversion failure"
17+
const goSdkToTfSdkFieldConversionFailureMessage = "gosdk to tfsdk field conversion failure"
18+
1619
// GoSdkToTfSdkStruct converts a gosdk struct into a tfsdk struct, with the folowing rules.
1720
//
1821
// string -> types.String
@@ -38,12 +41,12 @@ func GoSdkToTfSdkStruct(ctx context.Context, gosdk interface{}, tfsdk interface{
3841
}
3942

4043
if destVal.Kind() != reflect.Ptr {
41-
return diag.Diagnostics{diag.NewErrorDiagnostic("please provide a pointer for the tfsdk struct", "tfsdk to gosdk struct conversion failure")}
44+
return diag.Diagnostics{diag.NewErrorDiagnostic(goSdkToTfSdkStructConversionFailureMessage, fmt.Sprintf("please provide a pointer for the tfsdk struct, got %s", destVal.Type().Name()))}
4245
}
4346
destVal = destVal.Elem()
4447

4548
if srcVal.Kind() != reflect.Struct || destVal.Kind() != reflect.Struct {
46-
return diag.Diagnostics{diag.NewErrorDiagnostic(fmt.Sprintf("input should be structs %s, %s", srcVal.Type().Name(), destVal.Type().Name()), "tfsdk to gosdk struct conversion failure")}
49+
return diag.Diagnostics{diag.NewErrorDiagnostic(goSdkToTfSdkStructConversionFailureMessage, fmt.Sprintf("input should be structs %s, %s", srcVal.Type().Name(), destVal.Type().Name()))}
4750
}
4851

4952
var forceSendFieldVal []string
@@ -73,7 +76,7 @@ func GoSdkToTfSdkStruct(ctx context.Context, gosdk interface{}, tfsdk interface{
7376

7477
err := goSdkToTfSdkSingleField(ctx, srcField, destField, fieldInForceSendFields(srcFieldName, forceSendFieldVal))
7578
if err != nil {
76-
return diag.Diagnostics{diag.NewErrorDiagnostic(err.Error(), "gosdk to tfsdk field conversion failure")}
79+
return diag.Diagnostics{diag.NewErrorDiagnostic(goSdkToTfSdkFieldConversionFailureMessage, err.Error())}
7780
}
7881
}
7982
return nil
@@ -101,7 +104,7 @@ func goSdkToTfSdkSingleField(ctx context.Context, srcField reflect.Value, destFi
101104

102105
// Recursively populate the nested struct.
103106
if GoSdkToTfSdkStruct(ctx, srcFieldValue, destField.Interface()).HasError() {
104-
panic(fmt.Sprintf("Error converting gosdk to tfsdk struct. %s", common.TerraformBugErrorMessage))
107+
panic(fmt.Sprintf("%s. %s", goSdkToTfSdkStructConversionFailureMessage, common.TerraformBugErrorMessage))
105108
}
106109
case reflect.Bool:
107110
boolVal := srcFieldValue.(bool)
@@ -150,7 +153,7 @@ func goSdkToTfSdkSingleField(ctx context.Context, srcField reflect.Value, destFi
150153
}
151154
// resolve the nested struct by recursively calling the function
152155
if GoSdkToTfSdkStruct(ctx, srcFieldValue, destField.Addr().Interface()).HasError() {
153-
panic(fmt.Sprintf("Error converting gosdk to tfsdk struct. %s", common.TerraformBugErrorMessage))
156+
panic(fmt.Sprintf("%s. %s", goSdkToTfSdkStructConversionFailureMessage, common.TerraformBugErrorMessage))
154157
}
155158
case reflect.Slice:
156159
if srcField.IsNil() {

internal/providers/pluginfw/converters/tf_to_go.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ import (
1414
"github.com/databricks/terraform-provider-databricks/internal/tfreflect"
1515
)
1616

17+
const tfSdkToGoSdkStructConversionFailureMessage = "tfsdk to gosdk struct conversion failure"
18+
const tfSdkToGoSdkFieldConversionFailureMessage = "tfsdk to gosdk field conversion failure"
19+
1720
// TfSdkToGoSdkStruct converts a tfsdk struct into a gosdk struct, with the folowing rules.
1821
//
1922
// types.String -> string
@@ -37,12 +40,12 @@ func TfSdkToGoSdkStruct(ctx context.Context, tfsdk interface{}, gosdk interface{
3740
}
3841

3942
if destVal.Kind() != reflect.Ptr {
40-
return diag.Diagnostics{diag.NewErrorDiagnostic(fmt.Sprintf("please provide a pointer for the gosdk struct, got %s", destVal.Type().Name()), "tfsdk to gosdk struct conversion failure")}
43+
return diag.Diagnostics{diag.NewErrorDiagnostic(tfSdkToGoSdkStructConversionFailureMessage, fmt.Sprintf("please provide a pointer for the gosdk struct, got %s", destVal.Type().Name()))}
4144
}
4245
destVal = destVal.Elem()
4346

4447
if srcVal.Kind() != reflect.Struct {
45-
return diag.Diagnostics{diag.NewErrorDiagnostic(fmt.Sprintf("input should be structs, got %s,", srcVal.Type().Name()), "tfsdk to gosdk struct conversion failure")}
48+
return diag.Diagnostics{diag.NewErrorDiagnostic(tfSdkToGoSdkStructConversionFailureMessage, fmt.Sprintf("input should be structs, got %s,", srcVal.Type().Name()))}
4649
}
4750

4851
forceSendFieldsField := destVal.FieldByName("ForceSendFields")
@@ -61,7 +64,7 @@ func TfSdkToGoSdkStruct(ctx context.Context, tfsdk interface{}, gosdk interface{
6164

6265
err := tfSdkToGoSdkSingleField(ctx, srcField, destField, srcFieldName, &forceSendFieldsField)
6366
if err != nil {
64-
return diag.Diagnostics{diag.NewErrorDiagnostic(err.Error(), "tfsdk to gosdk field conversion failure")}
67+
return diag.Diagnostics{diag.NewErrorDiagnostic(tfSdkToGoSdkFieldConversionFailureMessage, err.Error())}
6568
}
6669
}
6770

@@ -93,7 +96,7 @@ func tfSdkToGoSdkSingleField(ctx context.Context, srcField reflect.Value, destFi
9396

9497
// Recursively populate the nested struct.
9598
if TfSdkToGoSdkStruct(ctx, srcFieldValue, destField.Interface()).HasError() {
96-
panic(fmt.Sprintf("Error converting tfsdk to gosdk struct. %s", common.TerraformBugErrorMessage))
99+
panic(fmt.Sprintf("%s. %s", tfSdkToGoSdkStructConversionFailureMessage, common.TerraformBugErrorMessage))
97100
}
98101
} else if srcField.Kind() == reflect.Struct {
99102
tfsdkToGoSdkStructField(srcField, destField, srcFieldName, forceSendFieldsField, ctx)
@@ -199,7 +202,7 @@ func tfsdkToGoSdkStructField(srcField reflect.Value, destField reflect.Value, sr
199202
}
200203
// If it is a real stuct instead of a tfsdk type, recursively resolve it.
201204
if TfSdkToGoSdkStruct(ctx, srcFieldValue, destField.Addr().Interface()).HasError() {
202-
panic(fmt.Sprintf("Error converting tfsdk to gosdk struct. %s", common.TerraformBugErrorMessage))
205+
panic(fmt.Sprintf("%s. %s", tfSdkToGoSdkStructConversionFailureMessage, common.TerraformBugErrorMessage))
203206
}
204207
}
205208
}

0 commit comments

Comments
 (0)