github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/noconfig.go (about)

     1  package render
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/go-kit/kit/log"
     8  	"github.com/go-kit/kit/log/level"
     9  	"github.com/mitchellh/cli"
    10  	"github.com/pkg/errors"
    11  	"github.com/spf13/afero"
    12  	"github.com/spf13/viper"
    13  	"go.uber.org/dig"
    14  
    15  	"github.com/replicatedhq/ship/pkg/api"
    16  	"github.com/replicatedhq/ship/pkg/constants"
    17  	"github.com/replicatedhq/ship/pkg/lifecycle"
    18  	"github.com/replicatedhq/ship/pkg/lifecycle/daemon/daemontypes"
    19  	"github.com/replicatedhq/ship/pkg/lifecycle/render/planner"
    20  	"github.com/replicatedhq/ship/pkg/state"
    21  	"github.com/replicatedhq/ship/pkg/util"
    22  )
    23  
    24  func NoConfigRenderer(render noconfigrenderer) lifecycle.Renderer {
    25  	return &render
    26  }
    27  
    28  // noconfigrenderer is the navcycle version of
    29  // render, that assumes that config has already happened
    30  type noconfigrenderer struct {
    31  	dig.In
    32  	Logger         log.Logger
    33  	Planner        planner.Planner
    34  	StateManager   state.Manager
    35  	Fs             afero.Afero
    36  	UI             cli.Ui
    37  	StatusReceiver daemontypes.StatusReceiver
    38  	Viper          *viper.Viper
    39  	Now            func() time.Time
    40  }
    41  
    42  func (r *noconfigrenderer) Execute(ctx context.Context, release *api.Release, step *api.Render) error {
    43  	defer r.StatusReceiver.ClearProgress()
    44  
    45  	debug := level.Debug(log.With(r.Logger, "step.type", "render"))
    46  	debug.Log("event", "step.execute")
    47  
    48  	r.StatusReceiver.SetProgress(ProgressRead)
    49  	debug.Log("event", "try.load")
    50  	previousState, err := r.StateManager.CachedState()
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	templateContext, err := previousState.CurrentConfig()
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	r.StatusReceiver.SetProgress(ProgressRender)
    61  
    62  	// this should probably happen even higher up, like to the validation stage where we assign IDs to lifecycle steps, but moving it up here for now
    63  	if step.Root == "" {
    64  		step.Root = constants.InstallerPrefixPath
    65  	}
    66  
    67  	assets := release.Spec.Assets.V1
    68  	if step.Assets != nil && step.Assets.V1 != nil {
    69  		assets = step.Assets.V1
    70  	}
    71  
    72  	debug.Log("event", "render.plan")
    73  	pln, dests, err := r.Planner.Build(step.Root, assets, release.Spec.Config.V1, release.Metadata, templateContext)
    74  	if err != nil {
    75  		return errors.Wrap(err, "build plan")
    76  	}
    77  
    78  	debug.Log("event", "clean.start")
    79  	// cleanup dests
    80  	err = removeDests(&r.Fs, dests)
    81  	if err != nil {
    82  		return errors.Wrap(err, "clean destination")
    83  	}
    84  
    85  	debug.Log("event", "backup.start")
    86  
    87  	if step.Root != "." && step.Root != "./" {
    88  		if r.Viper.GetBool("rm-asset-dest") {
    89  			err := r.Fs.RemoveAll(step.Root)
    90  			if err != nil {
    91  				return errors.Wrapf(err, "remove asset dest %s", step.Root)
    92  			}
    93  		}
    94  
    95  		err = util.BailIfPresent(r.Fs, step.Root, r.Logger)
    96  		if err != nil {
    97  			return errors.Wrapf(err, "check for existing install directory %s", step.Root)
    98  		}
    99  	}
   100  
   101  	debug.Log("event", "execute.plan")
   102  	err = r.Planner.Execute(ctx, pln)
   103  	if err != nil {
   104  		return errors.Wrap(err, "execute plan")
   105  	}
   106  	return nil
   107  }
   108  
   109  func (r *noconfigrenderer) WithStatusReceiver(receiver daemontypes.StatusReceiver) lifecycle.Renderer {
   110  	return &noconfigrenderer{
   111  		Viper:          r.Viper,
   112  		Logger:         r.Logger,
   113  		Planner:        r.Planner,
   114  		StateManager:   r.StateManager,
   115  		Fs:             r.Fs,
   116  		UI:             r.UI,
   117  		StatusReceiver: receiver,
   118  		Now:            r.Now,
   119  	}
   120  }
   121  
   122  func (r *noconfigrenderer) WithPlanner(planner planner.Planner) lifecycle.Renderer {
   123  	return &noconfigrenderer{
   124  		Viper:          r.Viper,
   125  		Logger:         r.Logger,
   126  		Planner:        planner,
   127  		StateManager:   r.StateManager,
   128  		Fs:             r.Fs,
   129  		UI:             r.UI,
   130  		StatusReceiver: r.StatusReceiver,
   131  		Now:            r.Now,
   132  	}
   133  }