diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_front.golden index b1c3ed88c..33c6fe7f1 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_front.golden @@ -35,17 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val2" => "val1" - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [0]: "val1" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_middle.golden index c4576437c..164174b5d 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_added_middle.golden @@ -35,15 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [1]: "val2" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_front.golden index 86c926225..bd90b2637 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_front.golden @@ -35,17 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [0]: "val1" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "DELETE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_middle.golden index daf24c780..d024d81b5 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/list_element_removed_middle.golden @@ -35,15 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [1]: "val2" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "DELETE"}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_added_front.golden index ce6d001aa..fb63cc23b 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_added_front.golden @@ -71,53 +71,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value0" => "value20" - ~ [1]: "value1" => "value0" - ~ [2]: "value2" => "value1" - ~ [3]: "value3" => "value2" - ~ [4]: "value4" => "value3" - ~ [5]: "value5" => "value4" - ~ [6]: "value6" => "value5" - ~ [7]: "value7" => "value6" - ~ [8]: "value8" => "value7" - ~ [9]: "value9" => "value8" - ~ [10]: "value10" => "value9" - ~ [11]: "value11" => "value10" - ~ [12]: "value12" => "value11" - ~ [13]: "value13" => "value12" - ~ [14]: "value14" => "value13" - ~ [15]: "value15" => "value14" - ~ [16]: "value16" => "value15" - ~ [17]: "value17" => "value16" - ~ [18]: "value18" => "value17" - ~ [19]: "value19" => "value18" - + [20]: "value19" + + [0]: "value20" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[20]": map[string]interface{}{}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_removed_front.golden index c99ae4eea..cb3b5c556 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/long_list_removed_front.golden @@ -71,53 +71,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value20" => "value0" - ~ [1]: "value0" => "value1" - ~ [2]: "value1" => "value2" - ~ [3]: "value2" => "value3" - ~ [4]: "value3" => "value4" - ~ [5]: "value4" => "value5" - ~ [6]: "value5" => "value6" - ~ [7]: "value6" => "value7" - ~ [8]: "value7" => "value8" - ~ [9]: "value8" => "value9" - ~ [10]: "value9" => "value10" - ~ [11]: "value10" => "value11" - ~ [12]: "value11" => "value12" - ~ [13]: "value12" => "value13" - ~ [14]: "value13" => "value14" - ~ [15]: "value14" => "value15" - ~ [16]: "value15" => "value16" - ~ [17]: "value16" => "value17" - ~ [18]: "value17" => "value18" - ~ [19]: "value18" => "value19" - - [20]: "value19" + - [0]: "value20" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[20]": map[string]interface{}{"kind": "DELETE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/one_added,_one_removed.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/one_added,_one_removed.golden index 2f3739585..dec07a726 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/one_added,_one_removed.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute/one_added,_one_removed.golden @@ -36,17 +36,15 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - ~ [2]: "val3" => "val4" + - [0]: "val1" + + [2]: "val4" ] Resources: ~ 1 to update 1 unchanged `, detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, + "props[0]": map[string]interface{}{"kind": "DELETE"}, + "props[2]": map[string]interface{}{}, }, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_front.golden index 5bba3c9fa..ccfc95e6b 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_front.golden @@ -35,17 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val2" => "val1" - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [0]: "val1" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_middle.golden index d0049cd16..d93d12820 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_added_middle.golden @@ -35,15 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [1]: "val2" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_front.golden index 3eae93fd6..47dabaff3 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_front.golden @@ -35,17 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [0]: "val1" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "DELETE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_middle.golden index 591b7046b..0f3ef46bc 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/list_element_removed_middle.golden @@ -35,15 +35,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [1]: "val2" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "DELETE"}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_added_front.golden index c46c88e7b..e1fdf6f57 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_added_front.golden @@ -71,53 +71,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value0" => "value20" - ~ [1]: "value1" => "value0" - ~ [2]: "value2" => "value1" - ~ [3]: "value3" => "value2" - ~ [4]: "value4" => "value3" - ~ [5]: "value5" => "value4" - ~ [6]: "value6" => "value5" - ~ [7]: "value7" => "value6" - ~ [8]: "value8" => "value7" - ~ [9]: "value9" => "value8" - ~ [10]: "value10" => "value9" - ~ [11]: "value11" => "value10" - ~ [12]: "value12" => "value11" - ~ [13]: "value13" => "value12" - ~ [14]: "value14" => "value13" - ~ [15]: "value15" => "value14" - ~ [16]: "value16" => "value15" - ~ [17]: "value17" => "value16" - ~ [18]: "value18" => "value17" - ~ [19]: "value19" => "value18" - + [20]: "value19" + + [0]: "value20" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[20]": map[string]interface{}{}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_removed_front.golden index f2b869eb7..68c02700e 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/long_list_removed_front.golden @@ -71,53 +71,11 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value20" => "value0" - ~ [1]: "value0" => "value1" - ~ [2]: "value1" => "value2" - ~ [3]: "value2" => "value3" - ~ [4]: "value3" => "value4" - ~ [5]: "value4" => "value5" - ~ [6]: "value5" => "value6" - ~ [7]: "value6" => "value7" - ~ [8]: "value7" => "value8" - ~ [9]: "value8" => "value9" - ~ [10]: "value9" => "value10" - ~ [11]: "value10" => "value11" - ~ [12]: "value11" => "value12" - ~ [13]: "value12" => "value13" - ~ [14]: "value13" => "value14" - ~ [15]: "value14" => "value15" - ~ [16]: "value15" => "value16" - ~ [17]: "value16" => "value17" - ~ [18]: "value17" => "value18" - ~ [19]: "value18" => "value19" - - [20]: "value19" + - [0]: "value20" ] Resources: ~ 1 to update 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[20]": map[string]interface{}{"kind": "DELETE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/one_added,_one_removed.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/one_added,_one_removed.golden index 72d35e9cf..c58da5c67 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/one_added,_one_removed.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_computed/one_added,_one_removed.golden @@ -36,17 +36,15 @@ Plan: 0 to add, 1 to change, 0 to destroy. [id=id] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - ~ [2]: "val3" => "val4" + - [0]: "val1" + + [2]: "val4" ] Resources: ~ 1 to update 1 unchanged `, detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE"}, + "props[0]": map[string]interface{}{"kind": "DELETE"}, + "props[2]": map[string]interface{}{}, }, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_front.golden index 3ec61dbe2..7a3e9b840 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_front.golden @@ -35,17 +35,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val2" => "val1" - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [0]: "val1" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "ADD_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "ADD_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_middle.golden index 8fbb74b1e..4e4850e16 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_added_middle.golden @@ -35,15 +35,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val3" => "val2" - + [2]: "val3" + + [1]: "val2" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "ADD_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{"kind": "ADD_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_front.golden index 3891d19f9..7500e438b 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_front.golden @@ -35,17 +35,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [0]: "val1" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "DELETE_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_middle.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_middle.golden index fd7d886ea..09ed90961 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_middle.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/list_element_removed_middle.golden @@ -35,15 +35,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [1]: "val2" => "val3" - - [2]: "val3" + - [1]: "val2" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "DELETE_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[1]": map[string]interface{}{"kind": "DELETE_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_added_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_added_front.golden index 746255c1a..74d917957 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_added_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_added_front.golden @@ -71,53 +71,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value0" => "value20" - ~ [1]: "value1" => "value0" - ~ [2]: "value2" => "value1" - ~ [3]: "value3" => "value2" - ~ [4]: "value4" => "value3" - ~ [5]: "value5" => "value4" - ~ [6]: "value6" => "value5" - ~ [7]: "value7" => "value6" - ~ [8]: "value8" => "value7" - ~ [9]: "value9" => "value8" - ~ [10]: "value10" => "value9" - ~ [11]: "value11" => "value10" - ~ [12]: "value12" => "value11" - ~ [13]: "value13" => "value12" - ~ [14]: "value14" => "value13" - ~ [15]: "value15" => "value14" - ~ [16]: "value16" => "value15" - ~ [17]: "value17" => "value16" - ~ [18]: "value18" => "value17" - ~ [19]: "value19" => "value18" - + [20]: "value19" + + [0]: "value20" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[20]": map[string]interface{}{"kind": "ADD_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "ADD_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_removed_front.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_removed_front.golden index 43f682438..211da0999 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_removed_front.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/long_list_removed_front.golden @@ -71,53 +71,11 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "value20" => "value0" - ~ [1]: "value0" => "value1" - ~ [2]: "value1" => "value2" - ~ [3]: "value2" => "value3" - ~ [4]: "value3" => "value4" - ~ [5]: "value4" => "value5" - ~ [6]: "value5" => "value6" - ~ [7]: "value6" => "value7" - ~ [8]: "value7" => "value8" - ~ [9]: "value8" => "value9" - ~ [10]: "value9" => "value10" - ~ [11]: "value10" => "value11" - ~ [12]: "value11" => "value12" - ~ [13]: "value12" => "value13" - ~ [14]: "value13" => "value14" - ~ [15]: "value14" => "value15" - ~ [16]: "value15" => "value16" - ~ [17]: "value16" => "value17" - ~ [18]: "value17" => "value18" - ~ [19]: "value18" => "value19" - - [20]: "value19" + - [0]: "value20" ] Resources: +-1 to replace 1 unchanged `, - detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[10]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[11]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[12]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[13]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[14]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[15]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[16]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[17]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[18]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[19]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[20]": map[string]interface{}{"kind": "DELETE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[3]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[4]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[5]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[6]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[7]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[8]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[9]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - }, + detailedDiff: map[string]interface{}{"props[0]": map[string]interface{}{"kind": "DELETE_REPLACE"}}, } diff --git a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/one_added,_one_removed.golden b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/one_added,_one_removed.golden index 01d406799..4b17ee628 100644 --- a/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/one_added,_one_removed.golden +++ b/pkg/tests/diff_test/testdata/TestSDKv2DetailedDiffList/list_attribute_force_new/one_added,_one_removed.golden @@ -36,17 +36,15 @@ Plan: 1 to add, 0 to change, 1 to destroy. [id=newid] [urn=urn:pulumi:test::project::crossprovider:index/testRes:TestRes::example] ~ props: [ - ~ [0]: "val1" => "val2" - ~ [1]: "val2" => "val3" - ~ [2]: "val3" => "val4" + - [0]: "val1" + + [2]: "val4" ] Resources: +-1 to replace 1 unchanged `, detailedDiff: map[string]interface{}{ - "props[0]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[1]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, - "props[2]": map[string]interface{}{"kind": "UPDATE_REPLACE"}, + "props[0]": map[string]interface{}{"kind": "DELETE_REPLACE"}, + "props[2]": map[string]interface{}{"kind": "ADD_REPLACE"}, }, } diff --git a/pkg/tfbridge/detailed_diff.go b/pkg/tfbridge/detailed_diff.go index 66987b831..b31d90727 100644 --- a/pkg/tfbridge/detailed_diff.go +++ b/pkg/tfbridge/detailed_diff.go @@ -15,6 +15,7 @@ import ( "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfbridge/info" shim "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfshim" "github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfshim/walk" + "github.com/pulumi/pulumi-terraform-bridge/v3/unstable/difft" "github.com/pulumi/pulumi-terraform-bridge/v3/unstable/propertyvalue" ) @@ -427,6 +428,55 @@ func (differ detailedDiffer) makePropDiff( } } +// makeListAttributeDiff should only be called for lists of scalar values. +// Note that the algorithm used is ~N^2, so it should not be used for large lists. +func makeListAttributeDiff( + path propertyPath, old, new []resource.PropertyValue, +) map[detailedDiffKey]*pulumirpc.PropertyDiff { + contract.Assertf(len(old) < 1000 && len(new) < 1000, "makeListAttributeDiff should not be used for large lists") + diff := make(map[detailedDiffKey]*pulumirpc.PropertyDiff) + type valIndex struct { + Value resource.PropertyValue + Index int + } + + oldVals := []valIndex{} + for i, v := range old { + oldVals = append(oldVals, valIndex{Value: v, Index: i}) + } + newVals := []valIndex{} + for i, v := range new { + newVals = append(newVals, valIndex{Value: v, Index: i}) + } + + edits := difft.DiffT(oldVals, newVals, difft.DiffOptions[valIndex]{ + Equals: func(a, b valIndex) bool { + return a.Value.DeepEquals(b.Value) + }, + }) + + for _, edit := range edits { + if edit.Change == difft.Insert { + key := path.Index(edit.Element.Index) + if diff[key.Key()] == nil { + diff[key.Key()] = &pulumirpc.PropertyDiff{Kind: pulumirpc.PropertyDiff_ADD} + } else { + diff[key.Key()] = &pulumirpc.PropertyDiff{Kind: pulumirpc.PropertyDiff_UPDATE} + } + } + if edit.Change == difft.Remove { + key := path.Index(edit.Element.Index) + if diff[key.Key()] == nil { + diff[key.Key()] = &pulumirpc.PropertyDiff{Kind: pulumirpc.PropertyDiff_DELETE} + } else { + diff[key.Key()] = &pulumirpc.PropertyDiff{Kind: pulumirpc.PropertyDiff_UPDATE} + } + } + } + + return diff +} + func (differ detailedDiffer) makeListDiff( path propertyPath, old, new resource.PropertyValue, ) map[detailedDiffKey]*pulumirpc.PropertyDiff { @@ -434,9 +484,27 @@ func (differ detailedDiffer) makeListDiff( oldList := old.ArrayValue() newList := new.ArrayValue() - // naive diffing of lists - // TODO[pulumi/pulumi-terraform-bridge#2295]: implement a more sophisticated diffing algorithm - // investigate how this interacts with force new - is identity preserved or just order + tfs, _, err := lookupSchemas(path, differ.tfs, differ.ps) + if err != nil { + return nil + } + + // We attempt to optimize the diff displayed for list attributes with a reasonable number of elements. + _, scalarElemType := tfs.Elem().(shim.Schema) + if scalarElemType && len(oldList) < 1000 && len(newList) < 1000 { + listDiff := makeListAttributeDiff(path, oldList, newList) + if tfs.ForceNew() { + for k, v := range listDiff { + diff[k] = promoteToReplace(v) + } + } else { + for k, v := range listDiff { + diff[k] = v + } + } + return diff + } + longerLen := max(len(oldList), len(newList)) for i := 0; i < longerLen; i++ { elem := func(l []resource.PropertyValue) resource.PropertyValue {