package subrequests import ( "context" "encoding/json" "github.com/moby/buildkit/frontend/gateway/client" gwpb "github.com/moby/buildkit/frontend/gateway/pb" "github.com/moby/buildkit/solver/errdefs" "github.com/pkg/errors" ) const RequestSubrequestsDescribe = "frontend.subrequests.describe" var SubrequestsDescribeDefinition = Request{ Name: RequestSubrequestsDescribe, Version: "1.0.0", Type: TypeRPC, Description: "List available subrequest types", Metadata: []Named{ { Name: "result.json", }, }, } func Describe(ctx context.Context, c client.Client) ([]Request, error) { gwcaps := c.BuildOpts().Caps if err := (&gwcaps).Supports(gwpb.CapFrontendCaps); err != nil { return nil, errdefs.NewUnsupportedSubrequestError(RequestSubrequestsDescribe) } res, err := c.Solve(ctx, client.SolveRequest{ FrontendOpt: map[string]string{ "requestid": RequestSubrequestsDescribe, "frontend.caps": "moby.buildkit.frontend.subrequests", }, Frontend: "dockerfile.v0", }) if err != nil { var reqErr *errdefs.UnsupportedSubrequestError if errors.As(err, &reqErr) { return nil, err } var capErr *errdefs.UnsupportedFrontendCapError if errors.As(err, &capErr) { return nil, errdefs.NewUnsupportedSubrequestError(RequestSubrequestsDescribe) } return nil, err } dt, ok := res.Metadata["result.json"] if !ok { return nil, errors.Errorf("no result.json metadata in response") } var reqs []Request if err := json.Unmarshal(dt, &reqs); err != nil { return nil, errors.Wrap(err, "failed to parse describe result") } return reqs, nil }