octopize.deploy_tool 2.7.2__tar.gz → 2.7.3__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.
Files changed (431) hide show
  1. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/PKG-INFO +1 -1
  2. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/pyproject.toml +1 -1
  3. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/__init__.py +1 -1
  4. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/nginx.py +170 -0
  5. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +19 -0
  6. {octopize_deploy_tool-2.7.2/tests/fixtures/config_round_trip_first → octopize_deploy_tool-2.7.3/tests/fixtures/basic_deployment}/expected/.deployment-state.yaml +1 -0
  7. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/.deployment-state.yaml +1 -0
  8. {octopize_deploy_tool-2.7.2/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.7.3/tests/fixtures/config_round_trip_first}/expected/.deployment-state.yaml +1 -0
  9. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/deployment-config.yaml +1 -0
  10. {octopize_deploy_tool-2.7.2/tests/fixtures/basic_deployment → octopize_deploy_tool-2.7.3/tests/fixtures/config_round_trip_second}/expected/.deployment-state.yaml +1 -0
  11. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/configure_happy_path/expected/.deployment_states/v1/deployment_state.yaml +3 -0
  12. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/.deployment-state.yaml +1 -0
  13. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/.deployment-state.yaml +1 -0
  14. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/.deployment-state.yaml +1 -0
  15. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/helpers/normalization.py +5 -0
  16. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_configure_runner_adapter.py +25 -0
  17. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_nginx.py +120 -0
  18. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_deployment_configurator.py +55 -4
  19. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_renderer.py +69 -0
  20. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/.gitignore +0 -0
  21. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/README.md +0 -0
  22. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py +0 -0
  23. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/__init__.py +0 -0
  24. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/apply_command.py +0 -0
  25. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/checks.py +0 -0
  26. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/commands/install_command.py +0 -0
  27. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/commands/migrate_command.py +0 -0
  28. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/commands/subcommand_ports.py +0 -0
  29. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/commands/update_command.py +0 -0
  30. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/configure_command.py +0 -0
  31. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/configure_resume_policy.py +0 -0
  32. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/deployment_paths.py +0 -0
  33. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/diff_command.py +0 -0
  34. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/ports.py +0 -0
  35. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/render_command.py +0 -0
  36. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/start_command.py +0 -0
  37. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/application/stop_command.py +0 -0
  38. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/authentik_migration.py +0 -0
  39. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/cli.py +0 -0
  40. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/cli_test_harness.py +0 -0
  41. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/components.py +0 -0
  42. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/configurator.py +0 -0
  43. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/configure.py +0 -0
  44. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/defaults.yaml +0 -0
  45. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
  46. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/__init__.py +0 -0
  47. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/configure_preset.py +0 -0
  48. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/deployment_item.py +0 -0
  49. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/deployment_item_registry.py +0 -0
  50. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/deployment_state.py +0 -0
  51. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/validation.py +0 -0
  52. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/domain/version_id.py +0 -0
  53. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/download_templates.py +0 -0
  54. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/generate_env.py +0 -0
  55. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/generate_env_paths.py +0 -0
  56. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/__init__.py +0 -0
  57. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/configurator_runner_adapter.py +0 -0
  58. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/current_version_resolver.py +0 -0
  59. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/docker_client.py +0 -0
  60. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/filesystem_directory_copier.py +0 -0
  61. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/filesystem_directory_reader.py +0 -0
  62. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/filesystem_file_writer.py +0 -0
  63. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/filesystem_legacy_source.py +0 -0
  64. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/filesystem_symlink_updater.py +0 -0
  65. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/in_memory_state_repository.py +0 -0
  66. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/noop_docker_client.py +0 -0
  67. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/package_defaults_source.py +0 -0
  68. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/package_template_provider.py +0 -0
  69. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/package_version_provider.py +0 -0
  70. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/preset_loader.py +0 -0
  71. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/system_clock.py +0 -0
  72. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/yaml_config_source.py +0 -0
  73. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/infra/yaml_state_repository.py +0 -0
  74. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/input_gatherer.py +0 -0
  75. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/normalizers.py +0 -0
  76. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/output_spec.py +0 -0
  77. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/printer.py +0 -0
  78. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/public_url.py +0 -0
  79. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/renderer.py +0 -0
  80. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/state_manager.py +0 -0
  81. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
  82. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/api_local_source.py +0 -0
  83. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
  84. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
  85. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/base.py +0 -0
  86. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/component_selection.py +0 -0
  87. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/database.py +0 -0
  88. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/email.py +0 -0
  89. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/local_source.py +0 -0
  90. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/logging.py +0 -0
  91. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/required.py +0 -0
  92. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/service_urls.py +0 -0
  93. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/storage.py +0 -0
  94. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/target_environment.py +0 -0
  95. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/telemetry.py +0 -0
  96. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/steps/user.py +0 -0
  97. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
  98. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/.env.template +0 -0
  99. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/.template-version +0 -0
  100. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -0
  101. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
  102. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -0
  103. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
  104. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
  105. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
  106. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
  107. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
  108. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
  109. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
  110. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
  111. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
  112. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
  113. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
  114. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
  115. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
  116. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
  117. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
  118. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/topology_urls.py +0 -0
  119. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/url_contract.py +0 -0
  120. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/src/octopize_avatar_deploy/version_compat.py +0 -0
  121. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/TESTING.md +0 -0
  122. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/__init__.py +0 -0
  123. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/conftest.py +0 -0
  124. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/__init__.py +0 -0
  125. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/apply_help/output.txt +0 -0
  126. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/authentik_migrate_help/output.txt +0 -0
  127. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/authentik_migration/licenses.csv +0 -0
  128. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/authentik_migration/organizations.csv +0 -0
  129. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/authentik_migration/users.csv +0 -0
  130. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/.env +0 -0
  131. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/branding/favicon.ico +0 -0
  132. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/branding/logo.png +0 -0
  133. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  134. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
  135. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  136. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  137. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
  138. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
  139. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  140. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/authentik/translations.json +0 -0
  141. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/docker-compose.yml +0 -0
  142. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/expected/nginx/nginx.conf +0 -0
  143. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/input.yaml +0 -0
  144. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/basic_deployment/output.txt +0 -0
  145. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/.env +0 -0
  146. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/branding/favicon.ico +0 -0
  147. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/branding/logo.png +0 -0
  148. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  149. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_exists.html +0 -0
  150. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  151. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  152. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_changed.html +0 -0
  153. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_reset.html +0 -0
  154. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  155. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/authentik/translations.json +0 -0
  156. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/docker-compose.yml +0 -0
  157. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/expected/nginx/nginx.conf +0 -0
  158. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/input.yaml +0 -0
  159. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/cloud_storage/output.txt +0 -0
  160. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_not_found/output.txt +0 -0
  161. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/.env +0 -0
  162. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/branding/favicon.ico +0 -0
  163. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/branding/logo.png +0 -0
  164. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  165. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_exists.html +0 -0
  166. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  167. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  168. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_changed.html +0 -0
  169. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_reset.html +0 -0
  170. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  171. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/authentik/translations.json +0 -0
  172. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/docker-compose.yml +0 -0
  173. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_first/expected/nginx/nginx.conf +0 -0
  174. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/.env +0 -0
  175. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/branding/favicon.ico +0 -0
  176. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/branding/logo.png +0 -0
  177. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  178. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_exists.html +0 -0
  179. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  180. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  181. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_changed.html +0 -0
  182. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_reset.html +0 -0
  183. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  184. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/authentik/translations.json +0 -0
  185. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/docker-compose.yml +0 -0
  186. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/config_round_trip_second/expected/nginx/nginx.conf +0 -0
  187. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/configure_happy_path/input.yaml +0 -0
  188. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/configure_happy_path/output.txt +0 -0
  189. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/configure_help/output.txt +0 -0
  190. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/deploy_help/output.txt +0 -0
  191. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/.env +0 -0
  192. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/favicon.ico +0 -0
  193. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/logo.png +0 -0
  194. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  195. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
  196. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  197. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  198. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
  199. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
  200. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  201. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/authentik/translations.json +0 -0
  202. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/compose.override.yaml +0 -0
  203. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +0 -0
  204. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/nginx/nginx.conf +0 -0
  205. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/test-.npmrc +0 -0
  206. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/test-avatar-repo/services/api/main.py +0 -0
  207. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/expected/test-avatar-website/package.json +0 -0
  208. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/input.yaml +0 -0
  209. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/dev_mode_deployment/output.txt +0 -0
  210. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_help/output.txt +0 -0
  211. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/from/.env +0 -0
  212. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/from/nginx/nginx.conf +0 -0
  213. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/output.txt +0 -0
  214. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/to/.env +0 -0
  215. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/to/docker-compose.yml +0 -0
  216. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/diff_integration/to/nginx/nginx.conf +0 -0
  217. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/generate_env_help/output.txt +0 -0
  218. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
  219. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/help/output.txt +0 -0
  220. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/.env +0 -0
  221. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/.permissions.json +0 -0
  222. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/branding/favicon.ico +0 -0
  223. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/branding/logo.png +0 -0
  224. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  225. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  226. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  227. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  228. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  229. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  230. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  231. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/authentik/translations.json +0 -0
  232. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/docker-compose.yml +0 -0
  233. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_apply_output/nginx/nginx.conf +0 -0
  234. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_help/output.txt +0 -0
  235. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/.env +0 -0
  236. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/.permissions.json +0 -0
  237. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/branding/favicon.ico +0 -0
  238. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/branding/logo.png +0 -0
  239. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  240. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  241. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  242. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  243. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  244. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  245. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  246. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/authentik/translations.json +0 -0
  247. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/docker-compose.yml +0 -0
  248. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/install_render_output/nginx/nginx.conf +0 -0
  249. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/invalid_port_config/config.yaml +0 -0
  250. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/invalid_port_config/output.txt +0 -0
  251. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/invalid_url_config/config.yaml +0 -0
  252. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/invalid_url_config/output.txt +0 -0
  253. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/malformed_yaml/config.yaml +0 -0
  254. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/malformed_yaml/output.txt +0 -0
  255. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/migrate_help/output.txt +0 -0
  256. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/missing_subcommand/output.txt +0 -0
  257. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/.env +0 -0
  258. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/branding/favicon.ico +0 -0
  259. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/branding/logo.png +0 -0
  260. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  261. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_exists.html +0 -0
  262. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  263. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  264. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_changed.html +0 -0
  265. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_reset.html +0 -0
  266. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  267. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/authentik/translations.json +0 -0
  268. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/docker-compose.yml +0 -0
  269. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/expected/nginx/nginx.conf +0 -0
  270. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/input.yaml +0 -0
  271. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/no_telemetry/output.txt +0 -0
  272. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
  273. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/.env +0 -0
  274. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/branding/favicon.ico +0 -0
  275. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/branding/logo.png +0 -0
  276. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
  277. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_exists.html +0 -0
  278. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_invitation.html +0 -0
  279. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
  280. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_changed.html +0 -0
  281. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_reset.html +0 -0
  282. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
  283. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/authentik/translations.json +0 -0
  284. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +0 -0
  285. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/expected/nginx/nginx.conf +0 -0
  286. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_complete/output.txt +0 -0
  287. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_incomplete_config/config.yaml +0 -0
  288. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_incomplete_config/output.txt +0 -0
  289. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_no_config/output.txt +0 -0
  290. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_partial_config/config.yaml +0 -0
  291. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/non_interactive_partial_config/output.txt +0 -0
  292. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/output_dir_nested/output.txt +0 -0
  293. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/output_dir_permission_denied/output.txt +0 -0
  294. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/prompt_help/input.yaml +0 -0
  295. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/prompt_help/output.txt +0 -0
  296. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/render_help/output.txt +0 -0
  297. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/resume_interrupted/first_run/output.txt +0 -0
  298. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/resume_interrupted/input_first_run.yaml +0 -0
  299. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/resume_interrupted/input_resume.yaml +0 -0
  300. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/resume_interrupted/resume/output.txt +0 -0
  301. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/save_config_interactive/output.txt +0 -0
  302. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/save_config_with_existing/config.yaml +0 -0
  303. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/save_config_with_existing/input.yaml +0 -0
  304. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/save_config_with_existing/output.txt +0 -0
  305. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/start_help/output.txt +0 -0
  306. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/stop_help/output.txt +0 -0
  307. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/template_from_local_verbose/output.txt +0 -0
  308. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/type_mismatch_config/config.yaml +0 -0
  309. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/type_mismatch_config/output.txt +0 -0
  310. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_help/output.txt +0 -0
  311. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/base_v1/generated_files/.env +0 -0
  312. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/.env +0 -0
  313. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/.permissions.json +0 -0
  314. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/favicon.ico +0 -0
  315. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/logo.png +0 -0
  316. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  317. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  318. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  319. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  320. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  321. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  322. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  323. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/translations.json +0 -0
  324. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/docker-compose.yml +0 -0
  325. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_apply_output/nginx/nginx.conf +0 -0
  326. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/.env +0 -0
  327. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/.permissions.json +0 -0
  328. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/favicon.ico +0 -0
  329. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/logo.png +0 -0
  330. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  331. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  332. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  333. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  334. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  335. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  336. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  337. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/translations.json +0 -0
  338. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/docker-compose.yml +0 -0
  339. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_interactive_diff/expected_render_output/nginx/nginx.conf +0 -0
  340. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/base_v1/generated_files/.env +0 -0
  341. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +0 -0
  342. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.permissions.json +0 -0
  343. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/favicon.ico +0 -0
  344. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/logo.png +0 -0
  345. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  346. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  347. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  348. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  349. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  350. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  351. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  352. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/translations.json +0 -0
  353. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +0 -0
  354. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_apply_output/nginx/nginx.conf +0 -0
  355. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +0 -0
  356. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/.permissions.json +0 -0
  357. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/favicon.ico +0 -0
  358. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/logo.png +0 -0
  359. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  360. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  361. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  362. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  363. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  364. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  365. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  366. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/translations.json +0 -0
  367. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +0 -0
  368. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/fixtures/update_noninteractive_clean/expected_render_output/nginx/nginx.conf +0 -0
  369. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/helpers/__init__.py +0 -0
  370. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/helpers/fakes.py +0 -0
  371. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/helpers/fixture_dir_comparison.py +0 -0
  372. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/helpers/printers.py +0 -0
  373. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/__init__.py +0 -0
  374. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_cli_integration.py +0 -0
  375. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_configure_command.py +0 -0
  376. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_diff_command.py +0 -0
  377. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_generate_env.py +0 -0
  378. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_install_command.py +0 -0
  379. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/integration/test_update_command.py +0 -0
  380. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/test_cli_harness.py +0 -0
  381. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/__init__.py +0 -0
  382. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/conftest.py +0 -0
  383. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_filesystem_directory_copier.py +0 -0
  384. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_filesystem_legacy_source.py +0 -0
  385. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_preset_loader.py +0 -0
  386. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_yaml_config_source.py +0 -0
  387. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/infra/test_yaml_deployment_state_repository.py +0 -0
  388. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_api_local_source.py +0 -0
  389. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_authentik.py +0 -0
  390. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_authentik_blueprint.py +0 -0
  391. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_base.py +0 -0
  392. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_component_selection.py +0 -0
  393. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_database.py +0 -0
  394. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_email.py +0 -0
  395. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_local_source.py +0 -0
  396. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_logging.py +0 -0
  397. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_required.py +0 -0
  398. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_service_urls.py +0 -0
  399. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_state_manager.py +0 -0
  400. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_storage.py +0 -0
  401. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_target_environment.py +0 -0
  402. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_telemetry.py +0 -0
  403. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/steps/test_user.py +0 -0
  404. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_apply_command.py +0 -0
  405. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_authentik_client.py +0 -0
  406. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_authentik_migration.py +0 -0
  407. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_compare_helpers.py +0 -0
  408. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_components.py +0 -0
  409. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_configurator.py +0 -0
  410. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_configure_command.py +0 -0
  411. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_deployment_item.py +0 -0
  412. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_deployment_runner.py +0 -0
  413. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_diff_command.py +0 -0
  414. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_generate_env_cli.py +0 -0
  415. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_generic_prompt.py +0 -0
  416. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_input_gatherer.py +0 -0
  417. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_install_command.py +0 -0
  418. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_migrate_command.py +0 -0
  419. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_normalizers.py +0 -0
  420. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_output_spec.py +0 -0
  421. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_preflight_checks.py +0 -0
  422. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_printer.py +0 -0
  423. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_public_url.py +0 -0
  424. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_render_command.py +0 -0
  425. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_rich_implementations.py +0 -0
  426. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_step_filtering.py +0 -0
  427. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_stop_command.py +0 -0
  428. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_topology_urls.py +0 -0
  429. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_update_command.py +0 -0
  430. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_version_id.py +0 -0
  431. {octopize_deploy_tool-2.7.2 → octopize_deploy_tool-2.7.3}/tests/unit/test_version_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: octopize.deploy_tool
