diff --git a/pkg/codegen/go/gen.go b/pkg/codegen/go/gen.go
index 070dd4733..860724320 100644
--- a/pkg/codegen/go/gen.go
+++ b/pkg/codegen/go/gen.go
@@ -3110,8 +3110,10 @@ func generatePackageContextMap(tool string, pkg *schema.Package, goInfo GoPackag
pkg.functions = append(pkg.functions, f)
name := tokenToName(f.Token)
- originalName := name
- if pkg.names.Has(name) {
+
+ if pkg.names.Has(name) ||
+ pkg.names.Has(name+"Args") ||
+ pkg.names.Has(name+"Result") {
switch {
case strings.HasPrefix(name, "New"):
name = "Create" + name[3:]
@@ -3124,15 +3126,9 @@ func generatePackageContextMap(tool string, pkg *schema.Package, goInfo GoPackag
if f.Inputs != nil {
pkg.names.Add(name + "Args")
- if originalName != name {
- pkg.renamed[originalName+"Args"] = name + "Args"
- }
}
if f.Outputs != nil {
pkg.names.Add(name + "Result")
- if originalName != name {
- pkg.renamed[originalName+"Result"] = name + "Result"
- }
}
}
diff --git a/pkg/codegen/internal/test/sdk_driver.go b/pkg/codegen/internal/test/sdk_driver.go
index f7565cf7a..41d13f372 100644
--- a/pkg/codegen/internal/test/sdk_driver.go
+++ b/pkg/codegen/internal/test/sdk_driver.go
@@ -203,6 +203,11 @@ var sdkTests = []sdkTest{
Skip: codegen.NewStringSet("python/test", "nodejs/test"),
SkipCompileCheck: codegen.NewStringSet(dotnet),
},
+ {
+ Directory: "regress-8403",
+ Description: "Regress pulumi/pulumi#8403",
+ SkipCompileCheck: codegen.NewStringSet(dotnet, python, nodejs),
+ },
}
var genSDKOnly bool
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/docs/_index.md b/pkg/codegen/internal/test/testdata/regress-8403/docs/_index.md
new file mode 100644
index 000000000..20654b6c9
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/docs/_index.md
@@ -0,0 +1,33 @@
+---
+title: "MongoDB Atlas"
+title_tag: "mongodbatlas.MongoDB Atlas"
+meta_desc: ""
+layout: api
+no_edit_this_page: true
+---
+
+
+
+
+
+
+
Resources
+
+
+Functions
+
+
+Package Details
+
+ - Repository
+
+ - License
+
+ - Version
+ - 0.0.1
+
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/docs/codegen-manifest.json b/pkg/codegen/internal/test/testdata/regress-8403/docs/codegen-manifest.json
new file mode 100644
index 000000000..c13600d68
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/docs/codegen-manifest.json
@@ -0,0 +1,7 @@
+{
+ "emittedFiles": [
+ "_index.md",
+ "getcustomdbroles/_index.md",
+ "provider/_index.md"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/docs/getcustomdbroles/_index.md b/pkg/codegen/internal/test/testdata/regress-8403/docs/getcustomdbroles/_index.md
new file mode 100644
index 000000000..35e4d113a
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/docs/getcustomdbroles/_index.md
@@ -0,0 +1,144 @@
+
+---
+title: "getCustomDbRoles"
+title_tag: "mongodbatlas.getCustomDbRoles"
+meta_desc: "Documentation for the mongodbatlas.getCustomDbRoles function with examples, input properties, output properties, and supporting types."
+layout: api
+no_edit_this_page: true
+---
+
+
+
+
+
+
+
+
+
+## Using getCustomDbRoles {#using}
+
+{{< chooser language "typescript,python,go,csharp" / >}}
+
+
+{{% choosable language nodejs %}}
+
+{{% /choosable %}}
+
+
+{{% choosable language python %}}
+
+{{% /choosable %}}
+
+
+{{% choosable language go %}}
+
+
+> Note: This function is named `LookupCustomDbRoles` in the Go SDK.
+
+{{% /choosable %}}
+
+
+{{% choosable language csharp %}}
+
+{{% /choosable %}}
+
+
+
+The following arguments are supported:
+
+
+{{% choosable language csharp %}}
+
+{{% /choosable %}}
+
+{{% choosable language go %}}
+
+{{% /choosable %}}
+
+{{% choosable language nodejs %}}
+
+{{% /choosable %}}
+
+{{% choosable language python %}}
+
+{{% /choosable %}}
+
+
+
+
+## getCustomDbRoles Result {#result}
+
+The following output properties are available:
+
+
+
+{{% choosable language csharp %}}
+-
+
+Result
+
+
+ GetCustomDbRolesResult
+
+ - {{% md %}}{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language go %}}
+-
+
+Result
+
+
+ GetCustomDbRolesResult
+
+ - {{% md %}}{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language nodejs %}}
+-
+
+result
+
+
+ GetCustomDbRolesResult
+
+ - {{% md %}}{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language python %}}
+-
+
+result
+
+
+ GetCustomDbRolesResult
+
+ - {{% md %}}{{% /md %}}
+{{% /choosable %}}
+
+
+
+
+
+Package Details
+
+ - Repository
+
+ - License
+
+
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/docs/provider/_index.md b/pkg/codegen/internal/test/testdata/regress-8403/docs/provider/_index.md
new file mode 100644
index 000000000..e2a59d305
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/docs/provider/_index.md
@@ -0,0 +1,241 @@
+
+---
+title: "Provider"
+title_tag: "mongodbatlas.Provider"
+meta_desc: "Documentation for the mongodbatlas.Provider resource with examples, input properties, output properties, lookup functions, and supporting types."
+layout: api
+no_edit_this_page: true
+---
+
+
+
+
+
+
+
+
+
+## Create a Provider Resource {#create}
+{{< chooser language "typescript,python,go,csharp" / >}}
+
+
+{{% choosable language nodejs %}}
+
+{{% /choosable %}}
+
+{{% choosable language python %}}
+
+{{% /choosable %}}
+
+{{% choosable language go %}}
+
+{{% /choosable %}}
+
+{{% choosable language csharp %}}
+
+{{% /choosable %}}
+
+{{% choosable language nodejs %}}
+
+-
+ name
+
+ string
+
+ - The unique name of the resource.
-
+ args
+
+ ProviderArgs
+
+ - The arguments to resource properties.
-
+ opts
+
+ CustomResourceOptions
+
+ - Bag of options to control resource's behavior.
+
+{{% /choosable %}}
+
+{{% choosable language python %}}
+
+-
+ resource_name
+
+ str
+
+ - The unique name of the resource.
-
+ args
+
+ ProviderArgs
+
+ - The arguments to resource properties.
-
+ opts
+
+ ResourceOptions
+
+ - Bag of options to control resource's behavior.
+
+{{% /choosable %}}
+
+{{% choosable language go %}}
+
+-
+ ctx
+
+ Context
+
+ - Context object for the current deployment.
-
+ name
+
+ string
+
+ - The unique name of the resource.
-
+ args
+
+ ProviderArgs
+
+ - The arguments to resource properties.
-
+ opts
+
+ ResourceOption
+
+ - Bag of options to control resource's behavior.
+
+{{% /choosable %}}
+
+{{% choosable language csharp %}}
+
+-
+ name
+
+ string
+
+ - The unique name of the resource.
-
+ args
+
+ ProviderArgs
+
+ - The arguments to resource properties.
-
+ opts
+
+ CustomResourceOptions
+
+ - Bag of options to control resource's behavior.
+
+{{% /choosable %}}
+
+## Provider Resource Properties {#properties}
+
+To learn more about resource properties and how to use them, see [Inputs and Outputs]({{< relref "/docs/intro/concepts/inputs-outputs" >}}) in the Architecture and Concepts docs.
+
+### Inputs
+
+The Provider resource accepts the following [input]({{< relref "/docs/intro/concepts/inputs-outputs" >}}) properties:
+
+
+
+{{% choosable language csharp %}}
+
+{{% /choosable %}}
+
+{{% choosable language go %}}
+
+{{% /choosable %}}
+
+{{% choosable language nodejs %}}
+
+{{% /choosable %}}
+
+{{% choosable language python %}}
+
+{{% /choosable %}}
+
+
+### Outputs
+
+All [input](#inputs) properties are implicitly available as output properties. Additionally, the Provider resource produces the following output properties:
+
+
+
+{{% choosable language csharp %}}
+-
+
+Id
+
+
+ string
+
+ - {{% md %}}The provider-assigned unique ID for this managed resource.{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language go %}}
+-
+
+Id
+
+
+ string
+
+ - {{% md %}}The provider-assigned unique ID for this managed resource.{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language nodejs %}}
+-
+
+id
+
+
+ string
+
+ - {{% md %}}The provider-assigned unique ID for this managed resource.{{% /md %}}
+{{% /choosable %}}
+
+{{% choosable language python %}}
+-
+
+id
+
+
+ str
+
+ - {{% md %}}The provider-assigned unique ID for this managed resource.{{% /md %}}
+{{% /choosable %}}
+
+
+
+
+
+
+
+
+Package Details
+
+ - Repository
+
+ - License
+
+
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/GetCustomDbRoles.cs b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/GetCustomDbRoles.cs
new file mode 100644
index 000000000..d42e1685a
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/GetCustomDbRoles.cs
@@ -0,0 +1,38 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Threading.Tasks;
+using Pulumi.Serialization;
+
+namespace Pulumi.Mongodbatlas
+{
+ public static class GetCustomDbRoles
+ {
+ public static Task InvokeAsync(GetCustomDbRolesArgs? args = null, InvokeOptions? options = null)
+ => Pulumi.Deployment.Instance.InvokeAsync("mongodbatlas::getCustomDbRoles", args ?? new GetCustomDbRolesArgs(), options.WithVersion());
+ }
+
+
+ public sealed class GetCustomDbRolesArgs : Pulumi.InvokeArgs
+ {
+ public GetCustomDbRolesArgs()
+ {
+ }
+ }
+
+
+ [OutputType]
+ public sealed class GetCustomDbRolesResult
+ {
+ public readonly Outputs.GetCustomDbRolesResult? Result;
+
+ [OutputConstructor]
+ private GetCustomDbRolesResult(Outputs.GetCustomDbRolesResult? result)
+ {
+ Result = result;
+ }
+ }
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Outputs/GetCustomDbRolesResult.cs b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Outputs/GetCustomDbRolesResult.cs
new file mode 100644
index 000000000..ed3b6968e
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Outputs/GetCustomDbRolesResult.cs
@@ -0,0 +1,21 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Threading.Tasks;
+using Pulumi.Serialization;
+
+namespace Pulumi.Mongodbatlas.Outputs
+{
+
+ [OutputType]
+ public sealed class GetCustomDbRolesResult
+ {
+ [OutputConstructor]
+ private GetCustomDbRolesResult()
+ {
+ }
+ }
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Provider.cs b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Provider.cs
new file mode 100644
index 000000000..66b45e6f0
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Provider.cs
@@ -0,0 +1,46 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Threading.Tasks;
+using Pulumi.Serialization;
+
+namespace Pulumi.Mongodbatlas
+{
+ [MongodbatlasResourceType("pulumi:providers:mongodbatlas")]
+ public partial class Provider : Pulumi.ProviderResource
+ {
+ ///
+ /// Create a Provider resource with the given unique name, arguments, and options.
+ ///
+ ///
+ /// The unique name of the resource
+ /// The arguments used to populate this resource's properties
+ /// A bag of options that control this resource's behavior
+ public Provider(string name, ProviderArgs? args = null, CustomResourceOptions? options = null)
+ : base("mongodbatlas", name, args ?? new ProviderArgs(), MakeResourceOptions(options, ""))
+ {
+ }
+
+ private static CustomResourceOptions MakeResourceOptions(CustomResourceOptions? options, Input? id)
+ {
+ var defaultOptions = new CustomResourceOptions
+ {
+ Version = Utilities.Version,
+ };
+ var merged = CustomResourceOptions.Merge(defaultOptions, options);
+ // Override the ID if one was specified for consistency with other language SDKs.
+ merged.Id = id ?? merged.Id;
+ return merged;
+ }
+ }
+
+ public sealed class ProviderArgs : Pulumi.ResourceArgs
+ {
+ public ProviderArgs()
+ {
+ }
+ }
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Pulumi.Mongodbatlas.csproj b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Pulumi.Mongodbatlas.csproj
new file mode 100644
index 000000000..d669bb92b
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Pulumi.Mongodbatlas.csproj
@@ -0,0 +1,55 @@
+
+
+
+ true
+ Pulumi Corp.
+ Pulumi Corp.
+
+
+
+
+ logo.png
+
+ netcoreapp3.1
+ enable
+ false
+
+
+
+ true
+ 1701;1702;1591
+
+
+
+ $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb
+ true
+ true
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
+
+
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/README.md b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Utilities.cs b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Utilities.cs
new file mode 100644
index 000000000..0b6195bb0
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/Utilities.cs
@@ -0,0 +1,87 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+using System;
+using System.IO;
+using System.Reflection;
+using Pulumi;
+
+namespace Pulumi.Mongodbatlas
+{
+ static class Utilities
+ {
+ public static string? GetEnv(params string[] names)
+ {
+ foreach (var n in names)
+ {
+ var value = Environment.GetEnvironmentVariable(n);
+ if (value != null)
+ {
+ return value;
+ }
+ }
+ return null;
+ }
+
+ static string[] trueValues = { "1", "t", "T", "true", "TRUE", "True" };
+ static string[] falseValues = { "0", "f", "F", "false", "FALSE", "False" };
+ public static bool? GetEnvBoolean(params string[] names)
+ {
+ var s = GetEnv(names);
+ if (s != null)
+ {
+ if (Array.IndexOf(trueValues, s) != -1)
+ {
+ return true;
+ }
+ if (Array.IndexOf(falseValues, s) != -1)
+ {
+ return false;
+ }
+ }
+ return null;
+ }
+
+ public static int? GetEnvInt32(params string[] names) => int.TryParse(GetEnv(names), out int v) ? (int?)v : null;
+
+ public static double? GetEnvDouble(params string[] names) => double.TryParse(GetEnv(names), out double v) ? (double?)v : null;
+
+ public static InvokeOptions WithVersion(this InvokeOptions? options)
+ {
+ if (options?.Version != null)
+ {
+ return options;
+ }
+ return new InvokeOptions
+ {
+ Parent = options?.Parent,
+ Provider = options?.Provider,
+ Version = Version,
+ };
+ }
+
+ private readonly static string version;
+ public static string Version => version;
+
+ static Utilities()
+ {
+ var assembly = typeof(Utilities).GetTypeInfo().Assembly;
+ using var stream = assembly.GetManifestResourceStream("Pulumi.Mongodbatlas.version.txt");
+ using var reader = new StreamReader(stream ?? throw new NotSupportedException("Missing embedded version.txt file"));
+ version = reader.ReadToEnd().Trim();
+ var parts = version.Split("\n");
+ if (parts.Length == 2)
+ {
+ // The first part is the provider name.
+ version = parts[1].Trim();
+ }
+ }
+ }
+
+ internal sealed class MongodbatlasResourceTypeAttribute : Pulumi.ResourceTypeAttribute
+ {
+ public MongodbatlasResourceTypeAttribute(string type) : base(type, Utilities.Version)
+ {
+ }
+ }
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/codegen-manifest.json b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/codegen-manifest.json
new file mode 100644
index 000000000..2dd33e210
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/codegen-manifest.json
@@ -0,0 +1,11 @@
+{
+ "emittedFiles": [
+ "GetCustomDbRoles.cs",
+ "Outputs/GetCustomDbRolesResult.cs",
+ "Provider.cs",
+ "Pulumi.Mongodbatlas.csproj",
+ "README.md",
+ "Utilities.cs",
+ "logo.png"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/dotnet/logo.png b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/logo.png
new file mode 100644
index 000000000..181f421e9
Binary files /dev/null and b/pkg/codegen/internal/test/testdata/regress-8403/dotnet/logo.png differ
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/codegen-manifest.json b/pkg/codegen/internal/test/testdata/regress-8403/go/codegen-manifest.json
new file mode 100644
index 000000000..ec4a1afa9
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/codegen-manifest.json
@@ -0,0 +1,10 @@
+{
+ "emittedFiles": [
+ "mongodbatlas/doc.go",
+ "mongodbatlas/getCustomDbRoles.go",
+ "mongodbatlas/init.go",
+ "mongodbatlas/provider.go",
+ "mongodbatlas/pulumiTypes.go",
+ "mongodbatlas/pulumiUtilities.go"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/doc.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/doc.go
new file mode 100644
index 000000000..a4850eeba
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/doc.go
@@ -0,0 +1,3 @@
+// Package mongodbatlas exports types, functions, subpackages for provisioning mongodbatlas resources.
+//
+package mongodbatlas
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/getCustomDbRoles.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/getCustomDbRoles.go
new file mode 100644
index 000000000..53f641738
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/getCustomDbRoles.go
@@ -0,0 +1,24 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package mongodbatlas
+
+import (
+ "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
+)
+
+func LookupCustomDbRoles(ctx *pulumi.Context, args *LookupCustomDbRolesArgs, opts ...pulumi.InvokeOption) (*LookupCustomDbRolesResult, error) {
+ var rv LookupCustomDbRolesResult
+ err := ctx.Invoke("mongodbatlas::getCustomDbRoles", args, &rv, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return &rv, nil
+}
+
+type LookupCustomDbRolesArgs struct {
+}
+
+type LookupCustomDbRolesResult struct {
+ Result *GetCustomDbRolesResult `pulumi:"result"`
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/init.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/init.go
new file mode 100644
index 000000000..e5010e4e7
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/init.go
@@ -0,0 +1,40 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package mongodbatlas
+
+import (
+ "fmt"
+
+ "github.com/blang/semver"
+ "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
+)
+
+type pkg struct {
+ version semver.Version
+}
+
+func (p *pkg) Version() semver.Version {
+ return p.version
+}
+
+func (p *pkg) ConstructProvider(ctx *pulumi.Context, name, typ, urn string) (pulumi.ProviderResource, error) {
+ if typ != "pulumi:providers:mongodbatlas" {
+ return nil, fmt.Errorf("unknown provider type: %s", typ)
+ }
+
+ r := &Provider{}
+ err := ctx.RegisterResource(typ, name, nil, r, pulumi.URN_(urn))
+ return r, err
+}
+
+func init() {
+ version, err := PkgVersion()
+ if err != nil {
+ fmt.Printf("failed to determine package version. defaulting to v1: %v\n", err)
+ }
+ pulumi.RegisterResourcePackage(
+ "mongodbatlas",
+ &pkg{version},
+ )
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/provider.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/provider.go
new file mode 100644
index 000000000..4046d4a06
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/provider.go
@@ -0,0 +1,79 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package mongodbatlas
+
+import (
+ "context"
+ "reflect"
+
+ "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
+)
+
+type Provider struct {
+ pulumi.ProviderResourceState
+}
+
+// NewProvider registers a new resource with the given unique name, arguments, and options.
+func NewProvider(ctx *pulumi.Context,
+ name string, args *ProviderArgs, opts ...pulumi.ResourceOption) (*Provider, error) {
+ if args == nil {
+ args = &ProviderArgs{}
+ }
+
+ var resource Provider
+ err := ctx.RegisterResource("pulumi:providers:mongodbatlas", name, args, &resource, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return &resource, nil
+}
+
+type providerArgs struct {
+}
+
+// The set of arguments for constructing a Provider resource.
+type ProviderArgs struct {
+}
+
+func (ProviderArgs) ElementType() reflect.Type {
+ return reflect.TypeOf((*providerArgs)(nil)).Elem()
+}
+
+type ProviderInput interface {
+ pulumi.Input
+
+ ToProviderOutput() ProviderOutput
+ ToProviderOutputWithContext(ctx context.Context) ProviderOutput
+}
+
+func (*Provider) ElementType() reflect.Type {
+ return reflect.TypeOf((**Provider)(nil)).Elem()
+}
+
+func (i *Provider) ToProviderOutput() ProviderOutput {
+ return i.ToProviderOutputWithContext(context.Background())
+}
+
+func (i *Provider) ToProviderOutputWithContext(ctx context.Context) ProviderOutput {
+ return pulumi.ToOutputWithContext(ctx, i).(ProviderOutput)
+}
+
+type ProviderOutput struct{ *pulumi.OutputState }
+
+func (ProviderOutput) ElementType() reflect.Type {
+ return reflect.TypeOf((**Provider)(nil)).Elem()
+}
+
+func (o ProviderOutput) ToProviderOutput() ProviderOutput {
+ return o
+}
+
+func (o ProviderOutput) ToProviderOutputWithContext(ctx context.Context) ProviderOutput {
+ return o
+}
+
+func init() {
+ pulumi.RegisterInputType(reflect.TypeOf((*ProviderInput)(nil)).Elem(), &Provider{})
+ pulumi.RegisterOutputType(ProviderOutput{})
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiTypes.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiTypes.go
new file mode 100644
index 000000000..9b326e180
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiTypes.go
@@ -0,0 +1,136 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package mongodbatlas
+
+import (
+ "context"
+ "reflect"
+
+ "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
+)
+
+type GetCustomDbRolesResult struct {
+}
+
+// GetCustomDbRolesResultInput is an input type that accepts GetCustomDbRolesResultArgs and GetCustomDbRolesResultOutput values.
+// You can construct a concrete instance of `GetCustomDbRolesResultInput` via:
+//
+// GetCustomDbRolesResultArgs{...}
+type GetCustomDbRolesResultInput interface {
+ pulumi.Input
+
+ ToGetCustomDbRolesResultOutput() GetCustomDbRolesResultOutput
+ ToGetCustomDbRolesResultOutputWithContext(context.Context) GetCustomDbRolesResultOutput
+}
+
+type GetCustomDbRolesResultArgs struct {
+}
+
+func (GetCustomDbRolesResultArgs) ElementType() reflect.Type {
+ return reflect.TypeOf((*GetCustomDbRolesResult)(nil)).Elem()
+}
+
+func (i GetCustomDbRolesResultArgs) ToGetCustomDbRolesResultOutput() GetCustomDbRolesResultOutput {
+ return i.ToGetCustomDbRolesResultOutputWithContext(context.Background())
+}
+
+func (i GetCustomDbRolesResultArgs) ToGetCustomDbRolesResultOutputWithContext(ctx context.Context) GetCustomDbRolesResultOutput {
+ return pulumi.ToOutputWithContext(ctx, i).(GetCustomDbRolesResultOutput)
+}
+
+func (i GetCustomDbRolesResultArgs) ToGetCustomDbRolesResultPtrOutput() GetCustomDbRolesResultPtrOutput {
+ return i.ToGetCustomDbRolesResultPtrOutputWithContext(context.Background())
+}
+
+func (i GetCustomDbRolesResultArgs) ToGetCustomDbRolesResultPtrOutputWithContext(ctx context.Context) GetCustomDbRolesResultPtrOutput {
+ return pulumi.ToOutputWithContext(ctx, i).(GetCustomDbRolesResultOutput).ToGetCustomDbRolesResultPtrOutputWithContext(ctx)
+}
+
+// GetCustomDbRolesResultPtrInput is an input type that accepts GetCustomDbRolesResultArgs, GetCustomDbRolesResultPtr and GetCustomDbRolesResultPtrOutput values.
+// You can construct a concrete instance of `GetCustomDbRolesResultPtrInput` via:
+//
+// GetCustomDbRolesResultArgs{...}
+//
+// or:
+//
+// nil
+type GetCustomDbRolesResultPtrInput interface {
+ pulumi.Input
+
+ ToGetCustomDbRolesResultPtrOutput() GetCustomDbRolesResultPtrOutput
+ ToGetCustomDbRolesResultPtrOutputWithContext(context.Context) GetCustomDbRolesResultPtrOutput
+}
+
+type getCustomDbRolesResultPtrType GetCustomDbRolesResultArgs
+
+func GetCustomDbRolesResultPtr(v *GetCustomDbRolesResultArgs) GetCustomDbRolesResultPtrInput {
+ return (*getCustomDbRolesResultPtrType)(v)
+}
+
+func (*getCustomDbRolesResultPtrType) ElementType() reflect.Type {
+ return reflect.TypeOf((**GetCustomDbRolesResult)(nil)).Elem()
+}
+
+func (i *getCustomDbRolesResultPtrType) ToGetCustomDbRolesResultPtrOutput() GetCustomDbRolesResultPtrOutput {
+ return i.ToGetCustomDbRolesResultPtrOutputWithContext(context.Background())
+}
+
+func (i *getCustomDbRolesResultPtrType) ToGetCustomDbRolesResultPtrOutputWithContext(ctx context.Context) GetCustomDbRolesResultPtrOutput {
+ return pulumi.ToOutputWithContext(ctx, i).(GetCustomDbRolesResultPtrOutput)
+}
+
+type GetCustomDbRolesResultOutput struct{ *pulumi.OutputState }
+
+func (GetCustomDbRolesResultOutput) ElementType() reflect.Type {
+ return reflect.TypeOf((*GetCustomDbRolesResult)(nil)).Elem()
+}
+
+func (o GetCustomDbRolesResultOutput) ToGetCustomDbRolesResultOutput() GetCustomDbRolesResultOutput {
+ return o
+}
+
+func (o GetCustomDbRolesResultOutput) ToGetCustomDbRolesResultOutputWithContext(ctx context.Context) GetCustomDbRolesResultOutput {
+ return o
+}
+
+func (o GetCustomDbRolesResultOutput) ToGetCustomDbRolesResultPtrOutput() GetCustomDbRolesResultPtrOutput {
+ return o.ToGetCustomDbRolesResultPtrOutputWithContext(context.Background())
+}
+
+func (o GetCustomDbRolesResultOutput) ToGetCustomDbRolesResultPtrOutputWithContext(ctx context.Context) GetCustomDbRolesResultPtrOutput {
+ return o.ApplyTWithContext(ctx, func(_ context.Context, v GetCustomDbRolesResult) *GetCustomDbRolesResult {
+ return &v
+ }).(GetCustomDbRolesResultPtrOutput)
+}
+
+type GetCustomDbRolesResultPtrOutput struct{ *pulumi.OutputState }
+
+func (GetCustomDbRolesResultPtrOutput) ElementType() reflect.Type {
+ return reflect.TypeOf((**GetCustomDbRolesResult)(nil)).Elem()
+}
+
+func (o GetCustomDbRolesResultPtrOutput) ToGetCustomDbRolesResultPtrOutput() GetCustomDbRolesResultPtrOutput {
+ return o
+}
+
+func (o GetCustomDbRolesResultPtrOutput) ToGetCustomDbRolesResultPtrOutputWithContext(ctx context.Context) GetCustomDbRolesResultPtrOutput {
+ return o
+}
+
+func (o GetCustomDbRolesResultPtrOutput) Elem() GetCustomDbRolesResultOutput {
+ return o.ApplyT(func(v *GetCustomDbRolesResult) GetCustomDbRolesResult {
+ if v != nil {
+ return *v
+ }
+ var ret GetCustomDbRolesResult
+ return ret
+ }).(GetCustomDbRolesResultOutput)
+}
+
+func init() {
+ pulumi.RegisterInputType(reflect.TypeOf((*GetCustomDbRolesResultInput)(nil)).Elem(), GetCustomDbRolesResultArgs{})
+ pulumi.RegisterInputType(reflect.TypeOf((*GetCustomDbRolesResultPtrInput)(nil)).Elem(), GetCustomDbRolesResultArgs{})
+ pulumi.RegisterOutputType(GetCustomDbRolesResultOutput{})
+ pulumi.RegisterOutputType(GetCustomDbRolesResultPtrOutput{})
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiUtilities.go b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiUtilities.go
new file mode 100644
index 000000000..7b9037e1f
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/go/mongodbatlas/pulumiUtilities.go
@@ -0,0 +1,85 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+package mongodbatlas
+
+import (
+ "fmt"
+ "os"
+ "reflect"
+ "regexp"
+ "strconv"
+ "strings"
+
+ "github.com/blang/semver"
+ "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
+)
+
+type envParser func(v string) interface{}
+
+func parseEnvBool(v string) interface{} {
+ b, err := strconv.ParseBool(v)
+ if err != nil {
+ return nil
+ }
+ return b
+}
+
+func parseEnvInt(v string) interface{} {
+ i, err := strconv.ParseInt(v, 0, 0)
+ if err != nil {
+ return nil
+ }
+ return int(i)
+}
+
+func parseEnvFloat(v string) interface{} {
+ f, err := strconv.ParseFloat(v, 64)
+ if err != nil {
+ return nil
+ }
+ return f
+}
+
+func parseEnvStringArray(v string) interface{} {
+ var result pulumi.StringArray
+ for _, item := range strings.Split(v, ";") {
+ result = append(result, pulumi.String(item))
+ }
+ return result
+}
+
+func getEnvOrDefault(def interface{}, parser envParser, vars ...string) interface{} {
+ for _, v := range vars {
+ if value := os.Getenv(v); value != "" {
+ if parser != nil {
+ return parser(value)
+ }
+ return value
+ }
+ }
+ return def
+}
+
+// PkgVersion uses reflection to determine the version of the current package.
+func PkgVersion() (semver.Version, error) {
+ type sentinal struct{}
+ pkgPath := reflect.TypeOf(sentinal{}).PkgPath()
+ re := regexp.MustCompile("^.*/pulumi-mongodbatlas/sdk(/v\\d+)?")
+ if match := re.FindStringSubmatch(pkgPath); match != nil {
+ vStr := match[1]
+ if len(vStr) == 0 { // If the version capture group was empty, default to v1.
+ return semver.Version{Major: 1}, nil
+ }
+ return semver.MustParse(fmt.Sprintf("%s.0.0", vStr[2:])), nil
+ }
+ return semver.Version{}, fmt.Errorf("failed to determine the package version from %s", pkgPath)
+}
+
+// isZero is a null safe check for if a value is it's types zero value.
+func isZero(v interface{}) bool {
+ if v == nil {
+ return true
+ }
+ return reflect.ValueOf(v).IsZero()
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/README.md b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/codegen-manifest.json b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/codegen-manifest.json
new file mode 100644
index 000000000..a768b3fa3
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/codegen-manifest.json
@@ -0,0 +1,14 @@
+{
+ "emittedFiles": [
+ "README.md",
+ "getCustomDbRoles.ts",
+ "index.ts",
+ "package.json",
+ "provider.ts",
+ "tsconfig.json",
+ "types/index.ts",
+ "types/input.ts",
+ "types/output.ts",
+ "utilities.ts"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/getCustomDbRoles.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/getCustomDbRoles.ts
new file mode 100644
index 000000000..6682bc619
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/getCustomDbRoles.ts
@@ -0,0 +1,26 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import * as pulumi from "@pulumi/pulumi";
+import { input as inputs, output as outputs } from "./types";
+import * as utilities from "./utilities";
+
+export function getCustomDbRoles(args?: GetCustomDbRolesArgs, opts?: pulumi.InvokeOptions): Promise {
+ args = args || {};
+ if (!opts) {
+ opts = {}
+ }
+
+ if (!opts.version) {
+ opts.version = utilities.getVersion();
+ }
+ return pulumi.runtime.invoke("mongodbatlas::getCustomDbRoles", {
+ }, opts);
+}
+
+export interface GetCustomDbRolesArgs {
+}
+
+export interface GetCustomDbRolesResult {
+ readonly result?: outputs.GetCustomDbRolesResult;
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/index.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/index.ts
new file mode 100644
index 000000000..a432a34d4
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/index.ts
@@ -0,0 +1,28 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import * as pulumi from "@pulumi/pulumi";
+import * as utilities from "./utilities";
+
+// Export members:
+export * from "./getCustomDbRoles";
+export * from "./provider";
+
+// Export sub-modules:
+import * as types from "./types";
+
+export {
+ types,
+};
+
+import { Provider } from "./provider";
+
+pulumi.runtime.registerResourcePackage("mongodbatlas", {
+ version: utilities.getVersion(),
+ constructProvider: (name: string, type: string, urn: string): pulumi.ProviderResource => {
+ if (type !== "pulumi:providers:mongodbatlas") {
+ throw new Error(`unknown provider type ${type}`);
+ }
+ return new Provider(name, undefined, { urn });
+ },
+});
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/package.json b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/package.json
new file mode 100644
index 000000000..8f2382825
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "@pulumi/mongodbatlas",
+ "version": "${VERSION}",
+ "scripts": {
+ "build": "tsc"
+ },
+ "devDependencies": {
+ "typescript": "^4.3.5"
+ },
+ "peerDependencies": {
+ "@pulumi/pulumi": "latest"
+ },
+ "pulumi": {
+ "resource": true
+ }
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/provider.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/provider.ts
new file mode 100644
index 000000000..a0ea81713
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/provider.ts
@@ -0,0 +1,46 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import * as pulumi from "@pulumi/pulumi";
+import * as utilities from "./utilities";
+
+export class Provider extends pulumi.ProviderResource {
+ /** @internal */
+ public static readonly __pulumiType = 'mongodbatlas';
+
+ /**
+ * Returns true if the given object is an instance of Provider. This is designed to work even
+ * when multiple copies of the Pulumi SDK have been loaded into the same process.
+ */
+ public static isInstance(obj: any): obj is Provider {
+ if (obj === undefined || obj === null) {
+ return false;
+ }
+ return obj['__pulumiType'] === Provider.__pulumiType;
+ }
+
+
+ /**
+ * Create a Provider resource with the given unique name, arguments, and options.
+ *
+ * @param name The _unique_ name of the resource.
+ * @param args The arguments to use to populate this resource's properties.
+ * @param opts A bag of options that control this resource's behavior.
+ */
+ constructor(name: string, args?: ProviderArgs, opts?: pulumi.ResourceOptions) {
+ let resourceInputs: pulumi.Inputs = {};
+ opts = opts || {};
+ {
+ }
+ if (!opts.version) {
+ opts = pulumi.mergeOptions(opts, { version: utilities.getVersion()});
+ }
+ super(Provider.__pulumiType, name, resourceInputs, opts);
+ }
+}
+
+/**
+ * The set of arguments for constructing a Provider resource.
+ */
+export interface ProviderArgs {
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/tsconfig.json b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/tsconfig.json
new file mode 100644
index 000000000..45ff3f07a
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "outDir": "bin",
+ "target": "es2016",
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "declaration": true,
+ "sourceMap": true,
+ "stripInternal": true,
+ "experimentalDecorators": true,
+ "noFallthroughCasesInSwitch": true,
+ "forceConsistentCasingInFileNames": true,
+ "strict": true
+ },
+ "files": [
+ "getCustomDbRoles.ts",
+ "index.ts",
+ "provider.ts",
+ "types/index.ts",
+ "types/input.ts",
+ "types/output.ts",
+ "utilities.ts"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/index.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/index.ts
new file mode 100644
index 000000000..aec972eb2
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/index.ts
@@ -0,0 +1,11 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+// Export sub-modules:
+import * as input from "./input";
+import * as output from "./output";
+
+export {
+ input,
+ output,
+};
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/input.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/input.ts
new file mode 100644
index 000000000..f074e49de
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/input.ts
@@ -0,0 +1,6 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import * as pulumi from "@pulumi/pulumi";
+import { input as inputs, output as outputs } from "../types";
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/output.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/output.ts
new file mode 100644
index 000000000..a3e22c910
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/types/output.ts
@@ -0,0 +1,9 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import * as pulumi from "@pulumi/pulumi";
+import { input as inputs, output as outputs } from "../types";
+
+export interface GetCustomDbRolesResult {
+}
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/nodejs/utilities.ts b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/utilities.ts
new file mode 100644
index 000000000..f26ed073c
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/nodejs/utilities.ts
@@ -0,0 +1,49 @@
+// *** WARNING: this file was generated by test. ***
+// *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+
+export function getEnv(...vars: string[]): string | undefined {
+ for (const v of vars) {
+ const value = process.env[v];
+ if (value) {
+ return value;
+ }
+ }
+ return undefined;
+}
+
+export function getEnvBoolean(...vars: string[]): boolean | undefined {
+ const s = getEnv(...vars);
+ if (s !== undefined) {
+ // NOTE: these values are taken from https://golang.org/src/strconv/atob.go?s=351:391#L1, which is what
+ // Terraform uses internally when parsing boolean values.
+ if (["1", "t", "T", "true", "TRUE", "True"].find(v => v === s) !== undefined) {
+ return true;
+ }
+ if (["0", "f", "F", "false", "FALSE", "False"].find(v => v === s) !== undefined) {
+ return false;
+ }
+ }
+ return undefined;
+}
+
+export function getEnvNumber(...vars: string[]): number | undefined {
+ const s = getEnv(...vars);
+ if (s !== undefined) {
+ const f = parseFloat(s);
+ if (!isNaN(f)) {
+ return f;
+ }
+ }
+ return undefined;
+}
+
+export function getVersion(): string {
+ let version = require('./package.json').version;
+ // Node allows for the version to be prefixed by a "v", while semver doesn't.
+ // If there is a v, strip it off.
+ if (version.indexOf('v') === 0) {
+ version = version.slice(1);
+ }
+ return version;
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/codegen-manifest.json b/pkg/codegen/internal/test/testdata/regress-8403/python/codegen-manifest.json
new file mode 100644
index 000000000..1fefdee1c
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/codegen-manifest.json
@@ -0,0 +1,12 @@
+{
+ "emittedFiles": [
+ "pulumi_mongodbatlas/README.md",
+ "pulumi_mongodbatlas/__init__.py",
+ "pulumi_mongodbatlas/_utilities.py",
+ "pulumi_mongodbatlas/get_custom_db_roles.py",
+ "pulumi_mongodbatlas/outputs.py",
+ "pulumi_mongodbatlas/provider.py",
+ "pulumi_mongodbatlas/py.typed",
+ "setup.py"
+ ]
+}
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/README.md b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/README.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/__init__.py b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/__init__.py
new file mode 100644
index 000000000..2d41b500e
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/__init__.py
@@ -0,0 +1,25 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+from . import _utilities
+import typing
+# Export this package's modules as members:
+from .get_custom_db_roles import *
+from .provider import *
+from . import outputs
+_utilities.register(
+ resource_modules="""
+[]
+""",
+ resource_packages="""
+[
+ {
+ "pkg": "mongodbatlas",
+ "token": "pulumi:providers:mongodbatlas",
+ "fqn": "pulumi_mongodbatlas",
+ "class": "Provider"
+ }
+]
+"""
+)
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/_utilities.py b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/_utilities.py
new file mode 100644
index 000000000..01e27adcb
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/_utilities.py
@@ -0,0 +1,236 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+
+import importlib.util
+import inspect
+import json
+import os
+import pkg_resources
+import sys
+import typing
+
+import pulumi
+import pulumi.runtime
+
+from semver import VersionInfo as SemverVersion
+from parver import Version as PEP440Version
+
+
+def get_env(*args):
+ for v in args:
+ value = os.getenv(v)
+ if value is not None:
+ return value
+ return None
+
+
+def get_env_bool(*args):
+ str = get_env(*args)
+ if str is not None:
+ # NOTE: these values are taken from https://golang.org/src/strconv/atob.go?s=351:391#L1, which is what
+ # Terraform uses internally when parsing boolean values.
+ if str in ["1", "t", "T", "true", "TRUE", "True"]:
+ return True
+ if str in ["0", "f", "F", "false", "FALSE", "False"]:
+ return False
+ return None
+
+
+def get_env_int(*args):
+ str = get_env(*args)
+ if str is not None:
+ try:
+ return int(str)
+ except:
+ return None
+ return None
+
+
+def get_env_float(*args):
+ str = get_env(*args)
+ if str is not None:
+ try:
+ return float(str)
+ except:
+ return None
+ return None
+
+
+def _get_semver_version():
+ # __name__ is set to the fully-qualified name of the current module, In our case, it will be
+ # ._utilities. is the module we want to query the version for.
+ root_package, *rest = __name__.split('.')
+
+ # pkg_resources uses setuptools to inspect the set of installed packages. We use it here to ask
+ # for the currently installed version of the root package (i.e. us) and get its version.
+
+ # Unfortunately, PEP440 and semver differ slightly in incompatible ways. The Pulumi engine expects
+ # to receive a valid semver string when receiving requests from the language host, so it's our
+ # responsibility as the library to convert our own PEP440 version into a valid semver string.
+
+ pep440_version_string = pkg_resources.require(root_package)[0].version
+ pep440_version = PEP440Version.parse(pep440_version_string)
+ (major, minor, patch) = pep440_version.release
+ prerelease = None
+ if pep440_version.pre_tag == 'a':
+ prerelease = f"alpha.{pep440_version.pre}"
+ elif pep440_version.pre_tag == 'b':
+ prerelease = f"beta.{pep440_version.pre}"
+ elif pep440_version.pre_tag == 'rc':
+ prerelease = f"rc.{pep440_version.pre}"
+ elif pep440_version.dev is not None:
+ prerelease = f"dev.{pep440_version.dev}"
+
+ # The only significant difference between PEP440 and semver as it pertains to us is that PEP440 has explicit support
+ # for dev builds, while semver encodes them as "prerelease" versions. In order to bridge between the two, we convert
+ # our dev build version into a prerelease tag. This matches what all of our other packages do when constructing
+ # their own semver string.
+ return SemverVersion(major=major, minor=minor, patch=patch, prerelease=prerelease)
+
+
+# Determine the version once and cache the value, which measurably improves program performance.
+_version = _get_semver_version()
+_version_str = str(_version)
+
+
+def get_version():
+ return _version_str
+
+
+def get_resource_args_opts(resource_args_type, resource_options_type, *args, **kwargs):
+ """
+ Return the resource args and options given the *args and **kwargs of a resource's
+ __init__ method.
+ """
+
+ resource_args, opts = None, None
+
+ # If the first item is the resource args type, save it and remove it from the args list.
+ if args and isinstance(args[0], resource_args_type):
+ resource_args, args = args[0], args[1:]
+
+ # Now look at the first item in the args list again.
+ # If the first item is the resource options class, save it.
+ if args and isinstance(args[0], resource_options_type):
+ opts = args[0]
+
+ # If resource_args is None, see if "args" is in kwargs, and, if so, if it's typed as the
+ # the resource args type.
+ if resource_args is None:
+ a = kwargs.get("args")
+ if isinstance(a, resource_args_type):
+ resource_args = a
+
+ # If opts is None, look it up in kwargs.
+ if opts is None:
+ opts = kwargs.get("opts")
+
+ return resource_args, opts
+
+
+# Temporary: just use pulumi._utils.lazy_import once everyone upgrades.
+def lazy_import(fullname):
+
+ import pulumi._utils as u
+ f = getattr(u, 'lazy_import', None)
+ if f is None:
+ f = _lazy_import_temp
+
+ return f(fullname)
+
+
+# Copied from pulumi._utils.lazy_import, see comments there.
+def _lazy_import_temp(fullname):
+ m = sys.modules.get(fullname, None)
+ if m is not None:
+ return m
+
+ spec = importlib.util.find_spec(fullname)
+
+ m = sys.modules.get(fullname, None)
+ if m is not None:
+ return m
+
+ loader = importlib.util.LazyLoader(spec.loader)
+ spec.loader = loader
+ module = importlib.util.module_from_spec(spec)
+
+ m = sys.modules.get(fullname, None)
+ if m is not None:
+ return m
+
+ sys.modules[fullname] = module
+ loader.exec_module(module)
+ return module
+
+
+class Package(pulumi.runtime.ResourcePackage):
+ def __init__(self, pkg_info):
+ super().__init__()
+ self.pkg_info = pkg_info
+
+ def version(self):
+ return _version
+
+ def construct_provider(self, name: str, typ: str, urn: str) -> pulumi.ProviderResource:
+ if typ != self.pkg_info['token']:
+ raise Exception(f"unknown provider type {typ}")
+ Provider = getattr(lazy_import(self.pkg_info['fqn']), self.pkg_info['class'])
+ return Provider(name, pulumi.ResourceOptions(urn=urn))
+
+
+class Module(pulumi.runtime.ResourceModule):
+ def __init__(self, mod_info):
+ super().__init__()
+ self.mod_info = mod_info
+
+ def version(self):
+ return _version
+
+ def construct(self, name: str, typ: str, urn: str) -> pulumi.Resource:
+ class_name = self.mod_info['classes'].get(typ, None)
+
+ if class_name is None:
+ raise Exception(f"unknown resource type {typ}")
+
+ TheClass = getattr(lazy_import(self.mod_info['fqn']), class_name)
+ return TheClass(name, pulumi.ResourceOptions(urn=urn))
+
+
+def register(resource_modules, resource_packages):
+ resource_modules = json.loads(resource_modules)
+ resource_packages = json.loads(resource_packages)
+
+ for pkg_info in resource_packages:
+ pulumi.runtime.register_resource_package(pkg_info['pkg'], Package(pkg_info))
+
+ for mod_info in resource_modules:
+ pulumi.runtime.register_resource_module(
+ mod_info['pkg'],
+ mod_info['mod'],
+ Module(mod_info))
+
+
+_F = typing.TypeVar('_F', bound=typing.Callable[..., typing.Any])
+
+
+def lift_output_func(func: typing.Any) -> typing.Callable[[_F], _F]:
+ """Decorator internally used on {fn}_output lifted function versions
+ to implement them automatically from the un-lifted function."""
+
+ func_sig = inspect.signature(func)
+
+ def lifted_func(*args, opts=None, **kwargs):
+ bound_args = func_sig.bind(*args, **kwargs)
+ # Convert tuple to list, see pulumi/pulumi#8172
+ args_list = list(bound_args.args)
+ return pulumi.Output.from_input({
+ 'args': args_list,
+ 'kwargs': bound_args.kwargs
+ }).apply(lambda resolved_args: func(*resolved_args['args'],
+ opts=opts,
+ **resolved_args['kwargs']))
+
+ return (lambda _: lifted_func)
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/get_custom_db_roles.py b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/get_custom_db_roles.py
new file mode 100644
index 000000000..796f91e34
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/get_custom_db_roles.py
@@ -0,0 +1,52 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import warnings
+import pulumi
+import pulumi.runtime
+from typing import Any, Mapping, Optional, Sequence, Union, overload
+from . import _utilities
+from . import outputs
+
+__all__ = [
+ 'GetCustomDbRolesResult',
+ 'AwaitableGetCustomDbRolesResult',
+ 'get_custom_db_roles',
+]
+
+@pulumi.output_type
+class GetCustomDbRolesResult:
+ def __init__(__self__, result=None):
+ if result and not isinstance(result, dict):
+ raise TypeError("Expected argument 'result' to be a dict")
+ pulumi.set(__self__, "result", result)
+
+ @property
+ @pulumi.getter
+ def result(self) -> Optional['outputs.GetCustomDbRolesResult']:
+ return pulumi.get(self, "result")
+
+
+class AwaitableGetCustomDbRolesResult(GetCustomDbRolesResult):
+ # pylint: disable=using-constant-test
+ def __await__(self):
+ if False:
+ yield self
+ return GetCustomDbRolesResult(
+ result=self.result)
+
+
+def get_custom_db_roles(opts: Optional[pulumi.InvokeOptions] = None) -> AwaitableGetCustomDbRolesResult:
+ """
+ Use this data source to access information about an existing resource.
+ """
+ __args__ = dict()
+ if opts is None:
+ opts = pulumi.InvokeOptions()
+ if opts.version is None:
+ opts.version = _utilities.get_version()
+ __ret__ = pulumi.runtime.invoke('mongodbatlas::getCustomDbRoles', __args__, opts=opts, typ=GetCustomDbRolesResult).value
+
+ return AwaitableGetCustomDbRolesResult(
+ result=__ret__.result)
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/outputs.py b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/outputs.py
new file mode 100644
index 000000000..ce2347e03
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/outputs.py
@@ -0,0 +1,20 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import warnings
+import pulumi
+import pulumi.runtime
+from typing import Any, Mapping, Optional, Sequence, Union, overload
+from . import _utilities
+
+__all__ = [
+ 'GetCustomDbRolesResult',
+]
+
+@pulumi.output_type
+class GetCustomDbRolesResult(dict):
+ def __init__(__self__):
+ pass
+
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/provider.py b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/provider.py
new file mode 100644
index 000000000..4eaaa3d6e
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/provider.py
@@ -0,0 +1,73 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import warnings
+import pulumi
+import pulumi.runtime
+from typing import Any, Mapping, Optional, Sequence, Union, overload
+from . import _utilities
+
+__all__ = ['ProviderArgs', 'Provider']
+
+@pulumi.input_type
+class ProviderArgs:
+ def __init__(__self__):
+ """
+ The set of arguments for constructing a Provider resource.
+ """
+ pass
+
+
+class Provider(pulumi.ProviderResource):
+ @overload
+ def __init__(__self__,
+ resource_name: str,
+ opts: Optional[pulumi.ResourceOptions] = None,
+ __props__=None):
+ """
+ Create a Mongodbatlas resource with the given unique name, props, and options.
+ :param str resource_name: The name of the resource.
+ :param pulumi.ResourceOptions opts: Options for the resource.
+ """
+ ...
+ @overload
+ def __init__(__self__,
+ resource_name: str,
+ args: Optional[ProviderArgs] = None,
+ opts: Optional[pulumi.ResourceOptions] = None):
+ """
+ Create a Mongodbatlas resource with the given unique name, props, and options.
+ :param str resource_name: The name of the resource.
+ :param ProviderArgs args: The arguments to use to populate this resource's properties.
+ :param pulumi.ResourceOptions opts: Options for the resource.
+ """
+ ...
+ def __init__(__self__, resource_name: str, *args, **kwargs):
+ resource_args, opts = _utilities.get_resource_args_opts(ProviderArgs, pulumi.ResourceOptions, *args, **kwargs)
+ if resource_args is not None:
+ __self__._internal_init(resource_name, opts, **resource_args.__dict__)
+ else:
+ __self__._internal_init(resource_name, *args, **kwargs)
+
+ def _internal_init(__self__,
+ resource_name: str,
+ opts: Optional[pulumi.ResourceOptions] = None,
+ __props__=None):
+ if opts is None:
+ opts = pulumi.ResourceOptions()
+ if not isinstance(opts, pulumi.ResourceOptions):
+ raise TypeError('Expected resource options to be a ResourceOptions instance')
+ if opts.version is None:
+ opts.version = _utilities.get_version()
+ if opts.id is None:
+ if __props__ is not None:
+ raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
+ __props__ = ProviderArgs.__new__(ProviderArgs)
+
+ super(Provider, __self__).__init__(
+ 'mongodbatlas',
+ resource_name,
+ __props__,
+ opts)
+
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/py.typed b/pkg/codegen/internal/test/testdata/regress-8403/python/pulumi_mongodbatlas/py.typed
new file mode 100644
index 000000000..e69de29bb
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/python/setup.py b/pkg/codegen/internal/test/testdata/regress-8403/python/setup.py
new file mode 100644
index 000000000..37e583cc7
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/python/setup.py
@@ -0,0 +1,58 @@
+# coding=utf-8
+# *** WARNING: this file was generated by test. ***
+# *** Do not edit by hand unless you're certain you know what you are doing! ***
+
+import errno
+from setuptools import setup, find_packages
+from setuptools.command.install import install
+from subprocess import check_call
+
+
+VERSION = "0.0.0"
+PLUGIN_VERSION = "0.0.0"
+
+class InstallPluginCommand(install):
+ def run(self):
+ install.run(self)
+ try:
+ check_call(['pulumi', 'plugin', 'install', 'resource', 'mongodbatlas', PLUGIN_VERSION])
+ except OSError as error:
+ if error.errno == errno.ENOENT:
+ print(f"""
+ There was an error installing the mongodbatlas resource provider plugin.
+ It looks like `pulumi` is not installed on your system.
+ Please visit https://pulumi.com/ to install the Pulumi CLI.
+ You may try manually installing the plugin by running
+ `pulumi plugin install resource mongodbatlas {PLUGIN_VERSION}`
+ """)
+ else:
+ raise
+
+
+def readme():
+ try:
+ with open('README.md', encoding='utf-8') as f:
+ return f.read()
+ except FileNotFoundError:
+ return "mongodbatlas Pulumi Package - Development Version"
+
+
+setup(name='pulumi_mongodbatlas',
+ version=VERSION,
+ long_description=readme(),
+ long_description_content_type='text/markdown',
+ cmdclass={
+ 'install': InstallPluginCommand,
+ },
+ packages=find_packages(),
+ package_data={
+ 'pulumi_mongodbatlas': [
+ 'py.typed',
+ ]
+ },
+ install_requires=[
+ 'parver>=0.2.1',
+ 'pulumi',
+ 'semver>=2.8.1'
+ ],
+ zip_safe=False)
diff --git a/pkg/codegen/internal/test/testdata/regress-8403/schema.json b/pkg/codegen/internal/test/testdata/regress-8403/schema.json
new file mode 100644
index 000000000..c2afc5319
--- /dev/null
+++ b/pkg/codegen/internal/test/testdata/regress-8403/schema.json
@@ -0,0 +1,22 @@
+{
+ "version": "0.0.1",
+ "name": "mongodbatlas",
+ "types": {
+ "mongodbatlas::getCustomDbRolesResult": {
+ "type": "object"
+ }
+ },
+ "functions": {
+ "mongodbatlas::getCustomDbRoles": {
+ "inputs": {},
+ "outputs": {
+ "type": "object",
+ "properties": {
+ "result": {
+ "$ref": "#/types/mongodbatlas::getCustomDbRolesResult"
+ }
+ }
+ }
+ }
+ }
+}