Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the FileNotFoundError of get_model_features() #2052

Merged
merged 1 commit into from
Jun 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions virttest/libvirt_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"""
Shared code for tests that need to get the libvirt version
"""

import re
import logging

from avocado.utils import process

LIBVIRT_LIB_VERSION = 0


def version_compare(major, minor, update):
"""
Determine/use the current libvirt library version on the system
and compare input major, minor, and update values against it.
If the running version is greater than or equal to the input
params version, then return True; otherwise, return False

This is designed to handle upstream version comparisons for
test adjustments and/or comparisons as a result of upstream
fixes or changes that could impact test results.

:param major: Major version to compare against
:param minor: Minor version to compare against
:param update: Update value to compare against
:return: True if running version is greater than or
equal to the input libvirt version
"""
global LIBVIRT_LIB_VERSION

if LIBVIRT_LIB_VERSION == 0:
try:
regex = r'[Uu]sing\s*[Ll]ibrary:\s*[Ll]ibvirt\s*'
regex += r'(\d+)\.(\d+)\.(\d+)'
lines = process.run("virsh version").stdout_text.splitlines()
for line in lines:
mobj = re.search(regex, line)
if bool(mobj):
LIBVIRT_LIB_VERSION = int(mobj.group(1)) * 1000000 + \
int(mobj.group(2)) * 1000 + \
int(mobj.group(3))
break
except (ValueError, TypeError, AttributeError):
logging.warning("Error determining libvirt version")
return False

compare_version = major * 1000000 + minor * 1000 + update

if LIBVIRT_LIB_VERSION >= compare_version:
return True
return False
51 changes: 32 additions & 19 deletions virttest/utils_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
from virttest import utils_selinux
from virttest import utils_disk
from virttest import logging_manager
from virttest import libvirt_version
from virttest.staging import utils_koji
from virttest.staging import service
from virttest.xml_utils import XMLTreeFile
Expand Down Expand Up @@ -4035,7 +4036,8 @@ def setup_remote(self):

def get_model_features(model_name):
"""
/usr/share/libvirt/cpu_map.xml defines all CPU models.
libvirt-4.5.0 :/usr/share/libvirt/cpu_map.xml defines all CPU models.
libvirt-5.0.0 :/usr/share/libvirt/cpu_map/ defines all CPU models.
One CPU model is a set of features.
This function is to get features of one specific model.

Expand All @@ -4045,26 +4047,37 @@ def get_model_features(model_name):
"""
features = []
conf = "/usr/share/libvirt/cpu_map.xml"
conf_dir = "/usr/share/libvirt/cpu_map/"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conf = "/usr/share/libvirt/cpu_map.xml"
# check the libvirt version to branch out instead of path
if libvirt_version.version_compare(5, 0, 0):
    conf = "/usr/share/libvirt/cpu_map/"
    # we should raise the error if the path doesn't available
    if not os.path.exists(conf):
        test.error()
    with open(conf, 'r') as output:
        :::
else:
    :::

Copy link
Contributor Author

@yanghangliu yanghangliu May 14, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@balamuruhans
Thank you very much for helping review the code and pointing out my code errors !

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The utils_misc.py file path is "~/avocado-vt/virttest/utils_misc.py"
The libvirt_version.py file path is "tp-libvirt/provider/ libvirt_version.py "
I can not import libvirt_version.version_compare() directly in this utils_misc.py.
Should I write a function to get libvirt version, or what can I do so that I can import the libvirt_version.version_compare() ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would suggested to move the code from tp-libvirt/provider/libvirt_version.py to avocado-vt/virttest/ and use it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dzhengfy @sathnaga request for your acknowlegement.

Copy link
Member

@sathnaga sathnaga May 14, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yanghangliu @dzhengfy @balamuruhans looks like moving libvirt_version.py needs a change in many tests, for now we can copy libvirt_version.py to virttest and use in this testcase and slowly change import in other testcases through different PR and once all movement happened, we can safely remove tp-libvirt/provider/libvirt_version.py

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, once moving to virttest, we will have to send separate PR to tp-libirt to adopt it by changing all the testcases using it from virttest and remove the file in provider


try:
output = open(conf, 'r').read()
root = ET.fromstring(output)
# Find model
for model_n in root.findall('arch/model'):
if model_n.get('name') == model_name:
model_node = model_n
for feature in model_n.findall('feature'):
features.append(feature.get('name'))
break
# Handle nested model
nested_model = model_node.find('model')
if nested_model is not None:
nested_model_name = nested_model.get('name')
for model_n in root.findall('arch/model'):
if model_n.get('name') == nested_model_name:
for feature in model_n.findall('feature'):
features.append(feature.get('name'))
break
if not libvirt_version.version_compare(5, 0, 0):
with open(conf, 'r') as output:
root = ET.fromstring(output.read())
while True:
# Find model in file /usr/share/libvirt/cpu_map.xml
for model_n in root.findall('arch/model'):
if model_n.get('name') == model_name:
model_node = model_n
for feature in model_n.findall('feature'):
features.append(feature.get('name'))
break
# Handle nested model
if model_node.find('model') is not None:
model_name = model_node.find('model').get('name')
continue
else:
break

else:
# Find model in dir /usr/share/libvirt/cpu_map
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please fix indentation

filelist = os.listdir(conf_dir)
for file_name in filelist:
if model_name in file_name:
with open(os.path.join(conf_dir, file_name), "r") as output:
model = ET.fromstring(output.read())
for feature in model.findall("model/feature"):
features.append(feature.get('name'))
break
except ET.ParseError as error:
logging.warn("Configuration file %s has wrong xml format" % conf)
raise
Expand Down