From aa29e95f97823307cd17be1f4708977f0ec71700 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Thu, 16 Dec 2010 17:38:19 +0100 Subject: [PATCH] Move QueryFields to query module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also replace βsortedβ with βutils.NiceSortβ now that it supports a key function. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/cmdlib.py | 11 +---------- lib/query.py | 21 +++++++++++++++++++++ test/ganeti.query_unittest.py | 27 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 90b14619c..f82b40dcf 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 814016979..56b603cc8 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 b154070f6..4db0a99a4 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() -- GitLab