Skip to content

Commit

Permalink
Add environments value for setting log level
Browse files Browse the repository at this point in the history
  • Loading branch information
whywaita committed Sep 6, 2024
1 parent ed5a0e6 commit 01b521c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
3 changes: 3 additions & 0 deletions server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ Server-side implementation for shoes-lxd-multi
- `LXD_MULTI_MODE`
- Mode (`create` or `pool`)
- default: `create`
- `LXD_MULTI_LOG_LEVEL`
- Log level (`debug`, `info`, `warn`, `error`, `fatal`, `panic`) will set to `log/slog.Level`
- default: `info`

## Note
LXD Server can't use `zfs` in storageclass if use `--privileged`. ref: https://discuss.linuxcontainers.org/t/docker-with-overlay-driver-in-lxd-cluster-not-working/9243
Expand Down
9 changes: 6 additions & 3 deletions server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import (
)

func main() {
slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stderr, nil)))

if err := run(); err != nil {
log.Fatal(err)
}
Expand All @@ -29,11 +27,16 @@ func main() {
func run() error {
ctx := context.Background()

hostConfigs, mapping, periodSec, listenPort, overCommitPercent, poolMode, err := config.Load()
hostConfigs, mapping, periodSec, listenPort, overCommitPercent, poolMode, logLevel, err := config.Load()
if err != nil {
return fmt.Errorf("failed to create server: %w", err)
}

slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{
AddSource: true,
Level: *logLevel,
})))

go serveMetrics(context.Background(), hostConfigs)

// lxd resource cache
Expand Down
28 changes: 20 additions & 8 deletions server/pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"log"
"log/slog"
"os"
"strconv"

Expand All @@ -25,6 +26,8 @@ const (
EnvOverCommit = "LXD_MULTI_OVER_COMMIT_PERCENT"
// EnvMode will set running mode
EnvMode = "LXD_MULTI_MODE"

EnvLogLevel = "LXD_MULTI_LOG_LEVEL"
)

// Mapping is resource mapping
Expand All @@ -35,18 +38,18 @@ type Mapping struct {
}

// Load load config from Environment values
func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uint64, bool, error) {
func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uint64, bool, *slog.Level, error) {
hostConfigs, err := loadHostConfigs()
if err != nil {
return nil, nil, 0, -1, 0, false, fmt.Errorf("failed to load host config: %w", err)
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to load host config: %w", err)
}

envMappingJSON := os.Getenv(EnvLXDResourceTypeMapping)
var m map[myshoespb.ResourceType]Mapping
if envMappingJSON != "" {
m, err = readResourceTypeMapping(envMappingJSON)
if err != nil {
return nil, nil, 0, -1, 0, false, fmt.Errorf("failed to read %s: %w", EnvLXDResourceTypeMapping, err)
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to read %s: %w", EnvLXDResourceTypeMapping, err)
}
}

Expand All @@ -57,7 +60,7 @@ func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uin
} else {
periodSec, err = strconv.ParseInt(envPeriodSec, 10, 64)
if err != nil {
return nil, nil, 0, -1, 0, false, fmt.Errorf("failed to parse %s, need to uint: %w", EnvOverCommit, err)
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to parse %s, need to uint: %w", EnvOverCommit, err)
}
}
log.Printf("periodSec: %d\n", periodSec)
Expand All @@ -69,7 +72,7 @@ func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uin
} else {
port, err = strconv.Atoi(envPort)
if err != nil {
return nil, nil, 0, -1, 0, false, fmt.Errorf("failed to parse %s, need to int: %w", EnvPort, err)
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to parse %s, need to int: %w", EnvPort, err)
}
}

Expand All @@ -80,7 +83,7 @@ func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uin
} else {
overCommitPercent, err = strconv.ParseUint(envOCP, 10, 64)
if err != nil {
return nil, nil, 0, -1, 0, false, fmt.Errorf("failed to parse %s, need to uint: %w", EnvOverCommit, err)
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to parse %s, need to uint: %w", EnvOverCommit, err)
}
}
log.Printf("overCommitPercent: %d\n", overCommitPercent)
Expand All @@ -92,10 +95,19 @@ func Load() (*HostConfigMap, map[myshoespb.ResourceType]Mapping, int64, int, uin
case "pool":
poolMode = true
default:
return nil, nil, 0, -1, 0, false, fmt.Errorf(`unknown mode %q (expected "create" or "pool")`, os.Getenv(EnvMode))
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf(`unknown mode %q (expected "create" or "pool")`, os.Getenv(EnvMode))
}

var inLogLevel string
var level slog.Level
if os.Getenv(EnvLogLevel) == "" {
inLogLevel = "INFO"
}
if err := level.UnmarshalText([]byte(inLogLevel)); err != nil {
return nil, nil, 0, -1, 0, false, nil, fmt.Errorf("failed to parse log level (%s): %w", inLogLevel, err)
}

return hostConfigs, m, periodSec, port, overCommitPercent, poolMode, nil
return hostConfigs, m, periodSec, port, overCommitPercent, poolMode, &level, nil
}

func readResourceTypeMapping(env string) (map[myshoespb.ResourceType]Mapping, error) {
Expand Down

0 comments on commit 01b521c

Please sign in to comment.