octopize.deploy_tool 2.4.0__tar.gz → 2.6.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-2.4.0 → octopize_deploy_tool-2.6.0}/.gitignore +3 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/PKG-INFO +1 -2
- octopize_deploy_tool-2.6.0/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py +20 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/pyproject.toml +2 -19
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/__init__.py +1 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/authentik_migration.py +6 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/cli.py +31 -31
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/cli_test_harness.py +3 -6
- octopize_deploy_tool-2.6.0/src/octopize_avatar_deploy/configurator.py +197 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/configure.py +148 -290
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/defaults.yaml +1 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/download_templates.py +11 -11
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/generate_env_paths.py +2 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/input_gatherer.py +15 -15
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/printer.py +1 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/public_url.py +3 -1
- octopize_deploy_tool-2.6.0/src/octopize_avatar_deploy/renderer.py +198 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/state_manager.py +91 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/base.py +7 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/component_selection.py +1 -4
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/email.py +0 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/nginx.py +171 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/storage.py +0 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/target_environment.py +4 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/telemetry.py +13 -4
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/template_provisioning.py +4 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_api.template +4 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/docker-compose.yml.template +0 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/version_compat.py +21 -21
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/conftest.py +72 -19
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/__init__.py +2 -2
- {octopize_deploy_tool-2.4.0/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.6.0/tests/fixtures/basic_deployment}/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0/tests/fixtures/config_round_trip_second → octopize_deploy_tool-2.6.0/tests/fixtures/basic_deployment}/expected/.env +8 -8
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/docker-compose.yml +0 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/input.yaml +1 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/.env +8 -8
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/docker-compose.yml +0 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/input.yaml +1 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/.env +8 -8
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/deployment-config.yaml +6 -5
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/docker-compose.yml +0 -6
- {octopize_deploy_tool-2.4.0/tests/fixtures/basic_deployment → octopize_deploy_tool-2.6.0/tests/fixtures/config_round_trip_second}/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0/tests/fixtures/basic_deployment → octopize_deploy_tool-2.6.0/tests/fixtures/config_round_trip_second}/expected/.env +8 -8
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/docker-compose.yml +0 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/.deployment-state.yaml +37 -11
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/.env +7 -7
- octopize_deploy_tool-2.6.0/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +604 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_port_config/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/.env +7 -7
- octopize_deploy_tool-2.6.0/tests/fixtures/no_telemetry/expected/docker-compose.yml +604 -0
- octopize_deploy_tool-2.6.0/tests/fixtures/no_telemetry/output.txt +122 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/.deployment-state.yaml +31 -5
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/.env +7 -7
- octopize_deploy_tool-2.6.0/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +604 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_incomplete_config/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_partial_config/output.txt +30 -7
- octopize_deploy_tool-2.6.0/tests/fixtures/output_dir_nested/output.txt +122 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/prompt_help/input.yaml +1 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/prompt_help/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/first_run/output.txt +14 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/input_first_run.yaml +3 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/input_resume.yaml +1 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/resume_interrupted/resume/output.txt +35 -12
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_interactive/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/input.yaml +1 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/type_mismatch_config/output.txt +30 -7
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/integration/test_cli_integration.py +35 -6
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/integration/test_generate_env.py +6 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_base.py +2 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_component_selection.py +1 -2
- octopize_deploy_tool-2.6.0/tests/steps/test_nginx.py +523 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_state_manager.py +142 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_storage.py +0 -3
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_target_environment.py +9 -3
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_telemetry.py +15 -1
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_authentik_client.py +4 -2
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_components.py +1 -2
- octopize_deploy_tool-2.6.0/tests/unit/test_configurator.py +318 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_deployment_configurator.py +34 -62
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_input_gatherer.py +3 -1
- octopize_deploy_tool-2.6.0/tests/unit/test_renderer.py +280 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_rich_implementations.py +7 -15
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_step_filtering.py +0 -4
- octopize_deploy_tool-2.4.0/tests/fixtures/dev_mode_deployment/expected/docker-compose.yml +0 -610
- octopize_deploy_tool-2.4.0/tests/fixtures/no_telemetry/expected/docker-compose.yml +0 -610
- octopize_deploy_tool-2.4.0/tests/fixtures/no_telemetry/output.txt +0 -99
- octopize_deploy_tool-2.4.0/tests/fixtures/non_interactive_complete/expected/docker-compose.yml +0 -610
- octopize_deploy_tool-2.4.0/tests/fixtures/output_dir_nested/output.txt +0 -99
- octopize_deploy_tool-2.4.0/tests/steps/test_nginx.py +0 -131
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/README.md +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/components.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/deployment_mode.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/generate_env.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/output_spec.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/__init__.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/api_local_source.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/authentik.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/database.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/local_source.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/logging.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/required.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/service_urls.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/steps/user.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/.env.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/.template-version +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_infra.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/_env_fragment_web.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/api.env.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/compose.override.yaml.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/nginx.conf.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/python_client.env.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/templates/web.env.template +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/topology_urls.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/src/octopize_avatar_deploy/url_contract.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/TESTING.md +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/__init__.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/licenses.csv +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/organizations.csv +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/authentik_migration/users.csv +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/basic_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/cloud_storage/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_not_found/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_first/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/config_round_trip_second/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/deploy_help/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/compose.override.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-.npmrc +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-repo/services/api/main.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/expected/test-avatar-website/package.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/dev_mode_deployment/input.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/generate_env_help/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/generate_env_output_dir_error/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/help/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_port_config/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_url_config/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/invalid_url_config/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/malformed_yaml/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/malformed_yaml/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/missing_subcommand/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/no_telemetry/input.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/favicon.ico +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/branding/logo.png +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_confirmation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_exists.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_account_invitation.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_forgotten_password.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_changed.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/custom-templates/email_password_reset.html +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/octopize-avatar-blueprint.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/authentik/translations.json +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_complete/expected/nginx/nginx.conf +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_incomplete_config/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_no_config/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/non_interactive_partial_config/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/output_dir_permission_denied/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/save_config_with_existing/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/template_from_local_verbose/output.txt +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/fixtures/type_mismatch_config/config.yaml +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/integration/__init__.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_api_local_source.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_authentik.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_authentik_blueprint.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_database.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_email.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_local_source.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_logging.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_required.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_service_urls.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_user.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/steps/test_user_validation.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/test_cli_harness.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_authentik_migration.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_compare_helpers.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_deployment_runner.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_generate_env_cli.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_generic_prompt.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_output_spec.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_printer.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_public_url.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/tests/unit/test_topology_urls.py +0 -0
- {octopize_deploy_tool-2.4.0 → octopize_deploy_tool-2.6.0}/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.
|
|
3
|
+
Version: 2.6.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
|
|
@@ -26,7 +26,6 @@ Requires-Dist: rich>=13.0.0
|
|
|
26
26
|
Provides-Extra: dev
|
|
27
27
|
Requires-Dist: pyright>=1.1.402; extra == 'dev'
|
|
28
28
|
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
29
|
-
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
30
29
|
Description-Content-Type: text/markdown
|
|
31
30
|
|
|
32
31
|
# Octopize Avatar Deployment Tool
|
octopize_deploy_tool-2.6.0/infra/deployment/deployment-tool/src/octopize_avatar_deploy/steps/user.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""User authentication configuration step."""
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from .base import DeploymentStep
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class UserStep(DeploymentStep):
|
|
9
|
+
"""Handles user authentication configuration."""
|
|
10
|
+
|
|
11
|
+
name = "user"
|
|
12
|
+
description = "Configure user authentication settings"
|
|
13
|
+
|
|
14
|
+
def collect_config(self) -> dict[str, Any]:
|
|
15
|
+
"""Collect user authentication configuration."""
|
|
16
|
+
return {}
|
|
17
|
+
|
|
18
|
+
def generate_secrets(self) -> dict[str, str]:
|
|
19
|
+
"""Generate user-related secrets."""
|
|
20
|
+
return {}
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "octopize.deploy_tool"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.6.0"
|
|
8
8
|
description = "Deployment configuration tool for Octopize Avatar platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -36,7 +36,6 @@ dependencies = [
|
|
|
36
36
|
dev = [
|
|
37
37
|
"pytest>=7.0",
|
|
38
38
|
"pyright>=1.1.402",
|
|
39
|
-
"ruff>=0.1.0",
|
|
40
39
|
]
|
|
41
40
|
|
|
42
41
|
[project.scripts]
|
|
@@ -98,23 +97,7 @@ exclude_lines = [
|
|
|
98
97
|
]
|
|
99
98
|
|
|
100
99
|
[tool.ruff]
|
|
101
|
-
|
|
102
|
-
line-length = 100
|
|
103
|
-
|
|
104
|
-
[tool.ruff.lint]
|
|
105
|
-
extend-select = [
|
|
106
|
-
"E", # pycodestyle errors
|
|
107
|
-
"W", # pycodestyle warnings
|
|
108
|
-
"F", # pyflakes
|
|
109
|
-
"I", # isort
|
|
110
|
-
"B", # flake8-bugbear
|
|
111
|
-
"C4", # flake8-comprehensions
|
|
112
|
-
"UP", # pyupgrade
|
|
113
|
-
]
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
[tool.ruff.lint.isort]
|
|
117
|
-
known-first-party = ["octopize_avatar_deploy"]
|
|
100
|
+
extend = "../../../ruff.toml"
|
|
118
101
|
|
|
119
102
|
[dependency-groups]
|
|
120
103
|
dev = [
|
|
@@ -327,7 +327,7 @@ class AuthentikClient:
|
|
|
327
327
|
timestamp = datetime.now(UTC).isoformat()
|
|
328
328
|
try:
|
|
329
329
|
if dry_run:
|
|
330
|
-
print(f"[DRY RUN] {op}")
|
|
330
|
+
print(f"[DRY RUN] {op}") # noqa: T201
|
|
331
331
|
continue
|
|
332
332
|
|
|
333
333
|
if op.op_type == OperationType.GROUP_CREATE:
|
|
@@ -336,7 +336,7 @@ class AuthentikClient:
|
|
|
336
336
|
attributes=op.data["attributes"],
|
|
337
337
|
)
|
|
338
338
|
counts["groups_created"] += 1
|
|
339
|
-
print(f"✓ Created group: {op.data['name']}")
|
|
339
|
+
print(f"✓ Created group: {op.data['name']}") # noqa: T201
|
|
340
340
|
|
|
341
341
|
elif op.op_type == OperationType.USER_CREATE:
|
|
342
342
|
self.create_user(
|
|
@@ -346,7 +346,7 @@ class AuthentikClient:
|
|
|
346
346
|
attributes=op.data["attributes"],
|
|
347
347
|
)
|
|
348
348
|
counts["users_created"] += 1
|
|
349
|
-
print(f"✓ Created user: {op.data['username']}")
|
|
349
|
+
print(f"✓ Created user: {op.data['username']}") # noqa: T201
|
|
350
350
|
|
|
351
351
|
elif op.op_type == OperationType.GROUP_ASSIGN:
|
|
352
352
|
self.assign_user_to_group(
|
|
@@ -354,7 +354,7 @@ class AuthentikClient:
|
|
|
354
354
|
username=op.data["username"],
|
|
355
355
|
)
|
|
356
356
|
counts["assignments_made"] += 1
|
|
357
|
-
print(f"✓ Assigned {op.data['username']} to {op.data['group_name']}")
|
|
357
|
+
print(f"✓ Assigned {op.data['username']} to {op.data['group_name']}") # noqa: T201
|
|
358
358
|
|
|
359
359
|
if log_file:
|
|
360
360
|
entry = LogEntry(
|
|
@@ -367,9 +367,9 @@ class AuthentikClient:
|
|
|
367
367
|
log_file.write(json.dumps(entry.to_dict()) + "\n")
|
|
368
368
|
log_file.flush()
|
|
369
369
|
|
|
370
|
-
except Exception as e:
|
|
370
|
+
except Exception as e: # noqa: BLE001
|
|
371
371
|
counts["errors"] += 1
|
|
372
|
-
print(f"✗ Error processing {op}: {e}", file=sys.stderr)
|
|
372
|
+
print(f"✗ Error processing {op}: {e}", file=sys.stderr) # noqa: T201
|
|
373
373
|
if log_file:
|
|
374
374
|
entry = LogEntry(
|
|
375
375
|
op_type=op.op_type.value,
|
|
@@ -78,7 +78,7 @@ def _run_deploy(
|
|
|
78
78
|
input_gatherer: InputGatherer | None,
|
|
79
79
|
) -> None:
|
|
80
80
|
"""Run the deploy subcommand."""
|
|
81
|
-
from octopize_avatar_deploy.configure import DeploymentRunner
|
|
81
|
+
from octopize_avatar_deploy.configure import DeploymentRunner # noqa: PLC0415
|
|
82
82
|
|
|
83
83
|
mode = DeploymentMode(getattr(args, "mode", "production"))
|
|
84
84
|
runner = DeploymentRunner(
|
|
@@ -102,7 +102,7 @@ def _run_deploy(
|
|
|
102
102
|
|
|
103
103
|
def _parse_component_output_path(value: str) -> tuple[str, Path]:
|
|
104
104
|
"""Parse a COMPONENT=PATH output override from the CLI."""
|
|
105
|
-
from octopize_avatar_deploy.components import get_component
|
|
105
|
+
from octopize_avatar_deploy.components import get_component # noqa: PLC0415
|
|
106
106
|
|
|
107
107
|
component, separator, raw_path = value.partition("=")
|
|
108
108
|
if not separator or not component or not raw_path:
|
|
@@ -118,7 +118,7 @@ def _parse_component_output_path(value: str) -> tuple[str, Path]:
|
|
|
118
118
|
|
|
119
119
|
def _add_generate_env_cli_args(parser: argparse.ArgumentParser) -> None:
|
|
120
120
|
"""Add CLI arguments for the generate-env subcommand."""
|
|
121
|
-
from octopize_avatar_deploy.components import get_all_components
|
|
121
|
+
from octopize_avatar_deploy.components import get_all_components # noqa: PLC0415
|
|
122
122
|
|
|
123
123
|
component_names = ", ".join(get_all_components().keys())
|
|
124
124
|
|
|
@@ -189,8 +189,8 @@ def _run_generate_env(
|
|
|
189
189
|
input_gatherer: InputGatherer | None,
|
|
190
190
|
) -> None:
|
|
191
191
|
"""Run the generate-env subcommand."""
|
|
192
|
-
from octopize_avatar_deploy.components import get_all_components
|
|
193
|
-
from octopize_avatar_deploy.generate_env import GenerateEnvRunner
|
|
192
|
+
from octopize_avatar_deploy.components import get_all_components # noqa: PLC0415
|
|
193
|
+
from octopize_avatar_deploy.generate_env import GenerateEnvRunner # noqa: PLC0415
|
|
194
194
|
|
|
195
195
|
components = args.components or list(get_all_components().keys())
|
|
196
196
|
output_path_overrides = {
|
|
@@ -265,7 +265,7 @@ def _add_authentik_migrate_cli_args(parser: argparse.ArgumentParser) -> None:
|
|
|
265
265
|
|
|
266
266
|
def _run_authentik_migrate(args: argparse.Namespace) -> None:
|
|
267
267
|
"""Run the authentik-migrate subcommand."""
|
|
268
|
-
from octopize_avatar_deploy.authentik_migration import (
|
|
268
|
+
from octopize_avatar_deploy.authentik_migration import ( # noqa: PLC0415
|
|
269
269
|
AuthentikClient,
|
|
270
270
|
MigrationParser,
|
|
271
271
|
OperationType,
|
|
@@ -273,67 +273,67 @@ def _run_authentik_migrate(args: argparse.Namespace) -> None:
|
|
|
273
273
|
)
|
|
274
274
|
|
|
275
275
|
if args.failed_only and not args.from_log:
|
|
276
|
-
print("⚠️ --failed-only requires --from-log", file=sys.stderr)
|
|
276
|
+
print("⚠️ --failed-only requires --from-log", file=sys.stderr) # noqa: T201
|
|
277
277
|
sys.exit(1)
|
|
278
278
|
|
|
279
279
|
if args.from_log:
|
|
280
|
-
print(f"📂 Loading operations from log: {args.from_log}")
|
|
280
|
+
print(f"📂 Loading operations from log: {args.from_log}") # noqa: T201
|
|
281
281
|
if args.failed_only:
|
|
282
|
-
print("🔁 Replaying failed operations only")
|
|
282
|
+
print("🔁 Replaying failed operations only") # noqa: T201
|
|
283
283
|
operations = load_operations_from_log(args.from_log, failed_only=args.failed_only)
|
|
284
|
-
print(f"✓ Loaded {len(operations)} operations")
|
|
284
|
+
print(f"✓ Loaded {len(operations)} operations") # noqa: T201
|
|
285
285
|
# Default the output log to <stem>_retry.<ext> to avoid overwriting the source log
|
|
286
286
|
if args.log == "migration_log.jsonl":
|
|
287
287
|
p = Path(args.from_log)
|
|
288
288
|
args.log = str(p.with_stem(p.stem + "_retry"))
|
|
289
289
|
else:
|
|
290
290
|
if not args.users or not args.orgs or not args.licenses:
|
|
291
|
-
print(
|
|
291
|
+
print( # noqa: T201
|
|
292
292
|
"⚠️ --users, --orgs, and --licenses are required when not using --from-log",
|
|
293
293
|
file=sys.stderr,
|
|
294
294
|
)
|
|
295
295
|
sys.exit(1)
|
|
296
296
|
|
|
297
|
-
print("📖 Parsing CSV files...")
|
|
297
|
+
print("📖 Parsing CSV files...") # noqa: T201
|
|
298
298
|
migration_parser = MigrationParser(
|
|
299
299
|
users_csv=args.users,
|
|
300
300
|
orgs_csv=args.orgs,
|
|
301
301
|
licenses_csv=args.licenses,
|
|
302
302
|
)
|
|
303
303
|
operations = migration_parser.parse()
|
|
304
|
-
print(f"✓ Parsed {len(operations)} operations")
|
|
304
|
+
print(f"✓ Parsed {len(operations)} operations") # noqa: T201
|
|
305
305
|
|
|
306
306
|
group_creates = sum(1 for op in operations if op.op_type == OperationType.GROUP_CREATE)
|
|
307
307
|
user_creates = sum(1 for op in operations if op.op_type == OperationType.USER_CREATE)
|
|
308
308
|
assignments = sum(1 for op in operations if op.op_type == OperationType.GROUP_ASSIGN)
|
|
309
|
-
print(
|
|
309
|
+
print( # noqa: T201
|
|
310
310
|
f" - {group_creates} groups to create\n"
|
|
311
311
|
f" - {user_creates} users to create\n"
|
|
312
312
|
f" - {assignments} group assignments",
|
|
313
313
|
)
|
|
314
314
|
|
|
315
315
|
if args.dry_run:
|
|
316
|
-
print("\n🔍 DRY RUN MODE - Operations:")
|
|
316
|
+
print("\n🔍 DRY RUN MODE - Operations:") # noqa: T201
|
|
317
317
|
for op in operations:
|
|
318
|
-
print(f" {op}")
|
|
318
|
+
print(f" {op}") # noqa: T201
|
|
319
319
|
return
|
|
320
320
|
|
|
321
321
|
if not args.authentik_url or not args.authentik_token:
|
|
322
|
-
print("\n⚠️ For actual execution, provide --authentik-url and --authentik-token")
|
|
323
|
-
print("Use --dry-run to see operations without executing")
|
|
322
|
+
print("\n⚠️ For actual execution, provide --authentik-url and --authentik-token") # noqa: T201
|
|
323
|
+
print("Use --dry-run to see operations without executing") # noqa: T201
|
|
324
324
|
sys.exit(1)
|
|
325
325
|
|
|
326
|
-
print(f"\n🚀 Executing operations against {args.authentik_url}...")
|
|
327
|
-
print(f"📝 Logging to: {args.log}")
|
|
326
|
+
print(f"\n🚀 Executing operations against {args.authentik_url}...") # noqa: T201
|
|
327
|
+
print(f"📝 Logging to: {args.log}") # noqa: T201
|
|
328
328
|
with AuthentikClient(base_url=args.authentik_url, token=args.authentik_token) as client:
|
|
329
329
|
counts = client.execute_operations(operations, log_path=args.log)
|
|
330
330
|
|
|
331
|
-
print("\n📊 Migration Summary:")
|
|
332
|
-
print(f" ✓ Groups created: {counts['groups_created']}")
|
|
333
|
-
print(f" ✓ Users created: {counts['users_created']}")
|
|
334
|
-
print(f" ✓ Assignments made: {counts['assignments_made']}")
|
|
331
|
+
print("\n📊 Migration Summary:") # noqa: T201
|
|
332
|
+
print(f" ✓ Groups created: {counts['groups_created']}") # noqa: T201
|
|
333
|
+
print(f" ✓ Users created: {counts['users_created']}") # noqa: T201
|
|
334
|
+
print(f" ✓ Assignments made: {counts['assignments_made']}") # noqa: T201
|
|
335
335
|
if counts["errors"] > 0:
|
|
336
|
-
print(f" ✗ Errors: {counts['errors']}")
|
|
336
|
+
print(f" ✗ Errors: {counts['errors']}") # noqa: T201
|
|
337
337
|
sys.exit(1)
|
|
338
338
|
|
|
339
339
|
|
|
@@ -391,7 +391,7 @@ def main() -> None:
|
|
|
391
391
|
test_printer: Printer | None = None
|
|
392
392
|
test_input_gatherer: InputGatherer | None = None
|
|
393
393
|
if os.environ.get("AVATAR_DEPLOY_TEST_MODE") == "1":
|
|
394
|
-
from octopize_avatar_deploy.cli_test_harness import (
|
|
394
|
+
from octopize_avatar_deploy.cli_test_harness import ( # noqa: PLC0415
|
|
395
395
|
get_test_input_gatherer,
|
|
396
396
|
get_test_printer,
|
|
397
397
|
)
|
|
@@ -409,14 +409,14 @@ def main() -> None:
|
|
|
409
409
|
else:
|
|
410
410
|
raise RuntimeError(f"Unsupported command: {args.command}")
|
|
411
411
|
except KeyboardInterrupt:
|
|
412
|
-
print("\n\nConfiguration cancelled by user.")
|
|
412
|
+
print("\n\nConfiguration cancelled by user.") # noqa: T201
|
|
413
413
|
sys.exit(1)
|
|
414
414
|
except RuntimeError as e:
|
|
415
|
-
print(f"\n✗ Error: {e}")
|
|
415
|
+
print(f"\n✗ Error: {e}") # noqa: T201
|
|
416
416
|
sys.exit(1)
|
|
417
|
-
except Exception as e:
|
|
418
|
-
print(f"\n✗ Error: {e}")
|
|
419
|
-
import traceback
|
|
417
|
+
except Exception as e: # noqa: BLE001
|
|
418
|
+
print(f"\n✗ Error: {e}") # noqa: T201
|
|
419
|
+
import traceback # noqa: PLC0415
|
|
420
420
|
|
|
421
421
|
traceback.print_exc()
|
|
422
422
|
sys.exit(1)
|
|
@@ -6,6 +6,7 @@ Allows testing the CLI with pre-configured responses instead of manual input.
|
|
|
6
6
|
This enables automated end-to-end testing of the entire CLI workflow.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
+
import json
|
|
9
10
|
import os
|
|
10
11
|
import sys
|
|
11
12
|
from pathlib import Path
|
|
@@ -118,23 +119,19 @@ class CLITestHarness:
|
|
|
118
119
|
return e.code
|
|
119
120
|
# If it's a string or other type, return 1
|
|
120
121
|
return 1
|
|
121
|
-
except Exception as e:
|
|
122
|
+
except Exception as e: # noqa: BLE001
|
|
122
123
|
if not self.silent and not self.log_file:
|
|
123
|
-
print(f"CLI test failed with exception: {e}", file=sys.stderr)
|
|
124
|
+
print(f"CLI test failed with exception: {e}", file=sys.stderr) # noqa: T201
|
|
124
125
|
return 1
|
|
125
126
|
|
|
126
127
|
@staticmethod
|
|
127
128
|
def serialize_responses(responses: dict[str, str | bool | list[str | bool]]) -> str:
|
|
128
129
|
"""Serialize responses dict to string format using JSON."""
|
|
129
|
-
import json
|
|
130
|
-
|
|
131
130
|
return json.dumps(responses)
|
|
132
131
|
|
|
133
132
|
@staticmethod
|
|
134
133
|
def deserialize_responses(serialized: str) -> dict[str, str | bool | list[str | bool]]:
|
|
135
134
|
"""Deserialize responses from JSON string format."""
|
|
136
|
-
import json
|
|
137
|
-
|
|
138
135
|
if not serialized:
|
|
139
136
|
return {}
|
|
140
137
|
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""Step-based configuration orchestrator.
|
|
2
|
+
|
|
3
|
+
Drives the step-based collection of deployment values through interactive
|
|
4
|
+
prompts or a config YAML file. Works entirely in-memory except for the
|
|
5
|
+
optional resume-state file managed by ``DeploymentState``.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
import yaml
|
|
15
|
+
|
|
16
|
+
from octopize_avatar_deploy.deployment_mode import DeploymentMode
|
|
17
|
+
from octopize_avatar_deploy.input_gatherer import InputGatherer
|
|
18
|
+
from octopize_avatar_deploy.output_spec import OutputSpec
|
|
19
|
+
from octopize_avatar_deploy.printer import Printer
|
|
20
|
+
from octopize_avatar_deploy.state_manager import DeploymentState
|
|
21
|
+
from octopize_avatar_deploy.steps.base import DeploymentStep
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Configurator:
|
|
25
|
+
"""Step-based configuration collector.
|
|
26
|
+
|
|
27
|
+
Orchestrates deployment steps to resolve configuration values from
|
|
28
|
+
interactive prompts or a pre-loaded config file. Returns the
|
|
29
|
+
:class:`~octopize_avatar_deploy.state_manager.DeploymentState` populated
|
|
30
|
+
with the resolved config, accumulated secrets, and any post-generation
|
|
31
|
+
render specs from step hooks.
|
|
32
|
+
|
|
33
|
+
Filesystem access is limited to:
|
|
34
|
+
|
|
35
|
+
- Reading an optional config YAML file passed to :meth:`run`.
|
|
36
|
+
- Delegating incremental persistence to the provided ``state`` object
|
|
37
|
+
(which writes to disk only when its ``state_file`` is not ``None``).
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
output_dir: Directory used for step initialisation (forwarded to each
|
|
41
|
+
step constructor).
|
|
42
|
+
defaults: Pre-loaded defaults dict (typically from ``defaults.yaml``).
|
|
43
|
+
config: Shared configuration dict mutated in-place by each step.
|
|
44
|
+
state: Resume-state object; tracks step completion, config snapshots,
|
|
45
|
+
secrets, and post-generation specs. When constructed with
|
|
46
|
+
``state_file=None`` the state is in-memory only and ``save()``
|
|
47
|
+
calls are no-ops.
|
|
48
|
+
step_classes: Ordered list of step classes to execute (already filtered
|
|
49
|
+
by deployment mode).
|
|
50
|
+
mode: Deployment mode; stored as ``config["deployment_mode"]``.
|
|
51
|
+
printer: Progress output sink.
|
|
52
|
+
input_gatherer: Interactive-prompt handler.
|
|
53
|
+
on_step_complete: Optional callback invoked after each step completes,
|
|
54
|
+
*in addition to* the state's own auto-save. Useful for callers
|
|
55
|
+
that want to perform extra work (e.g. additional serialisation)
|
|
56
|
+
on each checkpoint.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
output_dir: Path,
|
|
62
|
+
defaults: dict[str, Any],
|
|
63
|
+
config: dict[str, Any],
|
|
64
|
+
state: DeploymentState,
|
|
65
|
+
step_classes: list[type[DeploymentStep]],
|
|
66
|
+
mode: DeploymentMode,
|
|
67
|
+
printer: Printer,
|
|
68
|
+
input_gatherer: InputGatherer,
|
|
69
|
+
on_step_complete: Callable[[], None] | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
self.output_dir = output_dir
|
|
72
|
+
self.defaults = defaults
|
|
73
|
+
self.config = config
|
|
74
|
+
self.state = state
|
|
75
|
+
self.step_classes = step_classes
|
|
76
|
+
self.mode = mode
|
|
77
|
+
self.printer = printer
|
|
78
|
+
self.input_gatherer = input_gatherer
|
|
79
|
+
self.on_step_complete = on_step_complete
|
|
80
|
+
|
|
81
|
+
def run(
|
|
82
|
+
self,
|
|
83
|
+
interactive: bool = True,
|
|
84
|
+
config_file: Path | None = None,
|
|
85
|
+
) -> DeploymentState:
|
|
86
|
+
"""Execute all steps and return the populated deployment state.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
interactive: Whether to prompt the user for missing values.
|
|
90
|
+
config_file: Optional YAML file used to pre-populate config values.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
The :class:`~octopize_avatar_deploy.state_manager.DeploymentState`
|
|
94
|
+
passed at construction time, now populated with the resolved config
|
|
95
|
+
dict, accumulated secrets, and post-generation render specs.
|
|
96
|
+
|
|
97
|
+
Raises:
|
|
98
|
+
RuntimeError: If the config file cannot be loaded or parsed.
|
|
99
|
+
ValueError: If a step fails validation.
|
|
100
|
+
"""
|
|
101
|
+
# ------------------------------------------------------------------ #
|
|
102
|
+
# 1. Resume-state handling
|
|
103
|
+
# ------------------------------------------------------------------ #
|
|
104
|
+
if self.state.has_started() and not self.state.is_complete():
|
|
105
|
+
if interactive:
|
|
106
|
+
self.state.print_status(self.printer)
|
|
107
|
+
self.printer.print_header("")
|
|
108
|
+
response = self.input_gatherer.prompt_yes_no(
|
|
109
|
+
"Resume from where you left off?", default=True, key="resume.continue"
|
|
110
|
+
)
|
|
111
|
+
if not response:
|
|
112
|
+
self.printer.print("Starting fresh configuration...")
|
|
113
|
+
self.state.reset()
|
|
114
|
+
else:
|
|
115
|
+
self.printer.print("Resuming from last completed step...")
|
|
116
|
+
self.config.update(self.state.get_config())
|
|
117
|
+
else:
|
|
118
|
+
# Non-interactive: always resume automatically.
|
|
119
|
+
self.config.update(self.state.get_config())
|
|
120
|
+
|
|
121
|
+
# ------------------------------------------------------------------ #
|
|
122
|
+
# 2. Load config file
|
|
123
|
+
# ------------------------------------------------------------------ #
|
|
124
|
+
if config_file and config_file.exists():
|
|
125
|
+
self.printer.print(f"Loading configuration from {config_file}...")
|
|
126
|
+
try:
|
|
127
|
+
with open(config_file) as f:
|
|
128
|
+
loaded_config = yaml.safe_load(f) or {}
|
|
129
|
+
except yaml.YAMLError as e:
|
|
130
|
+
raise RuntimeError(f"Failed to parse YAML config file: {e}") from e
|
|
131
|
+
except Exception as e:
|
|
132
|
+
raise RuntimeError(f"Failed to load config file: {e}") from e
|
|
133
|
+
|
|
134
|
+
self.config.update(loaded_config)
|
|
135
|
+
# ------------------------------------------------------------------ #
|
|
136
|
+
# 3. Instantiate and run steps
|
|
137
|
+
# ------------------------------------------------------------------ #
|
|
138
|
+
steps = [
|
|
139
|
+
step_class(
|
|
140
|
+
self.output_dir,
|
|
141
|
+
self.defaults,
|
|
142
|
+
self.config,
|
|
143
|
+
interactive,
|
|
144
|
+
self.printer,
|
|
145
|
+
self.input_gatherer,
|
|
146
|
+
)
|
|
147
|
+
for step_class in self.step_classes
|
|
148
|
+
]
|
|
149
|
+
|
|
150
|
+
self.printer.print_header("Avatar Deployment Configuration")
|
|
151
|
+
self.printer.print()
|
|
152
|
+
self.printer.print("Executing configuration steps...")
|
|
153
|
+
self.printer.print()
|
|
154
|
+
|
|
155
|
+
for i, step in enumerate(steps):
|
|
156
|
+
step_name = f"step_{i}_{step.name}"
|
|
157
|
+
|
|
158
|
+
if self.state.is_step_completed(step_name):
|
|
159
|
+
self.printer.print_step(step.description, skipped=True)
|
|
160
|
+
continue
|
|
161
|
+
|
|
162
|
+
self.printer.print_step(step.description)
|
|
163
|
+
self.state.mark_step_started(step_name)
|
|
164
|
+
|
|
165
|
+
step_config = step.collect_config()
|
|
166
|
+
self.config.update(step_config)
|
|
167
|
+
|
|
168
|
+
step_secrets = step.generate_secrets()
|
|
169
|
+
self.state.update_secrets(step_secrets)
|
|
170
|
+
|
|
171
|
+
if not step.validate():
|
|
172
|
+
raise ValueError(f"Validation failed for step: {step.name}")
|
|
173
|
+
|
|
174
|
+
self.state.mark_step_completed(step_name)
|
|
175
|
+
self.state.update_config(self.config)
|
|
176
|
+
|
|
177
|
+
if self.on_step_complete:
|
|
178
|
+
self.on_step_complete()
|
|
179
|
+
|
|
180
|
+
# ------------------------------------------------------------------ #
|
|
181
|
+
# 4. Collect post-generation render specs and store in state
|
|
182
|
+
# ------------------------------------------------------------------ #
|
|
183
|
+
post_generation_specs: list[OutputSpec] = []
|
|
184
|
+
|
|
185
|
+
def _collect_spec(template_name: str, output_name: str) -> None:
|
|
186
|
+
post_generation_specs.append(OutputSpec(template_name, output_name))
|
|
187
|
+
|
|
188
|
+
for step in steps:
|
|
189
|
+
step.after_config_generation(_collect_spec)
|
|
190
|
+
|
|
191
|
+
self.state.set_post_generation_specs(post_generation_specs)
|
|
192
|
+
|
|
193
|
+
# Ensure the final config state is always flushed, even when no steps ran
|
|
194
|
+
# or the last step didn't trigger a save (e.g. early resume skip).
|
|
195
|
+
self.state.update_config(self.config)
|
|
196
|
+
|
|
197
|
+
return self.state
|