diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 90b14619ceafdebbc70b400876ca917083f914e0..f82b40dcf859a46070238b901a0d8535074a4ba9 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -39,7 +39,6 @@ import OpenSSL import socket import tempfile import shutil -import operator import itertools from ganeti import ssh @@ -559,15 +558,7 @@ class _QueryBase: @return: List of L{objects.QueryFieldDefinition} """ - if fields is None: - # Client requests all fields, sort by name - fdefs = sorted(query.GetAllFields(cls.FIELDS.values()), - key=operator.attrgetter("name")) - else: - # Keep order as requested by client - fdefs = query.Query(cls.FIELDS, fields).GetFields() - - return objects.QueryFieldsResponse(fields=fdefs).ToDict() + return query.QueryFields(cls.FIELDS, fields) def ExpandNames(self, lu): """Expand names for this query. diff --git a/lib/query.py b/lib/query.py index 814016979f717f6f148aba4f11bb6c3ded0bf331..56b603cc85233ab983220cd0e84ab9c501153ebc 100644 --- a/lib/query.py +++ b/lib/query.py @@ -235,6 +235,27 @@ def _PrepareFieldList(fields): return result +def QueryFields(fielddefs, selected): + """Returns list of available fields. + + @type fielddefs: dict + @param fielddefs: Field definitions + @type selected: list of strings + @param selected: List of selected fields + @return: List of L{objects.QueryFieldDefinition} + + """ + if selected is None: + # Client requests all fields, sort by name + fdefs = utils.NiceSort(GetAllFields(fielddefs.values()), + key=operator.attrgetter("name")) + else: + # Keep order as requested by client + fdefs = Query(fielddefs, selected).GetFields() + + return objects.QueryFieldsResponse(fields=fdefs).ToDict() + + def _MakeField(name, title, kind): """Wrapper for creating L{objects.QueryFieldDefinition} instances. diff --git a/test/ganeti.query_unittest.py b/test/ganeti.query_unittest.py index b154070f683204fbc019ad2521a88cfafa0e860c..4db0a99a44b4963f50f106d95391e464ffefa5e4 100755 --- a/test/ganeti.query_unittest.py +++ b/test/ganeti.query_unittest.py @@ -23,6 +23,7 @@ import re import unittest +import random from ganeti import constants from ganeti import utils @@ -752,5 +753,31 @@ class TestInstanceQuery(unittest.TestCase): "ADMIN_down"])) +class TestQueryFields(unittest.TestCase): + def testAllFields(self): + for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]: + result = query.QueryFields(fielddefs, None) + self.assert_(isinstance(result, dict)) + response = objects.QueryFieldsResponse.FromDict(result) + self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields], + [(fdef2.name, fdef2.title) + for (fdef2, _, _) in utils.NiceSort(fielddefs.values(), + key=lambda x: x[0].name)]) + + def testSomeFields(self): + rnd = random.Random(5357) + + for _ in range(10): + for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]: + fields = [fdef + for (fdef, _, _) in rnd.sample(fielddefs.values(), + rnd.randint(5, 20))] + result = query.QueryFields(fielddefs, [fdef.name for fdef in fields]) + self.assert_(isinstance(result, dict)) + response = objects.QueryFieldsResponse.FromDict(result) + self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields], + [(fdef2.name, fdef2.title) for fdef2 in fields]) + + if __name__ == "__main__": testutils.GanetiTestProgram()