From 84d4cc63711136020df658b5aa81fe070f423324 Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Fri, 23 Jun 2023 22:32:03 +0100 Subject: [PATCH 1/3] Fix isInstance methods on generated provider types in the nodejs sdks Fixes https://github.com/pulumi/pulumi/issues/12584 --- ...-methods-for-generated-provider-types.yaml | 4 ++ pkg/codegen/nodejs/gen.go | 12 ++++- .../nodejs/provider.ts | 2 +- .../testdata/cyclic-types/nodejs/provider.ts | 2 +- .../dash-named-schema/nodejs/provider.ts | 2 +- .../dashed-import-schema/nodejs/provider.ts | 2 +- .../different-enum/nodejs/provider.ts | 2 +- .../embedded-crd-types/nodejs/provider.ts | 2 +- .../enum-reference/nodejs/provider.ts | 2 +- .../testdata/external-enum/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../functions-secrets/nodejs/provider.ts | 2 +- .../testdata/hyphen-url/nodejs/provider.ts | 2 +- .../naming-collisions/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../testdata/nested-module/nodejs/provider.ts | 2 +- .../output-funcs-edgeorder/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../testdata/output-funcs/nodejs/provider.ts | 2 +- .../plain-and-default/nodejs/provider.ts | 2 +- .../plain-object-defaults/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../plain-schema-gh6957/nodejs/provider.ts | 2 +- .../provider-config-schema/nodejs/provider.ts | 2 +- .../provider-type-schema/nodejs/provider.ts | 2 +- .../testdata/regress-8403/nodejs/provider.ts | 2 +- .../regress-node-8110/nodejs/provider.ts | 2 +- .../replace-on-change/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../resource-args-python/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../test/testdata/secrets/nodejs/provider.ts | 2 +- .../simple-enum-schema/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../simple-methods-schema/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../simple-plain-schema/nodejs/provider.ts | 2 +- .../nodejs/provider.ts | 2 +- .../nodejs-extras/tests/codegen.spec.ts | 46 +++++++++++++++++++ .../nodejs/package.json | 9 ++-- .../simple-resource-schema/nodejs/provider.ts | 2 +- .../nodejs/tsconfig.json | 1 + .../simple-resource-schema/schema.json | 11 +++-- .../simple-yaml-schema/nodejs/provider.ts | 2 +- .../simplified-invokes/nodejs/provider.ts | 2 +- sdk/nodejs/resource.ts | 23 +++++----- 47 files changed, 127 insertions(+), 59 deletions(-) create mode 100644 changelog/pending/20230624--sdkgen-nodejs--fix-isinstance-methods-for-generated-provider-types.yaml create mode 100644 pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs-extras/tests/codegen.spec.ts diff --git a/changelog/pending/20230624--sdkgen-nodejs--fix-isinstance-methods-for-generated-provider-types.yaml b/changelog/pending/20230624--sdkgen-nodejs--fix-isinstance-methods-for-generated-provider-types.yaml new file mode 100644 index 000000000000..3efc426604a7 --- /dev/null +++ b/changelog/pending/20230624--sdkgen-nodejs--fix-isinstance-methods-for-generated-provider-types.yaml @@ -0,0 +1,4 @@ +changes: +- type: fix + scope: sdkgen/nodejs + description: Fix isInstance methods for generated provider types. diff --git a/pkg/codegen/nodejs/gen.go b/pkg/codegen/nodejs/gen.go index 5e30eb590e4c..6892de7190a6 100644 --- a/pkg/codegen/nodejs/gen.go +++ b/pkg/codegen/nodejs/gen.go @@ -691,7 +691,17 @@ func (mod *modContext) genResource(w io.Writer, r *schema.Resource) (resourceFil fmt.Fprintf(w, " if (obj === undefined || obj === null) {\n") fmt.Fprintf(w, " return false;\n") fmt.Fprintf(w, " }\n") - fmt.Fprintf(w, " return obj['__pulumiType'] === %s.__pulumiType;\n", name) + + typeExpression := fmt.Sprintf("%s.__pulumiType", name) + if r.IsProvider { + // We pass __pulumiType to the ProviderResource constructor as the "type" for this provider, the + // ProviderResource constructor in the SDK then prefixes "pulumi:providers:" to that token and passes that + // down to the CustomResource constructor, which then assigns that type token to the newly constructed + // objects __pulumiType field. As such we also need to prefix "pulumi:providers:" when doing the equality + // check here. + typeExpression = "\"pulumi:providers:\" + " + typeExpression + } + fmt.Fprintf(w, " return obj['__pulumiType'] === %s;\n", typeExpression) fmt.Fprintf(w, " }\n") fmt.Fprintf(w, "\n") diff --git a/pkg/codegen/testing/test/testdata/azure-native-nested-types/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/azure-native-nested-types/nodejs/provider.ts index 1476a6b1ef01..de9c4a486953 100644 --- a/pkg/codegen/testing/test/testdata/azure-native-nested-types/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/azure-native-nested-types/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/cyclic-types/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/cyclic-types/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/cyclic-types/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/cyclic-types/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/dash-named-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/dash-named-schema/nodejs/provider.ts index 770dccc8089d..df893f6e8652 100644 --- a/pkg/codegen/testing/test/testdata/dash-named-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/dash-named-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/dashed-import-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/dashed-import-schema/nodejs/provider.ts index 01d2d48bf684..7795433b1257 100644 --- a/pkg/codegen/testing/test/testdata/dashed-import-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/dashed-import-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/different-enum/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/different-enum/nodejs/provider.ts index 01d2d48bf684..7795433b1257 100644 --- a/pkg/codegen/testing/test/testdata/different-enum/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/different-enum/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/embedded-crd-types/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/embedded-crd-types/nodejs/provider.ts index aa46ed5a9a1c..5eb4603d5dc5 100644 --- a/pkg/codegen/testing/test/testdata/embedded-crd-types/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/embedded-crd-types/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/enum-reference/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/enum-reference/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/enum-reference/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/enum-reference/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/external-enum/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/external-enum/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/external-enum/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/external-enum/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/external-node-compatibility/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/external-node-compatibility/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/external-node-compatibility/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/external-node-compatibility/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/external-resource-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/external-resource-schema/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/external-resource-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/external-resource-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/functions-secrets/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/functions-secrets/nodejs/provider.ts index 709fb835c072..2a6f3ee30e4b 100644 --- a/pkg/codegen/testing/test/testdata/functions-secrets/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/functions-secrets/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/hyphen-url/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/hyphen-url/nodejs/provider.ts index 5b63f1468734..f5625f121bdb 100644 --- a/pkg/codegen/testing/test/testdata/hyphen-url/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/hyphen-url/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/naming-collisions/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/naming-collisions/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/naming-collisions/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/naming-collisions/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/nested-module-thirdparty/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/nested-module-thirdparty/nodejs/provider.ts index 770dccc8089d..df893f6e8652 100644 --- a/pkg/codegen/testing/test/testdata/nested-module-thirdparty/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/nested-module-thirdparty/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/nested-module/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/nested-module/nodejs/provider.ts index aa46ed5a9a1c..5eb4603d5dc5 100644 --- a/pkg/codegen/testing/test/testdata/nested-module/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/nested-module/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/output-funcs-edgeorder/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/output-funcs-edgeorder/nodejs/provider.ts index b7e4e7660d73..6477d50f37ab 100644 --- a/pkg/codegen/testing/test/testdata/output-funcs-edgeorder/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/output-funcs-edgeorder/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/output-funcs-tfbridge20/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/output-funcs-tfbridge20/nodejs/provider.ts index 709fb835c072..2a6f3ee30e4b 100644 --- a/pkg/codegen/testing/test/testdata/output-funcs-tfbridge20/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/output-funcs-tfbridge20/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/output-funcs/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/output-funcs/nodejs/provider.ts index 709fb835c072..2a6f3ee30e4b 100644 --- a/pkg/codegen/testing/test/testdata/output-funcs/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/output-funcs/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/plain-and-default/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/plain-and-default/nodejs/provider.ts index 9f983393745a..99177cd9cbd4 100644 --- a/pkg/codegen/testing/test/testdata/plain-and-default/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/plain-and-default/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/plain-object-defaults/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/plain-object-defaults/nodejs/provider.ts index 98a6795f813d..cf70d87cfabe 100644 --- a/pkg/codegen/testing/test/testdata/plain-object-defaults/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/plain-object-defaults/nodejs/provider.ts @@ -21,7 +21,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/plain-object-disable-defaults/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/plain-object-disable-defaults/nodejs/provider.ts index 98a6795f813d..cf70d87cfabe 100644 --- a/pkg/codegen/testing/test/testdata/plain-object-disable-defaults/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/plain-object-disable-defaults/nodejs/provider.ts @@ -21,7 +21,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/plain-schema-gh6957/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/plain-schema-gh6957/nodejs/provider.ts index 4b33458275f5..0137d2a13faf 100644 --- a/pkg/codegen/testing/test/testdata/plain-schema-gh6957/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/plain-schema-gh6957/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/provider-config-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/provider-config-schema/nodejs/provider.ts index 3f09cc7bd995..1f7e3d6503a5 100644 --- a/pkg/codegen/testing/test/testdata/provider-config-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/provider-config-schema/nodejs/provider.ts @@ -19,7 +19,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/provider-type-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/provider-type-schema/nodejs/provider.ts index c49e2769e77b..3e212038e472 100644 --- a/pkg/codegen/testing/test/testdata/provider-type-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/provider-type-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/regress-8403/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/regress-8403/nodejs/provider.ts index ca90b39f6064..5b2498212135 100644 --- a/pkg/codegen/testing/test/testdata/regress-8403/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/regress-8403/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/regress-node-8110/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/regress-node-8110/nodejs/provider.ts index 1c6f7150494b..4af02c6960ca 100644 --- a/pkg/codegen/testing/test/testdata/regress-node-8110/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/regress-node-8110/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/replace-on-change/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/replace-on-change/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/replace-on-change/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/replace-on-change/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/resource-args-python-case-insensitive/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/resource-args-python-case-insensitive/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/resource-args-python-case-insensitive/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/resource-args-python-case-insensitive/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/resource-args-python/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/resource-args-python/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/resource-args-python/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/resource-args-python/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/resource-property-overlap/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/resource-property-overlap/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/resource-property-overlap/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/resource-property-overlap/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/secrets/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/secrets/nodejs/provider.ts index 709fb835c072..2a6f3ee30e4b 100644 --- a/pkg/codegen/testing/test/testdata/secrets/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/secrets/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-enum-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-enum-schema/nodejs/provider.ts index 01d2d48bf684..7795433b1257 100644 --- a/pkg/codegen/testing/test/testdata/simple-enum-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-enum-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-methods-schema-single-value-returns/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-methods-schema-single-value-returns/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-methods-schema-single-value-returns/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-methods-schema-single-value-returns/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-methods-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-methods-schema/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-methods-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-methods-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-plain-schema-with-root-package/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-plain-schema-with-root-package/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-plain-schema-with-root-package/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-plain-schema-with-root-package/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-plain-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-plain-schema/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-plain-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-plain-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema-custom-pypackage-name/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-resource-schema-custom-pypackage-name/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-resource-schema-custom-pypackage-name/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema-custom-pypackage-name/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs-extras/tests/codegen.spec.ts b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs-extras/tests/codegen.spec.ts new file mode 100644 index 000000000000..453b5521a682 --- /dev/null +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs-extras/tests/codegen.spec.ts @@ -0,0 +1,46 @@ +// Copyright 2016-2021, Pulumi Corporation. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import * as pulumi from "@pulumi/pulumi"; +import * as assert from "assert"; +import "mocha"; +import * as sut from ".."; + +pulumi.runtime.setMocks({ + newResource: function(_: pulumi.runtime.MockResourceArgs): {id: string, state: any} { + return {id: "", state: {}}; + }, + call: function(args: pulumi.runtime.MockCallArgs) { + throw new Error("call not implemented"); + }, +}); + + +describe("simple-resource-schema", () => { + const p = new sut.Provider("my-p"); + const r = new sut.Resource("my-r", {}); + const c = new sut.FooResource("my-c", {}) + + assert.deepStrictEqual(sut.Provider.isInstance(p), true); + assert.deepStrictEqual(sut.Provider.isInstance(r), false); + assert.deepStrictEqual(sut.Provider.isInstance(c), false); + + assert.deepStrictEqual(sut.Resource.isInstance(p), false); + assert.deepStrictEqual(sut.Resource.isInstance(r), true); + assert.deepStrictEqual(sut.Resource.isInstance(c), false); + + assert.deepStrictEqual(sut.FooResource.isInstance(p), false); + assert.deepStrictEqual(sut.FooResource.isInstance(r), false); + assert.deepStrictEqual(sut.FooResource.isInstance(c), true); + }); diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/package.json b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/package.json index a3358e004bd2..ef53584e3142 100644 --- a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/package.json +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/package.json @@ -6,11 +6,14 @@ "install": "node scripts/install-pulumi-plugin.js resource example 3.2.1" }, "dependencies": { - "@pulumi/pulumi": "^3.12" + "@pulumi/pulumi": "^3.42.0" }, "devDependencies": { - "@types/node": "^14", - "typescript": "^3.7.0" + "@types/mocha": "latest", + "@types/node": "ts4.3", + "mocha": "latest", + "ts-node": "latest", + "typescript": "^4.3.5" }, "pulumi": { "resource": true, diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/tsconfig.json b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/tsconfig.json index 9e7bc6288035..82e1b94b508e 100644 --- a/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/tsconfig.json +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema/nodejs/tsconfig.json @@ -20,6 +20,7 @@ "otherResource.ts", "provider.ts", "resource.ts", + "tests/codegen.spec.ts", "typeUses.ts", "types/index.ts", "types/input.ts", diff --git a/pkg/codegen/testing/test/testdata/simple-resource-schema/schema.json b/pkg/codegen/testing/test/testdata/simple-resource-schema/schema.json index 0293e13f7523..a2599e15eb9d 100644 --- a/pkg/codegen/testing/test/testdata/simple-resource-schema/schema.json +++ b/pkg/codegen/testing/test/testdata/simple-resource-schema/schema.json @@ -260,12 +260,15 @@ "respectSchemaVersion": true }, "nodejs": { - "dependencies": { - "@pulumi/pulumi": "^3.12" - }, "devDependencies": { - "typescript": "^3.7.0" + "@types/mocha": "latest", + "@types/node": "ts4.3", + "mocha": "latest", + "ts-node": "latest" }, + "extraTypeScriptFiles": [ + "tests/codegen.spec.ts" + ], "respectSchemaVersion": true, "pluginVersion": "3.2.1" }, diff --git a/pkg/codegen/testing/test/testdata/simple-yaml-schema/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simple-yaml-schema/nodejs/provider.ts index 1c3d1a21cf69..835c97a5a88f 100644 --- a/pkg/codegen/testing/test/testdata/simple-yaml-schema/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simple-yaml-schema/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/pkg/codegen/testing/test/testdata/simplified-invokes/nodejs/provider.ts b/pkg/codegen/testing/test/testdata/simplified-invokes/nodejs/provider.ts index 65d5ece37d11..1996afeb5fdd 100644 --- a/pkg/codegen/testing/test/testdata/simplified-invokes/nodejs/provider.ts +++ b/pkg/codegen/testing/test/testdata/simplified-invokes/nodejs/provider.ts @@ -16,7 +16,7 @@ export class Provider extends pulumi.ProviderResource { if (obj === undefined || obj === null) { return false; } - return obj['__pulumiType'] === Provider.__pulumiType; + return obj['__pulumiType'] === "pulumi:providers:" + Provider.__pulumiType; } diff --git a/sdk/nodejs/resource.ts b/sdk/nodejs/resource.ts index 66db6fbda103..8fdbce9d854c 100644 --- a/sdk/nodejs/resource.ts +++ b/sdk/nodejs/resource.ts @@ -13,13 +13,13 @@ // limitations under the License. import { ResourceError } from "./errors"; +import * as log from "./log"; import { Input, Inputs, interpolate, Output, output } from "./output"; import { getResource, readResource, registerResource, registerResourceOutputs } from "./runtime/resource"; +import { unknownValue } from "./runtime/rpc"; import { getProject, getStack } from "./runtime/settings"; import { getStackResource } from "./runtime/state"; -import { unknownValue } from "./runtime/rpc"; import * as utils from "./utils"; -import * as log from "./log"; export type ID = string; // a provider-assigned ID. export type URN = string; // an automatically generated logical URN, used to stably identify resources. @@ -265,6 +265,14 @@ export abstract class Resource { // eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match readonly __pluginDownloadURL?: string; + /** + * Private field containing the type ID for this object. Useful for implementing `isInstance` on + * classes that inherit from `Resource`. + * @internal + */ + // eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match + public readonly __pulumiType: string; + public static isInstance(obj: any): obj is Resource { return utils.isInstance(obj, "__pulumiResource"); } @@ -303,6 +311,8 @@ export abstract class Resource { remote: boolean = false, dependency: boolean = false, ) { + this.__pulumiType = t; + if (dependency) { this.__protect = false; this.__providers = {}; @@ -763,14 +773,6 @@ export abstract class CustomResource extends Resource { // eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match public readonly __pulumiCustomResource: boolean; - /** - * Private field containing the type ID for this object. Useful for implementing `isInstance` on - * classes that inherit from `CustomResource`. - * @internal - */ - // eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-blacklist,id-match - public readonly __pulumiType: string; - /** * id is the provider-assigned unique ID for this managed resource. It is set during * deployments and may be missing (undefined) during planning phases. @@ -809,7 +811,6 @@ export abstract class CustomResource extends Resource { super(t, name, true, props, opts, false, dependency); this.__pulumiCustomResource = true; - this.__pulumiType = t; } } From 04ce92c59fae259fa8ff0344e0a2251ebe9f1b92 Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Thu, 25 May 2023 14:43:39 +0100 Subject: [PATCH 2/3] Test duplicate outputs Regression test to cover https://github.com/pulumi/pulumi/issues/9411 --- tests/integration/integration_python_test.go | 15 +++++++++++++++ .../python/duplicate-output/.gitignore | 6 ++++++ .../python/duplicate-output/Pulumi.yaml | 3 +++ .../python/duplicate-output/__main__.py | 8 ++++++++ .../python/duplicate-output/requirements.txt | 1 + 5 files changed, 33 insertions(+) create mode 100644 tests/integration/python/duplicate-output/.gitignore create mode 100644 tests/integration/python/duplicate-output/Pulumi.yaml create mode 100644 tests/integration/python/duplicate-output/__main__.py create mode 100644 tests/integration/python/duplicate-output/requirements.txt diff --git a/tests/integration/integration_python_test.go b/tests/integration/integration_python_test.go index 34d4ef2cd495..335073a51fb5 100644 --- a/tests/integration/integration_python_test.go +++ b/tests/integration/integration_python_test.go @@ -1061,3 +1061,18 @@ func TestConstructProviderPropagationPython(t *testing.T) { filepath.Join("..", "..", "sdk", "python", "env", "src"), }) } + +// Regression test for https://github.com/pulumi/pulumi/issues/9411 +func TestDuplicateOutputPython(t *testing.T) { + integration.ProgramTest(t, &integration.ProgramTestOptions{ + Dir: filepath.Join("python", "duplicate-output"), + Dependencies: []string{ + filepath.Join("..", "..", "sdk", "python", "env", "src"), + }, + ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) { + expected := []interface{}{float64(1), float64(2)} + assert.Equal(t, expected, stack.Outputs["export1"]) + assert.Equal(t, expected, stack.Outputs["export2"]) + }, + }) +} diff --git a/tests/integration/python/duplicate-output/.gitignore b/tests/integration/python/duplicate-output/.gitignore new file mode 100644 index 000000000000..28a6abfd4dd0 --- /dev/null +++ b/tests/integration/python/duplicate-output/.gitignore @@ -0,0 +1,6 @@ +*.pyc +/.pulumi/ +/dist/ +/*.egg-info +venv/ +lib/ diff --git a/tests/integration/python/duplicate-output/Pulumi.yaml b/tests/integration/python/duplicate-output/Pulumi.yaml new file mode 100644 index 000000000000..70a611b95613 --- /dev/null +++ b/tests/integration/python/duplicate-output/Pulumi.yaml @@ -0,0 +1,3 @@ +name: pulumi-python-duplicate-output +description: A Python program that tests returning the same output twice. +runtime: python diff --git a/tests/integration/python/duplicate-output/__main__.py b/tests/integration/python/duplicate-output/__main__.py new file mode 100644 index 000000000000..bb9c7d299268 --- /dev/null +++ b/tests/integration/python/duplicate-output/__main__.py @@ -0,0 +1,8 @@ +# Copyright 2016-2023, Pulumi Corporation. All rights reserved. + +import pulumi + +a = pulumi.Output.from_input([1, 2]) + +pulumi.export("export1", a) +pulumi.export("export2", a) \ No newline at end of file diff --git a/tests/integration/python/duplicate-output/requirements.txt b/tests/integration/python/duplicate-output/requirements.txt new file mode 100644 index 000000000000..b1dc38733acb --- /dev/null +++ b/tests/integration/python/duplicate-output/requirements.txt @@ -0,0 +1 @@ +pulumi From 2b61e37f245ae575cd4d522e164abd4c0a612e00 Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Thu, 29 Jun 2023 11:09:56 +0100 Subject: [PATCH 3/3] Update pulumictl --- .devcontainer/Dockerfile | 2 +- .github/workflows/ci-run-test.yml | 2 +- .github/workflows/release.yml | 2 +- .gitpod/Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index be7a2eb57798..5d43a035f300 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -6,7 +6,7 @@ RUN version=1.42.1 \ && golangci-lint version # Install pulumictl -RUN version=0.0.25 \ +RUN version=0.0.42 \ && curl -fsSLO https://github.com/pulumi/pulumictl/releases/download/v$version/pulumictl-v$version-linux-amd64.tar.gz \ && tar -xzf pulumictl-v$version-linux-amd64.tar.gz --directory /usr/local/bin --no-same-owner pulumictl \ && rm -f pulumictl-v$version-linux-amd64.tar.gz \ diff --git a/.github/workflows/ci-run-test.yml b/.github/workflows/ci-run-test.yml index d13baf0567f8..3a7ed0fef043 100644 --- a/.github/workflows/ci-run-test.yml +++ b/.github/workflows/ci-run-test.yml @@ -200,7 +200,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} with: repo: pulumi/pulumictl - tag: v0.0.32 + tag: v0.0.42 cache: enable - name: Install gotestsum uses: jaxxstorm/action-install-gh-release@v1.7.1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bd0e4e1dbccd..35eca9862548 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -175,7 +175,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.PULUMI_BOT_TOKEN }} with: repo: pulumi/pulumictl - tag: v0.0.32 + tag: v0.0.42 cache: enable - name: Repository Dispatch run: ${{ matrix.job.run-command }} diff --git a/.gitpod/Dockerfile b/.gitpod/Dockerfile index f5156620bcd0..bd8061e31ea5 100644 --- a/.gitpod/Dockerfile +++ b/.gitpod/Dockerfile @@ -8,7 +8,7 @@ ENV PATH="$HOME/.pulumi:$HOME/.pulumi/bin:$PATH" RUN mkdir -p /home/gitpod/dotnet && \ curl -fsSL https://download.visualstudio.microsoft.com/download/pr/f65a8eb0-4537-4e69-8ff3-1a80a80d9341/cc0ca9ff8b9634f3d9780ec5915c1c66/dotnet-sdk-3.1.201-linux-x64.tar.gz \ | tar xz -C /home/gitpod/dotnet && \ - wget -qO- https://github.com/pulumi/pulumictl/releases/download/v0.0.28/pulumictl-v0.0.28-linux-amd64.tar.gz | sudo tar zxvf - -C /usr/local/bin + wget -qO- https://github.com/pulumi/pulumictl/releases/download/v0.0.42/pulumictl-v0.0.42-linux-amd64.tar.gz | sudo tar zxvf - -C /usr/local/bin ENV DOTNET_ROOT=/home/gitpod/dotnet