@@ -5798,6 +5798,103 @@ New Identity: cty.ObjectVal(map[string]cty.Value{"identity":cty.StringVal("chang
57985798				},
57995799			},
58005800		},
5801+ 		"update-resource-identity-may-change-if-mutable-identity-allowed" : {
5802+ 			server : NewGRPCProviderServer (& Provider {
5803+ 				ResourcesMap : map [string ]* Resource {
5804+ 					"test" : {
5805+ 						ResourceBehavior : ResourceBehavior {
5806+ 							MutableIdentity : true ,
5807+ 						},
5808+ 						SchemaVersion : 1 ,
5809+ 						Schema : map [string ]* Schema {
5810+ 							"id" : {
5811+ 								Type :     TypeString ,
5812+ 								Required : true ,
5813+ 							},
5814+ 							"test" : {
5815+ 								Type : TypeString ,
5816+ 							},
5817+ 						},
5818+ 						Identity : & ResourceIdentity {
5819+ 							Version : 1 ,
5820+ 							SchemaFunc : func () map [string ]* Schema  {
5821+ 								return  map [string ]* Schema {
5822+ 									"identity" : {
5823+ 										Type :              TypeString ,
5824+ 										RequiredForImport : true ,
5825+ 									},
5826+ 								}
5827+ 							},
5828+ 						},
5829+ 						ReadContext : func (ctx  context.Context , d  * ResourceData , meta  interface {}) diag.Diagnostics  {
5830+ 							identity , err  :=  d .Identity ()
5831+ 							if  err  !=  nil  {
5832+ 								return  diag .FromErr (err )
5833+ 							}
5834+ 							err  =  identity .Set ("identity" , "changed" )
5835+ 							if  err  !=  nil  {
5836+ 								return  diag .FromErr (err )
5837+ 							}
5838+ 
5839+ 							return  nil 
5840+ 						},
5841+ 					},
5842+ 				},
5843+ 			}),
5844+ 			req : & tfprotov5.ReadResourceRequest {
5845+ 				TypeName : "test" ,
5846+ 				CurrentIdentity : & tfprotov5.ResourceIdentityData {
5847+ 					IdentityData : & tfprotov5.DynamicValue {
5848+ 						MsgPack : mustMsgpackMarshal (
5849+ 							cty .Object (map [string ]cty.Type {
5850+ 								"identity" : cty .String ,
5851+ 							}),
5852+ 							cty .ObjectVal (map [string ]cty.Value {
5853+ 								"identity" : cty .StringVal ("initial" ),
5854+ 							}),
5855+ 						),
5856+ 					},
5857+ 				},
5858+ 				CurrentState : & tfprotov5.DynamicValue {
5859+ 					MsgPack : mustMsgpackMarshal (
5860+ 						cty .Object (map [string ]cty.Type {
5861+ 							"test" : cty .String ,
5862+ 							"id" :   cty .String ,
5863+ 						}),
5864+ 						cty .ObjectVal (map [string ]cty.Value {
5865+ 							"test" : cty .StringVal ("hello" ),
5866+ 							"id" :   cty .StringVal ("initial" ),
5867+ 						}),
5868+ 					),
5869+ 				},
5870+ 			},
5871+ 			expected : & tfprotov5.ReadResourceResponse {
5872+ 				NewState : & tfprotov5.DynamicValue {
5873+ 					MsgPack : mustMsgpackMarshal (
5874+ 						cty .Object (map [string ]cty.Type {
5875+ 							"id" :   cty .String ,
5876+ 							"test" : cty .String ,
5877+ 						}),
5878+ 						cty .ObjectVal (map [string ]cty.Value {
5879+ 							"id" :   cty .StringVal ("initial" ),
5880+ 							"test" : cty .StringVal ("hello" ),
5881+ 						}),
5882+ 					),
5883+ 				},
5884+ 				NewIdentity : & tfprotov5.ResourceIdentityData {
5885+ 					IdentityData : & tfprotov5.DynamicValue {
5886+ 						MsgPack : mustMsgpackMarshal (
5887+ 							cty .Object (map [string ]cty.Type {
5888+ 								"identity" : cty .String ,
5889+ 							}),
5890+ 							cty .ObjectVal (map [string ]cty.Value {
5891+ 								"identity" : cty .StringVal ("changed" ),
5892+ 							}),
5893+ 						),
5894+ 					},
5895+ 				},
5896+ 			},
5897+ 		},
58015898		// "destroy-resource-identity-may-not-change": not required, as same request and response as update-resource-identity-may-not-change 
58025899		// "upgraded-identity-version-identity-may-not-change": not required, as same request and response as update-resource-identity-may-not-change 
58035900	}
@@ -7129,6 +7226,119 @@ Planned Identity: cty.ObjectVal(map[string]cty.Value{"identity":cty.StringVal("c
71297226				},
71307227			},
71317228		},
7229+ 		"update-resource-identity-may-change-if-mutable-identity-allowed" : {
7230+ 			server : NewGRPCProviderServer (& Provider {
7231+ 				ResourcesMap : map [string ]* Resource {
7232+ 					"test" : {
7233+ 						ResourceBehavior : ResourceBehavior {
7234+ 							MutableIdentity : true ,
7235+ 						},
7236+ 						SchemaVersion : 1 ,
7237+ 						Schema : map [string ]* Schema {
7238+ 							"id" : {
7239+ 								Type :     TypeString ,
7240+ 								Required : true ,
7241+ 							},
7242+ 							"test" : {
7243+ 								Type : TypeString ,
7244+ 							},
7245+ 						},
7246+ 						Identity : & ResourceIdentity {
7247+ 							Version : 1 ,
7248+ 							SchemaFunc : func () map [string ]* Schema  {
7249+ 								return  map [string ]* Schema {
7250+ 									"identity" : {
7251+ 										Type :              TypeString ,
7252+ 										RequiredForImport : true ,
7253+ 									},
7254+ 								}
7255+ 							},
7256+ 						},
7257+ 						CustomizeDiff : func (ctx  context.Context , d  * ResourceDiff , meta  interface {}) error  {
7258+ 							identity , err  :=  d .Identity ()
7259+ 							if  err  !=  nil  {
7260+ 								return  err 
7261+ 							}
7262+ 							err  =  identity .Set ("identity" , "changed" )
7263+ 							if  err  !=  nil  {
7264+ 								return  err 
7265+ 							}
7266+ 							return  nil 
7267+ 						},
7268+ 					},
7269+ 				},
7270+ 			}),
7271+ 			req : & tfprotov5.PlanResourceChangeRequest {
7272+ 				TypeName : "test" ,
7273+ 				PriorState : & tfprotov5.DynamicValue {
7274+ 					MsgPack : mustMsgpackMarshal (
7275+ 						cty .Object (map [string ]cty.Type {
7276+ 							"id" :   cty .String ,
7277+ 							"test" : cty .String ,
7278+ 						}),
7279+ 						cty .ObjectVal (map [string ]cty.Value {
7280+ 							"id" :   cty .StringVal ("initial" ),
7281+ 							"test" : cty .StringVal ("initial" ),
7282+ 						}),
7283+ 					),
7284+ 				},
7285+ 				PriorIdentity : & tfprotov5.ResourceIdentityData {
7286+ 					IdentityData : & tfprotov5.DynamicValue {
7287+ 						MsgPack : mustMsgpackMarshal (
7288+ 							cty .Object (map [string ]cty.Type {
7289+ 								"identity" : cty .String ,
7290+ 							}),
7291+ 							cty .ObjectVal (map [string ]cty.Value {
7292+ 								"identity" : cty .StringVal ("initial" ),
7293+ 							}),
7294+ 						),
7295+ 					},
7296+ 				},
7297+ 				ProposedNewState : & tfprotov5.DynamicValue {
7298+ 					MsgPack : mustMsgpackMarshal (
7299+ 						cty .Object (map [string ]cty.Type {
7300+ 							"id" :   cty .String ,
7301+ 							"test" : cty .String ,
7302+ 						}),
7303+ 						cty .ObjectVal (map [string ]cty.Value {
7304+ 							"id" :   cty .UnknownVal (cty .String ),
7305+ 							"test" : cty .StringVal ("initial" ),
7306+ 						}),
7307+ 					),
7308+ 				},
7309+ 				Config : & tfprotov5.DynamicValue {
7310+ 					MsgPack : mustMsgpackMarshal (
7311+ 						cty .Object (map [string ]cty.Type {
7312+ 							"id" :   cty .String ,
7313+ 							"test" : cty .String ,
7314+ 						}),
7315+ 						cty .ObjectVal (map [string ]cty.Value {
7316+ 							"id" :   cty .NullVal (cty .String ),
7317+ 							"test" : cty .StringVal ("initial" ),
7318+ 						}),
7319+ 					),
7320+ 				},
7321+ 			},
7322+ 			expected : & tfprotov5.PlanResourceChangeResponse {
7323+ 				PlannedState : & tfprotov5.DynamicValue {
7324+ 					MsgPack : mustMsgpackMarshal (
7325+ 						cty .Object (map [string ]cty.Type {
7326+ 							"id" :   cty .String ,
7327+ 							"test" : cty .String ,
7328+ 						}),
7329+ 						cty .ObjectVal (map [string ]cty.Value {
7330+ 							"id" :   cty .UnknownVal (cty .String ),
7331+ 							"test" : cty .StringVal ("initial" ),
7332+ 						}),
7333+ 					),
7334+ 				},
7335+ 				RequiresReplace : []* tftypes.AttributePath {
7336+ 					tftypes .NewAttributePath ().WithAttributeName ("id" ),
7337+ 				},
7338+ 				PlannedPrivate :              []byte (`{"_new_extra_shim":{}}` ),
7339+ 				UnsafeToUseLegacyTypeSystem : true ,
7340+ 			},
7341+ 		},
71327342		"update-resource-without-prior-identity-identity-may-change" : {
71337343			server : NewGRPCProviderServer (& Provider {
71347344				ResourcesMap : map [string ]* Resource {
@@ -8153,6 +8363,129 @@ New Identity: cty.ObjectVal(map[string]cty.Value{"identity":cty.StringVal("chang
81538363				},
81548364			},
81558365		},
8366+ 		"update-resource-identity-may-change-if-mutable-identity-allowed" : {
8367+ 			server : NewGRPCProviderServer (& Provider {
8368+ 				ResourcesMap : map [string ]* Resource {
8369+ 					"test" : {
8370+ 						ResourceBehavior : ResourceBehavior {
8371+ 							MutableIdentity : true ,
8372+ 						},
8373+ 						SchemaVersion : 1 ,
8374+ 						Schema : map [string ]* Schema {
8375+ 							"id" : {
8376+ 								Type :     TypeString ,
8377+ 								Required : true ,
8378+ 							},
8379+ 							"test" : {
8380+ 								Type : TypeString ,
8381+ 							},
8382+ 						},
8383+ 						Identity : & ResourceIdentity {
8384+ 							Version : 1 ,
8385+ 							SchemaFunc : func () map [string ]* Schema  {
8386+ 								return  map [string ]* Schema {
8387+ 									"identity" : {
8388+ 										Type :              TypeString ,
8389+ 										RequiredForImport : true ,
8390+ 									},
8391+ 								}
8392+ 							},
8393+ 						},
8394+ 						UpdateContext : func (_  context.Context , rd  * ResourceData , _  interface {}) diag.Diagnostics  {
8395+ 							identity , err  :=  rd .Identity ()
8396+ 							if  err  !=  nil  {
8397+ 								return  diag .FromErr (err )
8398+ 							}
8399+ 							err  =  identity .Set ("identity" , "changed" )
8400+ 							if  err  !=  nil  {
8401+ 								return  diag .FromErr (err )
8402+ 							}
8403+ 							rd .SetId ("changed" )
8404+ 							return  nil 
8405+ 						},
8406+ 					},
8407+ 				},
8408+ 			}),
8409+ 			req : & tfprotov5.ApplyResourceChangeRequest {
8410+ 				TypeName : "test" ,
8411+ 				PriorState : & tfprotov5.DynamicValue {
8412+ 					MsgPack : mustMsgpackMarshal (
8413+ 						cty .Object (map [string ]cty.Type {
8414+ 							"id" :   cty .String ,
8415+ 							"test" : cty .String ,
8416+ 						}),
8417+ 						cty .ObjectVal (map [string ]cty.Value {
8418+ 							"id" :   cty .StringVal ("initial" ),
8419+ 							"test" : cty .StringVal ("initial" ),
8420+ 						}),
8421+ 					),
8422+ 				},
8423+ 				PlannedState : & tfprotov5.DynamicValue {
8424+ 					MsgPack : mustMsgpackMarshal (
8425+ 						cty .Object (map [string ]cty.Type {
8426+ 							"id" :   cty .String ,
8427+ 							"test" : cty .String ,
8428+ 						}),
8429+ 						cty .ObjectVal (map [string ]cty.Value {
8430+ 							"id" :   cty .StringVal ("initial" ),
8431+ 							"test" : cty .StringVal ("initial" ),
8432+ 						}),
8433+ 					),
8434+ 				},
8435+ 				PlannedIdentity : & tfprotov5.ResourceIdentityData {
8436+ 					IdentityData : & tfprotov5.DynamicValue {
8437+ 						MsgPack : mustMsgpackMarshal (
8438+ 							cty .Object (map [string ]cty.Type {
8439+ 								"identity" : cty .String ,
8440+ 							}),
8441+ 							cty .ObjectVal (map [string ]cty.Value {
8442+ 								"identity" : cty .StringVal ("initial" ),
8443+ 							}),
8444+ 						),
8445+ 					},
8446+ 				},
8447+ 				Config : & tfprotov5.DynamicValue {
8448+ 					MsgPack : mustMsgpackMarshal (
8449+ 						cty .Object (map [string ]cty.Type {
8450+ 							"id" :   cty .String ,
8451+ 							"test" : cty .String ,
8452+ 						}),
8453+ 						cty .ObjectVal (map [string ]cty.Value {
8454+ 							"id" :   cty .NullVal (cty .String ),
8455+ 							"test" : cty .StringVal ("initial" ),
8456+ 						}),
8457+ 					),
8458+ 				},
8459+ 			},
8460+ 			expected : & tfprotov5.ApplyResourceChangeResponse {
8461+ 				NewState : & tfprotov5.DynamicValue {
8462+ 					MsgPack : mustMsgpackMarshal (
8463+ 						cty .Object (map [string ]cty.Type {
8464+ 							"id" :   cty .String ,
8465+ 							"test" : cty .String ,
8466+ 						}),
8467+ 						cty .ObjectVal (map [string ]cty.Value {
8468+ 							"id" :   cty .StringVal ("changed" ),
8469+ 							"test" : cty .StringVal ("initial" ),
8470+ 						}),
8471+ 					),
8472+ 				},
8473+ 				Private :                     []uint8 (`{"schema_version":"1"}` ),
8474+ 				UnsafeToUseLegacyTypeSystem : true ,
8475+ 				NewIdentity : & tfprotov5.ResourceIdentityData {
8476+ 					IdentityData : & tfprotov5.DynamicValue {
8477+ 						MsgPack : mustMsgpackMarshal (
8478+ 							cty .Object (map [string ]cty.Type {
8479+ 								"identity" : cty .String ,
8480+ 							}),
8481+ 							cty .ObjectVal (map [string ]cty.Value {
8482+ 								"identity" : cty .StringVal ("changed" ),
8483+ 							}),
8484+ 						),
8485+ 					},
8486+ 				},
8487+ 			},
8488+ 		},
81568489		"update-resource-without-planned-identity-identity-may-change" : {
81578490			server : NewGRPCProviderServer (& Provider {
81588491				ResourcesMap : map [string ]* Resource {
0 commit comments