Add node list output and fix up VM output
This commit is contained in:
parent
1180f1a249
commit
7309d22a17
78
pvc.py
78
pvc.py
|
@ -139,6 +139,13 @@ def node_info(dom_name, dom_uuid, long_output):
|
||||||
Search the cluster for a node's information.
|
Search the cluster for a node's information.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Verify node is valid
|
||||||
|
try:
|
||||||
|
zk.get('/nodes/{}'.format(node_name))
|
||||||
|
except:
|
||||||
|
click.echo('ERROR: No node named {} is present in the cluster.'.format(node_name))
|
||||||
|
exit(1)
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,14 +155,59 @@ def node_info(dom_name, dom_uuid, long_output):
|
||||||
@click.command(name='list', short_help='List all Node objects')
|
@click.command(name='list', short_help='List all Node objects')
|
||||||
def node_list():
|
def node_list():
|
||||||
"""
|
"""
|
||||||
List all virtual machines in the cluster.
|
List all hypervisor nodes in the cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
vm_list_header = ansiiprint.bold() + 'Name UUID State RAM vCPUs Hypervisor Migrated?' + ansiiprint.end()
|
node_list_header = ansiiprint.bold() + 'Name State: Daemon Nodes VMs CPUs RAM [MiB]: Total Used Free Allocated' + ansiiprint.end()
|
||||||
vm_list = []
|
node_list = []
|
||||||
zk = pvcf.startZKConnection(zk_host)
|
zk = pvcf.startZKConnection(zk_host)
|
||||||
for vm in zk.get_children('/domains'):
|
for node_name in zk.get_children('/nodes'):
|
||||||
pass
|
|
||||||
|
node_daemon_state = zk.get('/nodes/{}/daemonstate'.format(node_name))[0].decode('ascii')
|
||||||
|
node_domain_state = zk.get('/nodes/{}/domainstate'.format(node_name))[0].decode('ascii')
|
||||||
|
node_cpu_count = zk.get('/nodes/{}/cpucount'.format(node_name))[0].decode('ascii')
|
||||||
|
node_mem_used = zk.get('/nodes/{}/memused'.format(node_name))[0].decode('ascii')
|
||||||
|
node_mem_free = zk.get('/nodes/{}/memfree'.format(node_name))[0].decode('ascii')
|
||||||
|
node_mem_total = int(node_mem_used) + int(node_mem_free)
|
||||||
|
node_domains_count = zk.get('/nodes/{}/domainscount'.format(node_name))[0].decode('ascii')
|
||||||
|
node_running_domains = zk.get('/nodes/{}/runningdomains'.format(node_name))[0].decode('ascii').split()
|
||||||
|
node_mem_allocated = 0
|
||||||
|
for domain in node_running_domains:
|
||||||
|
parsed_xml = pvcf.getDomainXML(zk, domain)
|
||||||
|
duuid, dname, dmemory, dvcpu, dvcputopo = pvcf.getDomainMainDetails(parsed_xml)
|
||||||
|
node_mem_allocated += int(dmemory)
|
||||||
|
|
||||||
|
if node_daemon_state == 'start':
|
||||||
|
daemon_state_colour = ansiiprint.green()
|
||||||
|
elif node_daemon_state == 'stop' or node_daemon_state == 'shutdown':
|
||||||
|
daemon_state_colour = ansiiprint.red()
|
||||||
|
else:
|
||||||
|
daemon_state_colour = ansiiprint.yellow()
|
||||||
|
|
||||||
|
if node_domain_state == 'ready':
|
||||||
|
domain_state_colour = ansiiprint.green()
|
||||||
|
else:
|
||||||
|
domain_state_colour = ansiiprint.blue()
|
||||||
|
|
||||||
|
node_output_string = '{3: <28} {0}{4: <8}{2} {1}{5: <8}{2} {6: <4} {7: <4} {8: <6} {9: <6} {10: <6} {11: <6}'.format(
|
||||||
|
daemon_state_colour,
|
||||||
|
domain_state_colour,
|
||||||
|
ansiiprint.end(),
|
||||||
|
node_name,
|
||||||
|
node_daemon_state,
|
||||||
|
node_domain_state,
|
||||||
|
node_domains_count,
|
||||||
|
node_cpu_count,
|
||||||
|
node_mem_total,
|
||||||
|
node_mem_used,
|
||||||
|
node_mem_free,
|
||||||
|
node_mem_allocated
|
||||||
|
)
|
||||||
|
node_list.append(node_output_string)
|
||||||
|
|
||||||
|
click.echo(node_list_header)
|
||||||
|
click.echo('\n'.join(sorted(node_list)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -727,7 +779,7 @@ def vm_list(hypervisor):
|
||||||
List all virtual machines in the cluster.
|
List all virtual machines in the cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
vm_list_header = ansiiprint.bold() + 'Name UUID State RAM vCPUs Hypervisor Migrated?' + ansiiprint.end()
|
vm_list_header = ansiiprint.bold() + 'Name UUID State RAM [MiB] vCPUs Hypervisor Migrated?' + ansiiprint.end()
|
||||||
vm_list = []
|
vm_list = []
|
||||||
zk = pvcf.startZKConnection(zk_host)
|
zk = pvcf.startZKConnection(zk_host)
|
||||||
for vm in zk.get_children('/domains'):
|
for vm in zk.get_children('/domains'):
|
||||||
|
@ -744,7 +796,7 @@ def vm_list(hypervisor):
|
||||||
vm_migrated = 'no'
|
vm_migrated = 'no'
|
||||||
|
|
||||||
vm_xml = pvcf.getDomainXML(zk, vm)
|
vm_xml = pvcf.getDomainXML(zk, vm)
|
||||||
vm_uuid, vm_name, vm_memory, vm_memory_unit, vm_vcpu, vm_vcputopo = pvcf.getDomainMainDetails(vm_xml)
|
vm_uuid, vm_name, vm_memory, vm_vcpu, vm_vcputopo = pvcf.getDomainMainDetails(vm_xml)
|
||||||
|
|
||||||
if vm_state == 'start':
|
if vm_state == 'start':
|
||||||
state_colour = ansiiprint.green()
|
state_colour = ansiiprint.green()
|
||||||
|
@ -753,7 +805,17 @@ def vm_list(hypervisor):
|
||||||
else:
|
else:
|
||||||
state_colour = ansiiprint.yellow()
|
state_colour = ansiiprint.yellow()
|
||||||
|
|
||||||
vm_output_string = '{0: <16} {1: <32} {8}{2: <8}{9} {3: <4} {4: <4} {5: <5} {6: <16} {7: <20}'.format(vm_name, vm_uuid, vm_state, str(vm_memory), vm_memory_unit, vm_vcpu, vm_hypervisor, vm_migrated, state_colour, ansiiprint.end())
|
vm_output_string = '{2: <16} {3: <32} {0}{4: <8}{1} {5: <6} {6: <5} {7: <20} {8: <25}'.format(
|
||||||
|
state_colour,
|
||||||
|
ansiiprint.end(),
|
||||||
|
vm_name,
|
||||||
|
vm_uuid,
|
||||||
|
vm_state,
|
||||||
|
vm_memory,
|
||||||
|
vm_vcpu,
|
||||||
|
vm_hypervisor,
|
||||||
|
vm_migrated
|
||||||
|
)
|
||||||
vm_list.append(vm_output_string)
|
vm_list.append(vm_output_string)
|
||||||
|
|
||||||
click.echo(vm_list_header)
|
click.echo(vm_list_header)
|
||||||
|
|
10
pvcf.py
10
pvcf.py
|
@ -58,13 +58,17 @@ def getDomainMainDetails(parsed_xml):
|
||||||
dname = str(parsed_xml.name)
|
dname = str(parsed_xml.name)
|
||||||
dmemory = str(parsed_xml.memory)
|
dmemory = str(parsed_xml.memory)
|
||||||
dmemory_unit = str(parsed_xml.memory.attrib['unit'])
|
dmemory_unit = str(parsed_xml.memory.attrib['unit'])
|
||||||
|
if dmemory_unit == 'KiB':
|
||||||
|
dmemory = str(int(dmemory) * 1024)
|
||||||
|
elif dmemory_unit == 'GiB':
|
||||||
|
dmemory = str(int(dmemory) / 1024)
|
||||||
dvcpu = str(parsed_xml.vcpu)
|
dvcpu = str(parsed_xml.vcpu)
|
||||||
try:
|
try:
|
||||||
dvcputopo = '{}/{}/{}'.format(parsed_xml.cpu.topology.attrib['sockets'], parsed_xml.cpu.topology.attrib['cores'], parsed_xml.cpu.topology.attrib['threads'])
|
dvcputopo = '{}/{}/{}'.format(parsed_xml.cpu.topology.attrib['sockets'], parsed_xml.cpu.topology.attrib['cores'], parsed_xml.cpu.topology.attrib['threads'])
|
||||||
except:
|
except:
|
||||||
dvcputopo = 'N/A'
|
dvcputopo = 'N/A'
|
||||||
|
|
||||||
return duuid, dname, dmemory, dmemory_unit, dvcpu, dvcputopo
|
return duuid, dname, dmemory, dvcpu, dvcputopo
|
||||||
|
|
||||||
# Get long-format details
|
# Get long-format details
|
||||||
def getDomainExtraDetails(parsed_xml):
|
def getDomainExtraDetails(parsed_xml):
|
||||||
|
@ -157,7 +161,7 @@ def getInformationFromXML(zk, uuid, long_output):
|
||||||
|
|
||||||
parsed_xml = getDomainXML(zk, uuid)
|
parsed_xml = getDomainXML(zk, uuid)
|
||||||
|
|
||||||
duuid, dname, dmemory, dmemory_unit, dvcpu, dvcputopo = getDomainMainDetails(parsed_xml)
|
duuid, dname, dmemory, dvcpu, dvcputopo = getDomainMainDetails(parsed_xml)
|
||||||
if long_output == True:
|
if long_output == True:
|
||||||
dtype, darch, dmachine, dconsole, demulator = getDomainExtraDetails(parsed_xml)
|
dtype, darch, dmachine, dconsole, demulator = getDomainExtraDetails(parsed_xml)
|
||||||
dfeatures = getDomainCPUFeatures(parsed_xml)
|
dfeatures = getDomainCPUFeatures(parsed_xml)
|
||||||
|
@ -172,7 +176,7 @@ def getInformationFromXML(zk, uuid, long_output):
|
||||||
# Basic information
|
# Basic information
|
||||||
ainformation.append('{}UUID:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), duuid))
|
ainformation.append('{}UUID:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), duuid))
|
||||||
ainformation.append('{}Name:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dname))
|
ainformation.append('{}Name:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dname))
|
||||||
ainformation.append('{}Memory:{} {} {}'.format(ansiiprint.purple(), ansiiprint.end(), dmemory, dmemory_unit))
|
ainformation.append('{}Memory [MiB]:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dmemory))
|
||||||
ainformation.append('{}vCPUs:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dvcpu))
|
ainformation.append('{}vCPUs:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dvcpu))
|
||||||
ainformation.append('{}Topology [S/C/T]:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dvcputopo))
|
ainformation.append('{}Topology [S/C/T]:{} {}'.format(ansiiprint.purple(), ansiiprint.end(), dvcputopo))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue