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.
- {isar-1.24.5 → isar-1.24.6}/PKG-INFO +1 -1
- isar-1.24.6/src/isar/config/certs/ca-cert.pem +35 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/script.py +4 -3
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/state_machine.py +2 -2
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/idle.py +9 -7
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/PKG-INFO +1 -1
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/SOURCES.txt +0 -1
- {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/test_state_machine.py +47 -106
- {isar-1.24.5 → isar-1.24.6}/tests/isar/storage/test_uploader.py +23 -27
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/robot_interface.py +0 -1
- isar-1.24.5/src/isar/config/certs/ca-cert.pem +0 -35
- isar-1.24.5/tests/test_data/test_json_file.json +0 -227
- {isar-1.24.5 → isar-1.24.6}/.dockerignore +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/feature.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/ISSUE_TEMPLATE/improvement.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/release.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/compile_requirements.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/project_automations.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/publish_isar_base_image.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/pythonpackage.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/pythonpublish.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.github/workflows/stale.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/.gitignore +0 -0
- {isar-1.24.5 → isar-1.24.6}/.pre-commit-config.yaml +0 -0
- {isar-1.24.5 → isar-1.24.6}/Dockerfile +0 -0
- {isar-1.24.5 → isar-1.24.6}/LICENSE +0 -0
- {isar-1.24.5 → isar-1.24.6}/README.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/SECURITY.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/docker-compose-turtlebot.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/docker-compose.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/Makefile +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/make.bat +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/rst_processing.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/source/conf.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/source/index.rst +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/source/readme_link.md +0 -0
- {isar-1.24.5 → isar-1.24.6}/docs/state_machine_diagram.png +0 -0
- {isar-1.24.5 → isar-1.24.6}/main.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/pyproject.toml +0 -0
- {isar-1.24.5 → isar-1.24.6}/radixconfig.yml +0 -0
- {isar-1.24.5 → isar-1.24.6}/requirements.txt +0 -0
- {isar-1.24.5 → isar-1.24.6}/setup.cfg +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/api.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/models.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/models/start_mission_definition.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/robot_control/robot_controller.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/schedule/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/schedule/scheduling_controller.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/security/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/apis/security/authentication.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/configuration_error.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/keyvault_error.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/keyvault/keyvault_service.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/log.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/logging.conf +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/JSP1_intermediate_deck.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/JSP1_weather_deck.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/default_map.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_b.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_compressor.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/klab_turtlebot.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/maps/turtleworld.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_exr.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_mission.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_mission_definition/default_turtlebot.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/default.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/predefined_missions/default_turtlebot.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/settings.env +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/config/settings.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/local_planner.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/mission_planner_interface.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/sequential_task_selector.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/mission_planner/task_selector_interface.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/message.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queue_io.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queue_timeout_error.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/queues.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/communication/queues/status_queue.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/models/mission_metadata/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/modules.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/auth/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/auth/azure_credentials.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/readers/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/readers/base_reader.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/mqtt_client.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/mqtt/robot_info_publisher.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/request_handler.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/service_connections/stid/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/queue_utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/robot_utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/scheduling_utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/services/utilities/threaded_request.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/initialize.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/initiate.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/monitor.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/off.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/offline.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/paused.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states/stop.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/state_machine/states_enum.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/blob_storage.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/local_storage.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/slimm_storage.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/storage_interface.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/uploader.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar/storage/utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/dependency_links.txt +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/entry_points.txt +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/requires.txt +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/isar.egg-info/top_level.txt +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/exceptions/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/exceptions/robot_exceptions.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/initialize/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/initialize/initialize_params.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/inspection/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/inspection/inspection.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/mission.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/status.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/mission/task.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/media.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/models/robots/robot_model.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/robot_interface.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/mqtt_client.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/telemetry/payloads.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/test_robot_interface.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/json_service.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/src/robot_interface/utilities/uuid_string_factory.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/conftest.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/maps/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/maps/turtleworld.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/missions/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/config/missions/default.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/integration/turtlebot/test_successful_mission.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/scheduler/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/scheduler/test_scheduler_router.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/security/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/apis/security/test_authentication.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/mission/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/mission/test_mission.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/models/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/models/communication/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/models/communication/test_queues.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/models/example_mission_definition.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/models/test_start_mission_definition.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/test_base_reader.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/readers/test_mission_reader.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/echo/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/service_connections/test_base_request_handler.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/test_queue_utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/services/utilities/test_scheduling_utilities.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/states/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/state_machine/states/test_monitor.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/isar/storage/test_blob_storage.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/__init__.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/blob_storage.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/mission_definition.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/mqtt_client.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/pose.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/request.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/status.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/task.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/mocks/token.py +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_map_config/test_map_config.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_not_working.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_working.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_mission_working_no_tasks.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_data/test_thermal_image_mission.json +0 -0
- {isar-1.24.5 → isar-1.24.6}/tests/test_modules.py +0 -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
|
|
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
|
|
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
|
-
|
|
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:
|
|
@@ -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
|
-
|
|
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 =
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
229
|
-
|
|
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(
|
|
260
|
-
|
|
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
|
-
|
|
293
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
348
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
58
|
-
time.sleep(
|
|
59
|
-
assert
|
|
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(
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
time.sleep(
|
|
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
|
|
78
|
-
|
|
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
|
|
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-----
|