Skip to main content

OpenqQA Client Library with Async Support

Project description

openqa-async

An httpx-based client for the openQA REST API, exposing both a synchronous and an asynchronous API. It is a port of openQA-python-client from requests to httpx, preserving its HMAC request signing, client.conf discovery, and YAML-response fallback.

Installation

uv add openqa-async
# or
pip install openqa-async

Usage

Synchronous

from openqa_async import OpenQAClient

with OpenQAClient(server="openqa.opensuse.org") as client:
    jobs = client.openqa_request("GET", "/api/v1/jobs", params={"limit": 10})
    print(jobs)

Asynchronous

import asyncio

from openqa_async import AsyncOpenQAClient


async def main():
    async with AsyncOpenQAClient(server="openqa.opensuse.org") as client:
        jobs = await client.openqa_request(
            "GET", "/api/v1/jobs", params={"limit": 10}
        )
        print(jobs)


asyncio.run(main())

openqa_request signature

Both clients share the same request method (the async one is awaitable):

openqa_request(
    method,            # "GET", "POST", ...
    path,              # e.g. "/api/v1/jobs" (a leading slash is optional)
    params=None,       # query-string parameters
    retries=None,      # override the client default (5)
    wait=None,         # override the initial backoff in seconds (10)
    data=None,         # form-encoded body
    json=None,         # JSON body
)

Responses are parsed automatically: a text/yaml body is loaded with yaml.safe_load, a 204 No Content (or parse=False) returns the raw httpx.Response, and everything else is decoded as JSON. Non-2xx responses raise RequestError; transport failures raise ConnectionError. Retryable status codes (e.g. 503) are retried with exponential backoff.

Configuration

Credentials are read from INI-style client.conf files, searched in order:

  1. /etc/openqa/client.conf
  2. ~/.config/openqa/client.conf

Each section is keyed by the server host (or full base URL) and provides the API key/secret:

[openqa.opensuse.org]
key = YOUR_API_KEY
secret = YOUR_API_SECRET

The lookup tries the bare server section first, then the full base URL section. When a key/secret is present, requests are HMAC-SHA1 signed and the X-API-Key header is sent. Without credentials only unauthenticated GET requests are possible.

Scheme defaulting: the scheme defaults to https, except for loopback hosts (localhost, 127.0.0.1, ::1), which default to http. You can also pass a fully-qualified server such as http://openqa.example.com.

Migration from openQA-python-client

For code written against the upstream requests-based client, a compatibility alias keeps most call sites working unchanged:

from openqa_async import OpenQA_Client  # alias for OpenQAClient

client = OpenQA_Client(server="openqa.opensuse.org")
jobs = client.openqa_request("GET", "/api/v1/jobs")

OpenQA_Client is the synchronous OpenQAClient, and openqa_request keeps the same method/path semantics. New code should prefer OpenQAClient / AsyncOpenQAClient directly.

Disabling TLS verification

Both clients accept a verify parameter (default True) that is passed straight through to httpx. It accepts a bool, a CA-bundle path, or an ssl.SSLContext:

# Self-signed or internal-CA openQA instance:
client = OpenQAClient(server="openqa.internal", verify="/path/to/internal-ca.pem")

# Disable verification entirely:
client = OpenQAClient(server="openqa.internal", verify=False)

Security warning: verify=False disables TLS certificate verification and exposes the connection to man-in-the-middle attacks. Use it only against trusted instances on trusted networks; prefer supplying the internal CA bundle instead.

License

GPL-2.0-or-later. See COPYING.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

openqa_async-1.0.0.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

openqa_async-1.0.0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file openqa_async-1.0.0.tar.gz.

File metadata

  • Download URL: openqa_async-1.0.0.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for openqa_async-1.0.0.tar.gz
Algorithm Hash digest
SHA256 4b7f02424ca68918dc3d31bc0ddafa134a77419ccea4f635fcab9825bfbe4eaf
MD5 caf02f732e695702e141ebb3c038d92f
BLAKE2b-256 a8fdbcb26fcd3ea1e81d72f97aff11f1ff910eb0bafa99a0c0a14575be8732ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for openqa_async-1.0.0.tar.gz:

Publisher: release.yml on mimi1vx/openqa-async

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openqa_async-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: openqa_async-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for openqa_async-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 99c0f539287be7928855d0f4ce1f09cf5b0ad1f215f6083ba2655819b7be2a37
MD5 5dea66408a14a9f412b6ef95b8da7c90
BLAKE2b-256 92e3cdaff3dc175a710b8f863bd72d0194baeb20d15ec891aa636213a12baea6

See more details on using hashes here.

Provenance

The following attestation bundles were made for openqa_async-1.0.0-py3-none-any.whl:

Publisher: release.yml on mimi1vx/openqa-async

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page