X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/a79ef2a5767d16fd5708d017c6293fc7be4e2f2a..a6682fdcc173998be87b77043bfa56c0d12b1ca4:/lib/luxi.py diff --git a/lib/luxi.py b/lib/luxi.py index f2d7633..77532cf 100644 --- a/lib/luxi.py +++ b/lib/luxi.py @@ -34,11 +34,13 @@ import collections import time import errno import logging +import warnings from ganeti import serializer from ganeti import constants from ganeti import errors from ganeti import utils +from ganeti import objects KEY_METHOD = "method" @@ -53,6 +55,8 @@ REQ_WAIT_FOR_JOB_CHANGE = "WaitForJobChange" REQ_CANCEL_JOB = "CancelJob" REQ_ARCHIVE_JOB = "ArchiveJob" REQ_AUTOARCHIVE_JOBS = "AutoArchiveJobs" +REQ_QUERY = "Query" +REQ_QUERY_FIELDS = "QueryFields" REQ_QUERY_JOBS = "QueryJobs" REQ_QUERY_INSTANCES = "QueryInstances" REQ_QUERY_NODES = "QueryNodes" @@ -229,12 +233,12 @@ class Transport: while True: try: data = self.socket.recv(4096) + except socket.timeout, err: + raise TimeoutError("Receive timeout: %s" % str(err)) except socket.error, err: if err.args and err.args[0] == errno.EAGAIN: continue raise - except socket.timeout, err: - raise TimeoutError("Receive timeout: %s" % str(err)) break if not data: raise ConnectionClosedError("Connection closed while reading") @@ -423,6 +427,12 @@ class Client(object): self._CloseTransport() raise + def Close(self): + """Close the underlying connection. + + """ + self._CloseTransport() + def CallMethod(self, method, args): """Send a generic request and return the response. @@ -487,6 +497,34 @@ class Client(object): break return result + def Query(self, what, fields, filter_): + """Query for resources/items. + + @param what: One of L{constants.QR_OP_LUXI} + @type fields: List of strings + @param fields: List of requested fields + @type filter_: None or list + @param filter_: Query filter + @rtype: L{objects.QueryResponse} + + """ + req = objects.QueryRequest(what=what, fields=fields, filter=filter_) + result = self.CallMethod(REQ_QUERY, req.ToDict()) + return objects.QueryResponse.FromDict(result) + + def QueryFields(self, what, fields): + """Query for available fields. + + @param what: One of L{constants.QR_OP_LUXI} + @type fields: None or list of strings + @param fields: List of requested fields + @rtype: L{objects.QueryFieldsResponse} + + """ + req = objects.QueryFieldsRequest(what=what, fields=fields) + result = self.CallMethod(REQ_QUERY_FIELDS, req.ToDict()) + return objects.QueryFieldsResponse.FromDict(result) + def QueryJobs(self, job_ids, fields): return self.CallMethod(REQ_QUERY_JOBS, (job_ids, fields)) @@ -512,4 +550,6 @@ class Client(object): return self.CallMethod(REQ_QUERY_TAGS, (kind, name)) def QueryLocks(self, fields, sync): + warnings.warn("This LUXI call is deprecated and will be removed, use" + " Query(\"%s\", ...) instead" % constants.QR_LOCK) return self.CallMethod(REQ_QUERY_LOCKS, (fields, sync))