Manually read verbosity before kubectl command construction

kubectl command construction is slowly getting more functionality which
sometimes requires to log certain actions. Currently we parse the
verbosity only when actually running the command, so all of construction
code is not able to use -v=5. This commit adds the manual parsing and
loglevel setting berore we even start creating the kubectl command.

Signed-off-by: Maciej Szulik <soltysh@gmail.com>
This commit is contained in:
Maciej Szulik
2025-05-08 13:29:11 +02:00
parent 7cb2bd78b2
commit 69682b75e5
2 changed files with 36 additions and 0 deletions

View File

@@ -17,7 +17,10 @@ limitations under the License.
package main
import (
"os"
"k8s.io/component-base/cli"
"k8s.io/component-base/logs"
"k8s.io/kubectl/pkg/cmd"
"k8s.io/kubectl/pkg/cmd/util"
@@ -26,6 +29,13 @@ import (
)
func main() {
// We need to manually parse the arguments looking for verbosity flag and
// set appropriate level here, because in the normal flow the flag parsing,
// including the logging verbosity, happens inside cli.RunNoErrOutput.
// Doing it here ensures we can continue using klog during kubectl command
// construction, which includes handling plugins and parsing .kuberc file,
// for example.
logs.GlogSetter(cmd.GetLogVerbosity(os.Args)) // nolint:errcheck
command := cmd.NewDefaultKubectlCommand()
if err := cli.RunNoErrOutput(command); err != nil {
// Pretty-print the error and exit with an error.

View File

@@ -583,3 +583,29 @@ func registerCompletionFuncForGlobalFlags(cmd *cobra.Command, f cmdutil.Factory)
return utilcomp.ListUsersInConfig(toComplete), cobra.ShellCompDirectiveNoFileComp
}))
}
// GetLogVerbosity parses the provided command-line arguments to determine
// the verbosity level for logging. Returns string representing the verbosity
// level, or 0 if no verbosity flag is specified.
func GetLogVerbosity(args []string) string {
for i, arg := range args {
if arg == "--" {
// flags after "--" does not represent any flag of
// the command. We should short cut the iteration in here.
break
}
if arg == "--v" || arg == "-v" {
if i+1 < len(args) {
return args[i+1]
}
} else if strings.Contains(arg, "--v=") || strings.Contains(arg, "-v=") {
parg := strings.Split(arg, "=")
if len(parg) > 1 && parg[1] != "" {
return parg[1]
}
}
}
return "0"
}