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  }