isar 1.24.5__tar.gz → 1.24.6__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 (205) hide show
  1. {isar-1.24.5 → isar-1.24.6}/PKG-INFO +1 -1
  2. isar-1.24.6/src/isar/config/certs/ca-cert.pem +35 -0
  3. {isar-1.24.5 → isar-1.24.6}/src/isar/script.py +4 -3
  4. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/state_machine.py +2 -2
  5. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/idle.py +9 -7
  6. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/PKG-INFO +1 -1
  7. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/SOURCES.txt +0 -1
  8. {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/test_state_machine.py +47 -106
  9. {isar-1.24.5 → isar-1.24.6}/tests/isar/storage/test_uploader.py +23 -27
  10. {isar-1.24.5 → isar-1.24.6}/tests/mocks/robot_interface.py +0 -1
  11. isar-1.24.5/src/isar/config/certs/ca-cert.pem +0 -35
  12. isar-1.24.5/tests/test_data/test_json_file.json +0 -227
  13. {isar-1.24.5 → isar-1.24.6}/.dockerignore +0 -0
  14. {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  16. {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
  17. {isar-1.24.5 → isar-1.24.6}/.github/release.yml +0 -0
  18. {isar-1.24.5 → isar-1.24.6}/.github/workflows/compile_requirements.yml +0 -0
  19. {isar-1.24.5 → isar-1.24.6}/.github/workflows/project_automations.yml +0 -0
  20. {isar-1.24.5 → isar-1.24.6}/.github/workflows/publish_isar_base_image.yml +0 -0
  21. {isar-1.24.5 → isar-1.24.6}/.github/workflows/pythonpackage.yml +0 -0
  22. {isar-1.24.5 → isar-1.24.6}/.github/workflows/pythonpublish.yml +0 -0
  23. {isar-1.24.5 → isar-1.24.6}/.github/workflows/stale.yml +0 -0
  24. {isar-1.24.5 → isar-1.24.6}/.gitignore +0 -0
  25. {isar-1.24.5 → isar-1.24.6}/.pre-commit-config.yaml +0 -0
  26. {isar-1.24.5 → isar-1.24.6}/Dockerfile +0 -0
  27. {isar-1.24.5 → isar-1.24.6}/LICENSE +0 -0
  28. {isar-1.24.5 → isar-1.24.6}/README.md +0 -0
  29. {isar-1.24.5 → isar-1.24.6}/SECURITY.md +0 -0
  30. {isar-1.24.5 → isar-1.24.6}/docker-compose-turtlebot.yml +0 -0
  31. {isar-1.24.5 → isar-1.24.6}/docker-compose.yml +0 -0
  32. {isar-1.24.5 → isar-1.24.6}/docs/Makefile +0 -0
  33. {isar-1.24.5 → isar-1.24.6}/docs/make.bat +0 -0
  34. {isar-1.24.5 → isar-1.24.6}/docs/rst_processing.py +0 -0
  35. {isar-1.24.5 → isar-1.24.6}/docs/source/conf.py +0 -0
  36. {isar-1.24.5 → isar-1.24.6}/docs/source/index.rst +0 -0
  37. {isar-1.24.5 → isar-1.24.6}/docs/source/readme_link.md +0 -0
  38. {isar-1.24.5 → isar-1.24.6}/docs/state_machine_diagram.png +0 -0
  39. {isar-1.24.5 → isar-1.24.6}/main.py +0 -0
  40. {isar-1.24.5 → isar-1.24.6}/pyproject.toml +0 -0
  41. {isar-1.24.5 → isar-1.24.6}/radixconfig.yml +0 -0
  42. {isar-1.24.5 → isar-1.24.6}/requirements.txt +0 -0
  43. {isar-1.24.5 → isar-1.24.6}/setup.cfg +0 -0
  44. {isar-1.24.5 → isar-1.24.6}/src/isar/__init__.py +0 -0
  45. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/__init__.py +0 -0
  46. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/api.py +0 -0
  47. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/__init__.py +0 -0
  48. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/models.py +0 -0
  49. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/start_mission_definition.py +0 -0
  50. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/robot_control/robot_controller.py +0 -0
  51. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/schedule/__init__.py +0 -0
  52. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/schedule/scheduling_controller.py +0 -0
  53. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/security/__init__.py +0 -0
  54. {isar-1.24.5 → isar-1.24.6}/src/isar/apis/security/authentication.py +0 -0
  55. {isar-1.24.5 → isar-1.24.6}/src/isar/config/__init__.py +0 -0
  56. {isar-1.24.5 → isar-1.24.6}/src/isar/config/configuration_error.py +0 -0
  57. {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/__init__.py +0 -0
  58. {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/keyvault_error.py +0 -0
  59. {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/keyvault_service.py +0 -0
  60. {isar-1.24.5 → isar-1.24.6}/src/isar/config/log.py +0 -0
  61. {isar-1.24.5 → isar-1.24.6}/src/isar/config/logging.conf +0 -0
  62. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
  63. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
  64. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/default_map.json +0 -0
  65. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_b.json +0 -0
  66. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_compressor.json +0 -0
  67. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_turtlebot.json +0 -0
  68. {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/turtleworld.json +0 -0
  69. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
  70. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
  71. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
  72. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
  73. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/__init__.py +0 -0
  74. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/default.json +0 -0
  75. {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
  76. {isar-1.24.5 → isar-1.24.6}/src/isar/config/settings.env +0 -0
  77. {isar-1.24.5 → isar-1.24.6}/src/isar/config/settings.py +0 -0
  78. {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/__init__.py +0 -0
  79. {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/local_planner.py +0 -0
  80. {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/mission_planner_interface.py +0 -0
  81. {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/sequential_task_selector.py +0 -0
  82. {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/task_selector_interface.py +0 -0
  83. {isar-1.24.5 → isar-1.24.6}/src/isar/models/__init__.py +0 -0
  84. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/__init__.py +0 -0
  85. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/message.py +0 -0
  86. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/__init__.py +0 -0
  87. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queue_io.py +0 -0
  88. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
  89. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queues.py +0 -0
  90. {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/status_queue.py +0 -0
  91. {isar-1.24.5 → isar-1.24.6}/src/isar/models/mission_metadata/__init__.py +0 -0
  92. {isar-1.24.5 → isar-1.24.6}/src/isar/modules.py +0 -0
  93. {isar-1.24.5 → isar-1.24.6}/src/isar/services/__init__.py +0 -0
  94. {isar-1.24.5 → isar-1.24.6}/src/isar/services/auth/__init__.py +0 -0
  95. {isar-1.24.5 → isar-1.24.6}/src/isar/services/auth/azure_credentials.py +0 -0
  96. {isar-1.24.5 → isar-1.24.6}/src/isar/services/readers/__init__.py +0 -0
  97. {isar-1.24.5 → isar-1.24.6}/src/isar/services/readers/base_reader.py +0 -0
  98. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/__init__.py +0 -0
  99. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
  100. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
  101. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
  102. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
  103. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/request_handler.py +0 -0
  104. {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/stid/__init__.py +0 -0
  105. {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/__init__.py +0 -0
  106. {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/queue_utilities.py +0 -0
  107. {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/robot_utilities.py +0 -0
  108. {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/scheduling_utilities.py +0 -0
  109. {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/threaded_request.py +0 -0
  110. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/__init__.py +0 -0
  111. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/__init__.py +0 -0
  112. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/initialize.py +0 -0
  113. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/initiate.py +0 -0
  114. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/monitor.py +0 -0
  115. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/off.py +0 -0
  116. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/offline.py +0 -0
  117. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/paused.py +0 -0
  118. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/stop.py +0 -0
  119. {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states_enum.py +0 -0
  120. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/__init__.py +0 -0
  121. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/blob_storage.py +0 -0
  122. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/local_storage.py +0 -0
  123. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/slimm_storage.py +0 -0
  124. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/storage_interface.py +0 -0
  125. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/uploader.py +0 -0
  126. {isar-1.24.5 → isar-1.24.6}/src/isar/storage/utilities.py +0 -0
  127. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/dependency_links.txt +0 -0
  128. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/entry_points.txt +0 -0
  129. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/requires.txt +0 -0
  130. {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/top_level.txt +0 -0
  131. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/__init__.py +0 -0
  132. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/__init__.py +0 -0
  133. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/exceptions/__init__.py +0 -0
  134. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
  135. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/initialize/__init__.py +0 -0
  136. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/initialize/initialize_params.py +0 -0
  137. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/inspection/__init__.py +0 -0
  138. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/inspection/inspection.py +0 -0
  139. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/__init__.py +0 -0
  140. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/mission.py +0 -0
  141. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/status.py +0 -0
  142. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/task.py +0 -0
  143. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/__init__.py +0 -0
  144. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/media.py +0 -0
  145. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/robot_model.py +0 -0
  146. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/robot_interface.py +0 -0
  147. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/__init__.py +0 -0
  148. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/mqtt_client.py +0 -0
  149. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/payloads.py +0 -0
  150. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/test_robot_interface.py +0 -0
  151. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/__init__.py +0 -0
  152. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/json_service.py +0 -0
  153. {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
  154. {isar-1.24.5 → isar-1.24.6}/tests/__init__.py +0 -0
  155. {isar-1.24.5 → isar-1.24.6}/tests/conftest.py +0 -0
  156. {isar-1.24.5 → isar-1.24.6}/tests/integration/__init__.py +0 -0
  157. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/__init__.py +0 -0
  158. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/__init__.py +0 -0
  159. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
  160. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
  161. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
  162. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/missions/default.json +0 -0
  163. {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/test_successful_mission.py +0 -0
  164. {isar-1.24.5 → isar-1.24.6}/tests/isar/__init__.py +0 -0
  165. {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/__init__.py +0 -0
  166. {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/scheduler/__init__.py +0 -0
  167. {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
  168. {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/security/__init__.py +0 -0
  169. {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/security/test_authentication.py +0 -0
  170. {isar-1.24.5 → isar-1.24.6}/tests/isar/mission/__init__.py +0 -0
  171. {isar-1.24.5 → isar-1.24.6}/tests/isar/mission/test_mission.py +0 -0
  172. {isar-1.24.5 → isar-1.24.6}/tests/isar/models/__init__.py +0 -0
  173. {isar-1.24.5 → isar-1.24.6}/tests/isar/models/communication/__init__.py +0 -0
  174. {isar-1.24.5 → isar-1.24.6}/tests/isar/models/communication/test_queues.py +0 -0
  175. {isar-1.24.5 → isar-1.24.6}/tests/isar/models/example_mission_definition.json +0 -0
  176. {isar-1.24.5 → isar-1.24.6}/tests/isar/models/test_start_mission_definition.py +0 -0
  177. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/__init__.py +0 -0
  178. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/__init__.py +0 -0
  179. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/test_base_reader.py +0 -0
  180. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/test_mission_reader.py +0 -0
  181. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/__init__.py +0 -0
  182. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/echo/__init__.py +0 -0
  183. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
  184. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/__init__.py +0 -0
  185. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
  186. {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
  187. {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/__init__.py +0 -0
  188. {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/states/__init__.py +0 -0
  189. {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/states/test_monitor.py +0 -0
  190. {isar-1.24.5 → isar-1.24.6}/tests/isar/storage/test_blob_storage.py +0 -0
  191. {isar-1.24.5 → isar-1.24.6}/tests/mocks/__init__.py +0 -0
  192. {isar-1.24.5 → isar-1.24.6}/tests/mocks/blob_storage.py +0 -0
  193. {isar-1.24.5 → isar-1.24.6}/tests/mocks/mission_definition.py +0 -0
  194. {isar-1.24.5 → isar-1.24.6}/tests/mocks/mqtt_client.py +0 -0
  195. {isar-1.24.5 → isar-1.24.6}/tests/mocks/pose.py +0 -0
  196. {isar-1.24.5 → isar-1.24.6}/tests/mocks/request.py +0 -0
  197. {isar-1.24.5 → isar-1.24.6}/tests/mocks/status.py +0 -0
  198. {isar-1.24.5 → isar-1.24.6}/tests/mocks/task.py +0 -0
  199. {isar-1.24.5 → isar-1.24.6}/tests/mocks/token.py +0 -0
  200. {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_map_config/test_map_config.json +0 -0
  201. {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_not_working.json +0 -0
  202. {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_working.json +0 -0
  203. {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_working_no_tasks.json +0 -0
  204. {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_thermal_image_mission.json +0 -0
  205. {isar-1.24.5 → isar-1.24.6}/tests/test_modules.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.24.5
3
+ Version: 1.24.6
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
@@ -0,0 +1,35 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIGGzCCBAOgAwIBAgIUCVuS8tL7R2bdjRJznkk1NN0oUa8wDQYJKoZIhvcNAQEL
3
+ BQAwgZwxCzAJBgNVBAYTAk5PMQ8wDQYDVQQIDAZCZXJnZW4xDzANBgNVBAcMBkJl
4
+ cmdlbjEUMBIGA1UECgwLRXFfUm9ib3RpY3MxETAPBgNVBAsMCFJvYm90aWNzMRww
5
+ GgYDVQQDDBNSb2JvdGljc19TZWxmU2lnbmVkMSQwIgYJKoZIhvcNAQkBFhVmZ19y
6
+ b2JvdHNAZXF1aW5vci5jb20wHhcNMjQxMjExMDczNzAzWhcNMjUxMjExMDczNzAz
7
+ WjCBnDELMAkGA1UEBhMCTk8xDzANBgNVBAgMBkJlcmdlbjEPMA0GA1UEBwwGQmVy
8
+ Z2VuMRQwEgYDVQQKDAtFcV9Sb2JvdGljczERMA8GA1UECwwIUm9ib3RpY3MxHDAa
9
+ BgNVBAMME1JvYm90aWNzX1NlbGZTaWduZWQxJDAiBgkqhkiG9w0BCQEWFWZnX3Jv
10
+ Ym90c0BlcXVpbm9yLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
11
+ ALVlT8EjA8UpXdARJM6YfhH+9DEyytb0SJYOEm9jWL7X0G5eMbNfKtfFj/BLQBBw
12
+ GDqyvhFa8SO56zM3Yi1Lir41JkpOKf2zJpNaL1syPxOA87MAm43UN/p2Mo6QAYpC
13
+ lJzmeNoagLFi/kIzGajeUwISOf//Zej0jK/9CpuvvNVHz4wRk4Ap9qtgrM9qhlNq
14
+ rZL4ZQODnvDZ/nwAYwEh9O2sbRr73aiHFcbxNAU2XxtT5UwbZMHom2Xic2Dmubqn
15
+ cWFU+C4upEqPvgYU/hxia/rkhHyicXmdXT6IzjVxPbrlPBHoKVodJOCQ3UoBQl5X
16
+ caHCluKOblA/yX+vEhv2h/m8XOtWiq0Jxnx+6D7B1piZfQnnNVSBT0bOYASb2cpn
17
+ 8rJE3RBdBwiqjKTotVTZ8PAS/GY0Gz3GoMAUCvIGA02+/cO9ENls9D79/86lgiCQ
18
+ UqyteNNmo+oMqKHBw9Jmeejw1kbpnJN1abc270+qCT17aeX8yiMza5CyUTQTtgFI
19
+ 62xIYaHWhN7GrxOvoMU8X0G1HINwjS5heIhu5bND/26dLZqV3aBUWwb4ql5QIce2
20
+ q5BQKmMqQLZF6J0aFL9dKJv5u3ioPFmiYPsPiRlwusPOoOFCiMt2kqZE3h3wxu6V
21
+ cXWdj0sH+dgxuGYTxrLuoSru4Xv/HPXh15mVY0/eI+u/AgMBAAGjUzBRMB0GA1Ud
22
+ DgQWBBQW2Ms6M3iadKVLOnraMlx6Exm8KjAfBgNVHSMEGDAWgBQW2Ms6M3iadKVL
23
+ OnraMlx6Exm8KjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQB0
24
+ XorfCLmVUN3aQWBouwG0fXHBqi3d4RA0vPsi8w+R/dOuHnLBLlHAiOkCMqW23bLs
25
+ ir2UVqpGXcp5keKGeCTj+bmdqhnS/B9eoaeA8np/zDPH834v+Qv7JA5ch50gYrL7
26
+ llF/02e5m0egP2xx9V7k90Du8OBm7xQgfbyrUcB2laC+loPyQiHMF24CU4ESfC4K
27
+ DBXOZm8Kd6+fvzEs8XDLKwjNb9MocHIJikysZTncxfhgVPaU5KCqF3afHkCkZGzn
28
+ Z+yMBfWbZ2WtM3lfwmM7z5NCTSqSFucW5+kw/OnzS3nQLyz2Q4nh4ApojsI3v+FH
29
+ xz8aCITPbVwKAHGYO9jbk9x8LlkzDPCCzBH7dGKLKaQSCoD+IOwig1cI7pM77WeI
30
+ BNC0g2ZCuLdb7c37/kT/1xGrIGUrpDsO34ZWW7E2X8kQPkAgqMNp0uXcnvIoNHO1
31
+ eVL08Om+7WbwK7wS3te5IWDq4rRWVW4Jv709w8z6porr3W8ipdtUoYqbgZI8jOiW
32
+ osY4UVcRwQ4S1oF5pNRzXlZAPwAnaDipglxHBiy9/ARS6HKpOCbmUHbj+goXYNyZ
33
+ ps8TcYc9LFOq4HBE4KKbV971jf/wQy1nVcm2qSbOJ9MPHM5BG22m1iVhSYbLPgE2
34
+ SBZvCS+voD8MqpBB1tPcvVqlPb1pFxf1lOc5QV3uOA==
35
+ -----END CERTIFICATE-----
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import sys
2
3
  import time
3
4
  from logging import Logger
4
5
  from threading import Thread
@@ -20,10 +21,10 @@ from isar.services.service_connections.mqtt.robot_heartbeat_publisher import (
20
21
  from isar.services.service_connections.mqtt.robot_info_publisher import (
21
22
  RobotInfoPublisher,
22
23
  )
23
- from robot_interface.models.inspection.inspection import Inspection
24
- from robot_interface.models.mission.mission import Mission
25
24
  from isar.state_machine.state_machine import StateMachine, main
26
25
  from isar.storage.uploader import Uploader
26
+ from robot_interface.models.inspection.inspection import Inspection
27
+ from robot_interface.models.mission.mission import Mission
27
28
  from robot_interface.robot_interface import RobotInterface
28
29
 
29
30
 
@@ -168,5 +169,5 @@ def start():
168
169
  for thread in threads:
169
170
  if not thread.is_alive():
170
171
  logger.critical("Thread '%s' failed - ISAR shutting down", thread.name)
171
- exit(1)
172
+ sys.exit(1)
172
173
  time.sleep(state_machine.sleep_time)
@@ -33,7 +33,7 @@ from robot_interface.models.exceptions.robot_exceptions import ErrorMessage
33
33
  from robot_interface.models.initialize.initialize_params import InitializeParams
34
34
  from robot_interface.models.mission.mission import Mission
35
35
  from robot_interface.models.mission.status import MissionStatus, RobotStatus, TaskStatus
36
- from robot_interface.models.mission.task import TASKS, Task
36
+ from robot_interface.models.mission.task import TASKS
37
37
  from robot_interface.robot_interface import RobotInterface
38
38
  from robot_interface.telemetry.mqtt_client import MqttClientInterface
39
39
  from robot_interface.utilities.json_service import EnhancedJSONEncoder
@@ -324,7 +324,7 @@ class StateMachine(object):
324
324
  self.current_mission.status = MissionStatus.InProgress
325
325
  self.publish_mission_status()
326
326
  self.current_task = self.task_selector.next_task()
327
- if self.current_task == None:
327
+ if self.current_task is None:
328
328
  self._mission_finished()
329
329
  else:
330
330
  self.current_task.status = TaskStatus.InProgress
@@ -34,6 +34,14 @@ class Idle(State):
34
34
  self.robot_status_thread.wait_for_thread()
35
35
  self.robot_status_thread = None
36
36
 
37
+ def _is_ready_to_poll_for_status(self) -> bool:
38
+ time_since_last_robot_status_poll = (
39
+ time.time() - self.last_robot_status_poll_time
40
+ )
41
+ return (
42
+ time_since_last_robot_status_poll > settings.ROBOT_API_STATUS_POLL_INTERVAL
43
+ )
44
+
37
45
  def _run(self) -> None:
38
46
  while True:
39
47
  if self.state_machine.should_stop_mission():
@@ -51,13 +59,7 @@ class Idle(State):
51
59
  break
52
60
  time.sleep(self.state_machine.sleep_time)
53
61
 
54
- time_from_last_robot_status_poll = (
55
- time.time() - self.last_robot_status_poll_time
56
- )
57
- if (
58
- time_from_last_robot_status_poll
59
- < settings.ROBOT_API_STATUS_POLL_INTERVAL
60
- ):
62
+ if not self._is_ready_to_poll_for_status():
61
63
  continue
62
64
 
63
65
  if not self.robot_status_thread:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: isar
3
- Version: 1.24.5
3
+ Version: 1.24.6
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
@@ -194,7 +194,6 @@ tests/mocks/robot_interface.py
194
194
  tests/mocks/status.py
195
195
  tests/mocks/task.py
196
196
  tests/mocks/token.py
197
- tests/test_data/test_json_file.json
198
197
  tests/test_data/test_mission_not_working.json
199
198
  tests/test_data/test_mission_working.json
200
199
  tests/test_data/test_mission_working_no_tasks.json
@@ -9,11 +9,11 @@ from injector import Injector
9
9
  from pytest_mock import MockerFixture
10
10
 
11
11
  from isar.config.settings import settings
12
-
13
12
  from isar.mission_planner.local_planner import LocalPlanner
14
13
  from isar.models.communication.queues.queues import Queues
15
14
  from isar.services.utilities.scheduling_utilities import SchedulingUtilities
16
15
  from isar.state_machine.state_machine import StateMachine, main
16
+ from isar.state_machine.states.idle import Idle
17
17
  from isar.state_machine.states_enum import States
18
18
  from isar.storage.storage_interface import StorageInterface
19
19
  from isar.storage.uploader import Uploader
@@ -23,8 +23,7 @@ from robot_interface.models.exceptions.robot_exceptions import (
23
23
  )
24
24
  from robot_interface.models.mission.mission import Mission
25
25
  from robot_interface.models.mission.status import TaskStatus
26
- from robot_interface.models.mission.task import ReturnToHome, TakeImage
27
- from robot_interface.models.mission.task import Task
26
+ from robot_interface.models.mission.task import ReturnToHome, TakeImage, Task
28
27
  from robot_interface.telemetry.mqtt_client import MqttClientInterface
29
28
  from tests.mocks.pose import MockPose
30
29
  from tests.mocks.robot_interface import MockRobot, MockRobotIdleToOfflineToIdleTest
@@ -33,7 +32,7 @@ from tests.mocks.task import MockTask
33
32
 
34
33
  class StateMachineThread(object):
35
34
  def __init__(self, injector) -> None:
36
- settings.UPLOAD_INSPECTIONS_ASYNC = False
35
+ # settings.UPLOAD_INSPECTIONS_ASYNC = False
37
36
  self.injector: Injector = injector
38
37
  self.state_machine: StateMachine = injector.get(StateMachine)
39
38
  self._thread: Thread = Thread(target=main, args=[self.state_machine])
@@ -45,7 +44,6 @@ class StateMachineThread(object):
45
44
 
46
45
  class UploaderThread(object):
47
46
  def __init__(self, injector) -> None:
48
- settings.UPLOAD_INSPECTIONS_ASYNC = False
49
47
  self.injector: Injector = injector
50
48
  self.uploader: Uploader = Uploader(
51
49
  queues=self.injector.get(Queues),
@@ -67,14 +65,6 @@ def uploader_thread(injector) -> UploaderThread:
67
65
  return UploaderThread(injector=injector)
68
66
 
69
67
 
70
- def get_mission() -> Mission:
71
- mission_reader: LocalPlanner = LocalPlanner()
72
- mission: Mission = mission_reader.read_mission_from_file(
73
- Path("./tests/test_data/test_mission_working.json")
74
- )
75
- return mission
76
-
77
-
78
68
  def test_initial_off(state_machine) -> None:
79
69
  assert state_machine.state == "off"
80
70
 
@@ -92,18 +82,8 @@ def test_reset_state_machine(state_machine) -> None:
92
82
  assert state_machine.current_mission is None
93
83
 
94
84
 
95
- empty_mission: Mission = Mission([], None)
96
-
97
-
98
- @pytest.mark.parametrize(
99
- "should_run_by_task",
100
- [
101
- (True),
102
- (False),
103
- ],
104
- )
105
- def test_state_machine_transitions(
106
- injector, state_machine_thread, should_run_by_task
85
+ def test_state_machine_transitions_when_running_mission_by_task(
86
+ injector, state_machine_thread
107
87
  ) -> None:
108
88
  task_1: Task = TakeImage(
109
89
  target=MockPose.default_pose().position, robot_pose=MockPose.default_pose()
@@ -111,39 +91,24 @@ def test_state_machine_transitions(
111
91
  task_2: Task = ReturnToHome(pose=MockPose.default_pose())
112
92
  mission: Mission = Mission(tasks=[task_1, task_2]) # type: ignore
113
93
 
114
- state_machine_thread.state_machine.run_mission_by_task = should_run_by_task
94
+ state_machine_thread.state_machine.run_mission_by_task = True
115
95
  state_machine_thread.start()
116
96
 
117
97
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
118
98
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
99
+ time.sleep(0.01)
119
100
 
120
- time.sleep(3)
121
- if should_run_by_task:
122
- expected_transitions_list = deque(
123
- [
124
- States.Idle,
125
- States.Initialize,
126
- States.Initiate,
127
- States.Monitor,
128
- States.Initiate,
129
- States.Monitor,
130
- States.Initiate,
131
- States.Idle,
132
- ]
133
- )
134
- else:
135
- expected_transitions_list = deque(
136
- [
137
- States.Idle,
138
- States.Initialize,
139
- States.Initiate,
140
- States.Monitor,
141
- States.Initiate,
142
- States.Idle,
143
- ]
144
- )
145
- assert (
146
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
101
+ assert state_machine_thread.state_machine.transitions_list == deque(
102
+ [
103
+ States.Idle,
104
+ States.Initialize,
105
+ States.Initiate,
106
+ States.Monitor,
107
+ States.Initiate,
108
+ States.Monitor,
109
+ States.Initiate,
110
+ States.Idle,
111
+ ]
147
112
  )
148
113
 
149
114
 
@@ -161,9 +126,9 @@ def test_state_machine_transitions_when_running_full_mission(
161
126
 
162
127
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
163
128
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
129
+ time.sleep(0.11) # Slightly more than the StateMachine sleep time
164
130
 
165
- time.sleep(3)
166
- expected_transitions_list = deque(
131
+ assert state_machine_thread.state_machine.transitions_list == deque(
167
132
  [
168
133
  States.Idle,
169
134
  States.Initialize,
@@ -173,9 +138,6 @@ def test_state_machine_transitions_when_running_full_mission(
173
138
  States.Idle,
174
139
  ]
175
140
  )
176
- assert (
177
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
178
- )
179
141
 
180
142
 
181
143
  def test_state_machine_failed_dependency(
@@ -195,9 +157,9 @@ def test_state_machine_failed_dependency(
195
157
 
196
158
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
197
159
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
160
+ time.sleep(0.01)
198
161
 
199
- time.sleep(3)
200
- expected_transitions_list = deque(
162
+ assert state_machine_thread.state_machine.transitions_list == deque(
201
163
  [
202
164
  States.Idle,
203
165
  States.Initialize,
@@ -209,9 +171,6 @@ def test_state_machine_failed_dependency(
209
171
  States.Idle,
210
172
  ]
211
173
  )
212
- assert (
213
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
214
- )
215
174
 
216
175
 
217
176
  def test_state_machine_with_successful_collection(
@@ -225,8 +184,11 @@ def test_state_machine_with_successful_collection(
225
184
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
226
185
 
227
186
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
228
- time.sleep(3)
229
- expected_transitions_list = deque(
187
+ time.sleep(0.11) # Slightly more than the StateMachine sleep time
188
+
189
+ expected_stored_items = 1
190
+ assert len(storage_mock.stored_inspections) == expected_stored_items # type: ignore
191
+ assert state_machine_thread.state_machine.transitions_list == deque(
230
192
  [
231
193
  States.Idle,
232
194
  States.Initialize,
@@ -236,11 +198,6 @@ def test_state_machine_with_successful_collection(
236
198
  States.Idle,
237
199
  ]
238
200
  )
239
- expected_stored_items = 1
240
- assert len(storage_mock.stored_inspections) == expected_stored_items # type: ignore
241
- assert (
242
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
243
- )
244
201
 
245
202
 
246
203
  def test_state_machine_with_unsuccessful_collection(
@@ -256,8 +213,12 @@ def test_state_machine_with_unsuccessful_collection(
256
213
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
257
214
 
258
215
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
259
- time.sleep(3)
260
- expected_transitions_list = deque(
216
+ time.sleep(0.11) # Slightly more than the StateMachine sleep time
217
+
218
+ expected_stored_items = 0
219
+ assert len(storage_mock.stored_inspections) == expected_stored_items # type: ignore
220
+
221
+ assert state_machine_thread.state_machine.transitions_list == deque(
261
222
  [
262
223
  States.Idle,
263
224
  States.Initialize,
@@ -267,18 +228,11 @@ def test_state_machine_with_unsuccessful_collection(
267
228
  States.Idle,
268
229
  ]
269
230
  )
270
- expected_stored_items = 0
271
- assert len(storage_mock.stored_inspections) == expected_stored_items # type: ignore
272
- print(state_machine_thread.state_machine.transitions_list)
273
- assert (
274
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
275
- )
276
231
 
277
232
 
278
233
  def test_state_machine_with_successful_mission_stop(
279
234
  injector: Injector,
280
235
  state_machine_thread: StateMachineThread,
281
- caplog: pytest.LogCaptureFixture,
282
236
  ) -> None:
283
237
  state_machine_thread.start()
284
238
 
@@ -287,16 +241,10 @@ def test_state_machine_with_successful_mission_stop(
287
241
  scheduling_utilities: SchedulingUtilities = injector.get(SchedulingUtilities)
288
242
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
289
243
  scheduling_utilities.stop_mission()
290
- time.sleep(3)
291
244
 
292
- actual = state_machine_thread.state_machine.transitions_list
293
- unexpected_log = (
294
- "Could not communicate request: Reached limit for stop attempts. "
295
- "Cancelled mission and transitioned to idle."
245
+ assert state_machine_thread.state_machine.transitions_list == deque(
246
+ [States.Idle, States.Initialize, States.Initiate, States.Stop, States.Idle]
296
247
  )
297
- assert unexpected_log not in caplog.text
298
- assert States.Idle == actual.pop()
299
- assert States.Stop == actual.pop()
300
248
 
301
249
 
302
250
  def test_state_machine_with_unsuccessful_mission_stop(
@@ -316,37 +264,30 @@ def test_state_machine_with_unsuccessful_mission_stop(
316
264
  state_machine_thread.start()
317
265
 
318
266
  scheduling_utilities.start_mission(mission=mission, initial_pose=None)
319
-
320
267
  scheduling_utilities.stop_mission()
321
268
 
322
- expected = deque(
323
- [
324
- States.Idle,
325
- States.Initialize,
326
- States.Initiate,
327
- States.Stop,
328
- States.Idle,
329
- ]
330
- )
331
- actual = state_machine_thread.state_machine.transitions_list
332
269
  expected_log = (
333
270
  "Be aware that the robot may still be "
334
271
  "moving even though a stop has been attempted"
335
272
  )
336
273
  assert expected_log in caplog.text
337
- assert expected == actual
274
+ assert state_machine_thread.state_machine.transitions_list == deque(
275
+ [States.Idle, States.Initialize, States.Initiate, States.Stop, States.Idle]
276
+ )
338
277
 
339
278
 
340
- def test_state_machine_idle_to_offline_to_idle(state_machine_thread) -> None:
341
- state_machine_thread.state_machine.robot = MockRobotIdleToOfflineToIdleTest()
279
+ def test_state_machine_idle_to_offline_to_idle(mocker, state_machine_thread) -> None:
280
+
281
+ # Robot status check happens every 5 seconds by default, so we mock the behavior
282
+ # to poll for status imediately
283
+ mocker.patch.object(Idle, "_is_ready_to_poll_for_status", return_value=True)
342
284
 
285
+ state_machine_thread.state_machine.robot = MockRobotIdleToOfflineToIdleTest()
343
286
  state_machine_thread.start()
344
- # Robot status check happens every 5 seconds by default
345
- time.sleep(13) # Ensure that robot_status have been called again in Idle
287
+ time.sleep(0.11) # Slightly more than the StateMachine sleep time
346
288
 
347
- expected_transitions_list = deque([States.Idle, States.Offline, States.Idle])
348
- assert (
349
- state_machine_thread.state_machine.transitions_list == expected_transitions_list
289
+ assert state_machine_thread.state_machine.transitions_list == deque(
290
+ [States.Idle, States.Offline, States.Idle]
350
291
  )
351
292
 
352
293
 
@@ -5,7 +5,6 @@ from typing import List, Tuple
5
5
 
6
6
  import pytest
7
7
  from alitra import Frame, Orientation, Pose, Position
8
- from injector import Injector
9
8
 
10
9
  from isar.models.communication.queues.queues import Queues
11
10
  from isar.storage.storage_interface import StorageInterface
@@ -24,28 +23,25 @@ ARBITRARY_IMAGE_METADATA = ImageMetadata(
24
23
  ),
25
24
  file_type="jpg",
26
25
  )
27
- DATA_BYTES: bytes = b"Lets say this is some image data"
28
26
 
29
27
 
30
- class UploaderThread(object):
31
- def __init__(self, injector) -> None:
32
- self.injector: Injector = injector
33
- self.uploader: Uploader = Uploader(
34
- queues=self.injector.get(Queues),
35
- storage_handlers=injector.get(List[StorageInterface]),
36
- mqtt_publisher=injector.get(MqttClientInterface),
37
- )
38
- self._thread: Thread = Thread(target=self.uploader.run)
39
- self._thread.daemon = True
40
- self._thread.start()
28
+ @pytest.fixture
29
+ def uploader(injector) -> Uploader:
30
+ uploader: Uploader = Uploader(
31
+ queues=injector.get(Queues),
32
+ storage_handlers=injector.get(List[StorageInterface]),
33
+ mqtt_publisher=injector.get(MqttClientInterface),
34
+ )
41
35
 
36
+ # The thread is deliberately started but not joined so that it runs in the
37
+ # background and stops when the test ends
38
+ thread = Thread(target=uploader.run, daemon=True)
39
+ thread.start()
42
40
 
43
- @pytest.fixture
44
- def uploader_thread(injector) -> UploaderThread:
45
- return UploaderThread(injector=injector)
41
+ return uploader
46
42
 
47
43
 
48
- def test_should_upload_from_queue(uploader_thread) -> None:
44
+ def test_should_upload_from_queue(uploader) -> None:
49
45
  mission: Mission = Mission([])
50
46
  inspection: Inspection = Inspection(metadata=ARBITRARY_IMAGE_METADATA)
51
47
 
@@ -54,12 +50,12 @@ def test_should_upload_from_queue(uploader_thread) -> None:
54
50
  mission,
55
51
  )
56
52
 
57
- uploader_thread.uploader.upload_queue.put(message)
58
- time.sleep(1)
59
- assert uploader_thread.uploader.storage_handlers[0].blob_exists(inspection)
53
+ uploader.upload_queue.put(message)
54
+ time.sleep(0.0001)
55
+ assert uploader.storage_handlers[0].blob_exists(inspection)
60
56
 
61
57
 
62
- def test_should_retry_failed_upload_from_queue(uploader_thread, mocker) -> None:
58
+ def test_should_retry_failed_upload_from_queue(uploader) -> None:
63
59
  mission: Mission = Mission([])
64
60
  inspection: Inspection = Inspection(metadata=ARBITRARY_IMAGE_METADATA)
65
61
 
@@ -69,14 +65,14 @@ def test_should_retry_failed_upload_from_queue(uploader_thread, mocker) -> None:
69
65
  )
70
66
 
71
67
  # Need it to fail so that it retries
72
- uploader_thread.uploader.storage_handlers[0].will_fail = True
73
- uploader_thread.uploader.upload_queue.put(message)
74
- time.sleep(1)
68
+ uploader.storage_handlers[0].will_fail = True
69
+ uploader.upload_queue.put(message)
70
+ time.sleep(0.0001)
75
71
 
76
72
  # Should not upload, instead raise StorageException
77
- assert not uploader_thread.uploader.storage_handlers[0].blob_exists(inspection)
78
- uploader_thread.uploader.storage_handlers[0].will_fail = False
73
+ assert not uploader.storage_handlers[0].blob_exists(inspection)
74
+ uploader.storage_handlers[0].will_fail = False
79
75
  time.sleep(3)
80
76
 
81
77
  # After 3 seconds, it should have retried and now it should be successful
82
- assert uploader_thread.uploader.storage_handlers[0].blob_exists(inspection)
78
+ assert uploader.storage_handlers[0].blob_exists(inspection)
@@ -15,7 +15,6 @@ from robot_interface.models.inspection.inspection import (
15
15
  Inspection,
16
16
  )
17
17
  from robot_interface.models.mission.mission import Mission
18
-
19
18
  from robot_interface.models.mission.status import MissionStatus, RobotStatus, TaskStatus
20
19
  from robot_interface.models.mission.task import InspectionTask, Task
21
20
  from robot_interface.robot_interface import RobotInterface
@@ -1,35 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIGGzCCBAOgAwIBAgIUSYiMjuwMgyqwMJ50grQRj92s7tEwDQYJKoZIhvcNAQEL
3
- BQAwgZwxCzAJBgNVBAYTAk5PMQ8wDQYDVQQIDAZCZXJnZW4xDzANBgNVBAcMBkJl
4
- cmdlbjEUMBIGA1UECgwLRXFfUm9ib3RpY3MxETAPBgNVBAsMCFJvYm90aWNzMRww
5
- GgYDVQQDDBNSb2JvdGljc19TZWxmU2lnbmVkMSQwIgYJKoZIhvcNAQkBFhVmZ19y
6
- b2JvdHNAZXF1aW5vci5jb20wHhcNMjQxMTI5MTIwODA3WhcNMjUxMTI5MTIwODA3
7
- WjCBnDELMAkGA1UEBhMCTk8xDzANBgNVBAgMBkJlcmdlbjEPMA0GA1UEBwwGQmVy
8
- Z2VuMRQwEgYDVQQKDAtFcV9Sb2JvdGljczERMA8GA1UECwwIUm9ib3RpY3MxHDAa
9
- BgNVBAMME1JvYm90aWNzX1NlbGZTaWduZWQxJDAiBgkqhkiG9w0BCQEWFWZnX3Jv
10
- Ym90c0BlcXVpbm9yLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
11
- AIuxSKWbBEaXku8BPa8vdQ4fZKWXFxX3706vEst8Z+T1IKkYjFDbLEMu0c9HayVf
12
- 4cCzyQPINgYc/DSxd31QQaEH++LDk9BOSl3YyLl/3ZMUTbOyMp0Kx+mN9LrmcEDF
13
- G44aC8XTm4szetb5HijbLLu5Lvay7hlYynuQ9D6GkVlEjew3xiAcUhVA8BctjBGm
14
- ILfkia2LNKqEtGT1gh3Q8+p1yrKRGLHw7boRBAFow4sLx5BMuYc7Kk8405ymntRd
15
- pRoHIRu5K1D8/9vwIBfz8rEM8aVCq/TqAutQL1t3w/lq6iLzikrc2ke1FNWLVZUI
16
- vem8gjsmPUaEBZxmvIWZjtNmDwa/Z+PVipKFoC8yS27AwxIuPCWNODnUPP112hrS
17
- 2Lgad64Tap2S4zB7Wrg+1JvHzTRCgOg96Hf0Nnr2elSjRgfi//ddObAxQEcKZq3u
18
- 6SBgc0conq+3olbtaIutK7Mn244ynz1+Edadn2lwhf/FQG95pSIb/1PayrtkzPgv
19
- BDmzaUUWuxJkDry4tDTAu7ruktDXQ3OFaF/3Mko3RKR7hQqSDL4XqArSBgKv8QGs
20
- nklgBbEa5fkh8Ng5vRLcMaNCTeS1K9n66sR2ZP5JWoWgR/Ldl5mbnwvtqqyhUdx1
21
- YxLzbRr0nmjDSufF4Gpbvg+3lpY23pQ0BRQH6zAkeygRAgMBAAGjUzBRMB0GA1Ud
22
- DgQWBBQehtclGXxA16tJAy/VA8EqWgVXyjAfBgNVHSMEGDAWgBQehtclGXxA16tJ
23
- Ay/VA8EqWgVXyjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCE
24
- ehrGvVcUrlB7da8zp+QM3PxhiXiAxPwSNlCqS8QjhPLeKIIJg2aFuyb8PFUvXjhd
25
- Jvv2A4OEzTv+Jj7W2+3cCoR1oZFv6DZzNI9Ybaa4MWw7VxP9cneTx9f0tSPyRh9s
26
- n7PwPVhCbilix806pmo8lkrFJFusV/ofiFgLYpu1jG7kCQaaPYMlVXre16M7yeJx
27
- XHyv6qc59hPNkZphgPIjk52g4f5jEphylt1EuG7qhk+uveIjOfWKyk2gx5fSM6Lr
28
- NOsPO9fvnK7bZYeO4Wl8esGNcTZjg5LuhmwSba7GhLfU/fAOGAVMKig/4GcIvMBE
29
- uAJ0Bes3jSYOJXHTnog2Y52h1K0mDcnSVKPOZpGCKf8FoWcH0bNRIauF7j7/mTV3
30
- yo5As4ANS8PQjfrq14MZrlqL8SpObCb6OvnCSdIiYMsNXVNKEobHy8csYP5h/Ifo
31
- mdSwmDHEyMI/Bu1NmsK5iz3zhCDraspn7JM0UWxtBL92siE5yysTwPBD2ImKsxF2
32
- 6k0Ad6cWoeZRtfFdq8Ix4EfDXsRFHSRcanUXAhw233WtUBVVqF72f0JubgOmpttz
33
- 1misnsVPwUg4ID8KdTRQi6fxyigXgfxr3YTzPvCip2kDNjZEtTL7N90Mdh6f9BzN
34
- J6b5slRz9Zr7E0AG5BfKd0qB1Ho3WDQ4zxTVH+QEHQ==
35
- -----END CERTIFICATE-----