(utils.CommaJoin(errors), row))
-def _PrepareFieldList(fields):
+def _PrepareFieldList(fields, aliases):
"""Prepares field list for use by L{Query}.
Converts the list to a dictionary and does some verification.
- @type fields: list of tuples; (L{objects.QueryFieldDefinition}, data kind,
- retrieval function)
- @param fields: List of fields, see L{Query.__init__} for a better description
+ @type fields: list of tuples; (L{objects.QueryFieldDefinition}, data
+ kind, retrieval function)
+ @param fields: List of fields, see L{Query.__init__} for a better
+ description
+ @type aliases: list of tuples; (alias, target)
+ @param aliases: list of tuples containing aliases; for each
+ alias/target pair, a duplicate will be created in the field list
@rtype: dict
@return: Field dictionary for L{Query}
result[fdef.name] = field
- assert len(result) == len(fields)
+ for alias, target in aliases:
+ assert alias not in result, "Alias %s overrides an existing field" % alias
+ assert target in result, "Missing target %s for alias %s" % (target, alias)
+ (fdef, k, fn) = result[target]
+ fdef = fdef.Copy()
+ fdef.name = alias
+ result[alias] = (fdef, k, fn)
+
+ assert len(result) == len(fields) + len(aliases)
assert compat.all(name == fdef.name
for (name, (fdef, _, _)) in result.items())
# Add timestamps
fields.extend(_GetItemTimestampFields(NQ_CONFIG))
- return _PrepareFieldList(fields)
+ return _PrepareFieldList(fields, [])
class InstanceQueryData:
fields.extend(_GetInstanceNetworkFields())
fields.extend(_GetItemTimestampFields(IQ_CONFIG))
- return _PrepareFieldList(fields)
+ return _PrepareFieldList(fields, [])
class LockQueryData:
lambda ctx, (name, mode, owners, pending): mode),
(_MakeField("owner", "Owner", QFT_OTHER), LQ_OWNER, _GetLockOwners),
(_MakeField("pending", "Pending", QFT_OTHER), LQ_PENDING, _GetLockPending),
- ])
+ ], [])
class GroupQueryData:
fields.extend(_GetItemTimestampFields(GQ_CONFIG))
- return _PrepareFieldList(fields)
+ return _PrepareFieldList(fields, [])
#: Fields available for node queries
[(query._MakeField("disk%s.size" % i, "DiskSize%s" % i,
constants.QFT_UNIT),
DISK, compat.partial(_GetDiskSize, i))
- for i in range(4)])
+ for i in range(4)], [])
q = query.Query(fielddef, ["name"])
self.assertEqual(q.RequestedData(), set([STATIC]))
lambda *args: None),
(query._MakeField("other", a, constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
# Non-lowercase names
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("NAME", "Name", constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("Name", "Name", constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
# Empty name
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("", "Name", constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
# Empty title
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("name", "", constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
# Whitespace in title
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("name", "Co lu mn", constants.QFT_TEXT), None,
lambda *args: None),
- ])
+ ], [])
# No callable function
self.assertRaises(AssertionError, query._PrepareFieldList, [
(query._MakeField("name", "Name", constants.QFT_TEXT), None, None),
- ])
+ ], [])
def testUnknown(self):
fielddef = query._PrepareFieldList([
None, lambda *args: query._FS_NODATA ),
(query._MakeField("unavail", "Unavail", constants.QFT_BOOL),
None, lambda *args: query._FS_UNAVAIL),
- ])
+ ], [])
for selected in [["foo"], ["Hello", "World"],
["name1", "other", "foo"]]:
(constants.QRFS_UNKNOWN, None)]
for i in range(1, 10)])
+ def testAliases(self):
+ fields = [
+ (query._MakeField("a", "a-title", constants.QFT_TEXT), None,
+ lambda *args: None),
+ (query._MakeField("b", "b-title", constants.QFT_TEXT), None,
+ lambda *args: None),
+ ]
+ # duplicate field
+ self.assertRaises(AssertionError, query._PrepareFieldList, fields,
+ [("b", "a")])
+ self.assertRaises(AssertionError, query._PrepareFieldList, fields,
+ [("c", "b"), ("c", "a")])
+ # missing target
+ self.assertRaises(AssertionError, query._PrepareFieldList, fields,
+ [("c", "d")])
+ fdefs = query._PrepareFieldList(fields, [("c", "b")])
+ self.assertEqual(len(fdefs), 3)
+ self.assertEqual(fdefs["b"][1:], fdefs["c"][1:])
+
class TestGetNodeRole(unittest.TestCase):
def testMaster(self):