From b60a0bdc240f2ed5818c4d5fc36c4c43fb5e5d5c Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Thu, 16 Oct 2025 13:22:40 +0200 Subject: [PATCH 01/12] Add prefix/namespace property Refactor to pass full CodegenSettings to GenerateFunc --- cmd/root.go | 5 +++++ pkg/codegen/codegen.go | 4 ++-- pkg/codegen/dotnet.go | 6 +++--- pkg/codegen/golang.go | 4 ++-- pkg/codegen/java.go | 10 +++++----- pkg/codegen/language.go | 13 +++++++------ pkg/codegen/nodejs.go | 4 ++-- pkg/codegen/python.go | 6 +++--- 8 files changed, 29 insertions(+), 23 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 40ba213..ddd1abd 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -123,6 +123,11 @@ func New() *cobra.Command { f.StringVarP(&pythonSettings.PackageName, "pythonName", "", codegen.DefaultName, "name of generated Python package") f.StringVarP(&javaSettings.PackageName, "javaName", "", codegen.DefaultName, "name of generated Java package") + f.StringVarP(&dotNetSettings.PackageNamespace, "dotnetNamespace", "", "", "namespace of generated .NET package") + f.StringVarP(&nodejsSettings.PackageNamespace, "nodejsNamespace", "", "", "namespace of generated NodeJS package") + f.StringVarP(&pythonSettings.PackageNamespace, "pythonPackagePrefix", "", "", "prefix of generated Python package") + f.StringVarP(&javaSettings.PackageNamespace, "javaNamespace", "", "", "namespace of generated Java package") + f.StringVarP(&dotNetSettings.OutputDir, "dotnetPath", "", "", "optional .NET output dir") f.StringVarP(&goSettings.OutputDir, "goPath", "", "", "optional Go output dir") f.StringVarP(&nodejsSettings.OutputDir, "nodejsPath", "", "", "optional NodeJS output dir") diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index c672f36..2e8a0c5 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -12,7 +12,7 @@ import ( // GenerateFunc is the function that is called by the generator to generate the code. // It returns a mapping of filename to the contents of said file and any error that may have occurred. -type GenerateFunc func(pg *PackageGenerator, name string) (mapFileNameToData map[string]*bytes.Buffer, err error) +type GenerateFunc func(pg *PackageGenerator, cs *CodegenSettings) (mapFileNameToData map[string]*bytes.Buffer, err error) var codeGenFuncs = map[string]GenerateFunc{ Go: GenerateGo, @@ -59,7 +59,7 @@ func Generate(cs *CodegenSettings, yamls []io.ReadCloser) error { } // Do actual codegen - output, err := generate(pg, cs.PackageName) + output, err := generate(pg, cs) if err != nil { return fmt.Errorf("failed to generate %q package %q: %w", cs.Language, cs.PackageName, err) } diff --git a/pkg/codegen/dotnet.go b/pkg/codegen/dotnet.go index 5d03783..2612b6c 100644 --- a/pkg/codegen/dotnet.go +++ b/pkg/codegen/dotnet.go @@ -32,7 +32,7 @@ var unneededDotNetFiles = []string{ "Provider.cs", } -func GenerateDotNet(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, error) { +func GenerateDotNet(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.Buffer, error) { pkg := pg.SchemaPackageWithObjectMetaType() // Set up C# namespaces @@ -56,7 +56,7 @@ func GenerateDotNet(pg *PackageGenerator, name string) (map[string]*bytes.Buffer // `Pulumi.Kubernetes.Types.Outputs.Meta.V1.ObjectMeta`. This path would // only get generated properly if `compatibility` was `kubernetes20`. oldName := pkg.Name - pkg.Name = name + pkg.Name = cs.PackageName var err error files, err := dotnet.GeneratePackage(PulumiToolName, pkg, nil, nil) @@ -67,7 +67,7 @@ func GenerateDotNet(pg *PackageGenerator, name string) (map[string]*bytes.Buffer pkg.Name = oldName delete(pkg.Language, "csharp") - namespaceName := dotnet.Title(name) + namespaceName := dotnet.Title(cs.PackageName) files["KubernetesResource.cs"] = []byte(kubernetesResource(namespaceName)) files["Utilities.cs"] = []byte(dotNetUtilities(namespaceName)) diff --git a/pkg/codegen/golang.go b/pkg/codegen/golang.go index bc68b68..8ad7463 100644 --- a/pkg/codegen/golang.go +++ b/pkg/codegen/golang.go @@ -36,7 +36,7 @@ var UnneededGoFiles = codegen.NewStringSet( "utilities/pulumiVersion.go", ) -func GenerateGo(pg *PackageGenerator, name string) (buffers map[string]*bytes.Buffer, err error) { +func GenerateGo(pg *PackageGenerator, cs *CodegenSettings) (buffers map[string]*bytes.Buffer, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("%v", r) @@ -46,7 +46,7 @@ func GenerateGo(pg *PackageGenerator, name string) (buffers map[string]*bytes.Bu pkg := pg.SchemaPackageWithObjectMetaType() langName := "go" oldName := pkg.Name - pkg.Name = name + pkg.Name = cs.PackageName moduleToPackage, err := pg.ModuleToPackage() if err != nil { return nil, fmt.Errorf("%w", err) diff --git a/pkg/codegen/java.go b/pkg/codegen/java.go index 2a1aeb8..19ad970 100644 --- a/pkg/codegen/java.go +++ b/pkg/codegen/java.go @@ -23,7 +23,7 @@ import ( javaGen "github.com/pulumi/pulumi-java/pkg/codegen/java" ) -func GenerateJava(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, error) { +func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.Buffer, error) { pkg := pg.SchemaPackageWithObjectMetaType() // These fields are required for the Java code generation @@ -47,7 +47,7 @@ func GenerateJava(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, langName := "java" oldName := pkg.Name - pkg.Name = name + pkg.Name = cs.PackageName files, err := javaGen.GeneratePackage("crd2pulumi", pkg, nil, nil, true, false) if err != nil { @@ -58,7 +58,7 @@ func GenerateJava(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, delete(pkg.Language, langName) // Pin the kubernetes provider version used - utilsPath := "src/main/java/com/pulumi/" + name + "/Utilities.java" + utilsPath := "src/main/java/com/pulumi/" + cs.PackageName + "/Utilities.java" utils, ok := files[utilsPath] if !ok { return nil, fmt.Errorf("cannot find generated utilities.ts") @@ -69,8 +69,8 @@ func GenerateJava(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, }`)) var unneededJavaFiles = []string{ - "src/main/java/com/pulumi/" + name + "/Provider.java", - "src/main/java/com/pulumi/" + name + "/ProviderArgs.java", + "src/main/java/com/pulumi/" + cs.PackageName + "/Provider.java", + "src/main/java/com/pulumi/" + cs.PackageName + "/ProviderArgs.java", "src/main/java/com/pulumi/kubernetes/meta/v1/inputs/ObjectMetaArgs.java", "src/main/java/com/pulumi/kubernetes/meta/v1/outputs/ObjectMeta.java", } diff --git a/pkg/codegen/language.go b/pkg/codegen/language.go index 6bafd78..8ef0c5f 100644 --- a/pkg/codegen/language.go +++ b/pkg/codegen/language.go @@ -32,12 +32,13 @@ const Python string = "python" const Java string = "java" type CodegenSettings struct { - Language string - OutputDir string - PackageName string - PackageVersion string - Overwrite bool - ShouldGenerate bool + Language string + OutputDir string + PackageName string + PackageNamespace string + PackageVersion string + Overwrite bool + ShouldGenerate bool } func (cs *CodegenSettings) Path() string { diff --git a/pkg/codegen/nodejs.go b/pkg/codegen/nodejs.go index ccc6b6f..26dc144 100644 --- a/pkg/codegen/nodejs.go +++ b/pkg/codegen/nodejs.go @@ -29,10 +29,10 @@ export type ObjectMeta = k8s.types.input.meta.v1.ObjectMeta; export type ObjectMetaPatch = k8s.types.input.meta.v1.ObjectMetaPatch; ` -func GenerateNodeJS(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, error) { +func GenerateNodeJS(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.Buffer, error) { pkg := pg.SchemaPackageWithObjectMetaType() oldName := pkg.Name - pkg.Name = name + pkg.Name = cs.PackageName files, err := nodejs.GeneratePackage(PulumiToolName, pkg, nil, nil, true, nil) if err != nil { diff --git a/pkg/codegen/python.go b/pkg/codegen/python.go index d35b154..7340859 100644 --- a/pkg/codegen/python.go +++ b/pkg/codegen/python.go @@ -27,12 +27,12 @@ const pythonMetaFile = `from pulumi_kubernetes.meta.v1._inputs import * import pulumi_kubernetes.meta.v1.outputs ` -func GeneratePython(pg *PackageGenerator, name string) (map[string]*bytes.Buffer, error) { +func GeneratePython(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes.Buffer, error) { pkg := pg.SchemaPackageWithObjectMetaType() langName := "python" oldName := pkg.Name - pkg.Name = name + pkg.Name = cs.PackageName files, err := python.GeneratePackage(PulumiToolName, pkg, nil, nil) if err != nil { @@ -42,7 +42,7 @@ func GeneratePython(pg *PackageGenerator, name string) (map[string]*bytes.Buffer pkg.Name = oldName delete(pkg.Language, langName) - pythonPackageDir := "pulumi_" + name + pythonPackageDir := "pulumi_" + cs.PackageName // Remove unneeded files var unneededPythonFiles = []string{ From 6072b6b3c1bf131a65b3993e37c206433501b1e0 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Thu, 16 Oct 2025 13:39:49 +0200 Subject: [PATCH 02/12] NodeJS: pass a package namespace downstream --- pkg/codegen/nodejs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/codegen/nodejs.go b/pkg/codegen/nodejs.go index 26dc144..a7a4c0c 100644 --- a/pkg/codegen/nodejs.go +++ b/pkg/codegen/nodejs.go @@ -33,6 +33,7 @@ func GenerateNodeJS(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte pkg := pg.SchemaPackageWithObjectMetaType() oldName := pkg.Name pkg.Name = cs.PackageName + pkg.Namespace = cs.PackageNamespace files, err := nodejs.GeneratePackage(PulumiToolName, pkg, nil, nil, true, nil) if err != nil { From e462892b174452661b42ddd9fda9cea9596bd116 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Thu, 16 Oct 2025 20:55:15 +0200 Subject: [PATCH 03/12] Python: pass a package prefix (namespace) downstream --- pkg/codegen/python.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/codegen/python.go b/pkg/codegen/python.go index 7340859..41ad84d 100644 --- a/pkg/codegen/python.go +++ b/pkg/codegen/python.go @@ -33,6 +33,7 @@ func GeneratePython(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte langName := "python" oldName := pkg.Name pkg.Name = cs.PackageName + pkg.Namespace = cs.PackageNamespace files, err := python.GeneratePackage(PulumiToolName, pkg, nil, nil) if err != nil { @@ -43,6 +44,9 @@ func GeneratePython(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte delete(pkg.Language, langName) pythonPackageDir := "pulumi_" + cs.PackageName + if cs.PackageNamespace != "" { + pythonPackageDir = cs.PackageNamespace + "_" + cs.PackageName + } // Remove unneeded files var unneededPythonFiles = []string{ From 0ccad6829b193a27ea562dfa18c1a0190d3ef1c3 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Thu, 16 Oct 2025 21:09:15 +0200 Subject: [PATCH 04/12] .NET: pass a package namespace downstream --- pkg/codegen/dotnet.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/pkg/codegen/dotnet.go b/pkg/codegen/dotnet.go index 2612b6c..dbb6377 100644 --- a/pkg/codegen/dotnet.go +++ b/pkg/codegen/dotnet.go @@ -57,6 +57,7 @@ func GenerateDotNet(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte // only get generated properly if `compatibility` was `kubernetes20`. oldName := pkg.Name pkg.Name = cs.PackageName + pkg.Namespace = cs.PackageNamespace var err error files, err := dotnet.GeneratePackage(PulumiToolName, pkg, nil, nil) @@ -67,9 +68,13 @@ func GenerateDotNet(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte pkg.Name = oldName delete(pkg.Language, "csharp") - namespaceName := dotnet.Title(cs.PackageName) - files["KubernetesResource.cs"] = []byte(kubernetesResource(namespaceName)) - files["Utilities.cs"] = []byte(dotNetUtilities(namespaceName)) + packageName := dotnet.Title(cs.PackageName) + namespace := dotnet.Title(cs.PackageNamespace) + if namespace == "" { + namespace = "Pulumi" + } + files["KubernetesResource.cs"] = []byte(kubernetesResource(namespace, packageName)) + files["Utilities.cs"] = []byte(dotNetUtilities(namespace, packageName)) // Delete unneeded files for _, unneededFile := range unneededDotNetFiles { @@ -84,9 +89,9 @@ func GenerateDotNet(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte return buffers, nil } -func kubernetesResource(name string) string { +func kubernetesResource(namespace string, name string) string { return `// Copyright 2016-2022, Pulumi Corporation -namespace Pulumi.` + name + `{ +namespace ` + namespace + `.` + name + `{ /// /// A base class for all Kubernetes resources. /// @@ -116,7 +121,7 @@ namespace Pulumi.` + name + `{ // tried running `pulumi up` with the normal `Utilities.cs` file. // As a temporary fix, this modified `Utilities.cs` file just removes the // `static Utilities()` method. -func dotNetUtilities(name string) string { +func dotNetUtilities(namespace string, name string) string { return `// *** WARNING: this file was generated by crd2pulumi. *** // *** Do not edit by hand unless you're certain you know what you are doing! *** @@ -124,7 +129,7 @@ using System; using System.Reflection; using Pulumi.Kubernetes; -namespace Pulumi.` + name + ` +namespace ` + namespace + `.` + name + ` { static class Utilities { From 222324244fc46302af9914371c9ec0a190a3cc41 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Thu, 16 Oct 2025 21:56:12 +0200 Subject: [PATCH 05/12] Java: pass a package namespace downstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed `crd2pulumi/pkg/codegen/java.go` and `pulumi-java` codegen sources. Found in `pulumi-java` `GeneratePackage` path: `generateModuleContextMap` sets `BasePackage` to "com." + sanitizeImport(p.Namespace()) + "." when `BasePackage` is empty and `pkg.Namespace` is non-empty. Since `crd2pulumi` sets `pkg.Namespace` to "com.pulumiverse", pulumi-java prepends its own "com." producing "com.com.pulumiverse" → double com in output paths. Fix is to explicitly set the Java PackageInfo BasePackage to the provided PackageNamespace so the pulumi-java defaulting logic doesn’t add an extra "com.". --- pkg/codegen/java.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pkg/codegen/java.go b/pkg/codegen/java.go index 19ad970..fef11fb 100644 --- a/pkg/codegen/java.go +++ b/pkg/codegen/java.go @@ -18,6 +18,7 @@ import ( "bytes" "fmt" "regexp" + "strings" "github.com/pulumi/crd2pulumi/internal/versions" javaGen "github.com/pulumi/pulumi-java/pkg/codegen/java" @@ -48,6 +49,18 @@ func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes. langName := "java" oldName := pkg.Name pkg.Name = cs.PackageName + pkg.Namespace = cs.PackageNamespace + + // Override Java base package to avoid pulumi-java defaulting logic adding an extra "com." prefix + if pkg.Language == nil { + pkg.Language = map[string]interface{}{} + } + pkg.Language[langName] = javaGen.PackageInfo{BasePackage: cs.PackageNamespace} + + namespacePath := "com/pulumi" + if cs.PackageNamespace != "" { + namespacePath = strings.ReplaceAll(cs.PackageNamespace, ".", "/") + } files, err := javaGen.GeneratePackage("crd2pulumi", pkg, nil, nil, true, false) if err != nil { @@ -58,10 +71,10 @@ func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes. delete(pkg.Language, langName) // Pin the kubernetes provider version used - utilsPath := "src/main/java/com/pulumi/" + cs.PackageName + "/Utilities.java" + utilsPath := "src/main/java/" + namespacePath + "/" + cs.PackageName + "/Utilities.java" utils, ok := files[utilsPath] if !ok { - return nil, fmt.Errorf("cannot find generated utilities.ts") + return nil, fmt.Errorf("cannot find generated Utilities.java at path: %s", utilsPath) } re := regexp.MustCompile(`static \{(?:[^{}]|{[^{}]*})*}`) files[utilsPath] = []byte(re.ReplaceAllString(string(utils), `static { @@ -69,8 +82,8 @@ func GenerateJava(pg *PackageGenerator, cs *CodegenSettings) (map[string]*bytes. }`)) var unneededJavaFiles = []string{ - "src/main/java/com/pulumi/" + cs.PackageName + "/Provider.java", - "src/main/java/com/pulumi/" + cs.PackageName + "/ProviderArgs.java", + "src/main/java/" + namespacePath + "/" + cs.PackageName + "/Provider.java", + "src/main/java/" + namespacePath + "/" + cs.PackageName + "/ProviderArgs.java", "src/main/java/com/pulumi/kubernetes/meta/v1/inputs/ObjectMetaArgs.java", "src/main/java/com/pulumi/kubernetes/meta/v1/outputs/ObjectMeta.java", } From 46ea89afef98ca6bac7f3c860b61ecbb8c954255 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Fri, 17 Oct 2025 09:12:08 +0200 Subject: [PATCH 06/12] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9981a9..32607d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 1.6.0 (2025-10-17) + +- Configurable package namespaces/prefixes. (https://github.com/pulumi/crd2pulumi/pull/247) + ## 1.5.4 (2024-11-13) - NodeJS now uses correct input/output types for object metadata. (https://github.com/pulumi/crd2pulumi/issues/158) From 1450d620ab40ed99da516d145a7c01e1425e07ef Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Fri, 17 Oct 2025 09:49:05 +0200 Subject: [PATCH 07/12] Fix test --- tests/unneeded_go_files_test.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/tests/unneeded_go_files_test.go b/tests/unneeded_go_files_test.go index 08e1b0b..6f60a87 100644 --- a/tests/unneeded_go_files_test.go +++ b/tests/unneeded_go_files_test.go @@ -41,17 +41,21 @@ spec: } // Pick a generated file we want to exclude - uneededGoFile := "uneededgofilestest/test/testResource.go" - codegen.UnneededGoFiles.Add(uneededGoFile) + unNeededGoFile := "unneededgofilestest/test/testResource.go" + codegen.UnneededGoFiles.Add(unNeededGoFile) // Generate the code from the mocked CRD - buffers, err := codegen.GenerateGo(pg, "crds") + goSettings := &codegen.CodegenSettings{ + Language: "go", + PackageName: "crds", + } + buffers, err := codegen.GenerateGo(pg, goSettings) if err != nil { t.Fatalf("GenerateGo failed: %v", err) } // Assert that buffers do not contain unneeded file - if _, exists := buffers["../kubernetes/"+uneededGoFile]; exists { - t.Errorf("Uneeded GO file was not excluded by GoGenerate, %s", uneededGoFile) + if _, exists := buffers["../kubernetes/"+unNeededGoFile]; exists { + t.Errorf("Unneeded GO file was not excluded by GoGenerate, %s", unNeededGoFile) } } From ba5c1847368dd1ee6ab45012b642b44769c630e4 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Fri, 17 Oct 2025 09:49:20 +0200 Subject: [PATCH 08/12] Configure local tools via mise --- mise.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mise.toml diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..d84d45e --- /dev/null +++ b/mise.toml @@ -0,0 +1,9 @@ +[tools] + +# Runtimes +go = "1.24.3" +node = '20.19.5' +python = '3.11.8' +dotnet = '8.0.414' +# Corretto version used as Java SE/OpenJDK version no longer offered +java = 'corretto-11' \ No newline at end of file From fe045d5471964a6b538481bad37382793dc5a760 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Fri, 17 Oct 2025 11:43:07 +0200 Subject: [PATCH 09/12] Updated README.md including new namespace/prefix options. --- README.md | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 47780d9..9b88826 100644 --- a/README.md +++ b/README.md @@ -59,23 +59,28 @@ Available Commands: version Print the version number of crd2pulumi Flags: - -d, --dotnet generate .NET - --dotnetName string name of .NET package (default "crds") - --dotnetPath string optional .NET output dir - -f, --force overwrite existing files - -g, --go generate Go - --goName string name of Go package (default "crds") - --goPath string optional Go output dir - -h, --help help for crd2pulumi - -j, --java generate Java - --javaName string name of Java package (default "crds") - --javaPath string optional Java output dir - -n, --nodejs generate NodeJS - --nodejsName string name of NodeJS package (default "crds") - --nodejsPath string optional NodeJS output dir - -p, --python generate Python - --pythonName string name of Python package (default "crds") - --pythonPath string optional Python output dir + -d, --dotnet generate .NET + --dotnetName string name of generated .NET package (default "crds") + --dotnetNamespace string namespace of generated .NET package + --dotnetPath string optional .NET output dir + -f, --force overwrite existing files + -g, --go generate Go + --goName string name of generated Go package (default "crds") + --goPath string optional Go output dir + -h, --help help for crd2pulumi + -j, --java generate Java + --javaName string name of generated Java package (default "crds") + --javaNamespace string namespace of generated Java package + --javaPath string optional Java output dir + -n, --nodejs generate NodeJS + --nodejsName string name of generated NodeJS package (default "crds") + --nodejsNamespace string namespace of generated NodeJS package + --nodejsPath string optional NodeJS output dir + -p, --python generate Python + --pythonName string name of generated Python package (default "crds") + --pythonPackagePrefix string prefix of generated Python package + --pythonPath string optional Python output dir + Use "crd2pulumi [command] --help" for more information about a command. ``` From bf178b3992b21af0ba1ce34ccab0c0927ed65719 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Tue, 21 Oct 2025 22:04:10 +0200 Subject: [PATCH 10/12] Use the .NET Namespace as is. --- pkg/codegen/dotnet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/codegen/dotnet.go b/pkg/codegen/dotnet.go index dbb6377..3263521 100644 --- a/pkg/codegen/dotnet.go +++ b/pkg/codegen/dotnet.go @@ -69,7 +69,7 @@ func GenerateDotNet(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte delete(pkg.Language, "csharp") packageName := dotnet.Title(cs.PackageName) - namespace := dotnet.Title(cs.PackageNamespace) + namespace := cs.PackageNamespace if namespace == "" { namespace = "Pulumi" } From b3fa6cec7dac106c1c02eb1390fff18013ddec57 Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Tue, 21 Oct 2025 22:07:52 +0200 Subject: [PATCH 11/12] Use `--javaBasePackage` rather than `--javaNamespace` to be more idiomatic to Java. --- README.md | 2 +- cmd/root.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b88826..6b0f0b6 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,8 @@ Flags: --goPath string optional Go output dir -h, --help help for crd2pulumi -j, --java generate Java + --javaBasePackage string base package of generated Java package --javaName string name of generated Java package (default "crds") - --javaNamespace string namespace of generated Java package --javaPath string optional Java output dir -n, --nodejs generate NodeJS --nodejsName string name of generated NodeJS package (default "crds") diff --git a/cmd/root.go b/cmd/root.go index ddd1abd..25ccdc3 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -126,7 +126,7 @@ func New() *cobra.Command { f.StringVarP(&dotNetSettings.PackageNamespace, "dotnetNamespace", "", "", "namespace of generated .NET package") f.StringVarP(&nodejsSettings.PackageNamespace, "nodejsNamespace", "", "", "namespace of generated NodeJS package") f.StringVarP(&pythonSettings.PackageNamespace, "pythonPackagePrefix", "", "", "prefix of generated Python package") - f.StringVarP(&javaSettings.PackageNamespace, "javaNamespace", "", "", "namespace of generated Java package") + f.StringVarP(&javaSettings.PackageNamespace, "javaBasePackage", "", "", "base package of generated Java package") f.StringVarP(&dotNetSettings.OutputDir, "dotnetPath", "", "", "optional .NET output dir") f.StringVarP(&goSettings.OutputDir, "goPath", "", "", "optional Go output dir") From bec27a5235b7d6b9503ec5c17c7cccb62e12cf7d Mon Sep 17 00:00:00 2001 From: Ringo De Smet Date: Tue, 21 Oct 2025 22:19:33 +0200 Subject: [PATCH 12/12] Small change to `pythonPackageDir` only once. --- pkg/codegen/python.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/codegen/python.go b/pkg/codegen/python.go index 41ad84d..5e57292 100644 --- a/pkg/codegen/python.go +++ b/pkg/codegen/python.go @@ -43,10 +43,11 @@ func GeneratePython(pg *PackageGenerator, cs *CodegenSettings) (map[string]*byte pkg.Name = oldName delete(pkg.Language, langName) - pythonPackageDir := "pulumi_" + cs.PackageName - if cs.PackageNamespace != "" { - pythonPackageDir = cs.PackageNamespace + "_" + cs.PackageName + namespace := cs.PackageNamespace + if namespace == "" { + namespace = "pulumi" } + pythonPackageDir := namespace + "_" + cs.PackageName // Remove unneeded files var unneededPythonFiles = []string{