github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/local_resource.go (about) 1 package tiltfile 2 3 import ( 4 "fmt" 5 "path/filepath" 6 7 "github.com/pkg/errors" 8 "go.starlark.net/starlark" 9 10 "github.com/tilt-dev/tilt/internal/tiltfile/links" 11 "github.com/tilt-dev/tilt/internal/tiltfile/probe" 12 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 13 "github.com/tilt-dev/tilt/internal/tiltfile/value" 14 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 15 "github.com/tilt-dev/tilt/pkg/logger" 16 "github.com/tilt-dev/tilt/pkg/model" 17 ) 18 19 const testDeprecationMsg = "test() is deprecated and will be removed in a future release.\n" + 20 "Change this call to use `local_resource(..., allow_parallel=True)`" 21 22 type localResource struct { 23 name string 24 updateCmd model.Cmd 25 serveCmd model.Cmd 26 // The working directory of the execution thread where the local resource was created. 27 threadDir string 28 deps []string 29 triggerMode triggerMode 30 autoInit bool 31 resourceDeps []string 32 ignores []string 33 allowParallel bool 34 links []model.Link 35 labels map[string]string 36 37 readinessProbe *v1alpha1.Probe 38 } 39 40 func (s *tiltfileState) localResource(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 41 var name value.Name 42 var updateCmdVal, updateCmdBatVal, serveCmdVal, serveCmdBatVal starlark.Value 43 var updateEnv, serveEnv value.StringStringMap 44 var triggerMode triggerMode 45 var readinessProbe probe.Probe 46 var updateCmdDirVal, serveCmdDirVal starlark.Value 47 48 deps := value.NewLocalPathListUnpacker(thread) 49 50 var resourceDepsVal starlark.Sequence 51 var ignoresVal starlark.Value 52 var allowParallel bool 53 var links links.LinkList 54 var labels value.LabelSet 55 autoInit := true 56 if fn.Name() == testN { 57 // If we're initializing a test, by default parallelism is on 58 allowParallel = true 59 logger.Get(s.ctx).Warnf("%s", testDeprecationMsg) 60 } 61 62 if err := s.unpackArgs(fn.Name(), args, kwargs, 63 "name", &name, 64 "cmd?", &updateCmdVal, 65 "deps?", &deps, 66 "trigger_mode?", &triggerMode, 67 "resource_deps?", &resourceDepsVal, 68 "ignore?", &ignoresVal, 69 "auto_init?", &autoInit, 70 "serve_cmd?", &serveCmdVal, 71 "cmd_bat?", &updateCmdBatVal, 72 "serve_cmd_bat?", &serveCmdBatVal, 73 "allow_parallel?", &allowParallel, 74 "links?", &links, 75 "labels?", &labels, 76 "env?", &updateEnv, 77 "serve_env?", &serveEnv, 78 "readiness_probe?", &readinessProbe, 79 "dir?", &updateCmdDirVal, 80 "serve_dir?", &serveCmdDirVal, 81 ); err != nil { 82 return nil, err 83 } 84 85 resourceDeps, err := value.SequenceToStringSlice(resourceDepsVal) 86 if err != nil { 87 return nil, errors.Wrapf(err, "%s: resource_deps", fn.Name()) 88 } 89 90 ignores, err := parseValuesToStrings(ignoresVal, "ignore") 91 if err != nil { 92 return nil, err 93 } 94 95 updateCmd, err := value.ValueGroupToCmdHelper(thread, updateCmdVal, updateCmdBatVal, updateCmdDirVal, updateEnv) 96 if err != nil { 97 return nil, err 98 } 99 serveCmd, err := value.ValueGroupToCmdHelper(thread, serveCmdVal, serveCmdBatVal, serveCmdDirVal, serveEnv) 100 if err != nil { 101 return nil, err 102 } 103 104 if updateCmd.Empty() && serveCmd.Empty() { 105 return nil, fmt.Errorf("local_resource must have a cmd and/or a serve_cmd, but both were empty") 106 } 107 108 probeSpec := readinessProbe.Spec() 109 if probeSpec != nil && serveCmd.Empty() { 110 s.logger.Warnf("Ignoring readiness probe for local resource %q (no serve_cmd was defined)", name) 111 probeSpec = nil 112 } 113 114 res := &localResource{ 115 name: string(name), 116 updateCmd: updateCmd, 117 serveCmd: serveCmd, 118 threadDir: filepath.Dir(starkit.CurrentExecPath(thread)), 119 deps: deps.Value, 120 triggerMode: triggerMode, 121 autoInit: autoInit, 122 resourceDeps: resourceDeps, 123 ignores: ignores, 124 allowParallel: allowParallel, 125 links: links.Links, 126 labels: labels.Values, 127 readinessProbe: probeSpec, 128 } 129 130 // check for duplicate resources by name and throw error if found 131 err = s.checkResourceConflict(res.name) 132 if err != nil { 133 return nil, err 134 } 135 s.localResources = append(s.localResources, res) 136 s.localByName[res.name] = res 137 138 return starlark.None, nil 139 }