mirror of
https://github.com/foomo/gograpple.git
synced 2026-08-12 20:30:20 +00:00
125 lines
4.1 KiB
Go
125 lines
4.1 KiB
Go
package actions
|
|
|
|
import (
|
|
"github.com/foomo/gograpple"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func init() {
|
|
|
|
rootCmd.PersistentFlags().StringVarP(&flagTag, "tag", "t", "latest", "Specifies the image tag")
|
|
rootCmd.PersistentFlags().StringVarP(&flagDir, "dir", "d", ".", "Specifies working directory")
|
|
rootCmd.PersistentFlags().StringVarP(&flagNamespace, "namespace", "n", "default", "namespace name")
|
|
rootCmd.PersistentFlags().BoolVarP(&flagVerbose, "verbose", "v", false, "Specifies should command output be displayed")
|
|
rootCmd.PersistentFlags().StringVarP(&flagPod, "pod", "p", "", "pod name (default most recent one)")
|
|
rootCmd.PersistentFlags().StringVarP(&flagContainer, "container", "c", "", "container name (default deployment name)")
|
|
patchCmd.Flags().StringVarP(&flagImage, "image", "i", "", "image to be used for patching (default deployment image)")
|
|
patchCmd.Flags().StringArrayVarP(&flagMounts, "mount", "m", []string{}, "host path to be mounted (default none)")
|
|
patchCmd.Flags().BoolVar(&flagRollback, "rollback", false, "rollback deployment to a previous state")
|
|
delveCmd.Flags().StringVar(&flagInput, "input", "", "go file input (default cwd)")
|
|
delveCmd.Flags().BoolVar(&flagCleanup, "cleanup", false, "cleanup delve debug session")
|
|
delveCmd.Flags().BoolVar(&flagContinue, "continue", false, "delve --continue option")
|
|
delveCmd.Flags().Var(flagArgs, "args", "go file args")
|
|
delveCmd.Flags().Var(flagListen, "listen", "delve host:port to listen on")
|
|
delveCmd.Flags().BoolVar(&flagVscode, "vscode", false, "launch a debug configuration in vscode")
|
|
delveCmd.Flags().BoolVar(&flagJSONLog, "json-log", false, "log as json")
|
|
rootCmd.AddCommand(versionCmd, patchCmd, shellCmd, delveCmd)
|
|
}
|
|
|
|
var (
|
|
flagTag string
|
|
flagDir string
|
|
flagVerbose bool
|
|
flagNamespace string
|
|
flagPod string
|
|
flagContainer string
|
|
flagImage string
|
|
flagMounts []string
|
|
flagInput string
|
|
flagArgs = newStringList(" ")
|
|
flagCleanup bool
|
|
flagRollback bool
|
|
flagContinue bool
|
|
flagListen = newHostPort("127.0.0.1", 0)
|
|
flagVscode bool
|
|
flagJSONLog bool
|
|
)
|
|
|
|
var (
|
|
log = logrus.New()
|
|
l *logrus.Entry
|
|
grapple *gograpple.Grapple
|
|
|
|
rootCmd = &cobra.Command{
|
|
Use: "gograpple",
|
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
|
l = newLogger(flagVerbose, flagJSONLog)
|
|
var err error
|
|
err = gograpple.ValidatePath(".", &flagDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
grapple, err = gograpple.NewGrapple(l, flagNamespace, args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return gograpple.ValidatePath(flagDir, &flagInput)
|
|
},
|
|
}
|
|
patchCmd = &cobra.Command{
|
|
Use: "patch [DEPLOYMENT] -c {CONTAINER} -n {NAMESPACE} -i {IMAGE} -t {TAG} -m {MOUNT}",
|
|
Short: "applies a development patch for a deployment",
|
|
Args: cobra.MinimumNArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
if flagRollback {
|
|
return grapple.Rollback()
|
|
}
|
|
mounts, err := gograpple.ValidateMounts(flagDir, flagMounts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return grapple.Patch(flagImage, flagTag, flagContainer, mounts)
|
|
},
|
|
}
|
|
shellCmd = &cobra.Command{
|
|
Use: "shell [DEPLOYMENT] -n {NAMESPACE} -c {CONTAINER}",
|
|
Short: "shell into the dev patched deployment",
|
|
Args: cobra.MinimumNArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return grapple.Shell(flagPod)
|
|
},
|
|
}
|
|
delveCmd = &cobra.Command{
|
|
Use: "delve [DEPLOYMENT] -input {INPUT} -n {NAMESPACE} -c {CONTAINER}",
|
|
Short: "start a headless delve debug server for .go input on a patched deployment",
|
|
Args: cobra.MinimumNArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
if flagCleanup {
|
|
return grapple.Cleanup(flagPod, flagContainer)
|
|
}
|
|
return grapple.Delve(flagPod, flagContainer, flagInput, flagArgs.items, flagListen.Host, flagListen.Port, flagContinue, flagVscode)
|
|
},
|
|
}
|
|
)
|
|
|
|
func Execute() {
|
|
if err := rootCmd.Execute(); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
}
|
|
|
|
func newLogger(verbose, jsonLog bool) *logrus.Entry {
|
|
logger := logrus.New()
|
|
if jsonLog {
|
|
logger.SetFormatter(&logrus.JSONFormatter{
|
|
DisableTimestamp: true,
|
|
})
|
|
}
|
|
if verbose {
|
|
logger.SetLevel(logrus.TraceLevel)
|
|
}
|
|
return logrus.NewEntry(logger)
|
|
}
|