github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/store/liveupdates/update_mode.go (about)

     1  package liveupdates
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/tilt-dev/tilt/internal/docker"
     7  	"github.com/tilt-dev/tilt/internal/k8s"
     8  )
     9  
    10  type UpdateMode string
    11  
    12  // A type to bind to flag values that need validation.
    13  type UpdateModeFlag UpdateMode
    14  
    15  var (
    16  	// Auto-pick the build mode based on
    17  	UpdateModeAuto UpdateMode = "auto"
    18  
    19  	// Only do image builds
    20  	UpdateModeImage UpdateMode = "image"
    21  
    22  	// Update containers in-place. This mode only works with DockerForDesktop and Minikube.
    23  	// If you try to use this mode with a different K8s cluster type, we will return an error
    24  	UpdateModeContainer UpdateMode = "container"
    25  
    26  	// Use `kubectl exec`
    27  	UpdateModeKubectlExec UpdateMode = "exec"
    28  )
    29  
    30  var AllUpdateModes = []UpdateMode{
    31  	UpdateModeAuto,
    32  	UpdateModeImage,
    33  	UpdateModeContainer,
    34  	UpdateModeKubectlExec,
    35  }
    36  
    37  func ProvideUpdateMode(flag UpdateModeFlag, kubeContext k8s.KubeContext, env docker.ClusterEnv) (UpdateMode, error) {
    38  	valid := false
    39  	for _, mode := range AllUpdateModes {
    40  		if mode == UpdateMode(flag) {
    41  			valid = true
    42  		}
    43  	}
    44  
    45  	if !valid {
    46  		return "", fmt.Errorf("unknown update mode %q. Valid Values: %v", flag, AllUpdateModes)
    47  	}
    48  
    49  	mode := UpdateMode(flag)
    50  	if mode == UpdateModeContainer {
    51  		if !docker.Env(env).WillBuildToKubeContext(kubeContext) {
    52  			return "", fmt.Errorf("update mode %q is only valid with local Docker clusters like Docker For Mac or Minikube", flag)
    53  		}
    54  	}
    55  
    56  	return mode, nil
    57  }