openbao-monitor: align the log levels with helm chart

The helm chart uses numeric values representing the following log
levels: DEBUG, INFO, WARNING, ERROR and FATAL

Update the validation to accept numeric levels, and interpet 5 (FATAL)
as ERROR.

Test Plan:
PASS  test valid/invalid loglevels, numeric bounds

Change-Id: Ifbebe30e487f30ba11ada398056252e80a07ba94
Signed-off-by: Michel Thebeau <Michel.Thebeau@windriver.com>
This commit is contained in:
michel-thebeau-WR
2025-08-07 21:04:52 +00:00
committed by Michel Thebeau
parent 6244fc7974
commit bc138e563c
3 changed files with 58 additions and 10 deletions

View File

@@ -60,11 +60,7 @@ func setupCmd(cmd *cobra.Command, args []string) error {
// Set default configuration for logs if no custum configs are given // Set default configuration for logs if no custum configs are given
logFile := globalConfig.LogPath logFile := globalConfig.LogPath
logLevel := globalConfig.LogLevel logLevel := globalConfig.InterpretLogLevel()
if logLevel == "" {
// Default log level if no log level was set
logLevel = "INFO"
}
// Set default to stderr if no log file was specified. // Set default to stderr if no log file was specified.
logWriter = os.Stderr logWriter = os.Stderr

View File

@@ -65,6 +65,7 @@ type MonitorConfig struct {
// The default log level // The default log level
// Available log levels: DEBUG, INFO, WARN and ERROR // Available log levels: DEBUG, INFO, WARN and ERROR
// Accepts numeric values matching helm chart log levels (4-5 are interpreted as ERROR)
LogLevel string `yaml:"logLevel"` LogLevel string `yaml:"logLevel"`
// The time in seconds waited between each unseal check in the run command. // The time in seconds waited between each unseal check in the run command.
@@ -295,3 +296,26 @@ func (configInstance *MonitorConfig) ParseInitResponse(dnshost string, responce
slog.Debug("Parsing init response complete") slog.Debug("Parsing init response complete")
return nil return nil
} }
// Interpret numeric or text log level
// Always returns a log level in string format
func (configInstance *MonitorConfig) InterpretLogLevel() string {
// Check if the log level is a number
if converted, err := strconv.Atoi(configInstance.LogLevel); err == nil {
if level, exists := availableLogLevels[converted]; exists {
return level
}
// error, but this code should not be reached if validateLogConfig works
fmt.Errorf("the numeric LogLevel %v is not a valid log level", configInstance.LogLevel)
return "INFO" // Default to INFO if the numeric level is invalid
}
// Default to INFO if no log level was set
if configInstance.LogLevel == "" {
return "INFO"
}
// validateLogConfig already validated the LogLevel
return configInstance.LogLevel
}

View File

@@ -6,9 +6,18 @@ import (
"os" "os"
"path" "path"
"regexp" "regexp"
"slices" "strconv"
) )
// Available log levels; these should match the levels available in helm chart
var availableLogLevels = map[int]string{
1: "DEBUG",
2: "INFO",
3: "WARN",
4: "ERROR",
5: "ERROR",
}
func (configInstance MonitorConfig) validateDNS() error { func (configInstance MonitorConfig) validateDNS() error {
for domain_name, url := range configInstance.ServerAddresses { for domain_name, url := range configInstance.ServerAddresses {
// If Host is empty, then the domain entry is invalid // If Host is empty, then the domain entry is invalid
@@ -63,6 +72,8 @@ func (configInstance MonitorConfig) validateKeyShards() error {
} }
func (configInstance MonitorConfig) validateLogConfig() error { func (configInstance MonitorConfig) validateLogConfig() error {
var found bool = false
if configInstance.LogPath != "" { if configInstance.LogPath != "" {
_, err := os.Stat(path.Dir(configInstance.LogPath)) _, err := os.Stat(path.Dir(configInstance.LogPath))
if err != nil { if err != nil {
@@ -71,10 +82,27 @@ func (configInstance MonitorConfig) validateLogConfig() error {
} }
} }
if configInstance.LogLevel != "" { if configInstance.LogLevel != "" {
availableLogLevels := []string{"DEBUG", "INFO", "WARN", "ERROR"} if converted, err := strconv.Atoi(configInstance.LogLevel); err == nil {
if !slices.Contains(availableLogLevels, configInstance.LogLevel) { // convert the numeric log level to string
return fmt.Errorf( if _, exists := availableLogLevels[converted]; exists {
"the listed LogLevel %v is not a valid log level", configInstance.LogLevel) // pass, Accept the numeric LogLevel
} else {
return fmt.Errorf(
"the numeric LogLevel %v is not a valid log level", configInstance.LogLevel)
}
} else {
// Check if the LogLevel is one of the available log levels
for _, value := range availableLogLevels {
if value == configInstance.LogLevel {
// Accept LogLevel
found = true
break
}
}
if !found {
return fmt.Errorf(
"the listed LogLevel %v is not a valid log level", configInstance.LogLevel)
}
} }
} }