2 # -*- coding: utf-8 -*-
9 from linkpair.device import Device
10 from linkpair.port import Port
11 from linkpair.collect.agent.base_agent import BaseAgent
14 class LibvirtAgent(BaseAgent):
16 Libvirt Collector Agent
20 self.pick_libvirt_configuration()
22 def pick_libvirt_configuration(self):
23 virt_conn = self.get_libvirt_conn()
24 for id in virt_conn.listDomainsID():
25 vm = virt_conn.lookupByID(id)
26 vmXMLDesc = minidom.parseString(vm.XMLDesc(0))
27 for iface in vmXMLDesc.getElementsByTagName("interface"):
28 [device, bridge] = self.pick_libvirt_iface_configuration(iface)
29 mac = iface.getElementsByTagName(
30 "mac")[0].getAttribute("address")
31 device = iface.getElementsByTagName(
32 "target")[0].getAttribute("dev")
33 bridge = self.regist_to_port2br(device, bridge)
34 self._cu.add_linkpair(
35 Device(str(vm.name()), Device.VM_TYPE),
36 Device(bridge, Device.BR_TYPE),
40 def pick_libvirt_iface_configuration(self, iface):
41 ifaceType = iface.getAttribute("type")
44 if ifaceType == "network":
45 network = iface.getElementsByTagName(
46 "source")[0].getAttribute("network")
47 netXMLDesc = minidom.parseString(
48 virt_conn.networkLookupByName(network).XMLDesc(0))
49 bridge = netXMLDesc.getElementsByTagName(
50 "bridge")[0].getAttribute("name")
51 elif ifaceType == "bridge":
52 bridge = iface.getElementsByTagName(
53 "source")[0].getAttribute("bridge")
54 return [device, bridge]
56 def get_libvirt_conn(self):
57 if self._remote_desc is not None:
58 conn = libvirt.open("qemu+ssh://" + self._remote_desc + "/system")
60 conn = libvirt.open("qemu:///system")