octopize.deploy_tool 3.2.0__tar.gz → 3.3.0__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 (400) hide show
  1. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/PKG-INFO +108 -27
  2. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/README.md +106 -25
  3. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/pyproject.toml +1 -1
  4. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/__init__.py +1 -1
  5. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/apply_command.py +25 -10
  6. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/checks.py +69 -0
  7. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/application/client_compatibility_report.py +157 -0
  8. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/install_command.py +11 -1
  9. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/migrate_command.py +89 -51
  10. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/subcommand_ports.py +32 -0
  11. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/authentik_migrate.py +73 -30
  12. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/create_self_signed_cert_task.py +2 -2
  13. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/create_users.py +2 -9
  14. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/provision_admin.py +21 -15
  15. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/reconcile_blueprint.py +2 -9
  16. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/update_command.py +86 -5
  17. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/diff_command.py +123 -7
  18. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/application/legacy_layout.py +128 -0
  19. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/application/operator_owned_files.py +99 -0
  20. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/ports.py +8 -0
  21. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/start_command.py +32 -1
  22. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/__init__.py +14 -6
  23. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/_shared.py +2 -19
  24. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/configure.py +2 -2
  25. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/diff.py +2 -2
  26. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/install.py +14 -2
  27. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/migrate.py +13 -2
  28. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/start.py +2 -2
  29. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/stop.py +4 -17
  30. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/tasks.py +2 -0
  31. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/uninstall.py +4 -17
  32. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/update.py +10 -2
  33. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/verify.py +6 -13
  34. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli_dependencies.py +35 -10
  35. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli_test_harness.py +10 -1
  36. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/defaults.yaml +3 -3
  37. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/domain/client_compatibility.py +109 -0
  38. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/deployment_item.py +6 -0
  39. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/deployment_item_registry.py +2 -0
  40. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/domain/service_versions.py +96 -0
  41. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/filesystem_legacy_source.py +8 -4
  42. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/infra/offline_http_client.py +73 -0
  43. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/preset_loader.py +44 -0
  44. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/printer.py +25 -0
  45. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -9
  46. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/templates/.template-version +1 -0
  47. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -1
  48. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +1 -2
  49. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/url_contract.py +0 -6
  50. octopize_deploy_tool-3.3.0/src/octopize_avatar_deploy/verbosity.py +37 -0
  51. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/TESTING.md +2 -1
  52. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/test_migrate_start_provision_verify.py +6 -0
  53. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/apply_help/output.txt +1 -3
  54. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/configure_happy_path/expected/.deployment_states/v1/deployment_state.yaml +0 -3
  55. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/configure_help/output.txt +1 -2
  56. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_help/output.txt +1 -2
  57. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/help/output.txt +4 -3
  58. {octopize_deploy_tool-3.2.0/tests/fixtures/update_interactive_diff/expected_apply_output → octopize_deploy_tool-3.3.0/tests/fixtures/install_apply_output}/docker-compose.yml +1 -2
  59. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_help/output.txt +2 -3
  60. {octopize_deploy_tool-3.2.0/tests/fixtures/update_interactive_diff/expected_render_output → octopize_deploy_tool-3.3.0/tests/fixtures/install_render_output}/docker-compose.yml +1 -2
  61. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/migrate_help/output.txt +8 -9
  62. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/render_help/output.txt +2 -4
  63. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/start_help/output.txt +1 -2
  64. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/stop_help/output.txt +1 -2
  65. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_authentik_migrate_help/output.txt +3 -3
  66. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_create_self_signed_cert_help/output.txt +2 -0
  67. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_create_users_help/output.txt +3 -3
  68. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_provision_admin_help/output.txt +3 -3
  69. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_reconcile_blueprint_help/output.txt +2 -3
  70. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/uninstall_help/output.txt +0 -2
  71. octopize_deploy_tool-3.3.0/tests/fixtures/update_help/output.txt +23 -0
  72. {octopize_deploy_tool-3.2.0/tests/fixtures/install_render_output → octopize_deploy_tool-3.3.0/tests/fixtures/update_interactive_diff/expected_apply_output}/docker-compose.yml +1 -2
  73. {octopize_deploy_tool-3.2.0/tests/fixtures/install_apply_output → octopize_deploy_tool-3.3.0/tests/fixtures/update_interactive_diff/expected_render_output}/docker-compose.yml +1 -2
  74. octopize_deploy_tool-3.3.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +579 -0
  75. octopize_deploy_tool-3.3.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +579 -0
  76. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/fakes.py +65 -9
  77. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/printers.py +37 -1
  78. octopize_deploy_tool-3.3.0/tests/integration/test_authentik_migrate_task.py +70 -0
  79. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_cli_integration.py +55 -0
  80. octopize_deploy_tool-3.3.0/tests/integration/test_client_compatibility_output.py +133 -0
  81. octopize_deploy_tool-3.3.0/tests/integration/test_legacy_app_root.py +138 -0
  82. octopize_deploy_tool-3.3.0/tests/integration/test_migrate_first_run.py +133 -0
  83. octopize_deploy_tool-3.3.0/tests/integration/test_migrate_relative_tls_paths.py +168 -0
  84. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_update_command.py +70 -0
  85. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_preset_loader.py +77 -0
  86. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_service_urls.py +0 -3
  87. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_apply_command.py +121 -4
  88. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_migrate_command.py +35 -5
  89. octopize_deploy_tool-3.3.0/tests/unit/test_client_compatibility.py +309 -0
  90. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_diff_command.py +263 -0
  91. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_install_command.py +41 -0
  92. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_migrate_command.py +151 -27
  93. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_preflight_checks.py +84 -1
  94. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_provision_admin.py +15 -0
  95. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_render_command.py +3 -0
  96. octopize_deploy_tool-3.3.0/tests/unit/test_service_versions.py +84 -0
  97. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_start_command.py +80 -3
  98. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_update_command.py +125 -0
  99. octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/templates/.template-version +0 -1
  100. octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/verbosity.py +0 -47
  101. octopize_deploy_tool-3.2.0/tests/fixtures/update_help/output.txt +0 -21
  102. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +0 -580
  103. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +0 -580
  104. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/.gitignore +0 -0
  105. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py +0 -0
  106. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/infra/deployment/deployment-tool/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
  107. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/infra/deployment/deployment-tool/tests/fixtures/help/output.txt +0 -0
  108. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/infra/deployment/deployment-tool/tests/fixtures/missing_subcommand/output.txt +0 -0
  109. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/__init__.py +0 -0
  110. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/_guards.py +0 -0
  111. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/authentik_env.py +0 -0
  112. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/authentik_login.py +0 -0
  113. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/authentik_readiness.py +0 -0
  114. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/__init__.py +0 -0
  115. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/create_self_signed_cert_command.py +0 -0
  116. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/tasks/registry.py +0 -0
  117. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/commands/verify_command.py +0 -0
  118. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/configure_command.py +0 -0
  119. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/configure_resume_policy.py +0 -0
  120. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/deployment_markers.py +0 -0
  121. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/deployment_paths.py +0 -0
  122. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/polling.py +0 -0
  123. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/render_command.py +0 -0
  124. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/secret_files.py +0 -0
  125. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/stop_command.py +0 -0
  126. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/uninstall_command.py +0 -0
  127. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/application/user_config.py +0 -0
  128. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/authentik_migration.py +0 -0
  129. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cert_generator.py +0 -0
  130. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/certificate_verifier.py +0 -0
  131. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/__init__.py +0 -0
  132. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/apply.py +0 -0
  133. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/cli/handlers/render.py +0 -0
  134. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/config_resolver.py +0 -0
  135. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/control_flags.py +0 -0
  136. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
  137. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/__init__.py +0 -0
  138. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/configure_preset.py +0 -0
  139. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/deployment_state.py +0 -0
  140. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/generation.py +0 -0
  141. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/placement.py +0 -0
  142. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/validation.py +0 -0
  143. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/domain/version_id.py +0 -0
  144. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/download_templates.py +0 -0
  145. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/environment.py +0 -0
  146. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/exceptions.py +0 -0
  147. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/__init__.py +0 -0
  148. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/cert_infra.py +0 -0
  149. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/current_version_resolver.py +0 -0
  150. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/docker_client.py +0 -0
  151. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/document_step_runner.py +0 -0
  152. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/env_file_reader.py +0 -0
  153. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/filesystem.py +0 -0
  154. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/filesystem_user_config_scaffolder.py +0 -0
  155. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/httpx2_http_client.py +0 -0
  156. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/in_memory_state_repository.py +0 -0
  157. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/noop_docker_client.py +0 -0
  158. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/package_defaults_source.py +0 -0
  159. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/package_template_provider.py +0 -0
  160. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/package_version_provider.py +0 -0
  161. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/system_clock.py +0 -0
  162. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/yaml_config_source.py +0 -0
  163. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/infra/yaml_state_repository.py +0 -0
  164. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/input_gatherer.py +0 -0
  165. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/normalizers.py +0 -0
  166. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
  167. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/public_url.py +0 -0
  168. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/renderer.py +0 -0
  169. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/resources/__init__.py +0 -0
  170. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/resources/config.example.yaml +0 -0
  171. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/secret_factory.py +0 -0
  172. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/self_signed_ssl.py +0 -0
  173. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
  174. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
  175. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
  176. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/base.py +0 -0
  177. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
  178. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/email.py +0 -0
  179. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
  180. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/nginx.py +0 -0
  181. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/required.py +0 -0
  182. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/storage.py +0 -0
  183. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/telemetry.py +0 -0
  184. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
  185. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
  186. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/.env.template +0 -0
  187. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -0
  188. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
  189. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
  190. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
  191. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
  192. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
  193. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
  194. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
  195. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
  196. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
  197. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
  198. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
  199. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
  200. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
  201. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
  202. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
  203. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
  204. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/tls_types.py +0 -0
  205. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
  206. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/src/octopize_avatar_deploy/version_compat.py +0 -0
  207. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/__init__.py +0 -0
  208. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/conftest.py +0 -0
  209. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/__init__.py +0 -0
  210. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/conftest.py +0 -0
  211. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/test_lifecycle.py +0 -0
  212. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/test_update_reapplies_blueprint.py +0 -0
  213. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/e2e/user_disable_revokes_api_key.py +0 -0
  214. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/__init__.py +0 -0
  215. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
  216. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
  217. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/authentik_migration/users.csv +0 -0
  218. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/configure_happy_path/input.yaml +0 -0
  219. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/configure_happy_path/output.txt +0 -0
  220. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/from/.env +0 -0
  221. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/from/nginx/nginx.conf +0 -0
  222. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/output.txt +0 -0
  223. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/to/.env +0 -0
  224. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/to/docker-compose.yml +0 -0
  225. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/diff_integration/to/nginx/nginx.conf +0 -0
  226. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.env +0 -0
  227. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/admin_emails +0 -0
  228. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/authjwt_secret_key +0 -0
  229. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/clevercloud_sso_salt +0 -0
  230. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_password +0 -0
  231. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_user +0 -0
  232. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_name +0 -0
  233. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_password +0 -0
  234. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_user +0 -0
  235. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/file_jwt_secret_key +0 -0
  236. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/organization_name +0 -0
  237. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/pepper +0 -0
  238. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/smtp_password +0 -0
  239. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/storage_admin_access_key_id +0 -0
  240. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/e2e/legacy_deployment/.secrets/storage_admin_secret_access_key +0 -0
  241. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/.env +0 -0
  242. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/.permissions.json +0 -0
  243. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/branding/favicon.ico +0 -0
  244. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/branding/logo.png +0 -0
  245. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  246. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  247. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  248. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  249. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  250. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  251. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  252. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/authentik/translations.json +0 -0
  253. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_apply_output/nginx/nginx.conf +0 -0
  254. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/.env +0 -0
  255. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/.permissions.json +0 -0
  256. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/branding/favicon.ico +0 -0
  257. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/branding/logo.png +0 -0
  258. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  259. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  260. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  261. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  262. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  263. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  264. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  265. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/authentik/translations.json +0 -0
  266. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/install_render_output/nginx/nginx.conf +0 -0
  267. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
  268. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
  269. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/non_interactive_no_telemetry/config.yaml +0 -0
  270. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/tasks_help/output.txt +0 -0
  271. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/base_v1/generated_files/.env +0 -0
  272. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.env +0 -0
  273. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.needs_blueprint_reconcile +0 -0
  274. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.permissions.json +0 -0
  275. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/favicon.ico +0 -0
  276. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/logo.png +0 -0
  277. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  278. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  279. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  280. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  281. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  282. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  283. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  284. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/translations.json +0 -0
  285. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_apply_output/nginx/nginx.conf +0 -0
  286. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/.env +0 -0
  287. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/.permissions.json +0 -0
  288. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/favicon.ico +0 -0
  289. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/logo.png +0 -0
  290. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  291. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  292. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  293. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  294. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  295. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  296. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  297. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/translations.json +0 -0
  298. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_interactive_diff/expected_render_output/nginx/nginx.conf +0 -0
  299. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/base_v1/generated_files/.env +0 -0
  300. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +0 -0
  301. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.needs_blueprint_reconcile +0 -0
  302. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.permissions.json +0 -0
  303. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/favicon.ico +0 -0
  304. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/logo.png +0 -0
  305. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  306. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  307. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  308. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  309. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  310. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  311. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  312. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/translations.json +0 -0
  313. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/nginx/nginx.conf +0 -0
  314. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +0 -0
  315. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/.permissions.json +0 -0
  316. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/favicon.ico +0 -0
  317. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/logo.png +0 -0
  318. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  319. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  320. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  321. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  322. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  323. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  324. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  325. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/translations.json +0 -0
  326. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/nginx/nginx.conf +0 -0
  327. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/fixtures/verify_help/output.txt +0 -0
  328. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/__init__.py +0 -0
  329. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/fixture_dir_comparison.py +0 -0
  330. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/normalization.py +0 -0
  331. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/steps.py +0 -0
  332. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/helpers/tls_fixtures.py +0 -0
  333. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/__init__.py +0 -0
  334. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_configure_command.py +0 -0
  335. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_create_self_signed_cert_task.py +0 -0
  336. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_diff_command.py +0 -0
  337. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_install_command.py +0 -0
  338. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/integration/test_migrate_without_tls_keys.py +0 -0
  339. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/test_cli_harness.py +0 -0
  340. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/__init__.py +0 -0
  341. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/conftest.py +0 -0
  342. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_docker_client.py +0 -0
  343. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_document_step_runner.py +0 -0
  344. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_filesystem.py +0 -0
  345. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_filesystem_legacy_source.py +0 -0
  346. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_httpx2_http_client.py +0 -0
  347. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_yaml_config_source.py +0 -0
  348. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/infra/test_yaml_deployment_state_repository.py +0 -0
  349. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_authentik.py +0 -0
  350. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_authentik_blueprint.py +0 -0
  351. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_database.py +0 -0
  352. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_email.py +0 -0
  353. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_logging.py +0 -0
  354. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_nginx.py +0 -0
  355. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_required.py +0 -0
  356. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_storage.py +0 -0
  357. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_telemetry.py +0 -0
  358. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/steps/test_user.py +0 -0
  359. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_client.py +0 -0
  360. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_env.py +0 -0
  361. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_login.py +0 -0
  362. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_migrate_for_docker.py +0 -0
  363. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_migrate_parsers.py +0 -0
  364. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_migration.py +0 -0
  365. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_authentik_readiness.py +0 -0
  366. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_cert_generator.py +0 -0
  367. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_certificate_verifier.py +0 -0
  368. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_cli_verify_ssl.py +0 -0
  369. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_compare_helpers.py +0 -0
  370. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_config_resolver.py +0 -0
  371. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_config_resolver_consistency.py +0 -0
  372. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_configure_command.py +0 -0
  373. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_create_self_signed_cert_task.py +0 -0
  374. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_create_users.py +0 -0
  375. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_deployment_item.py +0 -0
  376. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_docs_command_references.py +0 -0
  377. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_environment.py +0 -0
  378. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_generation.py +0 -0
  379. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_generic_prompt.py +0 -0
  380. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_input_gatherer.py +0 -0
  381. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_normalizers.py +0 -0
  382. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_output_spec.py +0 -0
  383. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_placement.py +0 -0
  384. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_polling.py +0 -0
  385. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_printer.py +0 -0
  386. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_public_url.py +0 -0
  387. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_reconcile_blueprint.py +0 -0
  388. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_renderer.py +0 -0
  389. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_rich_implementations.py +0 -0
  390. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_secret_factory.py +0 -0
  391. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_secret_files.py +0 -0
  392. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_select_authentik_migrate_parser.py +0 -0
  393. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_stop_command.py +0 -0
  394. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_task_registry.py +0 -0
  395. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_uninstall_command.py +0 -0
  396. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_user_config.py +0 -0
  397. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_validation.py +0 -0
  398. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_verify_command.py +0 -0
  399. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_version_id.py +0 -0
  400. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.3.0}/tests/unit/test_version_validation.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: octopize.deploy_tool
