From 7c2cac612ddd5c11da04aed8d1a0c6497e7d433f Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Fri, 26 Jun 2020 11:58:34 -0700 Subject: [PATCH] Fix bug in FailFastError and add unit test Since FailFastError was just another `error`, all errors were technically `FailFastErrors`. This code makes `FailFastError` a struct which implements the error interface, so that now errors can be distinctly identified as `FailFastError`' Also added a unit test to prove that this works now. --- pkg/drivers/kic/oci/errors.go | 12 ++++++-- pkg/drivers/kic/oci/errors_test.go | 45 ++++++++++++++++++++++++++++++ pkg/minikube/node/start.go | 2 +- 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 pkg/drivers/kic/oci/errors_test.go diff --git a/pkg/drivers/kic/oci/errors.go b/pkg/drivers/kic/oci/errors.go index d5443c37cb..0f5d7be0a1 100644 --- a/pkg/drivers/kic/oci/errors.go +++ b/pkg/drivers/kic/oci/errors.go @@ -24,13 +24,19 @@ import ( ) // FailFastError type is an error that could not be solved by trying again -type FailFastError error +type FailFastError struct { + Err error +} + +func (f *FailFastError) Error() string { + return f.Err.Error() +} // ErrWindowsContainers is thrown when docker been configured to run windows containers instead of Linux -var ErrWindowsContainers = FailFastError(errors.New("docker container type is windows")) +var ErrWindowsContainers = &FailFastError{errors.New("docker container type is windows")} // ErrCPUCountLimit is thrown when docker daemon doesn't have enough CPUs for the requested container -var ErrCPUCountLimit = FailFastError(errors.New("not enough CPUs is available for container")) +var ErrCPUCountLimit = &FailFastError{errors.New("not enough CPUs is available for container")} // ErrExitedUnexpectedly is thrown when container is created/started without error but later it exists and it's status is not running anymore. var ErrExitedUnexpectedly = errors.New("container exited unexpectedly") diff --git a/pkg/drivers/kic/oci/errors_test.go b/pkg/drivers/kic/oci/errors_test.go new file mode 100644 index 0000000000..379a4d8400 --- /dev/null +++ b/pkg/drivers/kic/oci/errors_test.go @@ -0,0 +1,45 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package oci + +import "testing" + +func TestFailFastError(t *testing.T) { + tcs := []struct { + description string + err error + shouldBeFailFast bool + }{ + { + description: "fail fast error", + err: ErrWindowsContainers, + shouldBeFailFast: true, + }, { + description: "not a fail fast error", + err: ErrExitedUnexpectedly, + }, + } + + for _, tc := range tcs { + t.Run(tc.description, func(t *testing.T) { + _, ff := tc.err.(*FailFastError) + if ff != tc.shouldBeFailFast { + t.Fatalf("expected fail fast to be %v, was %v", tc.shouldBeFailFast, ff) + } + }) + } +} diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index 6541568c06..d43275c959 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -379,7 +379,7 @@ func startHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*h } } - if _, ff := err.(oci.FailFastError); ff { + if _, ff := err.(*oci.FailFastError); ff { glog.Infof("will skip retrying to create machine because error is not retriable: %v", err) return host, exists, err }