Major work on client-side application

This commit is contained in:
2018-06-05 01:39:59 -04:00
parent 715c497b9d
commit b63f6a2958
2 changed files with 511 additions and 20 deletions

119
pvcf.py
View File

@ -1,6 +1,10 @@
#!/usr/bin/env python3
import os, sys, libvirt, uuid
import kazoo.client
import lxml
import click
#from click import command, option, Option, UsageError
#
# Generic function helpers for PVC
@ -42,3 +46,118 @@ def lookupByUUID(tuuid):
# Return the dom object (or None)
return dom
#
# Connect and disconnect from Zookeeper
#
def startZKConnection(zk_host):
zk = kazoo.client.KazooClient(hosts=zk_host)
zk.start()
return zk
def stopZKConnection(zk):
zk.stop()
zk.close()
return 0
#
# XML information parsing functions
#
def getInformationFromXML(zk, uuid):
# Obtain the contents of the XML from Zookeeper
xml = zk.get('/domains/%s/xml' % uuid)[0].decode('ascii')
# Parse XML using lxml.objectify
parsed_xml = lxml.objectify.fromstring(xml)
# Now get the information we want from it
dmemory = parsed_xml.memory
dmemory_unit = parsed_xml.memory.attrib['unit']
dcurrentMemory = parsed_xml.currentMemory
dcurrentMemory_unit = parsed_xml.currentMemory.attrib['unit']
dvcpu = parsed_xml.vcpu
dtype = parsed_xml.os.type
darch = parsed_xml.os.type.attrib['arch']
dmachine = parsed_xml.os.type.attrib['machine']
dfeatures = []
for feature in parsed_xml.features.getchildren():
dfeatures.append(feature.tag)
ddisks = []
for disk in parsed_xml.devices.disk.getchildren():
ddisks.append(disk.attrib)
print(ddisks)
return None
#
# Cluster search functions
#
def getClusterDomainList(zk):
# Get a list of UUIDs by listing the children of /domains
uuid_list = zk.get_children('/domains')
name_list = []
# For each UUID, get the corresponding name from the data
for uuid in uuid_list:
name_list.append(zk.get('/domains/%s' % uuid)[0].decode('ascii'))
return uuid_list, name_list
def searchClusterByUUID(zk, uuid):
try:
# Get the lists
uuid_list, name_list = getClusterDomainList(zk)
# We're looking for UUID, so find that element ID
index = uuid_list.index(uuid)
# Get the name_list element at that index
name = name_list[index]
except ValueError:
# We didn't find anything
return None, None
return name
def searchClusterByName(zk, name):
try:
# Get the lists
uuid_list, name_list = getClusterDomainList(zk)
# We're looking for name, so find that element ID
index = name_list.index(name)
# Get the uuid_list element at that index
uuid = uuid_list[index]
except ValueError:
# We didn't find anything
return None, None
return uuid
#
# Allow mutually exclusive options in Click
#
class MutuallyExclusiveOption(click.Option):
def __init__(self, *args, **kwargs):
self.mutually_exclusive = set(kwargs.pop('mutually_exclusive', []))
help = kwargs.get('help', '')
if self.mutually_exclusive:
ex_str = ', '.join(self.mutually_exclusive)
kwargs['help'] = help + (
' NOTE: This argument is mutually exclusive with '
'arguments: [' + ex_str + '].'
)
super(MutuallyExclusiveOption, self).__init__(*args, **kwargs)
def handle_parse_result(self, ctx, opts, args):
if self.mutually_exclusive.intersection(opts) and self.name in opts:
raise click.UsageError(
"Illegal usage: `{}` is mutually exclusive with "
"arguments `{}`.".format(
self.name,
', '.join(self.mutually_exclusive)
)
)
return super(MutuallyExclusiveOption, self).handle_parse_result(
ctx,
opts,
args
)