3
- Version: 3.2.0
3
+ Version: 3.3.0
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/self_installation
@@ -96,21 +96,27 @@ to be up, and `provision-admin` must run before `verify`. Both hold once `start`
96
96
 
97
97
  ## Command reference
98
98
 
99
- `--app-root` defaults to the current directory everywhere it is accepted. Every command takes
100
- `--verbosity {1,2}` (`2` is verbose) except `tasks create-self-signed-cert`. The older
101
- `--verbose` flag is deprecated in favour of `--verbosity 2` and is unavailable on `verify` and on
102
- all `tasks` sub-commands. Every command's `--help` lists its full option set.
99
+ `--app-root` defaults to the current directory everywhere it is accepted. Every command and
100
+ `tasks` sub-command takes `--verbosity {1,2}`, where `1` is essential (the default) and `2` is
101
+ verbose. Every command's `--help` lists its full option set.
103
102
 
104
103
  ### Everyday commands
105
104
 
106
- | Command | Use when |
107
- | ----------- | --------------------------------------------------------------------------- |
108
- | `install` | Setting up a new Avatar deployment for the first time |
109
- | `update` | Upgrading to a newer Avatar release, or changing a configuration value |
110
- | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
111
- | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
112
- | `uninstall` | Permanently destroying the deployment and all of its data |
113
- | `migrate` | Importing a deployment created by hand or by an older version of this tool |
105
+ Which of `install`, `update` and `migrate` you need is decided by what your deployment
106
+ directory already contains, so the table names that rather than a term only this tool uses:
107
+
108
+ | Command | Use when |
109
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
110
+ | `install` | Setting up a new Avatar deployment for the first time, in an empty directory |
111
+ | `update` | Upgrading to a newer Avatar release, or changing a configuration value, on a deployment that already has a `.deployment_states/` directory |
112
+ | `migrate` | Adopting a deployment that has `.env` and `.secrets/` at its top level and no `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than 2.7.0 |
113
+ | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
114
+ | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
115
+ | `uninstall` | Permanently destroying the deployment and all of its data |
116
+
117
+ If you point `update` or `install` at a directory of the second shape they stop and tell you to
118
+ run `migrate` — running `install` there would generate a fresh configuration instead of adopting
119
+ the one you already have.
114
120
 
115
121
  #### `install`
116
122
 
@@ -124,7 +130,22 @@ start. It starts nothing — run `start` afterwards.
124
130
  --verbosity {1,2} 1 = essential (default), 2 = verbose
125
131
  ```
