Skip to content

Commit

Permalink
feat: Allow quiet operation in KanX; fixup logging. (#3343)
Browse files Browse the repository at this point in the history
Signed-off-by: Aaron Alpar <[email protected]>
  • Loading branch information
aaron-kasten authored Jan 27, 2025
1 parent c50897b commit 3fb7f42
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 26 deletions.
20 changes: 15 additions & 5 deletions pkg/kando/kando.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
package kando

import (
"fmt"
"os"

"github.com/kanisterio/errkit"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"google.golang.org/grpc/grpclog"

"github.com/kanisterio/kanister/pkg/log"
"github.com/kanisterio/kanister/pkg/version"
Expand All @@ -46,8 +48,13 @@ func newRootCommand() *cobra.Command {
}

rootCmd.PersistentFlags().StringVarP(&logLevel, "verbosity", "v", logrus.WarnLevel.String(), "Log level (debug, info, warn, error, fatal, panic)")
rootCmd.PersistentPreRunE = func(*cobra.Command, []string) error {
return setLogLevel(logLevel)
rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
err := setLogLevel(logLevel)
if err != nil {
return err
}
grpclog.SetLoggerV2(grpclogLogger(cmd))
return nil
}

rootCmd.AddCommand(newLocationCommand())
Expand All @@ -59,10 +66,13 @@ func newRootCommand() *cobra.Command {
}

func setLogLevel(v string) error {
l, err := logrus.ParseLevel(v)
lgl, err := logrus.ParseLevel(v)
if err != nil {
return errkit.Wrap(err, "Invalid log level: "+v)
return errkit.Wrap(err, fmt.Sprintf("Invalid log level: %s", v))
}
logrus.SetLevel(l)
// set application logger log level. (kanister/log/log.go)
log.SetLevel(log.Level(lgl))
// set "std" logrus logger. GRPC uses this (logrus/exported)
logrus.SetLevel(lgl)
return nil
}
10 changes: 10 additions & 0 deletions pkg/kando/process_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
const (
processSignalProxyFlagName = "signal-proxy"
processAsJSONFlagName = "as-json"
processAsQuietFlagName = "quiet"
)

func newProcessClientCommand() *cobra.Command {
Expand All @@ -45,6 +46,7 @@ func newProcessClientCommand() *cobra.Command {
cmd.AddCommand(newProcessClientSignalCommand())
cmd.AddCommand(newProcessClientOutputCommand())
cmd.PersistentFlags().BoolP(processAsJSONFlagName, "j", false, "Display output as json")
cmd.PersistentFlags().BoolP(processAsQuietFlagName, "q", false, "Quiet process information output")
return cmd
}

Expand All @@ -56,6 +58,14 @@ func processAsJSONFlagValue(cmd *cobra.Command) bool {
return b
}

func processAsQuietFlagValue(cmd *cobra.Command) bool {
b, err := cmd.Flags().GetBool(processAsQuietFlagName)
if err != nil {
panic(err.Error())
}
return b
}

func proxySetup(ctx context.Context, addr string, pid int64) {
log.Info().WithContext(ctx).Print(fmt.Sprintf("signal proxy is running for process %d", pid))
signalTermChan := make(chan os.Signal, 1)
Expand Down
4 changes: 4 additions & 0 deletions pkg/kando/process_client_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,15 @@ func runProcessClientCreateWithOutput(out io.Writer, cmd *cobra.Command, args []
return err
}
asJSON := processAsJSONFlagValue(cmd)
asQuiet := processAsQuietFlagValue(cmd)
cmd.SilenceUsage = true
p, err := kanx.CreateProcess(cmd.Context(), addr, args[0], args[1:])
if err != nil {
return err
}
if asQuiet {
return nil
}
if asJSON {
buf, err := protojson.Marshal(p)
if err != nil {
Expand Down
17 changes: 10 additions & 7 deletions pkg/kando/process_client_execute.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,21 +51,24 @@ func runProcessClientExecuteWithOutput(stdout, stderr io.Writer, cmd *cobra.Comm
return err
}
asJSON := processAsJSONFlagValue(cmd)
asQuiet := processAsQuietFlagValue(cmd)
cmd.SilenceUsage = true
ctx, canfn := context.WithCancel(cmd.Context())
defer canfn()
p, err := kanx.CreateProcess(ctx, addr, args[0], args[1:])
if err != nil {
return err
}
if asJSON {
buf, err := protojson.Marshal(p)
if err != nil {
return err
if !asQuiet {
if asJSON {
buf, err := protojson.Marshal(p)
if err != nil {
return err
}
fmt.Fprintln(stdout, string(buf))
} else {
fmt.Fprintln(stdout, "Process: ", p)
}
fmt.Fprintln(stdout, string(buf))
} else {
fmt.Fprintln(stdout, "Process: ", p)
}

pid := p.Pid
Expand Down
8 changes: 6 additions & 2 deletions pkg/kando/process_client_get.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,24 @@ func runProcessClientGet(cmd *cobra.Command, args []string) error {
}

func runProcessClientGetWithOutput(out io.Writer, cmd *cobra.Command, args []string) error {
pid, err := strconv.Atoi(args[0])
pid, err := strconv.ParseInt(args[0], 0, 64)
if err != nil {
return err
}
addr, err := processAddressFlagValue(cmd)
if err != nil {
return err
}
asQuiet := processAsQuietFlagValue(cmd)
asJSON := processAsJSONFlagValue(cmd)
cmd.SilenceUsage = true
p, err := kanx.GetProcess(cmd.Context(), addr, int64(pid))
p, err := kanx.GetProcess(cmd.Context(), addr, pid)
if err != nil {
return err
}
if asQuiet {
return nil
}
if asJSON {
buf, err := protojson.Marshal(p)
if err != nil {
Expand Down
4 changes: 4 additions & 0 deletions pkg/kando/process_client_signal.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,16 @@ func runProcessClientSignalWithOutput(out io.Writer, cmd *cobra.Command, args []
if err != nil {
return err
}
asQuiet := processAsQuietFlagValue(cmd)
asJSON := processAsJSONFlagValue(cmd)
cmd.SilenceUsage = true
p, err := kanx.SignalProcess(cmd.Context(), addr, pid, signal)
if err != nil {
return err
}
if asQuiet {
return nil
}
if asJSON {
buf, err := protojson.Marshal(p)
if err != nil {
Expand Down
12 changes: 1 addition & 11 deletions pkg/kopia/command/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,19 +64,9 @@ func bashCommand(args logsafe.Cmd) []string {
return []string{"bash", "-o", "errexit", "-c", args.PlainText()}
}

func bashCommandAsLogSafe(args logsafe.Cmd) logsafe.Cmd {
log.Info().Print("Kopia Command", field.M{"Command": args.String()})
return logsafe.NewLoggable("bash", "-o", "errexit", "-c").Combine(args)
}

func kanxCommand(args logsafe.Cmd) []string {
log.Info().Print("Kopia Command", field.M{"Command": args.String()})
return append([]string{"kando", "process", "client", "execute", "--signal-proxy", "--as-json", "--"}, args.StringSliceCMD()...)
}

func MakeKanxCommand(args []string) []string {
log.Info().Print("KanX Command", field.M{"Command": args})
return append([]string{"kando", "process", "client", "execute", "--signal-proxy", "--as-json", "--"}, args...)
return append([]string{"kando", "process", "client", "execute", "--signal-proxy", "--quiet", "--"}, args...)
}

func stringSliceCommand(args logsafe.Cmd) []string {
Expand Down
2 changes: 1 addition & 1 deletion pkg/kopia/command/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func ServerStart(cmdArgs ServerStartCommandArgs) []string {

// ServerStartKanx returns the kopia command for starting the Kopia API Server
func ServerStartKanx(cmdArgs ServerStartCommandArgs) []string {
return kanxCommand(bashCommandAsLogSafe(commonCommand(cmdArgs)))
return MakeKanxCommand(ServerStart(cmdArgs))
}

type ServerRefreshCommandArgs struct {
Expand Down
35 changes: 35 additions & 0 deletions pkg/kopia/maintenance/get_maintenance_owner.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,41 @@ func GetMaintenanceOwnerForConnectedRepository(
return parseOwner(stdout.Bytes())
}

// GetMaintenanceOwnerForConnectedRepositoryKanx executes maintenance info command,
// and returns maintenance owner.
func GetMaintenanceOwnerForConnectedRepositoryKanx(
ctx context.Context,
podController kube.PodController,
configFilePath,
logDirectory string,
) (string, error) {
pod := podController.Pod()
container := pod.Spec.Containers[0].Name
commandExecutor, err := podController.GetCommandExecutor()
if err != nil {
return "", err
}

args := command.MaintenanceInfoCommandArgs{
CommandArgs: &command.CommandArgs{
ConfigFilePath: configFilePath,
LogDirectory: logDirectory,
},
GetJSONOutput: true,
}
cmd := command.MaintenanceInfo(args)

var stdout, stderr bytes.Buffer
err = commandExecutor.Exec(ctx, command.MakeKanxCommand(cmd), nil, &stdout, &stderr)
format.LogWithCtx(ctx, pod.Name, container, stdout.String())
format.LogWithCtx(ctx, pod.Name, container, stderr.String())
if err != nil {
return "", err
}

return parseOwner(stdout.Bytes())
}

func parseOwner(output []byte) (string, error) {
maintInfo := kopiacli.MaintenanceInfo{}
if err := json.Unmarshal(output, &maintInfo); err != nil {
Expand Down

0 comments on commit 3fb7f42

Please sign in to comment.