Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
610 changes: 289 additions & 321 deletions e2e/tests/build/build.go

Large diffs are not rendered by default.

8 changes: 0 additions & 8 deletions e2e/tests/build/framework.go

This file was deleted.

15 changes: 8 additions & 7 deletions e2e/tests/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ import (
"github.com/skevetter/devpod/e2e/framework"
)

var _ = DevPodDescribe("devpod context test suite", func() {
ginkgo.Context("testing context command", ginkgo.Label("context"), ginkgo.Ordered, func() {
var _ = ginkgo.Describe(
"devpod context test suite",
ginkgo.Label("context"),
ginkgo.Ordered,
func() {
ctx := context.Background()
initialDir, err := os.Getwd()
if err != nil {
panic(err)
}
framework.ExpectNoError(err)

ginkgo.It("create a new context, switch to it and delete afterwards", func() {
f := framework.NewDefaultFramework(initialDir + "/bin")
Expand Down Expand Up @@ -111,5 +112,5 @@ var _ = DevPodDescribe("devpod context test suite", func() {
)
}
})
})
})
},
)
8 changes: 0 additions & 8 deletions e2e/tests/context/framework.go

This file was deleted.

8 changes: 0 additions & 8 deletions e2e/tests/ide/framework.go

This file was deleted.

66 changes: 32 additions & 34 deletions e2e/tests/ide/ide.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,50 +8,48 @@ import (
"github.com/skevetter/devpod/e2e/framework"
)

var _ = DevPodDescribe("devpod ide test suite", func() {
ginkgo.Context("testing ides", ginkgo.Label("ide"), ginkgo.Ordered, func() {
var initialDir string
var _ = ginkgo.Describe("devpod ide test suite", ginkgo.Label("ide"), ginkgo.Ordered, func() {
var initialDir string

ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
framework.ExpectNoError(err)
})
ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
framework.ExpectNoError(err)
})

ginkgo.It("start ides", func() {
ctx := context.Background()
ginkgo.It("start ides", func() {
ctx := context.Background()

f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/ide/testdata")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)
f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/ide/testdata")
framework.ExpectNoError(err)
ginkgo.DeferCleanup(framework.CleanupTempDir, initialDir, tempDir)

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)
_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
framework.ExpectNoError(err)

ginkgo.DeferCleanup(f.DevPodWorkspaceDelete, context.Background(), tempDir)
ginkgo.DeferCleanup(f.DevPodWorkspaceDelete, context.Background(), tempDir)

err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=vscode")
framework.ExpectNoError(err)
err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=vscode")
framework.ExpectNoError(err)

err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=openvscode")
framework.ExpectNoError(err)
err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=openvscode")
framework.ExpectNoError(err)

err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=jupyternotebook")
framework.ExpectNoError(err)
err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=jupyternotebook")
framework.ExpectNoError(err)

// TODO: Fix broken IDE
// err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=fleet")
// framework.ExpectNoError(err)
// TODO: Fix broken IDE
// err = f.DevPodUpWithIDE(ctx, tempDir, "--open-ide=false", "--ide=fleet")
// framework.ExpectNoError(err)

// check if ssh works
err = f.DevPodSSHEchoTestString(ctx, tempDir)
framework.ExpectNoError(err)
// check if ssh works
err = f.DevPodSSHEchoTestString(ctx, tempDir)
framework.ExpectNoError(err)

// TODO: test jetbrains ides
})
// TODO: test jetbrains ides
})
})
8 changes: 0 additions & 8 deletions e2e/tests/integration/framework.go

This file was deleted.

187 changes: 92 additions & 95 deletions e2e/tests/integration/integration.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package integration

