Skip to content

Commit 590e09c

Browse files
committed
Add support for domain NIC MAC address change event
Signed-off-by: Michal Privoznik <[email protected]>
1 parent 3b52699 commit 590e09c

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

Diff for: examples/event-test.py

+5
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,10 @@ def myDomainEventMemoryDeviceSizeChangeCallback(conn: libvirt.virConnect, dom: l
648648
print("myDomainEventMemoryDeviceSizeChangeCallback: Domain %s(%s) memory device size change alias %s size %d" % (
649649
dom.name(), dom.ID(), alias, size))
650650

651+
def myDomainEventNICMACChangeCallback(conn: libvirt.virConnect, dom: libvirt.virDomain, alias: str, oldMAC: str, newMAC: str, opaque: _T) -> None:
652+
print("myDomainEventNICMACChangeCallback: Domain %s(%s) NIC MAC change alias %s old MAC: %s new MAC: %s" % (
653+
dom.name(), dom.ID(), alias, oldMAC, newMAC))
654+
651655

652656
##########################################################################
653657
# Network events
@@ -806,6 +810,7 @@ def exit() -> None:
806810
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_BLOCK_THRESHOLD, myDomainEventBlockThresholdCallback, None),
807811
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_MEMORY_FAILURE, myDomainEventMemoryFailureCallback, None),
808812
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE, myDomainEventMemoryDeviceSizeChangeCallback, None),
813+
vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE, myDomainEventNICMACChangeCallback, None),
809814
]
810815

811816
netcallbacks = [

Diff for: libvirt-override-virConnect.py

+9
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,15 @@ def _dispatchDomainEventMemoryDeviceSizeChangeCallback(self, dom: 'virDomain', a
279279
cb(self, virDomain(self, _obj=dom), alias, size, opaque)
280280
return 0
281281

282+
def _dispatchDomainEventNICMACChangeCallback(self, dom: 'virDomain', alias: str, oldMAC: str, newMAC: str, cbData: Dict[str, Any]) -> int:
283+
"""Dispatches event to python user domain NIC MAC change event callbacks
284+
"""
285+
cb = cbData["cb"]
286+
opaque = cbData["opaque"]
287+
288+
cb(self, virDomain(self, _obj=dom), alias, oldMAC, newMAC, opaque)
289+
return 0
290+
282291
def domainEventDeregisterAny(self, callbackID: int) -> None:
283292
"""Removes a Domain Event Callback. De-registering for a
284293
domain callback will disable delivery of this event type """

Diff for: libvirt-override.c

+61
Original file line numberDiff line numberDiff line change
@@ -7395,6 +7395,62 @@ libvirt_virConnectDomainEventMemoryDeviceSizeChangeCallback(virConnectPtr conn A
73957395
#endif /* VIR_DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE */
73967396

73977397

7398+
#ifdef VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE
7399+
static int
7400+
libvirt_virConnectDomainEventNICMACChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
7401+
virDomainPtr dom,
7402+
const char *alias,
7403+
const char *oldMAC,
7404+
const char *newMAC,
7405+
void *opaque)
7406+
{
7407+
PyObject *pyobj_cbData = (PyObject*)opaque;
7408+
PyObject *pyobj_dom;
7409+
PyObject *pyobj_ret = NULL;
7410+
PyObject *pyobj_conn;
7411+
PyObject *dictKey;
7412+
int ret = -1;
7413+
7414+
LIBVIRT_ENSURE_THREAD_STATE;
7415+
7416+
if (!(dictKey = libvirt_constcharPtrWrap("conn")))
7417+
goto cleanup;
7418+
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
7419+
Py_DECREF(dictKey);
7420+
7421+
/* Create a python instance of this virDomainPtr */
7422+
virDomainRef(dom);
7423+
if (!(pyobj_dom = libvirt_virDomainPtrWrap(dom))) {
7424+
virDomainFree(dom);
7425+
goto cleanup;
7426+
}
7427+
Py_INCREF(pyobj_cbData);
7428+
7429+
/* Call the Callback Dispatcher */
7430+
pyobj_ret = PyObject_CallMethod(pyobj_conn,
7431+
(char*)"_dispatchDomainEventNICMACChangeCallback",
7432+
(char*)"OsssO",
7433+
pyobj_dom, alias, oldMAC, newMAC,
7434+
pyobj_cbData);
7435+
7436+
Py_DECREF(pyobj_cbData);
7437+
Py_DECREF(pyobj_dom);
7438+
7439+
cleanup:
7440+
if (!pyobj_ret) {
7441+
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
7442+
PyErr_Print();
7443+
} else {
7444+
Py_DECREF(pyobj_ret);
7445+
ret = 0;
7446+
}
7447+
7448+
LIBVIRT_RELEASE_THREAD_STATE;
7449+
return ret;
7450+
}
7451+
#endif /* VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE */
7452+
7453+
73987454
static PyObject *
73997455
libvirt_virConnectDomainEventRegisterAny(PyObject *self ATTRIBUTE_UNUSED,
74007456
PyObject *args)
@@ -7530,6 +7586,11 @@ libvirt_virConnectDomainEventRegisterAny(PyObject *self ATTRIBUTE_UNUSED,
75307586
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventMemoryDeviceSizeChangeCallback);
75317587
break;
75327588
#endif /* VIR_DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE */
7589+
#ifdef VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE
7590+
case VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE:
7591+
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventNICMACChangeCallback);
7592+
break;
7593+
#endif /* VIR_DOMAIN_EVENT_ID_NIC_MAC_CHANGE */
75337594
case VIR_DOMAIN_EVENT_ID_LAST:
75347595
break;
75357596
}

0 commit comments

Comments
 (0)