tessl install tessl/pypi-python-libmaas@0.6.0Python client library for MAAS 2.0+ with sync/async support, providing machine provisioning, network management, and storage configuration.
Query and monitor system events for auditing, debugging, and tracking MAAS operations.
Retrieve events with filtering and pagination. The Events API provides a paginated interface for browsing through historical events.
client.events.query(**filters)Filter parameters:
hostnames (list[str], optional): Filter by hostnames (can specify multiple)domains (list[str], optional): Filter by domain nameszones (list[str], optional): Filter by zone namesmacs (list[str], optional): Filter by MAC addressessystem_ids (list[str], optional): Filter by machine system IDsagent_name (str, optional): Filter by agent namelevel (EventLevel | int | str, optional): Filter by event level (use EventLevel enum)owner (User | str, optional): Filter by owner username or User objectlimit (int, optional): Maximum number of events to return per pagebefore (int, optional): Return events with ID before this value (for pagination)after (int, optional): Return events with ID after this value (for pagination)Note: You can specify either before or after for pagination, but not both.
from maas.client import connect
from maas.client.viscera.events import Level
client = connect('http://maas.example.com:5240/MAAS/', apikey='key')
# Query all events
events = client.events.query()
for event in events:
print(f"{event.created}: {event.description}")
# Query events for specific machines (note: plural parameter name)
events = client.events.query(hostnames=['node1.maas', 'node2.maas'])
# Query events by system IDs
events = client.events.query(system_ids=['abc123', 'def456'])
# Query by level (use Level enum from events module)
events = client.events.query(level=Level.ERROR)
# Query by multiple criteria
events = client.events.query(
zones=['production'],
level=Level.WARNING,
limit=100
)
# Query with pagination - get next page
events = client.events.query(limit=50)
next_events = await events.next() # Get next 50 events
# Query with pagination - get previous page
prev_events = await events.prev() # Get previous 50 events
# Query events by owner
events = client.events.query(owner='admin')
# Query events by MAC addresses
events = client.events.query(macs=['00:11:22:33:44:55'])Event objects returned by the query have the following properties:
event_id (int, readonly): Unique event identifier (maps to API field 'id')event_type (str, readonly): Event type description (maps to API field 'type')system_id (str, readonly): Associated node system ID (maps to API field 'node')hostname (str, readonly): Associated hostnamelevel (Level, readonly): Event level enum (AUDIT, DEBUG, INFO, WARNING, ERROR, CRITICAL)created (datetime, readonly): Timestamp when event occurred (UTC timezone-aware)description (str, readonly): Full event descriptiondescription_short (str, readonly): Truncated description (first 50 characters)username (str, readonly): User who triggered the eventThe Events API returns paginated results that support iteration in both directions:
# Navigate through pages
events.next(count=None) # Get next (newer) page of events
events.prev(count=None) # Get previous (older) page of events
# Iterate continuously
events.forwards() # Iterate forwards (newer events)
events.backwards() # Iterate backwards (older events)# Get paginated results
events = client.events.query(limit=100)
# Manually navigate pages
next_page = await events.next() # Get next 100 events
prev_page = await events.prev() # Get previous 100 events
# Continuous iteration backwards (older events)
async for event in events.backwards():
print(f"{event.created}: {event.description}")
if some_condition:
break
# Continuous iteration forwards (newer events)
async for event in events.forwards():
print(f"{event.created}: {event.description}")
if some_condition:
breakfrom maas.client.viscera.events import Level
class Level:
"""Event level enumeration (IntEnum)."""
AUDIT = 0 # Audit events (user actions)
DEBUG = 10 # Debug information
INFO = 20 # Informational messages
WARNING = 30 # Warning messages
ERROR = 40 # Error messages
CRITICAL = 50 # Critical errorsThe Level enum corresponds to Python logging levels, making it intuitive for developers familiar with Python's logging module.
from maas.client.viscera.events import Level
# Filter by event level
audit_events = client.events.query(level=Level.AUDIT)
errors = client.events.query(level=Level.ERROR)
critical = client.events.query(level=Level.CRITICAL)
# Level can also be specified as string or int
events = client.events.query(level='ERROR')
events = client.events.query(level=40)
# Access via client.events.Level
events = client.events.query(level=client.events.Level.WARNING)