diracx 0.0.4__tar.gz → 0.0.5__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.
- diracx-0.0.5/.github/workflows/update_chart_version.py +338 -0
- {diracx-0.0.4 → diracx-0.0.5}/.pre-commit-config.yaml +1 -1
- {diracx-0.0.4 → diracx-0.0.5}/CHANGELOG.md +18 -0
- {diracx-0.0.4 → diracx-0.0.5}/PKG-INFO +1 -1
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/db.py +4 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/base.py +6 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +6 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/device_flow.py +6 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/management.py +5 -1
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/configuration.py +6 -1
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/factory.py +15 -5
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/health/probes.py +6 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/utils/users.py +4 -0
- diracx-0.0.4/.github/workflows/update_chart_version.py +0 -158
- {diracx-0.0.4 → diracx-0.0.5}/.coveragerc +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.gitattributes +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/dependabot.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/deployment.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/integration.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/main.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/release-please.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/update_security_txt_expiry.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.github/workflows/vulnerabilities.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.gitignore +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/.readthedocs.yaml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/LICENSE +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/MANIFEST.in +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/codecov.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/containers/client/Dockerfile +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/containers/services/Dockerfile +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/jobs.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/src/diracx/api/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/tests/test_jobs.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-api/tests/test_utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/__main__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/auth.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/config.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/jobs.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/src/diracx/cli/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/legacy/test_legacy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_internal.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_jobs.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-cli/tests/test_login.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/_diracx_client_importer.pth +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/_client_importer.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/aio.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/patches/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/src/diracx/client/sync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-client/tests/test_auth.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/config/sources.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/exceptions.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/extensions.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/preferences.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/properties.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/resources.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/s3.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/settings.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/src/diracx/core/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_config_source.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_entry_points.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_extensions.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_resources.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_s3.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_schema_legacy_adaptor.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_secrets.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-core/tests/test_utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/__main__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/exceptions.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/os/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_device_flow.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/auth/test_refresh_token.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_job_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_connection.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_index_template.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/opensearch/test_search.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/pilot_agents/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/test_dummy_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/test_freeze_time.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-db/tests/utils/test_uuid.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/__main__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-logic/tests/jobs/test_status.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/dependencies.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/otel.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/auth/test_standard.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/health/test_probes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/conftest.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_query.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_status.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_config_manager.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_generic.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-routers/tests/test_policy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/__main__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/osdb.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/routers.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/time.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/diracx-testing/src/diracx/testing/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/SECURITY.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/auth-with-diracx.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/auth-with-external.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/configuration.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/opentelemetry.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/sandbox-store.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/explanations/user-management.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/connect.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/convert-cs.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/embracing.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/minimal-requirements.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/register-a-vo.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/env-variables.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/security_model.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/reference/settings-and-preferences.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/admin/tutorials/authentication.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/extra.css +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/fontawesome-all.min.css +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/images/arrow.svg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/images/overlay.png +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/css/main.css +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/home.html +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/images/diracx-logo-square.svg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/images/logo.svg +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/styles/extra.css +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/assets/webfonts/fa-solid-900.woff +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/api.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/cli.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/client.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/db.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/components/routes.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/designing-functionality.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/extensions.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/explanations/testing.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-cli-command.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-db.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-route.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-setting.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-task.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-a-test.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/add-functionality/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-customization.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-extension.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/client-generation.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/contribute.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/extend-diracx/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/how-to/use-the-demo/web.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/application-state.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/client-metapathfinder.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/coding-conventions.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/configuration.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/db-transaction-model.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/dependency-injection.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/entrypoints.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/env-variables.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/pixi-tasks.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/security-policies.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/security-properties.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/test-recipes.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/reference/writing-tests.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/advanced-tutorial.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/develop-web.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/getting-started.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/larger-developments.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/making-changes.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/play-with-auth.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/run-locally.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/dev/tutorials/write-docs.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/overrides/main.html +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/roadmap.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/client-configuration.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/known-installations.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/index.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/docs/user/tutorials/getting-started.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/containers/client/Dockerfile +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/containers/services/Dockerfile +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/.github/workflows/main.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/pixi.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins/release.notes +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/.gitignore +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/Chart.yaml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/README.md +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins-charts/values.yaml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/extensions/gubbins_values.yaml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/mkdocs.yml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/pixi.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/pyproject.toml +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/run_local.sh +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/tests/__init__.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/tests/make_token_local.py +0 -0
- {diracx-0.0.4 → diracx-0.0.5}/tests/test_generic.py +0 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Script to update chart versions based on DiracX releases."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import re
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
import requests
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def parse_version(version_str: str) -> tuple[int, int, int, str | None]:
|
|
16
|
+
"""Parse a semantic version string into components.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
version_str: Version string like "1.0.0-alpha.1"
|
|
20
|
+
|
|
21
|
+
Returns:
|
|
22
|
+
Tuple of (major, minor, patch, pre_release_suffix)
|
|
23
|
+
|
|
24
|
+
"""
|
|
25
|
+
# Remove leading 'v' if present
|
|
26
|
+
version_str = version_str.lstrip("v")
|
|
27
|
+
|
|
28
|
+
# Pattern for semver with optional pre-release
|
|
29
|
+
pattern = r"^(\d+)\.(\d+)\.(\d+)(?:-(.+))?$"
|
|
30
|
+
match = re.match(pattern, version_str)
|
|
31
|
+
|
|
32
|
+
if not match:
|
|
33
|
+
raise ValueError(f"Invalid version format: {version_str}")
|
|
34
|
+
|
|
35
|
+
major, minor, patch, pre_release = match.groups()
|
|
36
|
+
return int(major), int(minor), int(patch), pre_release
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def bump_version(current_version: str) -> str:
|
|
40
|
+
"""Bump a version automatically - alpha if present, else patch.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
current_version: Current version string
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
New version string
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
major, minor, patch, pre_release = parse_version(current_version)
|
|
50
|
+
|
|
51
|
+
if pre_release and pre_release.startswith("alpha."):
|
|
52
|
+
# Increment alpha number
|
|
53
|
+
alpha_match = re.match(r"alpha\.(\d+)", pre_release)
|
|
54
|
+
if alpha_match:
|
|
55
|
+
alpha_num = int(alpha_match.group(1)) + 1
|
|
56
|
+
return f"{major}.{minor}.{patch}-alpha.{alpha_num}"
|
|
57
|
+
else:
|
|
58
|
+
# Invalid alpha format, start with alpha.1
|
|
59
|
+
return f"{major}.{minor}.{patch}-alpha.1"
|
|
60
|
+
else:
|
|
61
|
+
# No alpha suffix, bump patch version
|
|
62
|
+
return f"{major}.{minor}.{patch + 1}"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def update_chart_yaml(
|
|
66
|
+
chart_path: Path,
|
|
67
|
+
app_version: str,
|
|
68
|
+
new_chart_version: str,
|
|
69
|
+
dependency_name: str | None = None,
|
|
70
|
+
dependency_version: str | None = None,
|
|
71
|
+
) -> None:
|
|
72
|
+
"""Update Chart.yaml with new versions.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
chart_path: Path to Chart.yaml
|
|
76
|
+
app_version: New application version
|
|
77
|
+
new_chart_version: New chart version
|
|
78
|
+
dependency_name: Optional name of dependency to update
|
|
79
|
+
dependency_version: Optional version for the dependency
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
content = chart_path.read_text()
|
|
83
|
+
|
|
84
|
+
# Update appVersion
|
|
85
|
+
content = re.sub(
|
|
86
|
+
r"^appVersion:\s*.*$",
|
|
87
|
+
f"appVersion: {app_version}",
|
|
88
|
+
content,
|
|
89
|
+
flags=re.MULTILINE,
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Update version
|
|
93
|
+
content = re.sub(
|
|
94
|
+
r"^version:\s*.*$",
|
|
95
|
+
f'version: "{new_chart_version}"',
|
|
96
|
+
content,
|
|
97
|
+
flags=re.MULTILINE,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Update dependency version if specified
|
|
101
|
+
if dependency_name and dependency_version:
|
|
102
|
+
# Use YAML to properly update the dependency
|
|
103
|
+
chart_data = yaml.safe_load(content)
|
|
104
|
+
if "dependencies" in chart_data:
|
|
105
|
+
for dep in chart_data["dependencies"]:
|
|
106
|
+
if dep.get("name") == dependency_name:
|
|
107
|
+
dep["version"] = dependency_version
|
|
108
|
+
break
|
|
109
|
+
# Use regex for dependency update to preserve formatting
|
|
110
|
+
# Match the dependency block and update the version
|
|
111
|
+
name_pat = re.escape(dependency_name)
|
|
112
|
+
dep_pattern = (
|
|
113
|
+
rf'(- name:\s*{name_pat}\s*\n(?:.*\n)*?\s*version:\s*)("[^"]*"|[^\n]*)'
|
|
114
|
+
)
|
|
115
|
+
content = re.sub(dep_pattern, rf'\g<1>"{dependency_version}"', content)
|
|
116
|
+
|
|
117
|
+
chart_path.write_text(content)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def update_values_yaml(
|
|
121
|
+
values_path: Path, app_version: str, image_tag_path: str
|
|
122
|
+
) -> None:
|
|
123
|
+
"""Update values.yaml with new image tag.
|
|
124
|
+
|
|
125
|
+
Args:
|
|
126
|
+
values_path: Path to values.yaml
|
|
127
|
+
app_version: New application version to set as image tag
|
|
128
|
+
image_tag_path: Dot-separated path to the image tag field (e.g., "global.images.tag")
|
|
129
|
+
|
|
130
|
+
"""
|
|
131
|
+
content = values_path.read_text()
|
|
132
|
+
data = yaml.safe_load(content)
|
|
133
|
+
|
|
134
|
+
# Navigate to the parent of the tag field and update it
|
|
135
|
+
path_parts = image_tag_path.split(".")
|
|
136
|
+
current = data
|
|
137
|
+
for part in path_parts[:-1]:
|
|
138
|
+
if part not in current:
|
|
139
|
+
print(f"Warning: Path '{part}' not found in values.yaml")
|
|
140
|
+
return
|
|
141
|
+
current = current[part]
|
|
142
|
+
|
|
143
|
+
tag_key = path_parts[-1]
|
|
144
|
+
if tag_key not in current:
|
|
145
|
+
print(f"Warning: Key '{tag_key}' not found at path in values.yaml")
|
|
146
|
+
return
|
|
147
|
+
|
|
148
|
+
old_value = current[tag_key]
|
|
149
|
+
current[tag_key] = app_version
|
|
150
|
+
|
|
151
|
+
# Use regex to preserve formatting - find and replace the specific value
|
|
152
|
+
# Build a regex pattern that matches the nested structure
|
|
153
|
+
# This is more reliable than re-serializing the entire YAML
|
|
154
|
+
def build_yaml_path_pattern(parts: list[str], value: str) -> tuple[str, str]:
|
|
155
|
+
"""Build a regex pattern to find and replace a nested YAML value."""
|
|
156
|
+
# For simple cases, we use a pattern that finds the key and its value
|
|
157
|
+
# at the appropriate nesting level
|
|
158
|
+
key = parts[-1]
|
|
159
|
+
# Match the key followed by its value, being careful about indentation
|
|
160
|
+
pattern = rf"({re.escape(key)}:\s*)({re.escape(str(value))})"
|
|
161
|
+
replacement = rf"\g<1>{app_version}"
|
|
162
|
+
return pattern, replacement
|
|
163
|
+
|
|
164
|
+
pattern, replacement = build_yaml_path_pattern(path_parts, str(old_value))
|
|
165
|
+
new_content = re.sub(pattern, replacement, content, count=1)
|
|
166
|
+
|
|
167
|
+
if new_content == content:
|
|
168
|
+
# Fallback: if regex didn't match, dump the modified YAML
|
|
169
|
+
print("Warning: Using YAML dump fallback for values.yaml update")
|
|
170
|
+
new_content = yaml.dump(data, default_flow_style=False, sort_keys=False)
|
|
171
|
+
|
|
172
|
+
values_path.write_text(new_content)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def lookup_dependency_chart_version(
|
|
176
|
+
index_url: str, dependency_name: str, app_version: str
|
|
177
|
+
) -> str | None:
|
|
178
|
+
"""Look up the chart version for a dependency given its app version.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
index_url: URL to the Helm chart index.yaml
|
|
182
|
+
dependency_name: Name of the dependency chart
|
|
183
|
+
app_version: Application version to match
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
The chart version that matches the app version, or None if not found
|
|
187
|
+
|
|
188
|
+
"""
|
|
189
|
+
print(f"Fetching chart index from {index_url}...")
|
|
190
|
+
response = requests.get(index_url, timeout=30)
|
|
191
|
+
response.raise_for_status()
|
|
192
|
+
|
|
193
|
+
index_data = yaml.safe_load(response.text)
|
|
194
|
+
|
|
195
|
+
if "entries" not in index_data:
|
|
196
|
+
print("Error: No entries found in chart index")
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
if dependency_name not in index_data["entries"]:
|
|
200
|
+
print(f"Error: Dependency '{dependency_name}' not found in chart index")
|
|
201
|
+
return None
|
|
202
|
+
|
|
203
|
+
# Normalize the app version for comparison (remove 'v' prefix if present)
|
|
204
|
+
normalized_app_version = app_version.lstrip("v")
|
|
205
|
+
|
|
206
|
+
# Find the chart version with matching appVersion
|
|
207
|
+
for entry in index_data["entries"][dependency_name]:
|
|
208
|
+
entry_app_version = str(entry.get("appVersion", "")).lstrip("v")
|
|
209
|
+
if entry_app_version == normalized_app_version:
|
|
210
|
+
chart_version = entry.get("version")
|
|
211
|
+
print(
|
|
212
|
+
f"Found {dependency_name} chart version {chart_version} "
|
|
213
|
+
f"for app version {app_version}"
|
|
214
|
+
)
|
|
215
|
+
return chart_version
|
|
216
|
+
|
|
217
|
+
print(
|
|
218
|
+
f"Warning: No chart found for {dependency_name} with app version {app_version}"
|
|
219
|
+
)
|
|
220
|
+
return None
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def main() -> None:
|
|
224
|
+
"""Main function."""
|
|
225
|
+
parser = argparse.ArgumentParser(
|
|
226
|
+
description="Update chart versions for DiracX release"
|
|
227
|
+
)
|
|
228
|
+
parser.add_argument(
|
|
229
|
+
"--charts-dir", type=Path, default=".", help="Path to charts directory"
|
|
230
|
+
)
|
|
231
|
+
parser.add_argument(
|
|
232
|
+
"--chart-subdir",
|
|
233
|
+
type=str,
|
|
234
|
+
default="diracx",
|
|
235
|
+
help="Subdirectory containing chart files (use '.' for root)",
|
|
236
|
+
)
|
|
237
|
+
parser.add_argument(
|
|
238
|
+
"--app-version",
|
|
239
|
+
required=True,
|
|
240
|
+
help="Application version (e.g., v0.0.1a49)",
|
|
241
|
+
)
|
|
242
|
+
parser.add_argument(
|
|
243
|
+
"--image-tag-path",
|
|
244
|
+
type=str,
|
|
245
|
+
default="global.images.tag",
|
|
246
|
+
help="Dot-separated YAML path to image tag in values.yaml",
|
|
247
|
+
)
|
|
248
|
+
parser.add_argument(
|
|
249
|
+
"--update-dependency",
|
|
250
|
+
type=str,
|
|
251
|
+
help="Name of dependency to update in Chart.yaml",
|
|
252
|
+
)
|
|
253
|
+
parser.add_argument(
|
|
254
|
+
"--dependency-app-version",
|
|
255
|
+
type=str,
|
|
256
|
+
help="App version to match for the dependency",
|
|
257
|
+
)
|
|
258
|
+
parser.add_argument(
|
|
259
|
+
"--dependency-chart-index",
|
|
260
|
+
type=str,
|
|
261
|
+
default="https://charts.diracgrid.org/index.yaml",
|
|
262
|
+
help="URL to the dependency's chart index.yaml",
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
args = parser.parse_args()
|
|
266
|
+
|
|
267
|
+
# Determine chart subdirectory
|
|
268
|
+
if args.chart_subdir == ".":
|
|
269
|
+
chart_subdir = args.charts_dir
|
|
270
|
+
else:
|
|
271
|
+
chart_subdir = args.charts_dir / args.chart_subdir
|
|
272
|
+
|
|
273
|
+
# Define paths
|
|
274
|
+
chart_yaml = chart_subdir / "Chart.yaml"
|
|
275
|
+
values_yaml = chart_subdir / "values.yaml"
|
|
276
|
+
|
|
277
|
+
if not chart_yaml.exists():
|
|
278
|
+
print(f"Error: Chart.yaml not found at {chart_yaml}")
|
|
279
|
+
sys.exit(1)
|
|
280
|
+
|
|
281
|
+
if not values_yaml.exists():
|
|
282
|
+
print(f"Error: values.yaml not found at {values_yaml}")
|
|
283
|
+
sys.exit(1)
|
|
284
|
+
|
|
285
|
+
# Get current chart version using YAML parser to handle comments correctly
|
|
286
|
+
chart_content = chart_yaml.read_text()
|
|
287
|
+
chart_data = yaml.safe_load(chart_content)
|
|
288
|
+
version_match = chart_data.get("version")
|
|
289
|
+
|
|
290
|
+
if not version_match:
|
|
291
|
+
print("Error: Could not find version in Chart.yaml")
|
|
292
|
+
sys.exit(1)
|
|
293
|
+
|
|
294
|
+
current_chart_version = str(version_match)
|
|
295
|
+
print(f"Current chart version: {current_chart_version}")
|
|
296
|
+
|
|
297
|
+
# Calculate new chart version (alpha if present, else patch)
|
|
298
|
+
new_chart_version = bump_version(current_chart_version)
|
|
299
|
+
print(f"New chart version: {new_chart_version}")
|
|
300
|
+
|
|
301
|
+
# Look up dependency chart version if needed
|
|
302
|
+
dependency_version = None
|
|
303
|
+
if args.update_dependency:
|
|
304
|
+
if not args.dependency_app_version:
|
|
305
|
+
parser.error("--update-dependency requires --dependency-app-version")
|
|
306
|
+
dependency_version = lookup_dependency_chart_version(
|
|
307
|
+
args.dependency_chart_index,
|
|
308
|
+
args.update_dependency,
|
|
309
|
+
args.dependency_app_version,
|
|
310
|
+
)
|
|
311
|
+
if not dependency_version:
|
|
312
|
+
print(
|
|
313
|
+
f"Error: Could not find chart version for {args.update_dependency} "
|
|
314
|
+
f"with app version {args.dependency_app_version}"
|
|
315
|
+
)
|
|
316
|
+
sys.exit(1)
|
|
317
|
+
|
|
318
|
+
# Update files
|
|
319
|
+
print("Updating Chart.yaml...")
|
|
320
|
+
update_chart_yaml(
|
|
321
|
+
chart_yaml,
|
|
322
|
+
args.app_version,
|
|
323
|
+
new_chart_version,
|
|
324
|
+
args.update_dependency,
|
|
325
|
+
dependency_version,
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
print("Updating values.yaml...")
|
|
329
|
+
update_values_yaml(values_yaml, args.app_version, args.image_tag_path)
|
|
330
|
+
|
|
331
|
+
print(f"Successfully updated charts for app version {args.app_version}")
|
|
332
|
+
print(f"Chart version: {current_chart_version} -> {new_chart_version}")
|
|
333
|
+
if dependency_version:
|
|
334
|
+
print(f"Dependency {args.update_dependency} version: {dependency_version}")
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
if __name__ == "__main__":
|
|
338
|
+
main()
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.5](https://github.com/DIRACGrid/diracx/compare/v0.0.4...v0.0.5) (2026-01-20)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add logging for error conditions and edge cases ([#734](https://github.com/DIRACGrid/diracx/issues/734)) ([2c8b5c6](https://github.com/DIRACGrid/diracx/commit/2c8b5c682f17270e341deaf23cd4a7b4b7c4dd0a))
|
|
9
|
+
* extend update_chart_version.py for downstream charts ([#731](https://github.com/DIRACGrid/diracx/issues/731)) ([b1a293b](https://github.com/DIRACGrid/diracx/commit/b1a293b01ad062d162afdfb5377a76c95eb09913))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* use YAML parser for chart version to handle comments ([9516971](https://github.com/DIRACGrid/diracx/commit/95169716206bb476f450fff8fd228ada649fef5b))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Miscellaneous Chores
|
|
18
|
+
|
|
19
|
+
* release 0.0.5 ([c0f166b](https://github.com/DIRACGrid/diracx/commit/c0f166bf29e1ed0ac2b5aa89ebb39ac60cfe23d3))
|
|
20
|
+
|
|
3
21
|
## [0.0.4](https://github.com/DIRACGrid/diracx/compare/v0.0.3...v0.0.4) (2026-01-19)
|
|
4
22
|
|
|
5
23
|
|
|
@@ -178,6 +178,10 @@ class AuthDB(BaseSQLDB):
|
|
|
178
178
|
await self.conn.execute(stmt)
|
|
179
179
|
|
|
180
180
|
except IntegrityError:
|
|
181
|
+
logger.warning(
|
|
182
|
+
"Device flow code collision detected, retrying (user_code=%s)",
|
|
183
|
+
user_code,
|
|
184
|
+
)
|
|
181
185
|
continue
|
|
182
186
|
|
|
183
187
|
return user_code, device_code
|
|
@@ -211,6 +211,12 @@ class BaseSQLDB(metaclass=ABCMeta):
|
|
|
211
211
|
try:
|
|
212
212
|
self._conn.set(await self.engine.connect().__aenter__())
|
|
213
213
|
except Exception as e:
|
|
214
|
+
logger.warning(
|
|
215
|
+
"Database connection failed for %s: %s",
|
|
216
|
+
self.__class__.__name__,
|
|
217
|
+
e,
|
|
218
|
+
exc_info=True,
|
|
219
|
+
)
|
|
214
220
|
raise SQLDBUnavailableError(
|
|
215
221
|
f"Cannot connect to {self.__class__.__name__}"
|
|
216
222
|
) from e
|
|
@@ -5,6 +5,7 @@ See docs/admin/explanations/authentication.md
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import logging
|
|
8
9
|
from typing import Literal
|
|
9
10
|
|
|
10
11
|
from fastapi import (
|
|
@@ -30,6 +31,8 @@ from ..dependencies import (
|
|
|
30
31
|
)
|
|
31
32
|
from ..fastapi_classes import DiracxRouter
|
|
32
33
|
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
33
36
|
router = DiracxRouter(require_auth=False)
|
|
34
37
|
|
|
35
38
|
|
|
@@ -115,15 +118,18 @@ async def complete_authorization_flow(
|
|
|
115
118
|
settings=settings,
|
|
116
119
|
)
|
|
117
120
|
except AuthorizationError as e:
|
|
121
|
+
logger.warning("Authorization flow failed with invalid state: %s", e)
|
|
118
122
|
raise HTTPException(
|
|
119
123
|
status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid state"
|
|
120
124
|
) from e
|
|
121
125
|
except IAMServerError as e:
|
|
126
|
+
logger.warning("IAM server error during authorization flow: %s", e)
|
|
122
127
|
raise HTTPException(
|
|
123
128
|
status_code=status.HTTP_502_BAD_GATEWAY,
|
|
124
129
|
detail="Failed to contact IAM server",
|
|
125
130
|
) from e
|
|
126
131
|
except IAMClientError as e:
|
|
132
|
+
logger.warning("IAM client error during authorization flow: %s", e)
|
|
127
133
|
raise HTTPException(
|
|
128
134
|
status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid code"
|
|
129
135
|
) from e
|
|
@@ -5,6 +5,8 @@ See docs/admin/explanations/authentication.md
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
import logging
|
|
9
|
+
|
|
8
10
|
from fastapi import (
|
|
9
11
|
HTTPException,
|
|
10
12
|
Request,
|
|
@@ -32,6 +34,8 @@ from ..dependencies import (
|
|
|
32
34
|
)
|
|
33
35
|
from ..fastapi_classes import DiracxRouter
|
|
34
36
|
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
35
39
|
router = DiracxRouter(require_auth=False)
|
|
36
40
|
|
|
37
41
|
|
|
@@ -136,11 +140,13 @@ async def finish_device_flow(
|
|
|
136
140
|
settings,
|
|
137
141
|
)
|
|
138
142
|
except IAMServerError as e:
|
|
143
|
+
logger.warning("IAM server error during device flow completion: %s", e)
|
|
139
144
|
raise HTTPException(
|
|
140
145
|
status_code=status.HTTP_502_BAD_GATEWAY,
|
|
141
146
|
detail=e.args[0],
|
|
142
147
|
) from e
|
|
143
148
|
except IAMClientError as e:
|
|
149
|
+
logger.warning("IAM client error during device flow completion: %s", e)
|
|
144
150
|
raise HTTPException(
|
|
145
151
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
146
152
|
detail=e.args[0],
|
|
@@ -82,7 +82,11 @@ async def revoke_refresh_token_by_refresh_token(
|
|
|
82
82
|
auth_db, None, token, token_type_hint, client_id, settings
|
|
83
83
|
)
|
|
84
84
|
except (DecodeError, KeyError):
|
|
85
|
-
logger.warning(
|
|
85
|
+
logger.warning(
|
|
86
|
+
"Token revocation failed: invalid token format (client_id=%s)",
|
|
87
|
+
client_id,
|
|
88
|
+
exc_info=True,
|
|
89
|
+
)
|
|
86
90
|
except ValueError as e:
|
|
87
91
|
raise HTTPException(
|
|
88
92
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
from datetime import datetime, timezone
|
|
4
5
|
from typing import Annotated
|
|
5
6
|
|
|
@@ -14,6 +15,8 @@ from .access_policies import open_access
|
|
|
14
15
|
from .dependencies import Config
|
|
15
16
|
from .fastapi_classes import DiracxRouter
|
|
16
17
|
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
17
20
|
LAST_MODIFIED_FORMAT = "%a, %d %b %Y %H:%M:%S GMT"
|
|
18
21
|
|
|
19
22
|
router = DiracxRouter()
|
|
@@ -52,7 +55,9 @@ async def serve_config(
|
|
|
52
55
|
if_modified_since, LAST_MODIFIED_FORMAT
|
|
53
56
|
).astimezone(timezone.utc)
|
|
54
57
|
except ValueError:
|
|
55
|
-
|
|
58
|
+
logger.debug(
|
|
59
|
+
"Failed to parse If-Modified-Since header: %s", if_modified_since
|
|
60
|
+
)
|
|
56
61
|
else:
|
|
57
62
|
if not_before > config._modified:
|
|
58
63
|
raise HTTPException(
|
|
@@ -76,7 +76,7 @@ def configure_logger():
|
|
|
76
76
|
uvicorn_access_logger.handlers[0].setFormatter(AccessFormatter(new_format))
|
|
77
77
|
# There may not be any handler defined, like in the CI
|
|
78
78
|
except IndexError:
|
|
79
|
-
|
|
79
|
+
logger.debug("No handlers found for uvicorn.access logger (expected in CI)")
|
|
80
80
|
|
|
81
81
|
uvicorn_logger = logging.getLogger("uvicorn")
|
|
82
82
|
try:
|
|
@@ -85,7 +85,7 @@ def configure_logger():
|
|
|
85
85
|
uvicorn_logger.handlers[0].setFormatter(DefaultFormatter(new_format))
|
|
86
86
|
# There may not be any handler defined, like in the CI
|
|
87
87
|
except IndexError:
|
|
88
|
-
|
|
88
|
+
logger.debug("No handlers found for uvicorn logger (expected in CI)")
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
# Rules:
|
|
@@ -404,6 +404,12 @@ def http_response_handler(request: Request, exc: DiracHttpResponseError) -> Resp
|
|
|
404
404
|
|
|
405
405
|
|
|
406
406
|
def route_unavailable_error_hander(request: Request, exc: DBUnavailableError):
|
|
407
|
+
logger.warning(
|
|
408
|
+
"503 Service Unavailable: %s (path=%s)",
|
|
409
|
+
exc,
|
|
410
|
+
request.url.path,
|
|
411
|
+
exc_info=True,
|
|
412
|
+
)
|
|
407
413
|
return JSONResponse(
|
|
408
414
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
409
415
|
headers={"Retry-After": "10"},
|
|
@@ -510,9 +516,13 @@ class ClientMinVersionCheckMiddleware(BaseHTTPMiddleware):
|
|
|
510
516
|
status_code=exc.status_code,
|
|
511
517
|
content={"detail": exc.detail},
|
|
512
518
|
)
|
|
513
|
-
# If the version is not given
|
|
514
|
-
except Exception:
|
|
515
|
-
|
|
519
|
+
# If the version is not given or cannot be parsed
|
|
520
|
+
except Exception:
|
|
521
|
+
logger.debug(
|
|
522
|
+
"Failed to check client version header: %s",
|
|
523
|
+
client_version,
|
|
524
|
+
exc_info=True,
|
|
525
|
+
)
|
|
516
526
|
|
|
517
527
|
response = await call_next(request)
|
|
518
528
|
return response
|
|
@@ -4,12 +4,16 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
__all__ = ["router"]
|
|
6
6
|
|
|
7
|
+
import logging
|
|
8
|
+
|
|
7
9
|
from fastapi import HTTPException
|
|
8
10
|
from starlette.responses import JSONResponse
|
|
9
11
|
|
|
10
12
|
from ..dependencies import AuthDB, Config
|
|
11
13
|
from ..fastapi_classes import DiracxRouter
|
|
12
14
|
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
13
17
|
router = DiracxRouter(require_auth=False)
|
|
14
18
|
|
|
15
19
|
|
|
@@ -35,6 +39,7 @@ async def ready(config: Config, auth_db: AuthDB):
|
|
|
35
39
|
try:
|
|
36
40
|
await auth_db.ping()
|
|
37
41
|
except Exception as e:
|
|
42
|
+
logger.warning("Ready probe failed: AuthDB ping failed", exc_info=True)
|
|
38
43
|
raise HTTPException(status_code=503, detail="AuthDB ping failed") from e
|
|
39
44
|
return JSONResponse(content={"status": "ready"})
|
|
40
45
|
|
|
@@ -50,5 +55,6 @@ async def startup(config: Config, auth_db: AuthDB):
|
|
|
50
55
|
try:
|
|
51
56
|
await auth_db.ping()
|
|
52
57
|
except Exception as e:
|
|
58
|
+
logger.warning("Startup probe failed: AuthDB ping failed", exc_info=True)
|
|
53
59
|
raise HTTPException(status_code=503, detail="AuthDB ping failed") from e
|
|
54
60
|
return JSONResponse(content={"status": "startup complete"})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import logging
|
|
3
4
|
import re
|
|
4
5
|
import uuid as std_uuid
|
|
5
6
|
from typing import Annotated, Any
|
|
@@ -17,6 +18,8 @@ from diracx.core.properties import SecurityProperty
|
|
|
17
18
|
from diracx.logic.auth.utils import read_token
|
|
18
19
|
from diracx.routers.dependencies import AuthSettings
|
|
19
20
|
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
20
23
|
# auto_error=False is used to avoid raising the wrong exception when the token is missing
|
|
21
24
|
# The error is handled in the verify_dirac_access_token function
|
|
22
25
|
# More info:
|
|
@@ -99,6 +102,7 @@ async def verify_dirac_access_token(
|
|
|
99
102
|
),
|
|
100
103
|
)
|
|
101
104
|
except JoseError as e:
|
|
105
|
+
logger.warning("Token validation failed: %s", e)
|
|
102
106
|
raise HTTPException(
|
|
103
107
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
104
108
|
detail="Invalid JWT",
|