isar 1.33.3__tar.gz → 1.33.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of isar might be problematic. Click here for more details.

Files changed (216) hide show
  1. {isar-1.33.3 → isar-1.33.4}/PKG-INFO +1 -1
  2. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/mqtt/mqtt_client.py +9 -9
  3. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/uploader.py +15 -0
  4. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/PKG-INFO +1 -1
  5. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/SOURCES.txt +1 -0
  6. {isar-1.33.3 → isar-1.33.4}/tests/isar/storage/test_uploader.py +32 -1
  7. isar-1.33.4/tests/test_double/blob_storage.py +41 -0
  8. isar-1.33.4/tests/test_double/mqtt_client.py +37 -0
  9. isar-1.33.3/tests/test_double/blob_storage.py +0 -20
  10. {isar-1.33.3 → isar-1.33.4}/.dockerignore +0 -0
  11. {isar-1.33.3 → isar-1.33.4}/.env.test +0 -0
  12. {isar-1.33.3 → isar-1.33.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  13. {isar-1.33.3 → isar-1.33.4}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  14. {isar-1.33.3 → isar-1.33.4}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  15. {isar-1.33.3 → isar-1.33.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {isar-1.33.3 → isar-1.33.4}/.github/release.yml +0 -0
  17. {isar-1.33.3 → isar-1.33.4}/.github/workflows/compile_requirements.yml +0 -0
  18. {isar-1.33.3 → isar-1.33.4}/.github/workflows/project_automations.yml +0 -0
  19. {isar-1.33.3 → isar-1.33.4}/.github/workflows/pythonpackage.yml +0 -0
  20. {isar-1.33.3 → isar-1.33.4}/.github/workflows/pythonpublish.yml +0 -0
  21. {isar-1.33.3 → isar-1.33.4}/.github/workflows/stale.yml +0 -0
  22. {isar-1.33.3 → isar-1.33.4}/.gitignore +0 -0
  23. {isar-1.33.3 → isar-1.33.4}/.pre-commit-config.yaml +0 -0
  24. {isar-1.33.3 → isar-1.33.4}/LICENSE +0 -0
  25. {isar-1.33.3 → isar-1.33.4}/README.md +0 -0
  26. {isar-1.33.3 → isar-1.33.4}/SECURITY.md +0 -0
  27. {isar-1.33.3 → isar-1.33.4}/docs/Makefile +0 -0
  28. {isar-1.33.3 → isar-1.33.4}/docs/full_state_machine_diagram.png +0 -0
  29. {isar-1.33.3 → isar-1.33.4}/docs/make.bat +0 -0
  30. {isar-1.33.3 → isar-1.33.4}/docs/mission_state_machine_diagram.png +0 -0
  31. {isar-1.33.3 → isar-1.33.4}/docs/robot_status_state_machine_diagram.png +0 -0
  32. {isar-1.33.3 → isar-1.33.4}/docs/rst_processing.py +0 -0
  33. {isar-1.33.3 → isar-1.33.4}/docs/source/conf.py +0 -0
  34. {isar-1.33.3 → isar-1.33.4}/docs/source/index.rst +0 -0
  35. {isar-1.33.3 → isar-1.33.4}/docs/source/readme_link.md +0 -0
  36. {isar-1.33.3 → isar-1.33.4}/docs/update_state_diagram.py +0 -0
  37. {isar-1.33.3 → isar-1.33.4}/main.py +0 -0
  38. {isar-1.33.3 → isar-1.33.4}/pyproject.toml +0 -0
  39. {isar-1.33.3 → isar-1.33.4}/radixconfig.yml +0 -0
  40. {isar-1.33.3 → isar-1.33.4}/requirements.txt +0 -0
  41. {isar-1.33.3 → isar-1.33.4}/setup.cfg +0 -0
  42. {isar-1.33.3 → isar-1.33.4}/src/isar/__init__.py +0 -0
  43. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/__init__.py +0 -0
  44. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/api.py +0 -0
  45. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/models/__init__.py +0 -0
  46. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/models/models.py +0 -0
  47. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/models/start_mission_definition.py +0 -0
  48. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/robot_control/robot_controller.py +0 -0
  49. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/schedule/__init__.py +0 -0
  50. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  51. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/security/__init__.py +0 -0
  52. {isar-1.33.3 → isar-1.33.4}/src/isar/apis/security/authentication.py +0 -0
  53. {isar-1.33.3 → isar-1.33.4}/src/isar/config/__init__.py +0 -0
  54. {isar-1.33.3 → isar-1.33.4}/src/isar/config/certs/ca-cert.pem +0 -0
  55. {isar-1.33.3 → isar-1.33.4}/src/isar/config/configuration_error.py +0 -0
  56. {isar-1.33.3 → isar-1.33.4}/src/isar/config/keyvault/__init__.py +0 -0
  57. {isar-1.33.3 → isar-1.33.4}/src/isar/config/keyvault/keyvault_error.py +0 -0
  58. {isar-1.33.3 → isar-1.33.4}/src/isar/config/keyvault/keyvault_service.py +0 -0
  59. {isar-1.33.3 → isar-1.33.4}/src/isar/config/log.py +0 -0
  60. {isar-1.33.3 → isar-1.33.4}/src/isar/config/logging.conf +0 -0
  61. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  62. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  63. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/default_map.json +0 -0
  64. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/klab_b.json +0 -0
  65. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/klab_compressor.json +0 -0
  66. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/klab_turtlebot.json +0 -0
  67. {isar-1.33.3 → isar-1.33.4}/src/isar/config/maps/turtleworld.json +0 -0
  68. {isar-1.33.3 → isar-1.33.4}/src/isar/config/open_telemetry.py +0 -0
  69. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  70. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  71. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  72. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  73. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_missions/__init__.py +0 -0
  74. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_missions/default.json +0 -0
  75. {isar-1.33.3 → isar-1.33.4}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  76. {isar-1.33.3 → isar-1.33.4}/src/isar/config/settings.py +0 -0
  77. {isar-1.33.3 → isar-1.33.4}/src/isar/eventhandlers/eventhandler.py +0 -0
  78. {isar-1.33.3 → isar-1.33.4}/src/isar/mission_planner/__init__.py +0 -0
  79. {isar-1.33.3 → isar-1.33.4}/src/isar/mission_planner/local_planner.py +0 -0
  80. {isar-1.33.3 → isar-1.33.4}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  81. {isar-1.33.3 → isar-1.33.4}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  82. {isar-1.33.3 → isar-1.33.4}/src/isar/mission_planner/task_selector_interface.py +0 -0
  83. {isar-1.33.3 → isar-1.33.4}/src/isar/models/__init__.py +0 -0
  84. {isar-1.33.3 → isar-1.33.4}/src/isar/models/events.py +0 -0
  85. {isar-1.33.3 → isar-1.33.4}/src/isar/modules.py +0 -0
  86. {isar-1.33.3 → isar-1.33.4}/src/isar/robot/robot.py +0 -0
  87. {isar-1.33.3 → isar-1.33.4}/src/isar/robot/robot_start_mission.py +0 -0
  88. {isar-1.33.3 → isar-1.33.4}/src/isar/robot/robot_status.py +0 -0
  89. {isar-1.33.3 → isar-1.33.4}/src/isar/robot/robot_stop_mission.py +0 -0
  90. {isar-1.33.3 → isar-1.33.4}/src/isar/robot/robot_task_status.py +0 -0
  91. {isar-1.33.3 → isar-1.33.4}/src/isar/script.py +0 -0
  92. {isar-1.33.3 → isar-1.33.4}/src/isar/services/__init__.py +0 -0
  93. {isar-1.33.3 → isar-1.33.4}/src/isar/services/auth/__init__.py +0 -0
  94. {isar-1.33.3 → isar-1.33.4}/src/isar/services/auth/azure_credentials.py +0 -0
  95. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/__init__.py +0 -0
  96. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  97. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  98. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  99. {isar-1.33.3 → isar-1.33.4}/src/isar/services/service_connections/request_handler.py +0 -0
  100. {isar-1.33.3 → isar-1.33.4}/src/isar/services/utilities/__init__.py +0 -0
  101. {isar-1.33.3 → isar-1.33.4}/src/isar/services/utilities/robot_utilities.py +0 -0
  102. {isar-1.33.3 → isar-1.33.4}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  103. {isar-1.33.3 → isar-1.33.4}/src/isar/services/utilities/threaded_request.py +0 -0
  104. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/__init__.py +0 -0
  105. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/state_machine.py +0 -0
  106. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/__init__.py +0 -0
  107. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/await_next_mission.py +0 -0
  108. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/blocked_protective_stop.py +0 -0
  109. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/home.py +0 -0
  110. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/intervention_needed.py +0 -0
  111. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/monitor.py +0 -0
  112. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/offline.py +0 -0
  113. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/paused.py +0 -0
  114. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/recharging.py +0 -0
  115. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/return_home_paused.py +0 -0
  116. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/returning_home.py +0 -0
  117. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/stopping.py +0 -0
  118. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/stopping_return_home.py +0 -0
  119. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states/unknown_status.py +0 -0
  120. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/states_enum.py +0 -0
  121. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/fail_mission.py +0 -0
  122. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/finish_mission.py +0 -0
  123. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/pause.py +0 -0
  124. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/resume.py +0 -0
  125. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/return_home.py +0 -0
  126. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/robot_status.py +0 -0
  127. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/start_mission.py +0 -0
  128. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/stop.py +0 -0
  129. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/functions/utils.py +0 -0
  130. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/mission.py +0 -0
  131. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/return_home.py +0 -0
  132. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/transitions/robot_status.py +0 -0
  133. {isar-1.33.3 → isar-1.33.4}/src/isar/state_machine/utils/common_event_handlers.py +0 -0
  134. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/__init__.py +0 -0
  135. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/blob_storage.py +0 -0
  136. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/local_storage.py +0 -0
  137. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/storage_interface.py +0 -0
  138. {isar-1.33.3 → isar-1.33.4}/src/isar/storage/utilities.py +0 -0
  139. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/dependency_links.txt +0 -0
  140. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/entry_points.txt +0 -0
  141. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/requires.txt +0 -0
  142. {isar-1.33.3 → isar-1.33.4}/src/isar.egg-info/top_level.txt +0 -0
  143. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/__init__.py +0 -0
  144. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/__init__.py +0 -0
  145. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/exceptions/__init__.py +0 -0
  146. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  147. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/initialize/__init__.py +0 -0
  148. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/inspection/__init__.py +0 -0
  149. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/inspection/inspection.py +0 -0
  150. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/mission/__init__.py +0 -0
  151. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/mission/mission.py +0 -0
  152. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/mission/status.py +0 -0
  153. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/mission/task.py +0 -0
  154. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/robots/__init__.py +0 -0
  155. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/robots/battery_state.py +0 -0
  156. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/robots/media.py +0 -0
  157. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/models/robots/robot_model.py +0 -0
  158. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/robot_interface.py +0 -0
  159. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/telemetry/__init__.py +0 -0
  160. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  161. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/telemetry/payloads.py +0 -0
  162. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/test_robot_interface.py +0 -0
  163. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/utilities/__init__.py +0 -0
  164. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/utilities/json_service.py +0 -0
  165. {isar-1.33.3 → isar-1.33.4}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  166. {isar-1.33.3 → isar-1.33.4}/tests/__init__.py +0 -0
  167. {isar-1.33.3 → isar-1.33.4}/tests/conftest.py +0 -0
  168. {isar-1.33.3 → isar-1.33.4}/tests/integration/__init__.py +0 -0
  169. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/__init__.py +0 -0
  170. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/config/__init__.py +0 -0
  171. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  172. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  173. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  174. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/config/missions/default.json +0 -0
  175. {isar-1.33.3 → isar-1.33.4}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  176. {isar-1.33.3 → isar-1.33.4}/tests/isar/__init__.py +0 -0
  177. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/__init__.py +0 -0
  178. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/models/__init__.py +0 -0
  179. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/models/example_mission_definition.json +0 -0
  180. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/models/test_start_mission_definition.py +0 -0
  181. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/scheduler/__init__.py +0 -0
  182. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  183. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/security/__init__.py +0 -0
  184. {isar-1.33.3 → isar-1.33.4}/tests/isar/apis/security/test_authentication.py +0 -0
  185. {isar-1.33.3 → isar-1.33.4}/tests/isar/mission/__init__.py +0 -0
  186. {isar-1.33.3 → isar-1.33.4}/tests/isar/mission/test_mission.py +0 -0
  187. {isar-1.33.3 → isar-1.33.4}/tests/isar/models/__init__.py +0 -0
  188. {isar-1.33.3 → isar-1.33.4}/tests/isar/models/communication/__init__.py +0 -0
  189. {isar-1.33.3 → isar-1.33.4}/tests/isar/models/communication/test_events.py +0 -0
  190. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/__init__.py +0 -0
  191. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/readers/__init__.py +0 -0
  192. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/readers/test_mission_reader.py +0 -0
  193. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/service_connections/__init__.py +0 -0
  194. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  195. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  196. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/utilities/__init__.py +0 -0
  197. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  198. {isar-1.33.3 → isar-1.33.4}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  199. {isar-1.33.3 → isar-1.33.4}/tests/isar/state_machine/__init__.py +0 -0
  200. {isar-1.33.3 → isar-1.33.4}/tests/isar/state_machine/states/__init__.py +0 -0
  201. {isar-1.33.3 → isar-1.33.4}/tests/isar/state_machine/states/test_monitor.py +0 -0
  202. {isar-1.33.3 → isar-1.33.4}/tests/isar/state_machine/test_state_machine.py +0 -0
  203. {isar-1.33.3 → isar-1.33.4}/tests/isar/storage/test_blob_storage.py +0 -0
  204. {isar-1.33.3 → isar-1.33.4}/tests/test_data/test_map_config/test_map_config.json +0 -0
  205. {isar-1.33.3 → isar-1.33.4}/tests/test_data/test_mission_not_working.json +0 -0
  206. {isar-1.33.3 → isar-1.33.4}/tests/test_data/test_mission_working.json +0 -0
  207. {isar-1.33.3 → isar-1.33.4}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  208. {isar-1.33.3 → isar-1.33.4}/tests/test_data/test_thermal_image_mission.json +0 -0
  209. {isar-1.33.3 → isar-1.33.4}/tests/test_double/__init__.py +0 -0
  210. {isar-1.33.3 → isar-1.33.4}/tests/test_double/mission_definition.py +0 -0
  211. {isar-1.33.3 → isar-1.33.4}/tests/test_double/pose.py +0 -0
  212. {isar-1.33.3 → isar-1.33.4}/tests/test_double/request.py +0 -0
  213. {isar-1.33.3 → isar-1.33.4}/tests/test_double/robot_interface.py +0 -0
  214. {isar-1.33.3 → isar-1.33.4}/tests/test_double/status.py +0 -0
  215. {isar-1.33.3 → isar-1.33.4}/tests/test_double/task.py +0 -0
  216. {isar-1.33.3 → isar-1.33.4}/tests/test_double/token.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.33.3
3
+ Version: 1.33.4
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -106,15 +106,15 @@ class MqttClient(MqttClientInterface):
106
106
  )
107
107
 
108
108
  def on_connect(self, client, userdata, flags, reason_code, properties):
109
- self.logger.info(
110
- "Connection returned result: " + mqtt.connack_string(reason_code)
111
- )
112
-
113
- def on_disconnect(self, client, userdata, reason_code, properties):
114
- if reason_code != 0:
115
- self.logger.warning(
116
- f"Unexpected disconnection from MQTT Broker, {reason_code}"
117
- )
109
+ self.logger.info(f"Connected: {reason_code}")
110
+
111
+ def on_disconnect(self, client, userdata, *args):
112
+ if not args:
113
+ return
114
+ reason_code = args[0] if len(args) < 3 else args[1]
115
+ rc = getattr(reason_code, "value", reason_code)
116
+ if rc != 0:
117
+ self.logger.warning(f"Unexpected disconnect: {reason_code}.")
118
118
 
119
119
  @backoff.on_exception(
120
120
  backoff.expo,
@@ -29,6 +29,14 @@ from robot_interface.telemetry.payloads import (
29
29
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
30
30
 
31
31
 
32
+ def has_empty_blob_storage_path(storage_paths: StoragePaths):
33
+ for path in (storage_paths.data_path, storage_paths.metadata_path):
34
+ for value in (path.storage_account, path.blob_container, path.blob_name):
35
+ if not (value and value.strip()):
36
+ return True
37
+ return False
38
+
39
+
32
40
  @dataclass
33
41
  class UploaderQueueItem:
34
42
  inspection: Inspection
@@ -192,6 +200,13 @@ class Uploader:
192
200
  inspection_paths = self._upload(item)
193
201
  if isinstance(inspection_paths.data_path, LocalStoragePath):
194
202
  self.logger.info("Skipping publishing when using local storage")
203
+ elif isinstance(
204
+ inspection_paths.data_path, BlobStoragePath
205
+ ) and has_empty_blob_storage_path(inspection_paths):
206
+ self.logger.warning(
207
+ "Skipping publishing: Blob storage paths are empty for inspection %s",
208
+ str(item.inspection.id)[:8],
209
+ )
195
210
  else:
196
211
  self._publish_inspection_result(
197
212
  inspection=item.inspection,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isar
3
- Version: 1.33.3
3
+ Version: 1.33.4
4
4
  Summary: Integration and Supervisory control of Autonomous Robots
5
5
  Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
6
  License: Eclipse Public License version 2.0
@@ -204,6 +204,7 @@ tests/test_data/test_map_config/test_map_config.json
204
204
  tests/test_double/__init__.py
205
205
  tests/test_double/blob_storage.py
206
206
  tests/test_double/mission_definition.py
207
+ tests/test_double/mqtt_client.py
207
208
  tests/test_double/pose.py
208
209
  tests/test_double/request.py
209
210
  tests/test_double/robot_interface.py
@@ -14,7 +14,8 @@ from robot_interface.models.inspection.inspection import (
14
14
  from robot_interface.models.mission.mission import Mission
15
15
  from robot_interface.models.mission.task import TakeImage
16
16
  from tests.isar.state_machine.test_state_machine import UploaderThreadMock
17
- from tests.test_double.blob_storage import StorageFake
17
+ from tests.test_double.blob_storage import StorageEmptyBlobPathsFake, StorageFake
18
+ from tests.test_double.mqtt_client import MqttPublisherFake
18
19
 
19
20
  MISSION_ID = "some-mission-id"
20
21
  ARBITRARY_IMAGE_METADATA = ImageMetadata(
@@ -85,3 +86,33 @@ def test_should_retry_failed_upload_from_queue(
85
86
 
86
87
  # After some time, it should have retried and now it should be successful
87
88
  assert storage_handler.blob_exists(inspection)
89
+
90
+
91
+ def test_should_not_publish_when_blob_paths_are_empty(
92
+ container: ApplicationContainer, uploader_thread: UploaderThreadMock
93
+ ) -> None:
94
+ uploader_thread.start()
95
+
96
+ mission: Mission = Mission(name="Dummy mission")
97
+ inspection: Inspection = InspectionBlob(
98
+ metadata=ARBITRARY_IMAGE_METADATA, id="blob-empty"
99
+ )
100
+
101
+ uploader: Uploader = container.uploader()
102
+
103
+ storage_handler: StorageEmptyBlobPathsFake() = StorageEmptyBlobPathsFake() # type: ignore
104
+ uploader.storage_handlers[0] = storage_handler
105
+
106
+ mqtt_fake = MqttPublisherFake()
107
+ uploader.mqtt_publisher = mqtt_fake
108
+
109
+ message: Tuple[Inspection, Mission] = (
110
+ inspection,
111
+ mission,
112
+ )
113
+ uploader.upload_queue.put(message)
114
+ time.sleep(1)
115
+
116
+ assert inspection in storage_handler.stored
117
+
118
+ assert len(mqtt_fake.published) == 0
@@ -0,0 +1,41 @@
1
+ from typing import List
2
+
3
+ from isar.storage.storage_interface import (
4
+ BlobStoragePath,
5
+ StorageException,
6
+ StorageInterface,
7
+ StoragePaths,
8
+ )
9
+ from robot_interface.models.inspection.inspection import Inspection, InspectionBlob
10
+ from robot_interface.models.mission.mission import Mission
11
+
12
+
13
+ class StorageFake(StorageInterface):
14
+ will_fail: bool = False
15
+
16
+ def __init__(self) -> None:
17
+ self.stored_inspections: List[Inspection] = []
18
+
19
+ def store(self, inspection: Inspection, mission: Mission):
20
+ if self.will_fail:
21
+ raise StorageException("Fake failed on purpose")
22
+ self.stored_inspections.append(inspection)
23
+
24
+ def blob_exists(self, inspection: Inspection) -> bool:
25
+ return inspection in self.stored_inspections
26
+
27
+
28
+ class StorageEmptyBlobPathsFake(StorageInterface):
29
+
30
+ def __init__(self) -> None:
31
+ self.stored: List[Inspection] = []
32
+ self.fail: bool = False
33
+
34
+ def store(
35
+ self, inspection: InspectionBlob, mission: Mission
36
+ ) -> StoragePaths[BlobStoragePath]:
37
+ if self.fail:
38
+ raise StorageException("fail on purpose")
39
+ self.stored.append(inspection)
40
+ empty = BlobStoragePath(storage_account="", blob_container="", blob_name="")
41
+ return StoragePaths(data_path=empty, metadata_path=empty)
@@ -0,0 +1,37 @@
1
+ from threading import Lock
2
+ from typing import Any, Dict, List, Optional
3
+
4
+ from robot_interface.telemetry.mqtt_client import MqttClientInterface
5
+
6
+
7
+ class MqttPublisherFake(MqttClientInterface):
8
+ def __init__(self) -> None:
9
+ self._lock = Lock()
10
+ self.published: List[Dict[str, Any]] = []
11
+
12
+ def publish(
13
+ self,
14
+ topic: str,
15
+ payload: str,
16
+ qos: int = 0,
17
+ retain: bool = False,
18
+ properties: Optional[Any] = None,
19
+ ) -> None:
20
+ with self._lock:
21
+ self.published.append(
22
+ {
23
+ "topic": topic,
24
+ "payload": payload,
25
+ "qos": qos,
26
+ "retain": retain,
27
+ "properties": properties,
28
+ }
29
+ )
30
+
31
+ def last(self) -> Optional[Dict[str, Any]]:
32
+ with self._lock:
33
+ return self.published[-1] if self.published else None
34
+
35
+ def count(self) -> int:
36
+ with self._lock:
37
+ return len(self.published)
@@ -1,20 +0,0 @@
1
- from typing import List
2
-
3
- from isar.storage.storage_interface import StorageException, StorageInterface
4
- from robot_interface.models.inspection.inspection import Inspection
5
- from robot_interface.models.mission.mission import Mission
6
-
7
-
8
- class StorageFake(StorageInterface):
9
- will_fail: bool = False
10
-
11
- def __init__(self) -> None:
12
- self.stored_inspections: List[Inspection] = []
13
-
14
- def store(self, inspection: Inspection, mission: Mission):
15
- if self.will_fail:
16
- raise StorageException("Fake failed on purpose")
17
- self.stored_inspections.append(inspection)
18
-
19
- def blob_exists(self, inspection: Inspection) -> bool:
20
- return inspection in self.stored_inspections
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes