Skip to content

Commit

Permalink
Feature/gebug init add network (#15)
Browse files Browse the repository at this point in the history
* added prompt

* added networks to render and changed template to be a little more readable

* added additional generate test for network

* fixed cr
  • Loading branch information
InbarPerry authored Jul 22, 2020
1 parent 1358bee commit 900daf7
Show file tree
Hide file tree
Showing 10 changed files with 177 additions and 78 deletions.
1 change: 1 addition & 0 deletions cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ var initCmd = &cobra.Command{
&input.PromptRuntimeImage{Config: currentConfig},
&input.PromptDebuggerOptions{Config: currentConfig},
&input.PromptExposePort{Config: currentConfig},
&input.PromptNetworks{Config: currentConfig},
}, workDir)

if err != nil {
Expand Down
1 change: 1 addition & 0 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ type Config struct {
DebuggerEnabled bool `yaml:"debugger_enabled"`
DebuggerPort int `yaml:"debugger_port"`
ExposePorts []string `yaml:"expose_ports"`
Networks []string `yaml:"networks"`
}

func updateBuildCommand(buildCommand string, debuggerEnabled bool) string {
Expand Down
4 changes: 3 additions & 1 deletion pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package config

import (
"bytes"
"github.com/stretchr/testify/assert"
"io"
"io/ioutil"
"path"
"strconv"
"strings"
"testing"

"github.com/stretchr/testify/assert"
)

func TestConfig_Load(t *testing.T) {
Expand Down Expand Up @@ -136,6 +137,7 @@ debugger_port: 40000
expose_ports:
- "8080"
- 8081:8081
networks: []
`
c := Config{
Name: "my-app",
Expand Down
39 changes: 32 additions & 7 deletions pkg/config/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,37 @@ services:
gebug-{{.Name}}:
build:
context: ..
dockerfile: .gebug/Dockerfile{{if .DebuggerEnabled}}
dockerfile: .gebug/Dockerfile
{{- if .DebuggerEnabled}}
cap_add:
- SYS_PTRACE{{end}}
- SYS_PTRACE
{{- end}}
volumes:
- ../:/src:ro
{{- if .ExposePorts}}
ports:{{range $key, $value := .ExposePorts}}
- {{$value}}{{end}}
ports:
{{- range $key, $value := .ExposePorts}}
- {{$value}}
{{- end}}
{{- end}}
{{- if .DebuggerEnabled}}
- {{.DebuggerPort}}:{{.DebuggerPort}}
{{- end}}
{{- if .Networks}}
networks:
{{- range $key, $value := .Networks}}
- {{$value}}
{{- end}}
{{- end}}
{{- if .Networks}}
networks:
{{- range $key, $value := .Networks}}
{{$value}}:
external: true
{{- end}}
{{- end}}
{{if .DebuggerEnabled}} - {{.DebuggerPort}}:{{.DebuggerPort}}{{end}}`, writer)
`, writer)
}

func (c *Config) RenderDockerfile(writer io.Writer) error {
Expand All @@ -47,6 +68,10 @@ RUN go get github.com/go-delve/delve/cmd/dlv
WORKDIR /src
COPY . .
{{if .DebuggerEnabled}}RUN {{.BuildCommand}}
ENTRYPOINT dlv --listen=:{{.DebuggerPort}} --headless=true --api-version=2 --accept-multiclient exec {{.OutputBinaryPath}}{{else}}ENTRYPOINT CompileDaemon -log-prefix=false -build="{{.BuildCommand}}" -command="{{.RunCommand}}"{{end}}`, writer)
{{if .DebuggerEnabled -}}
RUN {{.BuildCommand}}
ENTRYPOINT dlv --listen=:{{.DebuggerPort}} --headless=true --api-version=2 --accept-multiclient exec {{.OutputBinaryPath}}
{{- else -}}
ENTRYPOINT CompileDaemon -log-prefix=false -build="{{.BuildCommand}}" -command="{{.RunCommand}}"
{{- end}}`, writer)
}
2 changes: 1 addition & 1 deletion pkg/config/testdata/generate_docker_compose_0.golden
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ services:
ports:
- 8080:8080
- 8081:8081
- 40000:40000
- 40000:40000
18 changes: 18 additions & 0 deletions pkg/config/testdata/generate_docker_compose_2.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: '3'
services:
gebug-my-app:
build:
context: ..
dockerfile: .gebug/Dockerfile
volumes:
- ../:/src:ro
ports:
- 8080
networks:
- frontend
- backend
networks:
frontend:
external: true
backend:
external: true
12 changes: 12 additions & 0 deletions pkg/config/testdata/generate_docker_compose_2.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: my-app
output_binary: /app
build_command: go build -o {{.output_binary}}
runtime_image: golang:1.14
run_command: '{{.output_binary}}'
debugger_port: 40000
debugger_enabled: false
expose_ports:
- 8080
networks:
- frontend
- backend
74 changes: 5 additions & 69 deletions pkg/input/expose_ports.go
Original file line number Diff line number Diff line change
@@ -1,82 +1,18 @@
package input

import (
"strings"

"github.com/manifoldco/promptui"
"github.com/moshebe/gebug/pkg/config"
)

const (
doneItem = `✔ Done`
removePrefix = `✖️ `
)

type PromptExposePort struct {
*config.Config
}

func removeItem(items []string, i int) []string {
if len(items) <= 1 {
return []string{}
}

items[i] = items[len(items)-1]
return items[:len(items)-1]
}

func addItem(items []string, item string) []string {
return append(items[:len(items)-1], removePrefix+item, doneItem)
}

func addRemovePrefix(items []string) {
n := len(items)
for i := range items {
if i != n-1 {
items[i] = removePrefix + items[i]
}
}
}

func cleanResults(items []string) []string {
items = items[:len(items)-1]
for i := range items {
items[i] = strings.Replace(items[i], removePrefix, "", 1)
}
return items
}

func (p *PromptExposePort) Run() error {
items := append(p.ExposePorts, doneItem)
addRemovePrefix(items)

var result string

for result != doneItem {
prompt := &promptui.SelectWithAdd{
Label: "Define ports to expose. Press existing choices to delete (e.g: 8080[:8080])",
Items: items,
AddLabel: "Add port",
}

cleanResults(items)
var err error
var index int
index, result, err = prompt.Run()
if err != nil {
return err
}
if result == doneItem {
continue
}

if index < 0 {
items = addItem(items, result)
} else {
items = removeItem(items, index)
}
}

p.ExposePorts = cleanResults(items)
return nil
prompt := NewSelectWithAddAndRemove(&p.ExposePorts, &promptui.SelectWithAdd{
Label: "Define ports to expose. Press existing choices to delete (e.g: 8080[:8080])",
AddLabel: "Add port",
})
return prompt.Run()
}
18 changes: 18 additions & 0 deletions pkg/input/networks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package input

import (
"github.com/manifoldco/promptui"
"github.com/moshebe/gebug/pkg/config"
)

type PromptNetworks struct {
*config.Config
}

func (p *PromptNetworks) Run() error {
prompt := NewSelectWithAddAndRemove(&p.Networks, &promptui.SelectWithAdd{
Label: "Add networks or leave empty to create a new network",
AddLabel: "Add network",
})
return prompt.Run()
}
86 changes: 86 additions & 0 deletions pkg/input/select_add_remove.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package input

import (
"github.com/manifoldco/promptui"
"strings"
)

const (
defaultDoneItem = `✔ Done`
defaultRemovePrefix = `✖️ `
)

type SelectWithAddAndRemove struct {
prompt *promptui.SelectWithAdd
field *[]string
doneItem string
removePrefix string
}

func NewSelectWithAddAndRemove(field *[]string, prompt *promptui.SelectWithAdd) *SelectWithAddAndRemove {
return &SelectWithAddAndRemove{
prompt: prompt,
field: field,
doneItem: defaultDoneItem,
removePrefix: defaultRemovePrefix,
}
}

func (s *SelectWithAddAndRemove) remove(items []string, i int) []string {
if len(items) <= 1 {
return []string{}
}

items[i] = items[len(items)-1]
return items[:len(items)-1]
}

func (s *SelectWithAddAndRemove) add(items []string, item string) []string {
return append(items[:len(items)-1], s.removePrefix+item, s.doneItem)
}

func (s *SelectWithAddAndRemove) appendRemovePrefix(items []string) {
n := len(items)
for i := range items {
if i != n-1 {
items[i] = s.removePrefix + items[i]
}
}
}

func (s *SelectWithAddAndRemove) cleanResults(items []string) []string {
items = items[:len(items)-1]
for i := range items {
items[i] = strings.Replace(items[i], s.removePrefix, "", 1)
}
return items
}

func (s *SelectWithAddAndRemove) Run() error {
items := append(*s.field, s.doneItem)
s.appendRemovePrefix(items)

var result string

for result != s.doneItem {
var err error
var index int
s.prompt.Items = items
index, result, err = s.prompt.Run()
if err != nil {
return err
}
if result == s.doneItem {
continue
}

if index < 0 {
items = s.add(items, result)
} else {
items = s.remove(items, index)
}
}

*s.field = s.cleanResults(items)
return nil
}

0 comments on commit 900daf7

Please sign in to comment.