{"library":"oslo-messaging","title":"Oslo Messaging","description":"Oslo Messaging is a foundational library providing an API for inter-process communication (IPC) for OpenStack services. It supports both Remote Procedure Call (RPC) and notification patterns over various message queue backends like RabbitMQ, Kafka, and ZeroMQ. It's currently at version 17.3.0 and follows the OpenStack release cadence, typically receiving updates roughly every six months.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install oslo-messaging","pip install oslo-messaging[rabbit] # for RabbitMQ\npip install oslo-messaging[kafka] # for Kafka\npip install oslo-messaging[zeromq] # for ZeroMQ"],"cli":null},"imports":["from oslo_messaging import get_transport","from oslo_messaging import Target","from oslo_messaging import RPCClient","from oslo_messaging import get_rpc_server","from oslo_messaging import Notifier"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom oslo_config import cfg\nfrom oslo_messaging import get_transport, RPCClient, Target, get_rpc_server, Notifier\n\n# NOTE: This example requires a running message queue (e.g., RabbitMQ)\n# and appropriate backend packages (e.g., `pip install oslo-messaging[rabbit]`)\n\n# 1. Configure the transport (using oslo_config for simplicity)\n#    In a real application, this would load from a config file.\nCONF = cfg.CONF\nCONF.set_default('transport_url', os.environ.get('OSLO_MESSAGING_TRANSPORT_URL', 'rabbit://guest:guest@localhost:5672/'))\n\ntry:\n    transport = get_transport(CONF)\nexcept Exception as e:\n    print(f\"Error getting transport: {e}. Make sure your message queue is running and transport_url is correct.\")\n    exit(1)\n\n# --- RPC Example ---\n\n# RPC Server Handler\nclass MyHandler(object):\n    def say_hello(self, ctxt, name):\n        print(f\"[Server] Received 'say_hello' for: {name} (context: {ctxt})\")\n        return f\"Hello, {name}!\"\n\n    def add_numbers(self, ctxt, a, b):\n        print(f\"[Server] Received 'add_numbers' for: {a}, {b} (context: {ctxt})\")\n        return a + b\n\n# Define a target for the RPC server and client\nrpc_target = Target(topic='my_service_topic', server='my_host')\n\n# RPC Server setup (typically in a separate process/thread)\nrpc_server = get_rpc_server(transport, rpc_target, [MyHandler()])\n# In a real app, you'd start this in a loop or dedicated process\n# rpc_server.start()\n# rpc_server.wait()\nprint(\"[RPC Server] Handler registered for topic 'my_service_topic'. (Not started for this quickstart)\")\n\n# RPC Client setup\nrpc_client = RPCClient(transport, rpc_target)\n\n# Make an RPC call\ntry:\n    # Simulate a context object\n    context = {'user_id': 'test_user', 'tenant_id': 'test_tenant'}\n\n    result_hello = rpc_client.call(context, 'say_hello', name='World')\n    print(f\"[RPC Client] Result of 'say_hello': {result_hello}\")\n\n    result_add = rpc_client.call(context, 'add_numbers', a=5, b=3)\n    print(f\"[RPC Client] Result of 'add_numbers': {result_add}\")\n\n    # Cast (fire and forget)\n    rpc_client.cast(context, 'say_hello', name='Async User')\n    print(\"[RPC Client] Sent 'say_hello' cast for 'Async User'\")\n\nexcept Exception as e:\n    print(f\"[RPC Client] Error making RPC call: {e}. Ensure a server is running and message queue is accessible.\")\n\n# --- Notification Example ---\n\nnotifier = Notifier(transport, topic='my_notifications_topic')\n\n# Publish a notification\nnotification_payload = {'event_type': 'resource_created', 'resource_id': 'xyz-123'}\nnotifier.info(context, 'resource.create.start', notification_payload)\nprint(f\"[Notifier] Sent 'info' notification: {notification_payload}\")\n\n# Clean up transport resources\ntransport.cleanup()\n","lang":"python","description":"This quickstart demonstrates the core components of oslo-messaging: setting up a transport, defining an RPC target, creating an RPC client, and using a notifier. It showcases both RPC (Remote Procedure Call) with `call` and `cast` methods, and simple notifications. For actual execution, ensure a message queue (like RabbitMQ) is running and the appropriate `oslo-messaging` backend is installed (e.g., `pip install oslo-messaging[rabbit]`). The `OSLO_MESSAGING_TRANSPORT_URL` environment variable can be used to configure the message queue connection string.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"17.1.0","pypi_latest":"17.3.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":8.2,"avg_import_s":1.43,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":1.15,"mem_mb":19.8,"disk_size":"70.6M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":7.8,"import_time_s":0.84,"mem_mb":19.8,"disk_size":"69M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":1.58,"mem_mb":22.8,"disk_size":"78.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":8.4,"import_time_s":1.46,"mem_mb":22.8,"disk_size":"77M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":1.88,"mem_mb":22.5,"disk_size":"78.0M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":7.9,"import_time_s":1.89,"mem_mb":22.5,"disk_size":"76M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":1.72,"mem_mb":23.2,"disk_size":"78.0M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":7.6,"import_time_s":1.73,"mem_mb":23.2,"disk_size":"76M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":1.03,"mem_mb":17.1,"disk_size":"68.6M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"oslo-messaging","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":9.1,"import_time_s":1.04,"mem_mb":17.1,"disk_size":"67M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"rabbit","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null}]}}