Select Git revision
debug.go 3.27 KiB
package mage_helpers
import (
"context"
"fmt"
"log"
"os"
"os/exec"
"os/signal"
"os/user"
"strings"
"syscall"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func SamStartApi(ctx context.Context, handler string, profile string, debug bool) error {
stopRunningSamDocker()
usr, _ := user.Current()
homeDir := usr.HomeDir
delveDir := homeDir + "/go/delve/"
commandArgs := []string{
`local`,
`start-api`,
}
if debug {
commandArgs = append(commandArgs, `--debug-port=5986`,
fmt.Sprintf(`--debugger-path=%s`, delveDir),
`--debug-args=-delveAPI=2`)
} else {
commandArgs = append(commandArgs, `--warm-containers`, `EAGER`)
}
commandArgs = append(commandArgs,
fmt.Sprintf(`--profile=%v`, profile),
fmt.Sprintf(`--template=core/%v/template.yml`, handler),
`--region=af-south-1`)
err := runLongRunningSubProcess(ctx, "sam", commandArgs...)
if err != nil {
return err
}
return nil
}
func SamInvokeSQS(ctx context.Context, handler string, function string, profile string) error {
stopRunningSamDocker()
usr, _ := user.Current()
homeDir := usr.HomeDir
delveDir := homeDir + "/go/delve/"
commandArgs := []string{
`local`,
`invoke`,
`-e`,
fmt.Sprintf(`core/%v/sqs.input.json`, handler),
function,
`--debug-port=5986`,
fmt.Sprintf(`--debugger-path=%s`, delveDir),
`--debug-args=-delveAPI=2`,
fmt.Sprintf(`--profile=%v`, profile),
fmt.Sprintf(`--template=core/%v/template.yml`, handler),
`--region=af-south-1`,
}
err := runLongRunningSubProcess(ctx, "sam", commandArgs...)
if err != nil {
return err
}
return nil
}
func runLongRunningSubProcess(ctx context.Context, name string, arg ...string) error {
cancelContext, cancel := context.WithCancel(ctx)
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
defer func() {
signal.Stop(signalChan)
cancel()
}()
fmt.Println(fmt.Sprintf("Running command: %s %s", name, strings.Join(arg, " ")))
cmd := exec.CommandContext(cancelContext, name, arg...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
go func() {
select {
case <-signalChan: // first signal, cancel context
fmt.Println("Stopping process")
if err := cmd.Process.Signal(syscall.SIGINT); err != nil {
log.Fatal("failed to kill process: ", err)
}
cancel()
case <-cancelContext.Done():
}
<-signalChan // second signal, hard exit
os.Exit(1)
}()
err := cmd.Run()
if err != nil {
return err
}
return nil
}
func stopRunningSamDocker() {
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{All: true})
if err != nil {
panic(err)
}
for _, container := range containers {
mustStop := false
if strings.Contains(container.Command, "/var/rapid/aws-lambda-rie") {
mustStop = true
} else {
for _, port := range container.Ports {
if port.PrivatePort == 5986 {
mustStop = true
break
}
}
}
if mustStop {
err = cli.ContainerStop(context.Background(), container.ID, nil)
if err != nil {
panic(err)
}
err = cli.ContainerRemove(context.Background(), container.ID, types.ContainerRemoveOptions{})
if err != nil {
panic(err)
}
log.Printf("Stopped and removed container %s\n", container.ID)
}
}
}