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  }