qvm-template: Check that template is managed by qvm-template before accessing relevant features.

This commit is contained in:
WillyPillow 2020-08-01 03:21:31 +08:00
parent 5319e7a41a
commit 377e2a77ff
No known key found for this signature in database
GPG Key ID: 3839E194B1415A9C

View File

@ -172,6 +172,14 @@ def is_managed_template(vm):
return 'template-name' in vm.features \
and vm.name == vm.features['template-name']
def get_managed_template_vm(app, name):
if name not in app.domains:
parser.error("Template '%s' not already installed." % name)
vm = app.domains[name]
if not is_managed_template(vm):
parser.error("Template '%s' is not managed by qvm-template." % name)
return vm
def qrexec_popen(args, app, service, stdout=subprocess.PIPE, filter_esc=True):
if args.updatevm:
return app.domains[args.updatevm].run_service(
@ -351,7 +359,6 @@ def get_dl_list(args, app, version_selector=VersionSelector.LATEST):
query_res = qrexec_repoquery(args, app, PACKAGE_NAME_PREFIX + template)
# We only select one package for each distinct package name
# TODO: Check local VM is managed by qvm-template
for entry in query_res:
ver = (entry.epoch, entry.version, entry.release)
insert = False
@ -360,19 +367,13 @@ def get_dl_list(args, app, version_selector=VersionSelector.LATEST):
or rpm.labelCompare(candid[entry.name][0], ver) < 0:
insert = True
elif version_selector == VersionSelector.REINSTALL:
if entry.name not in app.domains:
parser.error(
"Template '%s' not already installed." % entry.name)
vm = app.domains[entry.name]
vm = get_managed_template_vm(app, entry.name)
cur_ver = query_local_evr(vm)
if rpm.labelCompare(ver, cur_ver) == 0:
insert = True
elif version_selector in [VersionSelector.LATEST_LOWER,
VersionSelector.LATEST_HIGHER]:
if entry.name not in app.domains:
parser.error(
"Template '%s' not already installed." % entry.name)
vm = app.domains[entry.name]
vm = get_managed_template_vm(app, entry.name)
cur_ver = query_local_evr(vm)
cmp_res = -1 \
if version_selector == VersionSelector.LATEST_LOWER \
@ -384,8 +385,8 @@ def get_dl_list(args, app, version_selector=VersionSelector.LATEST):
if insert:
candid[entry.name] = DlEntry(ver, entry.reponame, entry.dlsize)
# XXX: As it's possible to include version information in `template`
# Perhaps the messages can be improved
# XXX: As it's possible to include version information in `template`,
# perhaps the messages can be improved
if len(candid) == 0:
if version_selector == VersionSelector.LATEST:
parser.error('Template \'%s\' not found.' % template)
@ -481,7 +482,8 @@ def install(args, app, version_selector=VersionSelector.LATEST,
assert entry.reponame != '@commandline'
if not override_existing and name in app.domains:
print(('Template \'%s\' already installed, skipping...'
' (You may want to use the {reinstall,upgrade,downgrade}'
' (You may want to use the'
' {reinstall,upgrade,downgrade}'
' operations.)') % name, file=sys.stderr)
del dl_list_copy[name]
else:
@ -529,10 +531,7 @@ def install(args, app, version_selector=VersionSelector.LATEST,
# Check if local versus candidate version is in line with the
# operation
if override_existing:
if name not in app.domains:
parser.error(
"Template '%s' not already installed." % name)
vm = app.domains[name]
vm = get_managed_template_vm(app, name)
pkg_evr = (
str(package_hdr[rpm.RPMTAG_EPOCHNUM]),
package_hdr[rpm.RPMTAG_VERSION],
@ -657,7 +656,7 @@ def list_templates(args, app, operation):
if is_managed_template(vm):
if not args.templates or \
any(is_match_spec(
vm.features['template-name'],
vm.name,
*query_local_evr(vm),
spec)[0]
for spec in args.templates):
@ -672,15 +671,14 @@ def list_templates(args, app, operation):
for data in query_res:
remote.add(data.name)
for vm in app.domains:
if is_managed_template(vm) and \
vm.features['template-name'] not in remote:
if is_managed_template(vm) and vm.name not in remote:
append_vm(vm, TemplateState.EXTRA)
if args.upgrades:
local = {}
for vm in app.domains:
if is_managed_template(vm):
local[vm.features['template-name']] = query_local_evr(vm)
local[vm.name] = query_local_evr(vm)
for entry in query_res:
if entry.name in local:
if rpm.labelCompare(local[entry.name],