github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/terraform/tfplan/daemonless.go (about) 1 package tfplan 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/replicatedhq/ship/pkg/api" 10 "github.com/replicatedhq/ship/pkg/lifecycle/daemon/daemontypes" 11 ) 12 13 type DaemonlessPlanner struct { 14 Logger log.Logger 15 Status daemontypes.StatusReceiver 16 } 17 18 func NewDaemonlessPlanner( 19 logger log.Logger, 20 ) PlanConfirmer { 21 return &DaemonlessPlanner{ 22 Logger: logger, 23 } 24 } 25 26 func (d *DaemonlessPlanner) WithStatusReceiver(statusReceiver daemontypes.StatusReceiver) PlanConfirmer { 27 return &DaemonlessPlanner{ 28 Logger: d.Logger, 29 Status: statusReceiver, 30 } 31 } 32 33 func (d *DaemonlessPlanner) ConfirmPlan( 34 ctx context.Context, 35 formattedTerraformPlan string, 36 release api.Release, 37 confirmedChan chan bool, 38 ) (bool, error) { 39 debug := level.Debug(log.With(d.Logger, "struct", "daemonlessplanner", "method", "plan")) 40 41 debug.Log("event", "status.message") 42 d.Status.PushMessageStep( 43 ctx, 44 daemontypes.Message{Contents: formattedTerraformPlan, TrustedHTML: true}, 45 planActions(), 46 ) 47 48 return d.awaitMessageConfirmed(ctx, confirmedChan) 49 } 50 51 func (d *DaemonlessPlanner) awaitMessageConfirmed(ctx context.Context, confirmedChan chan bool) (bool, error) { 52 debug := level.Debug(log.With(d.Logger, "struct", "daemonlessplanner", "method", "awaitMessageConfirmed")) 53 54 for { 55 select { 56 case shouldApply := <-confirmedChan: 57 return shouldApply, nil 58 case <-time.After(10 * time.Second): 59 debug.Log("waitingFor", "message.confirmed") 60 } 61 } 62 }