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
|
package verifier
import (
"encoding/json"
"strings"
"github.com/containerd/platforms"
"github.com/moby/buildkit/solver/result"
)
const requestOptsKeys = "verifier.requestopts"
const (
platformsKey = "platform"
labelsPrefix = "label:"
keyRequestID = "requestid"
)
type RequestOpts struct {
Platforms []string
Labels map[string]string
Request string
}
func CaptureFrontendOpts[T comparable](m map[string]string, res *result.Result[T]) error {
req := &RequestOpts{}
if v, ok := m[platformsKey]; ok {
req.Platforms = strings.Split(v, ",")
} else {
req.Platforms = []string{platforms.Format(platforms.Normalize(platforms.DefaultSpec()))}
}
req.Labels = map[string]string{}
for k, v := range m {
if strings.HasPrefix(k, labelsPrefix) {
req.Labels[strings.TrimPrefix(k, labelsPrefix)] = v
}
}
req.Request = m[keyRequestID]
dt, err := json.Marshal(req)
if err != nil {
return err
}
res.AddMeta(requestOptsKeys, dt)
return nil
}
func getRequestOpts[T comparable](res *result.Result[T]) (*RequestOpts, error) {
dt, ok := res.Metadata[requestOptsKeys]
if !ok {
return nil, nil
}
req := &RequestOpts{}
if err := json.Unmarshal(dt, req); err != nil {
return nil, err
}
return req, nil
}
|