summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorJosh Kearney <josh.kearney@rackspace.com>2010-12-07 16:06:55 -0600
committerJosh Kearney <josh.kearney@rackspace.com>2010-12-07 16:06:55 -0600
commita107c6f69237cd7488b9ff716e370dd01b8dd8bd (patch)
tree1f68e36e2d3698a8878dcd46048975d7f8e1add7 /nova
parentdd9de2b1fb93cc8bcfe5912a69d8b5cc88de1b11 (diff)
Initial diagnostics import -- needs testing and cleanup.
Diffstat (limited to 'nova')
-rw-r--r--nova/virt/xenapi/vm_utils.py15
-rw-r--r--nova/virt/xenapi/vmops.py33
2 files changed, 48 insertions, 0 deletions
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 99d484ca2..801867bd4 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -20,15 +20,20 @@ their attributes like VDIs, VIFs, as well as their lookup functions.
"""
import logging
+import urllib
from twisted.internet import defer
+from nova import flags
from nova import utils
+
from nova.auth.manager import AuthManager
from nova.compute import instance_types
from nova.compute import power_state
from nova.virt import images
+FLAGS = flags.FLAGS
+
XENAPI_POWER_STATE = {
'Halted': power_state.SHUTDOWN,
'Running': power_state.RUNNING,
@@ -214,3 +219,13 @@ class VMHelper():
'mem': long(record['memory_dynamic_max']) >> 10,
'num_cpu': record['VCPUs_max'],
'cpu_time': 0}
+
+
+def get_rrd(host, uuid):
+ """Return the VM RRD XML as a string"""
+ xml = urllib.urlopen("http://%s:%s@%s/vm_rrd?uuid=%s" % (
+ FLAGS.xenapi_connection_username,
+ FLAGS.xenapi_connection_password,
+ host,
+ uuid))
+ return xml.read()
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index d36cdaea5..ba73079ec 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -21,9 +21,11 @@ Management class for VM-related functions (spawn, reboot, etc).
import logging
from twisted.internet import defer
+from xml.dom.minidom import parseString
from nova import db
from nova import context
+
from nova.auth.manager import AuthManager
from nova.virt.xenapi.network_utils import NetworkHelper
from nova.virt.xenapi.vm_utils import VMHelper
@@ -128,6 +130,37 @@ class VMOps(object):
rec = self._session.get_xenapi().VM.get_record(vm)
return VMHelper.compile_info(rec)
+ def get_diagnostics(self, instance_id):
+ """Return data about the VM diagnostics"""
+ vm = VMHelper.lookup_blocking(self._session, instance_id)
+ if vm is None:
+ raise Exception("instance not present %s" % instance_id)
+ rec = self._session.get_xenapi().VM.get_record(vm)
+ try:
+ metrics = self._session.get_xenapi().VM_guest_metrics.get_record(
+ rec["guest_metrics"])
+ diags = {
+ "Power State": rec["power_state"],
+ "Dom ID": rec["domid"],
+ "UUID": rec["uuid"],
+ "Kernel": metrics["os_version"]["uname"],
+ "Distro": metrics["os_version"]["name"]}
+
+ xml = get_rrd(self._session.get_xenapi_host()["address"],
+ rec["uuid"])
+ rrd = parseString(xml)
+ for i, node in enumerate(rrd.firstChild.childNodes):
+ # We don't want all of the extra garbage
+ if i >= 3 and i <= 11:
+ ref = node.childNodes
+ # Name and Value
+ diags[ref[0].firstChild.data] = ref[6].firstChild.data
+
+ return {rec["name_label"]: diags}
+ except XenAPI.Failure as e:
+ return {
+ rec["name_label"]: "Unable to retrieve diagnostics: %s" % e}
+
def get_console_output(self, instance):
""" Return snapshot of console """
# TODO: implement this to fix pylint!