diff --git a/pkg/tfbridge/detailed_diff.go b/pkg/tfbridge/detailed_diff.go index 8896bd62d..12da5ea39 100644 --- a/pkg/tfbridge/detailed_diff.go +++ b/pkg/tfbridge/detailed_diff.go @@ -304,6 +304,22 @@ func (differ detailedDiffer) makeShortCircuitDiff( return map[detailedDiffKey]*pulumirpc.PropertyDiff{path.Key(): propDiff} } +func isTypeMismatched(val resource.PropertyValue, propType shim.ValueType) bool { + if !isPresent(val) { + return false + } + switch propType { + case shim.TypeList: + return !val.IsArray() + case shim.TypeSet: + return !val.IsArray() + case shim.TypeMap: + return !val.IsObject() + default: + return false + } +} + func (differ detailedDiffer) makePropDiff( path propertyPath, old, new resource.PropertyValue, ) map[detailedDiffKey]*pulumirpc.PropertyDiff { @@ -311,6 +327,15 @@ func (differ detailedDiffer) makePropDiff( return nil } propType := differ.getEffectiveType(differ.propertyPathToSchemaPath(path)) + if !isPresent(old) || isTypeMismatched(old, propType) { + old = resource.NewNullProperty() + } + if !isPresent(new) || isTypeMismatched(new, propType) && !new.IsComputed() { + new = resource.NewNullProperty() + } + if old.IsNull() || new.IsNull() || new.IsComputed() { + return differ.makeShortCircuitDiff(path, old, new) + } switch propType { case shim.TypeList: @@ -329,16 +354,6 @@ func (differ detailedDiffer) makePropDiff( func (differ detailedDiffer) makeListDiff( path propertyPath, old, new resource.PropertyValue, ) map[detailedDiffKey]*pulumirpc.PropertyDiff { - if !isPresent(old) || !old.IsArray() { - old = resource.NewNullProperty() - } - if (!isPresent(new) || !new.IsArray()) && !new.IsComputed() { - new = resource.NewNullProperty() - } - if old.IsNull() || new.IsNull() || new.IsComputed() { - return differ.makeShortCircuitDiff(path, old, new) - } - diff := make(map[detailedDiffKey]*pulumirpc.PropertyDiff) oldList := old.ArrayValue() newList := new.ArrayValue() @@ -368,16 +383,6 @@ func (differ detailedDiffer) makeListDiff( func (differ detailedDiffer) makeMapDiff( path propertyPath, old, new resource.PropertyValue, ) map[detailedDiffKey]*pulumirpc.PropertyDiff { - if !isPresent(old) || !old.IsObject() { - old = resource.NewNullProperty() - } - if !isPresent(new) || !new.IsObject() && !new.IsComputed() { - new = resource.NewNullProperty() - } - if old.IsNull() || new.IsNull() || new.IsComputed() { - return differ.makeShortCircuitDiff(path, old, new) - } - oldMap := old.ObjectValue() newMap := new.ObjectValue() diff := make(map[detailedDiffKey]*pulumirpc.PropertyDiff)