From 22b559684f62417d47a0370e5f8f65b9278a9903 Mon Sep 17 00:00:00 2001 From: David Bossanyi Date: Sun, 16 Oct 2022 15:43:15 +0100 Subject: [PATCH] Allow azurestoragequeues transport to be used with Azurite emulator in docker-compose (#1611) * Parse credential as a dict when using Azurite emulator This more flexible credential allows the use of Azurite for integration testing in local docker-compose configurations. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Fix some lint errors Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- kombu/transport/azurestoragequeues.py | 9 ++++++++- t/unit/transport/test_azurestoragequeues.py | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/kombu/transport/azurestoragequeues.py b/kombu/transport/azurestoragequeues.py index 0e3837a8e..ab5900195 100644 --- a/kombu/transport/azurestoragequeues.py +++ b/kombu/transport/azurestoragequeues.py @@ -178,7 +178,7 @@ class Transport(virtual.Transport): can_parse_url = True @staticmethod - def parse_uri(uri: str) -> tuple[str, str]: + def parse_uri(uri: str) -> tuple[str | dict, str]: # URL like: # azurestoragequeues://STORAGE_ACCOUNT_ACCESS_KEY@STORAGE_ACCOUNT_URL # azurestoragequeues://SAS_TOKEN@STORAGE_ACCOUNT_URL @@ -192,6 +192,13 @@ def parse_uri(uri: str) -> tuple[str, str]: # > 'some/key', 'url' credential, url = uri.rsplit('@', 1) + # parse credential as a dict if Azurite is being used + if "devstoreaccount1" in url and ".core.windows.net" not in url: + credential = { + "account_name": "devstoreaccount1", + "account_key": credential, + } + # Validate parameters assert all([credential, url]) except Exception: diff --git a/t/unit/transport/test_azurestoragequeues.py b/t/unit/transport/test_azurestoragequeues.py index d5568cbbe..44fa859be 100644 --- a/t/unit/transport/test_azurestoragequeues.py +++ b/t/unit/transport/test_azurestoragequeues.py @@ -11,6 +11,8 @@ URL_NOCREDS = 'azurestoragequeues://' URL_CREDS = 'azurestoragequeues://sas/key%@https://STORAGE_ACCOUNT_NAME.queue.core.windows.net/' # noqa +AZURITE_CREDS = 'azurestoragequeues://Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==@http://localhost:10001/devstoreaccount1' # noqa +AZURITE_CREDS_DOCKER_COMPOSE = 'azurestoragequeues://Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==@http://azurite:10001/devstoreaccount1' # noqa def test_queue_service_nocredentials(): @@ -31,3 +33,22 @@ def test_queue_service(): # Check the SAS token "sas/key%" has been parsed from the url correctly assert channel._credential == 'sas/key%' assert channel._url == 'https://STORAGE_ACCOUNT_NAME.queue.core.windows.net/' # noqa + + +@pytest.mark.parametrize( + "creds, hostname", + [ + (AZURITE_CREDS, 'localhost'), + (AZURITE_CREDS_DOCKER_COMPOSE, 'azurite'), + ] +) +def test_queue_service_works_for_azurite(creds, hostname): + conn = Connection(creds, transport=azurestoragequeues.Transport) + with patch('kombu.transport.azurestoragequeues.QueueServiceClient'): + channel = conn.channel() + + assert channel._credential == { + 'account_name': 'devstoreaccount1', + 'account_key': 'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==' # noqa + } + assert channel._url == f'http://{hostname}:10001/devstoreaccount1' # noqa