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