Merge pull request #83090 from Klaven/rm_validator_errors

Removal of kubernetes error dependencies
This commit is contained in:
Kubernetes Prow Robot 2019-10-07 23:35:25 -07:00 committed by GitHub
commit c4108c9b4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 67 additions and 50 deletions

View File

@ -546,10 +546,10 @@ func (sysver SystemVerificationCheck) Check() (warnings, errorList []error) {
for _, v := range validators { for _, v := range validators {
warn, err := v.Validate(system.DefaultSysSpec) warn, err := v.Validate(system.DefaultSysSpec)
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err...)
} }
if warn != nil { if warn != nil {
warns = append(warns, warn) warns = append(warns, warn...)
} }
} }

View File

@ -23,7 +23,6 @@ go_library(
], ],
importpath = "k8s.io/kubernetes/cmd/kubeadm/app/util/system", importpath = "k8s.io/kubernetes/cmd/kubeadm/app/util/system",
deps = [ deps = [
"//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
"//vendor/github.com/blang/semver:go_default_library", "//vendor/github.com/blang/semver:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library", "//vendor/github.com/pkg/errors:go_default_library",
], ],

View File

@ -41,12 +41,15 @@ const (
) )
// Validate is part of the system.Validator interface. // Validate is part of the system.Validator interface.
func (c *CgroupsValidator) Validate(spec SysSpec) (error, error) { func (c *CgroupsValidator) Validate(spec SysSpec) ([]error, []error) {
subsystems, err := c.getCgroupSubsystems() subsystems, err := c.getCgroupSubsystems()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to get cgroup subsystems") return nil, []error{errors.Wrap(err, "failed to get cgroup subsystems")}
} }
return nil, c.validateCgroupSubsystems(spec.Cgroups, subsystems) if err = c.validateCgroupSubsystems(spec.Cgroups, subsystems); err != nil {
return nil, []error{err}
}
return nil, nil
} }
func (c *CgroupsValidator) validateCgroupSubsystems(cgroupSpec, subsystems []string) error { func (c *CgroupsValidator) validateCgroupSubsystems(cgroupSpec, subsystems []string) error {

View File

@ -51,7 +51,7 @@ const (
// Validate is part of the system.Validator interface. // Validate is part of the system.Validator interface.
// TODO(random-liu): Add more validating items. // TODO(random-liu): Add more validating items.
func (d *DockerValidator) Validate(spec SysSpec) (error, error) { func (d *DockerValidator) Validate(spec SysSpec) ([]error, []error) {
if spec.RuntimeSpec.DockerSpec == nil { if spec.RuntimeSpec.DockerSpec == nil {
// If DockerSpec is not specified, assume current runtime is not // If DockerSpec is not specified, assume current runtime is not
// docker, skip the docker configuration validation. // docker, skip the docker configuration validation.
@ -62,10 +62,10 @@ func (d *DockerValidator) Validate(spec SysSpec) (error, error) {
info := dockerInfo{} info := dockerInfo{}
out, err := exec.Command("docker", "info", "--format", "{{json .}}").CombinedOutput() out, err := exec.Command("docker", "info", "--format", "{{json .}}").CombinedOutput()
if err != nil { if err != nil {
return nil, errors.Errorf(`failed executing "docker info --format '{{json .}}'"\noutput: %s\nerror: %v`, string(out), err) return nil, []error{errors.Errorf(`failed executing "docker info --format '{{json .}}'"\noutput: %s\nerror: %v`, string(out), err)}
} }
if err := d.unmarshalDockerInfo(out, &info); err != nil { if err := d.unmarshalDockerInfo(out, &info); err != nil {
return nil, err return nil, []error{err}
} }
// validate the resulted docker info object against the spec // validate the resulted docker info object against the spec
@ -79,7 +79,7 @@ func (d *DockerValidator) unmarshalDockerInfo(b []byte, info *dockerInfo) error
return nil return nil
} }
func (d *DockerValidator) validateDockerInfo(spec *DockerSpec, info dockerInfo) (error, error) { func (d *DockerValidator) validateDockerInfo(spec *DockerSpec, info dockerInfo) ([]error, []error) {
// Validate docker version. // Validate docker version.
matched := false matched := false
for _, v := range spec.Version { for _, v := range spec.Version {
@ -101,10 +101,10 @@ func (d *DockerValidator) validateDockerInfo(spec *DockerSpec, info dockerInfo)
info.ServerVersion, info.ServerVersion,
latestValidatedDockerVersion, latestValidatedDockerVersion,
) )
return w, nil return []error{w}, nil
} }
d.Reporter.Report(dockerConfigPrefix+"VERSION", info.ServerVersion, bad) d.Reporter.Report(dockerConfigPrefix+"VERSION", info.ServerVersion, bad)
return nil, errors.Errorf("unsupported docker version: %s", info.ServerVersion) return nil, []error{errors.Errorf("unsupported docker version: %s", info.ServerVersion)}
} }
// Validate graph driver. // Validate graph driver.
item := dockerConfigPrefix + "GRAPH_DRIVER" item := dockerConfigPrefix + "GRAPH_DRIVER"
@ -115,5 +115,5 @@ func (d *DockerValidator) validateDockerInfo(spec *DockerSpec, info dockerInfo)
} }
} }
d.Reporter.Report(item, info.Driver, bad) d.Reporter.Report(item, info.Driver, bad)
return nil, errors.Errorf("unsupported graph driver: %s", info.Driver) return nil, []error{errors.Errorf("unsupported graph driver: %s", info.Driver)}
} }

