Trong Libvirt, các sự kiện được phân loại thành cấp độ chính (event) và cấp độ phụ (details). Cấp độ phụ mô tả nguyên nhân cụ thể dẫn đến sự kiện cấp chính. Ví dụ, sự kiện "Stopped" có thể có các chi tiết như "Shutdown" (tắt máy bình thường) hoặc "Destroyed" (bị xóa đột ngột).
def domain_event_handler(connection, vm, event_type, reason_code, context):
event_name = EVENT_DETAILS[event_type][reason_code]
print(f"Callback nhận được từ {context}: Domain {vm.name()} (ID: {vm.ID()}) - {event_type}: {event_name}")
EVENT_DETAILS = {
"Defined": {
"Added": "Được thêm mới",
"Updated": "Được cập nhật",
"Renamed": "Đổi tên",
"Snapshot": "Tạo snapshot"
},
"Undefined": {
"Removed": "Bị xóa",
"Renamed": "Đổi tên"
},
"Started": {
"Booted": "Khởi động",
"Migrated": "Di chuyển",
"Restored": "Phục hồi từ snapshot",
"Snapshot": "Từ snapshot",
"Wakeup": "Bật wake-up"
},
"Suspended": {
"Paused": "Đã tạm dừng",
"Migrated": "Di chuyển",
"IOError": "Lỗi I/O",
"Watchdog": "Watchdog timeout",
"Restored": "Phục hồi",
"Snapshot": "Từ snapshot",
"API error": "Lỗi API",
"Postcopy": "Postcopy migration",
"Postcopy failed": "Postcopy thất bại"
},
"Resumed": {
"Unpaused": "Tiếp tục sau tạm dừng",
"Migrated": "Di chuyển",
"Snapshot": "Từ snapshot",
"Postcopy": "Postcopy migration"
},
"Stopped": {
"Shutdown": "Tắt máy bình thường",
"Destroyed": "Bị xóa đột ngột",
"Crashed": "Crash",
"Migrated": "Di chuyển",
"Saved": "Đã lưu vào file",
"Failed": "Thất bại khởi động",
"Snapshot": "Từ snapshot",
"Daemon": "Do daemon"
},
"Shutdown": {
"Finished": "Hoàn tất",
"On guest request": "Yêu cầu từ máy ảo",
"On host request": "Yêu cầu từ máy chủ"
},
"PMSuspended": {
"Memory": "Từ sleep RAM",
"Disk": "Từ sleep disk"
},
"Crashed": {
"Panicked": "Kernel panic"
}
}
Hàm domain.state() trả về danh sách hai phần tử: trạng thái (state) và lý do (reason). Các giá trị này ánh xạ với hằng số sau:
STATE_CONSTANTS = {
0: "VIR_DOMAIN_NOSTATE",
1: "VIR_DOMAIN_RUNNING",
2: "VIR_DOMAIN_BLOCKED",
3: "VIR_DOMAIN_PAUSED",
4: "VIR_DOMAIN_SHUTDOWN",
5: "VIR_DOMAIN_SHUTOFF",
6: "VIR_DOMAIN_CRASHED",
7: "VIR_DOMAIN_PMSUSPENDED",
8: "VIR_DOMAIN_LAST"
}
SHUTOFF_REASONS = {
0: "VIR_DOMAIN_SHUTOFF_UNKNOWN",
1: "VIR_DOMAIN_SHUTOFF_SHUTDOWN",
2: "VIR_DOMAIN_SHUTOFF_DESTROYED",
3: "VIR_DOMAIN_SHUTOFF_CRASHED",
4: "VIR_DOMAIN_SHUTOFF_MIGRATED",
5: "VIR_DOMAIN_SHUTOFF_SAVED",
6: "VIR_DOMAIN_SHUTOFF_FAILED",
7: "VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT",
8: "VIR_DOMAIN_SHUTOFF_DAEMON",
9: "VIR_DOMAIN_SHUTOFF_LAST"
}
Khi domain.state() trả về [5, 2], trạng thái 5 tương ứng với VIR_DOMAIN_SHUTOFF và lý do 2 là VIR_DOMAIN_SHUTOFF_DESTROYED.