| package config |
| |
| import ( |
| "encoding/json" |
| "sort" |
| "strings" |
| |
| bkconfig "github.com/moby/buildkit/cmd/buildkitd/config" |
| "github.com/moby/moby/v2/daemon/internal/filters" |
| ) |
| |
| // BuilderGCRule represents a GC rule for buildkit cache |
| type BuilderGCRule struct { |
| All bool `json:",omitempty"` |
| Filter BuilderGCFilter |
| ReservedSpace string `json:",omitempty"` |
| MaxUsedSpace string `json:",omitempty"` |
| MinFreeSpace string `json:",omitempty"` |
| } |
| |
| func (x *BuilderGCRule) UnmarshalJSON(data []byte) error { |
| var xx struct { |
| All bool `json:",omitempty"` |
| Filter BuilderGCFilter |
| ReservedSpace string `json:",omitempty"` |
| MaxUsedSpace string `json:",omitempty"` |
| MinFreeSpace string `json:",omitempty"` |
| |
| // Deprecated option is now equivalent to ReservedSpace. |
| KeepStorage string `json:",omitempty"` |
| } |
| if err := json.Unmarshal(data, &xx); err != nil { |
| return err |
| } |
| |
| x.All = xx.All |
| x.Filter = xx.Filter |
| x.ReservedSpace = xx.ReservedSpace |
| x.MaxUsedSpace = xx.MaxUsedSpace |
| x.MinFreeSpace = xx.MinFreeSpace |
| if x.ReservedSpace == "" { |
| x.ReservedSpace = xx.KeepStorage |
| } |
| return nil |
| } |
| |
| // BuilderGCFilter contains garbage-collection filter rules for a BuildKit builder |
| type BuilderGCFilter filters.Args |
| |
| // MarshalJSON returns a JSON byte representation of the BuilderGCFilter |
| func (x *BuilderGCFilter) MarshalJSON() ([]byte, error) { |
| f := filters.Args(*x) |
| keys := f.Keys() |
| sort.Strings(keys) |
| arr := make([]string, 0, len(keys)) |
| for _, k := range keys { |
| values := f.Get(k) |
| for _, v := range values { |
| arr = append(arr, k+"="+v) |
| } |
| } |
| return json.Marshal(arr) |
| } |
| |
| // UnmarshalJSON fills the BuilderGCFilter values structure from JSON input |
| func (x *BuilderGCFilter) UnmarshalJSON(data []byte) error { |
| var arr []string |
| f := filters.NewArgs() |
| if err := json.Unmarshal(data, &arr); err != nil { |
| // backwards compat for deprecated buggy form |
| err := json.Unmarshal(data, &f) |
| *x = BuilderGCFilter(f) |
| return err |
| } |
| for _, s := range arr { |
| name, value, _ := strings.Cut(s, "=") |
| name = strings.ToLower(strings.TrimSpace(name)) |
| value = strings.TrimSpace(value) |
| f.Add(name, value) |
| } |
| *x = BuilderGCFilter(f) |
| return nil |
| } |
| |
| // BuilderGCConfig contains GC config for a buildkit builder |
| type BuilderGCConfig struct { |
| Enabled *bool `json:",omitempty"` |
| Policy []BuilderGCRule `json:",omitempty"` |
| DefaultReservedSpace string `json:",omitempty"` |
| DefaultMaxUsedSpace string `json:",omitempty"` |
| DefaultMinFreeSpace string `json:",omitempty"` |
| } |
| |
| func (x *BuilderGCConfig) IsEnabled() bool { |
| return x.Enabled == nil || *x.Enabled |
| } |
| |
| func (x *BuilderGCConfig) UnmarshalJSON(data []byte) error { |
| var xx struct { |
| Enabled bool `json:",omitempty"` |
| Policy []BuilderGCRule `json:",omitempty"` |
| DefaultReservedSpace string `json:",omitempty"` |
| DefaultMaxUsedSpace string `json:",omitempty"` |
| DefaultMinFreeSpace string `json:",omitempty"` |
| |
| // Deprecated option is now equivalent to DefaultReservedSpace. |
| DefaultKeepStorage string `json:",omitempty"` |
| } |
| |
| // Set defaults. |
| xx.Enabled = true |
| |
| if err := json.Unmarshal(data, &xx); err != nil { |
| return err |
| } |
| |
| x.Enabled = &xx.Enabled |
| x.Policy = xx.Policy |
| x.DefaultReservedSpace = xx.DefaultReservedSpace |
| x.DefaultMaxUsedSpace = xx.DefaultMaxUsedSpace |
| x.DefaultMinFreeSpace = xx.DefaultMinFreeSpace |
| if x.DefaultReservedSpace == "" { |
| x.DefaultReservedSpace = xx.DefaultKeepStorage |
| } |
| return nil |
| } |
| |
| // BuilderHistoryConfig contains history config for a buildkit builder |
| type BuilderHistoryConfig struct { |
| MaxAge bkconfig.Duration |
| MaxEntries int64 `json:",omitempty"` |
| } |
| |
| // BuilderEntitlements contains settings to enable/disable entitlements |
| type BuilderEntitlements struct { |
| NetworkHost *bool `json:"network-host,omitempty"` |
| SecurityInsecure *bool `json:"security-insecure,omitempty"` |
| Device *bool `json:"device,omitempty"` |
| } |
| |
| // BuilderConfig contains config for the builder |
| type BuilderConfig struct { |
| GC BuilderGCConfig |
| Entitlements BuilderEntitlements |
| History *BuilderHistoryConfig `json:",omitempty"` |
| } |