Metadata-Version: 2.4
Name: dkist-processing-ops
Version: 1.10.18rc1
Summary: Automated Processing smoke test and operations workflows
Author-email: NSO / AURA <dkistdc@nso.edu>
License: BSD 3-Clause
Project-URL: repository, https://bitbucket.org/dkistdc/dkist-processing-ops
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.13
Description-Content-Type: text/x-rst
License-File: LICENSE.rst
Requires-Dist: dkist-processing-common==14.3.0rc1
Requires-Dist: dkist-service-configuration==4.3.0
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-cov; extra == "test"
Requires-Dist: pytest-xdist; extra == "test"
Provides-Extra: frozen
Requires-Dist: Deprecated==1.3.1; extra == "frozen"
Requires-Dist: ImageIO==2.37.3; extra == "frozen"
Requires-Dist: Jinja2==3.1.6; extra == "frozen"
Requires-Dist: Mako==1.3.12; extra == "frozen"
Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
Requires-Dist: PyJWT==2.12.1; extra == "frozen"
Requires-Dist: PyYAML==6.0.3; extra == "frozen"
Requires-Dist: PyYAML-ft==8.0.0; extra == "frozen"
Requires-Dist: Pygments==2.20.0; extra == "frozen"
Requires-Dist: SQLAlchemy==2.0.49; extra == "frozen"
Requires-Dist: Send2Trash==2.1.0; extra == "frozen"
Requires-Dist: a2wsgi==1.10.10; extra == "frozen"
Requires-Dist: aioftp==0.27.2; extra == "frozen"
Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
Requires-Dist: aiohttp==3.13.5; extra == "frozen"
Requires-Dist: aiosignal==1.4.0; extra == "frozen"
Requires-Dist: aiosmtplib==5.1.0; extra == "frozen"
Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
Requires-Dist: alembic==1.18.4; extra == "frozen"
Requires-Dist: amqp==5.3.1; extra == "frozen"
Requires-Dist: annotated-doc==0.0.4; extra == "frozen"
Requires-Dist: annotated-types==0.7.0; extra == "frozen"
Requires-Dist: anyio==4.13.0; extra == "frozen"
Requires-Dist: apache-airflow==3.2.1; extra == "frozen"
Requires-Dist: apache-airflow-core==3.2.1; extra == "frozen"
Requires-Dist: apache-airflow-providers-celery==3.19.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-compat==1.14.3; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-io==1.7.2; extra == "frozen"
Requires-Dist: apache-airflow-providers-common-sql==1.36.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-postgres==6.6.3; extra == "frozen"
Requires-Dist: apache-airflow-providers-smtp==3.0.0; extra == "frozen"
Requires-Dist: apache-airflow-providers-standard==1.13.0; extra == "frozen"
Requires-Dist: apache-airflow-task-sdk==1.2.1; extra == "frozen"
Requires-Dist: appnope==0.1.4; extra == "frozen"
Requires-Dist: argcomplete==3.6.3; extra == "frozen"
Requires-Dist: argon2-cffi==25.1.0; extra == "frozen"
Requires-Dist: argon2-cffi-bindings==25.1.0; extra == "frozen"
Requires-Dist: arrow==1.4.0; extra == "frozen"
Requires-Dist: asdf==3.5.0; extra == "frozen"
Requires-Dist: asdf_standard==1.5.0; extra == "frozen"
Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
Requires-Dist: asgiref==3.11.1; extra == "frozen"
Requires-Dist: asteval==1.0.8; extra == "frozen"
Requires-Dist: astropy==7.2.0; extra == "frozen"
Requires-Dist: astropy-iers-data==0.2026.5.18.1.11.28; extra == "frozen"
Requires-Dist: asttokens==3.0.1; extra == "frozen"
Requires-Dist: async-lru==2.3.0; extra == "frozen"
Requires-Dist: asyncpg==0.31.0; extra == "frozen"
Requires-Dist: attrs==26.1.0; extra == "frozen"
Requires-Dist: babel==2.18.0; extra == "frozen"
Requires-Dist: beautifulsoup4==4.14.3; extra == "frozen"
Requires-Dist: billiard==4.2.4; extra == "frozen"
Requires-Dist: bleach==6.3.0; extra == "frozen"
Requires-Dist: boto3==1.43.10; extra == "frozen"
Requires-Dist: botocore==1.43.10; extra == "frozen"
Requires-Dist: cadwyn==6.2.2; extra == "frozen"
Requires-Dist: celery==5.6.3; extra == "frozen"
Requires-Dist: certifi==2026.4.22; extra == "frozen"
Requires-Dist: cffi==2.0.0; extra == "frozen"
Requires-Dist: charset-normalizer==3.4.7; extra == "frozen"
Requires-Dist: click==8.4.0; extra == "frozen"
Requires-Dist: click-didyoumean==0.3.1; extra == "frozen"
Requires-Dist: click-plugins==1.1.1.2; extra == "frozen"
Requires-Dist: click-repl==0.3.0; extra == "frozen"
Requires-Dist: colorlog==6.10.1; extra == "frozen"
Requires-Dist: comm==0.2.3; extra == "frozen"
Requires-Dist: contourpy==1.3.3; extra == "frozen"
Requires-Dist: cron_descriptor==2.0.8; extra == "frozen"
Requires-Dist: croniter==6.2.2; extra == "frozen"
Requires-Dist: cryptography==48.0.0; extra == "frozen"
Requires-Dist: cycler==0.12.1; extra == "frozen"
Requires-Dist: debugpy==1.8.20; extra == "frozen"
Requires-Dist: decorator==5.3.1; extra == "frozen"
Requires-Dist: defusedxml==0.7.1; extra == "frozen"
Requires-Dist: dill==0.4.1; extra == "frozen"
Requires-Dist: dkist-header-validator==5.4.0; extra == "frozen"
Requires-Dist: dkist-processing-common==14.3.0rc1; extra == "frozen"
Requires-Dist: dkist-processing-core==7.3.0; extra == "frozen"
Requires-Dist: dkist-processing-ops==1.10.18rc1; extra == "frozen"
Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
Requires-Dist: dkist-spectral-lines==3.0.1; extra == "frozen"
Requires-Dist: dkist_fits_specifications==4.26.0; extra == "frozen"
Requires-Dist: dnspython==2.8.0; extra == "frozen"
Requires-Dist: email-validator==2.3.0; extra == "frozen"
Requires-Dist: executing==2.2.1; extra == "frozen"
Requires-Dist: fastapi==0.136.1; extra == "frozen"
Requires-Dist: fastapi-cli==0.0.24; extra == "frozen"
Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
Requires-Dist: flower==2.0.1; extra == "frozen"
Requires-Dist: fonttools==4.63.0; extra == "frozen"
Requires-Dist: fqdn==1.5.1; extra == "frozen"
Requires-Dist: frozenlist==1.8.0; extra == "frozen"
Requires-Dist: fsspec==2026.4.0; extra == "frozen"
Requires-Dist: globus-sdk==4.6.0; extra == "frozen"
Requires-Dist: googleapis-common-protos==1.75.0; extra == "frozen"
Requires-Dist: gqlclient==2.0.0; extra == "frozen"
Requires-Dist: greenback==1.3.0; extra == "frozen"
Requires-Dist: greenlet==3.5.0; extra == "frozen"
Requires-Dist: grpcio==1.80.0; extra == "frozen"
Requires-Dist: h11==0.16.0; extra == "frozen"
Requires-Dist: httpcore==1.0.9; extra == "frozen"
Requires-Dist: httptools==0.7.1; extra == "frozen"
Requires-Dist: httpx==0.28.1; extra == "frozen"
Requires-Dist: humanize==4.15.0; extra == "frozen"
Requires-Dist: idna==3.15; extra == "frozen"
Requires-Dist: imageio-ffmpeg==0.6.0; extra == "frozen"
Requires-Dist: importlib_metadata==8.7.1; extra == "frozen"
Requires-Dist: ipykernel==7.2.0; extra == "frozen"
Requires-Dist: ipython==9.13.0; extra == "frozen"
Requires-Dist: ipython_pygments_lexers==1.1.1; extra == "frozen"
Requires-Dist: isoduration==20.11.0; extra == "frozen"
Requires-Dist: itsdangerous==2.2.0; extra == "frozen"
Requires-Dist: jedi==0.20.0; extra == "frozen"
Requires-Dist: jmespath==1.1.0; extra == "frozen"
Requires-Dist: json5==0.14.0; extra == "frozen"
Requires-Dist: jsonpointer==3.1.1; extra == "frozen"
Requires-Dist: jsonschema==4.26.0; extra == "frozen"
Requires-Dist: jsonschema-specifications==2025.9.1; extra == "frozen"
Requires-Dist: jupyter-events==0.12.1; extra == "frozen"
Requires-Dist: jupyter-lsp==2.3.1; extra == "frozen"
Requires-Dist: jupyter_client==8.8.0; extra == "frozen"
Requires-Dist: jupyter_core==5.9.1; extra == "frozen"
Requires-Dist: jupyter_server==2.18.2; extra == "frozen"
Requires-Dist: jupyter_server_terminals==0.5.4; extra == "frozen"
Requires-Dist: jupyterlab==4.5.7; extra == "frozen"
Requires-Dist: jupyterlab_pygments==0.3.0; extra == "frozen"
Requires-Dist: jupyterlab_server==2.28.0; extra == "frozen"
Requires-Dist: kiwisolver==1.5.0; extra == "frozen"
Requires-Dist: kombu==5.6.2; extra == "frozen"
Requires-Dist: lark==1.3.1; extra == "frozen"
Requires-Dist: lazy-object-proxy==1.12.0; extra == "frozen"
Requires-Dist: libcst==1.8.6; extra == "frozen"
Requires-Dist: linkify-it-py==2.1.0; extra == "frozen"
Requires-Dist: lmfit==1.3.4; extra == "frozen"
Requires-Dist: lockfile==0.12.2; extra == "frozen"
Requires-Dist: loguru==0.7.3; extra == "frozen"
Requires-Dist: markdown-it-py==4.2.0; extra == "frozen"
Requires-Dist: matplotlib==3.10.9; extra == "frozen"
Requires-Dist: matplotlib-inline==0.2.2; extra == "frozen"
Requires-Dist: mdurl==0.1.2; extra == "frozen"
Requires-Dist: methodtools==0.4.7; extra == "frozen"
Requires-Dist: mistune==3.2.1; extra == "frozen"
Requires-Dist: more-itertools==11.0.2; extra == "frozen"
Requires-Dist: moviepy==2.2.1; extra == "frozen"
Requires-Dist: msgspec==0.21.1; extra == "frozen"
Requires-Dist: multidict==6.7.1; extra == "frozen"
Requires-Dist: natsort==8.4.0; extra == "frozen"
Requires-Dist: nbclient==0.10.4; extra == "frozen"
Requires-Dist: nbconvert==7.17.1; extra == "frozen"
Requires-Dist: nbformat==5.10.4; extra == "frozen"
Requires-Dist: nest-asyncio==1.6.0; extra == "frozen"
Requires-Dist: notebook==7.5.6; extra == "frozen"
Requires-Dist: notebook_shim==0.2.4; extra == "frozen"
Requires-Dist: numpy==2.4.5; extra == "frozen"
Requires-Dist: object-clerk==1.0.0; extra == "frozen"
Requires-Dist: opentelemetry-api==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-aiohttp-client==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-asgi==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-botocore==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-celery==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-dbapi==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-fastapi==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pika==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-psycopg2==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-pymongo==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-redis==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-requests==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-instrumentation-system-metrics==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-propagator-aws-xray==1.0.2; extra == "frozen"
Requires-Dist: opentelemetry-proto==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-sdk==1.41.1; extra == "frozen"
Requires-Dist: opentelemetry-semantic-conventions==0.62b1; extra == "frozen"
Requires-Dist: opentelemetry-util-http==0.62b1; extra == "frozen"
Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
Requires-Dist: packaging==26.2; extra == "frozen"
Requires-Dist: pandas==3.0.3; extra == "frozen"
Requires-Dist: pandocfilters==1.5.1; extra == "frozen"
Requires-Dist: parfive==2.3.1; extra == "frozen"
Requires-Dist: parso==0.8.7; extra == "frozen"
Requires-Dist: pathlib_abc==0.5.2; extra == "frozen"
Requires-Dist: pathspec==1.1.1; extra == "frozen"
Requires-Dist: pendulum==3.2.0; extra == "frozen"
Requires-Dist: pexpect==4.9.0; extra == "frozen"
Requires-Dist: pika==1.4.0; extra == "frozen"
Requires-Dist: pillow==11.3.0; extra == "frozen"
Requires-Dist: pip==26.1.1; extra == "frozen"
Requires-Dist: platformdirs==4.9.6; extra == "frozen"
Requires-Dist: pluggy==1.6.0; extra == "frozen"
Requires-Dist: pooch==1.9.0; extra == "frozen"
Requires-Dist: proglog==0.1.12; extra == "frozen"
Requires-Dist: prometheus_client==0.25.0; extra == "frozen"
Requires-Dist: prompt_toolkit==3.0.52; extra == "frozen"
Requires-Dist: propcache==0.5.2; extra == "frozen"
Requires-Dist: protobuf==6.33.6; extra == "frozen"
Requires-Dist: psutil==7.2.2; extra == "frozen"
Requires-Dist: psycopg2-binary==2.9.12; extra == "frozen"
Requires-Dist: ptyprocess==0.7.0; extra == "frozen"
Requires-Dist: pure_eval==0.2.3; extra == "frozen"
Requires-Dist: pycparser==3.0; extra == "frozen"
Requires-Dist: pydantic==2.13.4; extra == "frozen"
Requires-Dist: pydantic-extra-types==2.11.1; extra == "frozen"
Requires-Dist: pydantic-settings==2.14.1; extra == "frozen"
Requires-Dist: pydantic_core==2.46.4; extra == "frozen"
Requires-Dist: pyerfa==2.0.1.5; extra == "frozen"
Requires-Dist: pygtrie==2.5.0; extra == "frozen"
Requires-Dist: pyparsing==3.3.2; extra == "frozen"
Requires-Dist: python-daemon==3.1.2; extra == "frozen"
Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
Requires-Dist: python-dotenv==1.2.2; extra == "frozen"
Requires-Dist: python-json-logger==4.1.0; extra == "frozen"
Requires-Dist: python-multipart==0.0.29; extra == "frozen"
Requires-Dist: python-slugify==8.0.4; extra == "frozen"
Requires-Dist: pytz==2026.2; extra == "frozen"
Requires-Dist: pyzmq==27.1.0; extra == "frozen"
Requires-Dist: redis==6.4.0; extra == "frozen"
Requires-Dist: referencing==0.37.0; extra == "frozen"
Requires-Dist: requests==2.34.2; extra == "frozen"
Requires-Dist: rfc3339-validator==0.1.4; extra == "frozen"
Requires-Dist: rfc3986-validator==0.1.1; extra == "frozen"
Requires-Dist: rfc3987-syntax==1.1.0; extra == "frozen"
Requires-Dist: rich==15.0.0; extra == "frozen"
Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
Requires-Dist: rich-toolkit==0.19.9; extra == "frozen"
Requires-Dist: rpds-py==0.30.0; extra == "frozen"
Requires-Dist: s3transfer==0.17.0; extra == "frozen"
Requires-Dist: scipy==1.17.1; extra == "frozen"
Requires-Dist: semantic-version==2.10.0; extra == "frozen"
Requires-Dist: setproctitle==1.3.7; extra == "frozen"
Requires-Dist: setuptools==82.0.1; extra == "frozen"
Requires-Dist: shellingham==1.5.4; extra == "frozen"
Requires-Dist: six==1.17.0; extra == "frozen"
Requires-Dist: sniffio==1.3.1; extra == "frozen"
Requires-Dist: solar-wavelength-calibration==2.0.3; extra == "frozen"
Requires-Dist: soupsieve==2.8.3; extra == "frozen"
Requires-Dist: sqids==0.5.1; extra == "frozen"
Requires-Dist: sqlparse==0.5.5; extra == "frozen"
Requires-Dist: stack-data==0.6.3; extra == "frozen"
Requires-Dist: starlette==0.52.1; extra == "frozen"
Requires-Dist: structlog==25.5.0; extra == "frozen"
Requires-Dist: sunpy==7.1.2; extra == "frozen"
Requires-Dist: svcs==25.1.0; extra == "frozen"
Requires-Dist: tabulate==0.10.0; extra == "frozen"
Requires-Dist: talus==1.3.4; extra == "frozen"
Requires-Dist: tenacity==8.5.0; extra == "frozen"
Requires-Dist: termcolor==3.3.0; extra == "frozen"
Requires-Dist: terminado==0.18.1; extra == "frozen"
Requires-Dist: text-unidecode==1.3; extra == "frozen"
Requires-Dist: tinycss2==1.4.0; extra == "frozen"
Requires-Dist: tornado==6.5.5; extra == "frozen"
Requires-Dist: tqdm==4.67.3; extra == "frozen"
Requires-Dist: traitlets==5.15.0; extra == "frozen"
Requires-Dist: typer==0.25.1; extra == "frozen"
Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
Requires-Dist: tzdata==2026.2; extra == "frozen"
Requires-Dist: tzlocal==5.3.1; extra == "frozen"
Requires-Dist: uc-micro-py==2.0.0; extra == "frozen"
Requires-Dist: uncertainties==3.2.3; extra == "frozen"
Requires-Dist: universal_pathlib==0.3.10; extra == "frozen"
Requires-Dist: uri-template==1.3.0; extra == "frozen"
Requires-Dist: urllib3==2.7.0; extra == "frozen"
Requires-Dist: uuid6==2025.0.1; extra == "frozen"
Requires-Dist: uvicorn==0.47.0; extra == "frozen"
Requires-Dist: uvloop==0.22.1; extra == "frozen"
Requires-Dist: vine==5.1.0; extra == "frozen"
Requires-Dist: voluptuous==0.16.0; extra == "frozen"
Requires-Dist: watchfiles==1.2.0; extra == "frozen"
Requires-Dist: wcwidth==0.7.0; extra == "frozen"
Requires-Dist: webcolors==25.10.0; extra == "frozen"
Requires-Dist: webencodings==0.5.1; extra == "frozen"
Requires-Dist: websocket-client==1.9.0; extra == "frozen"
Requires-Dist: websockets==16.0; extra == "frozen"
Requires-Dist: wirerope==1.0.0; extra == "frozen"
Requires-Dist: wrapt==2.1.2; extra == "frozen"
Requires-Dist: yamale==6.1.0; extra == "frozen"
Requires-Dist: yarl==1.23.0; extra == "frozen"
Requires-Dist: zipp==4.1.0; extra == "frozen"
Dynamic: license-file