126
132
 
127
- Before doing anything, `install` looks for Avatar Docker volumes left over from an earlier
133
+ Before doing anything, `install` checks the app root itself. If it holds `.env` and `.secrets/`
134
+ at the top level and no `.deployment_states/`, that is a deployment predating the versioned
135
+ layout, and installing over it would generate a fresh configuration rather than adopt it, so the
136
+ run stops:
137
+
138
+ ```text
139
+ ✗ /app/avatar looks like a pre-versioned deployment (.env and .secrets/ at the top level, no
140
+ .deployment_states/). Import it once with:
141
+
142
+ octopize-deploy-tool migrate --app-root <new-app-root> --from-legacy /app/avatar
143
+
144
+ then use 'update' for subsequent releases.
145
+ ⚠ Install aborted during pre-flight checks.
146
+ ```
147
+
148
+ Next, `install` looks for Avatar Docker volumes left over from an earlier
128
149
  deployment. If it finds any it refuses to run, in both interactive and non-interactive mode:
129
150
 
130
151
  ```text
@@ -152,7 +173,9 @@ Re-runs the configuration from your current state, re-renders every file with th
152
173
  bundled in the installed version of this tool, shows a diff, and applies it. Values you already
153
174
  answered are carried forward, so you are not asked again. `--from-config PATH` layers a YAML file
154
175
  over the current state (see [Changing a configuration
155
- value](#changing-a-configuration-value)).
176
+ value](#changing-a-configuration-value)). It needs a `.deployment_states/` directory to read that
177
+ state from; against a directory that has `.env` and `.secrets/` at the top level instead, it stops
178
+ and points you at `migrate`.
156
179
 
157
180
  ```bash
