octopize.deploy_tool 3.2.0__tar.gz → 3.4.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 (407) hide show
  1. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/PKG-INFO +116 -28
  2. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/README.md +114 -26
  3. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/pyproject.toml +1 -1
  4. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/__init__.py +1 -1
  5. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/app_root.py +123 -0
  6. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/apply_command.py +25 -10
  7. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/checks.py +69 -0
  8. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/client_compatibility_report.py +157 -0
  9. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/install_command.py +13 -3
  10. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/migrate_command.py +91 -53
  11. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/subcommand_ports.py +32 -0
  12. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/authentik_migrate.py +73 -30
  13. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/create_self_signed_cert_task.py +2 -2
  14. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/create_users.py +64 -14
  15. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/provision_admin.py +21 -15
  16. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/reconcile_blueprint.py +2 -9
  17. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/update_command.py +89 -7
  18. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/diff_command.py +123 -7
  19. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/legacy_layout.py +128 -0
  20. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/operator_owned_files.py +99 -0
  21. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/ports.py +8 -0
  22. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/start_command.py +32 -1
  23. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/authentik_migration.py +12 -3
  24. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/authentik_user_types.py +23 -0
  25. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/__init__.py +23 -6
  26. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/_shared.py +2 -19
  27. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/configure.py +2 -2
  28. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/diff.py +2 -2
  29. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/install.py +14 -2
  30. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/migrate.py +13 -2
  31. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/start.py +2 -2
  32. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/stop.py +4 -17
  33. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/tasks.py +2 -0
  34. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/uninstall.py +4 -17
  35. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/update.py +10 -2
  36. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/verify.py +6 -13
  37. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli_dependencies.py +35 -10
  38. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli_test_harness.py +10 -1
  39. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/config_resolver.py +29 -7
  40. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/defaults.yaml +3 -3
  41. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/domain/client_compatibility.py +109 -0
  42. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_item.py +6 -0
  43. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_item_registry.py +2 -0
  44. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/domain/service_versions.py +96 -0
  45. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem_legacy_source.py +8 -4
  46. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/infra/offline_http_client.py +73 -0
  47. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/preset_loader.py +44 -0
  48. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/input_gatherer.py +114 -10
  49. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/printer.py +25 -0
  50. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/resources/config.example.yaml +11 -2
  51. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/base.py +13 -2
  52. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/email.py +9 -4
  53. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/required.py +2 -0
  54. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -9
  55. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/templates/.env.template +3 -0
  56. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/templates/.template-version +1 -0
  57. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -1
  58. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +1 -0
  59. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -1
  60. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +1 -2
  61. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/url_contract.py +0 -6
  62. octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/verbosity.py +37 -0
  63. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/TESTING.md +2 -1
  64. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_lifecycle.py +32 -0
  65. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_migrate_start_provision_verify.py +6 -0
  66. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/apply_help/output.txt +1 -3
  67. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_happy_path/expected/.deployment_states/v1/deployment_state.yaml +0 -3
  68. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_help/output.txt +1 -2
  69. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_help/output.txt +1 -2
  70. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/help/output.txt +4 -3
  71. {octopize_deploy_tool-3.2.0/tests/fixtures/install_render_output → octopize_deploy_tool-3.4.0/tests/fixtures/install_apply_output}/.env +2 -1
  72. {octopize_deploy_tool-3.2.0/tests/fixtures/update_interactive_diff/expected_apply_output → octopize_deploy_tool-3.4.0/tests/fixtures/install_apply_output}/docker-compose.yml +1 -2
  73. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_help/output.txt +2 -3
  74. {octopize_deploy_tool-3.2.0/tests/fixtures/update_interactive_diff/expected_render_output → octopize_deploy_tool-3.4.0/tests/fixtures/install_render_output}/.env +2 -1
  75. {octopize_deploy_tool-3.2.0/tests/fixtures/update_interactive_diff/expected_render_output → octopize_deploy_tool-3.4.0/tests/fixtures/install_render_output}/docker-compose.yml +1 -2
  76. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/migrate_help/output.txt +8 -9
  77. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/render_help/output.txt +2 -4
  78. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/start_help/output.txt +1 -2
  79. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/stop_help/output.txt +1 -2
  80. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_authentik_migrate_help/output.txt +3 -3
  81. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_create_self_signed_cert_help/output.txt +2 -0
  82. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_create_users_help/output.txt +3 -3
  83. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_provision_admin_help/output.txt +3 -3
  84. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_reconcile_blueprint_help/output.txt +2 -3
  85. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/uninstall_help/output.txt +0 -2
  86. octopize_deploy_tool-3.4.0/tests/fixtures/update_help/output.txt +23 -0
  87. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.env +2 -1
  88. {octopize_deploy_tool-3.2.0/tests/fixtures/install_render_output → octopize_deploy_tool-3.4.0/tests/fixtures/update_interactive_diff/expected_apply_output}/docker-compose.yml +1 -2
  89. {octopize_deploy_tool-3.2.0/tests/fixtures/install_apply_output → octopize_deploy_tool-3.4.0/tests/fixtures/update_interactive_diff/expected_render_output}/.env +2 -1
  90. {octopize_deploy_tool-3.2.0/tests/fixtures/install_apply_output → octopize_deploy_tool-3.4.0/tests/fixtures/update_interactive_diff/expected_render_output}/docker-compose.yml +1 -2
  91. octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +102 -0
  92. octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +579 -0
  93. octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +102 -0
  94. octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +579 -0
  95. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/fakes.py +65 -9
  96. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/printers.py +37 -1
  97. octopize_deploy_tool-3.4.0/tests/integration/test_authentik_migrate_task.py +70 -0
  98. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_cli_integration.py +99 -0
  99. octopize_deploy_tool-3.4.0/tests/integration/test_client_compatibility_output.py +133 -0
  100. octopize_deploy_tool-3.4.0/tests/integration/test_legacy_app_root.py +138 -0
  101. octopize_deploy_tool-3.4.0/tests/integration/test_migrate_first_run.py +133 -0
  102. octopize_deploy_tool-3.4.0/tests/integration/test_migrate_relative_tls_paths.py +168 -0
  103. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_update_command.py +70 -0
  104. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_document_step_runner.py +7 -0
  105. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_preset_loader.py +77 -0
  106. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_email.py +86 -2
  107. octopize_deploy_tool-3.4.0/tests/unit/steps/test_prompt_text.py +107 -0
  108. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_service_urls.py +0 -3
  109. octopize_deploy_tool-3.4.0/tests/unit/test_app_root.py +104 -0
  110. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_apply_command.py +121 -4
  111. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_client.py +68 -0
  112. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_command.py +35 -5
  113. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migration.py +12 -4
  114. octopize_deploy_tool-3.4.0/tests/unit/test_client_compatibility.py +309 -0
  115. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_config_resolver.py +123 -1
  116. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_create_users.py +139 -6
  117. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_diff_command.py +249 -1
  118. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_input_gatherer.py +97 -0
  119. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_install_command.py +41 -0
  120. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_migrate_command.py +151 -27
  121. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_preflight_checks.py +84 -1
  122. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_provision_admin.py +15 -0
  123. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_render_command.py +3 -0
  124. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_rich_implementations.py +42 -0
  125. octopize_deploy_tool-3.4.0/tests/unit/test_service_versions.py +84 -0
  126. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_start_command.py +80 -3
  127. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_update_command.py +125 -0
  128. octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/templates/.env.template +0 -3
  129. octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/templates/.template-version +0 -1
  130. octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/verbosity.py +0 -47
  131. octopize_deploy_tool-3.2.0/tests/fixtures/update_help/output.txt +0 -21
  132. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +0 -101
  133. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +0 -580
  134. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +0 -101
  135. octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +0 -580
  136. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/.gitignore +0 -0
  137. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py +0 -0
  138. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
  139. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/tests/fixtures/help/output.txt +0 -0
  140. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/tests/fixtures/missing_subcommand/output.txt +0 -0
  141. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/__init__.py +0 -0
  142. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/_guards.py +0 -0
  143. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_env.py +0 -0
  144. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_login.py +0 -0
  145. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_readiness.py +0 -0
  146. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/__init__.py +0 -0
  147. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/create_self_signed_cert_command.py +0 -0
  148. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/registry.py +0 -0
  149. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/verify_command.py +0 -0
  150. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/configure_command.py +0 -0
  151. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/configure_resume_policy.py +0 -0
  152. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/deployment_markers.py +0 -0
  153. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/deployment_paths.py +0 -0
  154. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/polling.py +0 -0
  155. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/render_command.py +0 -0
  156. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/secret_files.py +0 -0
  157. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/stop_command.py +0 -0
  158. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/uninstall_command.py +0 -0
  159. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/user_config.py +0 -0
  160. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cert_generator.py +0 -0
  161. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/certificate_verifier.py +0 -0
  162. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/__init__.py +0 -0
  163. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/apply.py +0 -0
  164. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/render.py +0 -0
  165. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/control_flags.py +0 -0
  166. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
  167. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/__init__.py +0 -0
  168. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/configure_preset.py +0 -0
  169. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_state.py +0 -0
  170. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/generation.py +0 -0
  171. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/placement.py +0 -0
  172. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/validation.py +0 -0
  173. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/version_id.py +0 -0
  174. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/download_templates.py +0 -0
  175. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/environment.py +0 -0
  176. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/exceptions.py +0 -0
  177. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/__init__.py +0 -0
  178. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/cert_infra.py +0 -0
  179. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/current_version_resolver.py +0 -0
  180. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/docker_client.py +0 -0
  181. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/document_step_runner.py +0 -0
  182. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/env_file_reader.py +0 -0
  183. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem.py +0 -0
  184. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem_user_config_scaffolder.py +0 -0
  185. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/httpx2_http_client.py +0 -0
  186. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/in_memory_state_repository.py +0 -0
  187. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/noop_docker_client.py +0 -0
  188. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_defaults_source.py +0 -0
  189. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_template_provider.py +0 -0
  190. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_version_provider.py +0 -0
  191. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/system_clock.py +0 -0
  192. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/yaml_config_source.py +0 -0
  193. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/yaml_state_repository.py +0 -0
  194. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/normalizers.py +0 -0
  195. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
  196. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/public_url.py +0 -0
  197. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/renderer.py +0 -0
  198. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/resources/__init__.py +0 -0
  199. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/secret_factory.py +0 -0
  200. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/self_signed_ssl.py +0 -0
  201. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
  202. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
  203. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
  204. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
  205. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
  206. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/nginx.py +0 -0
  207. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/storage.py +0 -0
  208. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/telemetry.py +0 -0
  209. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
  210. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
  211. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
  212. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
  213. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
  214. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
  215. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
  216. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
  217. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
  218. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
  219. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
  220. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
  221. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
  222. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
  223. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
  224. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
  225. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
  226. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/tls_types.py +0 -0
  227. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
  228. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/version_compat.py +0 -0
  229. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/__init__.py +0 -0
  230. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/conftest.py +0 -0
  231. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/__init__.py +0 -0
  232. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/conftest.py +0 -0
  233. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_update_reapplies_blueprint.py +0 -0
  234. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/user_disable_revokes_api_key.py +0 -0
  235. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/__init__.py +0 -0
  236. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
  237. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
  238. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/users.csv +0 -0
  239. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_happy_path/input.yaml +0 -0
  240. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_happy_path/output.txt +0 -0
  241. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/from/.env +0 -0
  242. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/from/nginx/nginx.conf +0 -0
  243. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/output.txt +0 -0
  244. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/.env +0 -0
  245. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/docker-compose.yml +0 -0
  246. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/nginx/nginx.conf +0 -0
  247. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.env +0 -0
  248. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/admin_emails +0 -0
  249. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/authjwt_secret_key +0 -0
  250. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/clevercloud_sso_salt +0 -0
  251. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_password +0 -0
  252. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_user +0 -0
  253. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_name +0 -0
  254. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_password +0 -0
  255. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_user +0 -0
  256. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/file_jwt_secret_key +0 -0
  257. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/organization_name +0 -0
  258. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/pepper +0 -0
  259. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/smtp_password +0 -0
  260. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/storage_admin_access_key_id +0 -0
  261. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/storage_admin_secret_access_key +0 -0
  262. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/.permissions.json +0 -0
  263. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/branding/favicon.ico +0 -0
  264. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/branding/logo.png +0 -0
  265. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  266. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  267. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  268. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  269. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  270. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  271. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  272. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/translations.json +0 -0
  273. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/nginx/nginx.conf +0 -0
  274. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/.permissions.json +0 -0
  275. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/branding/favicon.ico +0 -0
  276. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/branding/logo.png +0 -0
  277. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  278. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  279. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  280. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  281. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  282. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  283. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  284. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/translations.json +0 -0
  285. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/nginx/nginx.conf +0 -0
  286. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
  287. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
  288. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/non_interactive_no_telemetry/config.yaml +0 -0
  289. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_help/output.txt +0 -0
  290. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/base_v1/generated_files/.env +0 -0
  291. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.needs_blueprint_reconcile +0 -0
  292. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.permissions.json +0 -0
  293. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/favicon.ico +0 -0
  294. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/branding/logo.png +0 -0
  295. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  296. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  297. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  298. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  299. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  300. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  301. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  302. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/authentik/translations.json +0 -0
  303. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/nginx/nginx.conf +0 -0
  304. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/.permissions.json +0 -0
  305. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/favicon.ico +0 -0
  306. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/branding/logo.png +0 -0
  307. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  308. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  309. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  310. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  311. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  312. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  313. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  314. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/authentik/translations.json +0 -0
  315. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/nginx/nginx.conf +0 -0
  316. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/base_v1/generated_files/.env +0 -0
  317. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.needs_blueprint_reconcile +0 -0
  318. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.permissions.json +0 -0
  319. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/favicon.ico +0 -0
  320. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/branding/logo.png +0 -0
  321. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  322. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_exists.html +0 -0
  323. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_account_invitation.html +0 -0
  324. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  325. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_changed.html +0 -0
  326. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/custom-templates/email_password_reset.html +0 -0
  327. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  328. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/authentik/translations.json +0 -0
  329. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/nginx/nginx.conf +0 -0
  330. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/.permissions.json +0 -0
  331. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/favicon.ico +0 -0
  332. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/branding/logo.png +0 -0
  333. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_confirmation.html +0 -0
  334. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_exists.html +0 -0
  335. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_account_invitation.html +0 -0
  336. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_forgotten_password.html +0 -0
  337. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_changed.html +0 -0
  338. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/custom-templates/email_password_reset.html +0 -0
  339. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
  340. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/authentik/translations.json +0 -0
  341. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/nginx/nginx.conf +0 -0
  342. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/verify_help/output.txt +0 -0
  343. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/__init__.py +0 -0
  344. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/fixture_dir_comparison.py +0 -0
  345. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/normalization.py +0 -0
  346. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/steps.py +0 -0
  347. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/tls_fixtures.py +0 -0
  348. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/__init__.py +0 -0
  349. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_configure_command.py +0 -0
  350. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_create_self_signed_cert_task.py +0 -0
  351. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_diff_command.py +0 -0
  352. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_install_command.py +0 -0
  353. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_migrate_without_tls_keys.py +0 -0
  354. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/test_cli_harness.py +0 -0
  355. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/__init__.py +0 -0
  356. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/conftest.py +0 -0
  357. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_docker_client.py +0 -0
  358. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_filesystem.py +0 -0
  359. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_filesystem_legacy_source.py +0 -0
  360. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_httpx2_http_client.py +0 -0
  361. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_yaml_config_source.py +0 -0
  362. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_yaml_deployment_state_repository.py +0 -0
  363. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_authentik.py +0 -0
  364. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_authentik_blueprint.py +0 -0
  365. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_database.py +0 -0
  366. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_logging.py +0 -0
  367. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_nginx.py +0 -0
  368. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_required.py +0 -0
  369. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_storage.py +0 -0
  370. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_telemetry.py +0 -0
  371. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_user.py +0 -0
  372. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_env.py +0 -0
  373. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_login.py +0 -0
  374. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_for_docker.py +0 -0
  375. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_parsers.py +0 -0
  376. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_readiness.py +0 -0
  377. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_cert_generator.py +0 -0
  378. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_certificate_verifier.py +0 -0
  379. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_cli_verify_ssl.py +0 -0
  380. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_compare_helpers.py +0 -0
  381. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_config_resolver_consistency.py +0 -0
  382. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_configure_command.py +0 -0
  383. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_create_self_signed_cert_task.py +0 -0
  384. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_deployment_item.py +0 -0
  385. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_docs_command_references.py +0 -0
  386. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_environment.py +0 -0
  387. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_generation.py +0 -0
  388. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_generic_prompt.py +0 -0
  389. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_normalizers.py +0 -0
  390. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_output_spec.py +0 -0
  391. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_placement.py +0 -0
  392. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_polling.py +0 -0
  393. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_printer.py +0 -0
  394. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_public_url.py +0 -0
  395. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_reconcile_blueprint.py +0 -0
  396. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_renderer.py +0 -0
  397. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_secret_factory.py +0 -0
  398. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_secret_files.py +0 -0
  399. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_select_authentik_migrate_parser.py +0 -0
  400. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_stop_command.py +0 -0
  401. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_task_registry.py +0 -0
  402. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_uninstall_command.py +0 -0
  403. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_user_config.py +0 -0
  404. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_validation.py +0 -0
  405. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_verify_command.py +0 -0
  406. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_version_id.py +0 -0
  407. {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.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.4.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,30 @@ 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, and must be a directory
100
+ the invoking user can read, write and enter — every command refuses a root-owned or otherwise
101
+ inaccessible root up front rather than failing part-way through. It does not have to exist yet, as
102
+ long as its parent is writable. Every command and `tasks` sub-command takes `--verbosity {1,2}`,
103
+ where `1` is essential (the default) and `2` is verbose. Every command's `--help` lists its full
104
+ option set.
103
105
 
104
106
  ### Everyday commands
105
107
 
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 |
108
+ Which of `install`, `update` and `migrate` you need is decided by what your deployment
109
+ directory already contains, so the table names that rather than a term only this tool uses:
110
+
111
+ | Command | Use when |
112
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
113
+ | `install` | Setting up a new Avatar deployment for the first time, in an empty directory |
114
+ | `update` | Upgrading to a newer Avatar release, or changing a configuration value, on a deployment that already has a `.deployment_states/` directory |
115
+ | `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 |
116
+ | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
117
+ | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
118
+ | `uninstall` | Permanently destroying the deployment and all of its data |
119
+
120
+ If you point `update` or `install` at a directory of the second shape they stop and tell you to
121
+ run `migrate` — running `install` there would generate a fresh configuration instead of adopting
122
+ the one you already have.
114
123
 
115
124
  #### `install`
116
125
 
@@ -124,7 +133,22 @@ start. It starts nothing — run `start` afterwards.
124
133
  --verbosity {1,2} 1 = essential (default), 2 = verbose
125
134
  ```
126
135
 
127
- Before doing anything, `install` looks for Avatar Docker volumes left over from an earlier
136
+ Before doing anything, `install` checks the app root itself. If it holds `.env` and `.secrets/`
137
+ at the top level and no `.deployment_states/`, that is a deployment predating the versioned
138
+ layout, and installing over it would generate a fresh configuration rather than adopt it, so the
139
+ run stops:
140
+
141
+ ```text
142
+ ✗ /app/avatar looks like a pre-versioned deployment (.env and .secrets/ at the top level, no
143
+ .deployment_states/). Import it once with:
144
+
145
+ octopize-deploy-tool migrate --app-root <new-app-root> --from-legacy /app/avatar
146
+
147
+ then use 'update' for subsequent releases.
148
+ ⚠ Install aborted during pre-flight checks.
149
+ ```
150
+
151
+ Next, `install` looks for Avatar Docker volumes left over from an earlier
128
152
  deployment. If it finds any it refuses to run, in both interactive and non-interactive mode:
129
153
 
130
154
  ```text
@@ -152,7 +176,9 @@ Re-runs the configuration from your current state, re-renders every file with th
152
176
  bundled in the installed version of this tool, shows a diff, and applies it. Values you already
153
177
  answered are carried forward, so you are not asked again. `--from-config PATH` layers a YAML file
154
178
  over the current state (see [Changing a configuration
155
- value](#changing-a-configuration-value)).
179
+ value](#changing-a-configuration-value)). It needs a `.deployment_states/` directory to read that
180
+ state from; against a directory that has `.env` and `.secrets/` at the top level instead, it stops
181
+ and points you at `migrate`.
156
182
 
157
183
  ```bash
158
184
  octopize-deploy-tool update --app-root ./app/avatar
@@ -177,6 +203,34 @@ Merge your edits into the rendered copy in `.deployment_states/<vX>/generated/`,
177
203
  `apply --version <vX>`. Anything that should survive future updates belongs in a config file, not
178
204
  in `generated_files/`.
179
205
 
206
+ Two files never come from a render, so `apply` carries them across untouched rather than
207
+ replacing them with the copy: the API key and the two JWTs that `tasks provision-admin` writes to
208
+ `generated_files/.secrets/avatar_api_key`, `avatar_access_token` and `avatar_refresh_token`.
209
+ Anything else you leave in `generated_files/` is replaced.
210
+
211
+ #### Python client compatibility
212
+
213
+ `install`, `update` and `migrate` each deploy a specific Avatar API version, and no single python
214
+ client works with every one of them — so an update can break the notebooks and scripts your users
215
+ already have. Each of those commands ends by naming the clients that work with the version it just
216
+ deployed:
217
+
218
+ ```text
219
+ Python client compatibility
220
+ This deployment now runs Avatar API 3.2.3.
221
+ Latest compatible python client: 1.28.0 (pip install 'octopize.avatar==1.28.0')
222
+ Clients older than 1.26.0 will stop working — tell your users before they next run a job.
223
+ ```
224
+
225
+ When an `update` does not move the API version at all — a tool-only bump — this collapses to a
226
+ single reassuring line instead.
227
+
228
+ The table is fetched from `COMPATIBILITY_MAPPING_URL` (see
229
+ [`config.example.yaml`](#changing-a-configuration-value); point it at your own mirror if you are
230
+ air-gapped). This is advisory output: if the URL cannot be reached the command warns once and
231
+ carries on — a deployment never fails because a version table was unavailable. To check
232
+ compatibility as a hard gate, use `verify`.
233
+
180
234
  #### `start` and `stop`
181
235
 
182
236
  `start` creates any missing Docker volumes and brings all services up. It is idempotent, so it is
@@ -200,21 +254,47 @@ octopize-deploy-tool uninstall --app-root ./app/avatar
200
254
 
201
255
  #### `migrate`
202
256
 
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.
257
+ Adopts a deployment whose directory holds `.env` and `.secrets/` at the top level and has no
258
+ `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than
259
+ 2.7.0. Point `--from-legacy` at that directory; values readable from there are carried over and
260
+ you are prompted for the rest. If `--from-legacy` is omitted the tool asks for it interactively.
207
261
 
208
262
  ```bash
209
263
  octopize-deploy-tool migrate --app-root ./app/avatar-new --from-legacy ./app/avatar-old
210
264
  octopize-deploy-tool start --app-root ./app/avatar-new
211
265
  ```
212
266
 
213
- > **Before migrating non-interactively**, make sure the legacy `.env` sets
267
+ Before applying anything, `migrate` shows you the diff between your existing directory and the new
268
+ render, led by the service versions that change:
269
+
270
+ ```text
271
+ Service versions (5 changing):
272
+ AVATAR_API_VERSION 2.55.0 → 3.2.3
273
+ AVATAR_PDFGENERATOR_VERSION 0.2.0 → (removed)
274
+ AVATAR_WEB_VERSION 0.38.0 → 0.65.1
275
+ ```
276
+
277
+ Expect a large first diff — the layout itself changes, `pdfgenerator` goes away (the report
278
+ generator is now embedded in the API), and the services jump every release at once. Conflicts
279
+ default to accepting the new render, since the legacy directory is what `migrate` replaces;
280
+ answering "keep" for a file is still honoured and still blocks the apply.
281
+
282
+ `migrate` also creates `user_config/` under the new app root, so a migrated deployment is shaped
283
+ exactly like an installed one and `update --from-config` works the same way on both.
284
+
285
+ > **Before migrating non-interactively**, make sure the legacy `.env` sets `SMTP_HOST` (or pass
286
+ > `USE_AWS_SMTP_PRESET: true`), and sets
214
287
  > `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.
288
+ > Otherwise the run falls back to a relative built-in default and keeps it with a warning that
289
+ > the path is "not usable yet" — the migration completes, but nginx will not start until a
290
+ > certificate and key exist at those paths, and `--non-interactive` offers no way to supply one.
291
+ > A path _you_ set that does not exist is a hard error instead.
292
+ >
293
+ > A relative path in that `.env` — `./tls/server.fullchain.crt` — is read relative to the
294
+ > `--from-legacy` directory it was written for, whichever directory you run `migrate` from, and is
295
+ > recorded as an absolute path in the new deployment. The exception is running the tool from the
296
+ > Docker image, where those paths belong to the host and are recorded exactly as written; see
297
+ > [Running via Docker](#running-via-docker).
218
298
 
219
299
  See [Upgrading from a pre-SSO deployment](#upgrading-from-a-pre-sso-deployment) for what happens
220
300
  to existing user accounts.
@@ -349,6 +429,9 @@ Two things the example does not tell you:
349
429
  - **`ORGANIZATION_NAME` is missing from it** and is required. A `--non-interactive` run without it
350
430
  stops at `ORGANIZATION_NAME is required but not provided in configuration file`. Add it
351
431
  yourself, as below.
432
+ - **`SMTP_HOST` is required too**, unless you set `USE_AWS_SMTP_PRESET: true` to take the AWS SES
433
+ settings Octopize provides. The example sets it; a `--non-interactive` run with neither stops at
434
+ `'SMTP_HOST' is required and no value was provided`.
352
435
  - **The TLS keys the tool reads are `NGINX_SSL_CERTIFICATE_PATH` and
353
436
  `NGINX_SSL_CERTIFICATE_KEY_PATH`.** Use those spellings.
354
437
 
@@ -515,8 +598,11 @@ Notes:
515
598
 
516
599
  Older Avatar deployments kept users in the Avatar API database. `migrate` records that they still
517
600
  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.
601
+ you**: it asks `Run it now?` and runs the import. Nothing has to be run by hand.
602
+
603
+ Add `--verbosity 2` to review before committing: the plan — every group and every user the import
604
+ would create — is printed, and a second prompt asks whether to go ahead with it. At the default
605
+ `--verbosity 1` nothing is printed beforehand, so `Run it now?` is the only question asked.
520
606
 
521
607
  If you decline, the same import is available later:
522
608
 
@@ -527,8 +613,10 @@ octopize-deploy-tool tasks authentik-migrate --from-docker --app-root ./app/avat
527
613
  `--from-docker` reads users, organizations and licenses straight from the running api container's
528
614
  database, so there is no CSV export to produce; **the extracted data is held in memory and never
529
615
  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.
616
+ prints the plan — every group and every user that would be created — and writes nothing to
617
+ Authentik (with `--from-docker` it still brings the stack up to read the database); a real run
618
+ prints that plan only under `--verbosity 2`. Users that already carry an `authentik_id` are
619
+ skipped, so the import is safe to re-run.
532
620
 
533
621
  Every run that is not a `--dry-run` does write an operation log — `migration_log.jsonl` unless
534
622
  `--log PATH` says otherwise — recording what was attempted and how it ended.
@@ -63,21 +63,30 @@ 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, and must be a directory
67
+ the invoking user can read, write and enter — every command refuses a root-owned or otherwise
68
+ inaccessible root up front rather than failing part-way through. It does not have to exist yet, as
69
+ long as its parent is writable. Every command and `tasks` sub-command takes `--verbosity {1,2}`,
70
+ where `1` is essential (the default) and `2` is verbose. Every command's `--help` lists its full
71
+ option set.
70
72
 
71
73
  ### Everyday commands
72
74
 
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 |
75
+ Which of `install`, `update` and `migrate` you need is decided by what your deployment
76
+ directory already contains, so the table names that rather than a term only this tool uses:
77
+
78
+ | Command | Use when |
79
+ | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
80
+ | `install` | Setting up a new Avatar deployment for the first time, in an empty directory |
81
+ | `update` | Upgrading to a newer Avatar release, or changing a configuration value, on a deployment that already has a `.deployment_states/` directory |
82
+ | `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 |
83
+ | `start` | Bringing a configured deployment live, or restarting it after a host reboot |
84
+ | `stop` | Suspending the stack temporarily — containers and volumes are preserved |
85
+ | `uninstall` | Permanently destroying the deployment and all of its data |
86
+
87
+ If you point `update` or `install` at a directory of the second shape they stop and tell you to
88
+ run `migrate` — running `install` there would generate a fresh configuration instead of adopting
89
+ the one you already have.
81
90
 
82
91
  #### `install`
83
92
 
@@ -91,7 +100,22 @@ start. It starts nothing — run `start` afterwards.
91
100
  --verbosity {1,2} 1 = essential (default), 2 = verbose
92
101
  ```
93
102
 
94
- Before doing anything, `install` looks for Avatar Docker volumes left over from an earlier
103
+ Before doing anything, `install` checks the app root itself. If it holds `.env` and `.secrets/`
104
+ at the top level and no `.deployment_states/`, that is a deployment predating the versioned
105
+ layout, and installing over it would generate a fresh configuration rather than adopt it, so the
106
+ run stops:
107
+
108
+ ```text
109
+ ✗ /app/avatar looks like a pre-versioned deployment (.env and .secrets/ at the top level, no
110
+ .deployment_states/). Import it once with:
111
+
112
+ octopize-deploy-tool migrate --app-root <new-app-root> --from-legacy /app/avatar
113
+
114
+ then use 'update' for subsequent releases.
115
+ ⚠ Install aborted during pre-flight checks.
116
+ ```
117
+
118
+ Next, `install` looks for Avatar Docker volumes left over from an earlier
95
119
  deployment. If it finds any it refuses to run, in both interactive and non-interactive mode:
96
120
 
97
121
  ```text
@@ -119,7 +143,9 @@ Re-runs the configuration from your current state, re-renders every file with th
119
143
  bundled in the installed version of this tool, shows a diff, and applies it. Values you already
120
144
  answered are carried forward, so you are not asked again. `--from-config PATH` layers a YAML file
121
145
  over the current state (see [Changing a configuration
122
- value](#changing-a-configuration-value)).
146
+ value](#changing-a-configuration-value)). It needs a `.deployment_states/` directory to read that
147
+ state from; against a directory that has `.env` and `.secrets/` at the top level instead, it stops
148
+ and points you at `migrate`.
123
149
 
124
150
  ```bash
125
151
  octopize-deploy-tool update --app-root ./app/avatar
@@ -144,6 +170,34 @@ Merge your edits into the rendered copy in `.deployment_states/<vX>/generated/`,
144
170
  `apply --version <vX>`. Anything that should survive future updates belongs in a config file, not
145
171
  in `generated_files/`.
146
172
 
173
+ Two files never come from a render, so `apply` carries them across untouched rather than
174
+ replacing them with the copy: the API key and the two JWTs that `tasks provision-admin` writes to
175
+ `generated_files/.secrets/avatar_api_key`, `avatar_access_token` and `avatar_refresh_token`.
176
+ Anything else you leave in `generated_files/` is replaced.
177
+
178
+ #### Python client compatibility
179
+
180
+ `install`, `update` and `migrate` each deploy a specific Avatar API version, and no single python
181
+ client works with every one of them — so an update can break the notebooks and scripts your users
182
+ already have. Each of those commands ends by naming the clients that work with the version it just
183
+ deployed:
184
+
185
+ ```text
186
+ Python client compatibility
187
+ This deployment now runs Avatar API 3.2.3.
188
+ Latest compatible python client: 1.28.0 (pip install 'octopize.avatar==1.28.0')
189
+ Clients older than 1.26.0 will stop working — tell your users before they next run a job.
190
+ ```
191
+
192
+ When an `update` does not move the API version at all — a tool-only bump — this collapses to a
193
+ single reassuring line instead.
194
+
195
+ The table is fetched from `COMPATIBILITY_MAPPING_URL` (see
196
+ [`config.example.yaml`](#changing-a-configuration-value); point it at your own mirror if you are
197
+ air-gapped). This is advisory output: if the URL cannot be reached the command warns once and
198
+ carries on — a deployment never fails because a version table was unavailable. To check
199
+ compatibility as a hard gate, use `verify`.
200
+
147
201
  #### `start` and `stop`
148
202
 
149
203
  `start` creates any missing Docker volumes and brings all services up. It is idempotent, so it is
@@ -167,21 +221,47 @@ octopize-deploy-tool uninstall --app-root ./app/avatar
167
221
 
168
222
  #### `migrate`
169
223
 
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.
224
+ Adopts a deployment whose directory holds `.env` and `.secrets/` at the top level and has no
225
+ `.deployment_states/` — anything set up by hand, or by the `deploy` command of a tool older than
226
+ 2.7.0. Point `--from-legacy` at that directory; values readable from there are carried over and
227
+ you are prompted for the rest. If `--from-legacy` is omitted the tool asks for it interactively.
174
228
 
175
229
  ```bash
176
230
  octopize-deploy-tool migrate --app-root ./app/avatar-new --from-legacy ./app/avatar-old
177
231
  octopize-deploy-tool start --app-root ./app/avatar-new
178
232
  ```
179
233
 
180
- > **Before migrating non-interactively**, make sure the legacy `.env` sets
234
+ Before applying anything, `migrate` shows you the diff between your existing directory and the new
235
+ render, led by the service versions that change:
236
+
237
+ ```text
238
+ Service versions (5 changing):
239
+ AVATAR_API_VERSION 2.55.0 → 3.2.3
240
+ AVATAR_PDFGENERATOR_VERSION 0.2.0 → (removed)
241
+ AVATAR_WEB_VERSION 0.38.0 → 0.65.1
242
+ ```
243
+
244
+ Expect a large first diff — the layout itself changes, `pdfgenerator` goes away (the report
245
+ generator is now embedded in the API), and the services jump every release at once. Conflicts
246
+ default to accepting the new render, since the legacy directory is what `migrate` replaces;
247
+ answering "keep" for a file is still honoured and still blocks the apply.
248
+
249
+ `migrate` also creates `user_config/` under the new app root, so a migrated deployment is shaped
250
+ exactly like an installed one and `update --from-config` works the same way on both.
251
+
252
+ > **Before migrating non-interactively**, make sure the legacy `.env` sets `SMTP_HOST` (or pass
253
+ > `USE_AWS_SMTP_PRESET: true`), and sets
181
254
  > `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.
255
+ > Otherwise the run falls back to a relative built-in default and keeps it with a warning that
256
+ > the path is "not usable yet" — the migration completes, but nginx will not start until a
257
+ > certificate and key exist at those paths, and `--non-interactive` offers no way to supply one.
258
+ > A path _you_ set that does not exist is a hard error instead.
259
+ >
260
+ > A relative path in that `.env` — `./tls/server.fullchain.crt` — is read relative to the
261
+ > `--from-legacy` directory it was written for, whichever directory you run `migrate` from, and is
262
+ > recorded as an absolute path in the new deployment. The exception is running the tool from the
263
+ > Docker image, where those paths belong to the host and are recorded exactly as written; see
264
+ > [Running via Docker](#running-via-docker).
185
265
 
186
266
  See [Upgrading from a pre-SSO deployment](#upgrading-from-a-pre-sso-deployment) for what happens
187
267
  to existing user accounts.
@@ -316,6 +396,9 @@ Two things the example does not tell you:
316
396
  - **`ORGANIZATION_NAME` is missing from it** and is required. A `--non-interactive` run without it
317
397
  stops at `ORGANIZATION_NAME is required but not provided in configuration file`. Add it
318
398
  yourself, as below.
399
+ - **`SMTP_HOST` is required too**, unless you set `USE_AWS_SMTP_PRESET: true` to take the AWS SES
400
+ settings Octopize provides. The example sets it; a `--non-interactive` run with neither stops at
401
+ `'SMTP_HOST' is required and no value was provided`.
319
402
  - **The TLS keys the tool reads are `NGINX_SSL_CERTIFICATE_PATH` and
320
403
  `NGINX_SSL_CERTIFICATE_KEY_PATH`.** Use those spellings.
321
404
 
@@ -482,8 +565,11 @@ Notes:
482
565
 
483
566
  Older Avatar deployments kept users in the Avatar API database. `migrate` records that they still
484
567
  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.
568
+ you**: it asks `Run it now?` and runs the import. Nothing has to be run by hand.
569
+
570
+ Add `--verbosity 2` to review before committing: the plan — every group and every user the import
571
+ would create — is printed, and a second prompt asks whether to go ahead with it. At the default
572
+ `--verbosity 1` nothing is printed beforehand, so `Run it now?` is the only question asked.
487
573
 
488
574
  If you decline, the same import is available later:
489
575
 
@@ -494,8 +580,10 @@ octopize-deploy-tool tasks authentik-migrate --from-docker --app-root ./app/avat
494
580
  `--from-docker` reads users, organizations and licenses straight from the running api container's
495
581
  database, so there is no CSV export to produce; **the extracted data is held in memory and never
496
582
  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.
583
+ prints the plan — every group and every user that would be created — and writes nothing to
584
+ Authentik (with `--from-docker` it still brings the stack up to read the database); a real run
585
+ prints that plan only under `--verbosity 2`. Users that already carry an `authentik_id` are
586
+ skipped, so the import is safe to re-run.
499
587
 
500
588
  Every run that is not a `--dry-run` does write an operation log — `migration_log.jsonl` unless
501
589
  `--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.4.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.4.0"
13
13
  __all__ = [
14
14
  "SCRIPT_VERSION",
15
15
  "ConsolePrinter",
@@ -0,0 +1,123 @@
1
+ """Validation of the deployment root supplied on the command line.
2
+
3
+ Every command reads and writes under ``--app-root``: the versioned state
4
+ documents, the rendered versions, ``generated_files/``, the secrets. A path the
5
+ invoking user cannot enter, read or write is a dead end, and the failure
6
+ otherwise surfaces deep inside a command as a bare ``PermissionError`` on some
7
+ individual file — after secrets have already been generated. Checking it at the
8
+ CLI boundary turns that into one actionable message before any work starts.
9
+
10
+ Write access is only demanded of the commands that write: a deployment root left
11
+ read-only can still be stopped, diffed and verified.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import getpass
17
+ import os
18
+ from pathlib import Path
19
+
20
+ from octopize_avatar_deploy.application._guards import CommandError
21
+
22
+ _EXAMPLE_ROOT = "./app/avatar"
23
+
24
+
25
+ class AppRootError(CommandError):
26
+ """Raised when the deployment root cannot be used by the current user."""
27
+
28
+
29
+ def validate_app_root(app_root: Path, *, require_write: bool = True) -> Path:
30
+ """Return *app_root* with ``~`` expanded, once it is usable by this user.
31
+
32
+ A root that does not exist yet is fine — commands create it — provided the
33
+ nearest existing ancestor is a directory this user can write into.
34
+
35
+ Args:
36
+ app_root: The path the operator passed to ``--app-root``.
37
+ require_write: Whether this command writes under the root.
38
+
39
+ Raises:
40
+ AppRootError: If the path (or the directory it would be created in) is
41
+ not a directory, or lacks the access this command needs.
42
+
43
+ """
44
+ expanded = app_root.expanduser()
45
+
46
+ if expanded.is_symlink() and not expanded.exists():
47
+ raise AppRootError(
48
+ f"{expanded} is a broken symlink. Point --app-root at a real directory, "
49
+ f"e.g. {_EXAMPLE_ROOT}."
50
+ )
51
+
52
+ target = expanded
53
+ while not target.exists():
54
+ parent = target.parent
55
+ if parent == target:
56
+ break
57
+ target = parent
58
+
59
+ if not target.is_dir():
60
+ raise AppRootError(
61
+ f"{target} is not a directory. Point --app-root at a directory you own, "
62
+ f"e.g. {_EXAMPLE_ROOT}."
63
+ )
64
+
65
+ missing = [
66
+ label for mode, label in _required_access(require_write) if not os.access(target, mode)
67
+ ]
68
+ if not missing:
69
+ return expanded
70
+
71
+ user = _current_user()
72
+ owner = _owner(target)
73
+ subject = (
74
+ f"Deployment root {expanded}"
75
+ if target == expanded
76
+ else f"{expanded} cannot be created: {target}"
77
+ )
78
+ raise AppRootError(
79
+ f"{subject} is not {_join(missing)} by user {user!r} (owner: {owner!r}).\n"
80
+ f"Point --app-root at a directory your user owns, e.g. {_EXAMPLE_ROOT}, or fix "
81
+ f"this one:\n {_remedy(target, expanded, user, owner)}"
82
+ )
83
+
84
+
85
+ def _required_access(require_write: bool) -> list[tuple[int, str]]:
86
+ """The access modes the command needs, each paired with how to name it."""
87
+ if require_write:
88
+ return [(os.R_OK, "readable"), (os.W_OK, "writable"), (os.X_OK, "traversable")]
89
+ return [(os.R_OK, "readable"), (os.X_OK, "traversable")]
90
+
91
+
92
+ def _remedy(target: Path, expanded: Path, user: str, owner: str) -> str:
93
+ """The one command that gets this user the access they are missing."""
94
+ if owner == user:
95
+ # Already theirs, so the mode bits are what stand in the way.
96
+ return f"chmod u+rwx {target}"
97
+ if target == expanded:
98
+ return f"sudo chown -R {user} {target}"
99
+ return f"sudo install -d -o {user} {expanded}"
100
+
101
+
102
+ def _join(labels: list[str]) -> str:
103
+ if len(labels) == 1:
104
+ return labels[0]
105
+ return f"{', '.join(labels[:-1])} or {labels[-1]}"
106
+
107
+
108
+ def _current_user() -> str:
109
+ try:
110
+ return getpass.getuser()
111
+ except OSError:
112
+ return f"uid {os.getuid()}"
113
+
114
+
115
+ def _owner(path: Path) -> str:
116
+ try:
117
+ return path.owner()
118
+ except (KeyError, NotImplementedError, OSError):
119
+ pass
120
+ try:
121
+ return f"uid {path.stat().st_uid}"
122
+ except OSError:
123
+ return "unknown"
@@ -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}