summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Kellogg-Stedman <lars@redhat.com>2018-02-16 08:58:06 -0500
committergord chung <gord@live.ca>2018-02-20 13:18:14 +0000
commit24caac82528be7678165bf12fb5b997852727ecd (patch)
tree8284a023df87aa5b4c86e51c00beb403d9e6be35
parent8841db831b9e061655b121145860ec115705c251 (diff)
downloadceilometer-24caac82528be7678165bf12fb5b997852727ecd.tar.gz
Gracefully handle missing metadata in libvirt xml
Missing metadata in the libvirt domain xml for a nova instance would cause ceilometer-compute to abort, leading to missing metrics for the current and any subequent libvirt guests. This commit puts a try/except AttributeError block around all the code that is fetching attributes on the result of metadata_xml.find(...). also pull in I41aa76cf9def3e8c4bceef0280d15c1fd7c48e3d Change-Id: I8adc609cc21c86de2daba326d24b73a80d6eb61f Closes-Bug: #1749960 (cherry picked from commit d2af7e9ece2f903633bf4e95208b2e3ba6ac464d)
-rw-r--r--ceilometer/compute/discovery.py57
1 files changed, 35 insertions, 22 deletions
diff --git a/ceilometer/compute/discovery.py b/ceilometer/compute/discovery.py
index 47f7369f..38a585c9 100644
--- a/ceilometer/compute/discovery.py
+++ b/ceilometer/compute/discovery.py
@@ -162,42 +162,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,