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 }