summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorDan Prince <dan.prince@rackspace.com>2011-07-15 15:05:46 -0400
committerDan Prince <dan.prince@rackspace.com>2011-07-15 15:05:46 -0400
commit58eb29ebe4376a276a54f4fd984802a0e50fb8e3 (patch)
treece27fa0286936724fb8e1901cde86cf43d947ea6 /plugins
parent3a11738f517999ed1fd3a2c0a7ca452c7191b50f (diff)
downloadnova-58eb29ebe4376a276a54f4fd984802a0e50fb8e3.tar.gz
nova-58eb29ebe4376a276a54f4fd984802a0e50fb8e3.tar.xz
nova-58eb29ebe4376a276a54f4fd984802a0e50fb8e3.zip
Updates to the XenServer agent plugin to fix file injection:
-Update _agent_has_method so that it parses the features 'message' from nova-agent correctly. (it was trying to call .split on a dict). -Rip out the agent_has_method caching functionality which just plain isn't working with XenServer 5.6 SP2. -Pass the arg_dict to _agent_has_method. This fixes an issue where a subsequent call to xenstore.write_record didn't get the 'dom_id' (KeyError). -Fix a string formatting issue in inject_file in creating the b64 data.
Diffstat (limited to 'plugins')
-rwxr-xr-xplugins/xenserver/xenapi/etc/xapi.d/plugins/agent44
1 files changed, 19 insertions, 25 deletions
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/agent b/plugins/xenserver/xenapi/etc/xapi.d/plugins/agent
index 68d7e7bff..b169a74bf 100755
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/agent
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/agent
@@ -37,7 +37,7 @@ import time
import XenAPIPlugin
from pluginlib_nova import *
-configure_logging("xenstore")
+configure_logging("agent")
import xenstore
AGENT_TIMEOUT = 30
@@ -129,18 +129,18 @@ def inject_file(self, arg_dict):
b64_path = arg_dict["b64_path"]
b64_file = arg_dict["b64_contents"]
request_id = arg_dict["id"]
- if self._agent_has_method("file_inject"):
+ if _agent_has_method(self, "file_inject", arg_dict):
# New version of the agent. Agent should receive a 'value'
# key whose value is a dictionary containing 'b64_path' and
# 'b64_file'. See old version below.
arg_dict["value"] = json.dumps({"name": "file_inject",
"value": {"b64_path": b64_path, "b64_file": b64_file}})
- elif self._agent_has_method("injectfile"):
+ elif _agent_has_method(self, "injectfile", arg_dict):
# Old agent requires file path and file contents to be
# combined into one base64 value.
raw_path = base64.b64decode(b64_path)
raw_file = base64.b64decode(b64_file)
- new_b64 = base64.b64encode("%s,%s") % (raw_path, raw_file)
+ new_b64 = base64.b64encode("%s,%s" % (raw_path, raw_file))
arg_dict["value"] = json.dumps({"name": "injectfile",
"value": new_b64})
else:
@@ -174,30 +174,24 @@ def agent_update(self, arg_dict):
return resp
-def _agent_has_method(self, method):
+def _agent_has_method(self, method, arg_dict):
"""Check that the agent has a particular method by checking its
- features. Cache the features so we don't have to query the agent
- every time we need to check.
+ features.
"""
+ tmp_id = commands.getoutput("uuidgen")
+ dct = {}
+ dct.update(arg_dict)
+ dct["value"] = json.dumps({"name": "features", "value": ""})
+ dct["path"] = "data/host/%s" % tmp_id
+ xenstore.write_record(self, dct)
try:
- self._agent_methods
- except AttributeError:
- self._agent_methods = []
- if not self._agent_methods:
- # Haven't been defined
- tmp_id = commands.getoutput("uuidgen")
- dct = {}
- dct["value"] = json.dumps({"name": "features", "value": ""})
- dct["path"] = "data/host/%s" % tmp_id
- xenstore.write_record(self, dct)
- try:
- resp = _wait_for_agent(self, tmp_id, dct)
- except TimeoutError, e:
- raise PluginError(e)
- response = json.loads(resp)
- # The agent returns a comma-separated list of methods.
- self._agent_methods = response.split(",")
- return method in self._agent_methods
+ resp = _wait_for_agent(self, tmp_id, dct)
+ except TimeoutError, e:
+ raise PluginError(e)
+ response = json.loads(resp)
+ method_arr = response["message"].split(",")
+ # The agent returns a comma-separated list of methods in the message
+ return method in method_arr
def _wait_for_agent(self, request_id, arg_dict):