Improve error feedback when plugin does not implement desired interface

Signed-off-by: Wilson Júnior <wilsonpjunior@gmail.com>
This commit is contained in:
Wilson Júnior 2020-04-10 14:05:42 -03:00
parent 9c71a2be31
commit 964731e1d3
No known key found for this signature in database
GPG key ID: 12A777ECA55D23D9
2 changed files with 20 additions and 7 deletions

View file

@ -41,7 +41,11 @@ func ListDrivers() []string {
}
func (lf *logdriverFactory) register(name string, c Creator) error {
if lf.driverRegistered(name) {
registered, err := lf.driverRegistered(name)
if err != nil {
return err
}
if registered {
return fmt.Errorf("logger: log driver named '%s' is already registered", name)
}
@ -51,18 +55,22 @@ func (lf *logdriverFactory) register(name string, c Creator) error {
return nil
}
func (lf *logdriverFactory) driverRegistered(name string) bool {
func (lf *logdriverFactory) driverRegistered(name string) (bool, error) {
lf.m.Lock()
_, ok := lf.registry[name]
lf.m.Unlock()
if !ok {
if pluginGetter != nil { // this can be nil when the init functions are running
if l, _ := getPlugin(name, plugingetter.Lookup); l != nil {
return true
l, err := getPlugin(name, plugingetter.Lookup)
if err != nil {
return false, err
}
if l != nil {
return true, nil
}
}
}
return ok
return ok, nil
}
func (lf *logdriverFactory) registerLogOptValidator(name string, l LogOptValidator) error {
@ -147,7 +155,11 @@ func ValidateLogOpts(name string, cfg map[string]string) error {
return err
}
if !factory.driverRegistered(name) {
registered, err := factory.driverRegistered(name)
if err != nil {
return err
}
if !registered {
return fmt.Errorf("logger: no log driver named '%s' is registered", name)
}

View file

@ -10,12 +10,13 @@ source hack/make/.integration-test-helpers
: "${DOCKER_PY_COMMIT:=4.2.0}"
# custom options to pass py.test
# TODO remove these skip once we update to a docker-py version that has https://github.com/docker/docker-py/pull/2549: CreateContainerTest::test_invalid_log_driver_raises_exception
#
# This option can be used to temporarily skip flaky tests (using the `--deselect`
# flag) until they are fixed upstream. For example:
# --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream
# TODO re-enable test after https://github.com/docker/docker-py/issues/2513 has been resolved
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream}"
: "${PY_TEST_OPTIONS:=--junitxml=${DEST}/junit-report.xml --deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream --deselect=tests/integration/api_container_test.py::CreateContainerTest::test_invalid_log_driver_raises_exception}"
(
bundle .integration-daemon-start