View File

@ -30,8 +30,6 @@ import (
"strings" "strings"
"github.com/pkg/errors" "github.com/pkg/errors"
errorsutil "k8s.io/apimachinery/pkg/util/errors"
) )
var _ Validator = &KernelValidator{} var _ Validator = &KernelValidator{}
@ -63,20 +61,24 @@ const (
) )
// Validate is part of the system.Validator interface. // Validate is part of the system.Validator interface.
func (k *KernelValidator) Validate(spec SysSpec) (error, error) { func (k *KernelValidator) Validate(spec SysSpec) ([]error, []error) {
helper := KernelValidatorHelperImpl{} helper := KernelValidatorHelperImpl{}
release, err := helper.GetKernelReleaseVersion() release, err := helper.GetKernelReleaseVersion()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to get kernel release") return nil, []error{errors.Wrap(err, "failed to get kernel release")}
} }
k.kernelRelease = release k.kernelRelease = release
var errs []error var errs []error
errs = append(errs, k.validateKernelVersion(spec.KernelSpec)) if err = k.validateKernelVersion(spec.KernelSpec); err != nil {
errs = append(errs, err)
}
// only validate kernel config when necessary (currently no kernel config for windows) // only validate kernel config when necessary (currently no kernel config for windows)
if len(spec.KernelSpec.Required) > 0 || len(spec.KernelSpec.Forbidden) > 0 || len(spec.KernelSpec.Optional) > 0 { if len(spec.KernelSpec.Required) > 0 || len(spec.KernelSpec.Forbidden) > 0 || len(spec.KernelSpec.Optional) > 0 {
errs = append(errs, k.validateKernelConfig(spec.KernelSpec)) if err = k.validateKernelConfig(spec.KernelSpec); err != nil {
errs = append(errs, err)
}
} }
return nil, errorsutil.NewAggregate(errs) return nil, errs
} }
// validateKernelVersion validates the kernel version. // validateKernelVersion validates the kernel version.

View File

