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.
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/PKG-INFO +116 -28
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/README.md +114 -26
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/pyproject.toml +1 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/__init__.py +1 -1
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/app_root.py +123 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/apply_command.py +25 -10
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/checks.py +69 -0
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/client_compatibility_report.py +157 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/install_command.py +13 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/migrate_command.py +91 -53
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/subcommand_ports.py +32 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/authentik_migrate.py +73 -30
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/create_users.py +64 -14
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/provision_admin.py +21 -15
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/reconcile_blueprint.py +2 -9
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/update_command.py +89 -7
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/diff_command.py +123 -7
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/legacy_layout.py +128 -0
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/application/operator_owned_files.py +99 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/ports.py +8 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/start_command.py +32 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/authentik_migration.py +12 -3
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/authentik_user_types.py +23 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/__init__.py +23 -6
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/_shared.py +2 -19
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/configure.py +2 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/diff.py +2 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/install.py +14 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/migrate.py +13 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/start.py +2 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/stop.py +4 -17
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/tasks.py +2 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/uninstall.py +4 -17
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/update.py +10 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/verify.py +6 -13
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli_dependencies.py +35 -10
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli_test_harness.py +10 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/config_resolver.py +29 -7
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/defaults.yaml +3 -3
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/domain/client_compatibility.py +109 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_item.py +6 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_item_registry.py +2 -0
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/domain/service_versions.py +96 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem_legacy_source.py +8 -4
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/infra/offline_http_client.py +73 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/preset_loader.py +44 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/input_gatherer.py +114 -10
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/printer.py +25 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/resources/config.example.yaml +11 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/base.py +13 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/email.py +9 -4
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/required.py +2 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -9
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/templates/.env.template +3 -0
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/templates/.template-version +1 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +0 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +1 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +1 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/url_contract.py +0 -6
- octopize_deploy_tool-3.4.0/src/octopize_avatar_deploy/verbosity.py +37 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/TESTING.md +2 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_lifecycle.py +32 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_migrate_start_provision_verify.py +6 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/apply_help/output.txt +1 -3
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_help/output.txt +1 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_help/output.txt +1 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/help/output.txt +4 -3
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_help/output.txt +2 -3
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/migrate_help/output.txt +8 -9
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/render_help/output.txt +2 -4
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/start_help/output.txt +1 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/stop_help/output.txt +1 -2
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_authentik_migrate_help/output.txt +3 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_create_self_signed_cert_help/output.txt +2 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_create_users_help/output.txt +3 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_provision_admin_help/output.txt +3 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_reconcile_blueprint_help/output.txt +2 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/uninstall_help/output.txt +0 -2
- octopize_deploy_tool-3.4.0/tests/fixtures/update_help/output.txt +23 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.env +2 -1
- {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
- {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
- {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
- octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +102 -0
- octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +579 -0
- octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +102 -0
- octopize_deploy_tool-3.4.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +579 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/fakes.py +65 -9
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/printers.py +37 -1
- octopize_deploy_tool-3.4.0/tests/integration/test_authentik_migrate_task.py +70 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_cli_integration.py +99 -0
- octopize_deploy_tool-3.4.0/tests/integration/test_client_compatibility_output.py +133 -0
- octopize_deploy_tool-3.4.0/tests/integration/test_legacy_app_root.py +138 -0
- octopize_deploy_tool-3.4.0/tests/integration/test_migrate_first_run.py +133 -0
- octopize_deploy_tool-3.4.0/tests/integration/test_migrate_relative_tls_paths.py +168 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_update_command.py +70 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_document_step_runner.py +7 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_preset_loader.py +77 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_email.py +86 -2
- octopize_deploy_tool-3.4.0/tests/unit/steps/test_prompt_text.py +107 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_service_urls.py +0 -3
- octopize_deploy_tool-3.4.0/tests/unit/test_app_root.py +104 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_apply_command.py +121 -4
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_client.py +68 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_command.py +35 -5
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migration.py +12 -4
- octopize_deploy_tool-3.4.0/tests/unit/test_client_compatibility.py +309 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_config_resolver.py +123 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_create_users.py +139 -6
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_diff_command.py +249 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_input_gatherer.py +97 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_install_command.py +41 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_migrate_command.py +151 -27
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_preflight_checks.py +84 -1
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_provision_admin.py +15 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_render_command.py +3 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_rich_implementations.py +42 -0
- octopize_deploy_tool-3.4.0/tests/unit/test_service_versions.py +84 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_start_command.py +80 -3
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_update_command.py +125 -0
- octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/templates/.env.template +0 -3
- octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/templates/.template-version +0 -1
- octopize_deploy_tool-3.2.0/src/octopize_avatar_deploy/verbosity.py +0 -47
- octopize_deploy_tool-3.2.0/tests/fixtures/update_help/output.txt +0 -21
- octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/.env +0 -101
- octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_apply_output/docker-compose.yml +0 -580
- octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_render_output/.env +0 -101
- octopize_deploy_tool-3.2.0/tests/fixtures/update_noninteractive_clean/expected_render_output/docker-compose.yml +0 -580
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/.gitignore +0 -0
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/tests/fixtures/help/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/infra/deployment/deployment-tool/tests/fixtures/missing_subcommand/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/_guards.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_env.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_login.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/authentik_readiness.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/__init__.py +0 -0
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/tasks/registry.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/commands/verify_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/configure_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/configure_resume_policy.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/deployment_markers.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/deployment_paths.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/polling.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/render_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/secret_files.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/stop_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/uninstall_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/application/user_config.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cert_generator.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/certificate_verifier.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/apply.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/cli/handlers/render.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/control_flags.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/configure_preset.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/deployment_state.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/generation.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/placement.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/validation.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/domain/version_id.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/download_templates.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/environment.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/exceptions.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/cert_infra.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/current_version_resolver.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/docker_client.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/document_step_runner.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/env_file_reader.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/filesystem_user_config_scaffolder.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/httpx2_http_client.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/in_memory_state_repository.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/noop_docker_client.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_defaults_source.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_template_provider.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/package_version_provider.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/system_clock.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/yaml_config_source.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/infra/yaml_state_repository.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/normalizers.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/public_url.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/renderer.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/resources/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/secret_factory.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/self_signed_ssl.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/nginx.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/storage.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/telemetry.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/template_provisioning.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/tls_types.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/src/octopize_avatar_deploy/version_compat.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/conftest.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/conftest.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/test_update_reapplies_blueprint.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/e2e/user_disable_revokes_api_key.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/authentik_migration/users.csv +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_happy_path/input.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/configure_happy_path/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/from/.env +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/from/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/.env +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/docker-compose.yml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/diff_integration/to/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.env +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/admin_emails +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/authjwt_secret_key +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/clevercloud_sso_salt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_password +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_admin_user +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_name +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_password +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/db_user +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/file_jwt_secret_key +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/organization_name +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/pepper +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/e2e/legacy_deployment/.secrets/smtp_password +0 -0
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/.permissions.json +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/branding/logo.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/authentik/translations.json +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_apply_output/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/.permissions.json +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/branding/logo.png +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/authentik/translations.json +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/install_render_output/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/non_interactive_no_telemetry/config.yaml +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/tasks_help/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/base_v1/generated_files/.env +0 -0
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_apply_output/.permissions.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_interactive_diff/expected_render_output/.permissions.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/base_v1/generated_files/.env +0 -0
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_apply_output/.permissions.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/update_noninteractive_clean/expected_render_output/.permissions.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/fixtures/verify_help/output.txt +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/fixture_dir_comparison.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/normalization.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/steps.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/helpers/tls_fixtures.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_configure_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_create_self_signed_cert_task.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_diff_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_install_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/integration/test_migrate_without_tls_keys.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/test_cli_harness.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/__init__.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/conftest.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_docker_client.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_filesystem.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_filesystem_legacy_source.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_httpx2_http_client.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_yaml_config_source.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/infra/test_yaml_deployment_state_repository.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_authentik.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_authentik_blueprint.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_database.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_logging.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_nginx.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_required.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_storage.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_telemetry.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/steps/test_user.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_env.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_login.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_for_docker.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_migrate_parsers.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_authentik_readiness.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_cert_generator.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_certificate_verifier.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_cli_verify_ssl.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_compare_helpers.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_config_resolver_consistency.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_configure_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_create_self_signed_cert_task.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_deployment_item.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_docs_command_references.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_environment.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_generation.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_generic_prompt.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_normalizers.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_output_spec.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_placement.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_polling.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_printer.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_public_url.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_reconcile_blueprint.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_renderer.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_secret_factory.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_secret_files.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_select_authentik_migrate_parser.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_stop_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_task_registry.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_uninstall_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_user_config.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_validation.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_verify_command.py +0 -0
- {octopize_deploy_tool-3.2.0 → octopize_deploy_tool-3.4.0}/tests/unit/test_version_id.py +0 -0
- {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.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: octopize.deploy_tool
|
|
3
|
-
Version: 3.
|
|
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
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
| `
|
|
112
|
-
| `
|
|
113
|
-
| `migrate` |
|
|
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`
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
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
|
|
216
|
-
>
|
|
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
|
|
519
|
-
|
|
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
|
-
|
|
531
|
-
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
|
77
|
-
|
|
|
78
|
-
| `
|
|
79
|
-
| `
|
|
80
|
-
| `migrate` |
|
|
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`
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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
|
|
183
|
-
>
|
|
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
|
|
486
|
-
|
|
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
|
-
|
|
498
|
-
|
|
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.
|
|
@@ -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
|
|
79
|
-
|
|
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.
|
|
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
|
-
|
|
107
|
-
6.
|
|
108
|
-
7.
|
|
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.
|
|
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
|
-
#
|
|
156
|
+
# 5. Update currently_deployed symlink.
|
|
144
157
|
self._symlink_updater.update_symlink(paths.currently_deployed_symlink, paths.version_dir)
|
|
145
158
|
|
|
146
|
-
#
|
|
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}
|