Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
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
643 changes: 301 additions & 342 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.

63 changes: 37 additions & 26 deletions e2e/tests/context/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,54 @@ 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() {
ctx := context.Background()
initialDir, err := os.Getwd()
if err != nil {
panic(err)
}

ginkgo.It("create a new context, switch to it and delete afterwards", func() {
f := framework.NewDefaultFramework(initialDir + "/bin")

err = f.DevPodContextCreate(ctx, "test-context")
var _ = ginkgo.Describe(
"devpod context test suite",
ginkgo.Label("context"),
ginkgo.Ordered,
func() {
var initialDir string

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

err = f.DevPodContextUse(context.Background(), "test-context")
framework.ExpectNoError(err)
ginkgo.It(
"create a new context, switch to it and delete afterwards",
func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")

err = f.DevPodContextDelete(context.Background(), "test-context")
framework.ExpectNoError(err)
})
var err error
err = f.DevPodContextCreate(ctx, "test-context")
framework.ExpectNoError(err)

ginkgo.It("should use shared context in IDE commands", func() {
err = f.DevPodContextUse(ctx, "test-context")
framework.ExpectNoError(err)

err = f.DevPodContextDelete(ctx, "test-context")
framework.ExpectNoError(err)
},
Comment thread
coderabbitai[bot] marked this conversation as resolved.
)

ginkgo.It("should use shared context in IDE commands", func(ctx context.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")

contextA := "test-ctx-a-ide"
contextB := "test-ctx-b-ide"

var err error
err = f.DevPodContextCreate(ctx, contextA)
framework.ExpectNoError(err)
ginkgo.DeferCleanup(func(cleanupCtx context.Context) {
_ = f.DevPodContextDelete(cleanupCtx, contextA)
})

err = f.DevPodContextCreate(ctx, contextB)
framework.ExpectNoError(err)

ginkgo.DeferCleanup(func() {
_ = f.DevPodContextDelete(ctx, contextA)
_ = f.DevPodContextDelete(ctx, contextB)
ginkgo.DeferCleanup(func(cleanupCtx context.Context) {
err = f.DevPodContextDelete(cleanupCtx, contextB)
framework.ExpectNoError(err)
})

err = f.DevPodContextUse(ctx, contextA)
Expand Down Expand Up @@ -87,8 +99,7 @@ var _ = DevPodDescribe("devpod context test suite", func() {
ginkgo.Fail("IDE was not set in context-b as expected")
}

err = os.Setenv("DEVPOD_CONTEXT", contextB)
framework.ExpectNoError(err)
ginkgo.GinkgoT().Setenv("DEVPOD_CONTEXT", contextB)

output, err = f.DevPodIDEList(ctx, "--output", "json")
framework.ExpectNoError(err)
Expand All @@ -111,5 +122,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.

65 changes: 31 additions & 34 deletions e2e/tests/ide/ide.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,50 +8,47 @@ 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.Context) {
f := framework.NewDefaultFramework(initialDir + "/bin")
tempDir, err := framework.CopyToTempDir("tests/ide/testdata")
framework.ExpectNoError(err)

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

_ = f.DevPodProviderDelete(ctx, "docker")
err = f.DevPodProviderAdd(ctx, "docker")
framework.ExpectNoError(err)
err = f.DevPodProviderUse(context.Background(), "docker")
ginkgo.DeferCleanup(func(cleanupCtx context.Context) {
err = f.DevPodWorkspaceDelete(cleanupCtx, tempDir)
framework.ExpectNoError(err)
})

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.

85 changes: 33 additions & 52 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,21 +10,21 @@ 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()
framework.ExpectNoError(err)
})

ginkgo.It("should generate ssh keypairs", func(ctx context.Context) {
var _ = ginkgo.Describe(
"devpod provider ssh test suite",
ginkgo.Label("integration"),
func() {
var initialDir string

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

ginkgo.It(
"should setup ssh, add provider, run workspace, test ssh, and cleanup",
func(ctx context.Context) {
sshDir := os.Getenv("HOME") + "/.ssh"
if _, err := os.Stat(sshDir); os.IsNotExist(err) {
err = os.MkdirAll(sshDir, 0o700)
Expand All @@ -38,7 +37,7 @@ var _ = ginkgo.Describe("[integration]: devpod provider ssh test suite", ginkgo.

_, err := os.Stat(sshKeyPath)
if err != nil {
fmt.Println("generating ssh keys")
ginkgo.GinkgoWriter.Println("generating ssh keys")
// #nosec G204 -- ssh-keygen with fixed arguments for test setup
cmd := exec.CommandContext(
ctx,
Expand Down Expand Up @@ -69,51 +68,33 @@ var _ = ginkgo.Describe("[integration]: devpod provider ssh test suite", ginkgo.
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)
}
})
err = os.WriteFile(authorizedKeysPath, publicKey, 0o600)
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())
if err := f.DevPodProviderDelete(ctx, "ssh"); err != nil {
ginkgo.GinkgoWriter.Println("warning: " + err.Error())
}
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

Fail on unexpected provider-delete errors during setup.

If DevPodProviderDelete(ctx, "ssh") fails for anything other than the expected “not found” case, the spec keeps going with stale provider state and the later assertions become misleading. Filter only the benign absence case, otherwise fail here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@e2e/tests/integration/integration.go` around lines 76 - 78, Replace the
current catch-all warning for DevPodProviderDelete errors with logic that treats
only Kubernetes "not found" as benign: call f.DevPodProviderDelete(ctx, "ssh"),
and if err != nil then if apierrors.IsNotFound(err) (from
k8s.io/apimachinery/pkg/api/errors) write the warning to ginkgo.GinkgoWriter,
otherwise fail the spec immediately (e.g. ginkgo.Fail(err.Error()) or use the
test's fail helper) so unexpected provider-delete errors stop the test;
reference the DevPodProviderDelete call and the ctx/"ssh" arguments when
locating the code to change.


err = f.DevPodProviderAdd(ctx, "ssh", "-o", "HOST=localhost")
framework.ExpectNoError(err)
})
ginkgo.DeferCleanup(func(cleanupCtx context.Context) {
err = f.DevPodProviderDelete(cleanupCtx, "ssh")
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 = f.DevPodUp(ctx, "tests/integration/testdata/")
framework.ExpectNoError(err)
})
ginkgo.DeferCleanup(func(cleanupCtx context.Context) {
err = f.DevPodWorkspaceDelete(cleanupCtx, "testdata")
framework.ExpectNoError(err)
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.

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)
})
},
)
})
},
)
},
)
50 changes: 0 additions & 50 deletions e2e/tests/machine/create.go

This file was deleted.

Loading
Loading