dkist-processing-ops
====================

|codecov|

This repository works in concert with `dkist-processing-core <https://pypi.org/project/dkist-processing-core/>`_ and
`dkist-processing-common <https://pypi.org/project/dkist-processing-common/>`_ to provide workflows for the
operational management and smoke testing of the `Automated Processing <https://nso.atlassian.net/wiki/spaces/DPD/pages/3671451/04+-+Automated+Processing>`_ stack.


Developer Setup
---------------

.. code-block:: bash

    pip install -e .[test]
    pip install pre-commit
    pre-commit install

Environment Variables
---------------------

.. list-table::
   :widths: 10 90
   :header-rows: 1

   * - Variable
     - Field Info
   * - LOGURU_LEVEL
     - annotation=str required=False default='INFO' alias_priority=2 validation_alias='LOGURU_LEVEL' description='Log level for the application'
   * - MESH_CONFIG
     - annotation=dict[str, MeshService] required=False default_factory=dict alias_priority=2 validation_alias='MESH_CONFIG' description='Service mesh configuration' examples=[{'upstream_service_name': {'mesh_address': 'localhost', 'mesh_port': 6742}}]
   * - RETRY_CONFIG
     - annotation=RetryConfig required=False default_factory=RetryConfig description='Retry configuration for the service'
   * - OTEL_SERVICE_NAME
     - annotation=str required=False default='unknown-service-name' alias_priority=2 validation_alias='OTEL_SERVICE_NAME' description='Service name for OpenTelemetry'
   * - DKIST_SERVICE_VERSION
     - annotation=str required=False default='unknown-service-version' alias_priority=2 validation_alias='DKIST_SERVICE_VERSION' description='Service version for OpenTelemetry'
   * - NOMAD_ALLOC_ID
     - annotation=str required=False default='unknown-allocation-id' alias_priority=2 validation_alias='NOMAD_ALLOC_ID' description='Nomad allocation ID for OpenTelemetry'
   * - NOMAD_ALLOC_NAME
     - annotation=str required=False default='unknown-allocation-name' alias='NOMAD_ALLOC_NAME' alias_priority=2 description='Allocation name for the deployed container the task is running on.'
   * - NOMAD_GROUP_NAME
     - annotation=str required=False default='unknown-allocation-group' alias='NOMAD_GROUP_NAME' alias_priority=2 description='Allocation group for the deployed container the task is running on'
   * - OTEL_EXPORTER_OTLP_TRACES_INSECURE
     - annotation=bool required=False default=True description='Use insecure connection for OTLP traces'
   * - OTEL_EXPORTER_OTLP_METRICS_INSECURE
     - annotation=bool required=False default=True description='Use insecure connection for OTLP metrics'
   * - OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='OTLP traces endpoint. Overrides mesh configuration' examples=['localhost:4317']
   * - OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='OTLP metrics endpoint. Overrides mesh configuration' examples=['localhost:4317']
   * - OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
     - annotation=list[str] required=False default_factory=list description='List of instrumentations to disable. https://opentelemetry.io/docs/zero-code/python/configuration/' examples=[['pika', 'requests']]
   * - OTEL_PYTHON_FASTAPI_EXCLUDED_URLS
     - annotation=str required=False default='health' description='Comma separated list of URLs to exclude from OpenTelemetry instrumentation in FastAPI.' examples=['client/.*/info,healthcheck']
   * - SYSTEM_METRIC_INSTRUMENTATION_CONFIG
     - annotation=Union[dict[str, bool], NoneType] required=False default=None description='Configuration for system metric instrumentation. https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/system_metrics/system_metrics.html' examples=[{'system.memory.usage': ['used', 'free', 'cached'], 'system.cpu.time': ['idle', 'user', 'system', 'irq'], 'system.network.io': ['transmit', 'receive'], 'process.runtime.memory': ['rss', 'vms'], 'process.runtime.cpu.time': ['user', 'system'], 'process.runtime.context_switches': ['involuntary', 'voluntary']}]
   * - ISB_USERNAME
     - annotation=str required=False default='guest' description='Username for the interservice-bus.'
   * - ISB_PASSWORD
     - annotation=str required=False default='guest' description='Password for the interservice-bus.'
   * - ISB_EXCHANGE
     - annotation=str required=False default='master.direct.x' description='Exchange for the interservice-bus.'
   * - ISB_QUEUE_TYPE
     - annotation=str required=False default='classic' description='Queue type for the interservice-bus.' examples=['quorum', 'classic']
   * - BUILD_VERSION
     - annotation=str required=False default='dev' description='Fallback build version for workflow tasks.'
   * - PIP_TIMEOUT
     - annotation=int required=False default=15 description='Timeout for pip installs in seconds.'
   * - PIP_RETRIES
     - annotation=int required=False default=5 description='Number of retries for pip installs.'
   * - IS_NOTEBOOK_EXECUTION_ENVIRONMENT
     - annotation=bool required=False default=False description='Indication of whether the code is running in a notebook execution environment.' examples=[True, False]
   * - NOTEBOOK_SAVE_WAIT_ATTEMPTS
     - annotation=int required=False default=120 description='Number of attempts to check for a saved notebook before raising an error.'
   * - NOTEBOOK_SAVE_WAIT_DELAY
     - annotation=int required=False default=1 description='Number of seconds to wait between notebook save checks.'
   * - GQL_AUTH_TOKEN
     - annotation=Union[str, NoneType] required=False default='dev' description='The auth token for the metadata-store-api.'
   * - OBJECT_STORE_ACCESS_KEY
     - annotation=Union[str, NoneType] required=False default=None description='The access key for the object store.'
   * - OBJECT_STORE_SECRET_KEY
     - annotation=Union[str, NoneType] required=False default=None description='The secret key for the object store.'
   * - OBJECT_STORE_USE_SSL
     - annotation=bool required=False default=False description='Whether to use SSL for the object store connection.'
   * - MULTIPART_THRESHOLD
     - annotation=Union[int, NoneType] required=False default=None description='Multipart threshold for the object store.'
   * - S3_CLIENT_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 client configuration for the object store.'
   * - S3_UPLOAD_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 upload configuration for the object store.'
   * - S3_DOWNLOAD_CONFIG
     - annotation=Union[dict, NoneType] required=False default=None description='S3 download configuration for the object store.'
   * - GLOBUS_MAX_RETRIES
     - annotation=int required=False default=5 description='Max retries for transient errors on calls to the globus api.'
   * - GLOBUS_INBOUND_CLIENT_CREDENTIALS
     - annotation=list[GlobusClientCredential] required=False default_factory=list description='Globus client credentials for inbound transfers.' examples=[[{'client_id': 'id1', 'client_secret': 'secret1'}, {'client_id': 'id2', 'client_secret': 'secret2'}]]
   * - GLOBUS_OUTBOUND_CLIENT_CREDENTIALS
     - annotation=list[GlobusClientCredential] required=False default_factory=list description='Globus client credentials for outbound transfers.' examples=[[{'client_id': 'id3', 'client_secret': 'secret3'}, {'client_id': 'id4', 'client_secret': 'secret4'}]]
   * - OBJECT_STORE_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='Object store Globus Endpoint ID.'
   * - SCRATCH_ENDPOINT
     - annotation=Union[str, NoneType] required=False default=None description='Scratch Globus Endpoint ID.'
   * - SCRATCH_BASE_PATH
     - annotation=str required=False default='scratch/' description='Base path for scratch storage.'
   * - SCRATCH_INVENTORY_DB_COUNT
     - annotation=int required=False default=16 description='Number of databases in the scratch inventory (redis).'
   * - DOCS_BASE_URL
     - annotation=str required=False default='my_test_url' description='Base URL for the documentation site.'
   * - EXAMPLE_SETTING
     - annotation=str required=False default='default_value' description='An example setting for demonstration purposes.'

Deployment
----------

Deployment is done with `turtlebot <https://bitbucket.org/dkistdc/turtlebot/src/main/>`_ and follows
the process detailed in `dkist-processing-core <https://pypi.org/project/dkist-processing-core/>`_

Additionally, when a new release is ready to be built the following steps need to be taken:

1. Freezing Dependencies
#########################

A new "frozen" extra is generated by the `dkist-dev-tools <https://bitbucket.org/dkistdc/dkist-dev-tools/src/main/>`_
package. If you don't have `dkist-dev-tools` installed please follow the directions from that repo.

To freeze dependencies run

.. code-block:: bash

    ddt freeze vX.Y.Z[rcK]

Where "vX.Y.Z[rcK]" is the version about to be released.

2. Tag and Push
###############

Once all commits are in place add a git tag that will define the released version, then push the tags up to Bitbucket:

.. code-block:: bash

    git tag vX.Y.Z[rcK]
    git push --tags origin BRANCH

In the case of an rc, BRANCH will likely be your development branch. For full releases BRANCH should be "main".

.. |codecov| image:: https://codecov.io/bb/dkistdc/dkist-processing-ops/graph/badge.svg?token=6ZDODS2GHT
   :target: https://codecov.io/bb/dkistdc/dkist-processing-ops