158
181
  octopize-deploy-tool update --app-root ./app/avatar
@@ -177,6 +200,34 @@ Merge your edits into the rendered copy in `.deployment_states/<vX>/generated/`,
177
200
  `apply --version <vX>`. Anything that should survive future updates belongs in a config file, not
178
201
  in `generated_files/`.
179
202
 
203
+ Two files never come from a render, so `apply` carries them across untouched rather than
204
+ replacing them with the copy: the API key and the two JWTs that `tasks provision-admin` writes to
205
+ `generated_files/.secrets/avatar_api_key`, `avatar_access_token` and `avatar_refresh_token`.
206
+ Anything else you leave in `generated_files/` is replaced.
207
+
208
+ #### Python client compatibility
209
+
210
+ `install`, `update` and `migrate` each deploy a specific Avatar API version, and no single python
211
+ client works with every one of them — so an update can break the notebooks and scripts your users
212
+ already have. Each of those commands ends by naming the clients that work with the version it just
213
+ deployed:
214
+
215
+ ```text
216
+ Python client compatibility
217
+ This deployment now runs Avatar API 3.2.3.
218
+ Latest compatible python client: 1.28.0 (pip install 'octopize.avatar==1.28.0')
219
+ Clients older than 1.26.0 will stop working — tell your users before they next run a job.
220
+ ```
221
+
222
+ When an `update` does not move the API version at all — a tool-only bump — this collapses to a
223
+ single reassuring line instead.
224
+
225
+ The table is fetched from `COMPATIBILITY_MAPPING_URL` (see
226
+ [`config.example.yaml`](#changing-a-configuration-value); point it at your own mirror if you are
227
+ air-gapped). This is advisory output: if the URL cannot be reached the command warns once and
228
+ carries on — a deployment never fails because a version table was unavailable. To check
229
+ compatibility as a hard gate, use `verify`.
230
+
180
231
  #### `start` and `stop`
181
232
 
182
233
  `start` creates any missing Docker volumes and brings all services up. It is idempotent, so it is
@@ -200,21 +251,46 @@ octopize-deploy-tool uninstall --app-root ./app/avatar
200
251
 
201
252
  #### `migrate`
202
253
 
203
- Imports a deployment set up manually or with an older version of this tool. Point
204
- `--from-legacy` at the directory holding the existing `.env` and `.secrets/`; values readable
205
- from there are carried over and you are prompted for the rest. If `--from-legacy` is omitted the
206
- tool asks for it interactively.
254
+ Adopts a deployment whose directory holds `.env` and `.secrets/` at the top level and has no
255
+ `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than
256
+ 2.7.0. Point `--from-legacy` at that directory; values readable from there are carried over and
257
+ you are prompted for the rest. If `--from-legacy` is omitted the tool asks for it interactively.
207
258
 
208
259
  ```bash
209
260
  octopize-deploy-tool migrate --app-root ./app/avatar-new --from-legacy ./app/avatar-old
210
261
  octopize-deploy-tool start --app-root ./app/avatar-new
211
262
  ```
212
263
 
264
+ Before applying anything, `migrate` shows you the diff between your existing directory and the new
265
+ render, led by the service versions that change:
266
+
267
+ ```text
268
+ Service versions (5 changing):
269
+ AVATAR_API_VERSION 2.55.0 → 3.2.3
270
+ AVATAR_PDFGENERATOR_VERSION 0.2.0 → (removed)
271
+ AVATAR_WEB_VERSION 0.38.0 → 0.65.1
272
+ ```
273
+
274
+ Expect a large first diff — the layout itself changes, `pdfgenerator` goes away (the report
275
+ generator is now embedded in the API), and the services jump every release at once. Conflicts
276
+ default to accepting the new render, since the legacy directory is what `migrate` replaces;
277
+ answering "keep" for a file is still honoured and still blocks the apply.
278
+
279
+ `migrate` also creates `user_config/` under the new app root, so a migrated deployment is shaped
280
+ exactly like an installed one and `update --from-config` works the same way on both.
281
+
213
282
  > **Before migrating non-interactively**, make sure the legacy `.env` sets
214
283
  > `NGINX_SSL_CERTIFICATE_PATH` and `NGINX_SSL_CERTIFICATE_KEY_PATH` to paths that exist.
215
- > Otherwise the run falls back to a relative built-in default and fails with
216
- > `Invalid default value for 'NGINX_SSL_CERTIFICATE_PATH'`, and `--non-interactive` offers no way
217
- > to supply one.
284
+ > Otherwise the run falls back to a relative built-in default and keeps it with a warning that
285
+ > the path is "not usable yet" — the migration completes, but nginx will not start until a
286
+ > certificate and key exist at those paths, and `--non-interactive` offers no way to supply one.
287
+ > A path _you_ set that does not exist is a hard error instead.
288
+ >
289
+ > A relative path in that `.env` — `./tls/server.fullchain.crt` — is read relative to the
290
+ > `--from-legacy` directory it was written for, whichever directory you run `migrate` from, and is
291
+ > recorded as an absolute path in the new deployment. The exception is running the tool from the
292
+ > Docker image, where those paths belong to the host and are recorded exactly as written; see
293
+ > [Running via Docker](#running-via-docker).
218
294
 
219
295
  See [Upgrading from a pre-SSO deployment](#upgrading-from-a-pre-sso-deployment) for what happens
220
296
  to existing user accounts.
@@ -515,8 +591,11 @@ Notes:
515
591
 
516
592
  Older Avatar deployments kept users in the Avatar API database. `migrate` records that they still
517
593
  need importing into Authentik, and **the first `start` after a `migrate` offers to do it for
518
- you**: it previews every operation, asks for confirmation, and runs the import. Nothing has to be
519
- run by hand.
594
+ you**: it asks `Run it now?` and runs the import. Nothing has to be run by hand.
595
+
596
+ Add `--verbosity 2` to review before committing: the plan — every group and every user the import
597
+ would create — is printed, and a second prompt asks whether to go ahead with it. At the default
598
+ `--verbosity 1` nothing is printed beforehand, so `Run it now?` is the only question asked.
520
599
 
521
600
  If you decline, the same import is available later:
522
601
 
@@ -527,8 +606,10 @@ octopize-deploy-tool tasks authentik-migrate --from-docker --app-root ./app/avat
527
606
  `--from-docker` reads users, organizations and licenses straight from the running api container's
528
607
  database, so there is no CSV export to produce; **the extracted data is held in memory and never
529
608
  written to disk**. The Authentik URL and token come from `generated_files/.env`. `--dry-run`
530
- previews without changing anything. Users that already carry an `authentik_id` are skipped, so the
531
- import is safe to re-run.
609
+ prints the plan — every group and every user that would be created — and writes nothing to
610
+ Authentik (with `--from-docker` it still brings the stack up to read the database); a real run
611
+ prints that plan only under `--verbosity 2`. Users that already carry an `authentik_id` are
612
+ skipped, so the import is safe to re-run.
532
613
 
533
614
  Every run that is not a `--dry-run` does write an operation log — `migration_log.jsonl` unless
534
615
  `--log PATH` says otherwise — recording what was attempted and how it ended.
@@ -63,21 +63,27 @@ to be up, and `provision-admin` must run before `verify`. Both hold once `start`
63
63
 
64
64
  ## Command reference
65
65
 
66
- `--app-root` defaults to the current directory everywhere it is accepted. Every command takes
67
- `--verbosity {1,2}` (`2` is verbose) except `tasks create-self-signed-cert`. The older
68
- `--verbose` flag is deprecated in favour of `--verbosity 2` and is unavailable on `verify` and on
69
- all `tasks` sub-commands. Every command's `--help` lists its full option set.
66
+ `--app-root` defaults to the current directory everywhere it is accepted. Every command and
67
+ `tasks` sub-command takes `--verbosity {1,2}`, where `1` is essential (the default) and `2` is
68
+ verbose. Every command's `--help` lists its full option set.
70
69
 
71
70
  ### Everyday commands
72
71
 
73
- | Command | Use when |
74
- | ----------- | --------------------------------------------------------------------------- |
75
- | `install` | Setting up a new Avatar deployment for the first time |
76
- | `update` | Upgrading to a newer Avatar release, or changing a configuration value |
77
- | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
78
- | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
79
- | `uninstall` | Permanently destroying the deployment and all of its data |
80
- | `migrate` | Importing a deployment created by hand or by an older version of this tool |
72
+ Which of `install`, `update` and `migrate` you need is decided by what your deployment
73
+ directory already contains, so the table names that rather than a term only this tool uses:
74
+
75
+ | Command | Use when |
76
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
77
+ | `install` | Setting up a new Avatar deployment for the first time, in an empty directory |
78
+ | `update` | Upgrading to a newer Avatar release, or changing a configuration value, on a deployment that already has a `.deployment_states/` directory |
79
+ | `migrate` | Adopting a deployment that has `.env` and `.secrets/` at its top level and no `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than 2.7.0 |
80
+ | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
81
+ | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
82
+ | `uninstall` | Permanently destroying the deployment and all of its data |
83
+
84
+ If you point `update` or `install` at a directory of the second shape they stop and tell you to
85
+ run `migrate` — running `install` there would generate a fresh configuration instead of adopting
86
+ the one you already have.
81
87
 
82
88
  #### `install`
83
89
 
@@ -91,7 +97,22 @@ start. It starts nothing — run `start` afterwards.
91
97
  --verbosity {1,2} 1 = essential (default), 2 = verbose
92
98
  ```
93
99
 
94
- Before doing anything, `install` looks for Avatar Docker volumes left over from an earlier
100
+ Before doing anything, `install` checks the app root itself. If it holds `.env` and `.secrets/`
101
+ at the top level and no `.deployment_states/`, that is a deployment predating the versioned
102
+ layout, and installing over it would generate a fresh configuration rather than adopt it, so the
103
+ run stops:
104
+
105
+ ```text
106
+ ✗ /app/avatar looks like a pre-versioned deployment (.env and .secrets/ at the top level, no
107
+ .deployment_states/). Import it once with:
108
+
109
+ octopize-deploy-tool migrate --app-root <new-app-root> --from-legacy /app/avatar
110
+
111
+ then use 'update' for subsequent releases.
112
+ ⚠ Install aborted during pre-flight checks.
113
+ ```
114
+
115
+ Next, `install` looks for Avatar Docker volumes left over from an earlier
95
116
  deployment. If it finds any it refuses to run, in both interactive and non-interactive mode:
96
117
 
97
118
  ```text
@@ -119,7 +140,9 @@ Re-runs the configuration from your current state, re-renders every file with th
119
140
  bundled in the installed version of this tool, shows a diff, and applies it. Values you already
120
141
  answered are carried forward, so you are not asked again. `--from-config PATH` layers a YAML file
121
142
  over the current state (see [Changing a configuration
122
- value](#changing-a-configuration-value)).
143
+ value](#changing-a-configuration-value)). It needs a `.deployment_states/` directory to read that
144
+ state from; against a directory that has `.env` and `.secrets/` at the top level instead, it stops
145
+ and points you at `migrate`.
123
146
 
124
147
  ```bash
125
148
  octopize-deploy-tool update --app-root ./app/avatar
@@ -144,6 +167,34 @@ Merge your edits into the rendered copy in `.deployment_states/<vX>/generated/`,
144
167
  `apply --version <vX>`. Anything that should survive future updates belongs in a config file, not
145
168
  in `generated_files/`.
146
169
 
170
+ Two files never come from a render, so `apply` carries them across untouched rather than
171
+ replacing them with the copy: the API key and the two JWTs that `tasks provision-admin` writes to
172
+ `generated_files/.secrets/avatar_api_key`, `avatar_access_token` and `avatar_refresh_token`.
173
+ Anything else you leave in `generated_files/` is replaced.
174
+
175
+ #### Python client compatibility
176
+
177
+ `install`, `update` and `migrate` each deploy a specific Avatar API version, and no single python
178
+ client works with every one of them — so an update can break the notebooks and scripts your users
179
+ already have. Each of those commands ends by naming the clients that work with the version it just
180
+ deployed:
181
+
182
+ ```text
183
+ Python client compatibility
184
+ This deployment now runs Avatar API 3.2.3.
185
+ Latest compatible python client: 1.28.0 (pip install 'octopize.avatar==1.28.0')
186
+ Clients older than 1.26.0 will stop working — tell your users before they next run a job.
187
+ ```
188
+
189
+ When an `update` does not move the API version at all — a tool-only bump — this collapses to a
190
+ single reassuring line instead.
191
+
192
+ The table is fetched from `COMPATIBILITY_MAPPING_URL` (see
193
+ [`config.example.yaml`](#changing-a-configuration-value); point it at your own mirror if you are
194
+ air-gapped). This is advisory output: if the URL cannot be reached the command warns once and
195
+ carries on — a deployment never fails because a version table was unavailable. To check
196
+ compatibility as a hard gate, use `verify`.
197
+
147
198
  #### `start` and `stop`
148
199
 
149
200
  `start` creates any missing Docker volumes and brings all services up. It is idempotent, so it is
@@ -167,21 +218,46 @@ octopize-deploy-tool uninstall --app-root ./app/avatar
167
218
 
168
219
  #### `migrate`
169
220
 
170
- Imports a deployment set up manually or with an older version of this tool. Point
171
- `--from-legacy` at the directory holding the existing `.env` and `.secrets/`; values readable
172
- from there are carried over and you are prompted for the rest. If `--from-legacy` is omitted the
173
- tool asks for it interactively.
221
+ Adopts a deployment whose directory holds `.env` and `.secrets/` at the top level and has no
222
+ `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than
223
+ 2.7.0. Point `--from-legacy` at that directory; values readable from there are carried over and
224
+ you are prompted for the rest. If `--from-legacy` is omitted the tool asks for it interactively.
174
225
 
175
226
  ```bash
176
227
  octopize-deploy-tool migrate --app-root ./app/avatar-new --from-legacy ./app/avatar-old
177
228
  octopize-deploy-tool start --app-root ./app/avatar-new
178
229
  ```
179
230
 
231
+ Before applying anything, `migrate` shows you the diff between your existing directory and the new
232
+ render, led by the service versions that change:
233
+
234
+ ```text
235
+ Service versions (5 changing):
236
+ AVATAR_API_VERSION 2.55.0 → 3.2.3
237
+ AVATAR_PDFGENERATOR_VERSION 0.2.0 → (removed)
238
+ AVATAR_WEB_VERSION 0.38.0 → 0.65.1
239
+ ```
240
+
241
+ Expect a large first diff — the layout itself changes, `pdfgenerator` goes away (the report
242
+ generator is now embedded in the API), and the services jump every release at once. Conflicts
243
+ default to accepting the new render, since the legacy directory is what `migrate` replaces;
244
+ answering "keep" for a file is still honoured and still blocks the apply.
245
+
246
+ `migrate` also creates `user_config/` under the new app root, so a migrated deployment is shaped
247
+ exactly like an installed one and `update --from-config` works the same way on both.
248
+
180
249
  > **Before migrating non-interactively**, make sure the legacy `.env` sets
181
250
  > `NGINX_SSL_CERTIFICATE_PATH` and `NGINX_SSL_CERTIFICATE_KEY_PATH` to paths that exist.
182
- > Otherwise the run falls back to a relative built-in default and fails with
183
- > `Invalid default value for 'NGINX_SSL_CERTIFICATE_PATH'`, and `--non-interactive` offers no way
184
- > to supply one.
251
+ > Otherwise the run falls back to a relative built-in default and keeps it with a warning that
252
+ > the path is "not usable yet" — the migration completes, but nginx will not start until a
253
+ > certificate and key exist at those paths, and `--non-interactive` offers no way to supply one.
254
+ > A path _you_ set that does not exist is a hard error instead.
255
+ >
256
+ > A relative path in that `.env` — `./tls/server.fullchain.crt` — is read relative to the
257
+ > `--from-legacy` directory it was written for, whichever directory you run `migrate` from, and is
258
+ > recorded as an absolute path in the new deployment. The exception is running the tool from the
259
+ > Docker image, where those paths belong to the host and are recorded exactly as written; see
260
+ > [Running via Docker](#running-via-docker).
185
261
 
186
262
  See [Upgrading from a pre-SSO deployment](#upgrading-from-a-pre-sso-deployment) for what happens
187
263
  to existing user accounts.
@@ -482,8 +558,11 @@ Notes:
482
558
 
483
559
  Older Avatar deployments kept users in the Avatar API database. `migrate` records that they still
484
560
  need importing into Authentik, and **the first `start` after a `migrate` offers to do it for
485
- you**: it previews every operation, asks for confirmation, and runs the import. Nothing has to be
486
- run by hand.
561
+ you**: it asks `Run it now?` and runs the import. Nothing has to be run by hand.
562
+
563
+ Add `--verbosity 2` to review before committing: the plan — every group and every user the import
564
+ would create — is printed, and a second prompt asks whether to go ahead with it. At the default
565
+ `--verbosity 1` nothing is printed beforehand, so `Run it now?` is the only question asked.
487
566
 
488
567
  If you decline, the same import is available later:
489
568
 
@@ -494,8 +573,10 @@ octopize-deploy-tool tasks authentik-migrate --from-docker --app-root ./app/avat
494
573
  `--from-docker` reads users, organizations and licenses straight from the running api container's
495
574
  database, so there is no CSV export to produce; **the extracted data is held in memory and never
496
575
  written to disk**. The Authentik URL and token come from `generated_files/.env`. `--dry-run`
497
- previews without changing anything. Users that already carry an `authentik_id` are skipped, so the
498
- import is safe to re-run.
576
+ prints the plan — every group and every user that would be created — and writes nothing to
577
+ Authentik (with `--from-docker` it still brings the stack up to read the database); a real run
578
+ prints that plan only under `--verbosity 2`. Users that already carry an `authentik_id` are
579
+ skipped, so the import is safe to re-run.
499
580
 
500
581
  Every run that is not a `--dry-run` does write an operation log — `migration_log.jsonl` unless
501
582
  `--log PATH` says otherwise — recording what was attempted and how it ended.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "octopize.deploy_tool"
7
- version = "3.2.0"
7
+ version = "3.3.0"
8
8
  description = "Deployment configuration tool for Octopize Avatar platform"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -9,7 +9,7 @@ from .version_compat import (
9
9
  validate_template_version,
10
10
  )
11
11
 
12
- __version__ = "3.2.0"
12
+ __version__ = "3.3.0"
13
13
  __all__ = [
14
14
  "SCRIPT_VERSION",
15
15
  "ConsolePrinter",
@@ -17,6 +17,10 @@ from pathlib import Path
17
17
  from octopize_avatar_deploy.application._guards import CommandError, run_guarded
18
18
  from octopize_avatar_deploy.application.deployment_markers import DeploymentMarker
19
19
  from octopize_avatar_deploy.application.deployment_paths import DeploymentPaths
20
+ from octopize_avatar_deploy.application.operator_owned_files import (
21
+ capture_operator_owned_files,
22
+ restore_operator_owned_files,
23
+ )
20
24
  from octopize_avatar_deploy.application.ports import DirectoryCopier, FileWriter, SymlinkUpdater
21
25
  from octopize_avatar_deploy.application.secret_files import relax_deployed_secrets
22
26
  from octopize_avatar_deploy.domain.version_id import VersionId
@@ -75,8 +79,9 @@ class ApplyCommand:
75
79
  versioned ``generated/`` directory to ``generated_files/``.
76
80
  symlink_updater: Port that creates or replaces the
77
81
  ``currently_deployed`` symlink.
78
- file_writer: Port used to write the marker files requested via
79
- ``args.markers``.
82
+ file_writer: Port used to carry the operator-owned files across the copy
83
+ (see :mod:`~application.operator_owned_files`) and to write the
84
+ marker files requested via ``args.markers``.
80
85
 
81
86
  """
82
87
 
@@ -100,12 +105,15 @@ class ApplyCommand:
100
105
  2. Parse the target version label.
101
106
  3. Confirm that ``render`` has been run for this version (the
102
107
  ``generated/`` directory exists).
103
- 4. Copy ``.deployment_states/vX/generated/`` → ``generated_files/``
108
+ 4. Read the operator-owned files under ``generated_files/`` that no
109
+ version slot contains (see :mod:`~application.operator_owned_files`).
110
+ 5. Copy ``.deployment_states/vX/generated/`` → ``generated_files/``
104
111
  (full recursive copy — not a symlink — so operator edits in
105
- ``generated_files/`` never affect the versioned reference).
106
- 5. Update ``.deployment_states/currently_deployed`` symlink → ``vX``.
107
- 6. Write the requested marker files, if any.
108
- 7. Return a result.
112
+ ``generated_files/`` never affect the versioned reference), then
113
+ write the operator-owned files back.
114
+ 6. Update ``.deployment_states/currently_deployed`` symlink → ``vX``.
115
+ 7. Write the requested marker files, if any.
116
+ 8. Return a result.
109
117
 
110
118
  Args:
111
119
  args: Apply command arguments.
@@ -135,15 +143,22 @@ class ApplyCommand:
135
143
  f"Run 'render --version {version.label}' first."
136
144
  )
137
145
 
138
- # 3. Copy generated/ → generated_files/.
146
+ # 3. Read the files no version slot contains, so the copy cannot destroy
147
+ # them (see application.operator_owned_files).
148
+ preserved = capture_operator_owned_files(self._file_writer, paths.generated_files_dir)
149
+
150
+ # 4. Copy generated/ → generated_files/, then put those files back.
139
151
  self._directory_copier.copy(paths.generated_dir, paths.generated_files_dir)
152
+ restore_operator_owned_files(self._file_writer, paths.generated_files_dir, preserved)
140
153
  # Relax deployed secrets so Docker Compose can read them as the container UID.
141
154
  relax_deployed_secrets(self._directory_copier, paths.generated_files_dir)
142
155
 
143
- # 4. Update currently_deployed symlink.
156
+ # 5. Update currently_deployed symlink.
144
157
  self._symlink_updater.update_symlink(paths.currently_deployed_symlink, paths.version_dir)
145
158
 
146
- # 5. Write the markers handed to `start`, opt-in only (see docs/adr/0002).
159
+ # 6. Write the markers handed to `start`, opt-in only (see docs/adr/0002).
160
+ # After the copy, like the operator-owned files above and for the same
161
+ # reason: the copy would otherwise wipe them.
147
162
  if args.markers:
148
163
  self._file_writer.write(
149
164
  paths.generated_files_dir, {marker.value: b"" for marker in args.markers}
@@ -22,6 +22,13 @@ from dataclasses import dataclass, field
22
22
  from pathlib import Path
23
23
  from typing import Literal, Protocol
24
24
 
25
+ from octopize_avatar_deploy.application.legacy_layout import (
26
+ PathProbe,
27
+ deployed_working_copy_message,
28
+ is_deployed_working_copy,
29
+ is_legacy_layout,
30
+ legacy_layout_message,
31
+ )
25
32
  from octopize_avatar_deploy.application.ports import (
26
33
  DeploymentStateRepository,
27
34
  DockerClient,
@@ -85,6 +92,68 @@ class Check(Protocol):
85
92
  ...
86
93
 
87
94
 
95
+ # ---------------------------------------------------------------------------
96
+ # LegacyLayoutCheck
97
+ # ---------------------------------------------------------------------------
98
+
99
+
100
+ @dataclass
101
+ class LegacyLayoutCheckResult:
102
+ """Result of the pre-versioned layout pre-flight check.
103
+
104
+ Attributes:
105
+ aborted: ``True`` if *app_root* holds a pre-versioned deployment, which
106
+ ``install`` must never write over.
107
+
108
+ """
109
+
110
+ aborted: bool
111
+
112
+
113
+ class LegacyLayoutCheck:
114
+ """Refuse to install over a directory that is already somebody's deployment.
115
+
116
+ Two shapes are refused. A pre-versioned deployment, where ``install``
117
+ would generate a fresh configuration rather than adopt the existing one, is
118
+ pointed at ``migrate --from-legacy``. A modern deployment's own
119
+ ``generated_files/`` — which has the same flat shape and is where operators
120
+ spend their time, since it holds ``docker-compose.yml`` — is pointed one
121
+ level up at its real root. Runs before :class:`VolumeCheck` so the
122
+ directory the operator can see is reported before the Docker state.
123
+
124
+ Args:
125
+ path_probe: Port answering :meth:`exists` (the ``Filesystem`` adapter in
126
+ production, a stub in tests).
127
+ printer: Port for error output.
128
+
129
+ """
130
+
131
+ def __init__(self, path_probe: PathProbe, printer: Printer) -> None:
132
+ self._path_probe = path_probe
133
+ self._printer = printer
134
+
135
+ def run(self, app_root: Path) -> LegacyLayoutCheckResult:
136
+ """Abort when *app_root* is a legacy flat deployment.
137
+
138
+ Args:
139
+ app_root: Operator's working directory (the deployment root).
140
+
141
+ Returns:
142
+ :class:`LegacyLayoutCheckResult` with the abort flag set when the
143
+ directory must be migrated rather than installed over.
144
+
145
+ """
146
+ if is_deployed_working_copy(self._path_probe, app_root):
147
+ self._printer.print_error(deployed_working_copy_message(app_root))
148
+ return LegacyLayoutCheckResult(aborted=True)
149
+
150
+ if not is_legacy_layout(self._path_probe, app_root):
151
+ return LegacyLayoutCheckResult(aborted=False)
152
+
153
+ self._printer.print_error(legacy_layout_message(app_root))
154
+ return LegacyLayoutCheckResult(aborted=True)
155
+
156
+
88
157
  # ---------------------------------------------------------------------------
89
158
  # VolumeCheck
90
159
  # ---------------------------------------------------------------------------