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>
This commit is contained in:
David Bossanyi 2022-10-16 15:43:15 +01:00 committed by GitHub
parent c7615fc537
commit 22b559684f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 1 deletions

View File

@ -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 @@ class Transport(virtual.Transport):
# > '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:

View File

@ -11,6 +11,8 @@ from kombu.transport import azurestoragequeues # noqa
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