| package local | |
| import ( | |
| "fmt" | |
| "strconv" | |
| "github.com/docker/go-units" | |
| "github.com/pkg/errors" | |
| ) | |
| // CreateConfig is used to configure new instances of driver | |
| type CreateConfig struct { | |
| DisableCompression bool | |
| MaxFileSize int64 | |
| MaxFileCount int | |
| } | |
| func newConfig(opts map[string]string) (*CreateConfig, error) { | |
| cfg := &CreateConfig{ | |
| MaxFileSize: defaultMaxFileSize, | |
| MaxFileCount: defaultMaxFileCount, | |
| DisableCompression: !defaultCompressLogs, | |
| } | |
| if v, ok := opts["max-size"]; ok { | |
| maxSize, err := units.FromHumanSize(v) | |
| if err != nil { | |
| return nil, fmt.Errorf("invalid value for max-size: %s: %w", v, err) | |
| } | |
| cfg.MaxFileSize = maxSize | |
| } | |
| if v, ok := opts["max-file"]; ok { | |
| maxFile, err := strconv.Atoi(v) | |
| if err != nil { | |
| return nil, fmt.Errorf("invalid value for max-file: %s: %w", v, err) | |
| } | |
| cfg.MaxFileCount = maxFile | |
| } | |
| if v, ok := opts["compress"]; ok { | |
| compressLogs, err := strconv.ParseBool(v) | |
| if err != nil { | |
| return nil, fmt.Errorf("invalid boolean value for compress: %w", err) | |
| } | |
| cfg.DisableCompression = !compressLogs | |
| } | |
| if err := validateConfig(cfg); err != nil { | |
| return nil, err | |
| } | |
| return cfg, nil | |
| } | |
| func validateConfig(cfg *CreateConfig) error { | |
| if cfg.MaxFileSize < 0 { | |
| return errors.New("max-size must not be negative") | |
| } | |
| if cfg.MaxFileCount < 0 { | |
| return errors.New("max-file must not be negative") | |
| } | |
| if !cfg.DisableCompression && cfg.MaxFileCount <= 1 { | |
| // compression is applied to rotated files, so doesn't apply if rotation is not used. | |
| return errors.New("compression cannot be enabled when max file count is 1") | |
| } | |
| return nil | |
| } |