Merge "Gracefully handle missing metadata in libvirt xml" into stable/pike

This commit is contained in:
Zuul 2018-02-26 10:07:31 +00:00 committed by Gerrit Code Review
commit 7a3770a6de
1 changed files with 35 additions and 22 deletions

View File

@ -170,42 +170,55 @@ class InstanceDiscovery(plugin_base.DiscoveryBase):
# flavor. this is why nova doesn't put the id in the libvirt
# metadata
# This implements
flavor_xml = metadata_xml.find("./flavor")
flavor = {
"id": self.get_flavor_id(flavor_xml.attrib["name"]),
"name": flavor_xml.attrib["name"],
"vcpus": self._safe_find_int(flavor_xml, "vcpus"),
"ram": self._safe_find_int(flavor_xml, "memory"),
"disk": self._safe_find_int(flavor_xml, "disk"),
"ephemeral": self._safe_find_int(flavor_xml, "ephemeral"),
"swap": self._safe_find_int(flavor_xml, "swap"),
}
try:
flavor_xml = metadata_xml.find(
"./flavor")
user_id = metadata_xml.find(
"./owner/user").attrib["uuid"]
project_id = metadata_xml.find(
"./owner/project").attrib["uuid"]
instance_name = metadata_xml.find(
"./name").text
instance_arch = os_type_xml.attrib["arch"]
flavor = {
"id": self.get_flavor_id(flavor_xml.attrib["name"]),
"name": flavor_xml.attrib["name"],
"vcpus": self._safe_find_int(flavor_xml, "vcpus"),
"ram": self._safe_find_int(flavor_xml, "memory"),
"disk": self._safe_find_int(flavor_xml, "disk"),
"ephemeral": self._safe_find_int(flavor_xml, "ephemeral"),
"swap": self._safe_find_int(flavor_xml, "swap"),
}
# The image description is partial, but Gnocchi only care about
# the id, so we are fine
image_xml = metadata_xml.find("./root[@type='image']")
image = ({'id': image_xml.attrib['uuid']}
if image_xml is not None else None)
except AttributeError as e:
LOG.error(
"Fail to get domain uuid %s metadata: "
"metadata was missing expected attributes",
domain.UUIDString())
continue
dom_state = domain.state()[0]
vm_state = libvirt_utils.LIBVIRT_POWER_STATE.get(dom_state)
status = libvirt_utils.LIBVIRT_STATUS.get(dom_state)
user_id = metadata_xml.find("./owner/user").attrib["uuid"]
project_id = metadata_xml.find("./owner/project").attrib["uuid"]
# From:
# https://github.com/openstack/nova/blob/852f40fd0c6e9d8878212ff3120556668023f1c4/nova/api/openstack/compute/views/servers.py#L214-L220
host_id = hashlib.sha224(
(project_id + self.conf.host).encode('utf-8')).hexdigest()
# The image description is partial, but Gnocchi only care about the
# id, so we are fine
image_xml = metadata_xml.find("./root[@type='image']")
image = ({'id': image_xml.attrib['uuid']}
if image_xml is not None else None)
instance_data = {
"id": domain.UUIDString(),
"name": metadata_xml.find("./name").text,
"name": instance_name,
"flavor": flavor,
"image": image,
"os_type": os_type_xml.text,
"architecture": os_type_xml.attrib["arch"],
"architecture": instance_arch,
"OS-EXT-SRV-ATTR:instance_name": domain.name(),
"OS-EXT-SRV-ATTR:host": self.conf.host,