diff --git a/kafka/sasl/gssapi.py b/kafka/sasl/gssapi.py index 4785b1b75..5f86b8343 100644 --- a/kafka/sasl/gssapi.py +++ b/kafka/sasl/gssapi.py @@ -2,15 +2,6 @@ import struct -# needed for SASL_GSSAPI authentication: -try: - import gssapi - from gssapi.raw.misc import GSSError -except (ImportError, OSError): - #no gssapi available, will disable gssapi mechanism - gssapi = None - GSSError = None - from kafka.sasl.abc import SaslMechanism @@ -23,6 +14,10 @@ class SaslMechanismGSSAPI(SaslMechanism): SASL_QOP_AUTH_CONF = 4 def __init__(self, **config): + try: + import gssapi + except (ImportError, OSError): + gssapi = None assert gssapi is not None, 'GSSAPI lib not available' if 'sasl_kerberos_name' not in config and 'sasl_kerberos_service_name' not in config: raise ValueError('sasl_kerberos_service_name or sasl_kerberos_name required for GSSAPI sasl configuration') diff --git a/test/sasl/test_gssapi.py b/test/sasl/test_gssapi.py index aa1d86b9e..fceb104e6 100644 --- a/test/sasl/test_gssapi.py +++ b/test/sasl/test_gssapi.py @@ -1,10 +1,14 @@ from __future__ import absolute_import +import sys + try: from unittest import mock except ImportError: import mock +import pytest + from kafka.sasl import get_sasl_mechanism import kafka.sasl.gssapi @@ -23,9 +27,10 @@ def mocked_message_wrapper(msg, *args): return wrapped client_ctx.unwrap.side_effect = mocked_message_wrapper client_ctx.wrap.side_effect = mocked_message_wrapper - kafka.sasl.gssapi.gssapi = mock.Mock() - kafka.sasl.gssapi.gssapi.SecurityContext.return_value = client_ctx - gssapi = get_sasl_mechanism('GSSAPI')(**config) + gssapi_mock = mock.Mock() + gssapi_mock.SecurityContext.return_value = client_ctx + with mock.patch.dict(sys.modules, {'gssapi': gssapi_mock}): + gssapi = get_sasl_mechanism('GSSAPI')(**config) assert isinstance(gssapi, kafka.sasl.gssapi.SaslMechanismGSSAPI) client_ctx.step.assert_called_with(None) @@ -40,3 +45,9 @@ def mocked_message_wrapper(msg, *args): assert gssapi.is_done() assert gssapi.is_authenticated() + + +def test_gssapi_unavailable(): + with mock.patch.dict(sys.modules, {'gssapi': None}): + with pytest.raises(AssertionError, match='GSSAPI lib not available'): + kafka.sasl.gssapi.SaslMechanismGSSAPI(sasl_kerberos_service_name='bar')