Packaging and versioning
DiracX is a Python package composed of several interconnected submodules. It's designed to provide robust and versatile functionalities, primarily through these key components:
-
User-Facing Components:
diracx: This is the primary interface for users, integrating both the Command Line Interface (CLI) and Python API.diracx-routers: Serves as the server component, offering HTTPS endpoints.diracx-tasks: Handles operations executed by DiracX servers, either periodically or upon request.
-
Containerization:
- Each component is available as a container image, packaging DiracX along with all necessary dependencies.
Python Modules
DiracX is structured into various modules, each serving a distinct purpose:
diracx-core: The foundational code base, utilized by all other DiracX modules.diracx-db: Data Access Layer, focuses on database functionalities.diracx-logic: Business Logic Layer, comprises Dirac logic.diracx-routers: Presentation Layer, handles user interactions through HTTP using a FastAPI application.diracx-client: A client auto-generated from the OpenAPI specification indiracx-routers.diracx-api: Provides higher-level operations building ondiracx-client.diracx-cli: The command line interface (dirac).diracx: A metapackage offeringdiracx-client,diracx-api, anddiracx-cli.
These modules are each implemented as a native Python namespace package.
The direct dependencies between the submodules are as follows:
---
config:
layout: elk
---
flowchart BT
subgraph frontend["Frontend"]
client["diracx-client (autorest)"]
api["diracx-api"]
cli["diracx-cli (typer)"]
end
subgraph backend["Backend"]
dbs["diracx-db (sqlalchemy/os)"]
logic["diracx-logic (Dirac)"]
routers["diracx-routers (FastAPI)"]
end
dbs -. uses .-> core["diracx-core (domain)"]
logic -. uses .-> core
routers -. uses .-> core
tasks["diracx-tasks (celery?)"] -. uses .-> core
client -. uses .-> core
api -. uses .-> core
cli -. uses .-> core
logic -- calls --> dbs
routers -- calls --> logic
tasks -- calls --> logic & api
client -- calls through OpenAPI --> routers
api -- calls --> client
cli -- calls --> api & client
client:::Sky
api:::Sky
cli:::Sky
dbs:::Pine
logic:::Pine
routers:::Pine
tasks:::Aqua
classDef Rose stroke-width:1px, stroke-dasharray:none, stroke:#FF5978, fill:#FFDFE5, color:#8E2236
classDef Sky stroke-width:1px, stroke-dasharray:none, stroke:#374D7C, fill:#E2EBFF, color:#374D7C
classDef Pine stroke-width:1px, stroke-dasharray:none, stroke:#254336, fill:#27654A, color:#FFFFFF
classDef Aqua stroke-width:1px, stroke-dasharray:none, stroke:#46EDC8, fill:#DEFFF8, color:#378E7A
Versioning Strategy
- Currently, and as long as
DIRACanddiracxcoexist, we employ a versioning format of v0.. . - We only support using the same version across all
diracx-*packages. - The client and server versions can vary, but the client version is always communicated to the server. Incompatibly old client versions may lead to request rejections, prompting a client update.
Container Images
DiracX utilizes a structured approach to containerization:
-
Base Image:
- All container images start from
diracx/base.
- All container images start from
-
Specialized Base Images:
diracx/services-basediracx/tasks-basediracx/client-base
-
Image Versioning and Building:
- Images are built periodically (e.g., every Monday) and tagged as
YYYY.MM.DD.P. - A DiracX release triggers the creation of new
DiracXService,diracx/tasks, anddiracx/clientimages, based on specificdiracx/basetags. - This approach ensures stability in production environments.
- For testing purposes, the
latestbase images are used, with dependencies installed viapip install.
- Images are built periodically (e.g., every Monday) and tagged as
See this diagram for an example of how this looks in practice:
┌──────────────────────────┐
┌─────┤ diracx/base:YYYY.MM.DD.P ├─────┐
│ └──────────────────────────┘ │
│ │
┌────────────────▼──────────────────┐ ┌────────────────▼───────────────┐
│ diracx/services-base:YYYY.MM.DD.P │ │ diracx/tasks-base:YYYY.MM.DD.P │
└────────────────┬──────────────────┘ └────────────────┬───────────────┘
│ │
┌───────────▼────────────┐ ┌──────────▼──────────┐
│ diracx/services:v0.X.Y │ │ diracx/tasks:v0.X.Y │
└────────────────────────┘ └─────────────────────┘
Dependencies
- There is a noted duplication between
setup.cfgandenvironment.yaml. - The
diracx/baseimage is built from a Dockerfile withenvironment.yml, primarily defining the Python version anddirac_environment.yamlcontaining the DIRAC specific dependencies. The latter is there as a "temporary" thing. - The
diracx/services-baseanddiracx/tasks-baseimages extenddiracx/basewith additional Dockerfiles andenvironment.yml, tailored to their specific needs. - The
diracx/servicesanddiracx/tasksimages are further built upon their respective base images, adding necessary diracx packages throughpip install --no-dependencies.
Entrypoint
TODO: document the entry point
diracx-routers:diracx.diracx_min_client_versionentry-point defines the diracx minimum client version required by the server to prevent issues. This also searches for extension names instead ofdiracx. The minimum version number has to be updated indiracx-routers/src/__init.py__
Extensions
- Extensions will extend one or more of
diracx,diracx-routers,diracx-tasksimages (e.g.lhcbdiracx,lhcbdiracx-routers,lhcbdiracx-tasks). - Extensions provide a corresponding container image based on a specific release of the corresponding DiracX image.