Skip to content
Snippets Groups Projects
Select Git revision
  • 380e9ac868f84b3267ff316ee26cbf26e8a5b2a9
  • main default protected
  • 1-mage-run-does-not-stop-containers
  • v0.26.0
  • v0.25.0
  • v0.24.0
  • v0.23.0
  • v0.22.0
  • v0.21.0
  • v0.20.0
  • v0.19.0
  • v0.18.0
  • v0.17.0
  • v0.16.0
  • v0.15.0
  • v0.14.0
  • v0.13.0
  • v0.12.0
  • v0.11.0
  • v0.10.0
  • v0.9.0
  • v0.8.0
  • v0.7.0
23 results

debug.go

Blame
  • 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)
    		}
    	}
    
    }