Add stats to VM information
This commit is contained in:
parent
654a3cb7fa
commit
deaf138e45
|
@ -26,6 +26,7 @@ import math
|
||||||
import shlex
|
import shlex
|
||||||
import subprocess
|
import subprocess
|
||||||
import kazoo.client
|
import kazoo.client
|
||||||
|
from json import loads
|
||||||
|
|
||||||
from distutils.util import strtobool
|
from distutils.util import strtobool
|
||||||
|
|
||||||
|
@ -155,17 +156,41 @@ def getDomainCPUFeatures(parsed_xml):
|
||||||
#
|
#
|
||||||
# Get disk devices
|
# Get disk devices
|
||||||
#
|
#
|
||||||
def getDomainDisks(parsed_xml):
|
def getDomainDisks(parsed_xml, stats_data):
|
||||||
ddisks = []
|
ddisks = []
|
||||||
for device in parsed_xml.devices.getchildren():
|
for device in parsed_xml.devices.getchildren():
|
||||||
if device.tag == 'disk':
|
if device.tag == 'disk':
|
||||||
disk_attrib = device.source.attrib
|
disk_attrib = device.source.attrib
|
||||||
disk_target = device.target.attrib
|
disk_target = device.target.attrib
|
||||||
disk_type = device.attrib['type']
|
disk_type = device.attrib['type']
|
||||||
|
disk_stats_list = [x for x in stats_data.get('disk_stats', []) if x.get('name') == disk_attrib.get('name')]
|
||||||
|
try:
|
||||||
|
disk_stats = disk_stats_list[0]
|
||||||
|
except:
|
||||||
|
disk_stats = {}
|
||||||
|
|
||||||
if disk_type == 'network':
|
if disk_type == 'network':
|
||||||
disk_obj = { 'type': disk_attrib.get('protocol'), 'name': disk_attrib.get('name'), 'dev': disk_target.get('dev'), 'bus': disk_target.get('bus') }
|
disk_obj = {
|
||||||
|
'type': disk_attrib.get('protocol'),
|
||||||
|
'name': disk_attrib.get('name'),
|
||||||
|
'dev': disk_target.get('dev'),
|
||||||
|
'bus': disk_target.get('bus'),
|
||||||
|
'rd_req': disk_stats.get('rd_req', 0),
|
||||||
|
'rd_bytes': disk_stats.get('rd_bytes', 0),
|
||||||
|
'wr_req': disk_stats.get('wr_req', 0),
|
||||||
|
'wr_bytes': disk_stats.get('wr_bytes', 0)
|
||||||
|
}
|
||||||
elif disk_type == 'file':
|
elif disk_type == 'file':
|
||||||
disk_obj = { 'type': 'file', 'name': disk_attrib.get('file'), 'dev': disk_target.get('dev'), 'bus': disk_target.get('bus') }
|
disk_obj = {
|
||||||
|
'type': 'file',
|
||||||
|
'name': disk_attrib.get('file'),
|
||||||
|
'dev': disk_target.get('dev'),
|
||||||
|
'bus': disk_target.get('bus'),
|
||||||
|
'rd_req': disk_stats.get('rd_req', 0),
|
||||||
|
'rd_bytes': disk_stats.get('rd_bytes', 0),
|
||||||
|
'wr_req': disk_stats.get('wr_req', 0),
|
||||||
|
'wr_bytes': disk_stats.get('wr_bytes', 0)
|
||||||
|
}
|
||||||
else:
|
else:
|
||||||
disk_obj = {}
|
disk_obj = {}
|
||||||
ddisks.append(disk_obj)
|
ddisks.append(disk_obj)
|
||||||
|
@ -224,13 +249,18 @@ def getInformationFromXML(zk_conn, uuid):
|
||||||
|
|
||||||
parsed_xml = getDomainXML(zk_conn, uuid)
|
parsed_xml = getDomainXML(zk_conn, uuid)
|
||||||
|
|
||||||
|
try:
|
||||||
|
stats_data = loads(zkhandler.readdata(zk_conn, '/domains/{}/stats'.format(uuid)))
|
||||||
|
except:
|
||||||
|
stats_data = {}
|
||||||
|
|
||||||
domain_uuid, domain_name, domain_description, domain_memory, domain_vcpu, domain_vcputopo = getDomainMainDetails(parsed_xml)
|
domain_uuid, domain_name, domain_description, domain_memory, domain_vcpu, domain_vcputopo = getDomainMainDetails(parsed_xml)
|
||||||
domain_networks = getDomainNetworks(parsed_xml)
|
domain_networks = getDomainNetworks(parsed_xml, stats_data)
|
||||||
|
|
||||||
domain_type, domain_arch, domain_machine, domain_console, domain_emulator = getDomainExtraDetails(parsed_xml)
|
domain_type, domain_arch, domain_machine, domain_console, domain_emulator = getDomainExtraDetails(parsed_xml)
|
||||||
|
|
||||||
domain_features = getDomainCPUFeatures(parsed_xml)
|
domain_features = getDomainCPUFeatures(parsed_xml)
|
||||||
domain_disks = getDomainDisks(parsed_xml)
|
domain_disks = getDomainDisks(parsed_xml, stats_data)
|
||||||
domain_controllers = getDomainControllers(parsed_xml)
|
domain_controllers = getDomainControllers(parsed_xml)
|
||||||
|
|
||||||
if domain_lastnode:
|
if domain_lastnode:
|
||||||
|
@ -252,8 +282,10 @@ def getInformationFromXML(zk_conn, uuid):
|
||||||
'description': domain_description,
|
'description': domain_description,
|
||||||
'profile': domain_profile,
|
'profile': domain_profile,
|
||||||
'memory': int(domain_memory),
|
'memory': int(domain_memory),
|
||||||
|
'memory_stats': stats_data.get('mem_stats', {}),
|
||||||
'vcpu': int(domain_vcpu),
|
'vcpu': int(domain_vcpu),
|
||||||
'vcpu_topology': domain_vcputopo,
|
'vcpu_topology': domain_vcputopo,
|
||||||
|
'vcpu_stats': stats_data.get('cpu_stats', {}),
|
||||||
'networks': domain_networks,
|
'networks': domain_networks,
|
||||||
'type': domain_type,
|
'type': domain_type,
|
||||||
'arch': domain_arch,
|
'arch': domain_arch,
|
||||||
|
@ -271,7 +303,7 @@ def getInformationFromXML(zk_conn, uuid):
|
||||||
#
|
#
|
||||||
# Get network devices
|
# Get network devices
|
||||||
#
|
#
|
||||||
def getDomainNetworks(parsed_xml):
|
def getDomainNetworks(parsed_xml, stats_data):
|
||||||
dnets = []
|
dnets = []
|
||||||
for device in parsed_xml.devices.getchildren():
|
for device in parsed_xml.devices.getchildren():
|
||||||
if device.tag == 'interface':
|
if device.tag == 'interface':
|
||||||
|
@ -279,7 +311,33 @@ def getDomainNetworks(parsed_xml):
|
||||||
net_mac = device.mac.attrib['address']
|
net_mac = device.mac.attrib['address']
|
||||||
net_bridge = device.source.attrib[net_type]
|
net_bridge = device.source.attrib[net_type]
|
||||||
net_model = device.model.attrib['type']
|
net_model = device.model.attrib['type']
|
||||||
net_obj = { 'type': net_type, 'mac': net_mac, 'source': net_bridge, 'model': net_model }
|
net_stats_list = [x for x in stats_data.get('net_stats', []) if x.get('bridge') == net_bridge]
|
||||||
|
try:
|
||||||
|
net_stats = net_stats_list[0]
|
||||||
|
except:
|
||||||
|
net_stats = {}
|
||||||
|
net_rd_bytes = net_stats.get('rd_bytes', 0)
|
||||||
|
net_rd_packets = net_stats.get('rd_packets', 0)
|
||||||
|
net_rd_errors = net_stats.get('rd_errors', 0)
|
||||||
|
net_rd_drops = net_stats.get('rd_drops', 0)
|
||||||
|
net_wr_bytes = net_stats.get('wr_bytes', 0)
|
||||||
|
net_wr_packets = net_stats.get('wr_packets', 0)
|
||||||
|
net_wr_errors = net_stats.get('wr_errors', 0)
|
||||||
|
net_wr_drops = net_stats.get('wr_drops', 0)
|
||||||
|
net_obj = {
|
||||||
|
'type': net_type,
|
||||||
|
'mac': net_mac,
|
||||||
|
'source': net_bridge,
|
||||||
|
'model': net_model,
|
||||||
|
'rd_bytes': net_rd_bytes,
|
||||||
|
'rd_packets': net_rd_packets,
|
||||||
|
'rd_errors': net_rd_errors,
|
||||||
|
'rd_drops': net_rd_drops,
|
||||||
|
'wr_bytes': net_wr_bytes,
|
||||||
|
'wr_packets': net_wr_packets,
|
||||||
|
'wr_errors': net_wr_errors,
|
||||||
|
'wr_drops': net_wr_drops
|
||||||
|
}
|
||||||
dnets.append(net_obj)
|
dnets.append(net_obj)
|
||||||
|
|
||||||
return dnets
|
return dnets
|
||||||
|
|
|
@ -179,7 +179,7 @@ def define_vm(zk_conn, config_data, target_node, node_limit, node_selector, node
|
||||||
return False, 'ERROR: Specified node "{}" is invalid.'.format(target_node)
|
return False, 'ERROR: Specified node "{}" is invalid.'.format(target_node)
|
||||||
|
|
||||||
# Obtain the RBD disk list using the common functions
|
# Obtain the RBD disk list using the common functions
|
||||||
ddisks = common.getDomainDisks(parsed_xml)
|
ddisks = common.getDomainDisks(parsed_xml, {})
|
||||||
rbd_list = []
|
rbd_list = []
|
||||||
for disk in ddisks:
|
for disk in ddisks:
|
||||||
if disk['type'] == 'rbd':
|
if disk['type'] == 'rbd':
|
||||||
|
@ -255,7 +255,7 @@ def modify_vm(zk_conn, domain, restart, new_vm_config):
|
||||||
return False, 'ERROR: Failed to parse XML data.'
|
return False, 'ERROR: Failed to parse XML data.'
|
||||||
|
|
||||||
# Obtain the RBD disk list using the common functions
|
# Obtain the RBD disk list using the common functions
|
||||||
ddisks = common.getDomainDisks(parsed_xml)
|
ddisks = common.getDomainDisks(parsed_xml, {})
|
||||||
rbd_list = []
|
rbd_list = []
|
||||||
for disk in ddisks:
|
for disk in ddisks:
|
||||||
if disk['type'] == 'rbd':
|
if disk['type'] == 'rbd':
|
||||||
|
|
Loading…
Reference in New Issue