Revision aa29e95f

b/lib/cmdlib.py
39 39
import socket
40 40
import tempfile
41 41
import shutil
42
import operator
43 42
import itertools
44 43

  
45 44
from ganeti import ssh
......
559 558
    @return: List of L{objects.QueryFieldDefinition}
560 559

  
561 560
    """
562
    if fields is None:
563
      # Client requests all fields, sort by name
564
      fdefs = sorted(query.GetAllFields(cls.FIELDS.values()),
565
                     key=operator.attrgetter("name"))
566
    else:
567
      # Keep order as requested by client
568
      fdefs = query.Query(cls.FIELDS, fields).GetFields()
569

  
570
    return objects.QueryFieldsResponse(fields=fdefs).ToDict()
561
    return query.QueryFields(cls.FIELDS, fields)
571 562

  
572 563
  def ExpandNames(self, lu):
573 564
    """Expand names for this query.
b/lib/query.py
235 235
  return result
236 236

  
237 237

  
238
def QueryFields(fielddefs, selected):
239
  """Returns list of available fields.
240

  
241
  @type fielddefs: dict
242
  @param fielddefs: Field definitions
243
  @type selected: list of strings
244
  @param selected: List of selected fields
245
  @return: List of L{objects.QueryFieldDefinition}
246

  
247
  """
248
  if selected is None:
249
    # Client requests all fields, sort by name
250
    fdefs = utils.NiceSort(GetAllFields(fielddefs.values()),
251
                           key=operator.attrgetter("name"))
252
  else:
253
    # Keep order as requested by client
254
    fdefs = Query(fielddefs, selected).GetFields()
255

  
256
  return objects.QueryFieldsResponse(fields=fdefs).ToDict()
257

  
258

  
238 259
def _MakeField(name, title, kind):
239 260
  """Wrapper for creating L{objects.QueryFieldDefinition} instances.
240 261

  
b/test/ganeti.query_unittest.py
23 23

  
24 24
import re
25 25
import unittest
26
import random
26 27

  
27 28
from ganeti import constants
28 29
from ganeti import utils
......
752 753
                          "ADMIN_down"]))
753 754

  
754 755

  
756
class TestQueryFields(unittest.TestCase):
757
  def testAllFields(self):
758
    for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]:
759
      result = query.QueryFields(fielddefs, None)
760
      self.assert_(isinstance(result, dict))
761
      response = objects.QueryFieldsResponse.FromDict(result)
762
      self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
763
        [(fdef2.name, fdef2.title)
764
         for (fdef2, _, _) in utils.NiceSort(fielddefs.values(),
765
                                             key=lambda x: x[0].name)])
766

  
767
  def testSomeFields(self):
768
    rnd = random.Random(5357)
769

  
770
    for _ in range(10):
771
      for fielddefs in [query.NODE_FIELDS, query.INSTANCE_FIELDS]:
772
        fields = [fdef
773
                  for (fdef, _, _) in rnd.sample(fielddefs.values(),
774
                                                 rnd.randint(5, 20))]
775
        result = query.QueryFields(fielddefs, [fdef.name for fdef in fields])
776
        self.assert_(isinstance(result, dict))
777
        response = objects.QueryFieldsResponse.FromDict(result)
778
        self.assertEqual([(fdef.name, fdef.title) for fdef in response.fields],
779
                         [(fdef2.name, fdef2.title) for fdef2 in fields])
780

  
781

  
755 782
if __name__ == "__main__":
756 783
  testutils.GanetiTestProgram()

Also available in: Unified diff