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 }