github.com/octohelm/wagon@v0.0.0-20240308040401-88662650dc0b/pkg/engine/daggerutil/engine.go (about)

     1  package daggerutil
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"os"
     8  	"runtime/debug"
     9  
    10  	"github.com/dagger/dagger/engine"
    11  	"github.com/dagger/dagger/engine/client"
    12  	"github.com/go-courier/logr"
    13  	"github.com/vito/progrock/console"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  type contextInternalDebug struct {
    18  }
    19  
    20  func ContextWithInternalDebug(ctx context.Context, debug bool) context.Context {
    21  	return context.WithValue(ctx, contextInternalDebug{}, debug)
    22  }
    23  
    24  func InternalDebugFromContext(ctx context.Context) bool {
    25  	v, ok := ctx.Value(contextInternalDebug{}).(bool)
    26  	if ok {
    27  		return v
    28  	}
    29  	return false
    30  }
    31  
    32  type EngineOptionFunc = func(x *client.Params)
    33  
    34  func WithRunnerHost(runnerHost string) EngineOptionFunc {
    35  	return func(x *client.Params) {
    36  		x.RunnerHost = runnerHost
    37  	}
    38  }
    39  
    40  var engineVersion = func() string {
    41  	bi, ok := debug.ReadBuildInfo()
    42  	if ok {
    43  		for _, dep := range bi.Deps {
    44  			if dep.Path == "github.com/dagger/dagger" {
    45  				engine.Version = dep.Version
    46  				return engine.Version
    47  			}
    48  		}
    49  	}
    50  	return engine.Version
    51  }()
    52  
    53  var DefaultRunnerHost = fmt.Sprintf("docker-image://ghcr.io/dagger/engine:%s", engineVersion)
    54  
    55  func RunnerHost() string {
    56  	var runnerHost string
    57  	if v, ok := os.LookupEnv("_EXPERIMENTAL_DAGGER_RUNNER_HOST"); ok {
    58  		runnerHost = v
    59  	} else {
    60  		runnerHost = DefaultRunnerHost
    61  	}
    62  	return runnerHost
    63  }
    64  
    65  func ConnectEngine(ctx context.Context, optFns ...EngineOptionFunc) (DirectConn, func() error, error) {
    66  	params := &client.Params{}
    67  	for i := range optFns {
    68  		optFns[i](params)
    69  	}
    70  
    71  	if params.RunnerHost == "" {
    72  		params.RunnerHost = RunnerHost()
    73  	}
    74  
    75  	params.ProgrockWriter = console.NewWriter(
    76  		os.Stdout,
    77  		console.ShowInternal(InternalDebugFromContext(ctx)),
    78  	)
    79  
    80  	params.EngineNameCallback = func(name string) {
    81  		logr.FromContext(ctx).Info(fmt.Sprintf("Connected to engine %s", name))
    82  	}
    83  
    84  	engineClient, ctx, err := client.Connect(ctx, *params)
    85  	if err != nil {
    86  		return nil, nil, err
    87  	}
    88  
    89  	return EngineConn(engineClient), func() error {
    90  		return engineClient.Close()
    91  	}, nil
    92  }
    93  
    94  func EngineConn(engineClient *client.Client) DirectConn {
    95  	return func(req *http.Request) (*http.Response, error) {
    96  		req.SetBasicAuth(engineClient.SecretToken, "")
    97  		resp := httptest.NewRecorder()
    98  		engineClient.ServeHTTP(resp, req)
    99  		return resp.Result(), nil
   100  	}
   101  }
   102  
   103  type DirectConn func(*http.Request) (*http.Response, error)
   104  
   105  func (f DirectConn) Do(r *http.Request) (*http.Response, error) {
   106  	return f(r)
   107  }
   108  
   109  func (f DirectConn) Host() string {
   110  	return ":mem:"
   111  }
   112  
   113  func (f DirectConn) Close() error {
   114  	return nil
   115  }