summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Shchelokovskyy <shchelokovskyy@gmail.com>2022-01-10 14:28:34 +0200
committerTobias Urdin <tobias.urdin@binero.com>2022-02-07 10:07:03 +0000
commitc724307a080469e25950e25093b3e70b92794415 (patch)
tree41334e71a293ec5c1e4938c5ada630fa13de0be5
parent5140c3a5be0609963cec19733975feed9451d217 (diff)
downloadceilometer-c724307a080469e25950e25093b3e70b92794415.tar.gz
Support two nova metadata versions in instance XML17.0.1
this is followup to I2aa34cf142c6429a7a0a3b8f232c3ed83f7d9981 In order to support discovery of instances booted before Wallaby, ceilometer must support working with both 1.0 (old, Victoria and before) and 1.1 (new, Wallaby and for now newer) versions of nova metadata. Change-Id: I93b6e92a5f46de5486f30a99fa3917a5932f7360 Related-Bug: #1930446 (cherry picked from commit 2fc72043d31af7acd45f918eeb290d9d7564d168)
-rw-r--r--ceilometer/compute/discovery.py13
-rw-r--r--ceilometer/compute/virt/libvirt/utils.py34
2 files changed, 36 insertions, 11 deletions
diff --git a/ceilometer/compute/discovery.py b/ceilometer/compute/discovery.py
index ddbecb5a..01ef1078 100644
--- a/ceilometer/compute/discovery.py
+++ b/ceilometer/compute/discovery.py
@@ -137,17 +137,8 @@ class InstanceDiscovery(plugin_base.DiscoveryBase):
def discover_libvirt_polling(self, manager, param=None):
instances = []
for domain in self.connection.listAllDomains():
- try:
- xml_string = domain.metadata(
- libvirt.VIR_DOMAIN_METADATA_ELEMENT,
- "http://openstack.org/xmlns/libvirt/nova/1.1")
- except libvirt.libvirtError as e:
- if libvirt_utils.is_disconnection_exception(e):
- # Re-raise the exception so it's handled and retries
- raise
- LOG.error(
- "Fail to get domain uuid %s metadata, libvirtError: %s",
- domain.UUIDString(), e)
+ xml_string = libvirt_utils.instance_metadata(domain)
+ if xml_string is None:
continue
full_xml = etree.fromstring(domain.XMLDesc())
diff --git a/ceilometer/compute/virt/libvirt/utils.py b/ceilometer/compute/virt/libvirt/utils.py
index 3dd238d6..b7d62fb5 100644
--- a/ceilometer/compute/virt/libvirt/utils.py
+++ b/ceilometer/compute/virt/libvirt/utils.py
@@ -78,6 +78,12 @@ LIBVIRT_STATUS = {
VIR_DOMAIN_PMSUSPENDED: 'suspended',
}
+# NOTE(pas-ha) in the order from newest to oldest
+NOVA_METADATA_VERSIONS = (
+ "http://openstack.org/xmlns/libvirt/nova/1.1",
+ "http://openstack.org/xmlns/libvirt/nova/1.0",
+)
+
def new_libvirt_connection(conf):
if not libvirt:
@@ -125,3 +131,31 @@ def raise_nodata_if_unsupported(method):
"error": e}
raise virt_inspector.NoDataException(msg)
return inner
+
+
+@retry_on_disconnect
+def instance_metadata(domain):
+ xml_string = None
+ last_error = None
+ for meta_version in NOVA_METADATA_VERSIONS:
+ try:
+ xml_string = domain.metadata(
+ libvirt.VIR_DOMAIN_METADATA_ELEMENT, meta_version)
+ break
+ except libvirt.libvirtError as exc:
+ if exc.get_error_code() == libvirt.VIR_ERR_NO_DOMAIN_METADATA:
+ LOG.warning("Failed to find metadata %s in domain %s",
+ meta_version, domain.UUIDString())
+ last_error = exc
+ continue
+ elif is_disconnection_exception(exc):
+ # Re-raise the exception so it's handled and retries
+ raise
+ last_error = exc
+
+ if xml_string is None:
+ LOG.error(
+ "Fail to get domain uuid %s metadata, libvirtError: %s",
+ domain.UUIDString(), last_error
+ )
+ return xml_string