github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/config/daemonresolver.go (about) 1 package config 2 3 import ( 4 "context" 5 "errors" 6 "time" 7 8 "github.com/go-kit/kit/log" 9 "github.com/go-kit/kit/log/level" 10 "github.com/replicatedhq/ship/pkg/api" 11 "github.com/replicatedhq/ship/pkg/lifecycle/daemon/daemontypes" 12 ) 13 14 type DaemonResolver struct { 15 Logger log.Logger 16 Daemon daemontypes.Daemon 17 } 18 19 func (d *DaemonResolver) ResolveConfig( 20 ctx context.Context, 21 release *api.Release, 22 context map[string]interface{}, 23 ) (map[string]interface{}, error) { 24 debug := level.Debug(log.With(d.Logger, "struct", "daemonresolver", "method", "resolveConfig")) 25 if len(release.Spec.Config.V1) == 0 { 26 debug.Log("event", "config.empty") 27 if context == nil { 28 return make(map[string]interface{}), nil 29 } 30 return context, nil 31 } 32 33 daemonExitedChan := d.Daemon.EnsureStarted(ctx, release) 34 35 for _, step := range release.Spec.Lifecycle.V1 { 36 if step.Render != nil { 37 debug.Log("event", "render.found") 38 d.Daemon.PushRenderStep(ctx, daemontypes.Render{}) 39 debug.Log("event", "step.pushed") 40 return d.awaitConfigSaved(ctx, daemonExitedChan) 41 } 42 } 43 44 return nil, errors.New("couldn't find current render Execute") 45 } 46 47 func (d *DaemonResolver) awaitConfigSaved(ctx context.Context, daemonExitedChan chan error) (map[string]interface{}, error) { 48 debug := level.Debug(log.With(d.Logger, "struct", "daemonresolver", "method", "resolveConfig")) 49 for { 50 select { 51 case <-ctx.Done(): 52 debug.Log("event", "ctx.done") 53 return nil, ctx.Err() 54 case err := <-daemonExitedChan: 55 debug.Log("event", "daemon.exit") 56 if err != nil { 57 return nil, err 58 } 59 return nil, errors.New("daemon exited") 60 case <-time.After(1 * time.Millisecond): 61 // need to pause here to ensure err channel priority 62 } 63 select { 64 case <-d.Daemon.ConfigSavedChan(): 65 debug.Log("event", "config.saved") 66 return d.Daemon.GetCurrentConfig() 67 case <-time.After(10 * time.Second): 68 debug.Log("waitingFor", "config.saved") 69 case <-ctx.Done(): 70 debug.Log("event", "ctx.done") 71 return nil, ctx.Err() 72 } 73 } 74 }