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  }