3
- Version: 2.7.2
3
+ Version: 2.7.3
4
4
  Summary: Deployment configuration tool for Octopize Avatar platform
5
5
  Project-URL: Homepage, https://octopize.io
6
6
  Project-URL: Documentation, https://docs.octopize.io/docs/deploying/self-hosted
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "octopize.deploy_tool"
7
- version = "2.7.2"
7
+ version = "2.7.3"
8
8
  description = "Deployment configuration tool for Octopize Avatar platform"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -10,7 +10,7 @@ from .version_compat import (
10
10
  validate_template_version,
11
11
  )
12
12
 
13
- __version__ = "2.7.2"
13
+ __version__ = "2.7.3"
14
14
  __all__ = [
15
15
  "DeploymentRunner",
16
16
  "DeploymentConfigurator",
@@ -4,7 +4,9 @@ import getpass
4
4
  import os
5
5
  import socket
6
6
  import stat
7
+ import subprocess
7
8
  from collections.abc import Callable
9
+ from enum import Enum
8
10
  from pathlib import Path
9
11
  from typing import TYPE_CHECKING, Any
10
12
 
@@ -174,6 +176,105 @@ def is_port_in_use(port: int) -> bool:
174
176
  return sock.connect_ex(("127.0.0.1", port)) == 0
175
177
 
176
178
 
179
+ class SelfSignedStatus(Enum):
180
+ """Result of a self-signed certificate detection attempt.
181
+
182
+ Attributes:
183
+ DEFINITELY_NOT: ``openssl verify`` succeeded — the cert chain is trusted
184
+ by the system CA store. No special handling needed.
185
+ YES: ``openssl verify`` failed **and** the leaf certificate has
186
+ ``issuer == subject``, which is the defining property of a
187
+ self-signed certificate.
188
+ MAYBE: ``openssl verify`` failed but ``issuer != subject`` — the
189
+ certificate may be issued by a private (non-system-trusted) CA.
190
+ UNKNOWN: ``openssl`` could not parse the certificate at all (e.g. the
191
+ file contains placeholder/test content). No determination can be
192
+ made; the caller should skip self-signed handling.
193
+ """
194
+
195
+ DEFINITELY_NOT = "definitely_not"
196
+ YES = "yes"
197
+ MAYBE = "maybe"
198
+ UNKNOWN = "unknown"
199
+
200
+
201
+ def detect_self_signed_cert(cert_path: str) -> SelfSignedStatus:
202
+ """Detect whether a PEM certificate is self-signed or uses an untrusted chain.
203
+
204
+ The check is performed in two steps:
205
+
206
+ 1. ``openssl verify -untrusted <cert> <cert>`` — if this succeeds the cert
207
+ is trusted by the system CA store and is *definitely not* self-signed.
208
+ The ``-untrusted`` flag is essential for fullchain PEM files: without it
209
+ OpenSSL only verifies the leaf certificate and ignores the bundled
210
+ intermediates, causing false "unable to get local issuer certificate"
211
+ failures even for valid CA-signed chains.
212
+ 2. ``openssl x509 -noout -subject -issuer -in <cert>`` — if step 1 failed,
213
+ we compare the ``subject`` and ``issuer`` fields:
214
+ - Equal → the leaf cert is self-signed (:attr:`SelfSignedStatus.YES`).
215
+ - Unequal → the cert may be from a private CA
216
+ (:attr:`SelfSignedStatus.MAYBE`).
217
+ - Cannot parse → :attr:`SelfSignedStatus.UNKNOWN`.
218
+
219
+ Args:
220
+ cert_path: Absolute or relative path to the PEM certificate file.
221
+
222
+ Returns:
223
+ :class:`SelfSignedStatus` indicating the detection result.
224
+ """
225
+ _timeout = 5 # seconds
226
+
227
+ # Step 1 — try to verify against the system CA bundle.
228
+ #
229
+ # `-untrusted cert_path` is required for fullchain PEM files: `openssl verify`
230
+ # only verifies the first (leaf) certificate in the file and does NOT
231
+ # automatically use the other certificates bundled in the same file as
232
+ # untrusted intermediates for chain building. Passing the file as both
233
+ # `-untrusted` and the positional argument makes the bundled intermediates
234
+ # available so the full chain can be verified correctly.
235
+ try:
236
+ result = subprocess.run( # noqa: S603
237
+ ["openssl", "verify", "-untrusted", cert_path, cert_path], # noqa: S607
238
+ capture_output=True,
239
+ text=True,
240
+ timeout=_timeout,
241
+ )
242
+ if result.returncode == 0:
243
+ return SelfSignedStatus.DEFINITELY_NOT
244
+ except (subprocess.TimeoutExpired, FileNotFoundError, OSError):
245
+ # openssl not available or timed out — fall through to heuristic check.
246
+ pass
247
+
248
+ # Step 2 — compare subject and issuer fields.
249
+ try:
250
+ result = subprocess.run( # noqa: S603
251
+ ["openssl", "x509", "-noout", "-subject", "-issuer", "-in", cert_path], # noqa: S607
252
+ capture_output=True,
253
+ text=True,
254
+ timeout=_timeout,
255
+ )
256
+ if result.returncode != 0:
257
+ # Could not parse the certificate (e.g. invalid/test content).
258
+ return SelfSignedStatus.UNKNOWN
259
+
260
+ subject = ""
261
+ issuer = ""
262
+ for line in result.stdout.splitlines():
263
+ if line.startswith("subject="):
264
+ subject = line[len("subject=") :]
265
+ elif line.startswith("issuer="):
266
+ issuer = line[len("issuer=") :]
267
+
268
+ if subject and issuer and subject.strip() == issuer.strip():
269
+ return SelfSignedStatus.YES
270
+
271
+ # issuer != subject — likely signed by a private CA.
272
+ return SelfSignedStatus.MAYBE
273
+
274
+ except (subprocess.TimeoutExpired, FileNotFoundError, OSError):
275
+ return SelfSignedStatus.UNKNOWN
276
+
277
+
177
278
  class NginxTlsStep(DeploymentStep):
178
279
  """Handles Nginx TLS configuration."""
179
280
 
@@ -301,6 +402,9 @@ class NginxTlsStep(DeploymentStep):
301
402
 
302
403
  config["NGINX_SSL_CERTIFICATE_PATH"] = cert_path
303
404
  config["NGINX_SSL_CERTIFICATE_KEY_PATH"] = key_path
405
+
406
+ # Detect if the certificate is self-signed and configure the API accordingly.
407
+ config["SELF_SIGNED_CERT_PATH"] = self._resolve_self_signed_cert(cert_path)
304
408
  else:
305
409
  http_port = self.get_config_or_prompt_generic(
306
410
  PromptConfig(
@@ -329,6 +433,7 @@ class NginxTlsStep(DeploymentStep):
329
433
  config["NGINX_HTTP_PORT"] = http_port
330
434
  config["NGINX_SSL_CERTIFICATE_PATH"] = "/dev/null"
331
435
  config["NGINX_SSL_CERTIFICATE_KEY_PATH"] = "/dev/null"
436
+ config["SELF_SIGNED_CERT_PATH"] = ""
332
437
 
333
438
  try:
334
439
  port_number = int(http_port)
@@ -349,3 +454,68 @@ class NginxTlsStep(DeploymentStep):
349
454
  def generate_secrets(self) -> dict[str, str]:
350
455
  """No secrets needed for Nginx TLS paths."""
351
456
  return {}
457
+
458
+ def _resolve_self_signed_cert(self, cert_path: str) -> str:
459
+ """Determine whether *cert_path* is self-signed and return the path or empty string.
460
+
461
+ The result drives ``SELF_SIGNED_CERT_PATH`` in the generated config:
462
+ - Non-empty path → the cert is self-signed; mount it into API containers and
463
+ set ``SSL_CERT_FILE`` so Python trusts it.
464
+ - Empty string → the cert is CA-trusted; no special handling needed.
465
+
466
+ If ``SELF_SIGNED_CERT_PATH`` is already present in the pre-loaded config
467
+ (e.g. from a saved YAML config), that value is returned as-is and detection
468
+ is skipped.
469
+
470
+ Args:
471
+ cert_path: Resolved path to the TLS certificate (same value as
472
+ ``NGINX_SSL_CERTIFICATE_PATH``).
473
+
474
+ Returns:
475
+ The certificate path if self-signed, or ``""`` if not.
476
+ """
477
+ # Respect pre-configured value from saved config / YAML.
478
+ if "SELF_SIGNED_CERT_PATH" in self.config:
479
+ return str(self.config["SELF_SIGNED_CERT_PATH"])
480
+
481
+ status = detect_self_signed_cert(cert_path)
482
+
483
+ if status == SelfSignedStatus.DEFINITELY_NOT:
484
+ return ""
485
+
486
+ if status == SelfSignedStatus.UNKNOWN:
487
+ # Cannot parse the certificate — skip self-signed handling silently.
488
+ return ""
489
+
490
+ if status == SelfSignedStatus.YES:
491
+ self.printer.print(
492
+ " → Certificate is self-signed (issuer = subject). "
493
+ "The API services will be configured to trust it via SSL_CERT_FILE."
494
+ )
495
+ return cert_path
496
+
497
+ # SelfSignedStatus.MAYBE — ask the user.
498
+ confirmed = self.prompt_yes_no(
499
+ "Certificate could not be verified against the system CA store — "
500
+ "is it self-signed or issued by a private CA?",
501
+ default=False,
502
+ key="nginx_tls.is_self_signed_cert",
503
+ help_text=(
504
+ "The deployment tool tried to verify the certificate against the "
505
+ "system CA bundle but the verification failed.\n"
506
+ "\n"
507
+ "This can happen when:\n"
508
+ " - the certificate was signed by a private/internal CA that is not\n"
509
+ " installed on this machine\n"
510
+ " - the certificate is self-signed (issuer = subject)\n"
511
+ "\n"
512
+ "If you answer yes, the deployment tool will:\n"
513
+ " - set SSL_CERT_FILE=/certs/server.fullchain.crt inside every API\n"
514
+ " container so that Python trusts your certificate\n"
515
+ " - mount the certificate file into those containers\n"
516
+ "\n"
517
+ "If you answer no, no extra configuration is added and the API will\n"
518
+ "use the default system CA bundle."
519
+ ),
520
+ )
521
+ return cert_path if confirmed else ""
@@ -12,6 +12,9 @@ x-environment: &api-environment
12
12
  STORAGE_ENDPOINT_HOST: http://s3
13
13
  DASK_SCHEDULER: my-dask-scheduler:8786
14
14
  SECRETS_DIR: /var/run/secrets
15
+ {% if SELF_SIGNED_CERT_PATH %}
16
+ SSL_CERT_FILE: /certs/server.fullchain.crt
17
+ {% endif %}
15
18
  env_file:
16
19
  - path: .env
17
20
  required: true
@@ -93,6 +96,10 @@ services:
93
96
  depends_on:
94
97
  init-db:
95
98
  condition: service_completed_successfully
99
+ {% if SELF_SIGNED_CERT_PATH %}
100
+ volumes:
101
+ - {{ SELF_SIGNED_CERT_PATH }}:/certs/server.fullchain.crt:ro
102
+ {% endif %}
96
103
 
97
104
  init-db:
98
105
  image: *api-image-version
@@ -123,6 +130,10 @@ services:
123
130
  condition: service_started
124
131
  s3:
125
132
  condition: service_healthy
133
+ {% if SELF_SIGNED_CERT_PATH %}
134
+ volumes:
135
+ - {{ SELF_SIGNED_CERT_PATH }}:/certs/server.fullchain.crt:ro
136
+ {% endif %}
126
137
 
127
138
  init-storage:
128
139
  image: &seaweedfs-image ${AVATAR_SEAWEEDFS_REGISTRY-chrislusf}/seaweedfs:${AVATAR_SEAWEEDFS_VERSION-4.17}
@@ -167,6 +178,10 @@ services:
167
178
  - authjwt_secret_key
168
179
  - storage_admin_access_key_id
169
180
  - storage_admin_secret_access_key
181
+ {% if SELF_SIGNED_CERT_PATH %}
182
+ volumes:
183
+ - {{ SELF_SIGNED_CERT_PATH }}:/certs/server.fullchain.crt:ro
184
+ {% endif %}
170
185
 
171
186
  dask-worker:
172
187
  image: *api-image-version
@@ -196,6 +211,10 @@ services:
196
211
  - authjwt_secret_key
197
212
  - storage_admin_access_key_id
198
213
  - storage_admin_secret_access_key
214
+ {% if SELF_SIGNED_CERT_PATH %}
215
+ volumes:
216
+ - {{ SELF_SIGNED_CERT_PATH }}:/certs/server.fullchain.crt:ro
217
+ {% endif %}
199
218
 
200
219
  db:
201
220
  image: &postgres-image postgres:14-alpine
@@ -36,6 +36,7 @@ config:
36
36
  NGINX_TLS_ENABLED: true
37
37
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
38
38
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
39
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
39
40
  DB_NAME: avatar
40
41
  DB_USER: avatar
41
42
  DB_ADMIN_USER: avatar_dba
@@ -36,6 +36,7 @@ config:
36
36
  NGINX_TLS_ENABLED: true
37
37
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
38
38
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
39
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
39
40
  DB_NAME: avatar
40
41
  DB_USER: avatar
41
42
  DB_ADMIN_USER: avatar_dba
@@ -36,6 +36,7 @@ config:
36
36
  NGINX_TLS_ENABLED: true
37
37
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
38
38
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
39
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
39
40
  DB_NAME: avatar
40
41
  DB_USER: avatar
41
42
  DB_ADMIN_USER: avatar_dba
@@ -22,6 +22,7 @@ AVATAR_SSO_ENABLED: 'true'
22
22
  NGINX_TLS_ENABLED: true
23
23
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
24
24
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
25
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
25
26
  DB_NAME: avatar
26
27
  DB_USER: avatar
27
28
  DB_ADMIN_USER: avatar_dba
@@ -36,6 +36,7 @@ config:
36
36
  NGINX_TLS_ENABLED: true
37
37
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
38
38
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
39
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
39
40
  DB_NAME: avatar
40
41
  DB_USER: avatar
41
42
  DB_ADMIN_USER: avatar_dba
@@ -111,6 +111,9 @@ items:
111
111
  RESOLVED_PUBLIC_BASE_URL:
112
112
  source: user_input
113
113
  value: https://avatar.example.com
114
+ SELF_SIGNED_CERT_PATH:
115
+ source: user_input
116
+ value: ''
114
117
  SMTP_HOST:
115
118
  source: user_input
116
119
  value: smtp.example.com
@@ -39,6 +39,7 @@ config:
39
39
  NGINX_TLS_ENABLED: true
40
40
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
41
41
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
42
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
42
43
  DB_NAME: avatar
43
44
  DB_USER: avatar
44
45
  DB_ADMIN_USER: avatar_dba
@@ -36,6 +36,7 @@ config:
36
36
  NGINX_TLS_ENABLED: true
37
37
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
38
38
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
39
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
39
40
  DB_NAME: avatar
40
41
  DB_USER: avatar
41
42
  DB_ADMIN_USER: avatar_dba
@@ -51,6 +51,7 @@ config:
51
51
  NGINX_TLS_ENABLED: true
52
52
  NGINX_SSL_CERTIFICATE_PATH: NORMALIZED_TLS_CERT_PATH
53
53
  NGINX_SSL_CERTIFICATE_KEY_PATH: NORMALIZED_TLS_KEY_PATH
54
+ SELF_SIGNED_CERT_PATH: NORMALIZED_SELF_SIGNED_CERT_PATH
54
55
  DB_ADMIN_USER: avatar_dba
55
56
  AUTHENTIK_DATABASE_NAME: authentik
56
57
  AUTHENTIK_DATABASE_USER: authentik
@@ -117,6 +117,7 @@ _SUBSTITUTIONS: list[tuple[str, str]] = [
117
117
  # Flat YAML key-value format (.deployment-state.yaml, deployment-config.yaml)
118
118
  (r"(NGINX_SSL_CERTIFICATE_PATH: )[^\n]+", r"\1NORMALIZED_TLS_CERT_PATH"),
119
119
  (r"(NGINX_SSL_CERTIFICATE_KEY_PATH: )[^\n]+", r"\1NORMALIZED_TLS_KEY_PATH"),
120
+ (r"(SELF_SIGNED_CERT_PATH: )[^\n]+", r"\1NORMALIZED_SELF_SIGNED_CERT_PATH"),
120
121
  # Nested YAML value field (deployment_state.yaml)
121
122
  (r"( value: )[^\n]*server\.fullchain\.crt[^\n]*", r"\1NORMALIZED_TLS_CERT_PATH"),
122
123
  (r"( value: )[^\n]*server\.decrypted\.key[^\n]*", r"\1NORMALIZED_TLS_KEY_PATH"),
@@ -129,6 +130,10 @@ _SUBSTITUTIONS: list[tuple[str, str]] = [
129
130
  r"( - )[^\n]+:(/etc/nginx/tls/private/server\.decrypted\.key:ro)",
130
131
  r"\1NORMALIZED_TLS_KEY_PATH:\2",
131
132
  ),
133
+ (
134
+ r"( - )[^\n]+:(/certs/server\.fullchain\.crt:ro)",
135
+ r"\1NORMALIZED_SELF_SIGNED_CERT_PATH:\2",
136
+ ),
132
137
  # --- Temp directory paths (compose.override.yaml) ---
133
138
  (r"/tmp/tmp[a-zA-Z0-9_-]+/", "/tmp/TEMP_DIR/"),
134
139
  # --- Remaining 64-char hex secrets (catch-all, after named patterns above) ---
@@ -141,3 +141,28 @@ class TestConfiguratorRunnerAdapterTranslate:
141
141
 
142
142
  assert result.items["organization_name"].value == "dev"
143
143
  assert result.items["organization_name"].source == DeploymentItemSource.LEGACY
144
+
145
+ def test_self_signed_cert_path_non_empty_propagated(self) -> None:
146
+ """SELF_SIGNED_CERT_PATH with a real path is propagated with USER_INPUT source.
147
+
148
+ SELF_SIGNED_CERT_PATH is not registered in the DeploymentItemRegistry, so it
149
+ falls through to the default spec whose MissingValuePolicy is PROMPT, which
150
+ maps to DeploymentItemSource.USER_INPUT in _source_from_policy.
151
+ """
152
+ base = _doc()
153
+ old = self._old_state(config={"SELF_SIGNED_CERT_PATH": "/tmp/server.fullchain.crt"})
154
+
155
+ result = self._adapter()._translate_to_document(base, old)
156
+
157
+ assert result.items["SELF_SIGNED_CERT_PATH"].value == "/tmp/server.fullchain.crt"
158
+ assert result.items["SELF_SIGNED_CERT_PATH"].source == DeploymentItemSource.USER_INPUT
159
+
160
+ def test_self_signed_cert_path_empty_string_propagated(self) -> None:
161
+ """SELF_SIGNED_CERT_PATH with an empty string (CA-trusted cert) is preserved as-is."""
162
+ base = _doc()
163
+ old = self._old_state(config={"SELF_SIGNED_CERT_PATH": ""})
164
+
165
+ result = self._adapter()._translate_to_document(base, old)
166
+
167
+ assert result.items["SELF_SIGNED_CERT_PATH"].value == ""
168
+ assert result.items["SELF_SIGNED_CERT_PATH"].source == DeploymentItemSource.USER_INPUT
@@ -11,6 +11,8 @@ import pytest
11
11
  from octopize_avatar_deploy.domain.validation import ValidationError, ValidationSuccess
12
12
  from octopize_avatar_deploy.steps import NginxTlsStep
13
13
  from octopize_avatar_deploy.steps.nginx import (
14
+ SelfSignedStatus,
15
+ detect_self_signed_cert,
14
16
  is_port_in_use,
15
17
  make_tls_cert_validator,
16
18
  make_tls_key_validator,
@@ -497,3 +499,121 @@ class TestMakeTlsKeyValidator:
497
499
 
498
500
  assert isinstance(result, ValidationSuccess)
499
501
  assert not any("pem" in w.lower() for w in printer.warnings)
502
+
503
+
504
+ # ---------------------------------------------------------------------------
505
+ # detect_self_signed_cert — unit tests (subprocess-mocked)
506
+ # ---------------------------------------------------------------------------
507
+
508
+ # Realistic subject/issuer lines as produced by ``openssl x509 -noout -subject -issuer``
509
+ _LE_SUBJECT = "subject=CN=octopize.tech"
510
+ _LE_ISSUER = "issuer=C=US, O=Let's Encrypt, CN=YE2"
511
+ _SELF_SUBJECT = "subject=CN=myserver"
512
+ _SELF_ISSUER = "issuer=CN=myserver"
513
+
514
+
515
+ def _make_verify_result(returncode: int, stdout: str = "", stderr: str = "") -> MagicMock:
516
+ r = MagicMock()
517
+ r.returncode = returncode
518
+ r.stdout = stdout
519
+ r.stderr = stderr
520
+ return r
521
+
522
+
523
+ def _make_x509_result(subject: str, issuer: str) -> MagicMock:
524
+ r = MagicMock()
525
+ r.returncode = 0
526
+ r.stdout = f"{subject}\n{issuer}\n"
527
+ r.stderr = ""
528
+ return r
529
+
530
+
531
+ class TestDetectSelfSignedCert:
532
+ """Unit tests for detect_self_signed_cert using mocked subprocess.run."""
533
+
534
+ def test_definitely_not_when_openssl_verify_succeeds(self, tmp_path):
535
+ """A fullchain cert trusted by the system CA store returns DEFINITELY_NOT."""
536
+ cert = tmp_path / "fullchain.pem"
537
+ cert.write_text(FULL_CHAIN_CERT)
538
+
539
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
540
+ mock_run.return_value = _make_verify_result(returncode=0)
541
+ result = detect_self_signed_cert(str(cert))
542
+
543
+ assert result == SelfSignedStatus.DEFINITELY_NOT
544
+ # Verify -untrusted flag is present in the openssl verify call
545
+ call_args = mock_run.call_args_list[0][0][0]
546
+ assert "-untrusted" in call_args, (
547
+ "openssl verify must pass -untrusted so bundled intermediates are used"
548
+ )
549
+
550
+ def test_verify_passes_cert_path_as_both_untrusted_and_positional(self, tmp_path):
551
+ """The cert path is passed as -untrusted <path> AND as the positional argument."""
552
+ cert = tmp_path / "fullchain.pem"
553
+ cert.write_text(FULL_CHAIN_CERT)
554
+ cert_str = str(cert)
555
+
556
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
557
+ mock_run.return_value = _make_verify_result(returncode=0)
558
+ detect_self_signed_cert(cert_str)
559
+
560
+ call_args = mock_run.call_args_list[0][0][0]
561
+ untrusted_idx = call_args.index("-untrusted")
562
+ assert call_args[untrusted_idx + 1] == cert_str, "cert path follows -untrusted"
563
+ assert call_args[-1] == cert_str, "cert path is also the positional argument"
564
+
565
+ def test_yes_when_subject_equals_issuer(self, tmp_path):
566
+ """A cert whose subject == issuer is self-signed."""
567
+ cert = tmp_path / "self.pem"
568
+ cert.write_text(SINGLE_CERT)
569
+
570
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
571
+ mock_run.side_effect = [
572
+ _make_verify_result(returncode=1), # openssl verify fails
573
+ _make_x509_result(_SELF_SUBJECT, _SELF_ISSUER), # subject == issuer
574
+ ]
575
+ result = detect_self_signed_cert(str(cert))
576
+
577
+ assert result == SelfSignedStatus.YES
578
+
579
+ def test_maybe_when_verify_fails_and_subject_ne_issuer(self, tmp_path):
580
+ """Verify fails but subject != issuer → private/unknown CA → MAYBE."""
581
+ cert = tmp_path / "private_ca.pem"
582
+ cert.write_text(FULL_CHAIN_CERT)
583
+
584
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
585
+ mock_run.side_effect = [
586
+ _make_verify_result(returncode=1), # openssl verify fails
587
+ _make_x509_result(_LE_SUBJECT, _LE_ISSUER), # subject != issuer
588
+ ]
589
+ result = detect_self_signed_cert(str(cert))
590
+
591
+ assert result == SelfSignedStatus.MAYBE
592
+
593
+ def test_unknown_when_x509_parse_fails(self, tmp_path):
594
+ """If openssl x509 cannot parse the cert, return UNKNOWN."""
595
+ cert = tmp_path / "garbage.pem"
596
+ cert.write_text("not a certificate")
597
+
598
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
599
+ x509_fail = MagicMock()
600
+ x509_fail.returncode = 1
601
+ x509_fail.stdout = ""
602
+ mock_run.side_effect = [
603
+ _make_verify_result(returncode=1), # openssl verify fails
604
+ x509_fail, # x509 parse fails too
605
+ ]
606
+ result = detect_self_signed_cert(str(cert))
607
+
608
+ assert result == SelfSignedStatus.UNKNOWN
609
+
610
+ def test_unknown_when_openssl_not_found(self, tmp_path):
611
+ """If openssl is not available, return UNKNOWN."""
612
+ cert = tmp_path / "fullchain.pem"
613
+ cert.write_text(FULL_CHAIN_CERT)
614
+
615
+ with patch("octopize_avatar_deploy.steps.nginx.subprocess.run") as mock_run:
616
+ mock_run.side_effect = FileNotFoundError("openssl not found")
617
+ result = detect_self_signed_cert(str(cert))
618
+
619
+ assert result == SelfSignedStatus.UNKNOWN
@@ -190,7 +190,7 @@ class TestDeploymentConfigurator:
190
190
  assert "ORGANIZATION_NAME=acme" not in content # It should be in secrets
191
191
  assert "NGINX_HTTP_PORT=" not in content
192
192
 
193
- def test_render_nginx_assets_inline_concrete_settings(
193
+ def test_render_nginx_self_signed_certificate_assets_inline_concrete_settings(
194
194
  self, temp_templates_dir, temp_output_dir, defaults_file
195
195
  ):
196
196
  """Test rendered Nginx assets inline the resolved TLS/HTTP settings."""
@@ -205,13 +205,21 @@ class TestDeploymentConfigurator:
205
205
  "NGINX_TLS_ENABLED": True,
206
206
  "NGINX_SSL_CERTIFICATE_PATH": "./tls/server.fullchain.crt",
207
207
  "NGINX_SSL_CERTIFICATE_KEY_PATH": "./tls/private/server.decrypted.key",
208
+ # When using self signed certificate, we need to mount the certificate path
209
+ # in the api container
210
+ "SELF_SIGNED_CERT_PATH": "./tls/server.fullchain.crt",
208
211
  }
209
212
 
210
213
  configurator.render_template("docker-compose.yml.template", "docker-compose.yml")
211
214
 
212
215
  compose_file = temp_output_dir / "docker-compose.yml"
213
216
  content = compose_file.read_text()
214
- assert "./tls/server.fullchain.crt:/etc/nginx/tls/server.fullchain.crt:ro" in content
217
+
218
+ # Make sure that the SSL_CERT_FILE is in the api service environment
219
+ # and that the volume mounts are correct (api, init-db, dask-scheduler, dask-worker)
220
+ assert "SSL_CERT_FILE: /certs/server.fullchain.crt" in content
221
+ assert content.count("./tls/server.fullchain.crt:/certs/server.fullchain.crt:ro") == 4
222
+
215
223
  assert (
216
224
  "./tls/private/server.decrypted.key:/etc/nginx/tls/private/server.decrypted.key:ro"
217
225
  in content
@@ -219,14 +227,57 @@ class TestDeploymentConfigurator:
219
227
  assert "${NGINX_SSL_CERTIFICATE_PATH}" not in content
220
228
  assert "${NGINX_SSL_CERTIFICATE_KEY_PATH}" not in content
221
229
 
230
+ def test_render_nginx_tls_certificate_assets_inline_concrete_settings(
231
+ self, temp_templates_dir, temp_output_dir, defaults_file
232
+ ):
233
+ """Test rendered Nginx assets inline the resolved TLS/HTTP settings."""
234
+ configurator = DeploymentConfigurator(
235
+ templates_dir=temp_templates_dir,
236
+ output_dir=temp_output_dir,
237
+ defaults_file=defaults_file,
238
+ )
239
+
222
240
  configurator.config = {
241
+ "PUBLIC_URL": "example.com",
242
+ "NGINX_TLS_ENABLED": True,
243
+ "NGINX_SSL_CERTIFICATE_PATH": "./tls/server.fullchain.crt",
244
+ "NGINX_SSL_CERTIFICATE_KEY_PATH": "./tls/private/server.decrypted.key",
245
+ }
246
+
247
+ configurator.render_template("docker-compose.yml.template", "docker-compose.yml")
248
+
249
+ compose_file = temp_output_dir / "docker-compose.yml"
250
+ content = compose_file.read_text()
251
+
252
+ # Make sure that the SSL_CERT_FILE is NOT in the api service environment
253
+ assert "SSL_CERT_FILE: /certs/server.fullchain.crt" not in content
254
+ assert content.count("./tls/server.fullchain.crt:/certs/server.fullchain.crt:ro") == 0
255
+
256
+ assert (
257
+ "./tls/private/server.decrypted.key:/etc/nginx/tls/private/server.decrypted.key:ro"
258
+ in content
259
+ )
260
+ assert "${NGINX_SSL_CERTIFICATE_PATH}" not in content
261
+ assert "${NGINX_SSL_CERTIFICATE_KEY_PATH}" not in content
262
+
263
+ def test_render_nginx_no_tls_assets_inline_concrete_settings(
264
+ self, temp_templates_dir, temp_output_dir, defaults_file
265
+ ):
266
+ """Test rendered Nginx assets inline the resolved HTTP settings when TLS is disabled."""
267
+ configurator2 = DeploymentConfigurator(
268
+ templates_dir=temp_templates_dir,
269
+ output_dir=temp_output_dir,
270
+ defaults_file=defaults_file,
271
+ )
272
+
273
+ configurator2.config = {
223
274
  "PUBLIC_URL": "example.com",
224
275
  "NGINX_TLS_ENABLED": False,
225
276
  "NGINX_HTTP_PORT": 8081,
226
277
  }
227
278
 
228
- configurator.render_template("docker-compose.yml.template", "docker-compose-http.yml")
229
- configurator.render_template("nginx.conf.template", "nginx-http.conf")
279
+ configurator2.render_template("docker-compose.yml.template", "docker-compose-http.yml")
280
+ configurator2.render_template("nginx.conf.template", "nginx-http.conf")
230
281
 
231
282
  no_tls_content = (temp_output_dir / "docker-compose-http.yml").read_text()
232
283
  assert '"8081:8081"' in no_tls_content