From 7c55d2834f0b7fbda67f6d4c9b5172394de5530d Mon Sep 17 00:00:00 2001 From: Matthew Jeffryes Date: Wed, 13 Dec 2023 06:17:28 -0800 Subject: [PATCH 1/4] Pin the k8s version in the generated resources for node --- pkg/codegen/nodejs.go | 15 +++++++++++ tests/crds/k8sversion/mock_crd.yaml | 17 ++++++++++++ tests/crds_test.go | 40 +++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 tests/crds/k8sversion/mock_crd.yaml diff --git a/pkg/codegen/nodejs.go b/pkg/codegen/nodejs.go index e403baa..be4e7b9 100644 --- a/pkg/codegen/nodejs.go +++ b/pkg/codegen/nodejs.go @@ -39,6 +39,9 @@ func GenerateNodeJS(pg *PackageGenerator, name string) (map[string]*bytes.Buffer } pkg.Language[nodejsName], err = ijson.RawMessage(map[string]any{ "moduleToPackage": moduleToPackage, + "dependencies": map[string]string{ + "@pulumi/kubernetes": "^4.0.0", + }, }) if err != nil { return nil, err @@ -59,6 +62,18 @@ func GenerateNodeJS(pg *PackageGenerator, name string) (map[string]*bytes.Buffer } files["package.json"] = bytes.ReplaceAll(packageJSON, []byte("${VERSION}"), []byte("")) + // Pin the kubernetes provider version used + utilities, ok := files["utilities.ts"] + if !ok { + return nil, fmt.Errorf("cannot find generated utilities.ts") + } + files["utilities.ts"] = bytes.ReplaceAll(utilities, + []byte("export function getVersion(): string {"), + []byte(`export const getVersion: () => string = () => "4.5.5" + +function unusedGetVersion(): string {`), + ) + // Create a helper `meta/v1.ts` script that exports the ObjectMeta class from the SDK. If there happens to already // be a `meta/v1.ts` file, then just append the script. if code, ok := files[nodejsMetaPath]; !ok { diff --git a/tests/crds/k8sversion/mock_crd.yaml b/tests/crds/k8sversion/mock_crd.yaml new file mode 100644 index 0000000..25038d1 --- /dev/null +++ b/tests/crds/k8sversion/mock_crd.yaml @@ -0,0 +1,17 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +spec: + group: k8sversion.pulumi.com + names: + plural: testresources + singular: testresource + kind: TestResource + scope: Namespaced + versions: + - test: + name: test + schema: + openAPIV3Schema: + properties: + testProperty: + type: string` diff --git a/tests/crds_test.go b/tests/crds_test.go index fad7119..8df541c 100644 --- a/tests/crds_test.go +++ b/tests/crds_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) var languages = []string{"dotnet", "go", "nodejs", "python"} @@ -117,3 +118,42 @@ func TestCRDsWithUnderscore(t *testing.T) { execCrd2Pulumi(t, "python", "crds/underscored-types/networkpolicy.yaml", validateUnderscore) } + +func TestKubernetesVersionNodeJs(t *testing.T) { + validateVersion := func(t *testing.T, path string) { + // enter and build the generated package + withDir(t, path, func() { + + require.NoError(t, exec.Command("npm", "i").Run()) + require.NoError(t, exec.Command("npm", "run", "build").Run()) + + // extract the version returned by a resource + appendFile(t, "bin/index.js", "\nconsole.log((new k8sversion.test.TestResource('test')).__version)") + + version, err := exec.Command("node", "bin/index.js").Output() + require.NoError(t, err) + assert.Equal(t, "4.5.5\n", string(version)) + }) + } + + execCrd2Pulumi(t, "nodejs", "crds/k8sversion/mock_crd.yaml", validateVersion) +} + +func withDir(t *testing.T, dir string, f func()) { + pwd, err := os.Getwd() + require.NoError(t, err) + defer os.Chdir(pwd) + + require.NoError(t, os.Chdir(dir)) + + f() +} + +func appendFile(t *testing.T, filename, content string) { + // extract the version returned by a resource + f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0600) + require.NoError(t, err) + defer f.Close() + + _, err = f.WriteString(content) +} From 617f58b3df0fc6b0c60b00b1dbcb8794e024fa49 Mon Sep 17 00:00:00 2001 From: Matthew Jeffryes Date: Wed, 13 Dec 2023 06:26:18 -0800 Subject: [PATCH 2/4] Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fda06a7..25aa918 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Fix: Pin the Kubernetes version for generated nodejs resources() + ## 1.3.0 (2023-12-12) - Fix: excluding files from unneededGoFiles was not working () From 8ae84199bfb45d4135308a2e60e00bc72480e4af Mon Sep 17 00:00:00 2001 From: Matthew Jeffryes Date: Mon, 18 Dec 2023 13:34:37 -0800 Subject: [PATCH 3/4] feedback --- tests/crds_test.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/crds_test.go b/tests/crds_test.go index 8df541c..f734ed7 100644 --- a/tests/crds_test.go +++ b/tests/crds_test.go @@ -15,6 +15,7 @@ package tests import ( + "bytes" "fmt" "io/fs" "os" @@ -124,8 +125,8 @@ func TestKubernetesVersionNodeJs(t *testing.T) { // enter and build the generated package withDir(t, path, func() { - require.NoError(t, exec.Command("npm", "i").Run()) - require.NoError(t, exec.Command("npm", "run", "build").Run()) + runRequireNoError(t, exec.Command("npm", "install")) + runRequireNoError(t, exec.Command("npm", "run", "build")) // extract the version returned by a resource appendFile(t, "bin/index.js", "\nconsole.log((new k8sversion.test.TestResource('test')).__version)") @@ -157,3 +158,14 @@ func appendFile(t *testing.T, filename, content string) { _, err = f.WriteString(content) } + +func runRequireNoError(t *testing.T, cmd *exec.Cmd) { + buf := new(bytes.Buffer) + cmd.Stdout = buf + cmd.Stderr = buf + err := cmd.Run() + if err != nil { + t.Log(buf) + } + require.NoError(t, err) +} From 81082b6d871381af74a98fb1a225e270b06aa69c Mon Sep 17 00:00:00 2001 From: Matthew Jeffryes Date: Mon, 18 Dec 2023 13:39:07 -0800 Subject: [PATCH 4/4] feedback --- tests/crds_test.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/crds_test.go b/tests/crds_test.go index f734ed7..b58bbf4 100644 --- a/tests/crds_test.go +++ b/tests/crds_test.go @@ -15,7 +15,6 @@ package tests import ( - "bytes" "fmt" "io/fs" "os" @@ -160,12 +159,9 @@ func appendFile(t *testing.T, filename, content string) { } func runRequireNoError(t *testing.T, cmd *exec.Cmd) { - buf := new(bytes.Buffer) - cmd.Stdout = buf - cmd.Stderr = buf - err := cmd.Run() + bytes, err := cmd.CombinedOutput() if err != nil { - t.Log(buf) + t.Log(bytes) } require.NoError(t, err) }