diff options
author | Lars Kellogg-Stedman <lars@redhat.com> | 2018-02-16 08:58:06 -0500 |
---|---|---|
committer | gord chung <gord@live.ca> | 2018-02-20 13:18:14 +0000 |
commit | 24caac82528be7678165bf12fb5b997852727ecd (patch) | |
tree | 8284a023df87aa5b4c86e51c00beb403d9e6be35 | |
parent | 8841db831b9e061655b121145860ec115705c251 (diff) | |
download | ceilometer-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.py | 57 |
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, |