diracx 0.0.1a44__tar.gz → 0.0.1a46__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.1a46/.coveragerc +33 -0
- diracx-0.0.1a46/.gitattributes +2 -0
- diracx-0.0.1a46/.github/dependabot.yml +11 -0
- diracx-0.0.1a46/.github/workflows/deployment.yml +221 -0
- diracx-0.0.1a46/.github/workflows/integration.yml +76 -0
- diracx-0.0.1a46/.github/workflows/main.yml +241 -0
- diracx-0.0.1a46/.github/workflows/make_release.py +74 -0
- diracx-0.0.1a46/.github/workflows/update_security_txt_expiry.yml +88 -0
- diracx-0.0.1a46/.github/workflows/vulnerabilities.yml +92 -0
- diracx-0.0.1a46/.gitignore +98 -0
- diracx-0.0.1a46/.pre-commit-config.yaml +63 -0
- diracx-0.0.1a46/.readthedocs.yaml +16 -0
- diracx-0.0.1a46/MANIFEST.in +5 -0
- {diracx-0.0.1a44 → diracx-0.0.1a46}/PKG-INFO +6 -8
- {diracx-0.0.1a44 → diracx-0.0.1a46}/README.md +2 -3
- diracx-0.0.1a46/codecov.yml +21 -0
- diracx-0.0.1a46/containers/client/Dockerfile +12 -0
- diracx-0.0.1a46/containers/services/Dockerfile +12 -0
- diracx-0.0.1a46/diracx-api/README.md +0 -0
- diracx-0.0.1a46/diracx-api/pyproject.toml +51 -0
- diracx-0.0.1a46/diracx-api/src/diracx/api/__init__.py +5 -0
- diracx-0.0.1a46/diracx-api/src/diracx/api/jobs.py +94 -0
- diracx-0.0.1a46/diracx-api/src/diracx/api/py.typed +0 -0
- diracx-0.0.1a46/diracx-api/src/diracx/api/utils.py +25 -0
- diracx-0.0.1a46/diracx-api/tests/test_jobs.py +47 -0
- diracx-0.0.1a46/diracx-api/tests/test_utils.py +24 -0
- diracx-0.0.1a46/diracx-cli/README.md +0 -0
- diracx-0.0.1a46/diracx-cli/pyproject.toml +73 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/__init__.py +31 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/__main__.py +6 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/auth.py +150 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/config.py +34 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/__init__.py +8 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/config.py +192 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/internal/legacy.py +387 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/jobs.py +158 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/py.typed +0 -0
- diracx-0.0.1a46/diracx-cli/src/diracx/cli/utils.py +34 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +1837 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +863 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +17 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +131 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/cs_sync/test_cssync.py +58 -0
- diracx-0.0.1a46/diracx-cli/tests/legacy/test_legacy.py +35 -0
- diracx-0.0.1a46/diracx-cli/tests/test_internal.py +224 -0
- diracx-0.0.1a46/diracx-cli/tests/test_jobs.py +122 -0
- diracx-0.0.1a46/diracx-cli/tests/test_login.py +42 -0
- diracx-0.0.1a46/diracx-client/README.md +0 -0
- diracx-0.0.1a46/diracx-client/pyproject.toml +50 -0
- diracx-0.0.1a46/diracx-client/src/_diracx_client_importer.pth +1 -0
- diracx-0.0.1a46/diracx-client/src/diracx/_client_importer.py +384 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/__init__.py +15 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/__init__.py +27 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_client.py +99 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_configuration.py +36 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_patch.py +22 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_serialization.py +2184 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/__init__.py +4 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/serialization.py +2030 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_utils/utils.py +49 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/_vendor.py +55 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/__init__.py +27 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_client.py +101 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_configuration.py +36 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_patch.py +20 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/_vendor.py +55 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +29 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +2215 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +26 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/__init__.py +107 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_enums.py +71 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_models.py +1285 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/models/_patch.py +57 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/__init__.py +29 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/_operations.py +2755 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/operations/_patch.py +26 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/_generated/py.typed +1 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/aio.py +13 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/models.py +4 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/aio.py +45 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/common.py +56 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/auth/sync.py +41 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/aio.py +160 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/common.py +196 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/client/sync.py +141 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/aio.py +34 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/common.py +85 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/jobs/sync.py +34 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/patches/utils.py +324 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/py.typed +0 -0
- diracx-0.0.1a46/diracx-client/src/diracx/client/sync.py +13 -0
- diracx-0.0.1a46/diracx-client/tests/test_auth.py +235 -0
- diracx-0.0.1a46/diracx-core/README.md +0 -0
- diracx-0.0.1a46/diracx-core/pyproject.toml +71 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/__init__.py +0 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/config/__init__.py +21 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/config/schema.py +181 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/config/sources.py +294 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/exceptions.py +102 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/extensions.py +55 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/models.py +274 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/preferences.py +62 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/properties.py +161 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/py.typed +0 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/s3.py +108 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/settings.py +209 -0
- diracx-0.0.1a46/diracx-core/src/diracx/core/utils.py +273 -0
- diracx-0.0.1a46/diracx-core/tests/test_config_source.py +38 -0
- diracx-0.0.1a46/diracx-core/tests/test_extensions.py +8 -0
- diracx-0.0.1a46/diracx-core/tests/test_s3.py +167 -0
- diracx-0.0.1a46/diracx-core/tests/test_secrets.py +45 -0
- diracx-0.0.1a46/diracx-core/tests/test_utils.py +170 -0
- diracx-0.0.1a46/diracx-db/README.md +0 -0
- diracx-0.0.1a46/diracx-db/pyproject.toml +62 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/__init__.py +5 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/__main__.py +56 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/exceptions.py +5 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/os/__init__.py +5 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/os/job_parameters.py +37 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/os/utils.py +303 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/py.typed +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/__init__.py +17 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/db.py +266 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/auth/schema.py +101 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/db.py +51 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/dummy/schema.py +24 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/db.py +335 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job/schema.py +158 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/db.py +152 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/job_logging/schema.py +64 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/db.py +45 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +60 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +278 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +57 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/db.py +180 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/task_queue/schema.py +111 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/__init__.py +25 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/base.py +328 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/functions.py +142 -0
- diracx-0.0.1a46/diracx-db/src/diracx/db/sql/utils/types.py +43 -0
- diracx-0.0.1a46/diracx-db/tests/auth/test_authorization_flow.py +76 -0
- diracx-0.0.1a46/diracx-db/tests/auth/test_device_flow.py +141 -0
- diracx-0.0.1a46/diracx-db/tests/auth/test_refresh_token.py +258 -0
- diracx-0.0.1a46/diracx-db/tests/jobs/test_job_db.py +289 -0
- diracx-0.0.1a46/diracx-db/tests/jobs/test_job_logging_db.py +96 -0
- diracx-0.0.1a46/diracx-db/tests/jobs/test_sandbox_metadata.py +212 -0
- diracx-0.0.1a46/diracx-db/tests/opensearch/test_connection.py +90 -0
- diracx-0.0.1a46/diracx-db/tests/opensearch/test_index_template.py +51 -0
- diracx-0.0.1a46/diracx-db/tests/opensearch/test_search.py +477 -0
- diracx-0.0.1a46/diracx-db/tests/pilot_agents/__init__.py +0 -0
- diracx-0.0.1a46/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +30 -0
- diracx-0.0.1a46/diracx-db/tests/test_dummy_db.py +275 -0
- diracx-0.0.1a46/diracx-db/tests/test_freeze_time.py +153 -0
- diracx-0.0.1a46/diracx-logic/README.md +0 -0
- diracx-0.0.1a46/diracx-logic/pyproject.toml +53 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/__init__.py +0 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/__main__.py +129 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +99 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/device_flow.py +100 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/management.py +43 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/token.py +435 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/utils.py +300 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/auth/well_known.py +74 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/query.py +100 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/sandboxes.py +237 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/status.py +645 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/submission.py +257 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/jobs/utils.py +40 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/py.typed +0 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
- diracx-0.0.1a46/diracx-logic/src/diracx/logic/task_queues/priority.py +151 -0
- diracx-0.0.1a46/diracx-logic/tests/logic/test_sandboxes.py +154 -0
- diracx-0.0.1a46/diracx-routers/README.md +0 -0
- diracx-0.0.1a46/diracx-routers/pyproject.toml +87 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/__init__.py +12 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/access_policies.py +164 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/__init__.py +17 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +159 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/device_flow.py +207 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/management.py +134 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/token.py +248 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/utils.py +28 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/auth/well_known.py +63 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/configuration.py +64 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/dependencies.py +67 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/factory.py +542 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/fastapi_classes.py +112 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/health/__init__.py +9 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/health/probes.py +54 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/__init__.py +17 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/access_policies.py +163 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/query.py +192 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/sandboxes.py +176 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/status.py +181 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/jobs/submission.py +76 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/otel.py +131 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/py.typed +0 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
- diracx-0.0.1a46/diracx-routers/src/diracx/routers/utils/users.py +116 -0
- diracx-0.0.1a46/diracx-routers/tests/auth/test_legacy_exchange.py +202 -0
- diracx-0.0.1a46/diracx-routers/tests/auth/test_standard.py +1399 -0
- diracx-0.0.1a46/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +1 -0
- diracx-0.0.1a46/diracx-routers/tests/health/test_probes.py +98 -0
- diracx-0.0.1a46/diracx-routers/tests/jobs/conftest.py +99 -0
- diracx-0.0.1a46/diracx-routers/tests/jobs/test_query.py +861 -0
- diracx-0.0.1a46/diracx-routers/tests/jobs/test_sandboxes.py +306 -0
- diracx-0.0.1a46/diracx-routers/tests/jobs/test_status.py +1138 -0
- diracx-0.0.1a46/diracx-routers/tests/jobs/test_wms_access_policy.py +359 -0
- diracx-0.0.1a46/diracx-routers/tests/test_config_manager.py +116 -0
- diracx-0.0.1a46/diracx-routers/tests/test_generic.py +73 -0
- diracx-0.0.1a46/diracx-routers/tests/test_policy.py +50 -0
- diracx-0.0.1a46/diracx-testing/README.md +0 -0
- diracx-0.0.1a46/diracx-testing/pyproject.toml +42 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/__init__.py +45 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/__main__.py +67 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/client_generation.py +231 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/client_generation_pytest.py +37 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/dummy_osdb.py +30 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/entrypoints.py +69 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/mock_osdb.py +168 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/osdb.py +101 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/routers.py +36 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +147 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/time.py +135 -0
- diracx-0.0.1a46/diracx-testing/src/diracx/testing/utils.py +703 -0
- diracx-0.0.1a46/docs/SECURITY.md +7 -0
- diracx-0.0.1a46/docs/admin/explanations/authentication.md +3 -0
- diracx-0.0.1a46/docs/admin/explanations/configuration.md +32 -0
- diracx-0.0.1a46/docs/admin/explanations/opentelemetry.md +11 -0
- diracx-0.0.1a46/docs/admin/explanations/user-management.md +4 -0
- diracx-0.0.1a46/docs/admin/how-to/convert-cs.md +40 -0
- diracx-0.0.1a46/docs/admin/how-to/register-a-vo.md +83 -0
- diracx-0.0.1a46/docs/admin/how-to/register-the-admin-vo.md +96 -0
- diracx-0.0.1a46/docs/admin/reference/security_model.md +288 -0
- diracx-0.0.1a46/docs/admin/reference/settings-and-preferences.md +0 -0
- diracx-0.0.1a46/docs/admin/tutorials/authentication.md +5 -0
- diracx-0.0.1a46/docs/assets/css/extra.css +54 -0
- diracx-0.0.1a46/docs/assets/css/fontawesome-all.min.css +101 -0
- diracx-0.0.1a46/docs/assets/css/images/arrow.svg +5 -0
- diracx-0.0.1a46/docs/assets/css/images/overlay.png +0 -0
- diracx-0.0.1a46/docs/assets/css/main.css +3378 -0
- diracx-0.0.1a46/docs/assets/home.html +146 -0
- diracx-0.0.1a46/docs/assets/images/diracx-logo-square.svg +279 -0
- diracx-0.0.1a46/docs/assets/images/logo.svg +273 -0
- diracx-0.0.1a46/docs/assets/images/pic02.jpg +0 -0
- diracx-0.0.1a46/docs/assets/styles/extra.css +13 -0
- diracx-0.0.1a46/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
- diracx-0.0.1a46/docs/assets/webfonts/fa-solid-900.woff +0 -0
- diracx-0.0.1a46/docs/dev/explanations/client.md +73 -0
- diracx-0.0.1a46/docs/dev/explanations/components/api.md +34 -0
- diracx-0.0.1a46/docs/dev/explanations/components/cli.md +63 -0
- diracx-0.0.1a46/docs/dev/explanations/components/db.md +56 -0
- diracx-0.0.1a46/docs/dev/explanations/components/index.md +136 -0
- diracx-0.0.1a46/docs/dev/explanations/components/routes.md +205 -0
- diracx-0.0.1a46/docs/dev/explanations/designing-functionality.md +1 -0
- diracx-0.0.1a46/docs/dev/explanations/extensions.md +5 -0
- diracx-0.0.1a46/docs/dev/explanations/index.md +0 -0
- diracx-0.0.1a46/docs/dev/explanations/testing.md +13 -0
- diracx-0.0.1a46/docs/dev/how-to/add-a-db.md +13 -0
- diracx-0.0.1a46/docs/dev/how-to/add-a-route.md +28 -0
- diracx-0.0.1a46/docs/dev/how-to/add-a-setting.md +6 -0
- diracx-0.0.1a46/docs/dev/how-to/add-a-test.md +4 -0
- diracx-0.0.1a46/docs/dev/how-to/client-customization.md +18 -0
- diracx-0.0.1a46/docs/dev/how-to/client-generation.md +2 -0
- diracx-0.0.1a46/docs/dev/how-to/extend-diracx/index.md +3 -0
- diracx-0.0.1a46/docs/dev/reference/application-state.md +11 -0
- diracx-0.0.1a46/docs/dev/reference/client-metapathfinder.md +0 -0
- diracx-0.0.1a46/docs/dev/reference/coding-conventions.md +131 -0
- diracx-0.0.1a46/docs/dev/reference/configuration.md +5 -0
- diracx-0.0.1a46/docs/dev/reference/db-transaction-model.md +0 -0
- diracx-0.0.1a46/docs/dev/reference/dependency-injection.md +16 -0
- diracx-0.0.1a46/docs/dev/reference/entrypoints.md +3 -0
- diracx-0.0.1a46/docs/dev/reference/security-policies.md +3 -0
- diracx-0.0.1a46/docs/dev/reference/security-properties.md +3 -0
- diracx-0.0.1a46/docs/dev/tutorials/advanced-tutorial.md +8 -0
- diracx-0.0.1a46/docs/dev/tutorials/getting-started.md +67 -0
- diracx-0.0.1a46/docs/dev/tutorials/making-changes.md +18 -0
- diracx-0.0.1a46/docs/dev/tutorials/run-locally.md +32 -0
- diracx-0.0.1a46/docs/dev/tutorials/write-docs.md +6 -0
- diracx-0.0.1a46/docs/index.md +45 -0
- diracx-0.0.1a46/docs/project/consortium.md +24 -0
- diracx-0.0.1a46/docs/project/index.md +3 -0
- diracx-0.0.1a46/docs/roadmap.md +79 -0
- diracx-0.0.1a46/docs/user/reference/client-configuration.md +14 -0
- diracx-0.0.1a46/extensions/README.md +217 -0
- diracx-0.0.1a46/extensions/containers/client/Dockerfile +13 -0
- diracx-0.0.1a46/extensions/containers/services/Dockerfile +15 -0
- diracx-0.0.1a46/extensions/gubbins/.github/workflows/main.yml +69 -0
- diracx-0.0.1a46/extensions/gubbins/README.md +6 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-api/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-api/pyproject.toml +47 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +2 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/pyproject.toml +54 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +20 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +38 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +62 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/pyproject.toml +51 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +9 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +27 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +102 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +36 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +28 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +2184 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +4 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +2030 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +49 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +55 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +27 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +104 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +36 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +25 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +55 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +31 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +2382 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +26 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +107 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +71 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +1306 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +31 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +2968 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +20 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +16 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +4 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +16 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +102 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/pyproject.toml +57 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +30 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +6 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +5 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/tests/test_config.py +38 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-core/tests/test_properties.py +9 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/pyproject.toml +55 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +6 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +6 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +60 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +19 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +59 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +21 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +57 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +85 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/pyproject.toml +49 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +28 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +23 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +2 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/pyproject.toml +69 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +14 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +2 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +43 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +57 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +28 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +1 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +113 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +34 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +37 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-testing/README.md +0 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-testing/pyproject.toml +31 -0
- diracx-0.0.1a46/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +1 -0
- diracx-0.0.1a46/extensions/gubbins/pixi.toml +91 -0
- diracx-0.0.1a46/extensions/gubbins/pyproject.toml +134 -0
- diracx-0.0.1a46/extensions/gubbins/release.notes +2 -0
- diracx-0.0.1a46/extensions/gubbins_values.yaml +16 -0
- diracx-0.0.1a46/mkdocs.yml +144 -0
- diracx-0.0.1a46/pixi.toml +169 -0
- {diracx-0.0.1a44 → diracx-0.0.1a46}/pyproject.toml +34 -13
- diracx-0.0.1a46/release.notes +2 -0
- diracx-0.0.1a46/release.notes.new +30 -0
- diracx-0.0.1a46/release.notes.old +2 -0
- diracx-0.0.1a46/run_local.sh +95 -0
- diracx-0.0.1a46/tests/__init__.py +0 -0
- diracx-0.0.1a46/tests/make_token_local.py +56 -0
- diracx-0.0.1a46/tests/test_generic.py +8 -0
- diracx-0.0.1a44/diracx.egg-info/SOURCES.txt +0 -3
- diracx-0.0.1a44/setup.cfg +0 -4
- {diracx-0.0.1a44 → diracx-0.0.1a46}/LICENSE +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
[run]
|
|
2
|
+
omit =
|
|
3
|
+
tests/*
|
|
4
|
+
*/tests/*
|
|
5
|
+
**/diracx/client/_generated/*
|
|
6
|
+
**/diracx/testing/*
|
|
7
|
+
**/gubbins/testing/*
|
|
8
|
+
**/gubbins/client/_generated/*
|
|
9
|
+
|
|
10
|
+
[paths]
|
|
11
|
+
source =
|
|
12
|
+
src/
|
|
13
|
+
*/src/
|
|
14
|
+
*/site-packages/
|
|
15
|
+
/diracx_source/*/src/
|
|
16
|
+
/diracx_source/*/*/src/
|
|
17
|
+
|
|
18
|
+
[report]
|
|
19
|
+
include_namespace_packages = true
|
|
20
|
+
exclude_lines =
|
|
21
|
+
# Have to re-enable the standard pragma
|
|
22
|
+
pragma: no cover
|
|
23
|
+
|
|
24
|
+
# Don't complain if tests don't hit defensive assertion code:
|
|
25
|
+
raise NotImplementedError
|
|
26
|
+
|
|
27
|
+
# Ignore the default implementation of abstract methods
|
|
28
|
+
^\s*\.\.\.$
|
|
29
|
+
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
omit =
|
|
32
|
+
**/diracx/client/*
|
|
33
|
+
**/diracx/testing/*
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
name: Deployment
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
schedule:
|
|
7
|
+
- cron: '0 10 * * *'
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
inputs:
|
|
10
|
+
check-ci:
|
|
11
|
+
description: "Require the CI to have passed for this commit"
|
|
12
|
+
required: true
|
|
13
|
+
default: "yes"
|
|
14
|
+
version:
|
|
15
|
+
description: "Override the release version number (e.g. 8.0.0a5)"
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
deploy-pypi:
|
|
19
|
+
name: PyPI deployment
|
|
20
|
+
runs-on: "ubuntu-latest"
|
|
21
|
+
if: github.event_name != 'push' || github.repository == 'DIRACGrid/diracx'
|
|
22
|
+
outputs:
|
|
23
|
+
new-version: ${{ steps.check-tag.outputs.new-version }}
|
|
24
|
+
create-release: ${{ steps.check-tag.outputs.create-release }}
|
|
25
|
+
permissions:
|
|
26
|
+
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing on pypi
|
|
27
|
+
actions: write
|
|
28
|
+
checks: write
|
|
29
|
+
contents: write
|
|
30
|
+
deployments: write
|
|
31
|
+
discussions: write
|
|
32
|
+
issues: write
|
|
33
|
+
packages: write
|
|
34
|
+
pages: write
|
|
35
|
+
pull-requests: write
|
|
36
|
+
repository-projects: write
|
|
37
|
+
security-events: write
|
|
38
|
+
statuses: write
|
|
39
|
+
defaults:
|
|
40
|
+
run:
|
|
41
|
+
# We need extglob for REFERENCE_BRANCH substitution
|
|
42
|
+
shell: bash -l -O extglob {0}
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
with:
|
|
46
|
+
token: ${{ github.token }}
|
|
47
|
+
- run: |
|
|
48
|
+
git fetch --prune --unshallow
|
|
49
|
+
git config --global user.email "ci@diracgrid.org"
|
|
50
|
+
git config --global user.name "DIRACGrid CI"
|
|
51
|
+
- uses: actions/setup-python@v5
|
|
52
|
+
with:
|
|
53
|
+
python-version: '3.11'
|
|
54
|
+
- name: Installing dependencies
|
|
55
|
+
run: |
|
|
56
|
+
python -m pip install \
|
|
57
|
+
build \
|
|
58
|
+
python-dateutil \
|
|
59
|
+
pytz \
|
|
60
|
+
readme_renderer[md] \
|
|
61
|
+
requests \
|
|
62
|
+
setuptools_scm
|
|
63
|
+
- name: Validate README for PyPI
|
|
64
|
+
run: |
|
|
65
|
+
python -m readme_renderer README.md -o /tmp/README.html
|
|
66
|
+
- name: Prepare release notes
|
|
67
|
+
run: |
|
|
68
|
+
set -xeuo pipefail
|
|
69
|
+
IFS=$'\n\t'
|
|
70
|
+
# Needed for the advanced pattern matching used in REFERENCE_BRANCH
|
|
71
|
+
PREV_VERSION=$(git describe --tags --abbrev=0)
|
|
72
|
+
# In case of manual trigger,
|
|
73
|
+
# GITHUB_REF is of the form refs/heads/main -> we want main
|
|
74
|
+
# In case of PR it is of the form refs/pull/59/merge -> we want pull/59/merge
|
|
75
|
+
REFERENCE_BRANCH=${GITHUB_REF##refs*(/heads)/}
|
|
76
|
+
echo "Making release notes for ${REFERENCE_BRANCH} since ${PREV_VERSION}"
|
|
77
|
+
(git log ${PREV_VERSION}...${REFERENCE_BRANCH} --oneline --no-merges --) > release.notes.new
|
|
78
|
+
cat release.notes.new
|
|
79
|
+
- name: Create tag if required
|
|
80
|
+
id: check-tag
|
|
81
|
+
run: |
|
|
82
|
+
set -xeuo pipefail
|
|
83
|
+
IFS=$'\n\t'
|
|
84
|
+
# Only do a real release for workflow_dispatch events
|
|
85
|
+
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
|
86
|
+
echo "Will create a real release"
|
|
87
|
+
export NEW_VERSION="v${{ github.event.inputs.version }}"
|
|
88
|
+
if [[ "${NEW_VERSION}" == "v" ]]; then
|
|
89
|
+
# If version wasn't given as an input to the workflow, use setuptools_scm to guess while removing "dev" portion of the version number
|
|
90
|
+
NEW_VERSION=v$(python -m setuptools_scm | sed 's@Guessed Version @@g' | sed -E 's@(\.dev|\+g).+@@g')
|
|
91
|
+
export NEW_VERSION
|
|
92
|
+
fi
|
|
93
|
+
echo "Release will be named $NEW_VERSION"
|
|
94
|
+
# Validate the version
|
|
95
|
+
# Ensure the version doesn't look like a PEP-440 "dev release" (which might happen if the automatic version bump has issues)
|
|
96
|
+
python -c $'from packaging.version import Version; v = Version('"'$NEW_VERSION'"$')\nif v.is_devrelease:\n raise ValueError(v)'
|
|
97
|
+
# Make sure we always only create pre-releases
|
|
98
|
+
python -c $'from packaging.version import Version; v = Version('"'$NEW_VERSION'"$')\nif not v.is_prerelease:\n raise ValueError("integration should only be used for pre-releases")'
|
|
99
|
+
# Commit the release notes
|
|
100
|
+
mv release.notes release.notes.old
|
|
101
|
+
cat release.notes.old
|
|
102
|
+
(echo -e "[${NEW_VERSION}]" && cat release.notes.new release.notes.old) > release.notes
|
|
103
|
+
###################3
|
|
104
|
+
# TODO: we should add the release notes somewhere at some point
|
|
105
|
+
# now we just don't do it because main branch is protected
|
|
106
|
+
# and we can't push directly from the CI
|
|
107
|
+
#git add release.notes
|
|
108
|
+
#git commit -m "docs: Add release notes for $NEW_VERSION"
|
|
109
|
+
# Stash is mandatory not to leave the repo dirty
|
|
110
|
+
git stash
|
|
111
|
+
########################
|
|
112
|
+
git show
|
|
113
|
+
# Create the tag
|
|
114
|
+
git tag "$NEW_VERSION"
|
|
115
|
+
echo "create-release=true" >> $GITHUB_OUTPUT
|
|
116
|
+
echo "new-version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
|
117
|
+
fi
|
|
118
|
+
- name: Build distributions
|
|
119
|
+
run: |
|
|
120
|
+
for pkg_dir in $PWD/diracx-*; do
|
|
121
|
+
echo "Building $pkg_dir"
|
|
122
|
+
python -m build --outdir $PWD/dist $pkg_dir
|
|
123
|
+
done
|
|
124
|
+
# Also build the diracx metapackage
|
|
125
|
+
python -m build --outdir $PWD/dist .
|
|
126
|
+
- name: 'Upload Artifact'
|
|
127
|
+
uses: actions/upload-artifact@v4
|
|
128
|
+
with:
|
|
129
|
+
name: diracx-whl
|
|
130
|
+
path: dist/diracx*.whl
|
|
131
|
+
retention-days: 5
|
|
132
|
+
- name: Make release on GitHub
|
|
133
|
+
if: steps.check-tag.outputs.create-release == 'true'
|
|
134
|
+
run: |
|
|
135
|
+
set -e
|
|
136
|
+
export NEW_VERSION=${{ steps.check-tag.outputs.new-version }}
|
|
137
|
+
REFERENCE_BRANCH=${GITHUB_REF##refs*(/heads)/}
|
|
138
|
+
echo "Pushing tagged release notes to ${REFERENCE_BRANCH}"
|
|
139
|
+
git push "origin" "${REFERENCE_BRANCH}"
|
|
140
|
+
echo "Making GitHub release for ${NEW_VERSION}"
|
|
141
|
+
.github/workflows/make_release.py \
|
|
142
|
+
--repo="${{ github.repository }}" \
|
|
143
|
+
--token="${{ secrets.GITHUB_TOKEN }}" \
|
|
144
|
+
--version="${NEW_VERSION}" \
|
|
145
|
+
--rev="$(git rev-parse HEAD)" \
|
|
146
|
+
--release-notes-fn="release.notes.new"
|
|
147
|
+
# Use trusted publisher for pypi
|
|
148
|
+
# https://docs.pypi.org/trusted-publishers/
|
|
149
|
+
- name: Publish package on PyPI
|
|
150
|
+
if: steps.check-tag.outputs.create-release == 'true'
|
|
151
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
152
|
+
|
|
153
|
+
docker:
|
|
154
|
+
needs: deploy-pypi
|
|
155
|
+
timeout-minutes: 30
|
|
156
|
+
runs-on: ubuntu-latest
|
|
157
|
+
steps:
|
|
158
|
+
- name: Checkout
|
|
159
|
+
uses: actions/checkout@v4
|
|
160
|
+
- name: Set up QEMU
|
|
161
|
+
uses: docker/setup-qemu-action@v3
|
|
162
|
+
- name: Set up Docker Buildx
|
|
163
|
+
uses: docker/setup-buildx-action@v3
|
|
164
|
+
- name: Login to GitHub container registry
|
|
165
|
+
uses: docker/login-action@v3
|
|
166
|
+
with:
|
|
167
|
+
registry: ghcr.io
|
|
168
|
+
username: ${{ github.actor }}
|
|
169
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
170
|
+
- name: Download diracx wheels
|
|
171
|
+
uses: actions/download-artifact@v4
|
|
172
|
+
with:
|
|
173
|
+
name: diracx-whl
|
|
174
|
+
- name: "Find wheels"
|
|
175
|
+
id: find_wheel
|
|
176
|
+
run: |
|
|
177
|
+
# We need to copy them there to be able to access them in the RUN --mount
|
|
178
|
+
cp diracx*.whl containers/client/
|
|
179
|
+
cp diracx*.whl containers/services/
|
|
180
|
+
for wheel_fn in *.whl; do
|
|
181
|
+
pkg_name=$(basename "${wheel_fn}" | cut -d '-' -f 1)
|
|
182
|
+
echo "${pkg_name}-wheel-name=$(ls "${pkg_name}"-*.whl)" >> $GITHUB_OUTPUT
|
|
183
|
+
done
|
|
184
|
+
|
|
185
|
+
- name: Build and push client (release)
|
|
186
|
+
uses: docker/build-push-action@v6
|
|
187
|
+
if: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
|
|
188
|
+
with:
|
|
189
|
+
context: containers/client/
|
|
190
|
+
push: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
|
|
191
|
+
tags: "ghcr.io/diracgrid/diracx/client:${{ needs.deploy-pypi.outputs.new-version }}"
|
|
192
|
+
platforms: linux/amd64,linux/arm64
|
|
193
|
+
build-args: EXTRA_PACKAGES_TO_INSTALL=DIRAC~=9.0.0a1
|
|
194
|
+
- name: Build and push services (release)
|
|
195
|
+
uses: docker/build-push-action@v6
|
|
196
|
+
if: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
|
|
197
|
+
with:
|
|
198
|
+
context: containers/services/
|
|
199
|
+
push: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
|
|
200
|
+
tags: "ghcr.io/diracgrid/diracx/services:${{ needs.deploy-pypi.outputs.new-version }}"
|
|
201
|
+
platforms: linux/amd64,linux/arm64
|
|
202
|
+
build-args: EXTRA_PACKAGES_TO_INSTALL=DIRAC~=9.0.0a1
|
|
203
|
+
|
|
204
|
+
- name: Build and push client (dev)
|
|
205
|
+
uses: docker/build-push-action@v6
|
|
206
|
+
with:
|
|
207
|
+
context: containers/client/
|
|
208
|
+
push: ${{ github.event_name != 'pull_request' && github.repository == 'DIRACGrid/diracx' && github.ref_name == 'main' }}
|
|
209
|
+
tags: ghcr.io/diracgrid/diracx/client:dev
|
|
210
|
+
platforms: linux/amd64,linux/arm64
|
|
211
|
+
build-args: |
|
|
212
|
+
EXTRA_PACKAGES_TO_INSTALL=git+https://github.com/DIRACGrid/DIRAC.git@integration
|
|
213
|
+
- name: Build and push services (dev)
|
|
214
|
+
uses: docker/build-push-action@v6
|
|
215
|
+
with:
|
|
216
|
+
context: containers/services/
|
|
217
|
+
push: ${{ github.event_name != 'pull_request' && github.repository == 'DIRACGrid/diracx' && github.ref_name == 'main' }}
|
|
218
|
+
tags: ghcr.io/diracgrid/diracx/services:dev
|
|
219
|
+
platforms: linux/amd64,linux/arm64
|
|
220
|
+
build-args: |
|
|
221
|
+
EXTRA_PACKAGES_TO_INSTALL=git+https://github.com/DIRACGrid/DIRAC.git@integration
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
name: Integration Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
defaults:
|
|
12
|
+
run:
|
|
13
|
+
shell: bash -el {0}
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
dirac-integration-tests:
|
|
17
|
+
name: DIRAC Integration tests
|
|
18
|
+
if: github.repository == 'DIRACGrid/diracx'
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
strategy:
|
|
21
|
+
fail-fast: false
|
|
22
|
+
matrix:
|
|
23
|
+
dirac-branch:
|
|
24
|
+
- integration
|
|
25
|
+
steps:
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: '3.11'
|
|
30
|
+
- name: Build wheels
|
|
31
|
+
run: |
|
|
32
|
+
pip install build
|
|
33
|
+
for pkg_dir in $PWD/diracx-* .; do
|
|
34
|
+
echo "Building $pkg_dir"
|
|
35
|
+
python -m build --outdir "${GITHUB_WORKSPACE}/dist" $pkg_dir
|
|
36
|
+
done
|
|
37
|
+
- name: Clone DIRAC
|
|
38
|
+
run: |
|
|
39
|
+
pip install typer pyyaml gitpython packaging
|
|
40
|
+
git clone https://github.com/DIRACGrid/DIRAC.git -b "${{ matrix.dirac-branch }}" /tmp/DIRACRepo
|
|
41
|
+
echo "Current revision: $(git -C /tmp/DIRACRepo rev-parse HEAD)"
|
|
42
|
+
# We need to cd in the directory for the integration_tests.py to work
|
|
43
|
+
- name: Prepare environment
|
|
44
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py prepare-environment "TEST_DIRACX=Yes" --diracx-dist-dir "${GITHUB_WORKSPACE}/dist"
|
|
45
|
+
- name: Install server
|
|
46
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py install-server
|
|
47
|
+
- name: Install client
|
|
48
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py install-client
|
|
49
|
+
- name: Install pilot
|
|
50
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py install-pilot
|
|
51
|
+
- name: Server tests
|
|
52
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py test-server || touch server-tests-failed
|
|
53
|
+
- name: Client tests
|
|
54
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py test-client || touch client-tests-failed
|
|
55
|
+
- name: Pilot tests
|
|
56
|
+
run: cd /tmp/DIRACRepo && ./integration_tests.py test-pilot || touch pilot-tests-failed
|
|
57
|
+
- name: Check test status
|
|
58
|
+
run: |
|
|
59
|
+
has_error=0
|
|
60
|
+
# TODO: set has_error=1 when we are ready to really run the tests
|
|
61
|
+
if [ -f server-tests-failed ]; then has_error=0; echo "Server tests failed"; fi
|
|
62
|
+
if [ -f client-tests-failed ]; then has_error=0; echo "Client tests failed"; fi
|
|
63
|
+
if [ -f pilot-tests-failed ]; then has_error=0; echo "Pilot tests failed"; fi
|
|
64
|
+
if [ ${has_error} = 1 ]; then exit 1; fi
|
|
65
|
+
- name: diracx logs
|
|
66
|
+
if: ${{ failure() }}
|
|
67
|
+
run: |
|
|
68
|
+
mkdir -p /tmp/service-logs
|
|
69
|
+
docker logs diracx 2>&1 | tee /tmp/service-logs/diracx.log
|
|
70
|
+
cd /tmp/DIRACRepo
|
|
71
|
+
./integration_tests.py logs --no-follow --lines 1000 2>&1 | tee /tmp/service-logs/dirac.log
|
|
72
|
+
- uses: actions/upload-artifact@v4
|
|
73
|
+
if: ${{ failure() }}
|
|
74
|
+
with:
|
|
75
|
+
name: service-logs-${{ github.job }}
|
|
76
|
+
path: /tmp/service-logs/
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
name: Basic Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
|
|
17
|
+
shellcheck:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@v4
|
|
22
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
23
|
+
with:
|
|
24
|
+
run-install: false
|
|
25
|
+
post-cleanup: false
|
|
26
|
+
- name: Apply workarounds
|
|
27
|
+
run: |
|
|
28
|
+
# Workaround for https://github.com/prefix-dev/pixi/issues/3762
|
|
29
|
+
sed -i.bak 's@editable = true@editable = false@g' pixi.toml
|
|
30
|
+
rm pixi.toml.bak
|
|
31
|
+
# Add annotations to github actions
|
|
32
|
+
pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
|
|
33
|
+
# Show any changes
|
|
34
|
+
git diff
|
|
35
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
36
|
+
with:
|
|
37
|
+
cache: false
|
|
38
|
+
environments: shellcheck
|
|
39
|
+
- name: Run shellcheck
|
|
40
|
+
run: pixi run shellcheck
|
|
41
|
+
|
|
42
|
+
unittest:
|
|
43
|
+
name: Unit test - ${{ matrix.package }}
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
strategy:
|
|
46
|
+
fail-fast: false
|
|
47
|
+
matrix:
|
|
48
|
+
package:
|
|
49
|
+
- diracx-core
|
|
50
|
+
- diracx-db
|
|
51
|
+
- diracx-logic
|
|
52
|
+
- diracx-routers
|
|
53
|
+
- diracx-client
|
|
54
|
+
- diracx-api
|
|
55
|
+
- diracx-cli
|
|
56
|
+
- gubbins-core
|
|
57
|
+
- gubbins-db
|
|
58
|
+
- gubbins-logic
|
|
59
|
+
- gubbins-routers
|
|
60
|
+
- gubbins-client
|
|
61
|
+
- gubbins-api
|
|
62
|
+
- gubbins-cli
|
|
63
|
+
steps:
|
|
64
|
+
- name: Checkout code
|
|
65
|
+
uses: actions/checkout@v4
|
|
66
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
67
|
+
with:
|
|
68
|
+
run-install: false
|
|
69
|
+
post-cleanup: false
|
|
70
|
+
- name: Apply workarounds
|
|
71
|
+
run: |
|
|
72
|
+
# Workaround for https://github.com/prefix-dev/pixi/issues/3762
|
|
73
|
+
sed -i.bak 's@editable = true@editable = false@g' pixi.toml
|
|
74
|
+
rm pixi.toml.bak
|
|
75
|
+
# Add annotations to github actions
|
|
76
|
+
pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
|
|
77
|
+
# Show any changes
|
|
78
|
+
git diff
|
|
79
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
80
|
+
with:
|
|
81
|
+
cache: false
|
|
82
|
+
environments: ${{ matrix.package }}
|
|
83
|
+
- name: Run pytest
|
|
84
|
+
run: pixi run pytest-${{ matrix.package }} --cov-report=xml:coverage.xml --junitxml=report.xml
|
|
85
|
+
- name: Upload coverage report
|
|
86
|
+
uses: codecov/codecov-action@v5.4.3
|
|
87
|
+
|
|
88
|
+
pytest-integration:
|
|
89
|
+
runs-on: ubuntu-latest
|
|
90
|
+
strategy:
|
|
91
|
+
fail-fast: false
|
|
92
|
+
matrix:
|
|
93
|
+
extension:
|
|
94
|
+
- diracx
|
|
95
|
+
- gubbins
|
|
96
|
+
steps:
|
|
97
|
+
- name: Checkout code
|
|
98
|
+
uses: actions/checkout@v4
|
|
99
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
100
|
+
with:
|
|
101
|
+
run-install: false
|
|
102
|
+
post-cleanup: false
|
|
103
|
+
- name: Apply workarounds
|
|
104
|
+
run: |
|
|
105
|
+
# Workaround for https://github.com/prefix-dev/pixi/issues/3762
|
|
106
|
+
sed -i.bak 's@editable = true@editable = false@g' pixi.toml
|
|
107
|
+
rm pixi.toml.bak
|
|
108
|
+
# Add annotations to github actions
|
|
109
|
+
pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
|
|
110
|
+
# Show any changes
|
|
111
|
+
git diff
|
|
112
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
113
|
+
with:
|
|
114
|
+
cache: false
|
|
115
|
+
environments: ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }}
|
|
116
|
+
- name: Build gubbins wheels
|
|
117
|
+
if: ${{ matrix.extension == 'gubbins' }}
|
|
118
|
+
run: |
|
|
119
|
+
for pkg_dir in $PWD/diracx-*; do
|
|
120
|
+
echo "Building $pkg_dir"
|
|
121
|
+
pixi exec python-build --outdir $PWD/extensions/containers/services/ $pkg_dir
|
|
122
|
+
done
|
|
123
|
+
# Also build the diracx metapackage
|
|
124
|
+
pixi exec python-build --outdir $PWD/extensions/containers/services/ .
|
|
125
|
+
# And build the gubbins package
|
|
126
|
+
for pkg_dir in $PWD/extensions/gubbins/gubbins-*; do
|
|
127
|
+
# Skip the testing package
|
|
128
|
+
if [[ "${pkg_dir}" =~ .*testing.* ]];
|
|
129
|
+
then
|
|
130
|
+
echo "Do not build ${pkg_dir}";
|
|
131
|
+
continue;
|
|
132
|
+
fi
|
|
133
|
+
echo "Building $pkg_dir"
|
|
134
|
+
pixi exec python-build --outdir $PWD/extensions/containers/services/ $pkg_dir
|
|
135
|
+
done
|
|
136
|
+
- name: Set up Docker Buildx
|
|
137
|
+
if: ${{ matrix.extension == 'gubbins' }}
|
|
138
|
+
uses: docker/setup-buildx-action@v3
|
|
139
|
+
- name: Build container for gubbins
|
|
140
|
+
if: ${{ matrix.extension == 'gubbins' }}
|
|
141
|
+
uses: docker/build-push-action@v6
|
|
142
|
+
with:
|
|
143
|
+
context: extensions/containers/services
|
|
144
|
+
tags: gubbins/services:dev
|
|
145
|
+
outputs: type=docker,dest=/tmp/gubbins_services_image.tar
|
|
146
|
+
build-args: |
|
|
147
|
+
EXTENSION_CUSTOM_SOURCES_TO_INSTALL=/bindmount/gubbins_db*.whl,/bindmount/gubbins_logic*.whl,/bindmount/gubbins_routers*.whl,/bindmount/gubbins_client*.whl
|
|
148
|
+
- name: Load image
|
|
149
|
+
if: ${{ matrix.extension == 'gubbins' }}
|
|
150
|
+
run: |
|
|
151
|
+
docker load --input /tmp/gubbins_services_image.tar
|
|
152
|
+
docker image ls -a
|
|
153
|
+
- name: Start demo
|
|
154
|
+
run: |
|
|
155
|
+
git clone https://github.com/DIRACGrid/diracx-charts.git ../diracx-charts
|
|
156
|
+
|
|
157
|
+
declare -a demo_args=()
|
|
158
|
+
demo_args+=("--enable-open-telemetry")
|
|
159
|
+
demo_args+=("--enable-coverage")
|
|
160
|
+
demo_args+=("--exit-when-done")
|
|
161
|
+
demo_args+=("--set-value" "developer.autoReload=false")
|
|
162
|
+
demo_args+=("--ci-values" "../diracx-charts/demo/ci_values.yaml")
|
|
163
|
+
|
|
164
|
+
declare -a demo_source_dirs=("$PWD")
|
|
165
|
+
|
|
166
|
+
if [ ${{ matrix.extension }} == 'gubbins' ]; then
|
|
167
|
+
# We have to copy the code to another directory
|
|
168
|
+
# and make it a git repository by itself because otherwise the
|
|
169
|
+
# root in the pyproject to do not make sense once mounted
|
|
170
|
+
# in the containers.
|
|
171
|
+
cp -r ./extensions/gubbins /tmp/
|
|
172
|
+
sed -i 's@../..@.@g' /tmp/gubbins/pyproject.toml
|
|
173
|
+
sed -i 's@../../@@g' /tmp/gubbins/gubbins-*/pyproject.toml
|
|
174
|
+
git init /tmp/gubbins/
|
|
175
|
+
|
|
176
|
+
demo_args+=("--ci-values" "./extensions/gubbins_values.yaml")
|
|
177
|
+
demo_args+=("--load-docker-image" "gubbins/services:dev")
|
|
178
|
+
demo_source_dirs+=("/tmp/gubbins/")
|
|
179
|
+
elif [ ${{ matrix.extension }} != 'diracx' ]; then
|
|
180
|
+
echo "Unknown extension: ${{ matrix.extension }}"
|
|
181
|
+
exit 1
|
|
182
|
+
fi
|
|
183
|
+
|
|
184
|
+
# Run the demo with the provided arguments
|
|
185
|
+
set -x
|
|
186
|
+
../diracx-charts/run_demo.sh "${demo_args[@]}" "${demo_source_dirs[@]}"
|
|
187
|
+
- name: Debugging information
|
|
188
|
+
run: |
|
|
189
|
+
DIRACX_DEMO_DIR=$PWD/../diracx-charts/.demo
|
|
190
|
+
export KUBECONFIG=${DIRACX_DEMO_DIR}/kube.conf
|
|
191
|
+
export PATH=${DIRACX_DEMO_DIR}:$PATH
|
|
192
|
+
kubectl get pods
|
|
193
|
+
for pod_name in $(kubectl get pods -o json | jq -r '.items[] | .metadata.name' | grep -vE '(dex|minio|mysql|rabbitmq|opensearch)'); do
|
|
194
|
+
echo "${pod_name}"
|
|
195
|
+
kubectl describe pod/"${pod_name}" || true
|
|
196
|
+
for container_name in $(kubectl get pods $pod_name -o jsonpath='{.spec.initContainers[*].name} {.spec.containers[*].name}'); do
|
|
197
|
+
echo $pod_name $container_name
|
|
198
|
+
kubectl logs "${pod_name}" -c "${container_name}" || true
|
|
199
|
+
done
|
|
200
|
+
done
|
|
201
|
+
if [ ! -f "${DIRACX_DEMO_DIR}/.success" ]; then
|
|
202
|
+
cat "${DIRACX_DEMO_DIR}/.failed"
|
|
203
|
+
exit 1
|
|
204
|
+
fi
|
|
205
|
+
- name: Run pytest
|
|
206
|
+
run: |
|
|
207
|
+
pixi run pytest-${{ matrix.extension }} --demo-dir="$PWD/../diracx-charts/" --cov-report=xml:coverage-pytest.xml --junitxml=report.xml
|
|
208
|
+
- name: Collect demo coverage
|
|
209
|
+
run: |
|
|
210
|
+
pixi run -e ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }} python -m diracx.testing coverage collect-demo --demo-dir=../diracx-charts/.demo
|
|
211
|
+
- name: Upload coverage report
|
|
212
|
+
uses: codecov/codecov-action@v5.4.3
|
|
213
|
+
with:
|
|
214
|
+
files: ./coverage-pytest.xml,./coverage-demo.xml
|
|
215
|
+
|
|
216
|
+
client-generation:
|
|
217
|
+
runs-on: ubuntu-latest
|
|
218
|
+
strategy:
|
|
219
|
+
fail-fast: false
|
|
220
|
+
matrix:
|
|
221
|
+
package: [diracx, gubbins]
|
|
222
|
+
steps:
|
|
223
|
+
- name: Checkout code
|
|
224
|
+
uses: actions/checkout@v4
|
|
225
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
226
|
+
with:
|
|
227
|
+
run-install: false
|
|
228
|
+
post-cleanup: false
|
|
229
|
+
- name: Apply workarounds
|
|
230
|
+
run: |
|
|
231
|
+
# Add annotations to github actions
|
|
232
|
+
pixi add --no-install --pypi --feature diracx-core pytest-github-actions-annotate-failures
|
|
233
|
+
# Show any changes
|
|
234
|
+
git diff
|
|
235
|
+
- uses: prefix-dev/setup-pixi@v0.8.11
|
|
236
|
+
with:
|
|
237
|
+
cache: false
|
|
238
|
+
locked: false
|
|
239
|
+
environments: ${{ matrix.package }}-generate-client
|
|
240
|
+
- name: Run autorest
|
|
241
|
+
run: pixi run -e ${{ matrix.package }}-generate-client generate-client
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
from packaging.version import Version
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def make_release(version, commit_hash, release_notes=""):
|
|
12
|
+
"""Create a new GitHub release using the given data.
|
|
13
|
+
|
|
14
|
+
This function always makes a pre-release first to ensure the "latest" release never corresponds
|
|
15
|
+
to one without artifacts uploaded. If the new version number is not a pre-release, as
|
|
16
|
+
determined by PEP-440, it is promoted to at full release after the uploads have completed
|
|
17
|
+
successfully.
|
|
18
|
+
|
|
19
|
+
:param str version: The version of the new release
|
|
20
|
+
:param str commit_hash: Git revision used for the release
|
|
21
|
+
:param str release_notes: Release notes
|
|
22
|
+
"""
|
|
23
|
+
# Create a draft release
|
|
24
|
+
r = requests.post(
|
|
25
|
+
f"{api_root}/releases",
|
|
26
|
+
json={
|
|
27
|
+
"tag_name": version,
|
|
28
|
+
"target_commitish": commit_hash,
|
|
29
|
+
"body": release_notes,
|
|
30
|
+
"draft": True,
|
|
31
|
+
"prerelease": Version(version).is_prerelease,
|
|
32
|
+
},
|
|
33
|
+
headers=headers,
|
|
34
|
+
timeout=60,
|
|
35
|
+
)
|
|
36
|
+
r.raise_for_status()
|
|
37
|
+
release_data = r.json()
|
|
38
|
+
print(f"Created draft release at: {release_data['html_url']}")
|
|
39
|
+
|
|
40
|
+
# Publish the release
|
|
41
|
+
r = requests.patch(
|
|
42
|
+
release_data["url"],
|
|
43
|
+
json={
|
|
44
|
+
"draft": False,
|
|
45
|
+
},
|
|
46
|
+
headers=headers,
|
|
47
|
+
timeout=60,
|
|
48
|
+
)
|
|
49
|
+
r.raise_for_status()
|
|
50
|
+
release_data = r.json()
|
|
51
|
+
print(f"Published release at: {release_data['html_url']}")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if __name__ == "__main__":
|
|
55
|
+
parser = argparse.ArgumentParser()
|
|
56
|
+
parser.add_argument("--token", required=True)
|
|
57
|
+
parser.add_argument("--repo", default="DIRACGrid/DIRAC")
|
|
58
|
+
parser.add_argument("--version", required=True)
|
|
59
|
+
parser.add_argument("--rev", required=True)
|
|
60
|
+
parser.add_argument("--release-notes-fn", required=True)
|
|
61
|
+
args = parser.parse_args()
|
|
62
|
+
|
|
63
|
+
token = args.token
|
|
64
|
+
headers = {
|
|
65
|
+
"Accept": "application/vnd.github.v3+json",
|
|
66
|
+
"Authorization": f"token {token}",
|
|
67
|
+
}
|
|
68
|
+
api_root = f"https://api.github.com/repos/{args.repo}"
|
|
69
|
+
release_notes = Path(args.release_notes_fn).read_text()
|
|
70
|
+
|
|
71
|
+
if not args.version.startswith("v"):
|
|
72
|
+
raise ValueError('For consistency versions must start with "v"')
|
|
73
|
+
|
|
74
|
+
make_release(args.version, args.rev, release_notes=release_notes)
|