1
0
mirror of https://gitlab.com/libvirt/libvirt-python.git synced 2025-08-03 08:21:58 +03:00

examples: demonstrate network events

Commit 6ea5be0 added network event callback support, so we might
as well demonstrate that it works by updating our example.

* examples/event-test.py: Add network event, fix typos.

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Eric Blake
2014-02-04 17:22:22 -07:00
parent 6df78db098
commit 44be62beee

View File

@ -2,9 +2,9 @@
#
#
#
#################################################################################
# Start off by implementing a general purpose event loop for anyones use
#################################################################################
##############################################################################
# Start off by implementing a general purpose event loop for anyone's use
##############################################################################
import sys
import getopt
@ -158,7 +158,7 @@ class virEventLoopPure:
# This is the heart of the event loop, performing one single
# iteration. It asks when the next timeout is due, and then
# calcuates the maximum amount of time it is able to sleep
# calculates the maximum amount of time it is able to sleep
# for in poll() pending file handle events.
#
# It then goes into the poll() sleep.
@ -167,9 +167,9 @@ class virEventLoopPure:
# events which need to be dispatched to registered callbacks
# It may also be time to fire some periodic timers.
#
# Due to the coarse granularity of schedular timeslices, if
# Due to the coarse granularity of scheduler timeslices, if
# we ask for a sleep of 500ms in order to satisfy a timer, we
# may return up to 1 schedular timeslice early. So even though
# may return up to 1 scheduler timeslice early. So even though
# our sleep timeout was reached, the registered timer may not
# technically be at its expiry point. This leads to us going
# back around the loop with a crazy 5ms sleep. So when checking
@ -227,7 +227,7 @@ class virEventLoopPure:
self.runningPoll = False
# Actually the event loop forever
# Actually run the event loop forever
def run_loop(self):
self.quit = False
while not self.quit:
@ -429,8 +429,8 @@ def virEventLoopNativeStart():
##########################################################################
# Everything that now follows is a simple demo of domain lifecycle events
##########################################################################
def eventToString(event):
eventStrings = ( "Defined",
def domEventToString(event):
domEventStrings = ( "Defined",
"Undefined",
"Started",
"Suspended",
@ -438,11 +438,12 @@ def eventToString(event):
"Stopped",
"Shutdown",
"PMSuspended",
"Crashed" )
return eventStrings[event]
"Crashed",
)
return domEventStrings[event]
def detailToString(event, detail):
eventStrings = (
def domDetailToString(event, detail):
domEventStrings = (
( "Added", "Updated" ),
( "Removed", ),
( "Booted", "Migrated", "Restored", "Snapshot", "Wakeup" ),
@ -451,19 +452,19 @@ def detailToString(event, detail):
( "Shutdown", "Destroyed", "Crashed", "Migrated", "Saved", "Failed", "Snapshot"),
( "Finished", ),
( "Memory", "Disk" ),
( "Panicked", )
( "Panicked", ),
)
return eventStrings[event][detail]
return domEventStrings[event][detail]
def myDomainEventCallback1 (conn, dom, event, detail, opaque):
print("myDomainEventCallback1 EVENT: Domain %s(%s) %s %s" % (dom.name(), dom.ID(),
eventToString(event),
detailToString(event, detail)))
domEventToString(event),
domDetailToString(event, detail)))
def myDomainEventCallback2 (conn, dom, event, detail, opaque):
print("myDomainEventCallback2 EVENT: Domain %s(%s) %s %s" % (dom.name(), dom.ID(),
eventToString(event),
detailToString(event, detail)))
domEventToString(event),
domDetailToString(event, detail)))
def myDomainEventRebootCallback(conn, dom, opaque):
print("myDomainEventRebootCallback: Domain %s(%s)" % (dom.name(), dom.ID()))
@ -501,6 +502,35 @@ def myDomainEventDeviceRemovedCallback(conn, dom, dev, opaque):
print("myDomainEventDeviceRemovedCallback: Domain %s(%s) device removed: %s" % (
dom.name(), dom.ID(), dev))
##########################################################################
# Network events
##########################################################################
def netEventToString(event):
netEventStrings = ( "Defined",
"Undefined",
"Started",
"Stopped",
)
return netEventStrings[event]
def netDetailToString(event, detail):
netEventStrings = (
( "Added", ),
( "Removed", ),
( "Started", ),
( "Stopped", ),
)
return netEventStrings[event][detail]
def myNetworkEventLifecycleCallback(conn, net, event, detail, opaque):
print("myNetworkEventLifecycleCallback: Network %s %s %s" % (net.name(),
netEventToString(event),
netDetailToString(event, detail)))
##########################################################################
# Set up and run the program
##########################################################################
run = True
def myConnectionCloseCallback(conn, reason, opaque):
@ -577,6 +607,8 @@ def main():
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK, myDomainEventPMSuspendDiskCallback, None)
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED, myDomainEventDeviceRemovedCallback, None)
vc.networkEventRegisterAny(None, libvirt.VIR_NETWORK_EVENT_ID_LIFECYCLE, myNetworkEventLifecycleCallback, None)
vc.setKeepAlive(5, 3)
# The rest of your app would go here normally, but for sake