From 12d17621d878de7969a4ff5a0f3c90bcb65901b0 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 17:50:38 -0500 Subject: [PATCH 01/23] Test --- .../function_app.py | 49 +++++++++++++++++++ ...st_deferred_bindings_eventhub_functions.py | 43 ++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py create mode 100644 tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py new file mode 100644 index 00000000..2a64d1e2 --- /dev/null +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -0,0 +1,49 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +import json + +import azure.functions as func +import azurefunctions.extensions.bindings.eventhub as eh + +app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) + +# An HttpTrigger to generating EventHub event from EventHub Output Binding +@app.function_name(name="eventhub_output") +@app.route(route="eventhub_output") +@app.event_hub_output(arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString") +def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: + event.set(req.get_body().decode('utf-8')) + return 'OK' + +# This is an actual EventHub trigger which will convert the event data +# into a storage blob. +@app.function_name(name="eventhub_trigger") +@app.event_hub_message_trigger(arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString" + ) +@app.blob_output(arg_name="$return", + path="python-worker-tests/test-eventhub-triggered.txt", + connection="AzureWebJobsStorage") +def eventhub_trigger(event: eh.EventData) -> bytes: + return bytes(event.body_as_str()) + +# Retrieve the event data from storage blob and return it as Http response +@app.function_name(name="get_eventhub_triggered") +@app.route(route="get_eventhub_triggered") +@app.blob_input(arg_name="file", + path="python-worker-tests/test-eventhub-triggered.txt", + connection="AzureWebJobsStorage") +def get_eventhub_triggered(req: func.HttpRequest, + file: func.InputStream) -> str: + return file.read().decode('utf-8') + +@app.event_hub_message_trigger( + arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString" +) +def eventhub_trigger(event: eh.EventHubData) -> str: + return event.body_as_str() \ No newline at end of file diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py new file mode 100644 index 00000000..3c91eea6 --- /dev/null +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -0,0 +1,43 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +import sys +import time +import unittest + +from tests.utils import testutils + + +@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" + "is only supported for 3.9+.") +class TestDeferredBindingsEventHubFunctions(testutils.WebHostTestCase): + + @classmethod + def get_script_dir(cls): + return testutils.EXTENSION_TESTS_FOLDER / 'deferred_bindings_tests' / \ + 'deferred_bindings_eventhub_functions' + + @classmethod + def get_libraries_to_install(cls): + return ['azurefunctions-extensions-bindings-eventhub'] + + def test_ed_eventhub_trigger(self): + data = "DummyData" + + r = self.webhost.request('POST', 'eventhub_output', + data=data.encode('utf-8')) + self.assertEqual(r.status_code, 200) + self.assertEqual(r.text, 'OK') + + # # Once the event get generated, allow function host to poll from + # # EventHub and wait for eventhub_trigger to execute, + # # converting the event metadata into a blob. + # time.sleep(5) + + # # Call get_eventhub_triggered to retrieve event metadata from blob. + # r = self.webhost.request('GET', 'get_eventhub_triggered') + + # # Waiting for the blob get updated with the latest data from the + # # eventhub output binding + # time.sleep(5) + # self.assertEqual(r.status_code, 200) + # response = r.json() \ No newline at end of file From d2425524e0b3050cc3489b6b5d5926b9825b1651 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 19:14:05 -0500 Subject: [PATCH 02/23] Test --- .../function_app.py | 86 +++++++++++-------- ...st_deferred_bindings_eventhub_functions.py | 8 +- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 2a64d1e2..650a811d 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -7,43 +7,53 @@ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -# An HttpTrigger to generating EventHub event from EventHub Output Binding -@app.function_name(name="eventhub_output") -@app.route(route="eventhub_output") -@app.event_hub_output(arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString") -def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: - event.set(req.get_body().decode('utf-8')) - return 'OK' -# This is an actual EventHub trigger which will convert the event data -# into a storage blob. -@app.function_name(name="eventhub_trigger") -@app.event_hub_message_trigger(arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString" - ) -@app.blob_output(arg_name="$return", - path="python-worker-tests/test-eventhub-triggered.txt", +@app.function_name(name="put_bc_trigger") +@app.blob_output(arg_name="file", + path="python-worker-tests/test-blobclient-trigger.txt", connection="AzureWebJobsStorage") -def eventhub_trigger(event: eh.EventData) -> bytes: - return bytes(event.body_as_str()) - -# Retrieve the event data from storage blob and return it as Http response -@app.function_name(name="get_eventhub_triggered") -@app.route(route="get_eventhub_triggered") -@app.blob_input(arg_name="file", - path="python-worker-tests/test-eventhub-triggered.txt", - connection="AzureWebJobsStorage") -def get_eventhub_triggered(req: func.HttpRequest, - file: func.InputStream) -> str: - return file.read().decode('utf-8') - -@app.event_hub_message_trigger( - arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString" -) -def eventhub_trigger(event: eh.EventHubData) -> str: - return event.body_as_str() \ No newline at end of file +@app.route(route="put_bc_trigger") +def put_bc_trigger(req: func.HttpRequest, file: func.Out[str]) -> str: + file.set(req.get_body()) + return 'OK' + +# An HttpTrigger to generating EventHub event from EventHub Output Binding +# @app.function_name(name="eventhub_output") +# @app.route(route="eventhub_output") +# @app.event_hub_output(arg_name="event", +# event_hub_name="python-worker-ci-eventhub-one", +# connection="AzureWebJobsEventHubConnectionString") +# def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: +# event.set(req.get_body().decode('utf-8')) +# return 'OK' + +# # This is an actual EventHub trigger which will convert the event data +# # into a storage blob. +# @app.function_name(name="eventhub_trigger") +# @app.event_hub_message_trigger(arg_name="event", +# event_hub_name="python-worker-ci-eventhub-one", +# connection="AzureWebJobsEventHubConnectionString" +# ) +# @app.blob_output(arg_name="$return", +# path="python-worker-tests/test-eventhub-triggered.txt", +# connection="AzureWebJobsStorage") +# def eventhub_trigger(event: eh.EventData) -> bytes: +# return bytes(event.body_as_str()) + +# # Retrieve the event data from storage blob and return it as Http response +# @app.function_name(name="get_eventhub_triggered") +# @app.route(route="get_eventhub_triggered") +# @app.blob_input(arg_name="file", +# path="python-worker-tests/test-eventhub-triggered.txt", +# connection="AzureWebJobsStorage") +# def get_eventhub_triggered(req: func.HttpRequest, +# file: func.InputStream) -> str: +# return file.read().decode('utf-8') + +# @app.event_hub_message_trigger( +# arg_name="event", +# event_hub_name="python-worker-ci-eventhub-one", +# connection="AzureWebJobsEventHubConnectionString" +# ) +# def eventhub_trigger(event: eh.EventHubData) -> str: +# return event.body_as_str() \ No newline at end of file diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 3c91eea6..855bef85 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -21,12 +21,12 @@ def get_libraries_to_install(cls): return ['azurefunctions-extensions-bindings-eventhub'] def test_ed_eventhub_trigger(self): - data = "DummyData" + # data = "DummyData" - r = self.webhost.request('POST', 'eventhub_output', - data=data.encode('utf-8')) + r = self.webhost.request('POST', 'put_bc_trigger', + data="test") self.assertEqual(r.status_code, 200) - self.assertEqual(r.text, 'OK') + # self.assertEqual(r.text, 'OK') # # Once the event get generated, allow function host to poll from # # EventHub and wait for eventhub_trigger to execute, From bcee98dee642041445a16abfbba1b8a37f2b0238 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 20:17:32 -0500 Subject: [PATCH 03/23] Check issue --- .../function_app.py | 32 +++++++++---------- ...st_deferred_bindings_eventhub_functions.py | 7 ++-- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 650a811d..0d2701c0 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -8,24 +8,24 @@ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -@app.function_name(name="put_bc_trigger") -@app.blob_output(arg_name="file", - path="python-worker-tests/test-blobclient-trigger.txt", - connection="AzureWebJobsStorage") -@app.route(route="put_bc_trigger") -def put_bc_trigger(req: func.HttpRequest, file: func.Out[str]) -> str: - file.set(req.get_body()) - return 'OK' +# @app.function_name(name="put_bc_trigger") +# @app.blob_output(arg_name="file", +# path="python-worker-tests/test-blobclient-trigger.txt", +# connection="AzureWebJobsStorage") +# @app.route(route="put_bc_trigger") +# def put_bc_trigger(req: func.HttpRequest, file: func.Out[str]) -> str: +# file.set(req.get_body()) +# return 'OK' # An HttpTrigger to generating EventHub event from EventHub Output Binding -# @app.function_name(name="eventhub_output") -# @app.route(route="eventhub_output") -# @app.event_hub_output(arg_name="event", -# event_hub_name="python-worker-ci-eventhub-one", -# connection="AzureWebJobsEventHubConnectionString") -# def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: -# event.set(req.get_body().decode('utf-8')) -# return 'OK' +@app.function_name(name="eventhub_output") +@app.event_hub_output(arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString") +@app.route(route="eventhub_output") +def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: + # event.set(req.get_body().decode('utf-8')) + return 'OK' # # This is an actual EventHub trigger which will convert the event data # # into a storage blob. diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 855bef85..a5ec7998 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -1,5 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. +import os import sys import time import unittest @@ -23,10 +24,10 @@ def get_libraries_to_install(cls): def test_ed_eventhub_trigger(self): # data = "DummyData" - r = self.webhost.request('POST', 'put_bc_trigger', + r = self.webhost.request('POST', 'eventhub_output', data="test") - self.assertEqual(r.status_code, 200) - # self.assertEqual(r.text, 'OK') + # self.assertEqual(r.status_code, 200) + self.assertEqual(r.text, f"AzureWebJobsEventHubConnectionString: {os.getenv('AzureWebJobsEventHubConnectionString')}, AzureWebJobsStorage: {os.getenv('AzureWebJobsStorage')}") # # Once the event get generated, allow function host to poll from # # EventHub and wait for eventhub_trigger to execute, From 5dd7f53471be913de6fa16ea236f3ee5af896000 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 20:54:45 -0500 Subject: [PATCH 04/23] Check issue --- __azurite_db_queue__.json | 1 + __azurite_db_queue_extent__.json | 1 + .../test_deferred_bindings_eventhub_functions.py | 4 ++-- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 __azurite_db_queue__.json create mode 100644 __azurite_db_queue_extent__.json diff --git a/__azurite_db_queue__.json b/__azurite_db_queue__.json new file mode 100644 index 00000000..2d1a5ca7 --- /dev/null +++ b/__azurite_db_queue__.json @@ -0,0 +1 @@ +{"filename":"c:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\__azurite_db_queue__.json","collections":[{"name":"$SERVICES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{},"constraints":null,"uniqueNames":["accountName"],"transforms":{},"objType":"$SERVICES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]},{"name":"$QUEUES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"accountName":{"name":"accountName","dirty":false,"values":[]},"name":{"name":"name","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$QUEUES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]},{"name":"$MESSAGES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"accountName":{"name":"accountName","dirty":false,"values":[]},"queueName":{"name":"queueName","dirty":false,"values":[]},"messageId":{"name":"messageId","dirty":false,"values":[]},"visibleTime":{"name":"visibleTime","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$MESSAGES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]}],"databaseVersion":1.5,"engineVersion":1.5,"autosave":true,"autosaveInterval":5000,"autosaveHandle":null,"throttledSaves":true,"options":{"persistenceMethod":"fs","autosave":true,"autosaveInterval":5000,"serializationMethod":"normal","destructureDelimiter":"$<\n"},"persistenceMethod":"fs","persistenceAdapter":null,"verbose":false,"events":{"init":[null],"loaded":[],"flushChanges":[],"close":[],"changes":[],"warning":[]},"ENV":"NODEJS"} \ No newline at end of file diff --git a/__azurite_db_queue_extent__.json b/__azurite_db_queue_extent__.json new file mode 100644 index 00000000..20444f42 --- /dev/null +++ b/__azurite_db_queue_extent__.json @@ -0,0 +1 @@ +{"filename":"c:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\__azurite_db_queue_extent__.json","collections":[{"name":"$EXTENTS_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"id":{"name":"id","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$EXTENTS_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]}],"databaseVersion":1.5,"engineVersion":1.5,"autosave":true,"autosaveInterval":5000,"autosaveHandle":null,"throttledSaves":true,"options":{"persistenceMethod":"fs","autosave":true,"autosaveInterval":5000,"serializationMethod":"normal","destructureDelimiter":"$<\n"},"persistenceMethod":"fs","persistenceAdapter":null,"verbose":false,"events":{"init":[null],"loaded":[],"flushChanges":[],"close":[],"changes":[],"warning":[]},"ENV":"NODEJS"} \ No newline at end of file diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index a5ec7998..9466df3c 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -26,8 +26,8 @@ def test_ed_eventhub_trigger(self): r = self.webhost.request('POST', 'eventhub_output', data="test") - # self.assertEqual(r.status_code, 200) - self.assertEqual(r.text, f"AzureWebJobsEventHubConnectionString: {os.getenv('AzureWebJobsEventHubConnectionString')}, AzureWebJobsStorage: {os.getenv('AzureWebJobsStorage')}") + self.assertEqual(r.status_code, 200) + self.assertEqual(r.text, 'OK') # # Once the event get generated, allow function host to poll from # # EventHub and wait for eventhub_trigger to execute, From 46ffbdd3f8813b1ab07ec41b95220cf50d606aa0 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 21:29:09 -0500 Subject: [PATCH 05/23] Fix --- .../function_app.py | 43 +++++++++---------- ...st_deferred_bindings_eventhub_functions.py | 10 ++--- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 0d2701c0..6363301c 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -27,28 +27,27 @@ def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: # event.set(req.get_body().decode('utf-8')) return 'OK' -# # This is an actual EventHub trigger which will convert the event data -# # into a storage blob. -# @app.function_name(name="eventhub_trigger") -# @app.event_hub_message_trigger(arg_name="event", -# event_hub_name="python-worker-ci-eventhub-one", -# connection="AzureWebJobsEventHubConnectionString" -# ) -# @app.blob_output(arg_name="$return", -# path="python-worker-tests/test-eventhub-triggered.txt", -# connection="AzureWebJobsStorage") -# def eventhub_trigger(event: eh.EventData) -> bytes: -# return bytes(event.body_as_str()) - -# # Retrieve the event data from storage blob and return it as Http response -# @app.function_name(name="get_eventhub_triggered") -# @app.route(route="get_eventhub_triggered") -# @app.blob_input(arg_name="file", -# path="python-worker-tests/test-eventhub-triggered.txt", -# connection="AzureWebJobsStorage") -# def get_eventhub_triggered(req: func.HttpRequest, -# file: func.InputStream) -> str: -# return file.read().decode('utf-8') +# This is an actual EventHub trigger which will convert the event data +# into a storage blob. +@app.function_name(name="eventhub_trigger") +@app.event_hub_message_trigger(arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString") +@app.blob_output(arg_name="$return", + path="python-worker-tests/test-eventhub-triggered.txt", + connection="AzureWebJobsStorage") +def eventhub_trigger(event: eh.EventData) -> bytes: + return bytes(event.body_as_str()) + +# Retrieve the event data from storage blob and return it as Http response +@app.function_name(name="get_eventhub_triggered") +@app.route(route="get_eventhub_triggered") +@app.blob_input(arg_name="file", + path="python-worker-tests/test-eventhub-triggered.txt", + connection="AzureWebJobsStorage") +def get_eventhub_triggered(req: func.HttpRequest, + file: func.InputStream) -> str: + return file.read().decode('utf-8') # @app.event_hub_message_trigger( # arg_name="event", diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 9466df3c..8fde56a3 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -32,13 +32,13 @@ def test_ed_eventhub_trigger(self): # # Once the event get generated, allow function host to poll from # # EventHub and wait for eventhub_trigger to execute, # # converting the event metadata into a blob. - # time.sleep(5) + time.sleep(5) # # Call get_eventhub_triggered to retrieve event metadata from blob. - # r = self.webhost.request('GET', 'get_eventhub_triggered') + r = self.webhost.request('GET', 'get_eventhub_triggered') # # Waiting for the blob get updated with the latest data from the - # # eventhub output binding - # time.sleep(5) - # self.assertEqual(r.status_code, 200) + # eventhub output binding + time.sleep(5) + self.assertEqual(r.status_code, 200) # response = r.json() \ No newline at end of file From 108e38f791c02dd12001b84c507d2e4caf3b6a30 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Sun, 27 Apr 2025 22:34:30 -0500 Subject: [PATCH 06/23] Fix --- .../test_deferred_bindings_eventhub_functions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 8fde56a3..28c3d874 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -21,6 +21,7 @@ def get_script_dir(cls): def get_libraries_to_install(cls): return ['azurefunctions-extensions-bindings-eventhub'] + @testutils.retryable_test(3, 5) def test_ed_eventhub_trigger(self): # data = "DummyData" From 42df3410aa98b138012b353de50e842fa3b76b58 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 01:25:28 -0500 Subject: [PATCH 07/23] Debug --- .../deferred_bindings_eventhub_functions/function_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 6363301c..68167219 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -24,7 +24,7 @@ connection="AzureWebJobsEventHubConnectionString") @app.route(route="eventhub_output") def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: - # event.set(req.get_body().decode('utf-8')) + event.set('debug') return 'OK' # This is an actual EventHub trigger which will convert the event data From 4e42516c13d3e53e21a3dbf0523369b2d4e6aa63 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 02:09:26 -0500 Subject: [PATCH 08/23] Rm azurite --- __azurite_db_queue__.json | 1 - __azurite_db_queue_extent__.json | 1 - 2 files changed, 2 deletions(-) delete mode 100644 __azurite_db_queue__.json delete mode 100644 __azurite_db_queue_extent__.json diff --git a/__azurite_db_queue__.json b/__azurite_db_queue__.json deleted file mode 100644 index 2d1a5ca7..00000000 --- a/__azurite_db_queue__.json +++ /dev/null @@ -1 +0,0 @@ -{"filename":"c:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\__azurite_db_queue__.json","collections":[{"name":"$SERVICES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{},"constraints":null,"uniqueNames":["accountName"],"transforms":{},"objType":"$SERVICES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]},{"name":"$QUEUES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"accountName":{"name":"accountName","dirty":false,"values":[]},"name":{"name":"name","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$QUEUES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]},{"name":"$MESSAGES_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"accountName":{"name":"accountName","dirty":false,"values":[]},"queueName":{"name":"queueName","dirty":false,"values":[]},"messageId":{"name":"messageId","dirty":false,"values":[]},"visibleTime":{"name":"visibleTime","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$MESSAGES_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]}],"databaseVersion":1.5,"engineVersion":1.5,"autosave":true,"autosaveInterval":5000,"autosaveHandle":null,"throttledSaves":true,"options":{"persistenceMethod":"fs","autosave":true,"autosaveInterval":5000,"serializationMethod":"normal","destructureDelimiter":"$<\n"},"persistenceMethod":"fs","persistenceAdapter":null,"verbose":false,"events":{"init":[null],"loaded":[],"flushChanges":[],"close":[],"changes":[],"warning":[]},"ENV":"NODEJS"} \ No newline at end of file diff --git a/__azurite_db_queue_extent__.json b/__azurite_db_queue_extent__.json deleted file mode 100644 index 20444f42..00000000 --- a/__azurite_db_queue_extent__.json +++ /dev/null @@ -1 +0,0 @@ -{"filename":"c:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\__azurite_db_queue_extent__.json","collections":[{"name":"$EXTENTS_COLLECTION$","data":[],"idIndex":null,"binaryIndices":{"id":{"name":"id","dirty":false,"values":[]}},"constraints":null,"uniqueNames":[],"transforms":{},"objType":"$EXTENTS_COLLECTION$","dirty":false,"cachedIndex":null,"cachedBinaryIndex":null,"cachedData":null,"adaptiveBinaryIndices":true,"transactional":false,"cloneObjects":false,"cloneMethod":"parse-stringify","asyncListeners":false,"disableMeta":false,"disableChangesApi":true,"disableDeltaChangesApi":true,"autoupdate":false,"serializableIndices":true,"disableFreeze":true,"ttl":null,"maxId":0,"DynamicViews":[],"events":{"insert":[],"update":[],"pre-insert":[],"pre-update":[],"close":[],"flushbuffer":[],"error":[],"delete":[null],"warning":[null]},"changes":[],"dirtyIds":[]}],"databaseVersion":1.5,"engineVersion":1.5,"autosave":true,"autosaveInterval":5000,"autosaveHandle":null,"throttledSaves":true,"options":{"persistenceMethod":"fs","autosave":true,"autosaveInterval":5000,"serializationMethod":"normal","destructureDelimiter":"$<\n"},"persistenceMethod":"fs","persistenceAdapter":null,"verbose":false,"events":{"init":[null],"loaded":[],"flushChanges":[],"close":[],"changes":[],"warning":[]},"ENV":"NODEJS"} \ No newline at end of file From 370b9cbe2d124474cb4ee021b2f13afe5e8b1263 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 10:17:08 -0500 Subject: [PATCH 09/23] Try with EHE --- .../function_app.py | 70 +++++++++---------- ...st_deferred_bindings_eventhub_functions.py | 30 ++++---- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 68167219..bb2b70e4 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -1,58 +1,52 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. import json +import typing import azure.functions as func -import azurefunctions.extensions.bindings.eventhub as eh +# import azurefunctions.extensions.bindings.eventhub as eh app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -# @app.function_name(name="put_bc_trigger") -# @app.blob_output(arg_name="file", -# path="python-worker-tests/test-blobclient-trigger.txt", -# connection="AzureWebJobsStorage") -# @app.route(route="put_bc_trigger") -# def put_bc_trigger(req: func.HttpRequest, file: func.Out[str]) -> str: -# file.set(req.get_body()) -# return 'OK' - -# An HttpTrigger to generating EventHub event from EventHub Output Binding -@app.function_name(name="eventhub_output") +@app.function_name(name="put_eh_trigger") @app.event_hub_output(arg_name="event", event_hub_name="python-worker-ci-eventhub-one", connection="AzureWebJobsEventHubConnectionString") -@app.route(route="eventhub_output") -def eventhub_output(req: func.HttpRequest, event: func.Out[str]) -> str: - event.set('debug') +@app.route(route="put_eh_trigger") +def put_eh_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: + event.set(req.get_body()) return 'OK' -# This is an actual EventHub trigger which will convert the event data -# into a storage blob. -@app.function_name(name="eventhub_trigger") -@app.event_hub_message_trigger(arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString") +@app.function_name(name="eh_ed_trigger") +@app.event_hub_message_trigger( + arg_name="event", + event_hub_name="python-worker-ci-eventhub-one-metadata", + connection="AzureWebJobsEventHubConnectionString") @app.blob_output(arg_name="$return", - path="python-worker-tests/test-eventhub-triggered.txt", + path="python-worker-tests/test-metadata-triggered.txt", connection="AzureWebJobsStorage") -def eventhub_trigger(event: eh.EventData) -> bytes: - return bytes(event.body_as_str()) +async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: + event_dict: typing.Mapping[str, typing.Any] = { + 'body': event.get_body().decode('utf-8'), + # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions + # 'enqueued_time': event.enqueued_time.isoformat(), + 'partition_key': event.partition_key, + 'sequence_number': event.sequence_number, + 'offset': event.offset, + 'metadata': event.metadata + } + + return json.dumps(event_dict) # Retrieve the event data from storage blob and return it as Http response -@app.function_name(name="get_eventhub_triggered") -@app.route(route="get_eventhub_triggered") +@app.function_name(name="get_eh_ed_triggered") +@app.route(route="get_eh_ed_triggered") @app.blob_input(arg_name="file", - path="python-worker-tests/test-eventhub-triggered.txt", + path="python-worker-tests/test-metadata-triggered.txt", connection="AzureWebJobsStorage") -def get_eventhub_triggered(req: func.HttpRequest, - file: func.InputStream) -> str: - return file.read().decode('utf-8') - -# @app.event_hub_message_trigger( -# arg_name="event", -# event_hub_name="python-worker-ci-eventhub-one", -# connection="AzureWebJobsEventHubConnectionString" -# ) -# def eventhub_trigger(event: eh.EventHubData) -> str: -# return event.body_as_str() \ No newline at end of file +async def get_eh_ed_triggered(req: func.HttpRequest, + file: func.InputStream) -> str: + return func.HttpResponse(body=file.read().decode('utf-8'), + status_code=200, + mimetype='application/json') \ No newline at end of file diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 28c3d874..29523180 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -1,6 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import os +import json import sys import time import unittest @@ -23,23 +23,29 @@ def get_libraries_to_install(cls): @testutils.retryable_test(3, 5) def test_ed_eventhub_trigger(self): - # data = "DummyData" - - r = self.webhost.request('POST', 'eventhub_output', - data="test") + # Generate a unique event body for EventHub eventme + random_number = str(round(time.time()) % 1000) + req_body = { + 'body': random_number + } + + r = self.webhost.request('POST', 'put_eh_trigger', + data=json.dumps(req_body)) self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') - # # Once the event get generated, allow function host to poll from - # # EventHub and wait for eventhub_trigger to execute, - # # converting the event metadata into a blob. + # Once the event get generated, allow function host to poll from + # EventHub and wait for eventhub_trigger to execute, + # converting the event metadata into a blob. time.sleep(5) - # # Call get_eventhub_triggered to retrieve event metadata from blob. - r = self.webhost.request('GET', 'get_eventhub_triggered') + # Call get_eh_ed_triggered to retrieve event metadata from blob. + r = self.webhost.request('GET', 'get_eh_ed_triggered') - # # Waiting for the blob get updated with the latest data from the + # Waiting for the blob to get updated with the latest data from the # eventhub output binding time.sleep(5) self.assertEqual(r.status_code, 200) - # response = r.json() \ No newline at end of file + + event = r.json() + self.assertEqual(event['body'], random_number) \ No newline at end of file From e48ed85447da33dcdff19b102116df3e354a9f8a Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 10:59:55 -0500 Subject: [PATCH 10/23] Try with EHE --- .../deferred_bindings_eventhub_functions/function_app.py | 8 ++++---- .../test_deferred_bindings_eventhub_functions.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index bb2b70e4..e98b7d8b 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -9,19 +9,19 @@ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -@app.function_name(name="put_eh_trigger") +@app.function_name(name="put_eh_ed_trigger") @app.event_hub_output(arg_name="event", event_hub_name="python-worker-ci-eventhub-one", connection="AzureWebJobsEventHubConnectionString") -@app.route(route="put_eh_trigger") -def put_eh_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: +@app.route(route="put_eh_ed_trigger") +def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: event.set(req.get_body()) return 'OK' @app.function_name(name="eh_ed_trigger") @app.event_hub_message_trigger( arg_name="event", - event_hub_name="python-worker-ci-eventhub-one-metadata", + event_hub_name="python-worker-ci-eventhub-one", connection="AzureWebJobsEventHubConnectionString") @app.blob_output(arg_name="$return", path="python-worker-tests/test-metadata-triggered.txt", diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 29523180..09f7a376 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -29,7 +29,7 @@ def test_ed_eventhub_trigger(self): 'body': random_number } - r = self.webhost.request('POST', 'put_eh_trigger', + r = self.webhost.request('POST', 'put_eh_ed_trigger', data=json.dumps(req_body)) self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') From 4db1bbe0103f1502582a873d15b6d70c8f14c184 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 11:01:32 -0500 Subject: [PATCH 11/23] Try with EHE --- .../deferred_bindings_eventhub_functions/function_app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index e98b7d8b..0d15b8b5 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -24,7 +24,7 @@ def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: event_hub_name="python-worker-ci-eventhub-one", connection="AzureWebJobsEventHubConnectionString") @app.blob_output(arg_name="$return", - path="python-worker-tests/test-metadata-triggered.txt", + path="python-worker-tests/test-eventhub-triggered.txt", connection="AzureWebJobsStorage") async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: event_dict: typing.Mapping[str, typing.Any] = { @@ -43,7 +43,7 @@ async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: @app.function_name(name="get_eh_ed_triggered") @app.route(route="get_eh_ed_triggered") @app.blob_input(arg_name="file", - path="python-worker-tests/test-metadata-triggered.txt", + path="python-worker-tests/test-eventhub-triggered.txt", connection="AzureWebJobsStorage") async def get_eh_ed_triggered(req: func.HttpRequest, file: func.InputStream) -> str: From 9d6698634ba5cab95c1f25f5d229887210a740a7 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 11:54:49 -0500 Subject: [PATCH 12/23] Test --- ...st_deferred_bindings_eventhub_functions.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py index 09f7a376..ec164ada 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py @@ -34,18 +34,18 @@ def test_ed_eventhub_trigger(self): self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') - # Once the event get generated, allow function host to poll from - # EventHub and wait for eventhub_trigger to execute, - # converting the event metadata into a blob. - time.sleep(5) + # # Once the event get generated, allow function host to poll from + # # EventHub and wait for eventhub_trigger to execute, + # # converting the event metadata into a blob. + # time.sleep(5) - # Call get_eh_ed_triggered to retrieve event metadata from blob. - r = self.webhost.request('GET', 'get_eh_ed_triggered') + # # Call get_eh_ed_triggered to retrieve event metadata from blob. + # r = self.webhost.request('GET', 'get_eh_ed_triggered') - # Waiting for the blob to get updated with the latest data from the - # eventhub output binding - time.sleep(5) - self.assertEqual(r.status_code, 200) + # # Waiting for the blob to get updated with the latest data from the + # # eventhub output binding + # time.sleep(5) + # self.assertEqual(r.status_code, 200) - event = r.json() - self.assertEqual(event['body'], random_number) \ No newline at end of file + # event = r.json() + # self.assertEqual(event['body'], random_number) \ No newline at end of file From c97a2ebbcef156d7bc7ccbb4df00dddbbe044a85 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 28 Apr 2025 13:40:24 -0500 Subject: [PATCH 13/23] Test --- .../function_app.py | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py index 0d15b8b5..2af9ccdc 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py @@ -18,26 +18,26 @@ def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: event.set(req.get_body()) return 'OK' -@app.function_name(name="eh_ed_trigger") -@app.event_hub_message_trigger( - arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString") -@app.blob_output(arg_name="$return", - path="python-worker-tests/test-eventhub-triggered.txt", - connection="AzureWebJobsStorage") -async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: - event_dict: typing.Mapping[str, typing.Any] = { - 'body': event.get_body().decode('utf-8'), - # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions - # 'enqueued_time': event.enqueued_time.isoformat(), - 'partition_key': event.partition_key, - 'sequence_number': event.sequence_number, - 'offset': event.offset, - 'metadata': event.metadata - } +# @app.function_name(name="eh_ed_trigger") +# @app.event_hub_message_trigger( +# arg_name="event", +# event_hub_name="python-worker-ci-eventhub-one", +# connection="AzureWebJobsEventHubConnectionString") +# @app.blob_output(arg_name="$return", +# path="python-worker-tests/test-eventhub-triggered.txt", +# connection="AzureWebJobsStorage") +# async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: +# event_dict: typing.Mapping[str, typing.Any] = { +# 'body': event.get_body().decode('utf-8'), +# # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions +# # 'enqueued_time': event.enqueued_time.isoformat(), +# 'partition_key': event.partition_key, +# 'sequence_number': event.sequence_number, +# 'offset': event.offset, +# 'metadata': event.metadata +# } - return json.dumps(event_dict) +# return json.dumps(event_dict) # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_eh_ed_triggered") From 2fbf708d3dcd35594c900561701c417d7dbfc213 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Tue, 29 Apr 2025 11:13:55 -0500 Subject: [PATCH 14/23] Test --- python/test/worker.config.json | 2 +- .../function_app.py | 38 +++++++++---------- .../test_eventhub_deferred_bindings.py} | 25 ++++++------ 3 files changed, 32 insertions(+), 33 deletions(-) rename tests/{extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions => emulator_tests/eventhub_functions/eventhub_deferred_bindings}/function_app.py (58%) rename tests/{extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py => emulator_tests/test_eventhub_deferred_bindings.py} (58%) diff --git a/python/test/worker.config.json b/python/test/worker.config.json index f778e45f..0f4819da 100644 --- a/python/test/worker.config.json +++ b/python/test/worker.config.json @@ -2,7 +2,7 @@ "description":{ "language":"python", "extensions":[".py"], - "defaultExecutablePath":"python", + "defaultExecutablePath":"C:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\.env\\Scripts\\python.exe", "defaultWorkerPath":"worker.py", "workerIndexing": "true", "arguments": ["-X no_debug_ranges"] diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py similarity index 58% rename from tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py rename to tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py index 2af9ccdc..0d15b8b5 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_eventhub_functions/function_app.py +++ b/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py @@ -18,26 +18,26 @@ def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: event.set(req.get_body()) return 'OK' -# @app.function_name(name="eh_ed_trigger") -# @app.event_hub_message_trigger( -# arg_name="event", -# event_hub_name="python-worker-ci-eventhub-one", -# connection="AzureWebJobsEventHubConnectionString") -# @app.blob_output(arg_name="$return", -# path="python-worker-tests/test-eventhub-triggered.txt", -# connection="AzureWebJobsStorage") -# async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: -# event_dict: typing.Mapping[str, typing.Any] = { -# 'body': event.get_body().decode('utf-8'), -# # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions -# # 'enqueued_time': event.enqueued_time.isoformat(), -# 'partition_key': event.partition_key, -# 'sequence_number': event.sequence_number, -# 'offset': event.offset, -# 'metadata': event.metadata -# } +@app.function_name(name="eh_ed_trigger") +@app.event_hub_message_trigger( + arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString") +@app.blob_output(arg_name="$return", + path="python-worker-tests/test-eventhub-triggered.txt", + connection="AzureWebJobsStorage") +async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: + event_dict: typing.Mapping[str, typing.Any] = { + 'body': event.get_body().decode('utf-8'), + # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions + # 'enqueued_time': event.enqueued_time.isoformat(), + 'partition_key': event.partition_key, + 'sequence_number': event.sequence_number, + 'offset': event.offset, + 'metadata': event.metadata + } -# return json.dumps(event_dict) + return json.dumps(event_dict) # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_eh_ed_triggered") diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py b/tests/emulator_tests/test_eventhub_deferred_bindings.py similarity index 58% rename from tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py rename to tests/emulator_tests/test_eventhub_deferred_bindings.py index ec164ada..d07ea569 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_deferred_bindings.py @@ -10,12 +10,11 @@ @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" "is only supported for 3.9+.") -class TestDeferredBindingsEventHubFunctions(testutils.WebHostTestCase): +class TestEventHubDeferredBindings(testutils.WebHostTestCase): @classmethod def get_script_dir(cls): - return testutils.EXTENSION_TESTS_FOLDER / 'deferred_bindings_tests' / \ - 'deferred_bindings_eventhub_functions' + return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' @classmethod def get_libraries_to_install(cls): @@ -34,18 +33,18 @@ def test_ed_eventhub_trigger(self): self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') - # # Once the event get generated, allow function host to poll from - # # EventHub and wait for eventhub_trigger to execute, - # # converting the event metadata into a blob. - # time.sleep(5) + # Once the event get generated, allow function host to poll from + # EventHub and wait for eventhub_trigger to execute, + # converting the event metadata into a blob. + time.sleep(5) - # # Call get_eh_ed_triggered to retrieve event metadata from blob. - # r = self.webhost.request('GET', 'get_eh_ed_triggered') + # Call get_eh_ed_triggered to retrieve event metadata from blob. + r = self.webhost.request('GET', 'get_eh_ed_triggered') - # # Waiting for the blob to get updated with the latest data from the - # # eventhub output binding - # time.sleep(5) - # self.assertEqual(r.status_code, 200) + # Waiting for the blob to get updated with the latest data from the + # eventhub output binding + time.sleep(5) + self.assertEqual(r.status_code, 200) # event = r.json() # self.assertEqual(event['body'], random_number) \ No newline at end of file From 3c9b0d084cbb6bc777845223746ebe052befad6a Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Tue, 29 Apr 2025 11:53:08 -0500 Subject: [PATCH 15/23] Fix --- python/test/worker.config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/test/worker.config.json b/python/test/worker.config.json index 0f4819da..f778e45f 100644 --- a/python/test/worker.config.json +++ b/python/test/worker.config.json @@ -2,7 +2,7 @@ "description":{ "language":"python", "extensions":[".py"], - "defaultExecutablePath":"C:\\Users\\evanroman\\source\\repos\\azure-functions-python-worker\\.env\\Scripts\\python.exe", + "defaultExecutablePath":"python", "defaultWorkerPath":"worker.py", "workerIndexing": "true", "arguments": ["-X no_debug_ranges"] From 32fbe3bc5c3dff1ed55bfa6bff8bd5069de02cfc Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Tue, 29 Apr 2025 12:57:22 -0500 Subject: [PATCH 16/23] Fix --- .../function_app.py | 60 +++++++++---------- .../test_eventhub_deferred_bindings.py | 24 ++++---- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py index 0d15b8b5..2065a196 100644 --- a/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py +++ b/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py @@ -18,35 +18,35 @@ def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: event.set(req.get_body()) return 'OK' -@app.function_name(name="eh_ed_trigger") -@app.event_hub_message_trigger( - arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString") -@app.blob_output(arg_name="$return", - path="python-worker-tests/test-eventhub-triggered.txt", - connection="AzureWebJobsStorage") -async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: - event_dict: typing.Mapping[str, typing.Any] = { - 'body': event.get_body().decode('utf-8'), - # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions - # 'enqueued_time': event.enqueued_time.isoformat(), - 'partition_key': event.partition_key, - 'sequence_number': event.sequence_number, - 'offset': event.offset, - 'metadata': event.metadata - } +# @app.function_name(name="eh_ed_trigger") +# @app.event_hub_message_trigger( +# arg_name="event", +# event_hub_name="python-worker-ci-eventhub-one", +# connection="AzureWebJobsEventHubConnectionString") +# @app.blob_output(arg_name="$return", +# path="python-worker-tests/test-eventhub-triggered.txt", +# connection="AzureWebJobsStorage") +# async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: +# event_dict: typing.Mapping[str, typing.Any] = { +# 'body': event.get_body().decode('utf-8'), +# # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions +# # 'enqueued_time': event.enqueued_time.isoformat(), +# 'partition_key': event.partition_key, +# 'sequence_number': event.sequence_number, +# 'offset': event.offset, +# 'metadata': event.metadata +# } - return json.dumps(event_dict) +# return json.dumps(event_dict) -# Retrieve the event data from storage blob and return it as Http response -@app.function_name(name="get_eh_ed_triggered") -@app.route(route="get_eh_ed_triggered") -@app.blob_input(arg_name="file", - path="python-worker-tests/test-eventhub-triggered.txt", - connection="AzureWebJobsStorage") -async def get_eh_ed_triggered(req: func.HttpRequest, - file: func.InputStream) -> str: - return func.HttpResponse(body=file.read().decode('utf-8'), - status_code=200, - mimetype='application/json') \ No newline at end of file +# # Retrieve the event data from storage blob and return it as Http response +# @app.function_name(name="get_eh_ed_triggered") +# @app.route(route="get_eh_ed_triggered") +# @app.blob_input(arg_name="file", +# path="python-worker-tests/test-eventhub-triggered.txt", +# connection="AzureWebJobsStorage") +# async def get_eh_ed_triggered(req: func.HttpRequest, +# file: func.InputStream) -> str: +# return func.HttpResponse(body=file.read().decode('utf-8'), +# status_code=200, +# mimetype='application/json') \ No newline at end of file diff --git a/tests/emulator_tests/test_eventhub_deferred_bindings.py b/tests/emulator_tests/test_eventhub_deferred_bindings.py index d07ea569..607e6fb4 100644 --- a/tests/emulator_tests/test_eventhub_deferred_bindings.py +++ b/tests/emulator_tests/test_eventhub_deferred_bindings.py @@ -33,18 +33,18 @@ def test_ed_eventhub_trigger(self): self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') - # Once the event get generated, allow function host to poll from - # EventHub and wait for eventhub_trigger to execute, - # converting the event metadata into a blob. - time.sleep(5) - - # Call get_eh_ed_triggered to retrieve event metadata from blob. - r = self.webhost.request('GET', 'get_eh_ed_triggered') - - # Waiting for the blob to get updated with the latest data from the - # eventhub output binding - time.sleep(5) - self.assertEqual(r.status_code, 200) + # # Once the event get generated, allow function host to poll from + # # EventHub and wait for eventhub_trigger to execute, + # # converting the event metadata into a blob. + # time.sleep(5) + + # # Call get_eh_ed_triggered to retrieve event metadata from blob. + # r = self.webhost.request('GET', 'get_eh_ed_triggered') + + # # Waiting for the blob to get updated with the latest data from the + # # eventhub output binding + # time.sleep(5) + # self.assertEqual(r.status_code, 200) # event = r.json() # self.assertEqual(event['body'], random_number) \ No newline at end of file From cabd03c52540e6d3d2b556e8900ff6017ca5ddcb Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Tue, 29 Apr 2025 16:29:35 -0500 Subject: [PATCH 17/23] Fix --- .../test_eventhub_deferred_bindings.py | 88 +++++++++---------- .../emulator_tests/test_eventhub_functions.py | 8 ++ 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/tests/emulator_tests/test_eventhub_deferred_bindings.py b/tests/emulator_tests/test_eventhub_deferred_bindings.py index 607e6fb4..3ab6dc7c 100644 --- a/tests/emulator_tests/test_eventhub_deferred_bindings.py +++ b/tests/emulator_tests/test_eventhub_deferred_bindings.py @@ -1,50 +1,50 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -import json -import sys -import time -import unittest +# # Copyright (c) Microsoft Corporation. All rights reserved. +# # Licensed under the MIT License. +# import json +# import sys +# import time +# import unittest -from tests.utils import testutils +# from tests.utils import testutils -@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" - "is only supported for 3.9+.") -class TestEventHubDeferredBindings(testutils.WebHostTestCase): +# @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" +# "is only supported for 3.9+.") +# class TestEventHubDeferredBindings(testutils.WebHostTestCase): - @classmethod - def get_script_dir(cls): - return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' +# @classmethod +# def get_script_dir(cls): +# return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' - @classmethod - def get_libraries_to_install(cls): - return ['azurefunctions-extensions-bindings-eventhub'] +# @classmethod +# def get_libraries_to_install(cls): +# return ['azurefunctions-extensions-bindings-eventhub'] - @testutils.retryable_test(3, 5) - def test_ed_eventhub_trigger(self): - # Generate a unique event body for EventHub eventme - random_number = str(round(time.time()) % 1000) - req_body = { - 'body': random_number - } - - r = self.webhost.request('POST', 'put_eh_ed_trigger', - data=json.dumps(req_body)) - self.assertEqual(r.status_code, 200) - self.assertEqual(r.text, 'OK') - - # # Once the event get generated, allow function host to poll from - # # EventHub and wait for eventhub_trigger to execute, - # # converting the event metadata into a blob. - # time.sleep(5) - - # # Call get_eh_ed_triggered to retrieve event metadata from blob. - # r = self.webhost.request('GET', 'get_eh_ed_triggered') - - # # Waiting for the blob to get updated with the latest data from the - # # eventhub output binding - # time.sleep(5) - # self.assertEqual(r.status_code, 200) - - # event = r.json() - # self.assertEqual(event['body'], random_number) \ No newline at end of file +# @testutils.retryable_test(3, 5) +# def test_ed_eventhub_trigger(self): +# # Generate a unique event body for EventHub eventme +# random_number = str(round(time.time()) % 1000) +# req_body = { +# 'body': random_number +# } + +# r = self.webhost.request('POST', 'put_eh_ed_trigger', +# data="test") +# self.assertEqual(r.status_code, 200) +# self.assertEqual(r.text, 'OK') + +# # # Once the event get generated, allow function host to poll from +# # # EventHub and wait for eventhub_trigger to execute, +# # # converting the event metadata into a blob. +# # time.sleep(5) + +# # # Call get_eh_ed_triggered to retrieve event metadata from blob. +# # r = self.webhost.request('GET', 'get_eh_ed_triggered') + +# # # Waiting for the blob to get updated with the latest data from the +# # # eventhub output binding +# # time.sleep(5) +# # self.assertEqual(r.status_code, 200) + +# # event = r.json() +# # self.assertEqual(event['body'], random_number) \ No newline at end of file diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index 03088c73..0b2ff7ba 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -107,6 +107,14 @@ def test_eventhub_trigger_with_metadata(self): self.assertGreaterEqual(sys_props['SequenceNumber'], 0) self.assertIsNotNone(sys_props['Offset']) +class TestEventHubDeferredBindings(TestEventHubFunctions): + + @classmethod + def get_script_dir(cls): + return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ + 'eventhub_deferred_bindings' + + class TestEventHubFunctionsStein(TestEventHubFunctions): From dd6b57c8a529538eb21a6c2cfe0b9e3f85a6e656 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 5 May 2025 13:27:50 -0500 Subject: [PATCH 18/23] Hard reset --- .../function_app.py | 52 ------------------- .../test_eventhub_deferred_bindings.py | 50 ------------------ .../emulator_tests/test_eventhub_functions.py | 8 --- 3 files changed, 110 deletions(-) delete mode 100644 tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py delete mode 100644 tests/emulator_tests/test_eventhub_deferred_bindings.py diff --git a/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py deleted file mode 100644 index 2065a196..00000000 --- a/tests/emulator_tests/eventhub_functions/eventhub_deferred_bindings/function_app.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -import json -import typing - -import azure.functions as func -# import azurefunctions.extensions.bindings.eventhub as eh - -app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) - - -@app.function_name(name="put_eh_ed_trigger") -@app.event_hub_output(arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", - connection="AzureWebJobsEventHubConnectionString") -@app.route(route="put_eh_ed_trigger") -def put_eh_ed_trigger(req: func.HttpRequest, event: func.Out[str]) -> str: - event.set(req.get_body()) - return 'OK' - -# @app.function_name(name="eh_ed_trigger") -# @app.event_hub_message_trigger( -# arg_name="event", -# event_hub_name="python-worker-ci-eventhub-one", -# connection="AzureWebJobsEventHubConnectionString") -# @app.blob_output(arg_name="$return", -# path="python-worker-tests/test-eventhub-triggered.txt", -# connection="AzureWebJobsStorage") -# async def eh_ed_trigger(event: func.EventHubEvent) -> bytes: -# event_dict: typing.Mapping[str, typing.Any] = { -# 'body': event.get_body().decode('utf-8'), -# # Uncomment this when the EnqueuedTimeUtc is fixed in azure-functions -# # 'enqueued_time': event.enqueued_time.isoformat(), -# 'partition_key': event.partition_key, -# 'sequence_number': event.sequence_number, -# 'offset': event.offset, -# 'metadata': event.metadata -# } - -# return json.dumps(event_dict) - -# # Retrieve the event data from storage blob and return it as Http response -# @app.function_name(name="get_eh_ed_triggered") -# @app.route(route="get_eh_ed_triggered") -# @app.blob_input(arg_name="file", -# path="python-worker-tests/test-eventhub-triggered.txt", -# connection="AzureWebJobsStorage") -# async def get_eh_ed_triggered(req: func.HttpRequest, -# file: func.InputStream) -> str: -# return func.HttpResponse(body=file.read().decode('utf-8'), -# status_code=200, -# mimetype='application/json') \ No newline at end of file diff --git a/tests/emulator_tests/test_eventhub_deferred_bindings.py b/tests/emulator_tests/test_eventhub_deferred_bindings.py deleted file mode 100644 index 3ab6dc7c..00000000 --- a/tests/emulator_tests/test_eventhub_deferred_bindings.py +++ /dev/null @@ -1,50 +0,0 @@ -# # Copyright (c) Microsoft Corporation. All rights reserved. -# # Licensed under the MIT License. -# import json -# import sys -# import time -# import unittest - -# from tests.utils import testutils - - -# @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" -# "is only supported for 3.9+.") -# class TestEventHubDeferredBindings(testutils.WebHostTestCase): - -# @classmethod -# def get_script_dir(cls): -# return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' - -# @classmethod -# def get_libraries_to_install(cls): -# return ['azurefunctions-extensions-bindings-eventhub'] - -# @testutils.retryable_test(3, 5) -# def test_ed_eventhub_trigger(self): -# # Generate a unique event body for EventHub eventme -# random_number = str(round(time.time()) % 1000) -# req_body = { -# 'body': random_number -# } - -# r = self.webhost.request('POST', 'put_eh_ed_trigger', -# data="test") -# self.assertEqual(r.status_code, 200) -# self.assertEqual(r.text, 'OK') - -# # # Once the event get generated, allow function host to poll from -# # # EventHub and wait for eventhub_trigger to execute, -# # # converting the event metadata into a blob. -# # time.sleep(5) - -# # # Call get_eh_ed_triggered to retrieve event metadata from blob. -# # r = self.webhost.request('GET', 'get_eh_ed_triggered') - -# # # Waiting for the blob to get updated with the latest data from the -# # # eventhub output binding -# # time.sleep(5) -# # self.assertEqual(r.status_code, 200) - -# # event = r.json() -# # self.assertEqual(event['body'], random_number) \ No newline at end of file diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index 0b2ff7ba..03088c73 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -107,14 +107,6 @@ def test_eventhub_trigger_with_metadata(self): self.assertGreaterEqual(sys_props['SequenceNumber'], 0) self.assertIsNotNone(sys_props['Offset']) -class TestEventHubDeferredBindings(TestEventHubFunctions): - - @classmethod - def get_script_dir(cls): - return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ - 'eventhub_deferred_bindings' - - class TestEventHubFunctionsStein(TestEventHubFunctions): From 43deb9ffb9e5114076b74c978ba043c464819f83 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 5 May 2025 15:03:32 -0500 Subject: [PATCH 19/23] Does it work --- .../eventhub_functions_stein/function_app.py | 10 +++++++ .../emulator_tests/test_eventhub_functions.py | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py index 1481f7b5..45f8704d 100644 --- a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py +++ b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py @@ -19,6 +19,16 @@ def eventhub_output(req: func.HttpRequest, event: func.Out[str]): event.set(req.get_body().decode('utf-8')) return 'OK' +# An HttpTrigger to generating EventHub event from EventHub Output Binding +@app.function_name(name="eventhub2_output") +@app.route(route="eventhub2_output") +@app.event_hub_output(arg_name="event", + event_hub_name="python-worker-ci-eventhub-one", + connection="AzureWebJobsEventHubConnectionString") +def eventhub2_output(req: func.HttpRequest, event: func.Out[str]): + event.set(req.get_body().decode('utf-8')) + return 'OK' + # This is an actual EventHub trigger which will convert the event data # into a storage blob. diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index 03088c73..aabe0a7c 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -55,6 +55,35 @@ def test_eventhub_trigger(self): # Check if the event body matches the initial data self.assertEqual(response, doc) + @testutils.retryable_test(3, 5) + def test_eventhub2_trigger(self): + # Generate a unique event body for the EventHub event + data = str(round(time.time())) + doc = {'id': data} + + # Invoke eventhub2_output HttpTrigger to generate an Eventhub Event. + r = self.webhost.request('POST', 'eventhub2_output', + data=json.dumps(doc)) + self.assertEqual(r.status_code, 123) + self.assertEqual(r.text, 'OK') + + # Once the event get generated, allow function host to poll from + # EventHub and wait for eventhub_trigger to execute, + # converting the event metadata into a blob. + time.sleep(5) + + # Call get_eventhub_triggered to retrieve event metadata from blob. + r = self.webhost.request('GET', 'get2_eventhub_triggered') + + # Waiting for the blob get updated with the latest data from the + # eventhub output binding + time.sleep(5) + self.assertEqual(r.status_code, 200) + response = r.json() + + # Check if the event body matches the initial data + self.assertEqual(response, doc) + @skipIf(sys.version_info.minor == 7, "Using azure-eventhub SDK with the EventHub Emulator" "requires Python 3.8+") From 7587b20bb5869bd9f86b63537a073a19e7bd5be5 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 5 May 2025 15:24:49 -0500 Subject: [PATCH 20/23] Does it work --- tests/emulator_tests/test_eventhub_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index aabe0a7c..23d28301 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -64,7 +64,7 @@ def test_eventhub2_trigger(self): # Invoke eventhub2_output HttpTrigger to generate an Eventhub Event. r = self.webhost.request('POST', 'eventhub2_output', data=json.dumps(doc)) - self.assertEqual(r.status_code, 123) + self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK') # Once the event get generated, allow function host to poll from From a8c39b5a9affe0bd02002a39fb82a9568cd177af Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 5 May 2025 16:07:04 -0500 Subject: [PATCH 21/23] Does it work --- .../eventhub_functions_stein/function_app.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py index 45f8704d..95e1c5e2 100644 --- a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py +++ b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py @@ -23,7 +23,7 @@ def eventhub_output(req: func.HttpRequest, event: func.Out[str]): @app.function_name(name="eventhub2_output") @app.route(route="eventhub2_output") @app.event_hub_output(arg_name="event", - event_hub_name="python-worker-ci-eventhub-one", + event_hub_name="python-worker-ci-eventhub-two", connection="AzureWebJobsEventHubConnectionString") def eventhub2_output(req: func.HttpRequest, event: func.Out[str]): event.set(req.get_body().decode('utf-8')) @@ -43,6 +43,19 @@ def eventhub2_output(req: func.HttpRequest, event: func.Out[str]): def eventhub_trigger(event: func.EventHubEvent) -> bytes: return event.get_body() +# This is an actual EventHub trigger which will convert the event data +# into a storage blob. +@app.function_name(name="eventhub2_trigger") +@app.event_hub_message_trigger(arg_name="event", + event_hub_name="python-worker-ci-eventhub-two", + connection="AzureWebJobsEventHubConnectionString" + ) +@app.blob_output(arg_name="$return", + path="python-worker-tests/test-eventhub-triggered2.txt", + connection="AzureWebJobsStorage") +def eventhub2_trigger(event: func.EventHubEvent) -> bytes: + return event.get_body() + # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_eventhub_triggered") @@ -55,6 +68,17 @@ def get_eventhub_triggered(req: func.HttpRequest, return file.read().decode('utf-8') +# Retrieve the event data from storage blob and return it as Http response +@app.function_name(name="get_eventhub2_triggered") +@app.route(route="get_eventhub2_triggered") +@app.blob_input(arg_name="file", + path="python-worker-tests/test-eventhub-triggered2.txt", + connection="AzureWebJobsStorage") +def get_eventhub2_triggered(req: func.HttpRequest, + file: func.InputStream) -> str: + return file.read().decode('utf-8') + + # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_metadata_triggered") @app.route(route="get_metadata_triggered") From 65d5f4384d143140d021e057e0a07afd62fb579a Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Mon, 5 May 2025 18:14:45 -0500 Subject: [PATCH 22/23] Does it work --- tests/emulator_tests/test_eventhub_functions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index 23d28301..5a9a0c66 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -73,7 +73,7 @@ def test_eventhub2_trigger(self): time.sleep(5) # Call get_eventhub_triggered to retrieve event metadata from blob. - r = self.webhost.request('GET', 'get2_eventhub_triggered') + r = self.webhost.request('GET', 'get_eventhub2_triggered') # Waiting for the blob get updated with the latest data from the # eventhub output binding From dcf55dbe4f82a597d9cd623945c8738baf6d05c0 Mon Sep 17 00:00:00 2001 From: Evan Roman Date: Wed, 7 May 2025 16:51:01 -0500 Subject: [PATCH 23/23] rm tests --- .../eventhub_functions_stein/function_app.py | 35 ------------- .../emulator_tests/test_eventhub_functions.py | 49 ++++--------------- 2 files changed, 10 insertions(+), 74 deletions(-) diff --git a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py index 95e1c5e2..1bacb124 100644 --- a/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py +++ b/tests/emulator_tests/eventhub_functions/eventhub_functions_stein/function_app.py @@ -19,16 +19,6 @@ def eventhub_output(req: func.HttpRequest, event: func.Out[str]): event.set(req.get_body().decode('utf-8')) return 'OK' -# An HttpTrigger to generating EventHub event from EventHub Output Binding -@app.function_name(name="eventhub2_output") -@app.route(route="eventhub2_output") -@app.event_hub_output(arg_name="event", - event_hub_name="python-worker-ci-eventhub-two", - connection="AzureWebJobsEventHubConnectionString") -def eventhub2_output(req: func.HttpRequest, event: func.Out[str]): - event.set(req.get_body().decode('utf-8')) - return 'OK' - # This is an actual EventHub trigger which will convert the event data # into a storage blob. @@ -43,20 +33,6 @@ def eventhub2_output(req: func.HttpRequest, event: func.Out[str]): def eventhub_trigger(event: func.EventHubEvent) -> bytes: return event.get_body() -# This is an actual EventHub trigger which will convert the event data -# into a storage blob. -@app.function_name(name="eventhub2_trigger") -@app.event_hub_message_trigger(arg_name="event", - event_hub_name="python-worker-ci-eventhub-two", - connection="AzureWebJobsEventHubConnectionString" - ) -@app.blob_output(arg_name="$return", - path="python-worker-tests/test-eventhub-triggered2.txt", - connection="AzureWebJobsStorage") -def eventhub2_trigger(event: func.EventHubEvent) -> bytes: - return event.get_body() - - # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_eventhub_triggered") @app.route(route="get_eventhub_triggered") @@ -68,17 +44,6 @@ def get_eventhub_triggered(req: func.HttpRequest, return file.read().decode('utf-8') -# Retrieve the event data from storage blob and return it as Http response -@app.function_name(name="get_eventhub2_triggered") -@app.route(route="get_eventhub2_triggered") -@app.blob_input(arg_name="file", - path="python-worker-tests/test-eventhub-triggered2.txt", - connection="AzureWebJobsStorage") -def get_eventhub2_triggered(req: func.HttpRequest, - file: func.InputStream) -> str: - return file.read().decode('utf-8') - - # Retrieve the event data from storage blob and return it as Http response @app.function_name(name="get_metadata_triggered") @app.route(route="get_metadata_triggered") diff --git a/tests/emulator_tests/test_eventhub_functions.py b/tests/emulator_tests/test_eventhub_functions.py index 5a9a0c66..4c098cc0 100644 --- a/tests/emulator_tests/test_eventhub_functions.py +++ b/tests/emulator_tests/test_eventhub_functions.py @@ -55,35 +55,6 @@ def test_eventhub_trigger(self): # Check if the event body matches the initial data self.assertEqual(response, doc) - @testutils.retryable_test(3, 5) - def test_eventhub2_trigger(self): - # Generate a unique event body for the EventHub event - data = str(round(time.time())) - doc = {'id': data} - - # Invoke eventhub2_output HttpTrigger to generate an Eventhub Event. - r = self.webhost.request('POST', 'eventhub2_output', - data=json.dumps(doc)) - self.assertEqual(r.status_code, 200) - self.assertEqual(r.text, 'OK') - - # Once the event get generated, allow function host to poll from - # EventHub and wait for eventhub_trigger to execute, - # converting the event metadata into a blob. - time.sleep(5) - - # Call get_eventhub_triggered to retrieve event metadata from blob. - r = self.webhost.request('GET', 'get_eventhub2_triggered') - - # Waiting for the blob get updated with the latest data from the - # eventhub output binding - time.sleep(5) - self.assertEqual(r.status_code, 200) - response = r.json() - - # Check if the event body matches the initial data - self.assertEqual(response, doc) - @skipIf(sys.version_info.minor == 7, "Using azure-eventhub SDK with the EventHub Emulator" "requires Python 3.8+") @@ -137,17 +108,17 @@ def test_eventhub_trigger_with_metadata(self): self.assertIsNotNone(sys_props['Offset']) -class TestEventHubFunctionsStein(TestEventHubFunctions): +# class TestEventHubFunctionsStein(TestEventHubFunctions): - @classmethod - def get_script_dir(cls): - return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ - 'eventhub_functions_stein' +# @classmethod +# def get_script_dir(cls): +# return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ +# 'eventhub_functions_stein' -class TestEventHubFunctionsSteinGeneric(TestEventHubFunctions): +# class TestEventHubFunctionsSteinGeneric(TestEventHubFunctions): - @classmethod - def get_script_dir(cls): - return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ - 'eventhub_functions_stein' / 'generic' +# @classmethod +# def get_script_dir(cls): +# return testutils.EMULATOR_TESTS_FOLDER / 'eventhub_functions' / \ +# 'eventhub_functions_stein' / 'generic'