for name, disks in value.items())
-def _PrepareFileUpload(filename):
+def _PrepareFileUpload(getents_fn, filename):
"""Loads a file and prepares it for an upload to nodes.
"""
+ # TODO: Use ReadFile(preread=...) and os.fstat
data = _Compress(utils.ReadFile(filename))
st = os.stat(filename)
- getents = runtime.GetEnts()
+
+ if getents_fn is None:
+ getents_fn = runtime.GetEnts
+
+ getents = getents_fn()
+
return [filename, data, st.st_mode, getents.LookupUid(st.st_uid),
getents.LookupGid(st.st_gid), st.st_atime, st.st_mtime]
rpc_defs.ED_OBJECT_DICT: _ObjectToDict,
rpc_defs.ED_OBJECT_DICT_LIST: _ObjectListToDict,
rpc_defs.ED_NODE_TO_DISK_DICT: _EncodeNodeToDiskDict,
- rpc_defs.ED_FILE_DETAILS: _PrepareFileUpload,
rpc_defs.ED_COMPRESS: _Compress,
rpc_defs.ED_FINALIZE_EXPORT_DISKS: _PrepareFinalizeExportDisks,
rpc_defs.ED_IMPEXP_IO: _EncodeImportExportIO,
encoders = _ENCODERS.copy()
- # Add encoders requiring configuration object
encoders.update({
+ # Encoders requiring configuration object
rpc_defs.ED_INST_DICT: self._InstDict,
rpc_defs.ED_INST_DICT_HVP_BEP: self._InstDictHvpBep,
rpc_defs.ED_INST_DICT_OSP: self._InstDictOsp,
+
+ # Encoders with special requirements
+ rpc_defs.ED_FILE_DETAILS: compat.partial(_PrepareFileUpload, _getents),
})
# Resolver using configuration
import sys
import unittest
import random
+import tempfile
from ganeti import constants
from ganeti import compat
from ganeti import backend
import testutils
+import mocks
class _FakeRequestProcessor:
self.assertFalse(res.fail_msg)
+class _FakeConfigForRpcRunner:
+ GetAllNodesInfo = NotImplemented
+
+ def GetNodeInfo(self, name):
+ return objects.Node(name=name)
+
+
class TestRpcRunner(unittest.TestCase):
def testUploadFile(self):
- runner = rpc.RpcRunner(_req_process_fn=http_proc)
+ data = 1779 * "Hello World\n"
+
+ tmpfile = tempfile.NamedTemporaryFile()
+ tmpfile.write(data)
+ tmpfile.flush()
+ st = os.stat(tmpfile.name)
+
+ def _VerifyRequest(req):
+ (uldata, ) = serializer.LoadJson(req.post_data)
+ self.assertEqual(len(uldata), 7)
+ self.assertEqual(uldata[0], tmpfile.name)
+ self.assertEqual(list(uldata[1]), list(rpc._Compress(data)))
+ self.assertEqual(uldata[2], st.st_mode)
+ self.assertEqual(uldata[3], "user%s" % os.getuid())
+ self.assertEqual(uldata[4], "group%s" % os.getgid())
+ self.assertEqual(uldata[5], st.st_atime)
+ self.assertEqual(uldata[6], st.st_mtime)
+
+ req.success = True
+ req.resp_status_code = http.HTTP_OK
+ req.resp_body = serializer.DumpJson((True, None))
+
+ http_proc = _FakeRequestProcessor(_VerifyRequest)
+ cfg = _FakeConfigForRpcRunner()
+ runner = rpc.RpcRunner(cfg, None, _req_process_fn=http_proc,
+ _getents=mocks.FakeGetentResolver)
+
+ nodes = [
+ "node1.example.com",
+ ]
+
+ result = runner.call_upload_file(nodes, tmpfile.name)
+ self.assertEqual(len(result), len(nodes))
+ for (idx, (node, res)) in enumerate(result.items()):
+ self.assertFalse(res.fail_msg)
if __name__ == "__main__":