github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/engine/configs/configs_controller.go (about) 1 package configs 2 3 import ( 4 "context" 5 6 apierrors "k8s.io/apimachinery/pkg/api/errors" 7 ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" 8 9 "github.com/tilt-dev/tilt/internal/controllers/apis/tiltfile" 10 "github.com/tilt-dev/tilt/internal/controllers/apis/uibutton" 11 "github.com/tilt-dev/tilt/internal/store" 12 "github.com/tilt-dev/tilt/pkg/model" 13 ) 14 15 type ConfigsController struct { 16 ctrlClient ctrlclient.Client 17 isInitialTiltfileCreated bool 18 } 19 20 func NewConfigsController(ctrlClient ctrlclient.Client) *ConfigsController { 21 return &ConfigsController{ 22 ctrlClient: ctrlClient, 23 } 24 } 25 26 func (cc *ConfigsController) OnChange(ctx context.Context, st store.RStore, summary store.ChangeSummary) error { 27 if summary.IsLogOnly() { 28 return nil 29 } 30 31 if !cc.isInitialTiltfileCreated { 32 err := cc.maybeCreateInitialTiltfile(ctx, st) 33 if err != nil { 34 return err 35 } 36 } 37 38 return nil 39 } 40 41 // Register the tiltfile with the APIServer, then dispatch an action to also copy it into the EngineState. 42 func (cc *ConfigsController) maybeCreateInitialTiltfile(ctx context.Context, st store.RStore) error { 43 state := st.RLockState() 44 desired := state.DesiredTiltfilePath 45 ucs := state.UserConfigState 46 st.RUnlockState() 47 48 err := cc.ctrlClient.Create(ctx, tiltfile.MainTiltfile(desired, ucs.Args)) 49 if err != nil && !apierrors.IsAlreadyExists(err) { 50 return err 51 } 52 err = cc.ctrlClient.Create(ctx, uibutton.StopBuildButton(model.MainTiltfileManifestName.String())) 53 if err != nil && !apierrors.IsAlreadyExists(err) { 54 return err 55 } 56 57 cc.isInitialTiltfileCreated = true 58 return nil 59 }