Skip to content

Commit c7293bd

Browse files
committed
Implement devspace enter (#247)
1 parent 7a48b9e commit c7293bd

3 files changed

Lines changed: 133 additions & 37 deletions

File tree

cmd/enter.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package cmd
2+
3+
import (
4+
helmClient "github.com/covexo/devspace/pkg/devspace/clients/helm"
5+
"github.com/covexo/devspace/pkg/devspace/clients/kubectl"
6+
"github.com/covexo/devspace/pkg/devspace/config/configutil"
7+
"github.com/covexo/devspace/pkg/util/log"
8+
"github.com/spf13/cobra"
9+
k8sv1 "k8s.io/api/core/v1"
10+
"k8s.io/client-go/kubernetes"
11+
kubectlExec "k8s.io/client-go/util/exec"
12+
)
13+
14+
// EnterCmd is a struct that defines a command call for "enter"
15+
type EnterCmd struct {
16+
flags *EnterCmdFlags
17+
helm *helmClient.HelmClientWrapper
18+
kubectl *kubernetes.Clientset
19+
pod *k8sv1.Pod
20+
}
21+
22+
// EnterCmdFlags are the flags available for the enter-command
23+
type EnterCmdFlags struct {
24+
container string
25+
}
26+
27+
func init() {
28+
cmd := &EnterCmd{
29+
flags: &EnterCmdFlags{},
30+
}
31+
32+
cobraCmd := &cobra.Command{
33+
Use: "enter",
34+
Short: "Enter your DevSpace",
35+
Long: `
36+
#######################################################
37+
################## devspace enter #####################
38+
#######################################################
39+
Execute a command or start a new terminal in your
40+
devspace:
41+
42+
devspace enter
43+
devspace enter bash
44+
devspace enter -c myContainer
45+
#######################################################`,
46+
Run: cmd.Run,
47+
}
48+
rootCmd.AddCommand(cobraCmd)
49+
50+
cobraCmd.Flags().StringVarP(&cmd.flags.container, "container", "c", "", "Container name within pod where to execute command")
51+
}
52+
53+
// Run executes the command logic
54+
func (cmd *EnterCmd) Run(cobraCmd *cobra.Command, args []string) {
55+
var err error
56+
log.StartFileLogging()
57+
58+
cmd.kubectl, err = kubectl.NewClient()
59+
if err != nil {
60+
log.Fatalf("Unable to create new kubectl client: %v", err)
61+
}
62+
63+
log.StartWait("Initializing helm client")
64+
cmd.helm, err = helmClient.NewClient(cmd.kubectl, false)
65+
log.StopWait()
66+
if err != nil {
67+
log.Fatalf("Error initializing helm client: %s", err.Error())
68+
}
69+
70+
// Check if we find a running release pod
71+
pod, err := getRunningDevSpacePod(cmd.helm, cmd.kubectl)
72+
if err != nil {
73+
log.Fatal("Cannot find a running devspace pod")
74+
}
75+
76+
enterTerminal(cmd.kubectl, pod, cmd.flags.container, args)
77+
}
78+
79+
func enterTerminal(client *kubernetes.Clientset, pod *k8sv1.Pod, containerNameOverride string, args []string) {
80+
var command []string
81+
config := configutil.GetConfig(false)
82+
83+
if len(args) == 0 && (config.DevSpace.Terminal.Command == nil || len(*config.DevSpace.Terminal.Command) == 0) {
84+
command = []string{
85+
"sh",
86+
"-c",
87+
"command -v bash >/dev/null 2>&1 && exec bash || exec sh",
88+
}
89+
} else {
90+
if len(args) > 0 {
91+
command = args
92+
} else {
93+
for _, cmd := range *config.DevSpace.Terminal.Command {
94+
command = append(command, *cmd)
95+
}
96+
}
97+
}
98+
99+
containerName := pod.Spec.Containers[0].Name
100+
if containerNameOverride != "" {
101+
containerName = containerNameOverride
102+
} else if config.DevSpace.Terminal.ContainerName != nil {
103+
containerName = *config.DevSpace.Terminal.ContainerName
104+
}
105+
106+
_, _, _, terminalErr := kubectl.Exec(client, pod, containerName, command, true, nil)
107+
if terminalErr != nil {
108+
if _, ok := terminalErr.(kubectlExec.CodeExitError); ok == false {
109+
log.Fatalf("Unable to start terminal session: %v", terminalErr)
110+
}
111+
}
112+
}

cmd/up.go

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import (
3838
k8sv1 "k8s.io/api/core/v1"
3939
k8sv1beta1 "k8s.io/api/rbac/v1beta1"
4040
"k8s.io/client-go/kubernetes"
41-
kubectlExec "k8s.io/client-go/util/exec"
4241
)
4342

4443
// UpCmd is a struct that defines a command call for "up"
@@ -181,7 +180,7 @@ func (cmd *UpCmd) Run(cobraCmd *cobra.Command, args []string) {
181180
}()
182181
}
183182

184-
cmd.enterTerminal(args)
183+
enterTerminal(cmd.kubectl, cmd.pod, cmd.flags.container, args)
185184
}
186185

187186
func (cmd *UpCmd) ensureNamespace() error {
@@ -795,41 +794,6 @@ func (cmd *UpCmd) startPortForwarding() {
795794
}
796795
}
797796

798-
func (cmd *UpCmd) enterTerminal(args []string) {
799-
var command []string
800-
config := configutil.GetConfig(false)
801-
802-
if len(args) == 0 && (config.DevSpace.Terminal.Command == nil || len(*config.DevSpace.Terminal.Command) == 0) {
803-
command = []string{
804-
"sh",
805-
"-c",
806-
"command -v bash >/dev/null 2>&1 && exec bash || exec sh",
807-
}
808-
} else {
809-
if len(args) > 0 {
810-
command = args
811-
} else {
812-
for _, cmd := range *config.DevSpace.Terminal.Command {
813-
command = append(command, *cmd)
814-
}
815-
}
816-
}
817-
818-
containerName := cmd.pod.Spec.Containers[0].Name
819-
if cmd.flags.container != "" {
820-
containerName = cmd.flags.container
821-
} else if config.DevSpace.Terminal.ContainerName != nil {
822-
containerName = *config.DevSpace.Terminal.ContainerName
823-
}
824-
825-
_, _, _, terminalErr := kubectl.Exec(cmd.kubectl, cmd.pod, containerName, command, true, nil)
826-
if terminalErr != nil {
827-
if _, ok := terminalErr.(kubectlExec.CodeExitError); ok == false {
828-
log.Fatalf("Unable to start terminal session: %v", terminalErr)
829-
}
830-
}
831-
}
832-
833797
func waitForPodReady(kubectl *kubernetes.Clientset, pod *k8sv1.Pod, maxWaitTime time.Duration, checkInterval time.Duration) error {
834798
for maxWaitTime > 0 {
835799
pod, err := kubectl.Core().Pods(pod.Namespace).Get(pod.Name, metav1.GetOptions{})

docs/docs/cli/enter.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
title: devspace enter
3+
---
4+
5+
Execute a command or start a new terminal in your devspace.
6+
7+
```bash
8+
Usage:
9+
devspace enter [flags]
10+
11+
Flags:
12+
-c, --container string Container name within pod where to execute command
13+
-h, --help help for enter
14+
15+
Examples:
16+
devspace enter
17+
devspace enter bash
18+
devspace enter echo 123
19+
devspace enter -c myContainer
20+
```

0 commit comments

Comments
 (0)