@ -36,12 +36,15 @@ func (o *OSValidator) Name() string {
} }
// Validate is part of the system.Validator interface. // Validate is part of the system.Validator interface.
func (o *OSValidator) Validate(spec SysSpec) (error, error) { func (o *OSValidator) Validate(spec SysSpec) ([]error, []error) {
os, err := exec.Command("uname").CombinedOutput() os, err := exec.Command("uname").CombinedOutput()
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to get os name") return nil, []error{errors.Wrap(err, "failed to get os name")}
} }
return nil, o.validateOS(strings.TrimSpace(string(os)), spec.OS) if err = o.validateOS(strings.TrimSpace(string(os)), spec.OS); err != nil {
return nil, []error{err}
}
return nil, nil
} }
func (o *OSValidator) validateOS(os, specOS string) error { func (o *OSValidator) validateOS(os, specOS string) error {

View File

@ -24,8 +24,6 @@ import (
"github.com/blang/semver" "github.com/blang/semver"
"github.com/pkg/errors" "github.com/pkg/errors"
errorsutil "k8s.io/apimachinery/pkg/util/errors"
) )
// semVerDotsCount is the number of dots in a valid semantic version. // semVerDotsCount is the number of dots in a valid semantic version.
@ -92,22 +90,22 @@ func (validator *packageValidator) Name() string {
// Validate checks packages and their versions against the spec using the // Validate checks packages and their versions against the spec using the
// package manager on the running machine, and returns an error on any // package manager on the running machine, and returns an error on any
// package/version mismatch. // package/version mismatch.
func (validator *packageValidator) Validate(spec SysSpec) (error, error) { func (validator *packageValidator) Validate(spec SysSpec) ([]error, []error) {
if len(spec.PackageSpecs) == 0 { if len(spec.PackageSpecs) == 0 {
return nil, nil return nil, nil
} }
var err error var err error
if validator.kernelRelease, err = getKernelRelease(); err != nil { if validator.kernelRelease, err = getKernelRelease(); err != nil {
return nil, err return nil, []error{err}
} }
if validator.osDistro, err = getOSDistro(); err != nil { if validator.osDistro, err = getOSDistro(); err != nil {
return nil, err return nil, []error{err}
} }
manager, err := newPackageManager() manager, err := newPackageManager()
if err != nil { if err != nil {
return nil, err return nil, []error{err}
} }
specs := applyPackageSpecOverride(spec.PackageSpecs, spec.PackageSpecOverrides, validator.osDistro) specs := applyPackageSpecOverride(spec.PackageSpecs, spec.PackageSpecOverrides, validator.osDistro)
return validator.validate(specs, manager) return validator.validate(specs, manager)
@ -115,7 +113,7 @@ func (validator *packageValidator) Validate(spec SysSpec) (error, error) {
// Validate checks packages and their versions against the packageSpecs using // Validate checks packages and their versions against the packageSpecs using
// the packageManager, and returns an error on any package/version mismatch. // the packageManager, and returns an error on any package/version mismatch.
func (validator *packageValidator) validate(packageSpecs []PackageSpec, manager packageManager) (error, error) { func (validator *packageValidator) validate(packageSpecs []PackageSpec, manager packageManager) ([]error, []error) {
var errs []error var errs []error
for _, spec := range packageSpecs { for _, spec := range packageSpecs {
// Substitute variables in package name. // Substitute variables in package name.
@ -155,7 +153,7 @@ func (validator *packageValidator) validate(packageSpecs []PackageSpec, manager
validator.reporter.Report(nameWithVerRange, version, bad) validator.reporter.Report(nameWithVerRange, version, bad)
} }
} }
return nil, errorsutil.NewAggregate(errs) return nil, errs
} }
// getKernelRelease returns the kernel release of the local machine. // getKernelRelease returns the kernel release of the local machine.

View File

@ -185,7 +185,7 @@ func TestValidatePackageVersion(t *testing.T) {
for _, test := range []struct { for _, test := range []struct {
desc string desc string
specs []PackageSpec specs []PackageSpec
err error errs []error
}{ }{
{ {
desc: "all packages meet the spec", desc: "all packages meet the spec",
@ -200,14 +200,18 @@ func TestValidatePackageVersion(t *testing.T) {
{Name: "foo", VersionRange: ">=1.0"}, {Name: "foo", VersionRange: ">=1.0"},
{Name: "bar", VersionRange: ">=3.0"}, {Name: "bar", VersionRange: ">=3.0"},
}, },
err: errors.New("package \"bar 2.1.0\" does not meet the spec \"bar (>=3.0)\""), errs: []error{
errors.New("package \"bar 2.1.0\" does not meet the spec \"bar (>=3.0)\""),
},
}, },
{ {
desc: "package not installed", desc: "package not installed",
specs: []PackageSpec{ specs: []PackageSpec{
{Name: "baz"}, {Name: "baz"},
}, },
err: errors.New("package \"baz\" does not exist"), errs: []error{
errors.New("package \"baz\" does not exist"),
},
}, },
{ {
desc: "use variable in package name", desc: "use variable in package name",
@ -217,15 +221,21 @@ func TestValidatePackageVersion(t *testing.T) {
}, },
} { } {
t.Run(test.desc, func(t *testing.T) { t.Run(test.desc, func(t *testing.T) {
_, err := v.validate(test.specs, manager) _, errs := v.validate(test.specs, manager)
if test.err == nil && err != nil { if len(test.errs) == 0 && len(errs) > 0 {
t.Errorf("%s: v.validate(): err = %s", test.desc, err) t.Errorf("%s: v.validate(): err = %s", test.desc, errs)
} }
if test.err != nil { if len(test.errs) > 0 {
if err == nil { if len(errs) == 0 {
t.Errorf("%s: v.validate() is expected to fail.", test.desc) t.Errorf("%s: v.validate() is expected to fail.", test.desc)
} else if test.err.Error() != err.Error() { } else if len(errs) != len(test.errs) {
t.Errorf("%s: v.validate(): err = %q, want = %q", test.desc, err, test.err) t.Errorf("%s: v.validate(): errs = %q, want = %q", test.desc, errs, test.errs)
} else {
for i, v := range test.errs {
if v.Error() != errs[i].Error() {
t.Errorf("%s: v.validate(): errs = %q, want = %q", test.desc, errs, test.errs)
}
}
} }
} }
}) })

View File

@ -18,8 +18,6 @@ package system
import ( import (
"fmt" "fmt"
errorsutil "k8s.io/apimachinery/pkg/util/errors"
) )
// Validator is the interface for all validators. // Validator is the interface for all validators.
@ -27,7 +25,7 @@ type Validator interface {
// Name is the name of the validator. // Name is the name of the validator.
Name() string Name() string
// Validate is the validate function. // Validate is the validate function.
Validate(SysSpec) (error, error) Validate(SysSpec) ([]error, []error)
} }
// Reporter is the interface for the reporters for the validators. // Reporter is the interface for the reporters for the validators.
@ -37,21 +35,25 @@ type Reporter interface {
} }
// Validate uses validators to validate the system and returns a warning or error. // Validate uses validators to validate the system and returns a warning or error.
func Validate(spec SysSpec, validators []Validator) (error, error) { func Validate(spec SysSpec, validators []Validator) ([]error, []error) {
var errs []error var errs []error
var warns []error var warns []error
for _, v := range validators { for _, v := range validators {
fmt.Printf("Validating %s...\n", v.Name()) fmt.Printf("Validating %s...\n", v.Name())
warn, err := v.Validate(spec) warn, err := v.Validate(spec)
errs = append(errs, err) if len(err) != 0 {
warns = append(warns, warn) errs = append(errs, err...)
}
if len(warn) != 0 {
warns = append(warns, warn...)
}
} }
return errorsutil.NewAggregate(warns), errorsutil.NewAggregate(errs) return warns, errs
} }
// ValidateSpec uses all default validators to validate the system and writes to stdout. // ValidateSpec uses all default validators to validate the system and writes to stdout.
func ValidateSpec(spec SysSpec, runtime string) (error, error) { func ValidateSpec(spec SysSpec, runtime string) ([]error, []error) {
// OS-level validators. // OS-level validators.
var osValidators = []Validator{ var osValidators = []Validator{
&OSValidator{Reporter: DefaultReporter}, &OSValidator{Reporter: DefaultReporter},

View File

@ -125,7 +125,7 @@ func TestE2eNode(t *testing.T) {
klog.Exitf("chroot %q failed: %v", rootfs, err) klog.Exitf("chroot %q failed: %v", rootfs, err)
} }
} }
if _, err := system.ValidateSpec(*spec, framework.TestContext.ContainerRuntime); err != nil { if _, err := system.ValidateSpec(*spec, framework.TestContext.ContainerRuntime); len(err) != 0 {
klog.Exitf("system validation failed: %v", err) klog.Exitf("system validation failed: %v", err)
} }
return return