mirror of https://github.com/docker/buildx.git
update errors handling allocations and comparison
Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
parent
3005743f7c
commit
b92bfb53d2
|
@ -75,7 +75,12 @@ type WithGetName interface {
|
||||||
GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func(hcl.Expression) hcl.Diagnostics) (string, error)
|
GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func(hcl.Expression) hcl.Diagnostics) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
var errUndefined = errors.New("undefined")
|
// errUndefined is returned when a variable or function is not defined.
|
||||||
|
type errUndefined struct{}
|
||||||
|
|
||||||
|
func (errUndefined) Error() string {
|
||||||
|
return "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
func (p *parser) loadDeps(ectx *hcl.EvalContext, exp hcl.Expression, exclude map[string]struct{}, allowMissing bool) hcl.Diagnostics {
|
func (p *parser) loadDeps(ectx *hcl.EvalContext, exp hcl.Expression, exclude map[string]struct{}, allowMissing bool) hcl.Diagnostics {
|
||||||
fns, hcldiags := funcCalls(exp)
|
fns, hcldiags := funcCalls(exp)
|
||||||
|
@ -85,7 +90,7 @@ func (p *parser) loadDeps(ectx *hcl.EvalContext, exp hcl.Expression, exclude map
|
||||||
|
|
||||||
for _, fn := range fns {
|
for _, fn := range fns {
|
||||||
if err := p.resolveFunction(ectx, fn); err != nil {
|
if err := p.resolveFunction(ectx, fn); err != nil {
|
||||||
if allowMissing && errors.Is(err, errUndefined) {
|
if allowMissing && errors.Is(err, errUndefined{}) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
||||||
|
@ -139,7 +144,7 @@ func (p *parser) loadDeps(ectx *hcl.EvalContext, exp hcl.Expression, exclude map
|
||||||
}
|
}
|
||||||
for _, block := range blocks {
|
for _, block := range blocks {
|
||||||
if err := p.resolveBlock(block, target); err != nil {
|
if err := p.resolveBlock(block, target); err != nil {
|
||||||
if allowMissing && errors.Is(err, errUndefined) {
|
if allowMissing && errors.Is(err, errUndefined{}) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
||||||
|
@ -147,7 +152,7 @@ func (p *parser) loadDeps(ectx *hcl.EvalContext, exp hcl.Expression, exclude map
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if err := p.resolveValue(ectx, v.RootName()); err != nil {
|
if err := p.resolveValue(ectx, v.RootName()); err != nil {
|
||||||
if allowMissing && errors.Is(err, errUndefined) {
|
if allowMissing && errors.Is(err, errUndefined{}) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
return wrapErrorDiagnostic("Invalid expression", err, exp.Range().Ptr(), exp.Range().Ptr())
|
||||||
|
@ -169,7 +174,7 @@ func (p *parser) resolveFunction(ectx *hcl.EvalContext, name string) error {
|
||||||
}
|
}
|
||||||
f, ok := p.funcs[name]
|
f, ok := p.funcs[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.Wrapf(errUndefined, "function %q does not exist", name)
|
return errors.Wrapf(errUndefined{}, "function %q does not exist", name)
|
||||||
}
|
}
|
||||||
if _, ok := p.progressF[key(ectx, name)]; ok {
|
if _, ok := p.progressF[key(ectx, name)]; ok {
|
||||||
return errors.Errorf("function cycle not allowed for %s", name)
|
return errors.Errorf("function cycle not allowed for %s", name)
|
||||||
|
@ -259,7 +264,7 @@ func (p *parser) resolveValue(ectx *hcl.EvalContext, name string) (err error) {
|
||||||
if _, builtin := p.opt.Vars[name]; !ok && !builtin {
|
if _, builtin := p.opt.Vars[name]; !ok && !builtin {
|
||||||
vr, ok := p.vars[name]
|
vr, ok := p.vars[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return errors.Wrapf(errUndefined, "variable %q does not exist", name)
|
return errors.Wrapf(errUndefined{}, "variable %q does not exist", name)
|
||||||
}
|
}
|
||||||
def = vr.Default
|
def = vr.Default
|
||||||
ectx = p.ectx
|
ectx = p.ectx
|
||||||
|
|
|
@ -48,11 +48,6 @@ import (
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
errStdinConflict = errors.New("invalid argument: can't use stdin for both build context and dockerfile")
|
|
||||||
errDockerfileConflict = errors.New("ambiguous Dockerfile source: both stdin and flag correspond to Dockerfiles")
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
printFallbackImage = "docker/dockerfile:1.5@sha256:dbbd5e059e8a07ff7ea6233b213b36aa516b4c53c645f1817a4dd18b83cbea56"
|
printFallbackImage = "docker/dockerfile:1.5@sha256:dbbd5e059e8a07ff7ea6233b213b36aa516b4c53c645f1817a4dd18b83cbea56"
|
||||||
printLintFallbackImage = "docker.io/docker/dockerfile-upstream:1.8.1@sha256:e87caa74dcb7d46cd820352bfea12591f3dba3ddc4285e19c7dcd13359f7cefd"
|
printLintFallbackImage = "docker.io/docker/dockerfile-upstream:1.8.1@sha256:e87caa74dcb7d46cd820352bfea12591f3dba3ddc4285e19c7dcd13359f7cefd"
|
||||||
|
|
|
@ -379,7 +379,7 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, addVCSL
|
||||||
target.FrontendInputs["dockerfile"] = *inp.ContextState
|
target.FrontendInputs["dockerfile"] = *inp.ContextState
|
||||||
case inp.ContextPath == "-":
|
case inp.ContextPath == "-":
|
||||||
if inp.DockerfilePath == "-" {
|
if inp.DockerfilePath == "-" {
|
||||||
return nil, errStdinConflict
|
return nil, errors.Errorf("invalid argument: can't use stdin for both build context and dockerfile")
|
||||||
}
|
}
|
||||||
|
|
||||||
buf := bufio.NewReader(inp.InStream)
|
buf := bufio.NewReader(inp.InStream)
|
||||||
|
@ -395,7 +395,7 @@ func loadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, addVCSL
|
||||||
target.Session = append(target.Session, up)
|
target.Session = append(target.Session, up)
|
||||||
} else {
|
} else {
|
||||||
if inp.DockerfilePath != "" {
|
if inp.DockerfilePath != "" {
|
||||||
return nil, errDockerfileConflict
|
return nil, errors.Errorf("ambiguous Dockerfile source: both stdin and flag correspond to Dockerfiles")
|
||||||
}
|
}
|
||||||
// stdin is dockerfile
|
// stdin is dockerfile
|
||||||
dockerfileReader = buf
|
dockerfileReader = buf
|
||||||
|
|
|
@ -29,7 +29,7 @@ func (d *Driver) Bootstrap(ctx context.Context, l progress.Logger) error {
|
||||||
func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
||||||
_, err := d.DockerAPI.ServerVersion(ctx)
|
_, err := d.DockerAPI.ServerVersion(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrapf(driver.ErrNotConnecting, err.Error())
|
return nil, errors.Wrapf(driver.ErrNotConnecting{}, err.Error())
|
||||||
}
|
}
|
||||||
return &driver.Info{
|
return &driver.Info{
|
||||||
Status: driver.Running,
|
Status: driver.Running,
|
||||||
|
@ -39,7 +39,7 @@ func (d *Driver) Info(ctx context.Context) (*driver.Info, error) {
|
||||||
func (d *Driver) Version(ctx context.Context) (string, error) {
|
func (d *Driver) Version(ctx context.Context) (string, error) {
|
||||||
v, err := d.DockerAPI.ServerVersion(ctx)
|
v, err := d.DockerAPI.ServerVersion(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrapf(driver.ErrNotConnecting, err.Error())
|
return "", errors.Wrapf(driver.ErrNotConnecting{}, err.Error())
|
||||||
}
|
}
|
||||||
if bkversion, _ := resolveBuildKitVersion(v.Version); bkversion != "" {
|
if bkversion, _ := resolveBuildKitVersion(v.Version); bkversion != "" {
|
||||||
return bkversion, nil
|
return bkversion, nil
|
||||||
|
|
|
@ -14,8 +14,17 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrNotRunning = errors.Errorf("driver not running")
|
type ErrNotRunning struct{}
|
||||||
var ErrNotConnecting = errors.Errorf("driver not connecting")
|
|
||||||
|
func (ErrNotRunning) Error() string {
|
||||||
|
return "driver not running"
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrNotConnecting struct{}
|
||||||
|
|
||||||
|
func (ErrNotConnecting) Error() string {
|
||||||
|
return "driver not connecting"
|
||||||
|
}
|
||||||
|
|
||||||
type Status int
|
type Status int
|
||||||
|
|
||||||
|
@ -105,7 +114,7 @@ func Boot(ctx, clientContext context.Context, d *DriverHandle, pw progress.Write
|
||||||
|
|
||||||
c, err := d.Client(clientContext)
|
c, err := d.Client(clientContext)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Cause(err) == ErrNotRunning && try <= 2 {
|
if errors.Is(err, ErrNotRunning{}) && try <= 2 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -7,7 +7,6 @@ import (
|
||||||
|
|
||||||
"github.com/docker/buildx/util/platformutil"
|
"github.com/docker/buildx/util/platformutil"
|
||||||
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
|
||||||
appsv1 "k8s.io/api/apps/v1"
|
appsv1 "k8s.io/api/apps/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/resource"
|
"k8s.io/apimachinery/pkg/api/resource"
|
||||||
|
@ -53,10 +52,17 @@ const (
|
||||||
LabelApp = "app"
|
LabelApp = "app"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
type ErrReservedAnnotationPlatform struct{}
|
||||||
ErrReservedAnnotationPlatform = errors.Errorf("the annotation \"%s\" is reserved and cannot be customized", AnnotationPlatform)
|
|
||||||
ErrReservedLabelApp = errors.Errorf("the label \"%s\" is reserved and cannot be customized", LabelApp)
|
func (ErrReservedAnnotationPlatform) Error() string {
|
||||||
)
|
return fmt.Sprintf("the annotation %q is reserved and cannot be customized", AnnotationPlatform)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ErrReservedLabelApp struct{}
|
||||||
|
|
||||||
|
func (ErrReservedLabelApp) Error() string {
|
||||||
|
return fmt.Sprintf("the label %q is reserved and cannot be customized", LabelApp)
|
||||||
|
}
|
||||||
|
|
||||||
func NewDeployment(opt *DeploymentOpt) (d *appsv1.Deployment, c []*corev1.ConfigMap, err error) {
|
func NewDeployment(opt *DeploymentOpt) (d *appsv1.Deployment, c []*corev1.ConfigMap, err error) {
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
|
@ -73,14 +79,14 @@ func NewDeployment(opt *DeploymentOpt) (d *appsv1.Deployment, c []*corev1.Config
|
||||||
|
|
||||||
for k, v := range opt.CustomAnnotations {
|
for k, v := range opt.CustomAnnotations {
|
||||||
if k == AnnotationPlatform {
|
if k == AnnotationPlatform {
|
||||||
return nil, nil, ErrReservedAnnotationPlatform
|
return nil, nil, ErrReservedAnnotationPlatform{}
|
||||||
}
|
}
|
||||||
annotations[k] = v
|
annotations[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
for k, v := range opt.CustomLabels {
|
for k, v := range opt.CustomLabels {
|
||||||
if k == LabelApp {
|
if k == LabelApp {
|
||||||
return nil, nil, ErrReservedLabelApp
|
return nil, nil, ErrReservedLabelApp{}
|
||||||
}
|
}
|
||||||
labels[k] = v
|
labels[k] = v
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue