mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 00:47:48 +08:00

Strongly typing the API allows us to perform all command line parsing fully on the client-side, where we have access to the client local directory and all the client environment variables, which may not be available on the remote server. Additionally, the controller api starts to look a lot like build.Options, so at some point in the future there may be an oppportunity to merge the two, which would allow both build and bake to execute through the controller, instead of needing to maintain multiple code paths. Signed-off-by: Justin Chadwell <me@jedevc.com>
64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package buildflags
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"strings"
|
|
|
|
controllerapi "github.com/docker/buildx/controller/pb"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func ParseSecretSpecs(sl []string) ([]*controllerapi.Secret, error) {
|
|
fs := make([]*controllerapi.Secret, 0, len(sl))
|
|
for _, v := range sl {
|
|
s, err := parseSecret(v)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
fs = append(fs, s)
|
|
}
|
|
return fs, nil
|
|
}
|
|
|
|
func parseSecret(value string) (*controllerapi.Secret, error) {
|
|
csvReader := csv.NewReader(strings.NewReader(value))
|
|
fields, err := csvReader.Read()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to parse csv secret")
|
|
}
|
|
|
|
fs := controllerapi.Secret{}
|
|
|
|
var typ string
|
|
for _, field := range fields {
|
|
parts := strings.SplitN(field, "=", 2)
|
|
key := strings.ToLower(parts[0])
|
|
|
|
if len(parts) != 2 {
|
|
return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
|
|
}
|
|
|
|
value := parts[1]
|
|
switch key {
|
|
case "type":
|
|
if value != "file" && value != "env" {
|
|
return nil, errors.Errorf("unsupported secret type %q", value)
|
|
}
|
|
typ = value
|
|
case "id":
|
|
fs.ID = value
|
|
case "source", "src":
|
|
fs.FilePath = value
|
|
case "env":
|
|
fs.Env = value
|
|
default:
|
|
return nil, errors.Errorf("unexpected key '%s' in '%s'", key, field)
|
|
}
|
|
}
|
|
if typ == "env" && fs.Env == "" {
|
|
fs.Env = fs.FilePath
|
|
fs.FilePath = ""
|
|
}
|
|
return &fs, nil
|
|
}
|