import (
"context"
"fmt"
"os"
"os/exec"
"path/filepath"
Expand All @@ -11,109 +10,107 @@ import (
"github.com/skevetter/devpod/e2e/framework"
)

var _ = ginkgo.Describe("[integration]: devpod provider ssh test suite", ginkgo.Ordered, func() {
ginkgo.Context(
"testing provider integration",
ginkgo.Label("integration"),
ginkgo.Ordered,
func() {
var initialDir string

ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
var _ = ginkgo.Describe(
"devpod provider ssh test suite",
ginkgo.Label("integration"),
ginkgo.Ordered,
func() {
var initialDir string

ginkgo.BeforeEach(func() {
var err error
initialDir, err = os.Getwd()
framework.ExpectNoError(err)
})

ginkgo.It("should generate ssh keypairs", func(ctx context.Context) {
sshDir := os.Getenv("HOME") + "/.ssh"
if _, err := os.Stat(sshDir); os.IsNotExist(err) {
err = os.MkdirAll(sshDir, 0o700)
framework.ExpectNoError(err)
})

ginkgo.It("should generate ssh keypairs", func(ctx context.Context) {
sshDir := os.Getenv("HOME") + "/.ssh"
if _, err := os.Stat(sshDir); os.IsNotExist(err) {
err = os.MkdirAll(sshDir, 0o700)
framework.ExpectNoError(err)
}

homeDir := os.Getenv("HOME")
sshKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa")
sshPubKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa.pub")

_, err := os.Stat(sshKeyPath)
if err != nil {
fmt.Println("generating ssh keys")
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd := exec.CommandContext(
ctx,
"ssh-keygen",
"-q",
"-t",
"rsa",
"-N",
"",
"-f",
sshKeyPath,
)
err = cmd.Run()
framework.ExpectNoError(err)

// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd = exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
output, err := cmd.Output()
framework.ExpectNoError(err)

err = os.WriteFile(sshPubKeyPath, output, 0o600)
framework.ExpectNoError(err)
}
}

homeDir := os.Getenv("HOME")
sshKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa")
sshPubKeyPath := filepath.Join(homeDir, ".ssh", "id_rsa.pub")

_, err := os.Stat(sshKeyPath)
if err != nil {
ginkgo.GinkgoWriter.Println("generating ssh keys")
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd := exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
publicKey, err := cmd.Output()
cmd := exec.CommandContext(
ctx,
"ssh-keygen",
"-q",
"-t",
"rsa",
"-N",
"",
"-f",
sshKeyPath,
)
err = cmd.Run()
framework.ExpectNoError(err)

authorizedKeysPath := filepath.Join(homeDir, ".ssh", "authorized_keys")
_, err = os.Stat(authorizedKeysPath)
if err != nil {
err = os.WriteFile(authorizedKeysPath, publicKey, 0o600)
framework.ExpectNoError(err)
} else {
f, err := os.OpenFile(os.Getenv("HOME")+"/.ssh/authorized_keys",
os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
framework.ExpectNoError(err)

defer func() { _ = f.Close() }()
_, err = f.Write(publicKey)
framework.ExpectNoError(err)
}
})

ginkgo.It("should add provider to devpod", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
// ensure we don't have the ssh provider present
err := f.DevPodProviderDelete(ctx, "ssh")
if err != nil {
fmt.Println("warning: " + err.Error())
}

err = f.DevPodProviderAdd(ctx, "ssh", "-o", "HOST=localhost")
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd = exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
output, err := cmd.Output()
framework.ExpectNoError(err)
})

ginkgo.It("should run devpod up", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
err := f.DevPodUp(ctx, "tests/integration/testdata/")
err = os.WriteFile(sshPubKeyPath, output, 0o600)
framework.ExpectNoError(err)
})
}

// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd := exec.CommandContext(ctx, "ssh-keygen", "-y", "-f", sshKeyPath)
publicKey, err := cmd.Output()
framework.ExpectNoError(err)

ginkgo.It("should run commands to workspace via ssh", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
out, err := f.DevPodSSH(ctx, "testdata", "echo test")
authorizedKeysPath := filepath.Join(homeDir, ".ssh", "authorized_keys")
_, err = os.Stat(authorizedKeysPath)
if err != nil {
err = os.WriteFile(authorizedKeysPath, publicKey, 0o600)
framework.ExpectNoError(err)
} else {
f, err := os.OpenFile(os.Getenv("HOME")+"/.ssh/authorized_keys",
os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600)
framework.ExpectNoError(err)
framework.ExpectEqual(out, "test\n")
})

ginkgo.It("should cleanup devpod workspace", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
err := f.DevPodWorkspaceDelete(ctx, "testdata")
defer func() { _ = f.Close() }()
_, err = f.Write(publicKey)
framework.ExpectNoError(err)
})
},
)
})
}
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't mutate the real $HOME/.ssh from this spec.

This now creates host-level id_rsa* files and appends to authorized_keys with no cleanup. Local runs become stateful, and CI/user accounts keep accumulating test artifacts. Use a temporary HOME/SSH dir for the suite, or snapshot and restore these files in cleanup.


ginkgo.It("should add provider to devpod", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
// ensure we don't have the ssh provider present
err := f.DevPodProviderDelete(ctx, "ssh")
if err != nil {
ginkgo.GinkgoWriter.Println("warning: " + err.Error())
}

err = f.DevPodProviderAdd(ctx, "ssh", "-o", "HOST=localhost")
framework.ExpectNoError(err)
})

ginkgo.It("should run devpod up", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
err := f.DevPodUp(ctx, "tests/integration/testdata/")
framework.ExpectNoError(err)
})

ginkgo.It("should run commands to workspace via ssh", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
out, err := f.DevPodSSH(ctx, "testdata", "echo test")
framework.ExpectNoError(err)
framework.ExpectEqual(out, "test\n")
})

ginkgo.It("should cleanup devpod workspace", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
err := f.DevPodWorkspaceDelete(ctx, "testdata")
framework.ExpectNoError(err)
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
},
)
Loading