1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
package dockerui
import (
"bytes"
"context"
"encoding/json"
"github.com/moby/buildkit/frontend/gateway/client"
"github.com/moby/buildkit/frontend/subrequests"
"github.com/moby/buildkit/frontend/subrequests/lint"
"github.com/moby/buildkit/frontend/subrequests/outline"
"github.com/moby/buildkit/frontend/subrequests/targets"
"github.com/moby/buildkit/solver/errdefs"
)
const (
keyRequestID = "requestid"
)
type RequestHandler struct {
Outline func(context.Context) (*outline.Outline, error)
ListTargets func(context.Context) (*targets.List, error)
Lint func(context.Context) (*lint.LintResults, error)
AllowOther bool
}
func (bc *Client) HandleSubrequest(ctx context.Context, h RequestHandler) (*client.Result, bool, error) {
req, ok := bc.bopts.Opts[keyRequestID]
if !ok {
return nil, false, nil
}
switch req {
case subrequests.RequestSubrequestsDescribe:
res, err := describe(h)
return res, true, err
case outline.SubrequestsOutlineDefinition.Name:
if f := h.Outline; f != nil {
o, err := f(ctx)
if err != nil {
return nil, false, err
}
if o == nil {
return nil, true, nil
}
res, err := o.ToResult()
return res, true, err
}
case targets.SubrequestsTargetsDefinition.Name:
if f := h.ListTargets; f != nil {
targets, err := f(ctx)
if err != nil {
return nil, false, err
}
if targets == nil {
return nil, true, nil
}
res, err := targets.ToResult()
return res, true, err
}
case lint.SubrequestLintDefinition.Name:
if f := h.Lint; f != nil {
warnings, err := f(ctx)
if err != nil {
return nil, false, err
}
if warnings == nil {
return nil, true, nil
}
res, err := warnings.ToResult()
return res, true, err
}
}
if h.AllowOther {
return nil, false, nil
}
return nil, false, errdefs.NewUnsupportedSubrequestError(req)
}
func describe(h RequestHandler) (*client.Result, error) {
all := []subrequests.Request{}
if h.Outline != nil {
all = append(all, outline.SubrequestsOutlineDefinition)
}
if h.ListTargets != nil {
all = append(all, targets.SubrequestsTargetsDefinition)
}
all = append(all, subrequests.SubrequestsDescribeDefinition)
dt, err := json.MarshalIndent(all, "", " ")
if err != nil {
return nil, err
}
b := bytes.NewBuffer(nil)
if err := subrequests.PrintDescribe(dt, b); err != nil {
return nil, err
}
res := client.NewResult()
res.Metadata = map[string][]byte{
"result.json": dt,
"result.txt": b.Bytes(),
"version": []byte(subrequests.SubrequestsDescribeDefinition.Version),
}
return res, nil
}
|