diff --git a/letsencrypt/client/display/ops.py b/letsencrypt/client/display/ops.py index 5a77e0ffb..dc6992c8c 100644 --- a/letsencrypt/client/display/ops.py +++ b/letsencrypt/client/display/ops.py @@ -71,7 +71,11 @@ def pick_plugin(config, default, plugins, question, ifaces): if len(prepared) > 1: logging.debug("Multiple candidate plugins: %s", prepared) - return choose_plugin(prepared.values(), question).init() + plugin_ep = choose_plugin(prepared.values(), question) + if plugin_ep is None: + return None + else: + return plugin_ep.init() elif len(prepared) == 1: plugin_ep = prepared.values()[0] logging.debug("Single candidate plugin: %s", plugin_ep) diff --git a/letsencrypt/client/tests/display/ops_test.py b/letsencrypt/client/tests/display/ops_test.py index 151358f8a..7c5c1f74f 100644 --- a/letsencrypt/client/tests/display/ops_test.py +++ b/letsencrypt/client/tests/display/ops_test.py @@ -102,6 +102,17 @@ class PickPluginTest(unittest.TestCase): mock_choose.assert_called_once_with( [plugin_ep, plugin_ep], self.question) + def test_choose_plugin_none(self): + self.reg.ifaces().verify().available.return_value = { + "bar": None, + "baz": None, + } + + with mock.patch("letsencrypt.client.display" + ".ops.choose_plugin") as mock_choose: + mock_choose.return_value = None + self.assertTrue(self._call() is None) + class ConveniencePickPluginTest(unittest.TestCase): """Tests for letsencrypt.client.display.ops.pick_*."""