From eae4b5547329ffeacdbf8a7a2311f7c696c6c521 Mon Sep 17 00:00:00 2001 From: ewertons Date: Tue, 5 Jul 2016 16:27:54 -0700 Subject: [PATCH] Add Python wrapper API for uploadBlob --- .../src/iothub_client_python.cpp | 64 +++ .../test/iothub_client_mock.cpp | 5 + .../windows/client/iothub_client.vcxproj | 32 +- .../windows/client/iothub_client.vpj | 421 ++++++++++++++++++ .../windows/client/packages.config | 14 +- .../windows/iothub_client.def | 1 + .../windows/iothub_client_python.vpw | 2 + .../windows/iothub_client_python.vpwhist | 141 ++++++ .../windows/iothub_client_python.vtg | Bin 0 -> 204800 bytes .../windows/mock/iothub_client_mock.vcxproj | 29 +- .../windows/mock/iothub_client_mock.vpj | 421 ++++++++++++++++++ .../windows/mock/packages.config | 14 +- python/device/samples/iothub_client_sample.py | 15 + .../samples/iothub_client_sample_class.py | 20 + python/device/tests/iothub_client_ut.py | 20 + 15 files changed, 1157 insertions(+), 42 deletions(-) create mode 100644 python/device/iothub_client_python/windows/client/iothub_client.vpj create mode 100644 python/device/iothub_client_python/windows/iothub_client_python.vpw create mode 100644 python/device/iothub_client_python/windows/iothub_client_python.vpwhist create mode 100644 python/device/iothub_client_python/windows/iothub_client_python.vtg create mode 100644 python/device/iothub_client_python/windows/mock/iothub_client_mock.vpj diff --git a/python/device/iothub_client_python/src/iothub_client_python.cpp b/python/device/iothub_client_python/src/iothub_client_python.cpp index f501a2a1251..c4b99ef635e 100644 --- a/python/device/iothub_client_python/src/iothub_client_python.cpp +++ b/python/device/iothub_client_python/src/iothub_client_python.cpp @@ -823,6 +823,36 @@ ReceiveMessageCallback( return boost::python::extract(returnObject); } +typedef struct +{ + boost::python::object blobUploadCallback; + boost::python::object userContext; +} BlobUploadContext; + +extern "C" +void +BlobUploadConfirmationCallback( + IOTHUB_CLIENT_FILE_UPLOAD_RESULT result, + void* userContextCallback + ) +{ + BlobUploadContext *blobUploadContext = (BlobUploadContext *)userContextCallback; + boost::python::object blobUploadCallback = blobUploadContext->blobUploadCallback; + boost::python::object userContext = blobUploadContext->userContext; + { + ScopedGILAcquire acquire; + try { + blobUploadCallback(result, userContext); + } + catch (const boost::python::error_already_set) + { + // Catch and ignore exception that is thrown in Python callback. + // There is nothing we can do about it here. + PyErr_Print(); + } + } + delete blobUploadContext; +} class IoTHubClient { @@ -1098,6 +1128,34 @@ class IoTHubClient } } + void UploadToBlobAsync( + std::string destinationFileName, + std::string source, + size_t size, + boost::python::object& iotHubClientFileUploadCallback, + boost::python::object& userContext + ) + { + if (!PyCallable_Check(iotHubClientFileUploadCallback.ptr())) + { + PyErr_SetString(PyExc_TypeError, "upload_to_blob expected type callable"); + boost::python::throw_error_already_set(); + return; + } + BlobUploadContext *blobUploadContext = new BlobUploadContext(); + blobUploadContext->blobUploadCallback = iotHubClientFileUploadCallback; + blobUploadContext->userContext = userContext; + + IOTHUB_CLIENT_RESULT result; + { + ScopedGILRelease release; + result = IoTHubClient_UploadToBlobAsync(iotHubClientHandle, destinationFileName.c_str(), (const unsigned char*)source.c_str(), size, BlobUploadConfirmationCallback, blobUploadContext); + } + if (result != IOTHUB_CLIENT_OK) + { + throw IoTHubClientError(__func__, result); + } + } #ifdef SUPPORT___STR__ std::string str() const { @@ -1217,6 +1275,11 @@ BOOST_PYTHON_MODULE(IMPORT_NAME) .value("MQTT", MQTT) ; + enum_("IoTHubClientFileUploadResult") + .value("OK", FILE_UPLOAD_OK) + .value("ERROR", FILE_UPLOAD_ERROR) + ; + // classes class_("IoTHubMap") .def(init<>()) @@ -1258,6 +1321,7 @@ BOOST_PYTHON_MODULE(IMPORT_NAME) .def("set_option", &IoTHubClient::SetOption) .def("get_send_status", &IoTHubClient::GetSendStatus) .def("get_last_message_receive_time", &IoTHubClient::GetLastMessageReceiveTime) + .def("upload_blob_async", &IoTHubClient::UploadToBlobAsync) // attributes .def_readonly("protocol", &IoTHubClient::protocol) // Python helpers diff --git a/python/device/iothub_client_python/test/iothub_client_mock.cpp b/python/device/iothub_client_python/test/iothub_client_mock.cpp index f317633507d..3b785288e53 100644 --- a/python/device/iothub_client_python/test/iothub_client_mock.cpp +++ b/python/device/iothub_client_python/test/iothub_client_mock.cpp @@ -195,6 +195,11 @@ IOTHUB_CLIENT_RESULT IoTHubClient_SetOption(IOTHUB_CLIENT_HANDLE iotHubClientHan return IOTHUB_CLIENT_OK; } +IOTHUB_CLIENT_RESULT IoTHubClient_UploadToBlobAsync(IOTHUB_CLIENT_HANDLE iotHubClientHandle, const char* destinationFileName, const unsigned char* source, size_t size, IOTHUB_CLIENT_FILE_UPLOAD_CALLBACK iotHubClientFileUploadCallback, void* context) +{ + return IOTHUB_CLIENT_OK; +} + // "iothub_client_version.h" const char* IoTHubClient_GetVersionString(void) diff --git a/python/device/iothub_client_python/windows/client/iothub_client.vcxproj b/python/device/iothub_client_python/windows/client/iothub_client.vcxproj index ad38a2b7b8f..6e57e8dcd5f 100644 --- a/python/device/iothub_client_python/windows/client/iothub_client.vcxproj +++ b/python/device/iothub_client_python/windows/client/iothub_client.vcxproj @@ -109,6 +109,7 @@ true ..\$(TargetName).def $(PYTHON_PATH)\libs + crypt32.lib;%(AdditionalDependencies) Copy $(TargetPath) $(TargetDir)\$(TargetName).pyd @@ -130,6 +131,7 @@ true ..\$(TargetName).def $(PYTHON_PATH)\libs + crypt32.lib;%(AdditionalDependencies) Copy $(TargetPath) $(TargetDir)\$(TargetName).pyd @@ -158,6 +160,7 @@ ..\$(TargetName).def $(PYTHON_PATH)\libs UseLinkTimeCodeGeneration + crypt32.lib;%(AdditionalDependencies) Copy $(TargetPath) $(TargetDir)\$(TargetName).pyd @@ -186,6 +189,7 @@ ..\$(TargetName).def $(PYTHON_PATH)\libs UseLinkTimeCodeGeneration + crypt32.lib;%(AdditionalDependencies) Copy $(TargetPath) $(TargetDir)\$(TargetName).pyd @@ -198,13 +202,13 @@ - - - - - - - + + + + + + + @@ -212,12 +216,12 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/python/device/iothub_client_python/windows/client/iothub_client.vpj b/python/device/iothub_client_python/windows/client/iothub_client.vpj new file mode 100644 index 00000000000..72c4eb782ac --- /dev/null +++ b/python/device/iothub_client_python/windows/client/iothub_client.vpj @@ -0,0 +1,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/device/iothub_client_python/windows/client/packages.config b/python/device/iothub_client_python/windows/client/packages.config index 92be1084c63..1d968bdeab1 100644 --- a/python/device/iothub_client_python/windows/client/packages.config +++ b/python/device/iothub_client_python/windows/client/packages.config @@ -2,11 +2,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/python/device/iothub_client_python/windows/iothub_client.def b/python/device/iothub_client_python/windows/iothub_client.def index 4296ffd26ec..6f5767b558a 100644 --- a/python/device/iothub_client_python/windows/iothub_client.def +++ b/python/device/iothub_client_python/windows/iothub_client.def @@ -15,6 +15,7 @@ EXPORTS IoTHubClient_SetMessageCallback IoTHubClient_GetLastMessageReceiveTime IoTHubClient_SetOption + IoTHubClient_UploadToBlobAsync ; iothub_client_ll.h IoTHubClient_LL_CreateFromConnectionString IoTHubClient_LL_Create diff --git a/python/device/iothub_client_python/windows/iothub_client_python.vpw b/python/device/iothub_client_python/windows/iothub_client_python.vpw new file mode 100644 index 00000000000..f53790f9e3a --- /dev/null +++ b/python/device/iothub_client_python/windows/iothub_client_python.vpw @@ -0,0 +1,2 @@ + + diff --git a/python/device/iothub_client_python/windows/iothub_client_python.vpwhist b/python/device/iothub_client_python/windows/iothub_client_python.vpwhist new file mode 100644 index 00000000000..8d7285eed1c --- /dev/null +++ b/python/device/iothub_client_python/windows/iothub_client_python.vpwhist @@ -0,0 +1,141 @@ +[Global] +CurrentProject=client\iothub_client.vpj +[ActiveConfig] +client\iothub_client.vpj=,Debug|Win32 +mock\iothub_client_mock.vpj=,Debug|Win32 +[ProjectDates] +client\iothub_client.vcxproj=20160705214114115 +mock\iothub_client_mock.vcxproj=20160705214114095 +[TreeExpansion2] ++@ client\iothub_client.vcxproj ++@ mock\iothub_client_mock.vcxproj +scroll:0 +[State] +SCREEN: 1920 1200 252 8 1412 1108 0 0 M 0 0 0 0 1595 1045 0 +CWD: client +FILEHIST: 9 +..\..\..\..\c\serializer\samples\simplesample_mqtt\windows\simplesample_mqtt.vcxproj +..\..\..\..\c\serializer\samples\simplesample_mqtt\windows\packages.config +..\..\..\build_all\windows\build_client.cmd +..\..\..\build_all\windows\build.cmd +\GitRepos_javafix\azure-iot-sdks\node\device\samples\simple_sample_device.js +client\packages.config +client\iothub_client.vcxproj +mock\iothub_client_mock.vcxproj +mock\packages.config +BOOKMARK2: 0 +BOOKMARK3: 0 +DEBUG2: 0 +TBCLASS: 0 0 +STANDARD_LAYOUT: 55 1 40 11 3 M 0 +_tbnotification_form F=36 +_tbdeltasave_form F=0 +_tbfind_form F=36 +_tbdebug_watches_form F=64 +_tbbookmarks_form F=8 +_tbsearch_form F=8 +_tbfind_symbol_form F=32 +_tbFTPClient_form F=0 +_tbopen_form F=40 +_tbbufftabs_form F=11 +_tbdebug_members_form F=64 +_tbdebug_threads_form F=64 +_tbdebug_classes_form F=64 +_tbdebug_memory_form F=64 +_tbclass_form F=8 +_tbderivedclasses_form F=40 +_tbbaseclasses_form F=40 +_tbunittest_form F=0 +_tbsymbolcalls_form F=40 +_tbannotations_browser_form F=0 +_tbFTPOpen_form F=0 +_tbfilelist_form F=44 +_tbslickc_stack_form F=8 +_tbprops_form F=8 +_tbtagwin_form F=8 +_tbtagrefs_form F=8 +_tboutputwin_form F=8 +_tbdebug_exceptions_form F=384 +_tbregex_form F=40 +_tbmessages_browser_form F=8 +_tbcbrowser_form F=8 +_tbproctree_form F=8 +_tbprojects_form F=8 +_tbshell_form F=8 +_tbdebug_stack_form F=64 +_tbdebug_locals_form F=64 +_tbdebug_autovars_form F=64 +_tbdebug_regs_form F=64 +_tbdebug_breakpoints_form F=384 +_tbclipboard_form F=44 +_tbmessages_browser_form T=0 +_tbshell_form T=0 +_tbclass_form T=0 +_tbtagwin_form T=0 +_tbtagrefs_form T=0 +_tbprojects_form T=0 +_tbopen_form T=0 +_tboutputwin_form T=0 +_tbproctree_form T=0 +_tbsearch_form T=0 +_tbcbrowser_form T=0 +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 +QTOOLBAR 1 0 +AAAA/wAAAAD9AAAAAAAAB4AAAAQuAAAABAAAAAQAAAAIAAAACPwAAAADAAAAAgAAAAAAAAACAAAAAAAAAAIAAAABAAAAHgBDAHUAcgByAGUAbgB0ACAAQwBvAG4AdABlAHgAdAEAAAAA/////wAAAAAAAAAA +_tbcontext_form 0 +APP_LAYOUT: 55 1 40 11 3 M 0 +_tbnotification_form F=36 +_tbdeltasave_form F=0 +_tbfind_form F=36 +_tbdebug_watches_form F=64 +_tbbookmarks_form F=8 +_tbsearch_form F=8 +_tbfind_symbol_form F=32 +_tbFTPClient_form F=0 +_tbopen_form F=40 +_tbbufftabs_form F=11 +_tbdebug_members_form F=64 +_tbdebug_threads_form F=64 +_tbdebug_classes_form F=64 +_tbdebug_memory_form F=64 +_tbclass_form F=8 +_tbderivedclasses_form F=40 +_tbbaseclasses_form F=40 +_tbunittest_form F=0 +_tbsymbolcalls_form F=40 +_tbannotations_browser_form F=0 +_tbFTPOpen_form F=0 +_tbfilelist_form F=44 +_tbslickc_stack_form F=8 +_tbprops_form F=8 +_tbtagwin_form F=8 +_tbtagrefs_form F=8 +_tboutputwin_form F=8 +_tbdebug_exceptions_form F=384 +_tbregex_form F=40 +_tbmessages_browser_form F=8 +_tbcbrowser_form F=8 +_tbproctree_form F=8 +_tbprojects_form F=8 +_tbshell_form F=8 +_tbdebug_stack_form F=64 +_tbdebug_locals_form F=64 +_tbdebug_autovars_form F=64 +_tbdebug_regs_form F=64 +_tbdebug_breakpoints_form F=384 +_tbclipboard_form F=44 +_tbmessages_browser_form T=0 +_tbshell_form T=0 +_tbclass_form T=0 +_tbtagwin_form T=0 +_tbtagrefs_form T=0 +_tbprojects_form T=0 +_tbopen_form T=0 +_tboutputwin_form T=0 +_tbproctree_form T=0 +_tbsearch_form T=0 +_tbcbrowser_form T=0 +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 +QTOOLBAR 1 0 +AAAA/wAAAAD9AAAAAAAAB4AAAAQuAAAABAAAAAQAAAAIAAAACPwAAAADAAAAAgAAAAAAAAACAAAAAAAAAAIAAAABAAAAHgBDAHUAcgByAGUAbgB0ACAAQwBvAG4AdABlAHgAdAEAAAAA/////wAAAAAAAAAA +_tbcontext_form 0 diff --git a/python/device/iothub_client_python/windows/iothub_client_python.vtg b/python/device/iothub_client_python/windows/iothub_client_python.vtg new file mode 100644 index 0000000000000000000000000000000000000000..b9dee98c445baac1e19258d0f6dd6828be0ea7fb GIT binary patch literal 204800 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 true true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;crypt32.lib;%(AdditionalDependencies) Copy $(TargetPath) $(TargetDir)\$(TargetName).pyd @@ -202,13 +203,13 @@ - - - - - - - + + + + + + + @@ -216,12 +217,12 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/python/device/iothub_client_python/windows/mock/iothub_client_mock.vpj b/python/device/iothub_client_python/windows/mock/iothub_client_mock.vpj new file mode 100644 index 00000000000..7ecea6c3c08 --- /dev/null +++ b/python/device/iothub_client_python/windows/mock/iothub_client_mock.vpj @@ -0,0 +1,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/python/device/iothub_client_python/windows/mock/packages.config b/python/device/iothub_client_python/windows/mock/packages.config index 92be1084c63..1d968bdeab1 100644 --- a/python/device/iothub_client_python/windows/mock/packages.config +++ b/python/device/iothub_client_python/windows/mock/packages.config @@ -2,11 +2,11 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/python/device/samples/iothub_client_sample.py b/python/device/samples/iothub_client_sample.py index 9f4dc94cac4..360d6f55b72 100755 --- a/python/device/samples/iothub_client_sample.py +++ b/python/device/samples/iothub_client_sample.py @@ -33,6 +33,7 @@ # global counters receive_callbacks = 0 send_callbacks = 0 +blob_callbacks = 0 # chose HTTP, AMQP or MQTT as transport protocol protocol = IoTHubTransportProvider.AMQP @@ -84,6 +85,13 @@ def send_confirmation_callback(message, result, user_context): print(" Total calls confirmed: %d" % send_callbacks) +def blob_upload_confirmation_callback(result, user_context): + global blob_callbacks + print("Blob upload confirmation[%d] received for message with result = %s" % (user_context, result)) + blob_callbacks += 1 + print(" Total calls confirmed: %d" % blob_callbacks) + + def iothub_client_init(): # prepare iothub client iotHubClient = IoTHubClient(connection_string, protocol) @@ -120,6 +128,13 @@ def iothub_client_sample_run(): iotHubClient = iothub_client_init() + filename= "hello_python_blob.txt" + content = "Hello World from Python Blob APi" + + print("IoTHubClient is uploading blob to storage") + iotHubClient.upload_blob_async(filename, content, len(content), blob_upload_confirmation_callback, 1001) + print("IoTHubClient.upload_blob_async accepted the blob to upload to IoT Hub.") + while True: # send a few messages every minute print("IoTHubClient sending %d messages" % message_count) diff --git a/python/device/samples/iothub_client_sample_class.py b/python/device/samples/iothub_client_sample_class.py index ca27762e356..5fbfbf281af 100755 --- a/python/device/samples/iothub_client_sample_class.py +++ b/python/device/samples/iothub_client_sample_class.py @@ -33,6 +33,7 @@ # global counters receive_callbacks = 0 send_callbacks = 0 +blob_callbacks = 0 # String containing Hostname, Device Id & Device Key in the format: # "HostName=;DeviceId=;SharedAccessKey=" @@ -92,6 +93,14 @@ def _send_confirmation_callback(self, message, result, user_context): send_callbacks += 1 print(" Total calls confirmed: %d" % send_callbacks) + + def _blob_upload_confirmation_callback(self, result, user_context): + global blob_callbacks + print("Blob upload confirmation[%d] received for message with result = %s" % (user_context, result)) + blob_callbacks += 1 + print(" Total calls confirmed: %d" % blob_callbacks) + + def send_event(self, event, properties, send_context): if not isinstance(event, IoTHubMessage): event = IoTHubMessage(bytearray(event, 'utf8')) @@ -105,6 +114,13 @@ def send_event(self, event, properties, send_context): event, self._send_confirmation_callback, send_context) + def upload_to_blob(self, destinationfilename, source, size, usercontext): + self.client.upload_blob_async( + destinationfilename, source, size, + self._blob_upload_confirmation_callback, usercontext) + + + def main(connection_string, protocol): try: print("\nPython %s\n" % sys.version) @@ -118,6 +134,10 @@ def main(connection_string, protocol): "Starting the IoT Hub Python sample using protocol %s..." % hub_manager.client_protocol) + filename= "hello_python_blob.txt" + content = "Hello World from Python Blob APi" + hub_manager.upload_to_blob(filename, content, len(content), 1001) + while True: # send a few messages every minute print("IoTHubClient sending %d messages" % message_count) diff --git a/python/device/tests/iothub_client_ut.py b/python/device/tests/iothub_client_ut.py index cd9da389e98..5a6065c6dc1 100755 --- a/python/device/tests/iothub_client_ut.py +++ b/python/device/tests/iothub_client_ut.py @@ -40,6 +40,8 @@ def receive_message_callback(message, counter): def send_confirmation_callback(message, result, userContext): return +def blob_upload_callback(result, userContext): + return class TestExceptionDefinitions(unittest.TestCase): @@ -573,6 +575,24 @@ def test_IoTHubClient(self): self.assertIsNone(result) result = client.set_option("timeout", timeout) self.assertIsNone(result) + # upload_blob_async + destinationFileName = "fname" + source = "src" + size = 10 + with self.assertRaises(AttributeError): + client.UploadToBlobAsync() + with self.assertRaises(Exception): + client.upload_blob_async(1) + with self.assertRaises(Exception): + client.upload_blob_async(blob_upload_callback) + with self.assertRaises(Exception): + client.upload_blob_async(destinationFileName, blob_upload_callback) + with self.assertRaises(Exception): + client.upload_blob_async(destinationFileName, source, blob_upload_callback) + with self.assertRaises(Exception): + client.upload_blob_async(destinationFileName, source, size, send_confirmation_callback) + result = client.upload_blob_async(destinationFileName, source, size, send_confirmation_callback, None) + self.assertIsNone(result) if __name__ == '__main__': unittest.main(verbosity=2)