github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/dockerprune/docker_prune.go (about) 1 package dockerprune 2 3 import ( 4 "fmt" 5 "time" 6 7 "go.starlark.net/starlark" 8 9 "github.com/tilt-dev/tilt/pkg/model" 10 11 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 12 ) 13 14 // Implements functions for dealing with Docker Prune settings. 15 type Plugin struct { 16 } 17 18 func NewPlugin() Plugin { 19 return Plugin{} 20 } 21 22 func (e Plugin) NewState() interface{} { 23 return model.DockerPruneSettings{ 24 Enabled: true, 25 MaxAge: model.DockerPruneDefaultMaxAge, 26 Interval: model.DockerPruneDefaultInterval, 27 KeepRecent: model.DockerPruneDefaultKeepRecent, 28 } 29 } 30 31 func (e Plugin) OnStart(env *starkit.Environment) error { 32 return env.AddBuiltin("docker_prune_settings", e.dockerPruneSettings) 33 } 34 35 func (e Plugin) dockerPruneSettings(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 36 var disable bool 37 var keepRecent starlark.Value 38 var intervalHrs, numBuilds, maxAgeMins int 39 if err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs, 40 "disable?", &disable, 41 "max_age_mins?", &maxAgeMins, 42 "num_builds?", &numBuilds, 43 "interval_hrs?", &intervalHrs, 44 "keep_recent?", &keepRecent); err != nil { 45 return nil, err 46 } 47 48 if numBuilds != 0 && intervalHrs != 0 { 49 return nil, fmt.Errorf("can't specify both 'prune every X builds' and 'prune every Y hours'; please pass " + 50 "only one of `num_builds` and `interval_hrs`") 51 } 52 53 err := starkit.SetState(thread, func(settings model.DockerPruneSettings) (model.DockerPruneSettings, error) { 54 settings.Enabled = !disable 55 if maxAgeMins != 0 { 56 settings.MaxAge = time.Duration(maxAgeMins) * time.Minute 57 } 58 settings.NumBuilds = numBuilds 59 if intervalHrs != 0 { 60 settings.Interval = time.Duration(intervalHrs) * time.Hour 61 } 62 if keepRecent != nil { 63 recent, err := starlark.AsInt32(keepRecent) 64 if err != nil { 65 return settings, err 66 } 67 settings.KeepRecent = recent 68 } 69 return settings, nil 70 }) 71 72 return starlark.None, err 73 } 74 75 var _ starkit.StatefulPlugin = Plugin{} 76 77 func MustState(model starkit.Model) model.DockerPruneSettings { 78 state, err := GetState(model) 79 if err != nil { 80 panic(err) 81 } 82 return state 83 } 84 85 func GetState(m starkit.Model) (model.DockerPruneSettings, error) { 86 var state model.DockerPruneSettings 87 err := m.Load(&state) 88 return state, err 89 }