Skip to content

Commit

Permalink
Fix 3092 (#3126)
Browse files Browse the repository at this point in the history
Fixes #3092 

With these changes EventSourceMapping resources should successfully
transition from v5 to v6 version of the provider via an Update plan.

The root cause is fixed in
pulumi/pulumi-terraform-bridge#1561 and applied
here through the bridge dependency update. Specifically the
EventSourceMapping example is a special case of a situation where
upstream changes of MaxItems=1 list restrictions surface as breaking
schema changes for Pulumi state. With the latest bridge versions bridged
providers will detect these changes an force an Update plan to migrate
the affected resources's state onto the new version.

---------

Co-authored-by: Venelin <[email protected]>
Co-authored-by: pulumi-bot <[email protected]>
  • Loading branch information
3 people authored Dec 12, 2023
1 parent 08401e2 commit c14542a
Show file tree
Hide file tree
Showing 8 changed files with 107 additions and 28 deletions.
73 changes: 73 additions & 0 deletions examples/examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -520,3 +520,76 @@ func TestS3BucketObjectDeprecation(t *testing.T) {
out := <-outC
assert.NotContains(t, out, "aws_s3_object")
}

func TestWrongStateMaxItemOneDiffProduced(t *testing.T) {
repro := `
[
{
"method": "/pulumirpc.ResourceProvider/Diff",
"request": {
"id": "f8af893f-869e-4861-a403-1a4fe3509754",
"urn": "urn:pulumi:dev::aws_esm_py::aws:lambda/eventSourceMapping:EventSourceMapping::example",
"olds": {
"amazonManagedKafkaEventSourceConfig": null,
"batchSize": 10,
"bisectBatchOnFunctionError": false,
"destinationConfig": null,
"documentDbEventSourceConfig": null,
"enabled": true,
"eventSourceArn": "arn:aws:sqs:us-east-1:616138583583:queue-7798098",
"filterCriteria": null,
"functionArn": "arn:aws:lambda:us-east-1:616138583583:function:testLambda-74dac89",
"functionName": "arn:aws:lambda:us-east-1:616138583583:function:testLambda-74dac89",
"functionResponseTypes": [],
"id": "f8af893f-869e-4861-a403-1a4fe3509754",
"lastModified": "2023-12-08T16:02:48Z",
"lastProcessingResult": "",
"maximumBatchingWindowInSeconds": 0,
"maximumRecordAgeInSeconds": 0,
"maximumRetryAttempts": 0,
"parallelizationFactor": 0,
"queues": [],
"scalingConfig": null,
"selfManagedEventSource": null,
"selfManagedKafkaEventSourceConfig": null,
"sourceAccessConfigurations": [],
"startingPosition": "",
"startingPositionTimestamp": "",
"state": "Enabled",
"stateTransitionReason": "USER_INITIATED",
"topics": [],
"tumblingWindowInSeconds": 0,
"uuid": "f8af893f-869e-4861-a403-1a4fe3509754"
},
"news": {
"__defaults": [
"enabled"
],
"enabled": true,
"eventSourceArn": "arn:aws:sqs:us-east-1:616138583583:queue-7798098",
"functionName": "arn:aws:lambda:us-east-1:616138583583:function:testLambda-74dac89"
},
"oldInputs": {
"__defaults": [
"enabled"
],
"enabled": true,
"eventSourceArn": "arn:aws:sqs:us-east-1:616138583583:queue-7798098",
"functionName": "arn:aws:lambda:us-east-1:616138583583:function:testLambda-74dac89"
}
},
"response": {
"stables": "*",
"changes": "DIFF_SOME",
"hasDetailedDiff": true
},
"metadata": {
"kind": "resource",
"mode": "client",
"name": "aws"
}
}
]
`
replay(t, repro)
}
7 changes: 4 additions & 3 deletions examples/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require (
github.com/pulumi/pulumi-aws/provider/v6 v6.0.0-00010101000000-000000000000
github.com/pulumi/pulumi-terraform-bridge/pf v0.21.1-0.20231207205658-538570c1932f
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3
github.com/pulumi/pulumi/pkg/v3 v3.95.0
github.com/pulumi/pulumi/pkg/v3 v3.96.2
github.com/stretchr/testify v1.8.4
)

Expand Down Expand Up @@ -174,6 +174,7 @@ require (
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set/v2 v2.5.0 // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/djherbis/times v1.5.0 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
Expand Down Expand Up @@ -281,9 +282,9 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect
github.com/pulumi/esc v0.6.1-0.20231111193429-44b746a5b3b5 // indirect
github.com/pulumi/pulumi-terraform-bridge/v3 v3.67.1-0.20231207205658-538570c1932f // indirect
github.com/pulumi/pulumi-terraform-bridge/v3 v3.68.0 // indirect
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20231130182140-6385710fcbc4 // indirect
github.com/pulumi/pulumi/sdk/v3 v3.95.0 // indirect
github.com/pulumi/pulumi/sdk/v3 v3.96.2 // indirect
github.com/pulumi/terraform-diff-reader v0.0.2 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
Expand Down
14 changes: 8 additions & 6 deletions examples/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1289,6 +1289,8 @@ github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjI
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/golang-set/v2 v2.5.0 h1:hn6cEZtQ0h3J8kFrHR/NrzyOoTnjgW1+FmNJzQ7y/sA=
github.com/deckarep/golang-set/v2 v2.5.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk=
github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
Expand Down Expand Up @@ -2388,14 +2390,14 @@ github.com/pulumi/pulumi-terraform-bridge/pf v0.21.1-0.20231207205658-538570c193
github.com/pulumi/pulumi-terraform-bridge/pf v0.21.1-0.20231207205658-538570c1932f/go.mod h1:4XbozjoCh9lbGcUD5+83LrjAqzGPQGjya0lavqVq1sQ=
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3 h1:bBWWeAtSPPYpKYlPZr2h0BiYgWQpHRIk0HO/MQmB+jc=
github.com/pulumi/pulumi-terraform-bridge/testing v0.0.2-0.20230927165309-e3fd9503f2d3/go.mod h1:vAQ7DeddebQ7FHdRaSG6ijuS28FS9PC4j8Y9wUuue0c=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.67.1-0.20231207205658-538570c1932f h1:D1oTquV5nYggSQuMOCjaxQX8BpfW54B+Y1MSTpu8wlg=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.67.1-0.20231207205658-538570c1932f/go.mod h1:m+XOZQff8d64SLZTfI3VhDOtVhu9KTsjQIx9Thvc/MU=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.68.0 h1:HNbo4GeJZP2AjKubxV08o+3K0mt6iNrwbQ//EgPz6bc=
github.com/pulumi/pulumi-terraform-bridge/v3 v3.68.0/go.mod h1:FQgtkWHv3rMPVA3OMu8yMHkZA4nGEuvCRwshrs4sw0s=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20231130182140-6385710fcbc4 h1:8lK+vlRrnAxB6K3J2YIPAq50ETpvvWZ92vi66Hko/4o=
github.com/pulumi/pulumi-terraform-bridge/x/muxer v0.0.7-0.20231130182140-6385710fcbc4/go.mod h1:F/fzVS4Ksc4SPPLtMjGFRM9M76QtM1Rc0CYGnHCHEwU=
github.com/pulumi/pulumi/pkg/v3 v3.95.0 h1:FBA0EmjRaqUgzleFMpLSAQUojXH2PyIVERzAm53p63U=
github.com/pulumi/pulumi/pkg/v3 v3.95.0/go.mod h1:4mjOPC8lb49ihR/HbGmid0y9GFlpfP9Orumr0wFOGno=
github.com/pulumi/pulumi/sdk/v3 v3.95.0 h1:SBpFZYdbVF8DtmiEosut2BRVRjLxPpcQf5bOkyPWosQ=
github.com/pulumi/pulumi/sdk/v3 v3.95.0/go.mod h1:xzyBCCPSyLSqOVyfwlaXIS7FqxpiGyLcOOWCzBF7ZKY=
github.com/pulumi/pulumi/pkg/v3 v3.96.2 h1:d+zDsh4K1j90q/upDRkhgxHkspP20Xxd3g6OaMbw574=
github.com/pulumi/pulumi/pkg/v3 v3.96.2/go.mod h1:lR+q06XrnEqRzJXZ6IeHb4nu+U5fswFcc51Q0MRBTio=
github.com/pulumi/pulumi/sdk/v3 v3.96.2 h1:q5ZKdf+e9JR+a6Eiueg0Ohy6jCQGk9pO2V7xI/qGP3I=
github.com/pulumi/pulumi/sdk/v3 v3.96.2/go.mod h1:yvD23IIRiqIXuo4kaZNe5zK/uT0nhO99wr6BVEqoi7A=
github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
github.com/pulumi/terraform-diff-reader v0.0.2/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20230912190043-e6d96b3b8f7e h1:blSirnXqvm8JXLxwxelsBroUNRhOHakDO7cgJUYTdpQ=
Expand Down
2 changes: 1 addition & 1 deletion provider/cmd/pulumi-resource-aws/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -341492,7 +341492,7 @@
}
},
"aws:iot/getEndpoint:getEndpoint": {
"description": "Returns a unique endpoint specific to the AWS account making the call.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\nimport * as kubernetes from \"@pulumi/kubernetes\";\n\nconst example = aws.iot.getEndpoint({});\nconst agent = new kubernetes.index.Kubernetes_pod(\"agent\", {\n metadata: [{\n name: \"my-device\",\n }],\n spec: [{\n container: [{\n image: \"gcr.io/my-project/image-name\",\n name: \"image-name\",\n env: [{\n name: \"IOT_ENDPOINT\",\n value: example.endpointAddress,\n }],\n }],\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\nimport pulumi_kubernetes as kubernetes\n\nexample = aws.iot.get_endpoint()\nagent = kubernetes.index.Kubernetes_pod(\"agent\",\n metadata=[{\n name: my-device,\n }],\n spec=[{\n container: [{\n image: gcr.io/my-project/image-name,\n name: image-name,\n env: [{\n name: IOT_ENDPOINT,\n value: example.endpoint_address,\n }],\n }],\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\nusing Kubernetes = Pulumi.Kubernetes;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = Aws.Iot.GetEndpoint.Invoke();\n\n var agent = new Kubernetes.Index.Kubernetes_pod(\"agent\", new()\n {\n Metadata = new[]\n {\n \n {\n { \"name\", \"my-device\" },\n },\n },\n Spec = new[]\n {\n \n {\n { \"container\", new[]\n {\n \n {\n { \"image\", \"gcr.io/my-project/image-name\" },\n { \"name\", \"image-name\" },\n { \"env\", new[]\n {\n \n {\n { \"name\", \"IOT_ENDPOINT\" },\n { \"value\", example.Apply(getEndpointResult =\u003e getEndpointResult.EndpointAddress) },\n },\n } },\n },\n } },\n },\n },\n });\n\n});\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.iot.IotFunctions;\nimport com.pulumi.aws.iot.inputs.GetEndpointArgs;\nimport com.pulumi.kubernetes.kubernetes_pod;\nimport com.pulumi.kubernetes.Kubernetes_podArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n final var example = IotFunctions.getEndpoint();\n\n var agent = new Kubernetes_pod(\"agent\", Kubernetes_podArgs.builder() \n .metadata(%!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference))\n .spec(%!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference))\n .build());\n\n }\n}\n```\n```yaml\nresources:\n agent:\n type: kubernetes:kubernetes_pod\n properties:\n metadata:\n - name: my-device\n spec:\n - container:\n - image: gcr.io/my-project/image-name\n name: image-name\n env:\n - name: IOT_ENDPOINT\n value: ${example.endpointAddress}\nvariables:\n example:\n fn::invoke:\n Function: aws:iot:getEndpoint\n Arguments: {}\n```\n{{% /example %}}\n{{% /examples %}}",
"description": "Returns a unique endpoint specific to the AWS account making the call.\n\n{{% examples %}}\n## Example Usage\n{{% example %}}\n\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\nimport * as kubernetes from \"@pulumi/kubernetes\";\n\nconst example = aws.iot.getEndpoint({});\nconst agent = new kubernetes.index.Kubernetes_pod(\"agent\", {\n metadata: [{\n name: \"my-device\",\n }],\n spec: [{\n container: [{\n image: \"gcr.io/my-project/image-name\",\n name: \"image-name\",\n env: [{\n name: \"IOT_ENDPOINT\",\n value: example.endpointAddress,\n }],\n }],\n }],\n});\n```\n```python\nimport pulumi\nimport pulumi_aws as aws\nimport pulumi_kubernetes as kubernetes\n\nexample = aws.iot.get_endpoint()\nagent = kubernetes.index.Kubernetes_pod(\"agent\",\n metadata=[{\n name: my-device,\n }],\n spec=[{\n container: [{\n image: gcr.io/my-project/image-name,\n name: image-name,\n env: [{\n name: IOT_ENDPOINT,\n value: example.endpoint_address,\n }],\n }],\n }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Aws = Pulumi.Aws;\nusing Kubernetes = Pulumi.Kubernetes;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n var example = Aws.Iot.GetEndpoint.Invoke();\n\n var agent = new Kubernetes.Index.Kubernetes_pod(\"agent\", new()\n {\n Metadata = new[]\n {\n \n {\n { \"name\", \"my-device\" },\n },\n },\n Spec = new[]\n {\n \n {\n { \"container\", new[]\n {\n \n {\n { \"image\", \"gcr.io/my-project/image-name\" },\n { \"name\", \"image-name\" },\n { \"env\", new[]\n {\n \n {\n { \"name\", \"IOT_ENDPOINT\" },\n { \"value\", example.Apply(getEndpointResult =\u003e getEndpointResult.EndpointAddress) },\n },\n } },\n },\n } },\n },\n },\n });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi-aws/sdk/v6/go/aws/iot\"\n\t\"github.com/pulumi/pulumi-kubernetes/sdk/v1/go/kubernetes\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := iot.GetEndpoint(ctx, nil, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = index.NewKubernetes_pod(ctx, \"agent\", \u0026index.Kubernetes_podArgs{\n\t\t\tMetadata: []map[string]interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"name\": \"my-device\",\n\t\t\t\t},\n\t\t\t},\n\t\t\tSpec: []map[string]interface{}{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"container\": []map[string]interface{}{\n\t\t\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\t\t\"image\": \"gcr.io/my-project/image-name\",\n\t\t\t\t\t\t\t\"name\": \"image-name\",\n\t\t\t\t\t\t\t\"env\": []map[string]interface{}{\n\t\t\t\t\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\t\t\t\t\"name\": \"IOT_ENDPOINT\",\n\t\t\t\t\t\t\t\t\t\"value\": example.EndpointAddress,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.aws.iot.IotFunctions;\nimport com.pulumi.aws.iot.inputs.GetEndpointArgs;\nimport com.pulumi.kubernetes.kubernetes_pod;\nimport com.pulumi.kubernetes.Kubernetes_podArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n public static void main(String[] args) {\n Pulumi.run(App::stack);\n }\n\n public static void stack(Context ctx) {\n final var example = IotFunctions.getEndpoint();\n\n var agent = new Kubernetes_pod(\"agent\", Kubernetes_podArgs.builder() \n .metadata(%!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference))\n .spec(%!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference))\n .build());\n\n }\n}\n```\n```yaml\nresources:\n agent:\n type: kubernetes:kubernetes_pod\n properties:\n metadata:\n - name: my-device\n spec:\n - container:\n - image: gcr.io/my-project/image-name\n name: image-name\n env:\n - name: IOT_ENDPOINT\n value: ${example.endpointAddress}\nvariables:\n example:\n fn::invoke:\n Function: aws:iot:getEndpoint\n Arguments: {}\n```\n{{% /example %}}\n{{% /examples %}}",
"inputs": {
"description": "A collection of arguments for invoking getEndpoint.\n",
"properties": {
Expand Down
9 changes: 5 additions & 4 deletions provider/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ require (
github.com/hashicorp/terraform-provider-aws v1.60.1-0.20220923175450-ca71523cdc36
github.com/mitchellh/go-homedir v1.1.0
github.com/pulumi/providertest v0.0.3
github.com/pulumi/pulumi-terraform-bridge/pf v0.21.1-0.20231207205658-538570c1932f
github.com/pulumi/pulumi-terraform-bridge/v3 v3.67.1-0.20231207205658-538570c1932f
github.com/pulumi/pulumi/pkg/v3 v3.95.0
github.com/pulumi/pulumi/sdk/v3 v3.95.0
github.com/pulumi/pulumi-terraform-bridge/pf v0.21.0
github.com/pulumi/pulumi-terraform-bridge/v3 v3.68.0
github.com/pulumi/pulumi/pkg/v3 v3.96.2
github.com/pulumi/pulumi/sdk/v3 v3.96.2
github.com/stretchr/testify v1.8.4
pgregory.net/rapid v0.6.1
)
Expand Down Expand Up @@ -191,6 +191,7 @@ require (
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deckarep/golang-set/v2 v2.5.0 // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/djherbis/times v1.5.0 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
Expand Down
Loading

0 comments on commit c14542a

Please sign in to comment.