summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEd Leafe <ed@leafe.com>2011-07-01 19:44:10 +0000
committerEd Leafe <ed@leafe.com>2011-07-01 19:44:10 +0000
commit42dabbc86e3af49215ced275d76d241b4daf8bdc (patch)
tree8f7555bb6551e9a87176c1020db106768a0e072c
parentfb6aba61ef03032c31196bd58c68fa7b7d4c2769 (diff)
Updated unit tests
-rw-r--r--nova/compute/api.py2
-rw-r--r--nova/virt/xenapi/vmops.py26
-rw-r--r--plugins/xenserver/xenapi/etc/xapi.d/plugins/xenhost45
3 files changed, 65 insertions, 8 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index c99b64c50..b0eedcd64 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -915,7 +915,7 @@ class API(base.Base):
def set_host_enabled(self, context, host, enabled):
"""Sets the specified host's ability to accept new instances."""
return self._call_compute_message("set_host_enabled", context,
- instance_id=None, host=host, enabled=enabled)
+ instance_id=None, host=host, params={"enabled": enabled})
@scheduler_api.reroute_compute("diagnostics")
def get_diagnostics(self, context, instance_id):
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 44645840c..535a55ebb 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -935,20 +935,44 @@ class VMOps(object):
def set_host_enabled(self, host, enabled):
"""Sets the specified host's ability to accept new instances."""
- return self._call_xenhost("set_enabled", {"enabled": enabled})
+ args = {"enabled": json.dumps(enabled)}
+ json_resp = self._call_xenhost("set_host_enabled", args)
+ resp = json.loads(json_resp)
+ return resp["status"]
def _call_xenhost(self, method, arg_dict):
+ """There will be several methods that will need this general
+ handling for interacting with the xenhost plugin, so this abstracts
+ out that behavior.
+ """
# Create a task ID as something that won't match any instance ID
task_id = random.randint(-80000, -70000)
try:
task = self._session.async_call_plugin("xenhost", method,
args=arg_dict)
+ #args={"params": arg_dict})
ret = self._session.wait_for_task(task, task_id)
except self.XenAPI.Failure as e:
ret = None
LOG.error(_("The call to %(method)s returned an error: %(e)s.")
% locals())
return ret
+# def set_host_enabled(self, host, enabled):
+# """Sets the specified host's ability to accept new instances."""
+# return self._call_xenhost("set_host_enabled", {"enabled": enabled})
+#
+# def _call_xenhost(self, method, arg_dict):
+# # Create a task ID as something that won't match any instance ID
+# task_id = random.randint(-80000, -70000)
+# try:
+# task = self._session.async_call_plugin("xenhost", method,
+# args=arg_dict)
+# ret = self._session.wait_for_task(task, task_id)
+# except self.XenAPI.Failure as e:
+# ret = None
+# LOG.error(_("The call to %(method)s returned an error: %(e)s.")
+# % locals())
+# return ret
def inject_network_info(self, instance, network_info, vm_ref=None):
"""
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/xenhost b/plugins/xenserver/xenapi/etc/xapi.d/plugins/xenhost
index a8428e841..13e62929a 100644
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/xenhost
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/xenhost
@@ -33,9 +33,10 @@ import tempfile
import time
import XenAPIPlugin
+import pluginlib_nova as pluginlib
-from pluginlib_nova import *
-configure_logging("xenhost")
+
+pluginlib.configure_logging("xenhost")
host_data_pattern = re.compile(r"\s*(\S+) \([^\)]+\) *: ?(.*)")
@@ -65,14 +66,45 @@ def _run_command(cmd):
return proc.stdout.read()
+def _get_host_uuid():
+ cmd = "xe host-list | grep uuid"
+ resp = _run_command(cmd)
+ return resp.split(":")[-1].strip()
+
+
+@jsonify
+def set_host_enabled(self, arg_dict):
+ """Sets this host's ability to accept new instances.
+ It will otherwise continue to operate normally.
+ """
+ enabled = arg_dict.get("enabled")
+ if enabled is None:
+ raise pluginlib.PluginError(
+ _("Missing 'enabled' argument to set_host_enabled"))
+ if enabled == "true":
+ result = _run_command("xe host-enable")
+ elif enabled == "false":
+ result = _run_command("xe host-disable")
+ else:
+ raise pluginlib.PluginError(_("Illegal enabled status: %s") % enabled)
+ # Should be empty string
+ if result:
+ raise pluginlib.PluginError(result)
+ # Return the current enabled status
+ host_uuid = _get_host_uuid()
+ cmd = "xe host-param-list uuid=%s | grep enabled" % host_uuid
+ resp = _run_command(cmd)
+ # Response should be in the format: "enabled ( RO): true"
+ status = resp.strip().split()[-1]
+ return {"status": status}
+
+
@jsonify
def host_data(self, arg_dict):
"""Runs the commands on the xenstore host to return the current status
information.
"""
- cmd = "xe host-list | grep uuid"
- resp = _run_command(cmd)
- host_uuid = resp.split(":")[-1].strip()
+ host_uuid = _get_host_uuid()
cmd = "xe host-param-list uuid=%s" % host_uuid
resp = _run_command(cmd)
parsed_data = parse_response(resp)
@@ -180,4 +212,5 @@ def cleanup(dct):
if __name__ == "__main__":
XenAPIPlugin.dispatch(
- {"host_data": host_data})
+ {"host_data": host_data,
+ "set_host_enabled": set_host_enabled})